Download as pdf or txt
Download as pdf or txt
You are on page 1of 55

LẬP TRÌNH CẤU TRÚC

(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

 Khái niệm thuật toán


 Ngôn ngữ mô tả thuật toán
 Độ phức tạp thuật toán

1
KHÁI NIỆM THUẬT TOÁN

 Thuật toán (giải thuật) là một quy tắc để với những dữ


liệu ban đầu đã cho, tìm được lời giải sau một khoảng
thời gian hữu hạn
Bài toán

Thuật toán

Dữ liệu vào Máy tính Kết quả ra

2
CÁC ĐẶC TRƯNG CỦA THUẬT TOÁN

 Tính kết thúc (tính dừng)


 Tính xác định
 Tính phổ dụng
 Tính hiệu quả
• Thực hiện nhanh
• Tiêu phí ít tài nguyên máy tính (bộ nhớ)

3
CÁC ĐẶC TRƯNG CỦA THUẬT TOÁN

 Thuật toán tìm UCLN của hai số nguyên dương


1. Nhập vào hai số nguyên dương a, b
2. So sánh hai số, chọn số nhỏ nhất gắn cho UCLN
3. Nếu một trong hai số a, b không chia hết cho UCLN thì thực
hiện bước 4, ngược lại thì thực hiện bước 5
4. Giảm UCLN một đơn vị và quay lại bước 3
5. In UCLN. Kết thúc

? Các đặc trưng của thuật toán trên

4
TIÊU CHUẨN ĐÁNH GIÁ THUẬT TOÁN

 Lựa chọn thuật toán nào cho bài toán?


 Tiêu chuẩn 1: Thuật toán đơn giản, dễ hiểu, dễ cài đặt
 Tiêu chuẩn 2: Thuật toán sử dụng tiết kiệm tài nguyên
máy tính (dung lượng không gian nhớ, thời gian)

5
NGÔN NGỮ THUẬT TOÁN

 Ngôn ngữ dùng để mô tả thuật toán


? Tại sao phải dùng ngôn ngữ diễn đạt thuật toán
? Đặc điểm của ngôn ngữ diễn đạt thuật toán

• Ngôn ngữ liệt kê từng bước (Ngôn ngữ tự nhiên)


• Sơ đồ khối (flow chart)
• Ngôn ngữ “giả code” (pseudo−code): Tựa Pascal, tựa C, …
– Các bước trong chương trình nên được đánh số thứ tự
– Có thể bỏ qua phần khai báo dữ liệu, thay vào đó là đặc tả cấu trúc dữ liệu
trước khi viết giải thuật

 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

 Ngôn ngữ liệt kê từng bước


• Thuật toán: Euclid
• Vào: m,n nguyên dương (m > n)
• Ra: gcd là ước chung lớn nhất của m và n
r: số nguyên dương
Bước 1. Nhập vào m, n
Bước 2. Nếu m, n >0 thì chuyển sang bước 3, ngược lại thì thông báo “Dữ liệu
vào không hợp lệ” và kết thúc thuật toán
Bước 3. Nếu m > n thì chuyển sang bước 4. Ngược lại, hoán chuyển giá trị của
m, n
Bước 4. Nếu n ≠ 0 thì chuyển sang bước 5. Ngược lại, gcd = m, in giá trị của
gcd và kết thúc.
Bước 5. Tính r là phần dư của phép chia m cho n
Bước 6. Gán giá trị của n cho m và của r cho n. Quay lại bước 4.
7
NGÔN NGỮ THUẬT TOÁN

 Sơ đồ khối (Flow Chart )

Lệnh Nút thao tác

(Nút vào/ra dữ liệu)

Chỉ hướng truyền thông tin

Điều kiện Nút điều kiện

Nút bắt đấu, nút kết thúc

...
8
NGÔN NGỮ THUẬT TOÁN
 Thuật toán Euclid

9
NGÔN NGỮ THUẬT TOÁN

 Ngôn ngữ Tựa Pascal


• Khai báo: Program < Tên chương trình>
Begin …….
End.
• Chú thích {….}
• Phép toán số học: +, - *, /, ↑(luỹ thừa)
• Phép toán so sánh: >, >=, <, <=, =, ≠
• Giá trị logic: true, false
• Phép toán logic: and, or, not

10
NGÔN NGỮ THUẬT TOÁN

 Các câu lệnh


• Câu lệnh gán V := E;
– V: biến, E: biểu thức
– Phép gán chung: V1 := V2 := E;
• Câu lệnh điều kiện if B then S1 [else S2];
• Câu lệnh tuyển Case
B1: S1;
B2: S2;
….
Bn: Sn;
else Sn+1
end case;
11
NGÔN NGỮ THUẬT TOÁN

• Câu lệnh lặp


– Số lần lặp biết trước for i := m to n do ….
for i := n down to m do….
– Số lần lặp không biết trước while B do S;
repeat S until B;
(B: biểu thức logic; S: dãy lệnh)
• Câu lệnh chuyển
go to n; (n:số hiệu của một bước trong chương trình)
• Câu lệnh vào ra
read(<danh sách biến>);
write(<danh sách biểu thức>)

12
NGÔN NGỮ THUẬT TOÁN

• Chương trình con


– Hàm
function <tên hàm>(<danh sách tham số>): <kiểu dữ liệu>
S
return <biểu thức>
– Thủ tục Procedure: không có kết quả ra
– Sử dụng Var đặt trước tham số cần giữ lại sự thay đổi giá trị sau
khi kết thúc thực hiện hàm/thủ tục
– Lời gọi Hàm Tên_hàm(<danh sách tham số thực sự>)
– Lời gọi thủ tục Call <Tên thủ tục>(<danh sách tham số thực sự>)

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á giải thuật khi chạy chương trình ???


 Các yếu tố ảnh hưởng đến thời gian thực hiện thuật toán
• Môi trường phần cứng: tốc độ xử lý, bộ nhớ,…
• Môi trường phần mềm: kiểu lệnh, ngôn ngữ, trình biên dịch
• Kích thước dữ liệu vào

 Đá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

 Độ tăng của hàm


• Cho hai hàm f(x), g(x) xác định từ tập các số nguyên dương hoặc tập
số thực vào tập số thực. Ta nói f(x) là O(g(x)) nếu tồn tại hai hằng số
C và k sao cho: |f(x)| ≤ C.|g(x)|, với mọi x > k.
 Ví dụ 1
• f(x) = an xn +…. +a0, với ai là các số thực. Khi đó f(x) = O(xn).
• với x > 1 ta có f ( x )  a n x n  a n 1 x n 1  ...  a 0
a n 1 a0
 x n ( an   ... 
x xn
 x n ( a n  a n 1  ....  a 0 )

• Đặt C = |an| + |an1| + … + |a0| và k = 1, suy ra f(x) = O(xn).


 Ví dụ 2.
• f(x) = 1+ 2+ 3 + … + n = n(n+1)/2 nên là O(n2).

16
ĐỘ PHỨC TẠP THUẬT TOÁN

 Các thuật ngữ thường dùng


• Độ phức tạp O(1) gọi là độ phức tạp hằng số
• Độ phức tạp O(log(n)) gọi là độ phức tạp logarit
• Độ phức tạp O(n) gọi là độ phức tạp tuyến tính
• Độ phức tạp O(nlogn) gọi là độ phức tạp nlogn
• Độ phức tạp O(nk) gọi là độ phức tạp đa thức
• Độ phức tạp O(bn) , b>1, gọi là độ phức tạp hàm mũ
• Độ phức tạp O(n!) gọi là độ phức tạp giai thừa

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;

 Số phép toán cần thực hiện:


(1 so sánh + 2 nhân + 1 cộng) * (1 + |log2n|) = 4 + 4 |log2n| là
O(log2n).

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

 Độ phức tạp xấu nhất


 Độ phức tạp trường hợp tốt nhất
 Độ phức tạp trung bình

21
ĐỘ PHỨC TẠP THUẬT TOÁN

 Độ phức tạp trường hợp xấu nhất của A là số lớn nhất


các phép toán cơ bản được thực hiện trong A trên bất
kỳ dữ liệu vào có kích cỡ xác định.
 Độ phức tạp trường hợp tốt nhất của A là số bé nhất
các phép toán cơ bản được thực hiện trong A trên bất
kỳ dữ liệu vào có kích cỡ xác định.
 Độ phức tạp trung bình của A là giá trị trung bình của
số các phép toán cơ bản được thực hiện trong A trên
bất kỳ dữ liệu vào có kích thước xác định.

22
ĐỘ PHỨC TẠP THUẬT TOÁN

 Ví dụ hàm Searching ở trên:


• Độ phức tạp trong trường hợp xấu nhất là O(n)
• Độ phức tạp trong trường hợp tốt nhất là:O(1) khi K chính là
phần tử đầu tiên của mảng.
• Độ phức tạp trung bình là: cỡ n/2 (khoảng ½ các phần tử của
mảng được duyệt). Việc tính toán rất phức tạp dựa vào xác
suất K xuất hiện trong A.

 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

 Kiểu dữ liệu trong ngôn ngữ bậc cao


 Cấu trúc dữ liệu
 Mối liên hệ giữa thuật toán và cấu trúc dữ liệu
 Mô hình dữ liệu
 Kiểu dữ liệu trong ngôn ngữ C

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

 Cấu trúc dữ liệu:


• Là các lưu trữ dữ liệu trên máy tính sao cho việc sử dụng
dữ liệu đó được hiệu quả. Đó chính là tổ chức các khái
niệm toán học và logic về dữ liệu.
• Kiểu dữ liệu có cấu trúc được kết hợp nên từ các kiểu dữ liệu
cơ sở
• Ví dụ: Kiểu mảng, xâu kí tự, Bản ghi, File,…

 Mối liên hệ giữa cấu trúc dữ liệu và Thuật toán

Chương trình = Cấu trúc dữ liệu + Thuật toán

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ệ,. …

 Các tiêu chuẩn chọn cấu trúc dữ liệu


• Phản ánh đúng thực tế: quan trọng nhất, đảm bảo tính đúng
đắn của phương án giải quyết
• Các thao tác phù hợp
• Tiết kiệm tài nguyên hệ thống
27
KIỂU DỮ LIỆU TRONG C

 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

 Kiểu con trỏ


 Kiểu enum
 Kiểu mảng (array)
 Kiểu cấu trúc (struct)
 Kiểm tra kích thước của kiểu dữ liệu: dùng toán tử sizeof(), ví
dụ: sizeof(int),…
28
KIỂU CON TRỎ

 Biến con trỏ (Pointer)


• Địa chỉ bộ nhớ của biến được gán cho con trỏ là giá trị của
biến con trỏ.
• Biến thông thường chứa một giá trị cụ thể (count = 7).
count
7

• 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

 Con trỏ - Pointer


• Sức mạnh của ngôn ngữ lập trình C
• Tạo ra khả năng mềm dẻo khi lập trình
• Thuận lợi truyền tham số cho hàm (tham biến), xử lý
mảng, xâu, bộ nhớ
• Con trỏ có quan hệ mật thiết giữa arrays và strings
• Lưu ý, thận trọng trong cách sử dụng: can thiệp vào
bộ nhớ.

30
Biến con trỏ trong ngôn ngữ C

 Định nghĩa và khởi tạo biến con trỏ


• * được sử dụng định nghĩa biến pointer
int *myPtr;

• Đị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;

• Có thể định nghĩa con trỏ kiểu dữ liệu bất kỳ


• Khởi tạo con trỏ là 0, NULL (con trỏ rỗng) hoặc một địa chỉ của
một biến cùng kiểu dữ liệu

31
Biến con trỏ trong ngôn ngữ C

 &Tenbien (trả về địa chỉ của tenbien)


• Phép gán trả về địa chỉ của biến dữ liệu
int y = 5;
int *yPtr;
yPtr = &y; /* yPtr lấy địa chỉcủa y */
yPtr “trỏ tới” y

y yptr y
5 500000 600000 600000 5
yPtr

địa chỉ của y


là giá trị của
yptr
32
Biến con trỏ trong ngôn ngữ C

 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

 Con trỏ hằng (const pointers)


• Trỏ tới vùng nhớ cố định
• Phải được khởi tạo khi định nghĩa
• int *const myPtr = &x;
– Kiểu int *const – con trỏ hằng trỏ đến vùng nhớ kiểu int

• const int *myPtr = &x;


– Con trỏ thông thường trỏ đến const int

• const int *const Ptr = &x;


– con trỏ const trỏ đến một vùng nhớ const int

– x có thể thay đổi, nhưng *Ptr thì không.

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.

FIG07_13.exe - 1 error(s), 0 warning(s)


Ví dụ: những tình huống sử dụng con trỏ hằng,
được phép và không được phép

1 /* Fig. 7.14: fig07_14.c


2 Attempting to modify a constant pointer to constant data. */
3 #include <stdio.h>
4
5 int main()
6 {
7 int x = 5; /* initialize x */
8 int y; /* define y */
9
10 /* ptr is a constant pointer to a constant integer. ptr always
11 points to the same location; the integer at that location
12 cannot be modified */
13 const int *const ptr = &x;
14
15 printf( "%d\n", *ptr );
16
17 *ptr = 7; /* error: *ptr is const; cannot assign new value */
18 ptr = &y; /* error: ptr is const; cannot assign new address */
19
20 return 0; /* indicates successful termination */
21
22 } /* end main */
Compiling...
FIG07_14.c
D:\books\2003\chtp4\Examples\ch07\FIG07_14.c(17) : error C2166: l-value
specifies const object
D:\books\2003\chtp4\Examples\ch07\FIG07_14.c(18) : error C2166: l-value
specifies const object
Error executing cl.exe.

FIG07_12.exe - 2 error(s), 0 warning(s)


3. Cấu trúc lệnh.

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

if statement if…else statement


(single selection) (double selection)
Seq uenc e T F T

đa lựa chọn
(multiple selection)
T

F
T
.
. F
.
.
.
.

40
Cấu trúc lệnh.

Cấu trúc lặp

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

while statement do while statement for statement

41
4. Khái niệm, nguyên lý lập trình cấu trúc

 Nguyên lý chủ đạo trong công nghệ phần mềm


 Phân rã bài toán thành những bài toán nhỏ hơn để triển
khai và đảm bảo tính đúng đắn của chương trình
 Nguyên lý cơ bản của lập trình cấu trúc bao gồm:
• Phát triển chương trình từ trên xuống (Top−down development)
• Thiết kế môđun (Modular design)

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.

 Ưu điểm: Dễ viết (write), duyệt lỗi (debug), và dễ hiểu


chương trình hơn.

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 */

The array is:


[0] [1] [2] [3]
studentGrades[0] 77 68 86 73
studentGrades[1] 96 87 89 78
studentGrades[2] 70 90 86 81

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:

---Bắt đầu chương trình --- Bắt đầu chương trình

var1 object

var2 {

var3 varA

function1 { ... } varB

function2 { ... } functionA { ... }

function3 { ... } functionB { ... }

main { ... } }

--- Kết thúc chương trình varC


varD
functionC { ... }
main { ... }
--- Kết thúc chương trình
53
 Lập trình cấu trúc bắt buộc lập trình viên tiếp cận lập
trình bắt đầu từ cách nhìn bài toán ở mức khái niệm,
thiết kế chương trình trước khi tiến hành mã hóa (viết
code)
 Lập trình cấu trúc giúp xóa bỏ mã rối (spaghetti code)
và đảm bảo tính đúng đắn của chương trình.

54

You might also like