Professional Documents
Culture Documents
C04 Laptrinhcautruc
C04 Laptrinhcautruc
(structured programming)
NỘI DUNG:
1. Thuật toán
2. Kiểu dữ liệu, Cấu trúc dữ liệu, Mô hình dữ liệu
3. Cấu trúc lệnh
4. Khái niệm và nguyên lý cơ bản của lập trình cấu trúc
5. So sánh với lập trình hướng đối tượng
0
1. Thuật toán
1
KHÁI NIỆM THUẬT TOÁN
Thuật toán
2
CÁC ĐẶC TRƯNG CỦA THUẬT TOÁN
3
CÁC ĐẶC TRƯNG CỦA THUẬT TOÁN
4
TIÊU CHUẨN ĐÁNH GIÁ THUẬT TOÁN
5
NGÔN NGỮ THUẬT TOÁN
Mô tả thuật toán
• Thuật toán: <Tên thuật toán>
• Vào (Input): <Dữ liệu vào của thuật toán, mô tả rõ kiểu dữ liệu>
• Ra (Output): <Các dữ liệu ra - Kết quả>
6
NGÔN NGỮ THUẬT TOÁN
...
8
NGÔN NGỮ THUẬT TOÁN
Thuật toán Euclid
9
NGÔN NGỮ THUẬT TOÁN
10
NGÔN NGỮ THUẬT TOÁN
12
NGÔN NGỮ THUẬT TOÁN
13
Ngôn ngữ Tựa C
14
ĐỘ PHỨC TẠP THUẬT TOÁN
Giải thuật nào hiệu quả nhất cho một bài toán?
• Độ phức tạp thời gian
• Độ phức tạp không gian
Đánh giá độ phức tạp thời gian T(n) bằng tổng số phép
tính cần phải thực hiện.
15
ĐỘ PHỨC TẠP THUẬT TOÁN
16
ĐỘ PHỨC TẠP THUẬT TOÁN
17
ĐỘ PHỨC TẠP THUẬT TOÁN
Ví dụ 1
K:=0;
For i:=1 to n do
Begin
K:=K+i;
End;
Ví dụ 2
K:=0;
For i:=1 to n do
For j:= 1 to n do
Begin
K := K + i * j ;
End;
18
ĐỘ PHỨC TẠP THUẬT TOÁN
Ví dụ 3
i :=1; K:=0;
while i <= n do
begin
K:= K+ i*i;
i := i * 2;
end;
19
ĐỘ PHỨC TẠP THUẬT TOÁN
Ví dụ 4
Searching(A[]: array of integer, n: integer, K: integer): Boolean
Begin
i := 1; found := false;
while (i <=n and !found) do
begin
if A[i] = K then found:=true;
else i := i+1;
end;
return found;
end;
20
ĐỘ PHỨC TẠP THUẬT TOÁN
21
ĐỘ PHỨC TẠP THUẬT TOÁN
22
ĐỘ PHỨC TẠP THUẬT TOÁN
Thường đánh giá thuật toán theo độ phức tạp thời gian
xấu nhất. Hiệu quả sử dụng của thuật toán lại thể hiện
thông qua độ phức tạp trung bình.
23
2. Kiểu dữ liệu, Cấu trúc dữ liệu, Mô hình dữ liệu
24
KIỂU DỮ LIỆU VÀ CẤU TRÚC DỮ LIỆU
Kiểu dữ liệu:
• Trong ngôn ngữ bậc cao
• Là sự trừu tượng hóa các thuộc tính bản chất của các đối
tượng trong thực tế và phù hợp với cách tổ chức thông tin trên
máy tính
• Kiểu số nguyên, số thực, kí tự,…
• Kiểu dữ liệu T = <V, O>, V là tập các giá trị hợp lệ của T và O
là tập các phép toán trên kiểu T.
25
KIỂU DỮ LIỆU VÀ CẤU TRÚC DỮ LIỆU
26
KIỂU DỮ LIỆU VÀ CẤU TRÚC DỮ LIỆU
Mô hình dữ liệu
• Là mô hình toán học, có thể biểu diễn được trên máy tính, để
biểu diễn các đối tượng của bài toán và mối liên hệ giữa các
đối tượng
• Mô hình dữ liệu muốn cài đặt được trên máy tính phải có cách
tổ chức dữ liệu phù hợp.
• Ví dụ: Danh sách, Cây, Đồ thị, Quan hệ,. …
Kiểu dữ liệu cơ sở
• Kí tự (char, unsigned char)
• Số nguyên (int, unsigned int, long (int), unsigned long (int))
• Số thực, độ chính xác đơn (float)
• Số thực, độ chính xác kép (double)
– Lưu ý: Kích thước và phạm vi biểu diễn của các kiểu dữ liệu
• Các con trỏ chứa địa chỉ của biến: biến được trỏ chứa giá trị cụ
thể (tham chiếu gián tiếp)
countPtr count Con trỏ countPtr trỏ đến biến count, giá trị
7 của biến con trỏ countPtr là địa chỉ của
biến count, giá trị của biến count là 7.
29
Biến con trỏ trong ngôn ngữ C
30
Biến con trỏ trong ngôn ngữ C
• Định nghĩa biến con trỏ, trỏ tới vùng nhớ kiểu int
• Định nghĩa nhiều con trỏ yêu cầu sử dụng * trước mỗi biến con
trỏ
int *myPtr1, *myPtr2;
31
Biến con trỏ trong ngôn ngữ C
y yptr y
5 500000 600000 600000 5
yPtr
Sử dụng dấu * để tham chiếu giá trị trong vùng nhớ trỏ bởi
con trỏ
• *yptr trả về giá trị của biến y (bởi vì yptr trỏ tới y)
• Dấu * có thể sử dụng trong lệnh gán làm thay đổi giá trị
của biến dữ liệu.
*yptr = 7; /* thay đổi y bằng 7 */
* và & quan hệ đối ngược nhau
- *p là dữ liệu được chứa trong vùng nhớ có địa chỉ là p
- &x là địa chỉ của biến x
int x; int *xptr; xptr = &x;
Khi đó, *xptr = x; &*xptr = *&xptr
33
The address of a is 0012FF7C
The value of aPtr is 0012FF7C
1 /* Fig. 7.4: fig07_04.c
The value of a is 7
2 Using the & and * operators */ The value of *aPtr is 7
3 #include <stdio.h>
4 Showing that * and & are complements of each other.
&*aPtr = 0012FF7C
5 int main() *&aPtr = 0012FF7C
6 {
7 int a; /* a is an integer */
8 int *aPtr; /* aPtr is a pointer to an integer */
9
10 a = 7;
11 aPtr = &a; /* aPtr set to address of a */
12
13 printf( "The address of a is %p"
14 "\nThe value of aPtr is %p", &a, aPtr ); Địa chỉ của biến a là giá trị của
15 con trỏ aPtr
16 printf( "\n\nThe value of a is %d"
17 "\nThe value of *aPtr is %d", a, *aPtr );
* aPtr là giá trị
18
19 printf( "\n\nShowing that * and & are complements of "
của biến
20 "each other\n&*aPtr = %p"
21 "\n*&aPtr = %p\n", &*aPtr, *&aPtr );
Quan hệ giữa *
22
và & là bổ sung
23 return 0; /* indicates successful termination */
24
25 } /* end main */
Biến con trỏ trong ngôn ngữ C
35
Con trỏ hằng
1 /* Fig. 7.13: fig07_13.c
2 Attempting to modify a constant pointer to non-constant data */
3 #include <stdio.h>
4
5 int main()
Thay đổi *ptr được phép – x
6 {
không phải là hằng.
7 int x; /* define x */
8 int y; /* define y */
9
10 /* ptr is a constant pointer to an integer that can be modified
11 through ptr, but ptr always points to the same memory location */
12 int * const ptr = &x;
13
14 *ptr = 7; /* allowed: *ptr is not const */
15 ptr = &y; /* error: ptr is const; cannot assign new address */
16
Thay đổi ptr là lỗi – ptr là
17 return 0; /* indicates successful
con trỏ hằng.
termination */
18
19 } /* end main */
Compiling...
FIG07_13.c
D:\books\2003\chtp4\Examples\ch07\FIG07_13.c(15) : error C2166: l-value
specifies const object
Error executing cl.exe.
Bài toán
Thuật toán
Chương trình
− Các thao tác được điều khiển bởi các lệnh
− Các đối tượng chịu thao tác được mô tả thông qua các Cấu trúc dữ liệu
39
Cấu trúc lệnh.
Cấu trúc lựa chọn
đa lựa chọn
(multiple selection)
T
F
T
.
. F
.
.
.
.
40
Cấu trúc lệnh.
Lặp với điều kiện trước Lặp với điều kiện sau Lặp với số lần lặp cho trước
T
F T
T
F
F
41
4. Khái niệm, nguyên lý lập trình cấu trúc
42
Phương pháp đi từ trên xuống:
• Đi từ cái chung đến cái riêng, từ kết luận đến chi tiết, từ tổng
thể đến đơn vị
Mô đun hóa:
• Nhóm các câu lệnh lại với nhau tạo ra những môđun có quan
hệ với nhau. Nói cách khác: chương trình được phân tách
thành các phần chức năng quan hệ logic với nhau.
43
Triển khai chương trình trong ngôn ngữ C:
#include <...> /* 1. Các hàm thư viện */
#define /* 2. Định nghĩa hằng */
typedef /* 3. Định nghĩa kiểu dữ liệu */
/* 4. Khai báo nguyên mẫu các hàm */
function prototype
/* 5. Khai báo các biến toàn cục */
int main (void) /* 6. “Chương trình chính” */
{ Khai báo các biến;
Tập lệnh;
}
/* 7. “Các chương trình con”- các hàm */
44
Ví dụ: 3 sinh viên tương ứng với 3 hàng điểm sau:
{ { 77, 68, 86, 73 }, { 96, 87, 89, 78 }, { 70, 90, 86, 81 } };
Tìm điểm cao nhất, thấp nhất, tính điểm trung bình của mỗi sinh viên
1 /* Fig. 6.22: fig06_22.c
2 Double-subscripted array example */
3 #include <stdio.h>
4 #define STUDENTS 3
5 #define EXAMS 4
6
7 /* function prototypes */
8 int minimum( const int grades[][ EXAMS ], int pupils, int tests );
9 int maximum( const int grades[][ EXAMS ], int pupils, int tests );
10 double average( const int setOfGrades[], int tests );
11 void printArray( const int grades[][ EXAMS ], int pupils, int tests );
12
13 /* function main begins program execution */
14 int main()
15 {
16 int student; /* counter */
17
18 /* initialize student grades for three students (rows) */
19 const int studentGrades[ STUDENTS ][ EXAMS ] =
20 { { 77, 68, 86, 73 },
21 { 96, 87, 89, 78 },
22 { 70, 90, 86, 81 } };
23
24 /* output array studentGrades */
25 printf( "The array is:\n" );
26 printArray( studentGrades, STUDENTS, EXAMS );
27
28 /* determine smallest and largest grade values */
29 printf( "\n\nLowest grade: %d\nHighest grade: %d\n",
30 minimum( studentGrades, STUDENTS, EXAMS ),
31 maximum( studentGrades, STUDENTS, EXAMS ) );
32
33 /* calculate average grade for each student */
34 for ( student = 0; student <= STUDENTS - 1; student++ ) {
35 printf( "The average grade for student %d is %.2f\n",
36 student, average( studentGrades[ student ], EXAMS ) );
37 } /* end for */
38
39 return 0; /* indicates successful termination */
40
41 } /* end main */
42
43 /* Find the minimum grade */
44 int minimum( const int grades[][ EXAMS ], int pupils, int tests )
45 {
46 int i; /* counter */
47 int j; /* counter */
48 int lowGrade = 100; /* initialize to highest possible grade */
49
50 /* loop through rows of grades */
51 for ( i = 0; i < pupils; i++ ) {
52
53 /* loop through columns of grades */
54 for ( j = 0; j < tests; j++ ) {
55
56 if ( grades[ i ][ j ] < lowGrade ) {
57 lowGrade = grades[ i ][ j ];
58 } /* end if */
59
60 } /* end inner for */
61
62 } /* end outer for */
63
64 return lowGrade; /* return minimum grade */
65
66 } /* end function minimum */
67
68 /* Find the maximum grade */
69 int maximum( const int grades[][ EXAMS ], int pupils, int tests )
70 {
71 int i; /* counter */
72 int j; /* counter */
73 int highGrade = 0; /* initialize to lowest possible grade */
74
75 /* loop through rows of grades */
76 for ( i = 0; i < pupils; i++ ) {
77
78 /* loop through columns of grades */
79 for ( j = 0; j < tests; j++ ) {
80
81 if ( grades[ i ][ j ] > highGrade ) {
82 highGrade = grades[ i ][ j ];
83 } /* end if */
84
85 } /* end inner for */
86
87 } /* end outer for */
88
89 return highGrade; /* return maximum grade */
90
91 } /* end function maximum */
92
93 /* Determine the average grade for a particular student */
94 double average( const int setOfGrades[], int tests )
95 {
96 int i; /* counter */
97 int total = 0; /* sum of test grades */
98
99 /* total all grades for one student */
100 for ( i = 0; i < tests; i++ ) {
101 total += setOfGrades[ i ];
102 } /* end for */
103
104 return ( double ) total / tests; /* average */
105
106 } /* end function average */
107
108 /* Print the array */
109 void printArray( const int grades[][ EXAMS ], int pupils, int tests )
110 {
111 int i; /* counter */
112 int j; /* counter */
113
114 /* output column heads */
115 printf( " [0] [1] [2] [3]" );
116
117 /* output grades in tabular format */
118 for ( i = 0; i < pupils; i++ ) {
119
120 /* output label for row */
121 printf( "\nstudentGrades[%d] ", i );
122
123 /* output grades for one student */
124 for ( j = 0; j < tests; j++ ) {
125 printf( "%-5d", grades[ i ][ j ] );
126 } /* end inner for */
127
128 } /* end outer for */
129
130 } /* end function printArray */
Lowest grade: 68
Highest grade: 96
The average grade for student 0 is 76.00
The average grade for student 1 is 87.50
The average grade for student 2 is 81.75
Quy tắc cấu trúc: Có thể viết bất kỳ chương trình nào
chỉ với 3 cấu trúc điều khiển cơ bản:
• Tuần tự (Sequential)
• Lựa chọn (hay Rẽ nhánh) (Selecttion)
• Lặp (Repetition)
51
So sánh với lập trình hướng đối tượng (Object Oriented
Programming)
• Trong OOP điểm trọng tâm không phải là mã (code) mà là cái
chúng ta muốn mã thực hiện trên đó (đặt trọng tâm vào đối
tượng!)
• Mô tả đối tượng gồm các thuộc tính thuộc hai nhóm:
– Nhóm tính chất thứ nhất: khuôn dạng, sự tổ chức, kiến trúc (ví dụ:
tên gọi, kích thước, mầu sắc, …
– Nhóm tính chất thứ 2: sự vận động, sự tương tác với các đối
tượng khác (ví dụ: cách tạo lập, hủy bỏ, sự cập nhật (thay đổi kích
thước, mầu sắc,..), hình thức tổ hợp với các đối tượng khác
• Trong OOP sử dụng các khái niệm cơ bản: đối tượng(object),
lớp (class), tính kế thừa (inheritance), phương thức (methods),
and tính đa hình (polymorphism).
52
Mã nguồn cho lập trình cấu trúc Object Oriented Programming:
var1 object
var2 {
var3 varA
main { ... } }
54