Professional Documents
Culture Documents
THDC 3
THDC 3
1
Chương 1: Tổng quan về ngôn ngữ C
Nội dung chính
26/09/2019 3
Sự ra đời của C
• Nhu cầu viết lại HĐH Unix cho các hệ máy
tính khác nhau
– Dùng Assembly
• Công việc nặng nề, phức tạp
• Khó chuyển đổi chương trình giữa các hệ máy tính
khác nhau
– Cần ngôn ngữ mới
• Đơn giản việc lập trình
• Tính khả chuyển cao
• C ra đời tại Bell Lab thuộc tập đoàn AT&T
– Tác giả Brian W. Kernighan & Dennis Ritchie
– Dựa trên nền BCPL& B
– Phát triển năm 1970, hoàn thành 1972
26/09/2019 4
2
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.1 Lịch sử phát triển của ngôn ngữ C
3
Chương 1: Tổng quan về ngôn ngữ C
Nội dung chính
26/09/2019 7
4
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C
1. Tập ký tự
Ký tự là các phần tử cơ bản tạo nên chương
trình
• Chương trình: Tập các câu lệnh nhằm
giải quyết nhiệm vụ đặt ra
• Câu lệnh: là các từ (từ vựng) liên kết với
nhau theo cú pháp của ngôn ngữ lập trình
– Ví dụ: while (i < N ) do
• Các từ: Tổ hợp các ký tự theo nguyên tắc
xây dựng từ vựng
– Ví dụ: TenFile, BaiTap2…
26/09/2019 9
26/09/2019 10
10
5
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C
2. Từ khóa (keyword)
26/09/2019 11
11
26/09/2019 12
12
6
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C
13
14
7
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C
3. Định danh→Ví dụ
• Định danh hợp lệ:
i, x, y, a, b, _function,
_MY_CONSTANT, PI, gia_tri_1
• Định danh không hợp lệ
1_a, 3d, 55x (bắt đầu bằng chữ số)
so luong, sin() (có kí tự không hợp lệ, dấu
cách, dấu ngoặc..)
int, char (trùng với từ khóa của C)
26/09/2019 15
15
16
8
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C
26/09/2019 17
17
18
9
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C
5. Hằng
• Hằng (constant) là đại lượng có giá trị
không đổi trong chương trình.
• Giá trị hằng do người lập trình xác định
• Các loại hằng
– Hằng số nguyên
– Hằng số thực
– Hằng ký tự
– Hằng chuỗi/xâu kỹ tự
26/09/2019 19
19
20
10
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C
26/09/2019 21
21
5. Hằng → Hằng ký tự
• Hằng ký tự có thể biểu diễn theo hai cách
– Đặt ký hiệu của ký tự giữa hai dấu nháy đơn
– Dùng mã ASCII của ký tự:
• Số thứ tự của ký tự đó trong bảng mã ASCII
• Là số nguyên→tuân thủ quy tắc biểu diễn số nguyên
22
11
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C
26/09/2019 23
23
6. Biến (variable)
• Biến là đại lượng mà giá trị có thể thay đổi
trong chương trình.
• Tên biến phải được đặt theo quy tắc đặt tên
– Về thực chất, biến là các ô nhớ trong bộ nhớ
máy tính dành cho 1 kiểu dữ liệu nào đó và
được đặt tên để tiện tham khảo
• Ví dụ: Biến kiểu int chiếm 2 ô nhớ
• Lưu ý:
– Hằng số và biến được sử dụng để lưu trữ dữ
liệu trong chương trình và phải thuộc một kiểu
dữ liệu nào đó
26/09/2019 24
24
12
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C
7. Hàm (function)
• Hàm là chương trình con có chức năng
– Nhận dữ liệu đầu vào (các tham số vào)
– Thực hiện một công việc nào đó
– Trả về kết quả ứng với tham số truyền vào
• Ví dụ: hàm sin(x)
– sin(3.14/2) →1.000
– sin(3.14/6) →0.499770
25
26
13
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C
8. Biểu thức
• Biểu thức là sự kết hợp các các toán hạng
(operand) bởi các toán tử (operator) theo
một quy tắc xác định.
• Các toán hạng có thể là biến, hằng, hàm…
• Các toán tử rất đa dạng: cộng, trừ, nhân,
chia
Ví dụ
– Thể tích hình hộp: V=Rộng*Cao*Dày
• Phép nhân (*) là toán tử
Cao
• Các toán hạng Rộng, Cao, Dày
Rộng
26/09/2019 27
27
26/09/2019 28
28
14
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C
26/09/2019 29
29
30
15
Chương 1: Tổng quan về ngôn ngữ C
Nội dung chính
26/09/2019 31
31
}
Định nghĩa các hàm đã khai báo nguyên mẫu
26/09/2019 32
32
16
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.3 Cấu trúc cơ bản của chương trình C
33
26/09/2019 34
34
17
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.3 Cấu trúc cơ bản của chương trình C
35
36
18
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.3 Cấu trúc cơ bản của chương trình C
37
38
19
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.3 Cấu trúc cơ bản của chương trình C
Chú ý
26/09/2019 39
39
40
20
Chương 1: Tổng quan về ngôn ngữ C
Nội dung chính
26/09/2019 41
41
42
21
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.4 Biên dịch chương trình C
43
26/09/2019 44
44
22
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.4 Biên dịch chương trình C
26/09/2019 45
45
26/09/2019 46
46
23
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.4 Biên dịch chương trình C
26/09/2019 47
47
48
24
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.4 Biên dịch chương trình C
49
26/09/2019 50
50
25
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.4 Biên dịch chương trình C
51
26/09/2019 52
52
26
Chương 1: Tổng quan về ngôn ngữ C
Tóm tắt
26/09/2019 53
53
54
27
Chương 2: Kiểu dữ liệu và biểu thức trong C
Nội dung chính
26/09/2019 55
55
56
28
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.1 Các kiểu dữ liệu chuẩn trong C
57
58
29
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.1 Các kiểu dữ liệu chuẩn trong C
59
60
30
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.1 Các kiểu dữ liệu chuẩn trong C
26/09/2019 61
61
26/09/2019 62
62
31
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.1 Các kiểu dữ liệu chuẩn trong C
Chú ý:
• Giá trị của các hằng phải được xác định ngay
khi khai báo.
• Trong chương trình, KHÔNG thể thay đổi
được giá trị của hằng.
• #define là chỉ thị tiền xử lý
– Dễ đọc, dễ thay đổi
– Dễ chuyển đổi giữa các nền tảng phần cứng hơn
– Tốc độ nhanh hơn
26/09/2019 63
63
26/09/2019 64
64
32
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.2 Biểu thức trong C
65
66
33
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.2 Biểu thức trong C
26/09/2019 67
67
68
34
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.2 Biểu thức trong C
26/09/2019 69
69
70
35
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.2 Biểu thức trong C
5 * (12 > 6) →?
26/09/2019 71
71
26/09/2019 72
72
36
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.3 Các toán tử trong C
73
74
37
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.3 Các toán tử trong C
26/09/2019
5 * (12 > 6) → 5 75
75
76
38
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.3 Các toán tử trong C
77
78
39
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.3 Các toán tử trong C
79
80
40
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.3 Các toán tử trong C
Toán tử gán
Biến = Biểu_thức;
• Ký tự “=“ là toán tử gán
– Biểu thức bên phải dấu bằng tược tính toán
– Giá trị của biểu_thức được gán cho biến
• Ví dụ:
int a, b, c;
a = 3;
b = a + 5;
c = a * b;
26/09/2019 81
81
Toán tử gán
• Biểu thức gán là biểu thức nên cũng có giá trị.
– Giá trị của biểu thức gán bằng giá trị của
biểu_thức bên phải toán tử
– Có thể gán giá trị của biểu thức gán cho một
biến khác
– Có thể sử dụng như một biểu thức bình thường
• Ví dụ:
int a, b, c;
a = b = 2007;
c = (a = 20) * (b = 30);// c→600
26/09/2019 82
82
41
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.3 Các toán tử trong C
83
26/09/2019 84
84
42
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.4 Một số toán tử đặc trưng
Các toán tử
• Toán tử phẩy
26/09/2019 85
85
86
43
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.4 Một số toán tử đặc trưng
Ví dụ: .
.
.
int a = 2006;
&a → Địa chỉ của ô nhớ dùng
Kiểu địa chỉ?
26/09/2019
chứa giá trị biến a 87
87
88
44
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.4 Một số toán tử đặc trưng
Toán tử phẩy
biểu_thức_1, biểu thức_2,..
• Toán tử phẩy ( , ) cho phép sử dụng nhiều biểu
thức tại nơi chỉ cho phép viết một biểu thức
• Các biểu thức được tính toán từ trái qua phải
• Giá trị và kiểu của biểu thức là giá trị và kiểu của
biểu thức cuối cùng, bên phải
Ví dụ:
if (i = 0, a !=b)…
for(i = 0, j = 0; i < 100; i++, j++)….
26/09/2019 89
89
Chuyển kiểu
(Kiểu) biểu thức
• Chuyển kiểu tự động
– Chương trình dịch tự động chuyển đổi từ kiểu có
phạm vi biểu diễn thấp tới kiểu có phạm vi biểu
diễn cao
char → int → long int → float →
double → long double
• Ép kiểu
– Bằng câu lệnh tường minh trong chương trình
– Được sử dụng khi muốn chuyển sang kiểu có
phạm vi biểu diễn thấp hơn
26/09/2019 90
90
45
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.4 Một số toán tử đặc trưng
Chuyển kiểu→Ví dụ
#include <stdio.h>
#include <conio.h>
void main(){
long L = 0xABCDEF; float f = 123.456;
int i; L = 11259375; i = -12817(CDEF)
clrscr(); f = 123.456001; L = 123; i = 123
i = (int) L;
printf(“\n L = %ld; i = %d(%X)”, L, i, i);
i = (int) f; L = (long) f;
printf(“\n f = %f; L = %ld; i = %d”, f, L, i);
}
26/09/2019 91
91
3 * / %
4 + - Toán tử số học lớp cộng →
5 >> << Dịch bit →
6 < <= > >= Toán tử quan hệ →
7 == != Bằng, khác →
8 & AND nhị phân →
9 ^ XOR nhị phân →
10 | OR nhị phân →
11 && AND logic →
12 || OR logic →
13 ?: Toán tử phỏng điều kiện
14 = *= += <<= &= ... Toán tử gán
26/09/2019 92
92
46
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.4 Một số toán tử đặc trưng
93
S= ? b = ?
int k ,num=30;
k =num>5 ? (num <=10 ? 100 : 200): 500;
k=?
26/09/2019 94
94
47
Chương 2: Kiểu dữ liệu và biểu thức trong C
Ví dụ
const int N=10; int a= 3, b=4, c;
float S= 0.0; c = a++ * ++b;
int b;
S = N/3 +1;
a=4 b= 5 c=15
b=(S>4);
S= 4 b = 0
int k ,num=30;
k =num>5 ? (num <=10 ? 100 : 200): 500;
k=200
26/09/2019 95
95
96
48
Phần 3: Lập trình C
Nội dung chính
• Chương 1: Tổng quan về ngôn ngữ C
• Chương 2: Kiểu dữ liệu và biểu thức trong C
• Chương 3: Vào ra dữ liệu
• Chương 4: Cấu trúc điều khiển
• Chương 5: Mảng, con trỏ và xâu ký tự
• Chương 6: Cấu trúc
• Chương 7: Hàm
• Chương 8: Tệp dữ liệu
26/09/2019 97
97
98
49
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản
26/09/2019 99
99
printf()
26/09/2019 100
100
50
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → printf()
Mục đích
26/09/2019 101
101
Cú pháp
printf(xau_dinh_dang [, DS_tham_so]);
• Xau_dinh_dang: Là một xâu qui định cách thức
hiển thị dữ liệu ra màn hình máy tính.
– Bao gồm các nhóm kí tự định dạng
– Nhóm kí tự định dạng thứ k xác định quy cách
hiển thị tham số thứ k trong DS_tham_số
• Số lượng tham số trong DS_tham_số bằng số lượng
nhóm các kí tự định dạng trong xâu_định_dạng.
• DS_tham_so: Danh sách các biến/biểu thức sẽ
được hiển thị giá trị lên màn hình theo cách thức
được qui định trong xau_dinh_dang.
26/09/2019 102
102
51
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → printf()
Ví dụ
#include <stdio.h>
void main()
{ int a = 5;
float x = 1.234;
printf(” Hien thi mot bieu thuc nguyen %d và
mot so thuc %f ”,2 * a, x);
}
Kết quả:
Hien thi mot bieu thuc nguyen 10 va mot so thuc 1.234000
26/09/2019 103
103
26/09/2019 104
104
52
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → printf()
26/09/2019
C-Free →1374389535 !? 105
105
26/09/2019 106
106
53
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → printf()
Nhận xét:
Với kiểu long, thêm ký tự l ngay sau dấu %
26/09/2019 107
107
26/09/2019 108
108
54
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → printf()
• Có dạng “%m”,
– m là một giá trị nguyên, không âm.
– m cho biết số chỗ trống dành cho hiển thị
biểu thức tương ứng
Ví dụ:
int a = 1234;
printf(“%5d”,a) → 1234
printf(“%5d”,34)→ 34
ký hiệu cho dấu trắng (space)
26/09/2019 109
109
1 nguyen van a g
2 tran van b k
26/09/2019 110
110
55
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → printf()
111
112
56
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → printf()
%-
• Khi hiển thị dữ liệu có sử dụng tham số độ
rộng, để căn lề trái cần thêm dấu trừ - vào
ngay sau dấu %:
– Ngầm định, căn lề phải
Ví dụ:
printf("%-3d%-10s%-5.2f%-3c",5,"Hello",7.5, 'g')
→5Hello7.50g
26/09/2019 113
113
scanf()
26/09/2019 114
114
57
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → scanf()
Mục đích
Dùng để nhập dữ liệu từ bàn phím
• Ký tự đơn lẻ
• Chuỗi ký tự
• Số nguyên
– Thập phân, Bát phân, Hexa
• Số thực
– Dấu phẩy tĩnh; Dấu phẩy động
Cú pháp
scanf(xau_dinh_dang[,DS_dia_chi]);
26/09/2019 115
115
Cú pháp
scanf(xau_dinh_dang [, DS_dia_chi]);
Xau_dinh_dang:
• Gồm các ký tự được qui định cho từng loại
dữ liệu được nhập vào.
– Ví dụ: dữ liệu định nhập kiểu nguyên thì xâu
định dạng là : %d
DS_dia_chi:
• Bao gồm địa chỉ của các biến (toán tử &),
phân tách nhau bởi dấu phẩy (,)
• Phải phù hợp với các kí tự định dạng trong
xau_dinh_dang về số lượng, kiểu, thứ tự
26/09/2019 116
116
58
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → scanf()
Hoạt động
• Đọc các ký tự được gõ vào từ bàn phím
• Căn cứ vào xâu định dạng, chuyển thông
tin đã nhập sang kiểu dữ liệu phù hợp
• Gán những giá trị vừa nhập vào các biến
tương ứng trong DS_dia_chi
Ví dụ:
int a;
scanf(“%d”,&a); →1234_ → a = 1234
26/09/2019 117
117
Ghi chú
Thông tin được gõ vào từ bàn phím, được lưu
ở vùng đệm trước khi được xử lý bởi hàm
scanf()→Hàm scanf() đọc từ vùng đệm
#include <stdio.h>
int main(){
int a, b;
scanf("%d",&a);
scanf("%d",&b);
printf ("%d %d", a, b);
return 0;
}
26/09/2019 118
118
59
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → scanf()
26/09/2019 119
119
26/09/2019 120
120
60
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → scanf()
Ví dụ
#include <conio.h>
#include <stdio.h>
void main(){
// khai bao bien
int a; float x;
char ch; char str[30];
// Nhap du lieu
printf(“Nhap vao mot so nguyen:”); scanf(“%d”,&a);
printf(“\nNhap vao mot so thuc:”); scanf(“%f”,&x);
printf(“\n Nhap vao mot ki tu:”);
fflush(stdin); scanf(“%c”,&ch);
26/09/2019 121
121
Ví dụ
printf(“\nNhap vao mot xau ki tu:”);
fflush(stdin); scanf(“%s”,str);
26/09/2019 122
122
61
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → scanf()
26/09/2019 123
123
26/09/2019 124
124
62
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → scanf()
125
126
63
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → scanf()
26/09/2019 127
127
Bài tập
1. Viết chương trình nhập vào từ bàn phím chiều
dài 3 cạnh của một tam giác, rồi đưa ra diện
tích và các đường cao của tam giác
2. Nhập vào từ bàn phím tọa độ 3 điểm A,B,C rồi
đưa ra độ dài các cạnh của tam giác ABC và
của đường trung tuyến AM
3. Cho hàm số: f ( x) = x 7 + 53 x 5 + 3 x 3 + 2 + 12
Viết chương trình nhập vào 3 số thực a,b,c và đưa ra
trung bình cộng của f(a),f(b),f(c)
4. Nhập x vào từ bàn phím và tính giá trị của biểu
thức A = cos 3a + 5 2 x3 + x + 1 trong đó a = 2 x + và b = ln( e x+1.23 + 1)
2
log 7 (3x + 2.14b)
26/09/2019 128
128
64
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → scanf()
129
26/09/2019 130
130
65
Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → scanf()
131
132
66
Chương 3: Vào/Ra dữ liệu
3.2 Các hàm vào ra khác
gets()
• Mục đích:
– Dùng để nhập vào từ bàn phím một xâu
kí tự bao gồm cả dấu cách, điều mà
hàm scanf() không làm được.
• Cú pháp :
gets (xâu_kí_tự);
• Ví dụ:
char str [40];
printf(“Nhap vao mot xau ki tu:”);
fflush(stdin);
gets(str);
26/09/2019 133
133
puts()
• Mục đích:
– Hiển thị ra màn hình nội dung xâu_kí_tự
và sau đó đưa con trỏ xuống dòng mới
• Cú pháp:
puts(xâu_kí_tự);
• Ví dụ:
puts(“Nhap vao xau ki tu:”);
Tương đương với lệnh:
printf(“%s\n”,“Nhap vao xau ki tu:“).
26/09/2019 134
134
67
Chương 3: Vào/Ra dữ liệu
3.2 Các hàm vào ra khác
getch()
• Mục đích
– Đợi đọc một ký tự bàn phím
– Thường dùng để chờ người sử dụng
ấn một phím bất kì trước khi kết thúc
chương trình.
• Cú pháp
getch();
26/09/2019 135
135
Ví dụ
#include <conio.h>
#include <stdio.h>
void main(){
char ten[30], lop[10]; //Kieu chuoi, mang ky tu
puts("Hay cho biet ten ban : ");
fflush(stdin); gets(ten);
puts("Hay cho biet lop ban hoc : ");
fflush(stdin); gets(lop);
136
68
Chương 3: Vào/Ra dữ liệu
3.2 Các hàm vào ra khác
26/09/2019 137
137
138
69
Phần 3: Lập trình C
Nội dung chính
• Chương 1: Tổng quan về ngôn ngữ C
• Chương 2: Kiểu dữ liệu và biểu thức trong C
• Chương 3: Vào ra dữ liệu
• Chương 4: Cấu trúc điều khiển
• Chương 5: Mảng, con trỏ và xâu ký tự
• Chương 6: Cấu trúc
• Chương 7: Hàm
• Chương 8: Tệp dữ liệu
26/09/2019 139
139
140
70
Chương 4: Cấu trúc điều khiển
4.1 Cấu trúc lệnh khối
141
26/09/2019 142
142
71
Chương 4: Cấu trúc điều khiển
4.1 Cấu trúc lệnh khối
Ví dụ
#include <conio.h>
#include <stdio.h>
void main(){ // ham main() cung la mot khoi lenh
int c = 10, d= 20;
printf(“ Bien ngoai khoi c = %d; d=%d ”,c,d);
{ int c = 10;
printf(“\n Bien trong khoi c = %d; d=%d”,c,d);
printf(“\n Gia tri cua cac bien duoc them 10 don vi”);
c = c + 10; d= d + 10;
printf(“\n Bien trong khoi c = %d; d=%d”,c,d);
}
printf(“\n Bien ra ngoai khoi c = %d; d=%d”,c,d);
getch();
}26/09/2019
// ket thuc khoi lenh cua ham main() 143
143
144
72
Chương 4: Cấu trúc điều khiển
Nội dung chính
1. Cấu trúc lệnh khối
2. Cấu trúc rẽ nhánh
– Cấu trúc if, if … else
– Cấu trúc lựa chọn switch
3. Cấu trúc lặp
– Vòng lặp for
– Vòng lặp while và do while
4. Các lệnh thay đổi cấu trúc lập trình
– Câu lệnh continue
– Câu lệnh break
26/09/2019 145
145
Cấu trúc if …
Đúng Sai
Biểu thức điều kiện
Câu lệnh
146
73
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
147
Lưu ý
Biểu thức điều kiện:
• Là biểu thức trả về giá trị logic đúng/sai
• Giá trị logic đúng/True : khác 0
• Giá trị logic sai/False: bằng 0
Ví dụ
if (2+5) printf(“Hello world! ”);→Chấp nhận
Câu lệnh:
Có thể là một lệnh khối ( Đặt trong cặp { } )
26/09/2019 148
148
74
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
149
if(a < b)
max = b;
max = a > b ? a : b;
else
max = a;
26/09/2019 150
150
75
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
151
26/09/2019 152
152
76
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
153
if (đ/k_1) if (đ/k_1)
if (đ/k_2) { if (đ/k_2)
lệnh_1; lệnh_1;
else }
lệnh_2; else
lệnh_2;
26/09/2019 154
154
77
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
if (a==0) a ≠ 0, b=? → c = 10
if (b == 0)
c = 20; a=0, b=0 →c = 20
else
c = 30; a=0, b ≠ 0 →c = 30
if (a==0){ a ≠ 0, b=? → c = 30
if (b == 0)
c = 20; a=0, b=0 →c = 20
}else
c = 30; a=0, b ≠ 0 → c = 10
26/09/2019 155
155
156
78
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
Tính g/trị
Biểu thức
Câu_lệnh_tiếp
26/09/2019 157
157
26/09/2019 158
158
79
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
26/09/2019 159
159
26/09/2019 160
160
80
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
26/09/2019 161
161
162
81
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
26/09/2019 163
163
26/09/2019 164
164
82
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
165
26/09/2019 166
166
83
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
167
168
84
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
26/09/2019 169
169
170
85
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
Các ví dụ
1. Viết chương trình tính cước Taxi theo công
thức:
• 1 km đầu tiên có cước là 10000đ,
• 30 km tiếp theo có giá là 8000đ/1km
• Các km sau đó có giá là 6000đ/1km.
2. Viết chương trình giải phương trình bậc hai
ax2 + bx + c = 0
3. Viết chương trình giải hệ phương trình bậc
nhất a1 x + b1 y = c1
a2 x + b2 y = c2
26/09/2019 171
171
172
86
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
173
174
87
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
26/09/2019 175
175
176
88
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
26/09/2019 177
177
Bài tập
1. Viết chương trình nhập vào một ký tự hệ hexa và
đưa ra giá trị hệ 10 tương ứng
2. Lập trình đọc tọa độ 4 điểm A,B,C,M rồi kiểm tra
xem điểm M nằm trong, nằm trên cạnh hay nằm
ngoài tam giác ABC.
3. Lập trình đọc vào từ bàn phím 2 giá trị a, b rồi
tính y = 15 x2+x+7.2 trong đó
a +b
3 nê' u a b
x = 1.5172 nê' u a = b
a −b
2 nê' u a b
a + b 2
26/09/2019 178
178
89
Chương 4: Cấu trúc điều khiển
Nội dung chính
1. Cấu trúc lệnh khối
2. Cấu trúc rẽ nhánh
– Cấu trúc if, if … else
– Cấu trúc lựa chọn switch
3. Cấu trúc lặp
– Vòng lặp for
– Vòng lặp while và do while
4. Các lệnh thay đổi cấu trúc lập trình
– Câu lệnh continue
– Câu lệnh break
26/09/2019 179
179
26/09/2019 180
180
90
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
for
26/09/2019 181
181
• b.thuc_1: Khởi tạo giá trị ban đầu cho vòng lặp
• b.thuc_2: Điều kiện tiếp tục vòng lặp
• b.thuc_3: Thay đổi biến điều khiển của vòng lặp
• Lệnh: Có thể là lệnh đơn lệnh kép hoặc lệnh rỗng
26/09/2019 182
182
91
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
Sơ đồ cú pháp
26/09/2019 183
183
Sử dụng
int i;
for(i = 0; i < 100; i++) Câu_lệnh;
int i;
for(i = 0; i < 100; i+=2)Câu_lệnh;
int i;
for(i = 100; i > 0; i--) Câu_lệnh;
184
92
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
185
186
93
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
Ví dụ 3→ Nhập n và đưa ra n!
#include <stdio.h>
#include <conio.h>
void main()
{
long P = 1;
int n, i;
printf(“Nhap n : “);scanf(“%d”,&n);
for(i = 1;i<=n;i++)
P = P * i;
printf(“Ket qua là %ld “,P);
getch();
} Nhap n : 6
Ket qua là 720
26/09/2019 187
187
188
94
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
189
190
95
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
Chú ý
Không nhất thiết phải có đầy đủ các
thành phần trong vòng lặp for
191
Chú ý
1. Biểu thức khởi tạo
Hello world
char c; int i=0;
Hello world
for( ; (c=getchar())! = '\n’ ; i++) So ky tu: 11
putchar(c);
printf(“\nSo ky tu: %d”,i);
2. Biểu thức điều khiển
for(i=0 ; ; c=getchar(), i++) Hello world
if(c==‘\n’) break;
So ky tu: 12
printf(“\nSo ky tu: %d”,i);
3. Thân vòng lặp
for(i=0 ; getchar() != ‘\n’, i++); Hello world
printf(“\nSo ky tu: %d”,i); So ky tu: 11
26/09/2019 192
192
96
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
while
26/09/2019 193
193
97
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
Sơ đồ cú pháp
Lệnh
Biểu thức != 0
Đúng
Sai
26/09/2019 195
195
26/09/2019 196
196
98
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main() n = 10
{ while (3*pow(n,5)-317*n >= 5)
clrscr(); n--;
int n=0;
while (3* pow(n,5) - 317*n < 5) n++;
printf("%4d",n-1);
getch();
} n= 3
26/09/2019 197
197
198
99
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
199
do..while
26/09/2019 200
200
100
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
201
Sơ đồ cú pháp
Lệnh
Đúng
Biểu thức != 0
Sai
26/09/2019 202
202
101
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
203
Ví dụ
204
102
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
205
26/09/2019 206
206
103
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
207
208
104
26/09/2019 209
209
210
105
26/09/2019 211
211
Ví dụ
Viết chương trình thực hiện công việc
- Nhập vào từ bàn phím 2 số nguyên
- Nhập vào từ bàn phím một ký tự bất kỳ;
▪ Nếu đây là một toán tử số học thì đưa ra
giá trị tương ứng với toán tử.
▪ Nếu không phải thì đưa ra thông báo sai
- Chương trình thực hiện cho tới khi ký tự
nhập vào là ‘q’ hoặc ‘Q’
26/09/2019 212
212
106
#include <stdio.h>
#include <conio.h>
void main() {
int a, b;
char ch;
int Fin = 0;
clrscr();
printf("Nhap cac so a, b "); scanf("%d%d",&a,&b);
do{
printf("\nToan tu (+ ; - ; * ; / ; %) "); ch=getche();
switch(ch){
case '+': printf(" Co ket qua: %d\n",a+b); break;
case '-': printf(" Co ket qua: %d\n",a-b); break;
case '*': printf(" Co ket qua: %d\n",a*b); break;
26/09/2019 213
213
214
107
26/09/2019 215
215
216
108
Nhập chuỗi ký tự cho đến khi gặp ký tự ’*’
Tính tần suất xuất hiện nguyên âm ‘a’
1. #include <stdio.h>
2. #include <conio.h>
3. #include <ctype.h>
4. void main(){
5. char c; int n, d;
6. do{
7. printf("\n\n");
8. d=0; n=0;
9. while( (c=getche()) !='*'){
10. n++;
11. if (c=='a') d++;
12. }
13. if(n==0)
14. printf("\nChuoi ky tu rong\n");
15. else
16. printf("\ntan suat xuat hien ky tu 'a' la %5.2f%%\n",(float)100*d/n);
17. printf("Tiep tuc <C/K>?: ");
18. }while(toupper(getche()) != 'K');
19. }
26/09/2019 217
217
218
109
Chương 4: Cấu trúc điều khiển
Nội dung chính
1. Cấu trúc lệnh khối
2. Cấu trúc rẽ nhánh
– Cấu trúc if, if … else
– Cấu trúc lựa chọn switch
3. Cấu trúc lặp
– Vòng lặp for
– Vòng lặp while và do while
4. Các lệnh thay đổi cấu trúc lập trình
– Câu lệnh continue
– Câu lệnh break
26/09/2019 219
219
Mục đích
• Các vòng lặp while/ do ... while/ for sẽ kết
thúc quá trình lặp khi biểu thức điều kiện
của vòng lặp không còn được thỏa mãn.
• Tuy nhiên trong lập trình đôi khi ta cũng cần
thoát khỏi vòng lặp ngay cả khi biểu thức
điều kiện của vòng lặp vẫn còn được thỏa
mãn.
• Để hỗ trợ người lập trình làm việc đó, ngôn
ngữ C cung cấp 2 câu lệnh là continue và
break
26/09/2019 220
220
110
Chương 4: Cấu trúc điều khiển
Continue >< break
26/09/2019 221
221
continue
26/09/2019 222
222
111
Chương 4: Cấu trúc điều khiển
4.4 Các lệnh thay đổi cấu trúc lập trình
Ví dụ 1
#include <stdio.h>
#include <conio.h>
void main()
Tính tổng 100 số nguyên đầu tiên
{ ngoại trừ các số chia hết cho 5
int i;
int sum = 0;
for(i = 1;i<=100;i++)
{
if(i % 5 == 0) for(i=1;i<=100;i++)
continue; if (i % 5 != 0)
sum += i; sum += i;
}
}
26/09/2019 223
223
break
Thoát khỏi vòng lặp ngay cả khi biểu
thức điều kiện của vòng lặp vẫn còn
được thỏa mãn.
Chú ý:
• break dùng để thoát ra khỏi khối lặp
hiện tại
• break cũng dùng để thoát ra khỏi
lệnh rẽ nhánh switch
26/09/2019 224
224
112
Chương 4: Cấu trúc điều khiển
4.4 Các lệnh thay đổi cấu trúc lập trình
Ví dụ 2
#include <stdio.h>
#include <conio.h>
void main() {
int n;
do {
printf(" \nEnter the number :"); scanf("%d", &n);
if (n < 0) {
break;
}
if (n >10) {
printf("Skip the value\n");
continue;
}
printf("The number is: %d", n);
} while (n!= 0);
}26/09/2019 225
225
Ví dụ 3
#include <stdio.h>
#include <conio.h>
void main()
{
int i;
for(i = 1;i<=10;i++)
{
if(i == 5) continue;
printf(“%5d”,i);
if(i==7) break;
}
getch();
}
26/09/2019 226
226
113
Chương 4: Cấu trúc điều khiển
4.4 Các lệnh thay đổi cấu trúc lập trình
Ví dụ 4
#include <stdio.h>
#include <conio.h>
void main()
{ int i,j;
clrscr();
for(i = 0;i<10;i++) {
for (j=0; j < 10; j ++) {
if(j > i){
break;
}//if
}//for _ j
printf("i:%d j:%d\n",i,j);
}//for_i
getch();
}
26/09/2019 227
227
Ví dụ tổng hợp
Viết chương trình thực hiện các công việc
sau
• Nhập vào một dãy số cho tới khi
– Tổng của dãy lớn hơn 1550 hoặc là
– Số phần tử trong dãy lớn hơn 100
• Đưa ra số lượng phần tử nằm trong
khoảng (35, 70)
• Đưa ra trung bình cộng của các phần tử
chia hết cho 7
26/09/2019 228
228
114
Chương 4: Cấu trúc điều khiển
4.4 Các lệnh thay đổi cấu trúc lập trình
Nhập một dãy số cho tới khi số phần tử trong dãy lớn hơn 100
Bắt đầu
#include <stdio.h>
void main(){
i0
int a, i;
Nhập số a i = 0;
i i+1
do{
printf("Nhap vao so nguyen:");
s i > 100
scanf("%d",&a);
đ
i++;
Kết thúc
}while (i <= 100);
}
26/09/2019 229
229
Nhập một dãy số cho tới khi tổng của dãy lớn hơn 1550
26/09/2019 230
230
115
Chương 4: Cấu trúc điều khiển
4.4 Các lệnh thay đổi cấu trúc lập trình
Kết thúc
26/09/2019 231
231
void main(){
i0
int a, i=0,S7=0,d7=0; S70
do{ d70
if(a%7==0){ đ d7d7+1
a % 7=0
d7++; S7S7+a
S7+=a; s
} i > 100
s
}while (i <= 100); đ
if(d7==0) s đ Thông báo: Không
TBC là: S7/d7 d7=0
printf(“Khong co so chia het có sốcho 7);
chia hết cho 7
else
printf(“Ket qua la %.4f“,(float)
Kết thúc
S7/d7);
}
26/09/2019 232
232
116
Đưa ra TBC của các phần tử chia hết cho 7(2)
#include <stdio.h> Bắt đầu
void main(){
int a, i=0,S7=0,d7=0,S=0; i0 S70
S0 d70
do{
printf("Nhap vaoNhập so sốnguyen:");
a
scanf("%d",&a);
i++; S+=a; i i+1 SS+a
if(a%7==0){ đ d7d7+1
d7++; a % 7=0
S7S7+a
S7+=a; s
} i > 100
s S > 1550 s
}while ( (i <=100)&&(S <= đ 1550) ); đ
if(d7==0)
printf(“Khong
TBC là: co
S7/d7so chia
s het cho
d7=0 7); báo: Không
đ Thông
có số chia hết cho 7
else
printf(“Ket qua la %.4f“,(float) S7/d7);
Kết thúc
}
26/09/2019 233
233
đ
if( (a>35) && (a < 70) ) d++; đ
Thông bao: số<=
}while ( (i <=100)&&(S p/tử trong
1550)khoảng
);(35,70) là d
printf(“So phanTBCtulà:trong
S7/d7
skhoang (35,70)
d7=0
đ Thông báo: la Không
%d \n”,d);
có số chia hết cho 7
if(d7==0) printf(“Khong co so chia het cho 7”);
else printf(“TBC cac so chia het cho 7 %.4f“,(float) S7/d7);
Kết thúc
}
26/09/2019 234
234
117
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
26/09/2019 235
235
Tính hàm f ( x) = x 5 + 5 x
1. #include <stdio.h> • pow(x,y) sinh ra lỗi khi x âm và y
2. #include <math.h> không là số nguyên
3. void main(){ • fabs(x) trả về trị tuyệt đối của x
4. float x, fx; khi là số thực
Có sai số khi x=0.0
5. for(x=-10.0; x<=5.0; x+=0.1){
6. if(x==0) for(int i=-100;i<50;i++){
7. fx = 0.0; x=(float)i/10;
8. else …….
9. fx = pow(x,5)+x/fabs(x) * pow(fabs(x), 0.2);
10. printf("<%4.1f,%7.2f>\n",x,fx);
11. }
12. }
26/09/2019 236
236
118
Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp
3. void main(){
4. int a, d=0, max = INT_MIN;
5. do {
6. printf("Nhap mot so : "); scanf("%d",&a);
7. if( a > max){
8. max = a;
9. d = 1;
10. }else
11. if (a == max) d++;
12. }while ( a < 0 || a%5 !=0);
13. printf(“Max: %d; Co %d gia tri",max,d);
14. }
26/09/2019 237
237
Bài tập
S = x + x + x + + x n dâ' u c ăn
x 2 x3 xn
S = 1+ x + + ++
2 3 n
2 3
x x xn
S = 1+ x + + ++
2! 3! n!
x 2
x 3
(−1) n x n
S = 1− x + − ++
2! 3! n!
26/09/2019 238
238
119
Viết chương trình đọc x và n vào từ bàn phím rồi tính
1. #include <stdio.h>
x 2 x3 xn
2. #include <conio.h> S = 1+ x + + ++
3. void main(){ 2! 3! n!
4. int n, i;
5. float x, u = 1.0,S=1.0;
6. clrscr();
7. printf("Nhap vao so nguyen n : "); scanf("%d",&n);
8. printf("Nhap vao so thuc x : "); scanf("%f",&x);
9. for(i = 1; i <= n; i ++){
10. u *= x/i;
11. S += u;
12. }
13. printf("Ket qua la %.8f",S);
14. getch();
15. }
26/09/2019 239
239
x 2 x3 (−1) n x n
S1 = 1 − x + − + + +
2! 3! n!
x3 x5 (−1) n 2 n +1
S2 = x − + + + x + // sin( x)
3! 5! (2n + 1)!
x2 x4 (−1) n 2 n
S3 = 1 − + + + x + // cos( x)
2! 4! (2n)!
26/09/2019 240
240
120
Nhập x và và tính với độ chính xác nhỏ hơn
x 2 x3 (−1) n x n
S = 1− x + − ++ +
2! 3! n!
26/09/2019 241
241
242
121
Phần 3: Lập trình C
Nội dung chính
• Chương 1: Tổng quan về ngôn ngữ C
• Chương 2: Kiểu dữ liệu và biểu thức trong C
• Chương 3: Vào ra dữ liệu
• Chương 4: Cấu trúc điều khiển
• Chương 5: Mảng, con trỏ và xâu ký tự
• Chương 6: Cấu trúc
• Chương 7: Hàm
• Chương 8: Tệp dữ liệu
26/09/2019 243
243
244
122
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
Giới thiệu
Bài toán:
• Nhập điểm thi (số nguyên) môn Tin đại cương cho lớp gồm
50 sinh viên rồi đưa ra số lượng sinh viên phải học lại
Phương pháp: Điểm của mỗi sinh viên là 1 biến
• Tên biến là tên sinh viên
Ví dụ: int An, Anh, Binh1, Binh2, Cuong,….. Van, Viet;
• Tên biến dạng “dx” với x là chỉ số thứ tự của SV trong lớp
Ví dụ: int d1, d2, d3,……,d50;
Nhận xét 1: Không hợp lý
• Có quá nhiều biến (Điểm thi cho toàn trường.. !?)
• Khó khăn cho các thao tác duyệt toàn bộ danh sách
– Số SV học lại: if(d1 <5) d++; if(d2 <5) d++; ……if(d50 <5) d++;
245
Giới thiệu
• Trong thực tế, thường gặp các đối tượng có
tính chất chung
– Tháng trong năm
– Điểm trung bình của sinh viên trong lớp
• Các đối tượng được nhóm lại dưới một tên
• Đối tượng được đặc trưng bởi tên nhóm và
thứ tự trong nhóm
– Tháng thứ 3 trong năm: Tháng 3
– Sinh viên thứ 17 trong lớp:…
• Số thứ tự của đối tương trong nhóm là chỉ
số phần tử
26/09/2019 246
246
123
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
247
248
124
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
26/09/2019 249
249
Tên_Mang[Chỉ_số_phần_tử];
26/09/2019 250
250
125
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
A[0] = 7;
A[1] = 5;
A[4] = 7;
int N = A[1] + A[4]; → N = 12
26/09/2019 251
251
Ví dụ
int A[10];
for(int i = 0; i < 10; i++) A[i]= 2* i;
0? 2? 4? 6
? 8? 10
? 12
? 14
? 16
? 18
?
0
i : 10
7
1
4
2
5
6
3
8
9
Chú ý: C không kiểm tra vượt quá giới hạn
của mảng khi truy nhâp
int A[3], B[4], C[3];
A[0] A[1] A[2] B[0] B[1] B[2] B[3] C[0] C[1] C[2]
26/09/2019
A[5] B[2] C[-2] nếu c/cấp liên tiếp 252
252
126
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
253
26/09/2019 254
254
127
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
b[0][1][2]
255
256
128
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
257
258
129
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
Nhập dữ liệu
Dùng hàm scanf()
Ví dụ: int Table[10];
• Nhập dữ liệu cho một phần tử
scanf(“%d”,&Table[2]);phần tử thứ 3 của mảng
• Nhập dữ liệu cho cả mảng
– Dùng vòng lặp for
for(i = 0; i < 10; i++)
scanf(“%d”,&Table[i]);
– Nên in ra chỉ số phần tử khi nhập
26/09/2019
printf(“Table[%d] : ”,i); scanf(“%d”,&Table[i]) 259
259
Nhập dữ liệu→Ví dụ 1
Nhập vào lượng mưa (mm) trong năm
#include <stdio.h>
#define MONTHS 12
int main(){
int rainfall[MONTHS], i;
for ( i=0; i < MONTHS; i++ ){
printf(“Nhap luong mưa tháng %d: “, i+1);
scanf("%d", &rainfall[i] );
}
return 0;
}
26/09/2019 260
260
130
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
Nhập dữ liệu→Lưu ý
• Nếu số phần tử của mảng chỉ được biết tại
thời điểm thực hiện chương trình (nhưng biết
số phần tử tối đa)
– Khai báo mảng với kích thước tối đa
– Sử dụng biến nguyên lưu số phần tử thực sự của
mảng.
Ví dụ:
• Nhập vào mảng không quá 100 số thực
– Khai báo mảng thực Table có tối đa 100 phần tử.
– Nhập số phần tử thực sự của mảng
– Nhập giá trị cho từng phần phần tử (dùng for)
26/09/2019 261
261
Nhập dữ liệu→Ví dụ 2
#include<stdio.h>
void main(){
float A[100];
int n, i;
do{
printf(“\n Cho biet so phan tu cua mang: “);
scanf(“%d”,&n);
}while (n>100 || n<=0);
for(i = 0; i < n; i++){
printf(“A[%d] = ", i); scanf("%f",&A[i]);
}
}
26/09/2019 262
262
131
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
263
264
132
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
26/09/2019 265
265
266
133
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
26/09/2019 267
267
26/09/2019 268
268
134
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
269
270
135
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
271
Ví dụ
Đưa ra phần tử đầu của mảng có giá trị
bằng k;
26/09/2019 272
272
136
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
273
Bài tập 1
1. Nhập vào dãy (<100) số, tính và đưa ra màn hình
• Tổng và tích của dãy số
• Các số chia hết cho 3 và lớn hơn 10
• Đếm các số nằm trong đoạn [100,1000)
2. Nhập vào một dãy số; tìm số chẵn nhỏ nhất dãy
3. Nhập dãy số; đếm xem có bao nhiêu bộ 3 số thỏa
mãn điều kiện xi=(xi-1+xi+1)/2
4. Viết chương trình nhập vào từ bàn một dãy số (<100
phần tử). Đưa ra số bé nhất và vị trí những số bằng
số bé nhất
5. Nhập vào n và dãy số (x1,x2,…xn) ;(y1,y2,..yn) rồi tính
n−1
274
137
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
Bài 1
26/09/2019 275
275
276
138
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
26/09/2019 277
277
3 3
2
1 1 1 1 1
5 5 3
2
5 2 2 2
2 2
3 5
3 5
3 3 3
6 6 6 6 6
5 5
1 1
2 3
2 3
5 5
6 6
26/09/2019 278
278
139
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
279
Ví dụ
26/09/2019 280
280
140
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
Ví dụ
1. #include<stdio.h>
2. void main(){
3. int A[100] ;
4. int N, i, j , t;
5. printf("So phan tu [< 100]: "); scanf("%d",&N);
6. printf("Hay nhap day so...\n");
7. for(i=0; i < N; i++){
8. printf("A[%d] = ",i+1); scanf("%d",&A[i]);
9. }
10. printf("\nDay vua nhap...\n");
11. for(i=0; i < N; i++)
12. printf("%4d", A[i]);
13. printf("\n\n");
26/09/2019 281
281
Ví dụ
14. printf("Sap xep day theo thuat toan lua chon");
15. for(i=0; i < N-1; i++){
16. for(j=i+1; j < N; j++)
17. if(A[i] < A[j]) {
18. t = A[i];
19. A[i] = A[j];
20. A[j] = t;
21. }//if & for_j
22. printf("\nLuot %d : ",i+1);
23. for(j=0; j < N; j++)
24. printf("%4d", A[j]);
25. }//for_i
26. }//main
26/09/2019 282
282
141
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
Ví dụ→Kết quả
26/09/2019 283
283
284
142
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
2
5 for(i = k+1; i < N; i++)
k
8
3 A[i-1] = A[i];
3
9 N= N - 1;
N 4
9
4
26/09/2019 285
285
Bài tập 2
1. Nhập vào từ bàn phím một dãy số nguyên (<100 phần
tử). Sắp xếp dãy theo nguyên tắc: Bên trên là số chẵn
chia hết cho 3. Bên duới là số lẻ chia hết cho 3. Giữa là
các số còn lại. Đưa cả 2 dãy ra màn hình.
2. Đọc vào dãy số có n phần từ (n<100). Đọc số x và số k
nguyên. Chèn x vào vị trí k của dãy. Nếu k>n, chèn x vào
vị trí n+1.
3. Nhập vào một dãy số (<100 phần tử) và sắp xếp theo
thứ tự tăng dần. Nhập thêm vào một số và chèn số mới
nhập vào đúng vị trí
4. Nhập vào một dãy (<100 phần tử); xóa đi các phần tử
chia hết cho 5 và đưa kết quả ra màn hình
26/09/2019 286
286
143
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
Bài chữa
#include<stdio.h>
void main(){
int A[100];
int N, i;
//Nhập dữ liệu
printf("So phan tu : "); scanf("%d",&N);
for(i=0; i < N; i ++){
printf("A[%d] = ",i);scanf("%d",&A[i]);
}
//Các thao tác xử lý mảng: chèn, xóa, sắp xếp,…
//Đưa Dữ liệu ra
for(i=0; i < N; i ++)
printf("%4d",A[i]);
}
26/09/2019 287
287
Bài chữa → Sắp xếp số chẵn chia hết 3 lên đầu dãy..
1. { int d = 0, t;
2. for(i=0;i < N; i++)
3. if(A[i]%6==0){
4. t=A[i]; A[i]=A[d]; A[d] = t;
5. d++;
6. }
7. for(i=d; i < N; i++)
8. if(A[i]%3 != 0){
9. t=A[i]; A[i]=A[d]; A[d] = t;
10. d++;
11. }
12. }
26/09/2019 288
288
144
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
289
26/09/2019 290
290
145
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
26/09/2019 291
291
292
146
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
293
294
147
Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng
Thực hiện
26/09/2019 295
295
296
148
Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ
Giới thiệu
297
Địa chỉ
• Bộ nhớ gồm dãy các ô nhớ
– Mỗi ô nhớ là một byte
– Mỗi ô nhớ có một địa chỉ riêng
• Các biến trong chương trình được lưu tại vùng
nhớ nào đó trong bộ nhớ
• Khi khai báo biến, tùy thuộc vào kiểu, biến sẽ
được cấp một số ô nhớ liên tục nhau
– Biến int được cấp 2 bytes, float được cấp 4 bytes,..
– Địa chỉ của biến, là địa chỉ của byte đầu tiên trong số
các byte được cấp
– Khi gán giá trị cho biến, nội dung các byte cung cấp cho
biến sẽ thay đổi
26/09/2019 298
298
149
Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ
299
Con trỏ
• Con trỏ là một biến mà 0000
giá trị của nó là địa chỉ Biến nhớ
của một vùng nhớ EB03 ABCD
– Vùng nhớ này có thể dùng
để chứa các biến có kiểu cơ
bản (nguyên, thực, ký tự,…)
hay có cấu trúc (mảng, bản
ghi,..)
• Con trỏ dùng “trỏ tới” một ABCD EFCD
biến nhớ Biến con trỏ
– Có thể trỏ tới một hàm FFFF
– Có thể trỏ tới con trỏ khác Bộ nhớ
26/09/2019 300
300
150
Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ
Kiểu * Tên;
• Tên: Tên của một biến con trỏ
• Kiểu: Kiểu của biến mà con trỏ “Tên” trỏ tới
– Giá trị của con trỏ có thể thay đổi được
• Trỏ tới các biến khác nhau, có cùng kiểu
– Kiểu biến mà con trỏ trỏ tới không thay đổi được
• Muốn thay đổi phải thực hiện “ép kiểu”
Ví dụ:
int * pi; //Con trỏ, trỏ tới một biến kiểu nguyên
char * pc; //Con trỏ, trỏ tới một biến kiểu ký tự
26/09/2019 301
301
302
151
Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ
303
304
152
Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ
Ví dụ
#include <stdio.h> #include <stdio.h>
void main(){ void main(){
int N=5, M=10; int N=5, M=10;
int *p1 = &N; int *p1 = &N;
int *p2 = &M; int *p2 = &M;
*p1 = *p2; p1 = p2;
printf("%d %d",*p1,*p2); printf("%d %d",*p1,*p2);
} }
10 10 10 10
26/09/2019 305
305
Ví dụ→Trường hợp 1
0000
1. #include <stdio.h>
2. void main(){
10
5 ABCD
3. int N=5, M=10;
10 ABCF
4. int *p1 = &N;
5. int *p2 = &M;
p2 p1
306
153
Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ
Ví dụ→Trường hợp 2
0000
1. #include <stdio.h>
2. void main(){
5 ABCD
3. int N=5, M=10;
10 ABCF
4. int *p1 = &N;
5. int *p2 = &M;
p2 p1
6. p1 = p2; ABCF
7. printf("%d %d",*p1,*p2); ABCD
ABCF
8. }
FFFF
Bộ nhớ
26/09/2019 307
307
26/09/2019 308
308
154
Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ
* ++ p1 → 2000 p2 ABC4
p1 ABC0
ABC2
Ghi chú:
• Kiểu int, các phần tử cách nhau 2 bytes FFFF
•26/09/2019
Kiểu float, các phần tử cách nhau 4 bytes Bộ nhớ
309
309
26/09/2019 310
310
155
Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ
Ví dụ
int A[10];
int * p = A; // int *p = &A[0]
311
312
156
Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ
Câu hỏi 1
#include<stdio.h>
int main() 30
{
int a=3, *p;
p = &a;
printf("%d\n", a * *p * a + *p);
return 0;
}
26/09/2019 313
313
Câu hỏi 2
#include<stdio.h>
int main(){
int arr[2][2][2] = {10, 2, 3, 4, 5, 6, 7, 8};
int *p, *q;
p = &arr[1][1][1];
q = (int *) arr;
8, 5
printf("%d, %d\n", *p, *(q+4) );
return 0;
}
26/09/2019 314
314
157
Chương 5: Mảng, con trỏ và xâu ký tự
Nội dung chính
1. Mảng
• Khái niệm
• Khai báo và sử dụng
• Các thao tác thường gặp
2. Con trỏ
• Khái niệm và cách khai báo
• Toán tử địa chỉ (&), toán tử nội dung (*)
• Phép toán trên con trỏ
• Con trỏ và mảng
3. Xâu ký tự
• Khái niệm. khai báo và sử dụng
• Các hàm xử lý ký tự và xâu ký tự
• Mảng xâu ký tự
26/09/2019 315
315
316
158
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
317
Khai báo
char tên_xâu [số_kí_tự_tối_đa];
318
159
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
T i n - h o 1 \0
c \0 ? ?
319
320
160
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
321
Các hàm xử lý ký tự
26/09/2019 322
322
161
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
323
324
162
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
26/09/2019 325
325
326
163
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
327
Ví dụ: Nhập xâu và đếm từ, phân cách bởi dấu trắng
#include <stdio.h>
#include <conio.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);
}
}
26/09/2019 328
328
164
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
329
330
165
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
331
332
166
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
26/09/2019 333
333
334
167
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
335
Ví dụ 1: Nhập 2 xâu cho biết số lần xuất hiện xâu 1 trong xâu 2
1. #include <stdio.h>
2. #include <string.h>
3. void main(){
4. int d =0;
5. char S1[50],S2[20], *p;
6. printf("Nhap xau thu nhat: "); gets(S1);
7. printf("Nhap xau thu hai: "); gets(S2);
8. p = strstr(S1,S2);
9. while(p !=NULL ){
10. d = d + 1;
11. p = strstr(p+1,S2);//vi tri tim kiem ke tiep
12. }
13. printf("Xau \“ %s\" x/hien trong xau \"%s \“ %d lan",S2,S1,d);
14. }
26/09/2019 336
336
168
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
337
26/09/2019 338
338
169
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
339
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ự
26/09/2019 340
340
170
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
Ví dụ: Nhập vào DSSV cho tới khi gặp tên rỗng, in DS
#include <stdio.h> for(n = 0; n <100; n++){
#include <string.h> printf("Ten sinh vien[%d]: ",n+1); gets(DS[n]);
void main(){ if(DS[n][0] ='\x0') break;
int i, n; //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;
}while(1); if(strlen(DS[n])>0) n++
printf("\n\nDS sinh vien vua nhap \n");
for(i=0;i<n;i++) printf("%s\n",DS[i]);
341
}26/09/2019 341
341
26/09/2019 342
342
171
Nhập dãy (<100) xâu cho tới khi gặp xâu “***”
Đưa ra màn hình xâu có độ dài lớn nhất
1. #include <stdio.h>
2. #include <string.h>
3. void main(){
4. int i, n = 0, d=0;
5. char DS[100][30], s[30]="";
6. do{
7. printf("Nhap xau thu [%d]: ",n+1); gets(DS[n]);
8. if( strcmp(DS[n],"***")) n= n + 1;//Không tính xâu “***”
9. else break;
10. }while(1);
11. for(i = 0; i < n; i++)
12. if(strlen(DS[i]) > d){
13. d = strlen(DS[i]);
14. strcpy(s,DS[i]);
15. }
16. printf("\n\nXau dai nhat la: %s, co do dai :%d\n",s,d);
17. }
26/09/2019 343
343
344
172
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
345
26/09/2019 346
346
173
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
347
Ví dụ
26/09/2019 348
348
174
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
Bài tập
1. Nhập vào 2 xâu S1, S2 và một số nguyên k. Hãy
chèn xâu S1 vào S2 và đưa ra màn hình (giả thiết
xâu S2 được khai báo đủ lớn)
2. Một văn bản gồm không quá 60 dòng, mỗi dòng
không quá 80 ký tự. Hãy viết chương trình thực
hiện nhập vào một văn bản, sau đó
1. Nhập vào xâu s và chỉ ra vị trí xuất hiệncủa xâu S
trong văn bản nếu có.
2. Thay tất cả các chuỗi « hanoi » (nếu có) bằng chuỗi
« HANOI »
3. Đếm xem trong văn bản có bao nhiêu từ (các từ phân
cách bởi dấu cách)
4. Tính tần xuất xuất hiện của các từ trong văn bản
26/09/2019 349
349
350
175
Chương 6: Cấu trúc
Nội dung chính
1. Khái niệm cấu trúc
• Khái niệm
2. Khai báo cấu trúc
• Khái báo kiểu cấu trúc
• Khai báo biến cấu trúc
• Định nghĩa kiểu dữ liệu với typedef
3. Xử lý dữ liệu cấu trúc
• Truy nhập các trường dữ liệu
• Phép gán giữa các biến cấu trúc
4. Một số ví dụ
26/09/2019 351
351
352
176
Chương 6: Cấu trúc
6.1 Khái niệm cấu trúc
26/09/2019 353
353
DS_Ten Mảng ký tự
Nguyễn Nguyễn Trần An
Văn An Hoàng Nghĩa
DS_KhoiThi
A D A
DS_KetQua
24.5 28.5 22.0
354
177
Chương 6: Cấu trúc
6.1 Khái niệm cấu trúc
355
Khái niệm
356
178
Chương 6: Cấu trúc
6.1 Khái niệm cấu trúc
Khái niệm → Ví dụ
26/09/2019 357
357
358
179
Chương 6: Cấu trúc
6.2 Khai báo cấu trúc
359
Point2D
struct Point{
Hoành độ (x)…(Số thực).. float x, y;
Tung độ (y)…..(Số thực).. };
26/09/2019 360
360
180
Chương 6: Cấu trúc
6.2 Khai báo cấu trúc
26/09/2019 361
361
362
181
Chương 6: Cấu trúc
6.2 Khai báo cấu trúc
363
364
182
Chương 6: Cấu trúc
6.2 Khai báo cấu trúc
365
Có thể gán giá trị khởi đầu cho một biến cấu
trúc, theo nguyên tắc như kiểu mảng
Ví dụ: struct SinhVien{
struct Date{ char Ten[20];
int day; struct Date{
int month; int day;
int year; int month;
}; int year;
struct SinhVien{ } NS;
char Ten[30]; } SV = {“Tran Anh", 20,12,1990 };
struct Date NS;
} SV = {“Tran Anh", 20, 12, 1990 };
26/09/2019 366
366
183
Chương 6: Cấu trúc
6.2 Khai báo cấu trúc
367
368
184
Chương 6: Cấu trúc
6.2 Khai báo cấu trúc
26/09/2019 369
369
370
185
Chương 6: Cấu trúc
Nội dung chính
1. Khái niệm cấu trúc
• Khái niệm
2. Khai báo cấu trúc
• Khái báo kiểu cấu trúc
• Khai báo biến cấu trúc
• Định nghĩa kiểu dữ liệu với typedef
3. Xử lý dữ liệu cấu trúc
• Truy nhập các trường dữ liệu
• Phép gán giữa các biến cấu trúc
4. Một số ví dụ
26/09/2019 371
371
• 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
26/09/2019 372
372
186
Chương 6: Cấu trúc
6.3 Xử lý dữ liệu cấu trúc
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 };
printf(" Sinh vien %s (%d/%d/%d)",
SV.Ten,SV.NS.day,SV.NS.month,SV.NS.year);
}
26/09/2019 373
373
Ví dụ
26/09/2019 374
374
187
Chương 6: Cấu trúc
6.3 Xử lý dữ liệu cấu trúc
Ví dụ
#include<stdio.h>
#include<conio.h>
typedef struct{
char ten[5];
int x,y;
}toado;
void main(){
toado t;
printf("Nhap thong tin toa do\n");
printf("Ten diem: ");gets(t.ten);
printf("Toa do x: ");scanf("%d",&t.x);
printf("Toa do y: ");scanf("%d",&t.y);
printf("Gia tri cac truong\n");
printf("%-5s%3d%3d\n",t.ten,t.x,t.y);
getch();
}26/09/2019 375
375
376
188
Chương 6: Cấu trúc
6.3 Xử lý dữ liệu cấu trúc
Ví dụ
#include<stdio.h>
typedef struct{
char hoten[20];
int diem;
}sinhvien;
void main(){
sinhvien a,b,c;
printf("Nhap thong tin sinh vien\n");
printf("Ho ten: ");gets(a.hoten);
printf("Diem:");scanf("%d",&a.diem);
26/09/2019 377
377
Ví dụ
b=a; //Gán biến cấu trúc
strcpy(c.hoten,a.hoten); //Gán từng trường
c.diem=a.diem;
printf(“Bien a: ");
printf("%-20s%3d\n",a.hoten,a.diem);
printf(“Bien b: ");
printf("%-20s%3d\n",b.hoten,b.diem);
printf(“Bien c: ");
printf("%-20s%3d\n",c.hoten,c.diem);
}
26/09/2019 378
378
189
Chương 6: Cấu trúc
6.3 Xử lý dữ liệu cấu trúc
Ví dụ →Kết quả
26/09/2019 379
379
380
190
Chương 6: Cấu trúc
6.4 Một số ví dụ
Một số ví dụ
1. Nhập vào 2 số phức và đưa ra tổng và tích của chúng
2. Nhập vào một danh sách (<100) sinh viên gồm họ tên, năm
sinh. Kết thúc nhập khi gặp SV có tên là rỗng
• Đưa danh sách vừa nhập ra màn hình.
• Đưa ra màn hình sinh viên lớn tuổi nhất
3. Nhập danh sách có N (N < 100, nhập từ bàn phím) thí sinh
gồm họ tên, số báo danh, khoa dự thi và điểm thi
• Đưa ra DSSV đã sắp xếp theo kết quả thi
• Đưa ra danh sách sinh viên dự thi khoa CNTT có điểm
thi từ 22.5 trở lên
• Nhập vào một số báo danh và in ra họ tên, điểm thi và
khoa đăng ký của thí sinh nếu tìm thấy. Nếu không tìm
thấy thí sinh thì đưa ra thông báo « không tìm thấy »
26/09/2019 381
381
Ví dụ 1
#include <stdio.h>
typedef struct {float re, im;} Complex;
void main(){
Complex R, R1, R2;
printf("Phan thuc & phan ao cho so thu nhat :");
scanf("%f%f",&R1.re,&R1.im);
printf("Phan thuc & phan ao cho so thu hai :");
scanf("%f%f",&R2.re,&R2.im);
R.re = R1.re+R2.re; R.im = R1.im+R2.im; //phép cộng số ảo
printf("(%.1f+%.1fi)+(%.1f+%.1fi)=(%.1f+%.1fi)\n",
R1.re,R1.im,R2.re,R2.im,R.re,R.im);
R.re = R1.re*R2.re - R1.im*R2.im; //nhân số ảo
R.im = R1.re*R2.im + R1.im*R2.re;
printf("(%.1f+%.1fi)*(%.1f+%.1fi)=(%.1f+%.1fi)\n",
R1.re,R1.im,R2.re,R2.im,R.re,R.im);
}
26/09/2019 382
382
191
Ví dụ 2
1. #include <stdio.h> for(nfor(i =0;
=0;i<100;
n<100;i++){
n++){
2. #include <string.h> printf("Nhap du lieu cho sinh vien %d: \n", n+1);
i+1);
3. typedef struct{ printf("Ho ten : "); fflush(stdin); gets(SV.Ten);
gets(SV[n].Ten);
4. char Ten[30]; if (strlen(SV[n].Ten)
(strlen(SV.Ten) ==0) ==0)
break;
break;
5. int NS; printf("Nam sinh :");scanf("%d", &SV[n].NS);
&SV.NS);
6. }SinhVien; } DS[n] = SV; n = n + 1;
7. void main(){ }
8. SinhVien DS[100], SV;
9. int n=0,i;
10. do{
11. fflush(stdin);
12. printf("Nhap du lieu cho sinh vien %d: \n", n+1);
13. printf("Ho ten : "); gets(SV.Ten);
14. if (strlen(SV.Ten) >0) {
15. printf("Nam sinh :");scanf("%d", &SV.NS);
16. DS[n] = SV; n = n + 1;
17. }
18. } while (strlen(SV.Ten) > 0);
26/09/2019 383
383
Ví dụ 2
19. //In danh sach sinh vien
20. printf("\n\n");
21. printf(" HO & TEN NAM SINH\n");
22. for(i=0; i < n;i++)
23. printf("%-3d%-30s %6d\n",i+1,DS[i].Ten,DS[i].NS);
24. printf("\n\n");
25. //Tim sinh vien lon tuoi nhat
26. SV = DS[0];
27. for(i=0; i < n;i++)
28. if(DS[i].NS < SV.NS)
29. SV = DS[i];
30. printf("Sinh vien: %s sinh nam: %d lon tuoi nhat",SV.Ten,SV.NS);
31. }//main
26/09/2019 384
384
192
Ví dụ 2→Kết quả thực hiện
26/09/2019 385
385
26/09/2019 386
386
193
Ví dụ 3 (2/5): Nhập dữ liệu từ bàn phím
13. printf("Nhap so thi sinh : "); scanf("%d",&N);
14. for ( i=0; i < N; i++ ){
15. printf("Nhap du lieu cho thi sinh %d: \n", i+1);
16. printf("So bao danh : "); scanf("%d",&DS[i].SBD);
17. printf("Ho ten : ");
18. fflush(stdin); gets(DS[i].Ten);
19. printf("Khoa dang ky : ");
20. fflush(stdin); gets(DS[i].Khoa);
21. printf("Ket qua thi : ");scanf("%f", &DS[i].Diem);
22. printf("\n"); C scanf: floating point format not linked
23. }//for
24. printf("\n\nNhan phim bat ky de xem ket qua thi...");
25. fflush(stdin); getch();
26/09/2019 387
387
388
194
Ví dụ 3 (4/5): Danh sách trúng tuyển khoa CNTT
//Dua ra danh sach du thi khoa CNTT
38. d = 0;
39. printf("\n\nDanh sach thi sinh trung tuyen khoa CNTT\n\n");
40. for(i=0; i < N; i ++)
41. if(strcmp(DS[i].Khoa,"CNTT")==0 && DS[i].Diem >=22.5)
42. printf("%-3d BKA%-6d %-24s %-f\n",
++d,DS[i].SBD,DS[i].Ten,DS[i].Diem);
43. printf("\n\nNhan phim bat ky de bat dau tim kiem theo so bao danh");
44. fflush(stdin); getch();
26/09/2019 389
389
390
195
Ví dụ 3→Kết quả thực hiện
26/09/2019 391
391
26/09/2019 392
392
196
Ví dụ 3→Kết quả thực hiện
26/09/2019 393
393
Bài tập
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. Nhập tên sinh viên, cho biết năm sinh nếu tìm thấy
3. Đưa ra DSSV đã sắp xếp theo thứ tự ABC của họ và tên
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 có kết quả thi cao nhất
3. Tìm điểm chuẩn, nếu chỉ lấy K SV, K nhập vào. Nếu có
26/09/2019
nhiều người bằng điểm nhau; loại cả 394
394
197
Bài tập 1
1. #include <stdio.h>
2. #include <string.h>
3. typedef struct{
4. char Ten[30];
5. int NS;
6. }SinhVien;
7. void main(){
8. SinhVien DS[100], SV;
9. int N, i, j, d=0;
10. char ten[30];
11. printf("Nhap so sinh vien : "); scanf("%d",&N);
12. for ( i=0; i < N; i++ ){
13. printf("Nhap du lieu cho sinh vien %d: \n", i+1);
14. printf("Ho ten : "); fflush(stdin);gets(DS[i].Ten);
15. printf("Nam sinh : ");scanf("%d", &DS[i].NS);
16. }
26/09/2019 395
395
26/09/2019 396
396
198
Bài tập 1 (tiếp)
29. for(i = 0; i < N - 1; i ++) //sắp xếp theo pp lựa chọn
30. for(j = i+1; j < N; j ++)
31. if(strcmp(DS[i].Ten,DS[j].Ten) > 0){
32. SV= DS[i];
33. DS[i]=DS[j];
34. DS[j] = SV;
35. }
36.
37. printf("\n\n DANH SACH SAP XEP\n\n");
38. for(i = 0; i < N; i ++)
39. printf("%d %-20s %d \n",i+1, DS[i].Ten, DS[i].NS);
40. }//main
26/09/2019 397
397
26/09/2019 398
398
199
Bài tập 2 (1/5)
#include <stdio.h>
#include <string.h>
typedef struct{
char Ten[30];
struct{
int T, L, H, S; //S = T+L+H
} DT;
}SinhVien;
void main(){
SinhVien DS[100], TK, SV;
int N,i,j,K;
float C;
26/09/2019 399
399
400
200
Bài tập 2 (3/5)
//In ra danh sách vừa nhập
printf("\n\n DANH SACH SINH VIEN\n\n");
printf(" Ten SV Toan Ly Hoa Tong \n");
for(i = 0; i < N; i ++)
printf("%-20s%5d%5d%5d%6d\n",DS[i].Ten,
DS[i].DT.T,DS[i].DT.L,DS[i].DT.H,DS[i].DT.S);
//In danh sách trúng tuyển theo điểm chuẩn
printf("\n\nDiem Chuan : ");scanf("%f",&C);
printf("\n\n DANH SACH SINH VIEN TRUNG TUYEN \n\n");
for(i = 0; i < N; i ++)
if( (DS[i].DT.S >= C)&&(DS[i].DT.T*DS[i].DT.L*DS[i].DT.H>0))
printf("%s\n",DS[i].Ten);
26/09/2019 401
401
//Tìm điểm của thủ khoa, bỏ qua tường hợp điểm liệt
TK = DS[0];
for(i = 1; i < N; i ++)
if(DS[i].DT.S > TK.DT.S)
TK = DS[i];
//Đưa ra danh sách thí sinh có điểm bằng điểm cao nhât
for(i = 0; i < N; i ++)
if(DS[i].DT.S == TK.DT.S)
printf("\n\n THU KHOA: %s \n\n",TK.Ten);
26/09/2019 402
402
201
Bài tập 2 (5/5)
printf("\nSo nguoi trung tuyen:"); scanf("%d",&K);
for(i = 0; i < N - 1; i ++) //Sắp xếp theo tổng điểm thi
for(j = i+1; j < N; j ++)
if(DS[i].DT.S < DS[j].DT.S ){
SV= DS[i];
DS[i]=DS[j];
DS[j] = SV;
}
while((K>0)&&(DS[K-1].DT.S==DS[K].DT.S))K--;
if(K>0){
printf("Diem Chuan La : %4d",DS[K-1].DT.S);
printf("\n\n Danh Sach sinh vien trung tuyen \n");
for(i=0; i < K; i++)
printf("%s\n",DS[i].Ten);
}
}//main
26/09/2019 403
403
Bài tập 1
Lập trình thực hiện các công việc sau
▪ Đọc vào từ bàn phím một danh sách thuốc gồm
▪ Tên thuốc (chuỗi không quá 20 ký tự)
▪ Năm hết hạn
▪ Số lượng còn
▪ Đơn giá
Kết thúc nhập khi gặp thuốc có tên »*** »
▪ Đưa danh sách thuốc ra màn hình
▪ Đưa ra danh sách các thuốc đã hết hạn
▪ Xóa khỏi danh sách những thuốc đã hết hạn.
Đưa danh sách mới ra màn hình
▪ Tính tổng giá trị các thuốc đã hết hạn
▪ Đưa ra DS thuốc được sắp xếp theo năm hết hạn
26/09/2019 404
404
202
Chương 6: Cấu trúc
Bài tập
Bài tập 2
Cho một danh sách thành tích thi đấu bóng đá của 32
đội tuyển bao gồm: Tên đội bóng, số bàn thắng, số
bàn thua, số thẻ đỏ, số thẻ vàng
Viết chương trình thực hiện
• Nhập dữ liệu vào từ bàn phím
• Nhập vào tên đội bóng,
• Đưa ra thành thích của đội này
• Nếu không tồn tại, thông báo: không tìm thấy
• Tính và đưa ra màn hình số điểm của các đội nếu
• Mỗi bàn thắng được tính 10 điểm
• Mỗi bàn thua bị phạt 5 điểm, mỗi thẻ vàng trừ 2 điểm,
thẻ đỏ trừ 5 điểm
26/09/2019 405
405
406
203
Chương 6: Cấu trúc
Câu hỏi
407
408
204
Chương 7: Hàm
Nội dung chính
1. Khái niệm hàm
• Khái niệm chương trình con
• Phân loại: hàm và thủ tục
2. Khai báo và sử dụng hàm
• Khai báo và sử dụng
3. Phạm vi của biến
• Toàn cục và địa phương
• Biến static, biến register
4. Truyền tham số
• Truyền theo giá trị, truyền theo địa chỉ
26/09/2019 409
409
Chương 7: Hàm
7.1 Khái niệm hàm
• Khái niệm
– Là một chương trình nằm trong một chương
trình lớn hơn nhằm thực hiện một nhiệm vụ cụ
thể
• Vai trò
– Chia nhỏ chương trình ra thành từng phần để
quản lý
• Phương pháp lập trình có cấu trúc
– Có thể sử dụng lại nhiều lần: printf(), scanf()…
– Chương trình dễ dàng đọc và bảo trì hơn
26/09/2019 410
410
205
Chương 7: Hàm
7.1 Khái niệm hàm
Phân loại
Hàm chuẩn – Có
Hàm trong thư viện
(function)
Hàm (người dùng)
Chương Có trả về giá trị tự định nghĩa
trình con
Thủ tục
(procedure)
Không trả về giá trị
411
Chương 7: Hàm
Nội dung chính
1. Khái niệm hàm
• Khái niệm chương trình con
• Phân loại: hàm và thủ tục
2. Khai báo và sử dụng hàm
• Khai báo và sử dụng
3. Phạm vi của biến
• Toàn cục và địa phương
• Biến static, biến register
4. Truyền tham số
• Truyền theo giá trị, truyền theo địa chỉ
26/09/2019 412
412
206
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
Ví dụ
#include<stdio.h>
int bp(int x){
Khai báo int y;
chương y = x * x;
trình con
return y;
}
void main(){
int i;
Gọi chương for (i=1; i< 20; i+=2)
trình con ra printf("%4d\n", bp(i));
thực hiên printf("\n");
}
26/09/2019 413
413
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
Cú pháp
Dòng đầu hàm
Kiểu_hàm Tên_hàm(DS khai báo tham số)
{
Thân hàm
26/09/2019 414
414
207
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
415
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
26/09/2019 416
416
208
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
26/09/2019 417
417
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
418
209
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
26/09/2019 419
419
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
420
210
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
Thân hàm
26/09/2019 421
421
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
26/09/2019 422
422
211
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
Sử dụng hàm
423
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
424
212
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
425
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
#include <stdio.h>
#include <math.h>
float f(float x){
if(x==0.0)
return 0;
else
return pow(x,5)+x/fabs(x) * pow(fabs(x), 0.2);
}
void main(){
float a, b, c;
printf("So 3 so thuc : "); scanf("%f%f%f",&a,&b,&c);
printf("Ket qua %f \n",(f(a)+f(b)+f(c))/3);
}26/09/2019 426
426
213
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
427
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
428
214
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
#include <stdio.h>
#include <math.h>
typedef struct{
float x, y;
}Point;
429
Chương 7: Hàm
7.2 Khai báo và sử dụng hàm
430
215
Bài tập 1
Cho hàm f(x) được định nghĩa như sau
𝟐𝒙+𝟏 + 𝟏 + 7
𝑓 𝑥 = ൝ 5𝒆 3
𝑘ℎ𝑖 𝑥 ≤ 2
𝑥 + 5𝑥 + 𝑥 + 1 𝑘ℎ𝑖 𝑥 > 2
Hãy viết chương trình thực hiện các công việc sau
• Viết chương trình con tính hàm trên
• Nhập vào từ bàn phím 2 số thực x, y, tính và đưa ra
màn hình (f(x)+f(y))2
• Đưa ra màn hình theo dòng các cặp <x, f(x)> (định
dạng đưa ra là các số thực tĩnh có 2 chữ số sau dấu
chấm) trong đó giá trị của x lần lượt là -5.0; -4.9;
-4.8;…..2.8; 2.9; 3.0.
26/09/2019 431
431
Bài tập 2
• Tiền điện được tính theo số điện tiêu thụ như sau
– Dùng ít hơn 250 số: 2000đồng/số
– Dùng từ 250 đến 400 số: 3000 đồng/số
– Dùng từ 400 đến 500 số: 4000 đồng/số
– Dùng từ 500 số trở lên: 5000đ/số
• Hãy viết hàm TienDien, trả về số tiền điện phải trả
với tham số vào là số điện năng đã tiêu thụ
• Nhập vào danh sách sử dụng điện của các hộ gia
đình (tên chủ hộ, số điện tiêu thụ), Kết thúc nhập
khi đã đủ 100 hộ hoặc nhập tên chủ hộ là “***”
• Đưa ra màn hình hộ trả tiền điện ít nhât
• Sắp xếp danh sách theo thứ tự tăng của tiền phải trả
26/09/2019 432
432
216
Bài tập 3
Cho hàm f(x) được định nghĩa như sau
3
4 − 𝑥2 + 1 Khi |x| < 2
𝑓 𝑥 = 7 𝐾ℎ𝑖 |𝑥| = 2
3 +1
𝑒𝑥 + log 5 𝑥 2 − 1 𝐾ℎ𝑖 |𝑥| > 2
Hãy viết chương trình thực hiện các công việc sau
• Viết chương trình con tính hàm trên
• Nhập từ bàn phím N số thực và tìm và đưa ra màn hình giá
trị lớn nhất của hàm f(x) tại N số đã nhập.
• Nhập vào từ bàn phím một dãy các số thực cho tới khi nhập
đủ 100 số hoặc cho tới khi gặp một giá trị x thỏa mãn f(x) lớn
hơn giá trị lớn nhất trong câu trên.
26/09/2019 433
433
Chương 7: Hàm
Nội dung chính
1. Khái niệm hàm
• Khái niệm chương trình con
• Phân loại: hàm và thủ tục
2. Khai báo và sử dụng hàm
• Khai báo và sử dụng
3. Phạm vi của biến
• Toàn cục và địa phương
• Biến static, biến register
4. Truyền tham số
• Truyền theo giá trị, truyền theo địa chỉ
26/09/2019 434
434
217
Chương 7: Hàm
7.3 Phạm vi của biến
Phạm vi
• Phạm vi: #include<stdio.h>
#include<conio.h>
– Khối lệnh, chương trình con,
int i;
chương trình chính
int binhphuong(int x){
• Biến chỉ có tác dụng trong int y;
phạm vi được khai báo y = x * x;
return y;
• Trong cùng một phạm vi
}
các biến phải có tên khác void main(){
nhau. int y;
Tình huống for (i=0; i<= 10; i++){
• Trong hai phạm vi khác nhau có y = binhphuong(i);
hai biến cùng tên. Trong đó một printf(“%d ”, y);
phạm vi này nằm trong phạm vi }
kia? }
26/09/2019 435
435
Chương 7: Hàm
7.3 Phạm vi của biến
436
218
Chương 7: Hàm
7.3 Phạm vi của biến
Biến static
26/09/2019 437
437
Chương 7: Hàm
7.3 Phạm vi của biến
Ví dụ→Kết quả
#include <stdio.h>
# include <conio.h>
void fct() {
static int count = 1;
printf("\n Day la lan goi ham fct lan thu %2d", count++);
}
void main(){
int i;
for(i = 0; i < 10; i++) fct();
getch();
}
26/09/2019 438
438
219
Chương 7: Hàm
7.3 Phạm vi của biến
Ví dụ
26/09/2019 439
439
Chương 7: Hàm
7.3 Phạm vi của biến
Biến register
440
220
Chương 7: Hàm
Nội dung chính
1. Khái niệm hàm
• Khái niệm chương trình con
• Phân loại: hàm và thủ tục
2. Khai báo và sử dụng hàm
• Khai báo và sử dụng
3. Phạm vi của biến
• Toàn cục và địa phương
• Biến static, biến register
4. Truyền tham số
• Truyền theo giá trị, truyền theo địa chỉ
26/09/2019 441
441
Chương 7: Hàm
7.4 Truyền tham sô
Ví dụ
# include <stdio.h>
void swap(int a, int b) {
int x = a;
a = b;
b = x;
return;
}
void main(){
int a = 5, b = 100;
printf("Truoc: a=%d, b=%d \n\n",a,b);
swap(a,b);
printf("Sau : a=%d, b=%d\n\n",a,b);
return;
}
26/09/2019 442
442
221
Chương 7: Hàm
74 Truyền tham sô
26/09/2019 443
443
Chương 7: Hàm
7.4 Truyền tham sô
444
222
Chương 7: Hàm
7.4 Truyền tham sô
445
Ví dụ 2: Nhập danh sách các xâu cho tới khi gặp xâu rỗng
Đưa ra xâu có tần xuất xuất hiện nguyên âm lớn nhất
26/09/2019 446
446
223
Chương 6: Cấu trúc
6.3 Xử lý dư liệu cấu trúc
447
448
224
Chương 6: Cấu trúc
6.3 Xử lý dư liệu cấu trúc
449
450
225
Chương 8: Tệp dữ liệu
Nội dung chính
1. Tệp và phân loại tệp
• Khái niệm và phân loại
• Tệp và mảng
• Tổ chức tệp
2. Các thao tác với tệp
• Khai báo
• Mở tệp
• Đóng tệp
• Truy nhập tệp văn bản
• Truy nhập tệp nhị phân
26/09/2019 451
451
Khái niệm
• Tệp (Tập tin/File):
– Tập hợp các dữ liệu cùng kiểu
– Có liên quan tới nhau
• Lưu trữ tệp
– Lưu trữ trên thiết bị lưu trữ ngoài
– Có tên riêng để phân biệt
• Phân thành 2 loại
– Tệp văn bản (text file)
– Tệp nhị phân (binary file)
452
26/09/2019
452
226
Chương 8: Tệp dữ liệu
8.1 Tệp và phân loại tệp
Phân loại
• Tệp văn bản
– Được tổ chức theo từng dòng
• Trên mỗi dòng là các ký tự ASCII hiện thị được như
chữ cái, chữ số, dấu câu,…
– Cuối mỗi dòng là các ký tự điều khiển
• CR: Carriage Return - mã ASCII 13
• LF:Line Feed- Mã ASCII 10
• Tệp nhị phân
– Các phần tử của tệp là các số nhị phân dung
mã hóa thông tin
– Thông tin được mã hóa: số, cấu trúc dữ liệu,..
453
26/09/2019
453
454
227
Chương 8: Tệp dữ liệu
8.1 Tệp và phân loại tệp
Tổ chức tệp
Phần tử dữ liệu ngay sau khi mở file Ký hiệu đánh dấu kết thúc file
EOF
455
456
228
Chương 8: Tệp dữ liệu
8.2 Thao tác với tệp
Quy trình
• Đóng tệp
457
26/09/2019
457
FILE * Con_Trỏ_Tệp
• Ví dụ
– FILE * f1, *f2;
458
26/09/2019
458
229
Chương 8: Tệp dữ liệu
8.2 Thao tác với tệp
Mở tệp
Con_Trỏ_Tệp = fopen(Tên_Tệp, Chế_độ mở)
• Hàm fopen() khi báo trong thư viện stdio.h
• Tên_Tệp: Kiểu chuỗi, xác định tên tệp trên đĩa
– Tên đầy đủ của tệp hoặc tệp trên thư mực hiện thời
• Chế độ mở: Hằng xâu, gồm các ký tự r/w/a/+/t/b
– Tùy thuộc kiểu tệp và mục đích sử dụng
– Kiểu tệp: t: text file; b: binary file
– Chế độ: + Vừa đọc/ vừa ghi
- r : Mở để đọc; Báo lỗi nếutệp chưa tồn tại
- w : Mở mới để ghi; Xóa nội dung tệp cũ nếu đã có
- a : Mở để ghi vào cuối; Tạo tệp mới nếu chưa tồn tại
•26/09/2019
Trả về NULL nếu có lỗi mở tệp 459
459
Đóng tệp
460
26/09/2019
460
230
Chương 8: Tệp dữ liệu
8.2 Thao tác với tệp
461
Đọc dữ liệu
int fread(void * Địa_Chỉ_Đích, int Kích_thước,
int số_phần_tử, FILE *fptr)
– Đọc từ file xác đinh bởi biến fptr một khối dữ liệu
kích thước Số_Phần_Tử x Kích_Thước vào
vùng nhớ xác định bởi Địa_Chỉ_Đích
– Nếu đọc thành công: Trả về số phần tử đọc được
– Nếu không thành công: Trả về giá trị 0
• Ví dụ: int Buf[100]; FILE * fptr =fopen(“so.dat”,”rb”)
fread( Buf, sizeof(int), 100, fptr);
462
26/09/2019
462
231
Chương 8: Tệp dữ liệu
8.2 Thao tác với tệp
Ghi dữ liệu
int fwrite(void * Đ_Chỉ_Nguồn, int Kích_thước,
int số_phần_tử, FILE *fptr)
– Ghi từ vùng nhớ xác định bởi Địa_Chỉ_nguồn
một khối dữ liệu có kích thước Số_Phần_Tử x
Kích_Thước ra file được xác đinh bởi biến fptr
– Nếu ghi thành công: Trả về số phần tử đã ghi
– Nếu không thành công: Trả về giá trị 0
• Ví dụ: int Buf[100]; FILE * fptr =fopen(“so.dat”,”wb”)
fwrite(Buf, sizeof(int), 100, fptr);
463
26/09/2019
463
464
232
Chương 8: Tệp dữ liệu
8.2 Thao tác với tệp
Ví dụ 1
#include <stdio.h>
void main(){
FILE * f = fopen(“SoNguyen.Dat”,”wb”);
int i, n;
for(i = 0; i <100; i++){
n = 2*i+1;
fwrite(&n, sizeof(int), 1, f);
}
fclose(f);
}
465
26/09/2019
465
Ví dụ 2
• Đọc file Songuyen.dat, đưa ra màn hình các
số lẻ từ vị trí số thứ 50 của file
#include <stdio.h>
void main(){
FILE * f = fopen("SoNguyen.Dat","rb");
int n;
fseek(f,50*sizeof(int),SEEK_SET);
while(!feof(f)){
fread(&n,sizeof(int),1,f);
printf("%4d",n);
}
fclose(f);
}
26/09/2019
466
466
233
Chương 8: Tệp dữ liệu
8.2 Thao tác với tệp
Ví dụ 3
• Nhập vào từ bàn phím 100 số thực và ghi file nhị phân
SO_DUONG.DAT các số thực dương trong các số đã nhập
• Đọc từ file SO_DUONG.DAT và đưa ra màn hình số thực
có giá trị lớn nhất
467
26/09/2019
467
Ví dụ 4
• Nhập danh sách từ bàn phím các thí sinh dự thi, mỗi thí
sinh gồm họ tên, số báo danh, khoa dự thi và điểm thi. Dữ
liệu nhập được ghi vào file ThiSinh.dat. Kết thúc nhập khi
gặp một thí sinh có tên là « *** »
• Đọc từ file ThiSinh.Dat, đưa ra màn hình danh sách các thí
sinh thi vào ngành CNTT có điểm thi lớn hớn 21 theo quy
cách
STT Số Báo Danh Ho Tên Điểm Thi
• Từ file ThiSinh.Dat, tạo file CNTT.Dat chỉ chứa danh sách
các thí inh thi vào khoa CNTT
• Nhập vào một số báo danh, tìm trong file ThiSinh.Dat và in
ra họ tên, điểm thi và khoa đăng ký của thí sinh nếu tìm
thấy. Nếu không tìm thấy thí sinh thì đưa ra thông báo
« không tìm thấy » 468
26/09/2019
468
234
Chương 8: Tệp dữ liệu
8.2 Thao tác với tệp
Ví dụ 4
#include <stdio.h>
#include <string.h>
typedef struct{
char Ten[30];
long SBD;
char Khoa[10];
float Diem;
}SinhVien;
void main(){
FILE * f1,* f2;
SinhVien SV;
int i, SBD;
//Nhap thong tin cho file ThiSinh.Dat
//Tao file CNTT.Dat
}
26/09/2019
469
469
Ví dụ 4
//Nhap thong tin cho file ThiSinh.Dat
f1 = fopen("ThiSinh.Dat","wb");
i = 1;
do{
printf("Thi sinh %d :\n", i);
printf(" Ho Ten : "); fflush(stdin); gets(SV.Ten);
if(strcmp(SV.Ten,"***")==0)break;
printf(" So Bao Danh: "); scanf("%d",&SV.SBD);
printf(" Khoa : "); fflush(stdin); gets(SV.Khoa);
printf(" Diem : "); scanf("%f",&SV.Diem);
fwrite(&SV,sizeof(SinhVien),1,f1);
i++;
}while(1);
26/09/2019 fclose(f1);
470
470
235
Chương 8: Tệp dữ liệu
8.2 Thao tác với tệp
Ví dụ 4
printf("\n\n DANH SACH BAN DAU \n");
f1 = fopen("ThiSinh.Dat","rb");
i = 0;
while(fread(&SV,sizeof(SinhVien),1,f1) > 0)
printf("%-3d %-5d %-20s %-20s %-5.1f\n",
++i,SV.SBD, SV.Ten, SV.Khoa, SV.Diem);
printf("\n\n Thi Sinh thi CNTT tren 21.0\n");
i = 0;
rewind(f1);
while(fread(&SV,sizeof(SinhVien),1,f1) > 0)
if(strcmp(SV.Khoa,"CNTT")==0 && SV.Diem > 21.0)
printf("%-3d %-5d %-20s %-5.1f\n",++i,SV.SBD,
SV.Ten, SV.Diem);
471
26/09/2019
471
Ví dụ 3
printf("\n\n Tao file CNTT.Dat\n");
i = 0;
rewind(f1);
f2 = fopen("CNTT.Dat","wb");
while(fread(&SV,sizeof(SinhVien),1,f1) > 0)
if(strcmp(SV.Khoa,"CNTT")==0 )
fwrite(&SV,sizeof(SinhVien),1,f2);
fclose(f2);
f2 = fopen("CNTT.Dat","rb"); //doc lai file
while(fread(&SV,sizeof(SinhVien),1,f2) > 0)
printf("%-3d %-5d %-20s %-5.1f\n",
++i, SV.SBD, SV.Ten, SV.Diem);
fclose(f2);
472
26/09/2019
472
236
Chương 8: Tệp dữ liệu
8.2 Thao tác với tệp
Ví dụ 3
printf("\n\nTim Sinh Vien\n");
printf(" So Bao Danh ");scanf("%d",&SBD);
rewind(f1);
while(fread(&SV,sizeof(SinhVien),1,f1))
if(SV.SBD==SBD){
printf("Tim thay sinh vien %s",SV.Ten);
break;
}
if(feof(f1)) printf("Khong thay ");
fclose(f1)
473
26/09/2019
473
237