Tải bản đầy đủ (.pdf) (307 trang)

Lập trình C - Cấu trúc dữ Liệu ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.81 MB, 307 trang )

Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 1
TỔNG QUAN
1








1. MỞ ĐẦU:
1.1. Lập trình: (Programming) là một quá trình viết chương trình bằng một ngôn ngữ
nào đó mà máy tính có thể thực hiện và những người lập trình khác có thể hiểu.
1.2. Các bước trong giai đoạn lập trình:
 Bước 1 : GIẢI THUẬT
(i) Nghó ra cách giải ( giải thuật) .
(ii) Làm rõ ràng giải thuật : bằng cách phân đoạn giải thuật thông qua các hình
vẽ, sơ đồ. Thông thường, người ta dùng lưu đồ (Flow Chart) để trình bày
giải thuật.
 Bước 2 : VIẾT CHƯƠNG TRÌNH
(i) Viết phần lõi của thân chương trình.
(ii) Thêm các phần nhập và xuất.
(iii) Thêm các phần khai báo.
 Bước 3 : CHẠY THỬ, SỬA CHỮA
(i) Chạy thử chương trình trình nhiều lần, sửa chữa những lỗi nhỏ.
(ii) Sửa chữa, cải tiến chương trình.
 Bước 4 : TỔNG KẾT
(i) Thêm những ghi chú cho chương trình như :
 Mục đích của cả chương trình.


 Mục đích của 1 đoạn chương trình hay 1 phát biểu.
1.3. Thuật toán (Algorithm):
1.3.1. Thuật toán: là một dãy các bước chặt chẽ và rõ ràng, xác đònh một trình tự
các thao tác trên một số đối tượng nào đó sao cho một số hữu hạn lần
thực hiện ta thu được kết quả như mong đợi.
1.3.2.
Các đặc trưng của thuật toán
:
 Tính dừng (tính kết thúc): Một thuật toán bao giờ cũng phải dừng sau một
số hữu hạn các bước thực hiện .
• Phân biệt được giữa giải thuật, thuật toán, lưu đồ, mã giả và
chương trình.
• Từ cùng 1 chương trình, học sinh có thể lần lượt lập giải thuật,
thuật toán, lưu đồ, mã giả và viết chương trình.
• Làm quan với các khái niệm về biến, hằng số, kiểu dữ liệu, toán
tử, lệnh gán, các đối tượng nhập xuất trong C.
MỤC TIÊU
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 2
 Tính phổ dụng (tính chính xác): thuật toán có thể giải bất kỳ bài toán nào
trong một lớp các bài toán. Cụ thể là thuật toán có thể làm việc với các dữ
liệu khác nhau và luôn dẫn đến một kết quả mong muốn.
Ví dụ : chương trình Giải phương trình bậc hai phải cho kết quả luôn đúng với các dữ
liệu số nhập vào cho a,b,c là bất kỳ (số nguyên, số thực, số dương, số âm. . .)
 Tính duy nhất : nghóa là với nhiều lần chạy chương trình trên cùng moat tập
dữ liệu đàu vào phải cho ra cùng một kết quả.
 Tính rõ ràng: giải thuật phải được thể hiện bằng các câu lệnh minh bạch;
các câu lệnh được sắp xếp theo thứ tự nhất đònh.
 Tính khách quan: Một giải thuật dù được viết bởi nhiều người trên nhiều
máy tính vẫn phải cho kết quả như nhau.

1.3.3. Một thuật toán không phải là một chương trình, thuật toán có thể được mô
tả bởi một trong ba cách:
 Mã tự nhiên
 Mã giả (pseudocode).
 Dùng các biểu tượng được quy đònh để biểu diễn giải thuật (flowchart).

1.4. Giải thuật:
 Trong khi tìm kiếm lời giải cho các bài toán trong thực tế, người ta nhận ra
rằng:
(i) Có những bài toán đến nay vẫn chưa xác đònh được liệu có tồn tại một
thuật toán để giải quyết hay không?
(ii) Có những bài toán đã có thuật toán đễ giải nhưng, nhưng không chấp
nhận được do:
 Thời gian để giải bài toán theo thuật toán đó quá lớn.
 Các điều kiện kỹ thuật cho thuật toán khó đáp ứng.
(iii) Có những bài toán có thể giải được một cách hữu hiệu bằng một lời giải
nào đó, nhưng lời giải này lại vi phạm một số tính chất của thuật toán.
 Trong thực tiễn, có rất nhiều trường hợp người ta chấp nhận các cách giải
thường cho kết quả tốt (tất nhiên không phải lúc nào cũng tốt) nhưng ít
phức tạp, hiệu quả và khả thi.
Do đó, người ta mở rộng khái niệm thuật toán (giúp cho thuật toán bớt
“cứng nhắc”) bằng một khái niệm mới là giải thuật. Giải thuật là những cách
giải không hoàn toàn đáp ứng đầy đủ các tính chất của một thuật toán nhưng
vẫn cho kết quả gần đúng. Hiện nay đã có những giải thuật đệ quy, giải thuật
ngẫu nhiên, giải thuật Heuristic, .
Để thuận tiện, trong tài liệu này sẽ sử dụng khái niệm giải thuật để chỉ
chung cho thuật toán và giải thuật.
Tóm lại, Giải thuật là một tập hợp hữu hạn của các chỉ thò hay phương
cách được đònh nghóa rõ ràng cho việc hoàn tất một số sự việc từ một trạng
thái ban đầu cho trước; khi các chỉ thò này được áp dụng triệt để thì sẽ dẫn đến

kết quả sau cùng như đã dự đoán.
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 3
1.4.1. Mã tự nhiên:
1.4.1.1. Khái niệm:
Là viết nội dung chương trình bằng ngôn ngữ tự nhiên giản lược.
1.4.1.2. Quy ước :
Phải dễ hiểu, dễ nhớ, nhất quán và không có sự hiểu lầm.
1.4.1.3. Ví dụ : viết chương trình cho người dùng nhập 1 số nguyên dương
(n). Tính tổng các số từ 1 đến n.
B1: Nhập số n
B2: Tổng=0
B3: Số đang xét=1
B4: Thực hiện khi Số đang xét <=n
Cộng dồn Số đang xét vào biến Tổng
Tăng số đang xét lên 1 đơn vò.
Quay lại B4
B5: Xuất giá trò của Tổng

1.4.2. Mã giả (
pseudocode
):
1.4.2.1. Khái niệm:
Dùng ngôn ngữ đã được quy ước trước để diễn đạt thuật toán.

1.4.2.2. Quy ước :
• Phải dễ hiểu, không cần mô tả chi tiết đến các kỹ thuật dùng trong lập
trình.
• Có thể dùng các từ khóa của ngôn ngữ đang dùng, hoặc có thể sử dụng
một số từ khóa đã được quy ước trước như:

 IF <Điều kiện> THEN …ENDIF
 IF < Điều kiện > THEN ELSE ENDIF
 WHILE < Điều kiện > DO … ENDWHILE
 DO … UNTIL < Điều kiện >
 WRITE …
 RETURN …
1.4.2.3. Ví dụ : viết chương trình cho người dùng nhập 1 số nguyên dương
(n). Tính tổng các số từ 1 đến n.
Input: n
Process:
Tong=0
SoDangXet=1
WHILE (SoDangXet <=n) DO
Tong = Tong + SoDangXet
SoDangXet = SoDangXet +1.
ENDWHILE
Output: Tong
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 4
1.4.3. Lưu đồ chương trình:
1.4.3.1. Khái niệm : Còn được gọi là sơ đồ khối. Là sơ đồ thể hiện các bước
của giải thuật liên quan đến một vấn đề nào đó được đưa vào giải
quyết bằng máy tính.

1.4.3.2. Các ký hiệu dùng trong lưu đồ:

KÝ HIỆ
U
Ý NGHĨA


nhập
xuất
Chức năng của công việc vào ra dữ liệu.

xử lý Nhóm lệnh để thự hiện một chức năng nào đó của
chương trình

chương
trình con
chương trình con đã đònh nghóa.

quyết
đònh
Quyết đònh rẽ nhánh nào căn cứ vào điều kiện chỉ
đònh được ghi trong khối. Trong một số trường hợp,
hình thoi được mở rộng thành 1 hình đa giác có
nhiều đường ra, ứng với các giá trò của biểu thức
bên trong.
   
Hướng xử lý của lưu đồ.

nối trang Điểm vào hay điểm ra của từng trang trong lưu đồ
chương trình.

điểm
cuối
Điểm đầu hay điểm cuối của lưu đồ.

Nối Điểm vào hay điểm ra của từng phần trong lưu đồ
chương trình.


1.4.3.3. Một số ví dụ biểu diễn thuật toán bằng lưu đồ:
1.4.3.3.1 Thuật toán không phân nhánh:
Ví dụ: Tính a=b
2
+c
2
. Với b và c được nhập vào
từ bàn phím. (hình 1)
Begin
b, c
A=b
2
+c
2
A
End
(Hình 1)
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 5
1.4.3.3.2 Thuật toán có phân nhánh:
 Ví dụ 1: Cho nhập 3 số, in ra giá trò lớn nhất trong 3 số.
Có thể thực hiện bằng nhiều cách, trong phần này nêu lên 2
trong các cách:
 Cách 1: hình 2 (dùng biến trung gian)
 Cách 2: hình 3 (dùng phép AND/OR/NOT trong điều kiện.























 Ví dụ 2: Giải phương trình bậc 1 ax+b=0. Với a,b được nhập vào(hình 4)
 Ví dụ 3: Giải phương trình bậc 2 ax
2
+ bx + c =0. Với a, b, c được nhập
vào. (hình 5)





Begin
a, b, c

Max
End
a > b
Max = b
Max = a
Max < c
Max = c
S
S
Đ
Đ
(Hình 2)
Begin
a, b, c
a>=b
AND
a>=c
S
Đ
(Hình 3
)
Số lớn nhất là a
b>=a
AND
b>=c
Số lớn nhất là b
S
Đ
Số lớn nhất là c
End

Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 6

1.4.3.3.3 Thuật toán lặp có chu trình:
 Ví dụ 4: Nhập n. Tính tổng các số từ 1 đến n. Minh họa sau nêu lên 2
cách
 Cách 1: xét điều kiện (i<=n) trước khi tính tổng S.
 Cách 2: tính tổng S trước, xét đìều kiện (i<n) sau.
Begin
Nhập a, b
Xuất “PTVĐ”
End
a != 0
b = 0
S
S
Đ
Đ
(Hình 4)
–b/a
“PTVN”
Begin
Nhập a, b, c
x
1
= -b+sqrt(delta)/2*a
x
2
= -b-sqrt(delta)/2*a
End

a= 0
delta < 0
S
S
Đ
(Hình 5)
Giải
PTB1
(
b,c
)

“PTVN”
delta=b*b -4ac
delta = 0
S
–b/2a
Đ
Đ
Begin
n
i=1; S=0
End
S
Đ
(Hình 5
)
S i <=n
S = S+i
Begin

n
I=1; S=0
End
S
Đ
(Hình
6
)
S
i <=n
S = S+i
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 7

2. NGÔN NGỮ LẬP TRÌNH C:
2.1. Ngôn ngữ lập trình:
 Là tập hợp các chỉ thò, dữ liệu và các nguyên tắc dùng để xây dựng một
chương trình.
 Ngôn ngữ lập trình có thể phân loại theo hai cách:
(i) Ngôn ngữ bậc cao, ngôn ngữ bậc trung, ngôn ngữ bậc thấp.
(ii) Ngôn ngữ hướng thủ tục – ngôn ngữ hướng đối tượng.
C là một ngôn ngữ bậc trung có chứa các đặc trưng của cả hai loại ngôn
ngữ hướng thủ tục – ngôn ngữ hướng đối tượng.
2.2. Cấu trúc đơn giản của chương trình C:
// Các chỉ thò tiền xử lý
#include <tên tập tin .h>
#define
// Hàm chính của chương trình
void main()
{

}
2.2.1. Các chỉ thò tiền xử lý:
 #include <tên tập tin .h>: dùng để chèn nội dung của một file khác vào
chương trình nguồn tại đúng vò trí mà chỉ thò include xuất hiện. Khi lập trình
trên môi trường .NET, một số tập tin loại này đã được đưa vào thư viện của
.NET nên không có phần .h đi sau, VD: include <iostream>
 #define: dùng để đònh nghóa các tên hằng số (constant) và các macro có
phạm vi sử dụng trong toàn chương trình hoặc cho đến khi được đònh nghóa
lại sau chỉ thò #undef.
2.2.2. Hàm main():
 Các dạng của hàm main:
Dạng 1: Dạng 2: Dạng 3:
void main()
{{ /* Các khai báo*/
/* Các lệnh*/
}
Kiểu_trả_về main(void)
{ /* Các khai báo*/
/* Các lệnh*/
return Giá_trò_trả_về;
}
Kiểu_trả_về main(int i, char *str[])
{ /* Các khai báo*/
/* Các lệnh*/
return Giá_trò_trả_về;
}
 Ví dụ:
Dạng 1: Dạng 2: Dạng 3:
void main()
{ printf “Hello”};

}
int main()
{ printf “Hello”};
return 0;
}
int main(int k, char *sts[])
{ printf “Hello”};
return 0;
}
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 8
2.3. Viết chương trình với C:
 Mỗi chương trình trong C phải có một và duy nhất một hàm main. Hàm này
được xem như hàm điều khiển, bởi vì nó điểu khiển (gọi thực hiện) các
module khác.
 Các lệnh của một hàm phải đặt giữa cặp dấu {}.
 Cuối mỗi lệnh trong hàm phải có dấu chấm phẩy (;).
 Trong ngôn ngữ C, có phân biệt ký tự hoa/thường đối với các hằng chuỗi,
danh đònh, và từ khóa.
 Trên một dòng có thể chứa nhiều lệnh.
 Một lệnh có thể viết trên nhiều dòng, ngoại trừ các hằng chuỗi, danh đònh, và
từ khóa.
Tuy nhiên ta nên trình bày chương trình một cách rõ ràng để dễ đọc và
sửa chữa, ví dụ sau đây cũng là một chương trình có thể thực hiện được nhưng
nó là điển hình cho một cách trình bày chương trình vô cùng kém:
VD: Thay vì Nên sửa lại là

#include <stdlib.h
>


int main()
{printf(
“Hello” );
printf(“World”);return 0;}
#include <stdlib.h
>

int main()
{ printf(“Hello” );
printf(“World”);
return 0;
}

3. BIẾN VÀ KHAI BÁO BIẾN:
3.1. Khái niệm về biến:
 Biến là tên do người lập trình đặt ra dùng để tham khảo tới một vùng nhớ trong
máy tính.
 Một biến có thể chứa một giá trò phù hợp với kiểu dữ liệu mà ta đã khai báo
cho nó.
 Giá trò trong biến có thể thay đổi được trong chương trình.
 Tên biến gồm chữ cái, ký số, dấu nối (_) và không được bắt đầu bằng ký số.
 Biến khai báo trong một khối được gọi là biến cục bộ, biến không thuộc khối
nào gọi là biến toàn cục.
 Biến có tác dụng trong toàn khối kể từ lúc được khai báo.
3.2. Cú pháp:
<data type> variable_name1, variable_name2;
Ví dụ: int sum;
long int datenum;
foat a,b,c;
 Ta cũng có thể gán giá trò cho biến ngay tại thời điểm khai báo (phép gán ký

hiệu bởi dấu bằng =).
int a=3,b=5;
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 9
 Vò trí khai báo biến trong chương trình:
#include <stdio.h>
void main()
{ //Các khai báo biến
// Các phát biểu (lệnh) của chương trình
}
Ví dụ:
#include <stdio.h>
void main()
{ float dmon1, dmon2, d_tb;
dmon1=9.5;
dmon2=8.0;
d_tb=(dmon1+dmon2)/2;
printf(“diem tb la:” <<d_tb;
}
3.3. Các lỗi thường gặp khi viết chương trình:
3.3.1. Lỗi về cú pháp:
 Bỏ sót cặp ngoặc đơn -( )- sau từ khóa main.
 Bỏ sót hoặc đánh không chính xác dấu { ở tại vò trí bắt đầu thân của một
hàm.
 Bỏ sót hoặc đánh không chính xác dấu } ở tại vò trí kết thúc của một hàm.
 Không đặt hằng chuỗi vào cặp dấu nháy kép “”.
 Thiếu dấu chấm phẩy (;) sau mỗi câu lệnh.
 Dư dấu chấm phẩy (;) sau từ khóa main “main();”
3.3.2. Lỗi khác:
 Quên khai báo biến sử dụng trong chương trình.

VD: int a=5;
a = a + b; // chưa khai báo biến b
 Lưu một giá trò vào một biến nhưng không cùng kiểu dữ liệu với biến.
VD: int a;
a = 1.257; //gán số thực vào biến nguyên
 Sử dụng biến trong một biểu thức khi biến chưa được gán giá trò. Lỗi này
không được phát hiện bởi trình biên dòch). Khi đó kết quả của biểu thức có
thể là một giá trò bất kỳ do đó kết quả của biểu thức là vô nghóa.
VD: int a=5, b;
a = a + b; // biến b chưa được gán giá trò
 Sử dụng giá trò của phép chia không chính xác. Lỗi này thường xuất hiện
trong các biểu thức có nhiều toán hạng và lỗi này rất khó phát hiện.
VD: cần tính biểu thức 3.2 + 2/3 + 1.5

cho kết quả sẽ bằng 4.7 (=3.2 + 0 +1.5)

thay vì kết quả đúng phải bằng 5.36666666666667
(=3.2+0.6666666666667+1.5)
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 10
 Sử dụng một biểu thức mà trong đó chứa nhiều loại dữ liệu nhưng lại
không biết chắc chắn kiểu dữ liệu của kết quả.
VD: int a=5;
float b=2.4;
Khi đó a=a+b // sau lệnh này, giá trò của a là 7 thay vì 7.15
b=a+b // sau lệnh này, giá trò của b vẫn là 7.15
4. XUẤT/ NHẬP DỮ LIỆU:
4.1. Xuất dữ liệu:
4.1.1. Công dụng: xuất dữ liệu được đònh dạng ra màn hình.
4.1.2. Cú pháp:

printf ("chuỗi đònh dạng"[, đối mục 1, đối mục 2,…]);
4.1.3. Giải thích:
 Khi sử dụng hàm phải khai báo tiền xử lý #include <stdio.h>
 printf: tên hàm, phải viết bằng chữ thường.
 đối mục 1,…: là các mục dữ kiện cần in ra màn hình. Các đối mục này có
thể là biến, hằng hoặc biểu thức phải được đònh trò trước khi in ra.
 chuỗi đònh dạng: được đặt trong cặp nháy kép (" "), gồm 3 loại:
(i) Đối với chuỗi ký tự ghi như thế nào in ra giống như vậy.
(ii) Đối với những ký tự chuyển đổi dạng thức cho phép kết xuất giá trò của
các đối mục ra màn hình tạm gọi là mã đònh dạng. Sau đây là các dấu
mô tả đònh dạng:
Ký t
ư
ï nghó
a
Ký t
ư
ï nghó
a

%c K
y
ù tự đơn %
g
Số chấm độn
g
(%f ha
y
%
g

)
%s Chuỗi %x Số n
g
u
y
ên thậ
p

p
hân khôn
g
dấu
%d Số n
g
u
y
ên thậ
p

p
hân có dấu %u Số n
g
u
y
ên hex khôn
g
dấu
%
f
Số chấm độn

g
(k
y
ù hiệu thậ
p

p
hân) %o Số n
g
u
y
ên bát
p
hân khôn
g
dấu
%e Số chấm độn
g
(k
y
ù hiệu có số mũ)
(iii) Các ký tự điều khiển và ký tự đặc biệt
Ký t
ư
ï nghó
a
\a Alert (bell) Tiếng kêu bip
\b Backspace Tương tự như phím Backspace
\f Next page
\n Newline Xuống dòng và chuyển con nháy về đầu dòng

\r Carriage return Nhảy về đầu dòng (không xuống dòng)
\t Horizontal tab Canh cột tab ngang
\' Single quotation mark In ra dấu '
\" Double quotation mark In ra dấu "
\\ Backslash In ra dấu \
\0 Null character
%% percent In ra dấu %
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 11
4.1.4. Ví dụ:
Quy ước sử dụng trong các ví dụ:
Ký hiệ
u
Giải thích Ý nghó
a

\
n
Gạch dưới nét đơn Ký tự điều khiển
%d hay %5d Đậm, nghiêng ký tự chuyển đổi dạng thức
\

Gạch dưới nét đôi Ký tự đặc biệt
_
Ký tự gạch dưới Cursor sau khi xuống dòng bằng \n


Khoảng trắng (space)

VD Lệnh sử dụng trong chương trình Kết quả in ra màn hình

1
p
rintf(“Sai
g
on”); Sai
g
on
2
p
rintf(“Sai
g
on
\
n”); Sai
g
on
_
3
printf(“TP. \n
\
“ Ho Chi Minh
\
””);
TP.
“ Ho Chi Minh ”
4
int x=5;
printf("Gia tri cua bien x la: %d . \n", x);
Gia tri cua bien x la: 5.
_

5
int a=13, b=5;
printf("Tong cua %d va %d la %d", a, b, a+b);
Tong cua 13 va 5 la 18
6
int a=13, b=5;
printf("Tong cua %5d va %3d la %1d", a, b, a+b);
(i)
Tong cua
∪∪∪
13 va
∪∪
5 la 18
7
int a = 6, b = 1234, c = 62;
printf("%7d%7d%7d\n", a, b, c);
printf("%7d%7d%7d", a*b, a*c, b*c);
∪∪∪∪∪∪
6
∪∪∪
1234
∪∪∪∪∪
62
∪∪∪
7404
∪∪∪∪
372
∪∪
76508
8

float a = 6.4, b = 1234.56, c = 62.3;
printf("%7.2f %7.1f %7.2f", a, b, c);
(ii)
∪∪∪
6.40

1234.6
∪∪
62.30
9
float a = 6.4, b = 1234.55, c = 62.34;
printf("%5.1f %5.1f %5.1f\n", a, b, c);
printf("%5.1d %5.1d %5.1d", 165, 2, 965);
(iii)

6.4

1234.6

62.3
∪∪
165
∪∪∪∪
2
∪∪
965
10
int a=13, b=5;
printf("Tong cua %-5d va %-3d la %-1d", a, b, a+b);
(iv)

Tong cua 13
∪∪∪
va 5
∪∪
la 18
11
int a=13, b=5;
printf("Tong cua %02d va %02d la %04d", a, b, a+b);
(v)
Tong cua 13 va 05 la 0018
Giải thích
(i): %5d: in giá trò của a trong độ rộng 5 ký tự và canh phải.
%1d: khi độ rộng đònh dạng nhỏ (ít) hơn giá trò thực sự của biến (độ rộng của 18 là 2 lớn
hơn 1), giá trò của biến vẫn được đảm bảo in đầy đủ.
(ii): định số lượng số lẻ cho biến kiểu số thực
(iii): định dạng số lượng số lẻ khơng có tác dụng đối với số ngun.
(iv): %-5d: tương tự như %5d nhưng canh trái giá trò của biến.
(v): %04d: số 4 đi trước ký tự d là độ rộng cần biểu diễn, số 0 cho biết các khoảng trống sẽ được
thay thế bằng số 0. Lưu ý: khơng thể thay thế số 0 bằng ký tự khác, vì kết qu
ả sẽ khơng đúng.

Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 12
4.2. Nhập dữ liệu:
4.2.1. Công dụng: đònh dạng khi nhập dữ liệu.
4.2.2. Cú pháp:
scanf ("chuỗi đònh dạng"[, đối mục 1, đối mục 2,…]);
4.2.3. Giải thích:
 Khi sử dụng hàm phải khai báo tiền xử lý #include <stdio.h>
 scanf: tên hàm, phải viết bằng chữ thường.

 khung đònh dạng: được đặt trong cặp nháy_Bép (" ") là hình ảnh dạng dữ
liệu nhập vào.
 đối mục 1,…: là danh sách các đối mục cách nhau bởi dấu phẩy, mỗi đối
mục sẽ tiếp nhận giá trò nhập vào.
4.2.4. Ví dụ:
VD Lệnh sử dụng Giải thích
1
scanf("%d", &i); %d là mã đònh dạn
g
, &i là đối mục.
Nếu nhập vào 12abc, biến i chỉ nhận giá trò 12. Nhập 3.4 chỉ
nhận giá trò 3.
2
scanf("%d%d", &a, &b);
Nhập vào 2 số nguyên a, b phải cách nhau bằng khoảng
trắng (space bar) hoặc enter
5. CÁC KIỂU DỮ LIỆU:
Có ba loại dữ liệu cơ bản được dùng trong C
:
số nguyên (integer), số thực
(floating point numbers) và ký tự (character).
5.1. Số nguyên:
 Là một số có giá trò bằng hoặc khác 0 và không có phần thập phân.
 Ví dụ: 0; 5; -10; 234
 Phân loại kiểu dữ liệu nguyên trong C:
Tên kiểu
Kích
Thước
Miền giá trò
Nhỏ nhất Lớn nhất

char 1 –128 to 127
CHAR_MIN
CHAR_MAX
unsigned char 1 0 đến 255
0
UCHAR_MAX
short 2 –32,768 đến 32,767
SHRT_MIN
SHRT_MAX
unsigned short 2 0 đến 65535
0
USHRT_MAX
int 2 –32,768 đến 32,767
INT_MIN
INT_MAX
unsigned int 2 0 đến 65535
0
UINT_MAX
long 4
–2,147,483,648 đến 2,147,483,647 LONG_MIN LONG_MAX
unsigned long 4 0 đến 4,394,967,295
0
ULONG_MAX

5.2. Số thực:
 Là bất kỳ một giá trò số nào có phần thập phân phía sau.
 Ví dụ: 0.0; 2.5179; 5.0123; . . .
 Phân loại kiểu dữ liệu số thực trong C:
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 13

Tên kiểu
Kích
thước
Miền giá trò
Nhỏ nhất Lớn nhất
float 4 3.4E +/- 38 (7 digits)
FLT_MIN
FLT_MAX
double 8 1.7E +/- 308 (15 digits)
DBL_MIN
DBL_MAX
long double 10 1.2E +/- 4932 (19 digits)
LDBL_MIN
LDBL_MAX
 Khi ghi một số thực trong chương trình ta có sự phân biệt như sau:
(i) Có ký hiệu f phía sau là giá trò thuộc kiểu float.
(ii) Có ký hiệu l phía sau là giá trò thuộc kiểu long double.
(iii) Ví dụ: 9.234 thuộc kiểu double
9.234f thuộc kiểu float
9.234l thuộc kiểu long double
 Các cách trình bày số thực:
Dạng thập phân chuẩn Dạng số mu
õ
Dạng khoa họ
c

1652.
63421.
.00731
.000625

1.625e3
6.3421e4

7.31e-3
6.25e-4
1.625x10
3
6.3421x10
4
7.31x10
-3

6.25x10
-4

5.3. Ký tự:
 Kiểu ký tự bao gồm 256 ký tự trong đó bao gồm các chữ cái (chữ thường và
chữ hoa), chữ số, các dấu, một số các ký hiệu.
 Phân loại kiểu dữ liệu ký tự trong C:
Tên kiể
u

Bytes Tên gọi khác Miền giá trò
char 1 signed char –128 to 127
unsigned char 1 Không có 0 to 255
 Trong chương trình, để trình bày một hằng ký tự ta đặt vào dấu nháy đơn: ‘a’ ,
‘D’ , …

6. TOÁN TỬ TRONG C:
6.1. Toán tử số học:

Mỗi phép toán số học sẽ kết hợp 2 toán hạng.
Phép toán Ý nghó
a
Ghi chú

Phép nhân
/

Phép chia Tùy thuộc vào kiểu dữ liệu
%
Phép chia lấy phần dư Chỉ áp dụng cho hai số nguyên
+ Phép cộng
-
Phép trừ
6.1.1. Xác đònh kiểu dữ liệu của kết quả trong phép toán số học:
 Nếu cả hai toán hạng là số nguyên thì kết quả thuộc kiểu nguyên.
 Nếu có một toán hạng nào là kiểu số thực thì kết quả thuộc kiểu thực.
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 14
6.1.2. Sự kết hợp và độ ưu tiên của các toán tử:
 Hai phép toán 2 ngôi không bao giờ đứng cạnh nhau.
 Phần biểu thức được đặt trong ngoặc sẽ được ưu tiên tính toán trước.
 Có thể có nhiều cặp dấu ngoặc được sử dụng lồng vào nhau, khi đó biểu
thức đặt ở ngoặc trong cùng có ưu tiên cao nhất.
 Độ ưu tiên của các phép toán theo thứ tự liệt kê ở bảng trên. Nếu có 2
phép toán giống nhau trong cùng biểu thức thì thứ tự xét độ ưu tiên là từ trái
sang phải.
 Dấu ngoặc không thể thay thế cho ký hiệu  trong phép nhân.
Ví du:ï không thể viết (3+4)(5+1) mà phải viết (3+4)*(5+1).


6.2. Các toán tử quan hệ (
relational operators
):
 Công dụng: tạo ra các điều kiện mà dựa vào đó một chương trình có thể giải
quyết vấn đề mềm dẻo, linh hoạt.
 Các biểu thức sử dụng toán tử quan hệ gọi là biểu thức quan hệ (relation
expression).
 Một biểu thức quan hệ đơn giản gồm một toán tử quan hệ kết hợp với hai biến
hoặc hai giá trò hằng. Các toán tử này có thể áp dụng trên các kiểu dữ liệu: số
nguyên, số thực, ký tự.
 Các toán tử quan hệ trong C sau:
Toán t
ư
û Công dụng Ví dụ
< So sánh nhỏ hơn
tuoi<3
0

> So sánh lớn hơn
chieucao >1.7
<= So sánh nhò hơn hoặc bằng
trongluong<=8
0

>= So sánh nhò hơn hoặc bằng
soluong>=10
0

== So sánh bằng
loai==’a’

!= So sánh khác
loai!=’b’
 Một biểu thức quan hệ (điều kiện) sẽ có một trong hai kết quả đúng hoặc sai.
Nếu đúng thì biểu thức có giá trò 1, ngược lại có giá trò 0.
 Một biểu thức quan hệ chỉ dùng 1 phép toán quan hệ gọi là biểu thức quan hệ
đơn giản.
 Ví dụ: #include <stdio.h>
void main(void)
{ char ch1,ch2;
ch1='a';
ch2='b';
printf(“%d”,(ch1>ch2) ; // sẽ xuất ra màn hình số 0 (

false)
}
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 15
6.3. Toán tử logic:
 Các toán tử logic: ° AND (&&)
° OR (||)
° NOT (!)


Khi cần tạo ra các điều kiện phức hợp chúng ta sẽ sử dụng kết hợp giữa các toán
tử quan hệ và các toán tử logic. Khi đó các biểu thức quan hệ đơn giản (như +, - ,

, /, . . .) nên đặt trong cặp dấu ngoặc đơn ( ).
 Giá trò của biểu thức ghép được cho trong bảng sau. Trong đó true =1 và false
=0:
A B A && B A || B ! A

False False False False
True
True
False False
True
False
False
True
False
True True
True True True True
False
 Ví dụ: Ta có biểu thức sau:
• (tuoi<=30) && (cao>1.50) // biểu thức trên có giá trò bằng 1 khi
// giá trò của biến tuoi >30 và giá trò của biến cao phải >1.5.

6.4. Toán tử một ngôi:
 Trong chương trình chúng ta cũng thường sử dụng các lệnh tăng hoặc giảm
giá trò của biến đếm đi 1.
ví dụ như:
i=i+1; hoặc i=i-1;
Thay vì viết như trên ta có thể viết:
i++(hay ++i) hoặc i hay( i )
Các phép toán ++, như trên gọi phép toán một ngôi.
 Việc đặt phép toán một ngôi trước hoặc sau tên biến có sự khác nhau khi sử
dụng phép toán này chung với các phép toán khác:
(i) Nếu phép toán một ngôi đặt trước tên biến thì giá trò của biến sẽ tăng/giảm
1 trước khi thục hiện những phép toán khác
(ii) Nếu phép toán một ngôi đặt sau tên biến thì giá trò những phép toán khác
sẽ được thực hiện trước sau đó mới tăng/giảm giá trò biến đi 1.


6.5. Toán tử sizeof:
 Dùng để xác đònh kích thước của một loại dữ liệu hoặc một biến.
 Ví dụ:
printf( “kich thước kiểu int là:%d”, sizeof(int);

Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 16
6.6. Toán tử trên bit:
 Toán tử trên bit chỉ có tác dụng trên các kiểu số nguyên.

Tên toán tử Ý nghóa Ghi chú
& And
1 & 1 = 1 0 & 1 = 0
1 & 0 = 0 0 & 0 = 0
| Or
1 | 1 =1 0 | 1 =1
1 | 0 = 1 0 | 0 = 0
^ XOr
1 ^ 1 = 0 0 ^ 1 = 1
1 ^ 0 = 1 0 ^ 0 = 0
>> Shift phải A >> n = A/(2
n
)
<< Shift trái A << n = A*(2
n
)
~ Lấy phần bù ~1 = 0 ~0 = 1

6.7. Độ ưu tiên của các phép toán:

Toán tử Độ ưu tiên Trình tự kết hợp
() [] -> 1 Từ trái qua phải
! ~ ++ - + * & sizeof 2 Từ phải qua trái
* / % 3 Từ trái qua phải
+ - 4 Từ trái qua phải
<< >> 5 Từ trái qua phải
< <= >= > 6 Từ trái qua phải
== != 7 Từ trái qua phải
& 8 Từ trái qua phải
| 9 Từ trái qua phải
^ 10 Từ trái qua phải
&& 11 Từ trái qua phải
|| 12 Từ trái qua phải
?: 13 Từ phải qua trái
= += -= *= /= %= … 14 Từ phải qua trái
6.8. Các lỗi thường gặp:
 Quên khai báo các biến sử dụng trong chương trình.
 Lưu một giá trò vào một biến nhưng không cùng kiểu dữ liệu với biến.
 Sử dụng biến trong một biểu thức khi nó chưa có giá trò. Lỗi này thí không
được phát hiện bởi rình biên dòch, khi đó giá trò của biến là một giá trò bất kỳ
và kết quả của biểu thức là vô nghóa.
 Sử dụng giá trò của phép chia không chính xác. Lỗi này thường xuất hiện
trong các biểu thức có nhiều toán hạng và lỗi này rất khó phát hiện.
Ví dụ: 3.2+ 2/3+ 1.5 thì kết quả sẽ bằng 4.7 thay vì phải bằng 5.3
 Sử dụng một biểu thức mà trong đó chứa nhiều loại dữ liệu nhưng lại không
biết chắc chắn kiểu dữ liệu của kết quả
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 17
7. LỆNH GÁN – HẰNG:
7.1. Lệnh gán:

7.1.1. Công dụng: dùng để gán dữ liệu cho một biến.
7.1.2. Cú pháp:
Tên_biến= biểu thức;
Biểu thức có thể là một hằng, một biến hoặc một biểu thức
7.1.3. Lưu ý:
(i) Khi dùng biến trong biểu thức bên phải dấu =.
 Biến này trước đó phải được gán các giá trò hợp lệ.
 Ví dụ:
#include <stdio.h>
void main()
{ float fdai, frong, fdientich;
fdientich =fdai * frong; // fdai và frong chưa được gán giá trò
fdai=27.2;
frong=13.6;
printf( “Dien tich hinh chu nhat la: %f, fdientich”;
}
Chương trình trên sẽ cho kết quả không chính xác vì biến fdai và frong
chưa có giá trò khi dùng trong biểu thức gán.
(ii) Lệnh sau là không hợp lệ: amount + 128 = 1000 + 10 + 5;
(iii) Giá trò của biểu thức gán: chính là giá trò gán cho biến.

Ví dụ: nếu ta có biểu thức gán: a=5; thì bản thân biểu thức (a=5) có giá trò là 5.
Vì vậy câu lệnh sau sẽ in lên màn hình số 5:
printf (“%d,a=5);
(iv) Trong một biểu thức gán có thể có nhiều toán tử gán, khi đó biểu thức sẽ
được thực hiện từ phải qua trái:
 ví dụ a=b=c=5;
(v) Nếu biểu thức bên phải phép gán khác với kiểu dữ liệu của biến bên trái thì
kết quả biểu thức sẽ được chuyển đổi kiểu cho phù hợp với biến bên trái.
(vi) Khi kết quả của biểu thức bên phải vượt quá phạm vi của biến bên trái thì

giá trò gán vào biến sẽ không chính xác.
7.1.4. Các dạng biến đổi của lệnh gán:
 Khi viết chương trình chúng ta thường sử dụng các lệnh gán có dạng như
sau:
tong=tong+10;
tich=tich*3;
a=a-3;
c=c%k;

Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 18
 Trong các trường hợp trên ta có thể sử dụng các toán tử gán +=; -=; *=;
/=; %= được cung cấp bởi C (gọi là shortcut assignment operators)
Ví dụ:
tong=tong+10; ⇔ tong +=10;
tich=tich*3; ⇔ tich *=3;
a=a-3; ⇔ a -=3;
c=c%k; ⇔ c %=k;
 Về ý nghóa thì các lệnh gán trong hai trường hợp trên có cùng mục đích
nhưng cách dùng shortcut assignment operators sẽ giúp chương trình chạy
nhanh hơn.
7.2. Các phép biến đổi kiểu (cast):
 Có hai trường hợp chuyển đổi kiểu dữ liệu:
• Trong một biểu thức chứa nhiều loại dữ liệu.
• Chuyển đổi dữ liệu trong biểu thức gán.
Hai trường hợp chuyển đổi trên tự động diễn ra một cách ngấm ngầm bên
trong.
 Ngoài ra C cũng cung cấp cho người lập trình các toán tử biến đổi kiểu trực
tiếp gọi là cast operator. Đây là những toán tử một ngôi.
 Cú pháp: datatype(expression).

datatype là kiểu dữ liệu mà ta muốn áp đặt cho cho biểu thức.
 Ví dụ:
#include <stdio.h>
void main(void)
{
float a=3.5f, b=3.0f;
printf(“%f,int(a*b); // a*b=10.5, nhưng kết quả chỉ in ra 10
//do giá trò đã được đổi kiểu
}
7.3. Hằng (const):
7.3.1. Literal data:
 Là bất kỳ những dữ liệu nào trong chương trình mà giá trò của nó cũng chính
là tên của nó. Ví dụ như có đoạn lệnh sau:
void main()
{ float fchuvi, fbankinh;
printf( “Nhap ban kinh hinh tron:” ;
scanf(“%f”, fbankinh);
fchuvi=2*3.1416* fbankinh;
printf(“Voi ban kinh la %f thi chu vi hinh tron = %f”, fbankinh, fchuvi;
}
trong chương trình trên thì 2 và 3.1416 là các literal data.
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 19
 Nếu một literal data được sử dụng nhiều nơi trong một chương trình, thì có
khả năng chứa các lỗi tiềm ẩn, ví dụ giá trò của một literal data ghi không
thống nhất tại các vò trí trong chương trình, hoặc khi cần thay đổi giá trò của
một literal data nào đó người lập trình phải sửa ở nhiều vò trí trong chương
trình. Vì vậy vừa làm mất thời gian vừa dễ sai sót. Để tránh tình trạng này C
cung cấp cơ chế đặt tên cho một literal data thông qua từ khóa const gọi là
khai báo hằng.


7.3.2. Hằng:
 Chứa dữ liệu, dữ liệu này không thể thay đổi được trong chương trình.
 Muốn sử dụng phải khai báo.
 Phải có kiểu (tương tự như biến).
 Khai báo hằng có kiểu long int thì phải thêm vào cuối “L” (450000L).
 Cú pháp: const <data type> <name_const> = <value>;
 Ví dụ: const float PI=3.1416;
 Vò trí khai báo hằng trong chương trình:
void main()
{ //các khai báo hằng;
//các khai báo biến;
//các lệnh khác;
}

8. CÁC HÀM TOÁN HỌC TRONG C:
 Mặc dù có cung cấp các toán tử số học như + - * / nhưng vẫn không đủ
để dùng; ví dụ như không có toán tử để tính lũy thừa hay căn của một số.
Thay vào đó C cung cấp một số hàm toán học để có thể sử dụng trong
chương trình.
 Trước khi dùng một hàm ta cần phải biết:
• Tên của hàm muốn sử dụng.
• Công dụng của hàm.
• Loại dữ liệu sẽ cung cấp cho hàm.
• Kiểu dữ liệu của kết quả trả về bởi hàm.
 Cú pháp chung của một hàm là:
Function_name (danh sách các đối số).
 Khi sử dụng hàm toán học cần khai báo prototype:
# include <math.h>
Lập trình C - Cấu trúc dữ Liệu  giải thuật

Lê Văn Hạnh Oct11 20
 Một số hàm thường dùng:
Tên Hàm Công Dụng
Kiểu dữ liệu
của kết quả
abs(x) Tính trò tuyệt đối của số x (x có kiểu là int) int
fabs(x) Tính trò tuyệt đối của số x (x có kiểu là double) double
labs(x) Tính trò tuyệt đối của số x (x có kiểu là long int) long int
pow(x,y) tính x lũy thừa y double
sqrt(x) tính căn bậc 2 của x double
sin(x) tính sin x (x tính bằng radian) double
cos(x) tính cos x (x tính bằng radian) double
tan(x) tính tan x (x tính bằng radian) double
log(x) ln(x) double
log10(x) logarit cơ số 10 của x double
exp(x) e
x
double

• Đối số của những hàm trên có thể là:
 Số nguyên hoặc số thực.
 Nó có thể là hằng, biến hoặc một biểu thức.

 Ví dụ: #include <stdio.h>
#include <math.h>
void main()
{ int x=5, x=2;

printf(“x luy thua y= %d”,pow(x,y));
}




Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 21

CÁC CẤU TRÚC ĐIỀU KHIỂN
2

1. CẤU TRÚC if – else:
1.1. Công dụng: Cấu trúc if – else chỉ cho máy tính chọn thực hiện một trong hai
dãy lệnh dựa vào kết quả của một điều kiện (biểu thức quan hệ hay biểu thức
so sánh).
1.2. Cú pháp:
if (biểu thức điều kiện)
{Nhóm Lệnh 1; }
else
{Nhóm Lệnh 2;}
 Giải thích:
• Nếu điều kiện có kết quả <>0 thì thực hiện NhómLệnh 1,ngược lại thực hiện
NhómLệnh 2.
• Khi NhómLệnh1, NhómLệnh2 nhiều hơn 1 lệnh (lệnh ghép -compound
statements), thì cả nhóm lệnh phải được đặt trong cặp ngoặc nhọn ({}).
 Ví dụ: Viết chương trình cho người dùng nhập 1 số. In ra kết quả cho biết số vừa nhập là
số âm hay số dương (>=0).
#include <stdio.h>
#include <iomanip.h>
void main()
{ float num;
printf(“Nhap một so bat ky:”);

scanf(“%d”, &num);
if (num>=0)
printf(“ So %f la so duong”, num);
else
printf(“ So %f la so am”, num);
}
• Hiểu và vận dụng được các cấu trúc điều khiển để giải quyết các
yêu cầu của chương trình cần thực hiện.
• Từ cùng 1 chương trình cần dùng các lệnh lặp, học sinh có thể
chương trình trong đó lần lượt dùng các lệnh while, for, do.
• Phân biệt được sự khác nhau giữa các lệnh lặp while, for, do. Hiểu
và vận dụng được khi nào nên dùng lệnh lặp while, khi nào nên
dùng for và khi nào nên dùng lệnh lặp do.
MỤC TIÊU
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 22
1.3. Cấu trúc if không else:
 Đây là dạng biến đổi của cấu trúc trên, ở dạng này không có phần else.
 Cú pháp: if (biểu thức điều kiện)
Lệnh;
Giải thích: khi điều kiện có giá trò khác 0 thì lệnh sẽ được thực hiện.
Ngược lại sẽ không làm gì và thực hiện các lệnh sau đó (nếu có). Cũng như
trên, lệnh cũng có thể là một lệnh ghép.
 Ví du1: Chương trình sau cho phép nhập 3 số nguyên, sau đó cho biết số lớn nhất trong
3 số vừa nhập.
#include <stdio.h>
void main()
{ int num1, num2, num3, max;
printf(“Nhap so thu nhat:”);
scanf(“%d”, &num1);

printf(“Nhap so thu hai:”);
scanf(“%d”, &num2);
printf(“Nhap so thu ba:”;
scanf(“%d”, &num3);
max=num1;
if (max<num2)
max=num2;
if (max<num3)
max=num3;
printf(“so lon nhat trong so vua nhap la: %d,max”;
}

1.4. Cấu trúc if lồng nhau:
 Cho phép trong mỗi phần của if hoặc else có thể chứa một cấu trúc if – else
khác. Toàn bộ một cấu trúc if – else được xem như một câu lệnh đơn.
 Ví dụ:
Chương trình sau đây cho nhập điểm,
in ra xếp loại. Biết cáchxếp loại dựa
trên bảng sau:
Đ
iểm
X
ếp loại
<5 Yếu
5 <= và <7 Trung bình
7 <= và <9 Khá
>=9 Giỏi
#include <stdio.h>
void main()
{ float diem;

printf(“Nhap diem:”);
scanf(“%f”, &diem);
if (diem <5)
printf(“Yeu”);
else
if (diem <=7)
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 23
printf(“Trung binh”);
else
if (diem <=9)
printf(“Kha”);
else
printf(“Gioi”);
}

2. CẤU TRÚC switch:
2.1. Công dụng: Với các bài toán phải chọn một trong nhiều trường hợp nếu viết
theo cấu trúc if – else ta nhận thấy khó khăn khi đọc và theo dõi mạch chương
trình, trong trường hợp này ta nên sử dụng cấu trúc switch.
2.2. Cú pháp:
switch (biểu thức)
{
case giá_trò_1:
nhóm lệnh 1;
break;
case giá_trò _2:
nhóm lệnh 2;
break;


case giá_trò_n:
nhóm lệnh n;
break;
default:
nhóm lệnh default;
}

2.3. Giải thích:
 Trong cấu trúc switch có 1 biểu thức, 2 từ khóa (case, default) và 1 lệnh
(break).
 Giải thích:
• Biểu thức: có thể là biến hoặc biểu thức.
• case: Nếu kết quả của biểu thức sau switch bằng với giá trò đi sau case nào
thì thực hiện các lệnh thuộc về case đó (bắt đầu từ dòng lệnh ngay dưới
case cho đến khi gặp lệnh break).
• Default: Nếu như giá trò của biểu thức không bằng một giá trò nào trong các
giá trò có trong cấu trúc switch thì các lệnh thuộc default sẽ được thực hiện. :
• Lệnh break: có công dụng thoát khỏi một cấu trúc tại thời điểm nó được gọi.
Trong trường hợp này nó được dùng để thoát khỏi switch sau khi đã thực
hiện một nhóm lệnh thuộc về một nhãn nào đó. Nếu không có lệnh này thì
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Oct11 24
sau khi thực hiện xong các lệnh cần thiết nó sẽ thực hiện tiếp các lệnh của
các trường hợp bên dưới.

2.4. Ví dụ:
 Chương trình nhập vào một số nguyên (0<=so<=9), sau đó in lên màn hình
tên gọi của số này:
#include <stdio.h>
void main()

{ unsigned short int so;
printf(“Nhap mot so nguyen : ");
scanf(“%d”, &so);
switch (so)
{
case 0: printf(“Khong");
break;
case 1: printf(“Mot");
break;
case 2: printf(“Hai");
break;
case 3: printf(“Ba");
break;
case 4: printf(“Bon");
break;
case 5: printf(“Nam");
break;
case 6: printf(“Sau");
break;
case 7: printf(“Bay");
break;
case 8: printf(“Tam");
break;
case 9: printf(“Chin");
break;
default :
printf(“Nhap khong dung";
}
}
 Chương trìnhï sau cho phép nhập một ký tự, sau đó cho biết ký tự vừa nhập có

phải là một nguyên âm hay không.
#include <stdio.h>
void main()
{ char ch;
printf(“Nhap mot ky tu: ");
scanf(“%c”, &ch);
switch (ch)
{ case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
printf(“\n Ky tu vua nhap la mot nguyen am\n");
break;
default :
printf(“\nKy tu vua nhap khong phai la mot nguyen am\n");
}
}
Lập trình C - Cấu trúc dữ Liệu  giải thuật
Lê Văn Hạnh Jan2011 25
2.5. Các lỗi thường gặp:
 Dùng toán tử gán trong biểu thức quan hệ.
 Khi có nhiều lệnh thuộc về if hoặc else không đặt giữa cặp ngoặc { }.
 Trong cấu trúc switch thiếu break ở những vò trí cần thiết.

3. CÁC CẤU TRÚC LẶP
3.1. Cấu trúc while:
3.1.1. Cú pháp:
while (Biểu thức ĐiềuKiện)
{

NhómLệnh;
}
3.1.2. Giải thích:
 Biểu thức ĐiềuKiện phải được đặt trong cặp ngoặc đơn.
 NhómLệnh bên dưới biểu thức ĐiềuKiện sẽ được thực hiện lặp đi lặp lại khi
mà biểu thức ĐiềuKiện vẫn có giá trò khác không. Như vậy tất nhiên ở đâu
đó trong đoạn lệnh của while phải có một lệnh làm thay đổi giá trò của biểu
thức ĐiềuKiện.
 Câu lệnh bên dưới ĐiềuKiện phải là một lệnh duy nhất hoặc là một lệnh
ghép (nhiều lệnh đặt vào trong {})

3.1.3. Hoạt động của while như sau:
 Kiểm tra giá trò của biểu thức ĐiềuKiện.
 Nếu biểu thức ĐiềuKiện có giá trò khác không.
• Thực hiện lệnh bên dưới.
• Quay lại kiểm tra biểu thức ĐiềuKiện.
 Ngược lại: kết thúc cấu trúc while.
Hình minh họa tiến trình hoạt động của while.













Điểm vào vòng lặp while
Kiểm Tra giá trò
của BTDK

Giá trò của BTĐK
bằn
g
0
(
sai
)

Kết thúc
vòng lặp

hil
Giá trò của BTĐK
khác 0 (đúng)
Thực hiện NhómLệnh
của while

Quay
lại
kiểm
tra
BTĐK

×