Professional Documents
Culture Documents
Lập trình C trong kỹ thuật điện tử - Ngô Duyên Tập, Phạm Huy
Quỳnh – 1999.
Kỹ thuật lập trình C cơ sở và nâng cao – Phạm Văn Ất – 2006.
Bài giảng kỹ thuật lập trình - Học viện kỹ thuật quân sự - Hà Đại
Dương.
Bài giảng kỹ thuật lập trình – Học viện công nghệ bưu chính viễn
thông– Nguyễn Duy Phương.
Email: thuonglh@vlute.edu.vn
Blog: thuonglh.blogtiengviet.net
Chưa học mà
cảm thấy rắc rối
quá ?!?!
10
KỸ THUẬT LẬP TRÌNH
Mọi bài toán đều có thể diễn đạt theo sơ đồ như sau:
A => B
A là giả thiết, điều kiện ban đầu, thông tin đã cho
B là kết luận, là mục tiêu cần đạt khi kết thúc bài toán;
=> là suy luận, giải pháp cần xác định để có được kết quả
B từ cái đã có A.
Xác định bài toán có nghĩa là xác định A, B và nếu có thể
thì xác định luôn cả các bước thực hiện để “đi” được từ A
đến B
A ??? B???
Tính chính xác: quá trình tính toán hay các thao tác máy tính
thực hiện là chính xác.
Tính rõ ràng: các câu lệnh minh bạch được sắp xếp theo thứ
tự nhất định.
Tính khách quan: được viết bởi nhiều người trên máy tính
nhưng kết quả phải như nhau.
Tính phổ dụng: có thể áp dụng cho một lớp các bài toán có
đầu vào tương tự nhau.
Tính kết thúc: hữu hạn các bước tính toán.
Giải thuật là một trình tự thực hiện công việc nào đó.
Lưu đồ là sự biểu diễn đồ hoạ của giải thuật.
Lưu đồ chứa các ký hiệu biểu diễn các bước của giải thuật.
Mỗi ký hiệu biểu diễn một hoạt động.
Công Việc
Ví dụ
Thuật toán giải PT bậc nhất: ax + b = 0
(a, b là các số thực).
Đầu vào: a, b thuộc R
Đầu ra: nghiệm phương trình ax + b = 0
• Nếu a = 0
• b = 0 thì phương trình có nghiệm bất kì.
• b ≠ 0 thì phương trình vô nghiệm.
• Nếu a ≠ 0
• Phương trình có nghiệm duy nhất x = -b/a
Đầuvào: a, b thuộc R
Đầura: nghiệm phương trình ax + b = 0
1.Nhập 2 số thực a và b.
2.Nếu a = 0 thì
2.1. Nếu b = 0 thì
2.1.1. Phương trình vô số nghiệm
2.1.2. Kết thúc thuật toán.
2.2. Ngược lại
2.2.1. Phương trình vô nghiệm.
2.2.2. Kết thúc thuật toán.
3. Ngược lại
3.1. Phương trình có nghiệm.
3.2. Giá trị của nghiệm đó là x = -b/a
3.3. Kết thúc thuật toán.
Bắt đầu
Đọc a,b
Đ S
a=0
Đ S
Tính
b=0
x = -b/a
Xuất Xuất
Xuất x
“VSN” “VN”
Kết thúc
Vay mượn ngôn ngữ nào đó (ví dụ Pascal) để biểu diễn thuật
toán.
Đầu vào: a, b thuộc R
Đầu ra: nghiệm phương trình ax + b = 0
If a = 0 Then
Begin
If b = 0 Then
Xuất “Phương trình vô số nghiệm”
Else
Xuất “Phương trình vô nghiệm”
End
Else
Xuất “Phương trình có nghiệm x = -b/a”
#include <stdio.h>
#include <conio.h>
void main()
{
int a, b;
printf(“Nhap a, b: ”);
scanf(“%d%d”, &a, &b);
if (a == 0)
if (b == 0)
printf(“Phương trình VSN”);
else
printf(“Phương trình VN”);
else
printf(“x = %.2f”, -float(b)/a);
}
Biên Soạn: ThS.Lương Hoài Thương
27
&
VC
BB
Vẽ lưu đồ giải thuật trong ví dụ sau
1. Thuật toán là gì? Trình bày các tính chất quan trọng của một
thuật toán?
2. Các bước xây dựng chương trình?
3. Các cách biểu diễn thuật toán? Ưu và khuyết điểm của từng
phương pháp?
Cho ví dụ minh họa.
4. Nhập năm sinh của một người. Tính tuổi người đó.
5. Nhập 2 số a và b. Tính tổng, hiệu, tính và thương của hai số đó.
6. Nhập tên sản phẩm, số lượng và đơn giá. Tính tiền và thuế giá
trị gia tăng phải trả, biết:
a. tiền = số lượng * đơn giá
b. thuế giá trị gia tăng = 10% tiền
2 Bộ từ vựng của C
Trçnh biãn dëch coï sæû tæång æïng 1-1 giæîa caïc lãûnh cuía håüp ngæî vaì
caïc lãûnh maïy.
Ngæåüc laûi, mäüt lãûnh âån giaín cuía ngän ngæî báûc cao coï thãø âæa ra
nhiãöu lãûnh maïy.
Taïch mäüt ngän ngæî láûp trçnh xa khoíi ngän ngæî maïy ráút khoï khàn.
Ngän ngæî báûc cao caìng taïch xa cáúu truïc maïy tênh mang âãún cho ta
hai âiãöu thuáûn låüi:
Caïc ngän ngæî báûc cao taïch láûp trçnh viãn khoíi caïc âàûc tênh cuû thãø cuía
mäùi cáúu truïc maïy tênh.
Caïc chæång trçnh viãút bàòng ngän ngæî báûc cao thç dãù âoüc vaì dãù baío trç.
Vê duû:
Chæång trçnh ngän ngæî báûc cao:
a=b+c-2
Chæång trçnh viãút bàòng håüp ngæî:
LW R1, b ASSEMBLY:
LW R2, c MOV AX, b
ADD R3, R1, R2 MOV BX, c
LW R4, 2 ADD AX, BX
SUB R5, R3, R4 SUB AX, 2
SW a, R5 MOV a, AX
Biên Soạn: ThS.Lương Hoài Thương
37
&
VC
BB
Giới thiệu
Giới thiệu
Dennis Ritchie tại Bell Telephone năm 1972.
Tiền thân của ngôn ngữ B, KenThompson, cũng tại Bell
Telephone.
Là ngôn ngữ lập trình có cấu trúc và phân biệt chữ Hoa - thường
(case sensitive)
#include <stdio.h>
#include <conio.h>
int main()
{ int x, y, tong;
printf(“Nhap hai so nguyen: ”);
scanf(“%d%d”, &x, &y);
tong = x + y;
printf(“Tong hai so la %d”, tong);
getch();
return 0;
}
Đặc điểm
C ngầm định một cách không tường minh:
• false (sai): giá trị 0.
• true (đúng): giá trị khác 0, thường là 1.
C++: bool
Ví dụ
0 (false), 1 (true), 2 (true), 2.5 (true)
1 > 2 (0, false), 1 < 2 (1, true)
Đặc điểm
Tên kiểu: char
Miền giá trị: 256 ký tự trong bảng mã ASCII.
Chính là kiểu số nguyên do:
• Lưu tất cả dữ liệu ở dạng số.
• Không lưu trực tiếp ký tự mà chỉ lưu mã ASCII của ký tự đó.
Ví dụ
Lưu số 65 tương đương với ký tự ‘A’…
Lưu số 97 tương đương với ký tự ‘a’.
Ví dụ
int i;
Biến int j, k;
unsigned char dem;
float ketqua, delta;
Cú pháp
<kiểu> <tên biến>;
<kiểu> <tên biến 1>, <tên biến 2>;
Cú pháp
<kiểu> <tênhằng> = <giá trị>;
Hằng
thường
Ví dụ
int a = 1506; // 150610
int b = 01506; // 15068
int c = 0x1506; // 150616 (0x hay 0X)
float d = 15.06e-3; // 15.06*10-3 (e hay E)
Biên Soạn: ThS.Lương Hoài Thương
61
&
VC
BB
Hằng số
Cú pháp
#define <tênhằng> <giá trị>
Hằng hoặc sử dụng từ khóa const.
ký hiệu
Ví dụ
#define MAX 100 // Không có ;
#define PI 3.14 // Không có ;
const int MAX = 100;
const float PI = 3.14;
Biên Soạn: ThS.Lương Hoài Thương
62
&
VC
BB
Hằng
Khái niệm
Tạo thành từ các toán tử (Operator) và các toán hạng
(Operand).
Toán tử tác động lên các giá trị của toán hạng và cho giá
trị có kiểu nhất định.
Toán tử: +, –, *, /, %….
Toán hạng: hằng, biến, lời gọi hàm...
Ví dụ
2 + 3, a / 5, (a + b) * 5, …
Khái niệm
Thường được sử dụng trong lập trình.
Gán giá trị cho biến.
Cú pháp
<biến> = <giá trị>;
<biến> = <biến>;
<biến> = <biểu thức>;
Có thể thực hiện liên tiếp phép gán.
Ví dụ
void main()
{ int a, b, c, d, e, thuong;
a = 10;
b = a;
thuong = a / b;
a = b = c = d = e = 156;
e = 156;
d = e;
c = d;
b = c;
a = b;
}
Toán tử 1 ngôi
Chỉ có một toán hạng trong biểu thức.
++ (tăng 1 đơn vị), -- (giảm 1 đơn vị)
Đặt trước toán hạng
• Ví dụ ++x hay --x: thực hiện tăng/giảm trước.
Đặt sau toán hạng
• Ví dụ x++ hay x--: thực hiện tăng/giảm sau.
Ví dụ
x = 10; y = x++; // y = 10 và x = 11
x = 10; y = ++x; // x = 11 và y = 11
Biên Soạn: ThS.Lương Hoài Thương
68
&
VC
BB
Toán tử 2 ngôi
Có hai toán hạng trong biểu thức.
+, –, *, /, % (chia lấy phần dư)
x = x + y x += y;
Ví dụ
a = 1 + 2; b = 1 – 2; c = 1 * 2; d = 1 / 2;
e = 1*1.0 / 2;
h = 1 % 2;
x = x * (2 + 3*5); x *= 2 + 3*5;
& 0 1 | 0 1
0 0 0 0 0 1
1 0 1 1 1 1
^ 0 1 ~ 0 1
0 0 1 1 0
1 1 0 71
Biên Soạn: ThS.Lương Hoài Thương
&
VC
BB
Ví dụ
void main()
{
int a = 5; // 0000 0000 0000 0101
int b = 6; // 0000 0000 0000 0110
Ví dụ
• s1 = (1 > 2) && (3 > 4);
• s2 = (1 > 2) || (3 > 4);
• s3 = !(1 > 2);
Biên Soạn: ThS.Lương Hoài Thương
75
&
VC
BB
Toán tử phẩy
Các biểu thức đặt cách nhau bằng dấu ,
Các biểu thức con lần lượt được tính từ trái sang phải.
Biểu thức mới nhận được là giá trị của biểu thức bên phải
cùng.
Ví dụ
x = (a++, b = b + 2);
a++; b = b + 2; x = b;
a D6 158
07 159
160
.
.
.
Biên Soạn: ThS.Lương Hoài Thương
83
&
VC
BB
Phép toán chuyển đổi kiểu bắt buộc
Khái niệm
Là một chỉ thị trực tiếp, hoàn chỉnh nhằm ra lệnh cho máy tính
thực hiện một số tác vụ nhất định nào đó.
Trình biên dịch bỏ qua các khoảng trắng (hay tab hoặc xuống
dòng) chen giữa lệnh.
Ví dụ
a=2912;
a = 2912;
a
=
2912;
Phân loại
Câu lệnh đơn: chỉ gồm một câu lệnh.
Câu lệnh phức (khối lệnh): gồm nhiều câu lệnh đơn
được bao bởi { và }
Ví dụ
a = 2912; // Câu lệnh đơn
float x = 15.06;
printf(“%f”, x); Xuất ra 15.060000
printf(“%f”, 1.0/3); Xuất ra 0.333333
1 7 0 6
1 7 6 . 8 5
1 7 6 . 8 5
#include <stdio.h>
int main(void)
{
float R1, R2, R3, R_equ;
R1=1.0e3; /* 1 kohms */
R2=500.0; /* 500 ohms */
R3=250.0; /* 250 ohms */
puts("Program to determine equivalent resistance of");
puts(“Three resistors connected in parallel");
R_equ=1/(1/R1+1/R2+1/R3);
printf("R1=%0.3f, R2=%0.3f, R3=%0.3f\n",R1,R2,R3);
printf("Equiv resistance is: %0.3f ohms\n",R_equ);
return(0);
}
Biên Soạn: ThS.Lương Hoài Thương
101
&
VC
BB
MỘT SỐ VÍ DỤ
Tính điện kháng của tụ điện trong hình sau biết C=1uF, f=10kHz
#include <stdio.h>
#define PI 3.14159
int main(void)
{
float freq, cap, X_c;
freq = 10.0e3; /* 1 kHz */
cap = 1.0e-6; /*1 micro F */
x_c = 1/(2.0*PI*freq*cap);
printf (“freq: %0.0f Hz, cap: %0.6f Farad\n” ,freq ,cap);
printf (“Cap Reactance is: %0.2f ohms\n”,x_c);
return (0);
}
#include <stdio.h>
#include <math.h> /* sqrt() */
#define PI 3.14159
int main(void)
{
float L=1e-3,C=1e-6,f_res; /* L is 1 mH, C is 1 uF */
puts("Program to calculate resonant frequency of a series");
puts("L-C circuit");
f_res=1/(2*PI*sqrt(L*C));
printf("C=%.3f F, L=%.6f H\n" ,C,L);
printf("Resonant frequency is: %.3f Hz\n",f_res);
return(0);
}
Biên Soạn: ThS.Lương Hoài Thương
103
&
VC
BB
Viết chương trình tính giá vout biết Vin, R1, R2 nhập từ bàn phím
trong hình sau
#include <stdio.h>
#define PI 3.14159
int main (void)
{
float freq,cap,X_c;
puts("Enter frequency and Capacitance");
scanf("%f %f",&freq,&cap);
X_c=1.0/(2.0*PI*freq*cap);
printf("Capacitive Reactance is %6.3f ohms\n",X_c);
return(0);
}
Biên Soạn: ThS.Lương Hoài Thương
111
&
VC
BB
MỘT SỐ VÍ DỤ
Tính trở kháng của mạch RL nối tiếp với các thông số nhập từ bàn phím
#include <stdio.h>
#include <math.h> /* sqrt() */
#define PI 3.14159
int main(void)
{
float R,L,freq,Xl,Zin_mag;
printf("Enter R, L and frequency >>");
scanf("%f %f %f",&R,&L,&freq);
Xl= 2 * PI * freq * L;
Zin_mag = sqrt(R*R+Xl*Xl);
printf("Zin mag %6.2f ohm,\n",Zin_mag);
return(0); }
Biên Soạn: ThS.Lương Hoài Thương
112
&
VC
BB
MỘT SỐ VÍ DỤ
Viết chương trình thực hiện chức năng tương đương các cổng
logic sau: and, or, ex-or, nand, nor
#include <stdio.h>
int main(void)
{
int value1, value2;
printf("Enter two hex values >>> ");
scanf("%x %x",&value1,&value2);
printf("Values AND is %x\n",value1 & value2);
printf("Values OR is %x\n",value1 | value2);
printf("Values Ex-OR is %x\n",value1 ^ value2);
printf("Values NAND is %x\n",~(value1 & value2));
printf("Values NOR is %x\n",~(value1 | value2));
return(0);
}
Biên Soạn: ThS.Lương Hoài Thương
113
&
VC
BB
MỘT SỐ VÍ DỤ
Viết chương trình chuyễn đỗi từ thập phân sang Hex, bát phân.
#include <stdio.h>
int main(void)
{
int value;
puts("Enter integer value (-32768 to 32767) >> ");
scanf("%d",&value);
printf("Decimal = %d, Octal = %o, Hex = %x\n",value,value,value);
return(0);
}
Ví dụ
int x = 4, y = 3, z = -5;
float t = -1.2;
float kq1 = sqrt(x1);
int kq2 = pow(x, y);
float kq3 = pow(x, 1/3);
float kq4 = pow(x, 1.0/3);
int kq5 = abs(z);
float kq6 = fabs(t);
1. Tên (định danh) nào sau đây đặt không hợp lệ, tại sao?
Tin hoc co SO A, 1BaiTapKHO
THucHaNH, NhapMon_L@pTrinH
2. Câu ghi chú dùng để làm gì? Cách sử dụng ra sao? Cho ví dụ
minh họa.
3. Trình bày cấu trúc của một chương trình C. Giải thích ý nghĩa
của từng phần trong
cấu trúc.
6. Nhập năm sinh của một người và tính tuổi của người đó.
7. Nhập 2 số a và b. Tính tổng, hiệu, tính và thương của hai số đó.
8. Nhập tên sản phẩm, số lượng và đơn giá. Tính tiền và thuế giá
trị gia tăng phải trả, biết:
a. tiền = số lượng * đơn giá
b. thuế giá trị gia tăng = 10% tiền
9. Nhập điểm thi và hệ số 3 môn Toán, Lý, Hóa của một sinh viên.
Tính điểm trung bình của sinh viên đó.
10.Nhập bán kính của đường tròn. Tính chu vi và diện tích của hình
tròn đó.
11.Nhập vào số xe (gồm 4 chữ số) của bạn. Cho biết số xe của bạn
được mấy nút?
13. Tính giá trị của tụ điện C trong các trường hợp
sau:
Thép : 8 × 75.10^(-4)
Ferrite: 2 × 10^(-5) -> 8 × 10^(-4)
Chân không: 1,26 × 10^(-6)
16. Tính điện trở tương ứng khi biết số lượng led đơn được kết nối vào nhánh
17. Tính công suất điện trở khi biết thay đổi điện áp đầu
vào như hình sau:
True(khac 0)
Các phép toán xử
Các toán tử logic
lý bit
&&, ||
&,|,~,<<,>> False(bang 0) True/false
S
<BT Logic>
Đ
<Lệnh 1>
Trong ( ), cho kết quả
(sai = 0, đúng ≠ 0)
if (<BT Logic>)
<Lệnh 1>; Câu lệnh đơn hoặc
Câu lệnh phức (kẹp
giữa { và })
void main()
{
if (a == 0)
printf(“a bang 0”);
if (a == 0)
{
printf(“a bang 0”);
a = 2912;
}
}
S
<BT Logic> <Lệnh 2>
Đ
<Lệnh 1>
Trong ( ), cho kết quả
(sai = 0, đúng ≠ 0)
if (<BT Logic>)
<Lệnh 1>; Câu lệnh đơn hoặc
Câu lệnh phức (kẹp
else giữa { và })
<Lệnh 2>;
Biên Soạn: ThS.Lương Hoài Thương
135
&
VC
BB
Câu lệnh if (đủ)
void main()
{
if (a == 0)
printf(“a bang 0”);
else
printf(“a khac 0”);
if (a == 0)
{
printf(“a bang 0”);
a = 2912;
}
else
printf(“a khac 0”);
}
Câu lệnh if và câu lệnh if… else là một câu lệnh đơn.
{
if (a == 0)
printf(“a bang 0”);
}
{
if (a == 0)
{
printf(“a bang 0”);
a = 2912;
}
else
printf(“a khac 0”);
}
Biên Soạn: ThS.Lương Hoài Thương
137
&
VC
BB
Câu lệnh if - Một số lưu ý
Câu lệnh if có thể lồng vào nhau và else sẽ tương ứng với if gần
nó nhất.
if (a != 0)
if (b > 0)
printf(“a != 0 va b > 0”);
else
printf(“a != 0 va b <= 0”);
if (a !=0)
{
if (b > 0)
printf(“a != 0 va b > 0”);
else
printf(“a != 0 va b <= 0”);
}
Biên Soạn: ThS.Lương Hoài Thương
138
&
VC
BB
Câu lệnh if - Một số lưu ý
if (delta < 0)
printf(“PT vo nghiem”);
else // delta >= 0
if (delta == 0)
printf(“PT co nghiem kep”);
else
printf(“PT co 2 nghiem”);
Biên Soạn: ThS.Lương Hoài Thương
139
&
VC
BB
Câu lệnh if - Một số lưu ý
if (a != 0);
printf(“a khac 0.”);
if (a != 0)
{
};
printf(“a khac 0.”);
}
Biên Soạn: ThS.Lương Hoài Thương
140
&
VC
BB
Một số ví dụ
Viết chương trình máy tính đơn giản giống như hình sau
s
đ
NAND Tính+ ht kq
Chuẩn bị
void main()
{
int a;
printf(“Nhap a: ”);
scanf(“%d”, &a);
switch (a)
{
case 1 : printf(“Mot”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
}
}
void main()
{
int a;
printf(“Nhap a: ”);
scanf(“%d”, &a);
switch (a)
{
case 1 : printf(“Mot”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
default : printf(“Ko biet doc”);
}
}
Câu lệnh switch là một câu lệnh đơn và có thể lồng nhau.
{
switch (a)
{
case 1 : printf(“Mot”); break;
case 2 : switch (b)
{
case 1 : printf(“A”); break;
case 2 : printf(“B”); break;
} break;
case 3 : printf(“Ba”); break;
default : printf(“Khong biet doc”);
}
}
Biên Soạn: ThS.Lương Hoài Thương
157
&
VC
BB
Câu lệnh switch - Một số lưu ý
Các giá trị trong mỗi trường hợp phải khác nhau.
switch (a)
{
case 1 : printf(“Mot”); break;
case 1 : printf(“MOT”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
case 1 : printf(“1”); break;
case 1 : printf(“mot”); break;
default : printf(“Khong biet doc”);
}
switch sẽ nhảy đến case tương ứng và thực hiện đến khi nào gặp
break hoặc cuối switch sẽ kết thúc.
switch (a)
{
case 1 : printf(“Mot”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
}
switch nhảy đến case tương ứng và thực hiện đến khi nào gặp
break hoặc cuối switch sẽ kết thúc.
switch (a)
{
case 1 : printf(“Mot”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
}
switch (a)
{
case 1 : printf(“Mot”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
} Biên Soạn: ThS.Lương Hoài Thương 160
&
VC
BB
Câu lệnh switch - Một số lưu ý
if (a == 1) switch (a)
printf(“Mot”); {
if (a == 2) case 1: printf(“Mot”);
printf(“Hai”); break;
if (a == 3) case 2: printf(“Hai”);
printf(“Ba”); break;
if (a == 4) case 3: printf(“Ba”);
printf(“Bon”); break;
if (a == 5) case 4: printf(“Bon”);
printf(“Nam”); break;
case 5: printf(“Nam”);
}
* Nhập vào số nguyên không âm, đưa ra ngày trong tuần tương
ứng (theo số dư khi chia cho 7).
* Trong một năm các tháng có 30 ngày là 4, 6, 9, 11 còn các
tháng có 31 ngày là 1, 3, 5, 7, 8, 10, 12. Riêng tháng hai có thể
có 28 hoặc 29 ngày. Hãy viết chương trình nhập vào 1 tháng,
sau đó đưa ra kết luận tháng đó có bao nhiêu ngày.
label
Lệnh goto chuyển điều khiển đến một câu lệnh bất kỳ
khác bên trong cùng một hàm trong một chương trình C
Điều này thật ra vi phạm đến qui luật của một ngôn ngữ
lập trình cấu trúc.
Chúng làm giảm độ tin cậy của chương trình và chương
trình khó bảo trì.
#include<stdio.h>
int m;
int main()
{ hi:
printf("dien dien tu tra vinh VLVH\n");
goto hi;
}
Hàm
1. Nhập một số bất kỳ. Hãy đọc giá trị của số nguyên đó nếu nó có
giá trị từ 1 đến 9, ngược lại thông báo không đọc được.
2. Nhập một chữ cái. Nếu là chữ thường thì đổi sang chữ hoa,
ngược lại đổi sang chữ thường.
3. Giải phương trình bậc nhất ax + b = 0.
4. Giải phương trình bậc hai ax2 + bx + c = 0.
8. Nhập vào tháng và năm. Cho biết tháng đó có bao nhiêu ngày.
9. Nhập độ dài 3 cạnh 1 tam giác. Kiểm tra đó có phải là tam giác không
và là tam giác gì?
10. Viết chương trình khoá số điện tử, nếu nhấn đúng
phím cho đèn hiển thị sáng, nếu sai có đèn báo nhập lại
MK:123
11. Viết chương trình mạch game trò chơi dành cho 3 đội chơi,
nếu đội nào nhấn trước thì các đội khác không tác động được, có
đèn hiển thị cho mỗi đội chơi đó.
13. Viết chương trình tính giá trị của điện trở với 3 vòng
màu (bỏ qua sai số)
Giải pháp
Sử dụng cấu trúc lặp lại một hành động trong khi còn
thỏa một điều kiện nào đó.
3 lệnh lặp: for, while, do… while
Biên Soạn: ThS.Lương Hoài Thương
185
&
VC
BB
Câu lệnh for
<Khởi đầu>
<Bước nhảy>
Đ
<Đ/K lặp> <Lệnh>
void main()
{
int i;
for (i = 0; i < 10; i++)
printf(“%d\n”, i);
Câu lệnh for là một câu lệnh đơn và có thể lồng nhau.
int i;
for (i = 0; i < 10; i++)
printf(“%d\n”, i); <Khởi đầu>
int i;
for (i = 0; i < 10; i++)
printf(“%d\n”, i); <Khởi đầu>
int i;
for (i = 0; i < 10; i++)
printf(“%d\n”, i);
for (i = 0; ; i++)
printf(“%d\n”, i);
for (i = 0; ; i++)
{
if (i >= 10)
break;
printf(“%d\n”, i);
}
Biên Soạn: ThS.Lương Hoài Thương
191
&
VC
BB
Lệnh break làm kết thúc câu lệnh.
Lệnh continue bỏ qua lần lặp hiện tại.
193
Biên Soạn: ThS.Lương Hoài Thương
&
VC
BB
Câu lệnh for - Một số lưu ý
Nhap n : 6
Ket qua là 720
S
Kết thúc
Lưu Đồ
START
A=0
A++ C++ Z
S
Đ Đ
B=0 B<=1 C=0 C<=1
A<=1
Đ
S
S
B++
END
Đ
<Đ/K lặp> <Lệnh>
int i = 0;
while (i < 10)
{
printf(“%d\n”, i);
i++;
}
int i = 0;
for (; i < 10; )
{
printf(“%d\n”, i);
i++;
}
Biên Soạn: ThS.Lương Hoài Thương
209
&
VC
BB
Câu lệnh while - Một số lưu ý
Câu lệnh while là một câu lệnh đơn và có thể lồng nhau.
Câu lệnh while có thể không thực hiện lần nào do điều kiện lặp
ngay từ lần đầu đã không thỏa.
void main()
{
int n = 1;
while (n > 10)
{
printf(“%d\n”, n);
n--;
}
…
}
n = 1;
while (n < 10)
printf(“%d”, n);
}
Nhap n : 96
Ket qua la: 4656
<Lệnh>
Đ
<Đ/K lặp>
<Lệnh>;
Biểu thức C bất kỳ,
while (<Đ/K lặp>); thường là biểu thức
quan hệ cho kết quả
0 (sai) và != 0 (đúng)
Biên Soạn: ThS.Lương Hoài Thương
215
&
VC
BB
Câu lệnh do… while
int i = 0;
do
{
printf(“%d\n”, i);
i++;
}
while (i < 10);
int i = 0;
printf(“%d\n”, i);
i++;
for (; i < 10; )
{
printf(“%d\n”, i);
i++;
}
Biên Soạn: ThS.Lương Hoài Thương
216
&
VC
BB
Câu lệnh do… while - Một số lưu ý
Câu lệnh do… while là một câu lệnh đơn và có thể lồng nhau.
int a = 1, b;
do
{
b = 1;
do
{
printf(“%d\n”, a + b);
b = b + 2;
}
while (b < 20);
a++;
}
while (a < 20);
Biên Soạn: ThS.Lương Hoài Thương
217
&
VC
BB
Câu lệnh do… while - Một số lưu ý
Câu lệnh do… while sẽ được thực hiện ít nhất 1 lần do điều kiện
lặp được kiểm tra ở cuối.
void main()
{
int n;
do
{
printf(“Nhap n: ”);
scanf(“%d”, &n);
}
while (n < 1 || n > 100);
}
n = 1;
do
printf(“%d”, n);
while (n < 10);
…
Biên Soạn: ThS.Lương Hoài Thương
219
&
VC
BB
for, while, do… while
int i = 1;
while (i <= n)
{
printf(“%d\n”, i); i++;
}
int i = 1;
do {
printf(“%d\n”, i); i++;
} while (i < n);
Biên Soạn: ThS.Lương Hoài Thương
220
&
VC
BB
for, while, do… while
Số lần lặp xác định ngay trong câu lệnh for
int n = 10;
for (int i = 1; i <= n; i++)
…;
int i = 1;
while (i <= n)
{
…;
}
int i = 1;
do {
…;
} while (i > n);
Biên Soạn: ThS.Lương Hoài Thương
221
&
VC
BB
while & do… while
Cách làm:
Nếu dùng lệnh if Chỉ kiểm tra được 1 lần
Không dùng for được vì chưa biết trước số lần lặp.
Sử dụng vòng lặp while/ do while
Biên Soạn: ThS.Lương Hoài Thương
223
&
VC
BB
Một số ví dụ Bắt đầu
i ¬ i+1
s s
i > 100 S > 1550
đ đ
Kết thúc
Viết chương trình tính tiền điện của khách hàng A sử dụng
trong tháng.
1-50 kWh : 500 tiền.
51-100 kWh : 1000 tiền.
Trên 100 kWh : 1500 tiền.
và có thêm dòng thông báo y/n để nhập lại hoặc thoát chương
trình.
Thực hiện lại ví dụ 3.4 tính giá trị điện trở tương đương trong 2 trường
hợp song song và nối tiếp.
Khi hiển thị kết quả điện trở tương đương, đồng thời có thêm dòng thông
báo y/n
Nếu chọn y tiếp tục tính giá trị điện trở tương đương. Nếu chon n kết thúc
chương trình.
#include <stdio.h>
int main(void)
{ int A,B,C,Z;
do { printf("Enter A input (0 or 1) >>");
scanf("%d",&A);
if ( (A!=0) && (A!=1) ) puts("Invalid input");
} while ( (A!=0) && (A!=1)) ;
do { printf("Enter B input (0 or 1) >>");
scanf("%d",&B);
if ( (B!=0) && (B!=1) ) puts("Invalid input");
} while ( (B!=0) && (B!=1)) ;
do { printf("Enter C input (0 or 1) >>");
scanf("%d",&C);
if ( (C!=0) && (C!=1) ) puts("Invalid input");
} while ( (C!=0) && (C!=1)) ;
Z=!((A && B) || C);
printf("Output will be %d\n",Z);
return(0);
}
Biên Soạn: ThS.Lương Hoài Thương
228
&
VC
BB
MỘT SỐ VÍ DỤ
1 0 0 1 EX-OX
1 0 1 0
NOR
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
235
1 1 1 1 Biên Soạn: ThS.Lương Hoài Thương
&
VC
BB
Bài tập
10. Viết chương trình in ra màn hình bảng trạng thái ABCD và giá trị
của hàm Y. Cuối dòng kết quả có thêm thông báo Y/N
1 Khái niệm
2 Khai báo
Khái niệm
Là một kiểu dữ liệu có cấu trúc do người lập trình định nghĩa.
Biểu diễn một dãy các biến có cùng kiểu. Ví dụ: dãy các số
nguyên, dãy các ký tự…
Kích thước được xác định ngay khi khai báo và không bao giờ
thay đổi.
NNLT C luôn chỉ định một khối nhớ liên tục cho một biến kiểu
mảng.
Ví dụ
int Mang1Chieu[10];
0 1 2 3 4 5 6 7 8 9
Mang1Chieu
Cú pháp:
<Kiểu> <Tên> []= {Các giá trị cách nhau bởi dấu phẩy}
Ví dụ: int dayso[]={66,65,69,68,67,70};
0 1 2 3
a 2912 1706 0 0
a 0 0 0 0
0 1 2 3
a 2912 1706 1506 1904
int a[4];
Các truy xuất
• Hợp lệ: a[0], a[1], a[2], a[3]
• Không hợp lệ: a[-1], a[4], a[5], …
=> Cho kết thường không như mong muốn!
Không được sử dụng phép gán thông thường mà phải gán trực
tiếp giữa các phần tử tương ứng
#define MAX 3
typedef int MangSo[MAX];
MangSo a = {1, 2, 3}, b;
b = a; // Sai
for (int i = 0; i < 3; i++) b[i] = a[i];
Biên Soạn: ThS.Lương Hoài Thương
268
&
VC
BB
Một số lỗi thường gặp
Tham số kiểu mảng truyền cho hàm chính là địa chỉ của
phần tử đầu tiên của mảng
• Có thể bỏ số lượng phần tử hoặc sử dụng con trỏ.
• Mảng có thể thay đổi nội dung sau khi thực hiện hàm.
void SapXepTang(int a[]);
void SapXepTang(int *a);
• Viết chương trình cho 8 led đơn sáng dần rồi tắt dần.
• Viết chương trình cho led 7 đoạn đếm từ 0-9 sau đó đếm
ngược lại.
• Viết chương trình cho led ma trận hiển thị chữ A.
1 Khái niệm
2 Khai báo
0 1 2 3
0
Kiểu MaTran 1
2
… Biên Soạn: ThS.Lương Hoài Thương
278
&
VC Khai báo kiểu mảng 2 chiều tường minh
BB
Cú pháp
<kiểu> <tên>[<N1>][<N2>];
N1, N2: số lượng phần tử mỗi chiều
Ví dụ
0 1 2 3
0
Kiểu MaTran 1
Ví dụ 0 1 2 3
0
Cho mảng 2 chiều như sau
1
int a[3][4];
2
Các truy xuất
• Hợp lệ: a[0][0], a[0][1], …, a[2][2], a[2][3]
• Không hợp lệ: a[-1][0], a[2][4], a[3][3]
Không được sử dụng phép gán thông thường mà phải gán trực
tiếp giữa các phần tử
<biến mảng đích> = <biến mảng nguồn>; //sai
<biến mảng đích>[<giá trị cs1>][giá trị cs2] =
<giá trị>;
Ví dụ
int a[5][10], b[5][10];
b = a; // Sai
int i, j;
for (i = 0; i < 5; i++)
for (j = 0; j < 10; j++)
b[i][j] = a[i][j];
Tham số kiểu mảng truyền cho hàm chính là địa chỉ của
phần tử đầu tiên của mảng
• Có thể bỏ số lượng phần tử chiều thứ 2 hoặc con trỏ.
• Mảng có thể thay đổi nội dung sau khi thực hiện hàm.
void NhapMaTran(int a[][100]);
void NhapMaTran(int (*a)[100]);
Viết chương trình con thực hiện các yêu cầu sau
Nhập mảng
Xuất mảng
Tìm kiếm một phần tử trong mảng
Kiểm tra tính chất của mảng
Tính tổng các phần tử trên dòng/cột/toàn ma trận/đường
chéo chính/nửa trên/nửa dưới
Tìm giá trị nhỏ nhất/lớn nhất của mảng
…
* Viết chương trình cho 8 led đơn sáng dần rồi tắt dần.
* Viết chương trình cho led 7 đoạn đếm từ 0-9 sau đó đếm
ngược lại.
Các hàm xử lý kí tự
‘n ‘\0
‘T’ ‘i’ ‘ ‘ ‘h’ ‘o’ ‘c’
‘ ’
288
288
&
VC
BB Khái niệm xâu kí tự: Lưu ý
Xâu kí tự >< mảng kí tự
Tập hợp các kí tự viết liên tiếp nhau
• Truy nhập một phần tử của xâu ký tự (là một ký tự) giống như truy
nhập vào một phần tử của mảng.
Xâu kí tự có kí tự kết thúc xâu, mảng kí tự không có kí tự
kết thúc xâu
290 290
&
VC
BB
Truy cập vào một phần tử của xâu
Tệp tiêu đề :
#include <ctype.h>
293 293
&
VC
BB
Hàm chuyển đổi chữ hoa/chữ thường
int toupper(int ch): chuyển kí tự thường thành
kí tự hoa
toupper(‘a’) => ‘A’
int tolower(int ch): chuyển kí tự hoa thành kí tự
thường
tolower(‘B’) => ‘b’
Ví dụ
do{
……….
printf(“Tiep tuc <C/K>? :”); fflush(stdin);
}while(toupper(getche()) !='K');
294 294
&
VC
BB
Các hàm kiểm tra chữ hoa/chữ thường
295 295
&
VC
BB Các hàm kiểm tra chữ cái/chữ số
int isalpha(int ch):
Kiểm tra xem kí tự trong tham số có phải chữ cái hay
không (‘a’…’z’,’A’,..’Z’). Hàm trả về khác 0 nếu đúng,
ngược lại tả về giá trị bằng 0
• printf("%d ",isalpha('A')); 1
int isdigit(int ch):
Kiểm tra kí tự trong tham số có phải chữ số (‘0‘,‘1‘,..‘9‘)
hay không. Hàm trả về khác 0 nếu đúng, ngược lại tả về
giá trị bằng 0
• printf("%d ",isdigit('A')); 0
296 296
&
VC
BB Các hàm kiểm tra ký tự đặc biệt
int iscntrl(int ch):
Kiểm tra kí tự điều khiển (0-31). Hàm trả về khác
0 nếu đúng, ngược lại tả về giá trị bằng 0
int isspace(int ch):
Kiểm tra kí tự dấu cách (mã 32), xuống dòng
(‘\n’ 10), đầu dòng (‘\r’ 13), tab ngang (‘\t’ 9),
tab dọc (‘\v’ 11). Hàm trả về khác 0 nếu đúng,
ngược lại trả về giá trị bằng 0
297 297
&
VC
BB Ví dụ: Nhập xâu và đếm từ
#include <stdio.h>
#include <ctype.h>
int main(){
char Str[100]; int d=0, i=0;
printf("Nhap xau ky tu: "); gets(Str);
if(Str[0] == '\0') printf(“ Xau rong ");
else{
if( ! isspace(Str[0]) ) d=1;
i=1;
while(Str[i] != '\0'){
if( isspace(Str[i-1] ) && (! isspace(Str[i])) ) d++;
i++;
}
printf("Ket qua : %d",d);
}
} 298 298
&
VC
BB Vào ra xâu kí tự
Tệp tiêu đề: stdio.h / conio.h
Nhập xâu kí tự
gets(tên_xâu);
scanf(“%s”,&tên_xâu);
Hiển thị xâu kí tự
puts(tên_xâu);
printf(“%s”,tên_xâu);
Sự khác nhau giữa gets và scanf?
299 299
&
VC
BB Các hàm xử lý xâu kí tự
300 300
&
VC
BB Các hàm xử lý xâu kí tự
size_t strlen(char[] xâu)
Trả về độ dài xâu
printf("%d ",strlen("Hello world")); 11
char[] strcpy(char[] đích, char[] nguồn)
sao chép xâu, trả về giá trị xâu nguồn
printf("%s ",strcpy(Str,"Hello")); Hello
printf("%s", Str); Hello
int strcmp(char[] xâu_1, char[] xâu_2)
So sánh hai xâu.
Trả về giá trị 0 nếu hai xâu giống nhau;
Giá trị < 0: xâu_1 < xâu_2 /Giá trị >0: xâu_1 > xâu_2
301 301
&
VC
BB Các hàm xử lý xâu kí tự
302 302
&
VC
BB Các hàm xử lý xâu kí tự
Khái niệm con trỏ
Con trỏ là một biến chứa địa chỉ của biến khác
Khai báo Type * tên_biến
Toán tử & dùng để lấy địa chỉ của một biến
Toán tử * dùng tham khảo tới giá trị biến mà con trỏ chỉ
tới
Ví dụ
int N; int * ptr
ptr = & N;
* ptr N (*ptr+=10 N+=10)
303 303
&
VC
BB Các hàm xử lý xâu kí tự
char * strchr (char * s, int c)
Trả về con trỏ trỏ tới vị trí xuất hiện đầu tiên của ký tự c
trong s. Nếu không có trả về con trỏ null
strcpy(Str,"Hello world");
printf("%s ",strchr(Str,‘o')); o world
char* strstr(char * s1, char * s2
Trả về con trỏ trỏ tới vị trí xuất hiện đầu tiên của chuỗi s2
trong s1. Nếu không tồn tại, trả về con trỏ null
printf("%s ",strstr(Str,”llo”)); llo world
304 304
&
VC
BB Các hàm xử lý xâu kí tự (tiếp)
Tệp tiêu đề: stdlib.h
int atoi(char[] str):
Chuyển một xâu kí tự thành một số nguyên tương ứng
int atol(char[] str):
Chuyển thành số long int
float atof(char[] str):
Chuyển thành số thực
Thất bại cả 3 hàm: trả về 0
305 305
&
VC
BB Ví dụ: Đảo ngược xâu ký tự
#include<stdio.h>
#include<conio.h>
#include<string.h>
main(){
char s[100],c;
int i, n;
printf("Nhap xau: ");gets(s);
n =strlen(s);
for(i=0;i <n/2;i++){
c = s[i];
s[i] = s[n-i-1];
s[n-i-1]=c;
}
printf("%s",s);
} 306 306
&
VC
BB Kiểm trả xâu ký tự đối xứng
#include<stdio.h>
#include<conio.h>
#include<string.h>
main(){
char s[20];
int i,n;
printf("Nhap vao xau ki tu: ");gets(s);
n=strlen(s);
for(i=0;i<n/2;i++)
if(s[i]!=s[n-1-i])
break;
if(i==n/2)
printf("Xau doi xung");
else
printf("Xau khong doi xung");
307 307
}
&
VC
BB
Đếm số lần xuất hiện chữ cái trong xâu
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#include<string.h>
main(){
char s[20];
int dem[26];
int i,n;
printf("Nhap vao xau ki tu: ");gets(s);
for(i=0;i<26;i++) dem[i]=0;
n=strlen(s);
for(i=0;i<n;i++)
if(isalpha(s[i]))
dem[ tolower(s[i ]) - 'a‘ ]++;
for(i=0;i<26;i++)
if(dem[i]!=0)
printf("Ki tu %c xuat hien %d lan\n",'a'+i,dem[i]);
} 308 308
&
VC
BB Mảng xâu ký tự
Xâu ký tự có thể là kiểu phần tử của mảng
Khai báo
char DS[100][30];
Mảng có tối đa 100 phần tử, các phần tử là
xâu có độ dài tối đa 30
Sử dụng
Như một mảng bình thường
Mỗi phần tử mảng được sử dụng như một xâu ký tự
309 309
Nhập vào DSSV cho tới khi gặp tên rỗng, in DS
&
VC
BB
#include <stdio.h>
#include <string.h>
void main(){
int i, n;
char DS[100][30];
printf("Nhap DSSV (<100), go Enter de thoat..\n");
n =0;
do{
printf("Ten sinh vien[%d]: ",n+1);
gets(DS[n]);
if(DS[n][0] !='\x0') n++;
else break; if(strcmp(DS[n],""))n++
if(n==100) break; if(strlen(DS[n])>0) n++
}while(1);
printf(" \n\n DS sinh vien vua nhap \n");
for(i=0;i<n;i++) printf("%s\n",DS[i]);
310 310
}
&
VC
BB
311 311
Nhập vào DS sinh viên, in ra DS đã sắp
&
VC
BB
#include <stdio.h>
#include <string.h>
void main(){
int i, j, N;
char DS[100][30], str[30];
//Nhap DS lop
printf("So sinh vien : "); scanf("%d",&N);
fflush(stdin);
for(i=0;i < N;i++){
printf("Ten sinh vien[%d]: ",i);
gets(DS[i]);
}
312 312
Nhập vào DSSV, in ra DS đã sắp (tiếp)
&
VC
BB
315 315
KỸ THUẬT LẬP TRÌNH
316
&
VC
BB
7.1. TỔ CHỨC CHƯƠNG TRÌNH
7.2.6 Một số ví dụ
318
&
VC
BB
7.1.1 MỞ ĐẦU
319
&
VC
BB
7.1.1 MỞ ĐẦU
3 đoạn lệnh nhập a, b, c > 0
do{ printf(“Nhap mot so nguyen duong: ”);
scanf(“%d”,&a);
} while(a<=0);
for(i=1;i<=b;i++)
s2=s2*i;
for(i=1;i<=c;i++)
s3 = s3 * i;
321
&
VC
BB
7.1.1 MỞ ĐẦU
Giải pháp => Viết 1 lần và sử dụng nhiều lần
Đoạn lệnh nhập tổng quát, với n = a, b, c
do{ printf(“Nhap mot so nguyen duong:”);
scanf(“%d”,&n);
} while (n<=0);
Đoạn lệnh tính giai thừa tổng quát, n = a, b, c
for(i=1;i<=n;i++)
s=s*i;
322
&
VC
BB
7.2.2 KHÁI NIỆM
323
&
VC
BB
7.2.2 KHÁI NIỆM
<kiểu> <tên>([<danh sách tham số đầu vào>])
{ <các câu lệnh>
Cú pháp [return <danh sách giá trị đầu ra>;]
}
Trong đó
• <kiểu>: Kiểu bất kỳ của C (char, int, long, float,…). Nếu không
trả về thì là void.
• <tên>: theo quy tắc đặt tên định danh.
• <danh sách tham số đầu vào> : Tham số hình thức đầu vào
giống khai báo biến, cách nhau bằng dấu ,
• < danh sách giá trị đầu ra > : Trả về cho hàm qua lệnh return.
324
&
VC
BB
7.2.3 CÁC BƯỚC XÂY DỰNG HÀM
325
&
VC
BB
7.2.3 CÁC BƯỚC XÂY DỰNG HÀM
326
&
VC
BB
7.2.3 CÁC BƯỚC XÂY DỰNG HÀM
A. Viết hàm xuất tổng 2 số nguyên x và y
Tên hàm: XuatTong
Công việc: tính và xuất tổng 2 số nguyên
Đầu vào: hai số nguyên x và y
Đầu ra: không có
void XuatTong(int x, int y)
{
int s;
s = x + y;
printf(“%d cong %d bang %d”, x, y, s);
}
327
&
VC
BB
7.2.3 CÁC BƯỚC XÂY DỰNG HÀM
B. Viết hàm tính tổng của 2 số nguyên x và y, sau đó trả về tổng 2
số nguyên đó.
Tên hàm: TinhTong
Công việc: tính và trả về tổng 2 số nguyên
Đầu vào: hai số nguyên x và y
Đầu ra: một số nguyên có giá trị x + y
int TinhTong(int x, int y)
{
int s;
s = x + y;
return s;
}
328
&
VC
BB
7.2.3 CÁC BƯỚC XÂY DỰNG HÀM
void NhapXuatTong()
{
int x, y;
printf(“Nhap 2 so nguyen: ”);
scanf(“%d%d”, &x, &y);
printf(“%d cong %d bang %d”, x, y, x + y);
}
329
&
VC
BB
7.2.4 LỜI GỌI HÀM
Cú pháp
<tên> (<đầu vào 1>,… , <đầu vào n>);
Lưu ý: Gọi tên của hàm đồng thời truyền các đối số cho đầu
vào theo đúng thứ tự đã được khai báo trong hàm.
330
&
VC
BB
7.2.4 LỜI GỌI HÀM
Ví dụ 1
void main()
{ int n = 9;
XuatTong(1, 2);
XuatTong(1, n);
TinhTong(1, 2);
int tong = TinhTong(1, 2);
XuatTong(1);
XuatTong(n);
}
331
&
VC
BB
7.2.4 LỜI GỌI HÀM
#include<stdio.h>
int ham(int a, int b)
{ int s=a^b; return s; }
int c;
int main()
{ c=ham(3,3);
printf("Gia tri S: %d ",c);
}
332
&
VC
BB
7.2.5 HÀM ĐỆ QUY
Khái niệm
Một chương trình con có thể
gọi một chương trình con khác.
Nếu gọi chính nó thì được gọi
là sự đệ quy.
Số lần gọi này phải có giới hạn
(điểm dừng)
333
&
VC
BB
7.2.5 HÀM ĐỆ QUY
Ví dụ: Tính tổng n số nguyên được nhập từ bàn phím
#include <stdio.h>
int tong_n(int n) Giả sử n = 4
{ if(n == 0) return 0; 4 + tong_n(3)
return n + tong_n(n-1); } 4 + 3 + tong_n(2)
int main() 4 + 3 + 2 + tong_n(1)
{ int n; 4 + 3 + 2 + 1 + tong_n(0)
printf("\nNhap n = "); 4+3+2+1+0
scanf("%d", &n);
int tong = tong_n(n);
printf("\nTong n so nguyen: = %d", tong);
} 334
&
VC
BB
7.2.6 MỘT SỐ VÍ DỤ
1. Thực hiện 4.11 chương trình nhập vào các giá trị A, B, C,
tính Z được cho bởi (nếu A, B, C nhập vào khác 0 và 1 thì
thông báo nhập lại giá trị) bằng cách sử dụng hàm.
2. Viết chương trình nhập vào n giá trị điện trở, sau đó in ra giá
trị n điện trở vừa nhập, tìm giá trị max và min của các điện
trở vừa nhập vào, bằng cách sử dụng hàm.
335
&
VC
BB
3. Thực hiện lại ví dụ 3.4 tính giá trị điện trở tương đương trong
2 trường hợp song song và nối tiếp. Khi hiển thị kết quả điện trở
tương đương, đồng thời có thêm dòng thông báo y/n. Nếu chọn
y tiếp tục tính giá trị điện trở tương đương, n kết thúc chương
trình.
Sử dụng HÀM
336
&
VC
BB STRUCT – CẤU TRÚC
337 337
&
VC
BB Khái niệm cấu trúc
Một cấu trúc bao gồm các mẫu dữ liệu (không nhất thiết cùng kiểu)
được nhóm lại với nhau.
1 I I L L U S I O N B A C H 1
Biến L
L
U Tên sách Tác giả
Lần
S xuất bản
I
O
N Mảng
338
Khái niệm cấu trúc (tiếp)
&
VC
BB
340 340
&
VC
BB Khai báo biến cấu trúc
Các cấu trúc có thể được khai báo lồng nhau
struct diem_thi {
float dToan, dLy, dHoa;
}
struct thi_sinh{
char SBD[10];
char ho_va_ten[30];
struct diem_thi ket_qua;
} thi_sinh_1, thi_sinh_2;
341 341
&
VC
Định nghĩa kiểu dữ liệu với typedef
BB
342 342
&
VC
BB Xử lý dữ liệu cấu trúc
343 343
&
VC
BB Truy cập các trường dữ liệu
Cú pháp
tên_biến_cấu_trúc.tên_trường
Lưu ý
Dấu “.” là toán tử truy cập vào trường dữ liệu trong
cấu trúc
Nếu trường dữ liệu là một cấu trúc => sử dụng tiếp
dấu “.” để truy cập vào thành phần mức sâu hơn
344 344
&
VC
BB Ví dụ
#include <stdio.h>
void main(){
struct{
char Ten[20];
struct Date{
int day;
int month;
int year;
} NS;
} SV = {"Tran Anh", 20,12, 1990 };
346 346
VC
&
BB
Một số ví dụ
347
&
VC
BB Một số ví dụ
1. Lập trình đọc vào một danh sách không quá 100
sinh viên gồm: Họ tên, năm sinh
1. Đưa ra DS những sinh viên sinh năm 1990
2. Đưa ra DSSV đã sắp xếp theo thứ tự ABC
2. Lập trình đọc vào DS thí sinh gồm Họ tên, điểm
thi 3 môn Toán, Lý,Hóa, kết thúc nhập khi gặp
sinh viên có tên rỗng
1. Đọc tiếp vào một điểm chuẩn; đưa ra danh sách thí sinh
trúng tuyển (không có điểm liệt - 0)
2. Đưa ra thí sinh cao điểm nhất
3. Tìm điểm chuẩn, nếu chỉ lấy K SV, K nhập vào. Nếu có nhiều
người bằng điểm nhau; loại cả
348 348
&
VC
BB
TỆP TIN
KHÁI NIỆM
PHÂN LOẠI
SỬ DỤNG BIẾN TỆP TIN
THAO TÁC TRÊN TỆP TIN
349
Khái niệm
&
VC
BB
Các biến: int, char, struct,.. được lưu trong RAM nên khi kết
thúc chương trình thì dữ liệu cũng bị mất.
Kiểu tệp tin (file) cho phép lưu trữ dữ liệu ở bộ nhớ ngoài. Khi
kết thúc chương trình thì dữ liệu vẫn còn.
Kiểu tệp tin có kích thước và các phần tử không hạn chế, chỉ
phụ thuộc vào dung lượng của bộ nhớ ngoài.
350
Phân loại tệp tin
&
VC
BB
Tệp tin định kiểu (Typed File): gồm nhiều phần tử có cùng
kiểu: char, int, long, cấu trúc… và được lưu trữ trên đĩa dưới
dạng một chuỗi các byte liên tục.
Tệp tin không định kiểu (Untyped File): gồm các cấu trúc dữ
liệu mà không quan tâm đến nội dung hoặc kiểu của nó, chỉ
lưu ý đến các yếu tố vật lý của tệp tin như độ lớn và các yếu
tố tác động lên tệp tin.
351
&
VC
BB
Sử dụng biến loại tệp tin
Biến tệp tin: Dữ liệu chứa trong một tệp tin được truy xuất qua
các thao tác với thông số là biến tệp tin đại diện cho tệp tin đó.
Con trỏ tệp tin: Khi một tệp tin được mở ra để làm việc, tại mỗi
thời điểm, sẽ có một vị trí của tệp tin mà tại đó việc đọc/ghi
thông tin sẽ xảy ra.
352
&
VC
BB
Thao tác trên tệp tin
353
Mode
&
VC
BB
Chế độ Ý nghĩa
r Mở tệp tin văn bản để đọc
w Tạo ra tệp tin văn bản mới để ghi
a Nối vào tệp tin văn bản
rb Mở tệp tin nhị phân để đọc
wb Tạo ra tệp tin nhị phân để ghi
ab Nối vào tệp tin nhị phân
r+ Mở một tệp tin văn bản để đọc/ghi
w+ Tạo ra tệp tin văn bản để đọc ghi
a+ Nối vào hay tạo mới tệp tin văn bản để đọc/ghi
r+b Mở ra tệp tin nhị phân để đọc/ghi
w+b Tạo ra tệp tin nhị phân để đọc/ghi
a+b Nối vào hay tạo mới tệp tin nhị phân 354
&
VC
BB
Thao tác trên tệp tin
355
Ghi dữ liệu vào tệp văn bản
&
VC
BB
Hàm putc()
• Dùng để ghi một ký tự lên một tệp tin.
• Cú pháp: putc(“nội dung ký tự cần ghi”, tên biến tệp tin)
Hàm fputs()
• Dùng để ghi một chuỗi ký tự lên tệp tin.
• Cú pháp: int puts((“nội dung chuỗi ký tự cần ghi”, tên biến
tệp tin)
356
&
VC
BB
Ghi dữ liệu vào tệp văn bản
Hàm fprintf()
• Dùng để ghi dữ liệu có định dạng lên tệp tin.
• Cú pháp: fprintf (tên biến tiệp tin, chuỗi định dạng)
format: chuỗi định dạng giống dạng của hàm printf()
%s, %d,…..
357
&
VC
BB
Đọc dữ liệu từ tệp văn bản
Hàm getc()
Dùng để đọc dữ liệu từ tệp tin, trả về mã Ascii của một ký tự
nào đó.
Cú pháp: getc(tên biến tiệp tin)
Hàm fgets()
Dùng để đọc một chuỗi ký tự từ tệp tin cho đến khi đọc đủ n
ký tự hoặc gặp ký tự xuống dòng ‘\n’
Cú pháp: fgets(char *buffer, int n, FILE *f)
358
Đọc dữ liệu từ tệp văn bản
&
VC
BB
Hàm fscanf()
Dùng để đọc dữ liệu từ tệp tin vào danh sách các biến theo định dạng.
Cú pháp:
fscanf(tên biến tệp tin, chuỗi định dạng)
chuỗi định dạng giống hàm scanf().
359
&
VC
BB
362
&
VC
BB Bài tập
Viết chương trình quản lý một tệp tin quản lý thiết bị theo các yêu cầu:
A. Nhập từ bàn phím nội dung tên TB, nước SX, Phòng quản lý, Thời gian
bảo hành.
B. Hiển thị danh sach thiết bị vừa nhập.
C. Lưu danh sách vừa nhập vào ổ cứng.
D. Hiển thị danh sách được đọc từ ổ cứng.
E. Tìm kiếm và in ra các thiết bị trong cùng phòng.
F. Tìm kiếm và in ra các thiết bị có cùng nhà sản xuất.
G. Tìm kiếm và in ra các thiết bị còn 10 ngày bảo hành.
……
363