Académique Documents
Professionnel Documents
Culture Documents
1
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Giới thiệu chung
CÁC KIỂU DỮ LIỆU CƠ SỞ 2 Biến, Hằng, Câu lệnh & Biểu thức
&& &&
VC
VC
BB
BB
Các kiểu dữ liệu cơ sở VC
VC
BB
BB
Kiểu số nguyên
&& &&
VC
VC
BB
BB
Kiểu luận lý VC
VC
BB
BB
Kiểu ký tự
Ví dụ Cú pháp
int i; <kiểu> <tênhằng> = <giá trị>;
int j, k;
unsigned char dem;
float ketqua, delta;
Cú pháp Ví dụ
<kiểu> <tên biến>; int a = 1506; // 150610
<kiểu> <tên biến 1>, <tên biến 2>; int b = 01506; // 15068
int c = 0x1506; // 150616 (0x hay 0X)
float d = 15.06e-3; // 15.06*10-3 (e hay E)
NMLT - Các kiểu dữ liệu cơ sở 9 NMLT - Các kiểu dữ liệu cơ sở 10
&& &&
VC
VC
BB
BB
Hằng số VC
VC
BB
BB
Biểu thức
&& &&
VC
VC
BB
BB
Các toán tử toán học VC
VC
BB
BB
Các toán tử toán học
&& &&
VC
VC
BB
BB
Các toán tử quan hệ VC
VC
BB
BB
Các toán tử luận lý
Ví dụ 1 0 1 1 1 1
s1 = (1 == 2); s2 = (1 != 2); Ví dụ
s3 = (1 > 2); s4 = (1 >= 2); • s1 = (1 > 2) && (3 > 4);
s5 = (1 < 2); s6 = (1 <= 2); • s2 = (1 > 2) || (3 > 4);
• s3 = !(1 > 2);
NMLT - Các kiểu dữ liệu cơ sở 19 NMLT - Các kiểu dữ liệu cơ sở 20
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&& &&
VC
VC
BB
BB
Toán tử điều kiện VC
VC
BB
BB
Toán tử phẩy
&& &&
VC
VC
BB
BB
Độ ưu tiên của các toán tử VC
VC
BB
BB
Độ ưu tiên của các toán tử
&& &&
VC
VC
BB
BB
Câu lệnh VC
VC
BB
BB
Câu lệnh xuất
Văn bản thường (literal text) Ký tự điều khiển (escape sequence)
Được xuất y hệt như lúc gõ trong chuỗi định Gồm dấu \ và một ký tự như trong bảng sau:
dạng. Ký tự điều khiển Ý nghĩa
Ví dụ \a Tiếng chuông
\b Lùi lại một bước
Xuất chuỗi Hello World \n Xuống dòng
\t Dấu tab
Î printf(“Hello ”); printf(“World”); \\ In dấu \
\? In dấu ?
Î printf(“Hello World”); \” In dấu “
Xuất chuỗi a + b Ví dụ
Î printf(“a + b”); printf(“\t”); printf(“\n”);
NMLT - Các kiểu dữ liệu cơ sở 29 printf(“\t\n”); NMLT - Các kiểu dữ liệu cơ sở 30
&& &&
VC
VC
BB
BB
Chuỗi định dạng VC
VC
BB
BB
Chuỗi định dạng
&& &&
VC
VC
BB
BB
Câu lệnh nhập VC
VC
BB
BB
Câu lệnh nhập
&& &&
VC
VC
BB
BB
Bài tập lý thuyết VC
VC
BB
BB
Bài tập thực hành
1. Trình bày các kiểu dữ liệu cơ sở trong C và 4. Nhập năm sinh của một người và tính tuổi của
cho ví dụ. người đó.
2. Trình bày khái niệm về biến và cách sử dụng 5. Nhập 2 số a và b. Tính tổng, hiệu, tính và
lệnh gán. thương của hai số đó.
3. Phân biệt hằng thường và hằng ký hiệu. 6. Nhập tên sản phẩm, số lượng và đơn giá. Tính
Cho ví dụ minh họa. tiền và thuế giá trị gia tăng phải trả, biết:
4. Trình bày khái niệm về biểu thức. a. tiền = số lượng * đơn giá
Tại sao nên sử dụng cặp ngoặc đơn. b. thuế giá trị gia tăng = 10% tiền
5. Trình bày cách định dạng xuất.
&& &&
VC
VC
BB
BB
Bài tập 5 VC
VC
BB
BB
Bài tập 6
&&
VC
VC
BB
BB
Bài tập 9
#include <stdio.h>
#include <conio.h>
void main()
{
int n;
int n1, n2, n3, n4, SoNut;
printf(“Nhap bien so xe (4 so): ”);
scanf(“%d”, &n);
n4 = n % 10; n = n / 10;
n3 = n % 10; n = n / 10;
n2 = n % 10; n = n / 10;
n1 = n;
SoNut = (n1 + n2 + n3 + n4) % 10;
printf(“So nut la: %d”, SoNut);
}
NMLT - Các kiểu dữ liệu cơ sở 47
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Trường Đại học Khoa học Tự nhiên
Khoa Công nghệ thông tin
Bộ môn Công nghệ phần mềm
1
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nội dung
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
Khối vào ra
Nhập/Xuất dữ liệu.
Đường đi
Chỉ hướng thao tác tiếp theo.
Bắt đầu
Nhập a, b
(hệ số của phương trình bậc nhất)
Sai Đúng
x b / a a = 0?
Kết thúc
#include <stdio.h>
#include <conio.h>
void main()
{
int nA, nB;
printf(“Nhap a, b: ”);
scanf(“%d%d”, &nA, &nB);
if (bA == 0)
if (nB == 0)
printf(“Phương trình VSN\n”);
else
printf(“Phương trình VN\n”);
else
printf(“x = %.2f\n”, (float)-nB/nA);
}
Các khái niệm cơ bản về lập trình
11
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Bài tập
GIỚI THIỆU
NGÔN NGỮ LẬP TRÌNH C
1
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nội dung
1 Giới thiệu
2 Bộ từ vựng của C
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)
ANSI C.
#include <stdio.h>
#include <conio.h>
void main()
{
int nX, nY, nTong;
nTong = nX + nY;
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.
1
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nội dung
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\n”);
if (a == 0)
{
printf(“a bang 0\n”);
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>;
Câu lệnh điều kiện và rẽ nhánh
5
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Câu lệnh if (đủ)
void main()
{
if (a == 0)
printf(“a bang 0\n”);
else
printf(“a khac 0\n”);
if (a == 0)
{
printf(“a bang 0\n”);
a = 2912;
}
else
printf(“a khac 0\n”);
}
if (a !=0)
{
if (b > 0)
printf(“a != 0 va b > 0\n”);
else
printf(“a != 0 va b <= 0\n”);
} 8
Câu lệnh điều kiện và rẽ nhánh
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Câu lệnh if - Một số lưu ý
if (delta < 0)
printf(“PT vo nghiem\n”);
else // delta >= 0
if (delta == 0)
printf(“PT co nghiem kep\n”);
else
printf(“PT co 2 nghiem\n”);
Câu lệnh điều kiện và rẽ nhánh
9
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Câu lệnh if - Một số lưu ý
if (a != 0);
printf(“a khac 0\n”);
if (a != 0)
{
};
printf(“a khac 0\n”);
}
Câu lệnh điều kiện và rẽ nhánh
10
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Câu lệnh switch (thiếu)
switch (<Biến/BT>)
{
Đ
<Biến/BT>
<Lệnh 1> case <GT1>:<L1>;break;
= <GT1>
case <GT2>:<L2>;break;
S …
Đ
<Biến/BT>
= <GT2>
<Lệnh 2> }
S <Biến/BT> là
biến/biểu thức cho
giá trị rời rạc.
<Lệnh> : đơn hoặc
khối lệnh {}.
void main()
{
int a;
printf(“Nhap a: ”);
scanf(“%d”, &a);
switch (a)
{
case 1: printf(“Mot\n”); break;
case 2: printf(“Hai\n”); break;
case 3: printf(“Ba\n”); break;
}
}
void main()
{
int a;
printf(“Nhap a: ”);
scanf(“%d”, &a);
switch (a)
{
case 1: printf(“Mot\n”); break;
case 2: printf(“Hai\n”); break;
case 3: printf(“Ba\n”); break;
default: printf(“Ko biet doc\n”);
}
}
if (a == 1) switch (a)
printf(“Mot\n”); {
if (a == 2) case 1: printf(“Mot\n”);
printf(“Hai\n”); break;
if (a == 3) case 2: printf(“Hai\n”);
printf(“Ba\n”); break;
if (a == 4) case 3: printf(“Ba\n”);
printf(“Bon\n”); break;
if (a == 5) case 4: printf(“Bon\n”);
printf(“Nam\n”); break;
case 5: printf(“Nam\n”);
}
Câu lệnh điều kiện và rẽ nhánh
20
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Kinh nghiệm lập trình
1
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nội dung
Đặ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‟.
Các kiểu dữ liệu cơ sở
8
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Biến
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)
Các kiểu dữ liệu cơ sở
10
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
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;
Các kiểu dữ liệu cơ sở
11
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Biểu thức
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 nA, nB, nC, nD, nE, nThuong;
nA = 10;
nB = nA;
nThuong = nA / nB;
nA = nB = nC = nD = nE = 156;
nE = 156;
nD = nE;
nC = nD;
nB = nC;
nA = nB;
}
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
Các kiểu dữ liệu cơ sở
15
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Các toán tử toán học
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; f = float(1) / 2; g = float(1 / 2);
h = 1 % 2;
x = x * (2 + 3*5); x *= 2 + 3*5;
Các kiểu dữ liệu cơ sở
16
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Các toán tử trên bit
^ 0 1 ~ 0 1
0 0 1 1 0
1 1 0 17
Các kiểu dữ liệu cơ sở
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Các toán tử trên bit
Ví dụ
void main()
{
int nA = 5; // 0000 0000 0000 0101
int nB = 6; // 0000 0000 0000 0110
Ví dụ
• s1 = (1 > 2) && (3 > 4);
• s2 = (1 > 2) || (3 > 4);
• s3 = !(1 > 2);
Các kiểu dữ liệu cơ sở
20
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Toán tử điều kiện
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;
Toán tử Độ ưu tiên
() [] -> .
! ++ -- - + * (cast) & sizeof
* / %
+ -
<< >>
< <= > >=
== !=
&
|
^
&&
||
?:
= += -= *= /= %= &= …
,
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; 26
Các kiểu dữ liệu cơ sở
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Câu lệnh
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
Thư viện
#include <stdio.h> (standard input/output)
Cú pháp
printf(<chuỗi định dạng>[, <đs1>, <đs2>, …]);
<chuỗi định dạng> là cách trình bày thông tin
xuất và được đặt trong cặp nháy kép “ ”.
• Văn bản thường (literal text)
• Ký tự điều khiển (escape sequence)
• Đặc tả (conversion specifier)
Ví dụ
printf(“\t”); printf(“\n”);
printf(“\t\n”); Các kiểu dữ liệu cơ sở
30
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Chuỗi định dạng
Ví dụ
int a = 10, b = 20;
printf(“%d”, a); Xuất ra 10
printf(“%d”, b); Xuất ra 20
printf(“%d %d”, a, b); Xuất ra 10 20
float x = 15.06;
printf(“%f”, x); Xuất ra 15.060000
printf(“%f”, 1.0/3); Xuất ra 0.333333
Cú pháp
Định dạng xuất số nguyên: %nd, %nld
Định dạng xuất số thực: %n.kf, %n.lf
int a = 1706;
float x = 176.85;
printf(“%10d”, a); printf(“\n”);
printf(“%10.2f”, x); printf(“\n”);
printf(“%.2f”, x); printf(“\n”);
1 7 0 6
1 7 6 . 8 5
1 7 6 . 8 5
Thư viện
#include <stdio.h> (standard input/output)
Cú pháp
scanf(<chuỗi định dạng>[, <đs1>, <đs1>, …]);
<chuỗi định dạng> giống định dạng xuất
nhưng chỉ có các đặc tả.
Các đối số là tên các biến sẽ chứa giá trị
nhập và được đặt trước dấu &
Ví dụ
int x = 4, y = 3, z = -5;
float t = -1.2;
float kq1 = sqrt(x);
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);
Các kiểu dữ liệu cơ sở
38
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Bài tập
1
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nội dung
Ví dụ
Viết chương trình xuất các số từ 1 đến 10
=> Sử dụng 10 câu lệnh printf
Viết chương trình xuất các số từ 1 đến 1000
=> Sử dụng 1000 câu lệnh printf !
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
<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);
<Bước nhảy>
int i = 0;
for (; i < 10; i++)
printf(“%d\n”, i); Đ
<Đ/K lặp> <Lệnh>
<Bước nhảy>
for (i = 0; i < 10; )
{
printf(“%d\n”, i); Đ
<Đ/K lặp> <Lệnh>
i++;
}
S
for (i = 0; ; i++)
printf(“%d\n”, i);
for (i = 0; ; i++)
{
if (i >= 10)
break;
printf(“%d\n”, i);
} 9
Câu lệnh lặp
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Câu lệnh for - Một số lưu ý
Đ
<Đ/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++;
}
Câu lệnh lặp
14
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Câu lệnh while - Một số lưu ý
n = 1;
while (n < 10)
printf(“%d\n”, n);
}
Câu lệnh lặp
18
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Câu lệnh do… while
<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)
Câu lệnh lặp
19
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
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++;
}
Câu lệnh lặp
20
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Câu lệnh do… while - Một số lưu ý
n = 1;
do
printf(“%d\n”, n);
while (n < 10);
… 23
Câu lệnh lặp
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
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); 24
Câu lệnh lặp
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
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); 25
Câu lệnh lặp
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
while & do… while
1
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nội dung
1 Khái niệm
2 Khai báo
Ví dụ
Chương trình cần lưu trữ 3 số nguyên?
=> Khai báo 3 biến int a1, a2, a3;
Chương trình cần lưu trữ 100 số nguyên?
=> Khai báo 100 biến kiểu số nguyên!
Người dùng muốn nhập n số nguyên?
=> Không thực hiện được!
Giải pháp
Kiểu dữ liệu mới cho phép lưu trữ một dãy
các số nguyên và dễ dàng truy xuất. 3
Mảng một chiều
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Dữ liệu kiểu mảng
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.
Tường minh
<kiểu cơ sở> <tên biến mảng>[<số phần tử>];
<kiểu cơ sở> <tên biến mảng>[<N1>][<N2>]…[<Nn>];
Ví dụ
int Mang1Chieu[10];
0 1 2 3 4 5 6 7 8 9
Mang1Chieu
int Mang2Chieu[3][4];
0 1 2 3 4 5 6 7 8 9 10 11
Mang2Chieu 0
1
2
Cú pháp
Không tường minh (thông qua khai báo kiểu)
typedef <kiểu cơ sở> <tên kiểu mảng>[<số phần tử>];
typedef <kiểu cơ sở> <tên kiểu mảng>[<N1>]…[<Nn>];
Ví dụ
typedef int Mang1Chieu[10];
typedef int Mang2Chieu[3][4];
0 1 2 3
a 2912 1706 0 0
a 0 0 0 0
0 1 2 3
a 2912 1706 1506 1904
Ví dụ
Cho mảng như sau 0 1 2 3
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!
Ví dụ
#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];
Mảng một chiều
12
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Một số lỗi thường gặp
Các hàm
Hàm void HoanVi(int &x, int &y): hoán vị giá trị
của hai số nguyên.
Hàm int LaSNT(int n): kiểm tra một số có phải
là số nguyên tố. Trả về 1 nếu n là số nguyên
tố, ngược lại trả về 0.
int LaSNT(int n)
{
int i, dem = 0;
for (i = 1; i <= n; i++)
if (n % i == 0)
dem++;
if (dem == 2)
return 1;
else return 0;
}
Mảng một chiều
18
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nhập mảng
Yêu cầu
Cho phép nhập mảng a, số lượng phần tử n
Ý tưởng
Cho trước một mảng có số lượng phần tử là MAX.
Nhập số lượng phần tử thực sự n của mảng.
Nhập từng phần tử cho mảng từ chỉ số 0 đến n – 1.
0 1 2 3 n4
-1 MAX - 1
… … …
Yêu cầu
Cho trước mảng a, số lượng phần tử n. Hãy xuất nội
dung mảng a ra màn hình.
Ý tưởng
Xuất giá trị từng phần tử của mảng từ chỉ số 0 đến n-1.
0 1 2 n-1 MAX - 1
… … …
printf(“\n”);
}
Yêu cầu
Tìm xem phần tử x có nằm trong mảng a kích thước n
hay không? Nếu có thì nó nằm ở vị trí đầu tiên nào.
Ý tưởng
Xét từng phần của mảng a. Nếu phần tử đang xét bằng
x thì trả về vị trí đó. Nếu kô tìm được thì trả về -1.
x vị trí = 1
0 1 2 n-1 MAX - 1
a x b … x … …
if (vt < n)
return vt;
else
return -1;
}
return -1;
}
Yêu cầu
Cho trước mảng a, số lượng phần tử n. Mảng a có
phải là mảng toàn các số nguyên tố hay không?
Ý tưởng
Cách 1: Đếm số lượng số ngtố của mảng. Nếu số
lượng này bằng đúng n thì mảng toàn ngtố.
Cách 2: Đếm số lượng số không phải ngtố của mảng.
Nếu số lượng này bằng 0 thì mảng toàn ngtố.
Cách 3: Tìm xem có phần tử nào không phải số ngtố
không. Nếu có thì mảng không toàn số ngtố.
if (dem == n)
return 1;
return 0;
}
if (dem == 0)
return 1;
return 0;
}
return 1;
}
Yêu cầu
Cho trước mảng a, số lượng phần tử na. Tách các số
nguyên tố có trong mảng a vào mảng b.
Ý tưởng
Duyệt từ phần tử của mảng a, nếu đó là số nguyên tố
thì đưa vào mảng b.
Yêu cầu
Cho trước mảng a, số lượng phần tử na. Tách mảng
a thành 2 mảng b (chứa số nguyên tố) và mảng c
(các số còn lại).
Ý tưởng
Cách 1: viết 1 hàm tách các số nguyên tố từ mảng a
sang mảng b và 1 hàm tách các số không phải
nguyên tố từ mảng a sang mảng c.
Cách 2: Duyệt từ phần tử của mảng a, nếu đó là số
nguyên tố thì đưa vào mảng b, ngược lại đưa vào
mảng c.
Yêu cầu
Cho trước mảng a, số lượng phần tử na và mảng b
số lượng phần tử nb. Gộp 2 mảng trên theo tứ tự đó
thành mảng c, số lượng phần tử nc.
Ý tưởng
Chuyển các phần tử của mảng a sang mảng c
=> nc = na
Tiếp tục đưa các phần tử của mảng b sang mảng c
=> nc = nc + nb
Yêu cầu
Cho trước mảng a có n phần tử. Tìm giá trị lớn nhất
trong a (gọi là max)
Ý tưởng
Giả sử giá trị max hiện tại là giá trị phần tử đầu tiên a[0]
Lần lượt kiểm tra các phần tử còn lại để cập nhật max.
max 8
7
?
0 1 2 n–1 MAX - 1
7 2 8 … 8 … …
return max;
}
Yêu cầu
Cho trước mảng a kích thước n. Hãy sắp xếp mảng a
đó sao cho các phần tử có giá trị tăng dần.
Ý tưởng
Sử dụng 2 biến i và j để so sánh tất cả cặp phần tử
với nhau và hoán vị các cặp nghịch thế (sai thứ tự).
tạm 5
8
0 1 2 n–1 MAX - 1
5
1 1
5 8
6 … 6
8 … …
38
i j j j j Mảng một chiều
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm Sắp Xếp Tăng
Yêu cầu
Thêm phần tử x vào mảng a kích thước n tại vị trí vt.
Ý tưởng
“Đẩy” các phần tử bắt đầu tại vị trí vt sang phải 1 vị trí.
Đưa x vào vị trí vt trong mảng.
Tăng n lên 1 đơn vị.
x chèn?
0 1 2 3 n–1 n MAX - 1
a b c … z … …
a[vt] = x;
n++;
}
}
Yêu cầu
Xóa một phần tử trong mảng a kích thước n tại vị trí vt
Ý tưởng
“Kéo” các phần tử bên phải vị trí vt sang trái 1 vị trí.
Giảm n xuống 1 đơn vị.
xóa?
a x b … z … …
n--;
}
}
HÀM
1
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nội dung
2 Tầm vực
4 Đệ quy
Hàm
2
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Đặt vấn đề
Hàm
3
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Đặt vấn đề
do {
printf(“Nhap mot so nguyen duong: ”);
scanf(“%d”, &b);
} while (b <= 0);
do {
printf(“Nhap mot so nguyen duong: ”);
scanf(“%d”, &c);
} while (c <= 0);
Hàm
4
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Đặt vấn đề
// Tính s2 = b! = 1 * 2 * … * b
s2 = 1;
for (i = 2; i <= b ; i++)
s2 = s2 * i;
// Tính s3 = c! = 1 * 2 * … * c
s3 = 1;
for (i = 2; i <= c ; i++)
s3 = s3 * i;
Hàm
5
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Đặt vấn đề
Hàm
6
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm
Khái niệm
Một đoạn chương trình có tên, đầu vào và
đầu ra.
Có chức năng giải quyết một số vấn đề
chuyên biệt cho chương trình chính.
Được gọi nhiều lần với các tham số khác
nhau.
Được sử dụng khi có nhu cầu:
• Tái sử dụng.
• Sửa lỗi và cải tiến.
Hàm
7
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm
Cú pháp
<kiểu trả về> <tên hàm>([<danh sách tham số>])
{
<các câu lệnh>
[return <giá trị>;]
}
Trong đó
• <kiểu trả về> : kiểu bất kỳ của C (char, int, long,
float,…). Nếu không trả về thì là void.
• <tên hàm>: theo quy tắc đặt tên định danh.
• <danh sách tham số> : tham số hình thức đầu vào
giống khai báo biến, cách nhau bằng dấu ,
• <giá trị> : trả về cho hàm qua lệnh return. 8
Hàm
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Các bước viết hàm
Đầu vào 1
Tên hàm
Đầu vào 2 Đầu ra (nếu có)
Các công việc
Đầu vào n
sẽ thực hiện
Hàm
9
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm
Ví dụ 1
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\n”, x, y, s);
}
Hàm
10
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm
Ví dụ 2
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;
}
Hàm
11
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Chương trình con - Function
Ví dụ 3
Tên hàm: NhapXuatTong
Công việc: nhập và xuất tổng 2 số nguyên
Đầu vào: không có
Đầu ra: không có
void NhapXuatTong()
{
int x, y;
printf(“Nhap 2 so nguyen: ”);
scanf(“%d%d”, &x, &y);
printf(“%d cong %d bang %d\n”, x, y, x + y);
}
Hàm
12
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Tầm vực
Khái niệm
Là phạm vi hiệu quả của biến và hàm.
Biến:
• Toàn cục: khai báo trong ngoài tất cả các hàm (kể
cả hàm main) và có tác dụng lên toàn bộ chương
trình.
• Cục bộ: khai báo trong hàm hoặc khối { } và chỉ có
tác dụng trong bản thân hàm hoặc khối đó (kể cả
khối con nó). Biến cục bộ sẽ bị xóa khỏi bộ nhớ khi
kết thúc khối khai báo nó.
Hàm
13
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Tầm vực
int a;
int Ham1()
{
int a1;
}
int Ham2()
{
int a2;
{
int a21;
}
}
void main()
{
int a3;
}
Hàm
14
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Một số lưu ý
void main()
{
…
}
Hàm
16
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Các cách truyền đối số
Hàm
17
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Các cách truyền đối số
Hàm
18
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Lưu ý khi truyền đối số
Lưu ý
Trong một hàm, các tham số có thể truyền
theo nhiều cách.
void HonHop(int x, int &y)
{
…
x++;
y++;
}
Hàm
19
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Lưu ý khi truyền đối số
Lưu ý
Sử dụng tham chiếu là một cách để trả về giá
trị cho chương trình.
int TinhTong(int x, int y)
{
return x + y;
}
void TinhTong(int x, int y, int &tong)
{
tong = x + y;
}
void TinhTongHieu(int x, int y, int &tong, int &hieu)
{
tong = x + y; hieu = x – y;
20
} Hàm
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Lời gọi hàm
Hàm
21
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Lời gọi hàm
Ví dụ
// Các hàm được khai báo ở đây
void main()
{
int n = 9;
XuatTong(1, 2);
XuatTong(1, n);
TinhTong(1, 2);
int tong = TinhTong(1, 2);
TruyenGiaTri(1);
TruyenGiaTri(n);
TruyenDiaChi(1);
TruyenDiaChi(&n);
TruyenThamChieu(1);
TruyenThamChieu(n);
} Hàm
22
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Lời gọi chương trình con
Ví dụ
void HoanVi(int &a, int &b);
void main()
{
HoanVi(2912, 1706);
int x = 2912, y = 1706;
HoanVi(x, y);
}
void HoanVi(int &a, int &b)
{
int tam = a;
a = b;
b = tam;
}
Hàm
23
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Đệ 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)
Ví dụ
Tính S(n) = n! = 1*2*…*(n-1)*n
Ta thấy S(n) = S(n-1)*n
Vậy thay vì tính S(n) ta sẽ đi tính S(n-1)
Tương tự tính S(n-2), …, S(2), S(1), S(0) = 1 24
Hàm
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Đệ quy
Ví dụ
int GiaiThua(int n)
{
if (n == 0)
return 1;
else
return GiaiThua(n – 1) * n;
}
int GiaiThua(int n)
{
if (n > 0)
return GiaiThua(n – 1) * n;
else
return 1;
}
Hàm
25
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Bài tập
Hàm
26
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Bài tập
2. Bài tập chương câu lệnh lặp. Hàm nhận vào một
số nguyên dương n và thực hiện:
a. Trả về số đảo của số đó.
b. Có phải là số đối xứng (Trả về True/False)
c. Có phải là số chính phương.
d. Có phải là số nguyên tố.
e. Tổng các chữ số lẻ.
f. Tổng các chữ số nguyên tố.
g. Tổng các chữ số chính phương.
Hàm
27
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Bài tập
3. Bài tập chương Câu lệnh lặp. Hàm nhận vào một
số nguyên dương n và thực hiện:
a. S = 1 + 2 + … + n
b. S = 12 + 22 + … + n2
c. S = 1 + 1/2 + … + 1/n
d. S = 1 * 2 * … * n
e. S = 1! + 2! + … + n!
4. Hàm trả về USCLN của 2 số nguyên.
5. In ra n phần tử của dãy Fibonacy.
Hàm
28
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Trường Đại học Khoa học Tự nhiên
Khoa Công nghệ thông tin
Bộ môn Công nghệ phần mềm
TẬP TIN
1
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nội dung
Tập tin
2
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nhập xuất
Khái niệm
C lưu dữ liệu (biến, mảng, cấu trúc, …) trong
bộ nhớ RAM.
Dữ liệu được nạp vào RAM và gửi ra ngoài
chương trình thông qua các thiết bị (device)
• Thiết bị nhập (input device): bàn phím, con chuột
• Thiết bị xuất (output device): màn hình, máy in
• Thiết bị vừa nhập vừa xuất: tập tin
Các thiết bị đều thực hiện mọi xử lý thông
qua các dòng (stream).
Tập tin
3
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Stream (dòng)
Khái niệm
Là môi trường trung gian để giao tiếp (nhận/
gửi thông tin) giữa chương trình và thiết bị.
Muốn nhận/gửi thông tin cho một thiết bị
ta sẽ gửi thông tin cho stream nối với thiết bị
đó (độc lập thiết bị).
Stream là dãy byte dữ liệu
• “Chảy” vào chương trình gọi là stream nhập.
• “Chảy” ra chương trình gọi là stream xuất.
Tập tin
4
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Stream (dòng)
Phân loại
Stream văn bản (text)
• Chỉ chứa các ký tự.
• Tổ chức thành từng dòng, mỗi dòng tối đa 255 ký
tự, kết thúc bởi ký tự cuối dòng „\0‟ hoặc ký tự
sang dòng mới „\n‟.
Stream nhị phân (binary)
• Chứa các byte.
• Được đọc và ghi chính xác từng byte.
• Xử lý dữ liệu bất kỳ, kể cả dữ liệu văn bản.
• Được sử dụng chủ yếu với các tập tin trên đĩa.
Tập tin
5
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Stream (dòng)
Nhu cầu
Dữ liệu giới hạn và được lưu trữ tạm thời
• Nhập: gõ từ bàn phím.
• Xuất: hiển thị trên màn hình.
• Lưu trữ dữ liệu: trong bộ nhớ RAM.
Mất thời gian, không giải quyết được bài
toán với số dữ liệu lớn.
Cần một thiết bị lưu trữ sao cho dữ liệu vẫn
còn khi kết thúc chương trình, có thể sử dụng
nhiều lần và kích thước không hạn chế.
Tập tin
7
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Tập tin
Khái niệm
Tập hợp thông tin (dữ liệu) được tổ chức theo
một dạng nào đó với một tên xác định.
Một dãy byte liên tục (ở góc độ lưu trữ).
Được lưu trữ trong các thiết bị lưu trữ ngoài
như đĩa mềm, đĩa cứng, USB…
• Vẫn tồn tại khi chương trình kết thúc.
• Kích thước không hạn chế (tùy vào thiết bị lưu trữ)
Cho phép đọc dữ liệu (thiết bị nhập) và ghi
dữ liệu (thiết bị xuất).
Tập tin
8
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Tập tin
Phân loại
Theo người sử dụng: quan tâm đến nội dung
tập tin nên sẽ phân loại theo phần mở rộng
.EXE, .COM, .CPP, .DOC, .PPT, …
Theo người lập trình: tự tạo các stream tường
minh để kết nối với tập tin xác định nên sẽ
phân loại theo cách sử dụng stream trong C
tập tin kiểu văn bản (ứng với stream
văn bản) và tập tin kiểu nhị phân (ứng với
stream nhị phân).
Tập tin
9
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Phân loại tập tin
Tập tin
11
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Quy tắc đặt tên tập tin
Tập tin
12
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Định vị tập tin
Đường dẫn
Chỉ đến một tập tin không nằm trong thư mục
hiện hành. Ví dụ: c:\data\list.txt chỉ tập tin
list.txt nằm trong thư mục data của ổ đĩa C.
Trong chương trình, đường dẫn này được ghi
trong chuỗi như sau: “c:\\data\\list.txt”
Dấu „\‟ biểu thị ký tự điều khiển nên để thể
hiện nó ta phải thêm một dấu „\‟ ở trước.
Nhưng nếu chương trình yêu cầu nhập đường
dẫn từ bàn phím thì chỉ nhập một dấu „\‟.
Tập tin
13
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Quy trình thao tác với tập tin
1. Mở tập tin: tạo một stream nối kết với tập tin
cần mở, stream được quản lý bởi biến con trỏ
đến cấu trúc FILE
Cấu trúc được định sẵn trong STDIO.H
Các thành phần của cấu trúc này được dùng
trong các thao tác xử lý tập tin.
2. Sử dụng tập tin (sau khi đã mở được tập tin)
Đọc dữ liệu từ tập tin đưa vào chương trình.
Ghi dữ liệu từ chương trình lên tập tin.
3. Đóng tập tin (sau khi sử dụng xong).
Tập tin
14
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm mở tập tin
Tập tin
15
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Đối số mở tập tin (mode)
Đối số Ý nghĩa
b Mở tập tin kiểu nhị phân (binary)
t Mở tập tin kiểu văn bản (text) (mặc định)
r Mở tập tin chỉ để đọc dữ liệu từ tập tin. Trả về
NULL nếu không tìm thấy tập tin.
w Mở tập tin chỉ để ghi dữ liệu vào tập tin. Tập
tin sẽ được tạo nếu chưa có, ngược lại dữ liệu
trước đó sẽ bị xóa hết.
a Mở tập tin chỉ để thêm (append) dữ liệu vào
cuối tập tin. Tập tin sẽ được tạo nếu chưa có.
r+ Giống mode r và bổ sung thêm tính năng ghi
dữ liệu và tập tin sẽ được tạo nếu chưa có.
w+ Giống mode w và bổ sung thêm tính năng đọc.
a+ Giống mode a và bổ sung thêm tính năng đọc.
Tập tin
16
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Đọc và ghi dữ liệu (stdio.h)
Tập tin
18
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm nhập theo định dạng
Tập tin
19
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm nhập theo định dạng
Ví dụ
Một tập tin chứa nhiều dòng, mỗi dòng là
thông tin mỗi sinh viên theo định dạng sau:
• <MSSV>-<Tên>(<Phái>)tab<NTNS>tab<ĐTB>
• Ví dụ: 0312078-H. P. Trang(Nu) 17/06/85 8.5
Đọc chuỗi thông tin phức hợp
%[chuỗi]: đọc cho đến khi không gặp ký tự
nào trong chuỗi thì dừng.
%[^chuỗi]: đọc cho đến khi gặp một trong
những ký tự trong chuỗi thì dừng.
Tập tin
20
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm Tách 2 Mảng
Tập tin
22
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm nhập chuỗi
Tập tin
23
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm xuất ký tự
int putc(int ch, FILE *fp) và int fputc(in ch, FILE *fp)
Tập tin
24
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm xuất chuỗi
Tập tin
25
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm xuất trực tiếp
Tập tin
26
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm nhập trực tiếp
Tập tin
27
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm đóng tập tin xác định
Tập tin
28
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm đóng tất cả stream
int fcloseall()
Tập tin
29
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
“Vét” dữ liệu trong stream
Khái niệm
Được tạo tự động khi mở tập tin.
Xác định nơi diễn ra việc đọc/ghi trong tập tin
Vị trí con trỏ chỉ vị
Khi tập tin chưa mở: ở đầu tập tin (giá trị 0).
Khi mở tập tin:
• Ở cuối tập tin khi mở để chèn (mode a hay a+)
• Ở đầu tập tin (hay giá trị 0) khi mở với các mode
khác (w, w+, r, r+).
Tập tin
31
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Truy xuất tuần tự & ngẫu nhiên
Không
Tập tin
33
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm tái định vị con trỏ chỉ vị
Tập tin
34
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm xác định vị trí con trỏ chỉ vị
Tập tin
35
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Dấu hiệu kết thúc tập tin
if (remove(“c:\\vc.txt”) == 0)
printf(“Tap tin vc.txt da bi xoa!”);
else
printf(“Ko xoa duoc tap tin vc.txt!”);
Tập tin
38
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm đổi tên tập tin
if (rename(“c:\\a.txt”, “c:\\BT\b.cpp”) == 0)
printf(“Doi ten tap tin thanh cong”);
else
printf(“Doi ten tap tin that bai”);
Tập tin
39
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Bài tập lý thuyết
Tập tin
42
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Bài tập lý thuyết
Bài 8: Cách xác định cuối tập tin trong kiểu văn
bản và kiểu nhị phân?
Sử dụng hàm foef cho cả hai kiểu tập tin.
Trong kiểu văn bản có thể sử dụng hằng EOF.
Bài 9: Con trỏ chỉ vị là gì và cách thay đổi nó?
Con trỏ chỉ vị đánh dấu vị trí trong của một
tập tin, nơi diễn ra các thao tác đọc/ghi.
Thay đổi vị trí con trỏ chỉ vị bằng hàm rewind
(về đầu tập tin) và fseek (về vị trí bất kỳ).
Tập tin
43
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Bài tập lý thuyết
Tập tin
45
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Bài tập thực hành
Bài 17: Viết chương trình ghi các dòng văn bản
được nhập từ bàn phím lên tập tin.
Bài 18: Viết chương trình in nội dung một tập tin
lên màn hình.
Bài 19: Viết chương trình đếm số ký tự chữ cái
của tập tin và xuất kết quả ra một tập tin khác.
Bài 20: Viết chương trình đếm số từ của tập tin
và xuất kết quả ra một tập tin khác.
Bài 21: Viết chương trình đếm số lần lặp lại của
một từ trong một tập tin.
Tập tin
47
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Bài tập thực hành
1
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nội dung
1 Khái niệm
2 Khai báo
0 1 … n-1 0 … n-1
0 0
Am,n An
…
…
m-1 n-1
0 0 0
An
…
…
n-1 n-1 n-1
0 0 0
An
…
…
n-1 n-1 n-1
dòng + cột = n-1 dòng + cột > n-1 dòng + cột < n-1
Mảng hai chiều
4
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Khai báo kiểu mảng 2 chiều
Cú pháp
typedef <kiểu cơ sở> <tên kiểu>[<N1>][<N2>];
0 1 2 3
Kiểu MaTran 1
Cú pháp
Tường minh
<kiểu cơ sở> <tên biến>[<N1>][<N2>];
Ví dụ
Tường minh
int a[10][20], b[10][20];
int c[5][10];
int d[10][20];
Không tường minh (thông qua kiểu)
typedef int MaTran10x20[10][20];
typedef int MaTran5x10[5][10];
MaTran10x20 a, b;
MaTran11x11 c;
MaTran10x20 d;
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]
b = a; // Sai
int i, j;
for (i = 0; i < 5; i++)
for (j = 0; j < 10; j++)
b[i][j] = a[i][j];
Mảng hai chiều
9
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Truyền mảng cho hàm
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
…
Kiểu dữ liệu
#define MAXD 50
#define MAXC 100
int LaSNT(int n)
{
int i, dem = 0;
for (i = 1; i <= n; i++)
if (n % i == 0)
dem++;
if (dem == 2)
return 1;
else return 0;
}
Mảng hai chiều
14
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nhập Ma Trận
Yêu cầu
Cho phép nhập mảng a, m dòng, n cột
Ý tưởng
Cho trước một mảng 2 chiều có dòng tối đa là MAXD,
số cột tối đa là MAXC.
Nhập số lượng phần tử thực sự m, n của mỗi chiều.
Nhập từng phần tử từ [0][0] đến [m-1][n-1].
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
{
printf(“Nhap a[%d][%d]: ”, i, j);
scanf(“%d”, &a[i][j]);
}
}
Yêu cầu
Cho phép nhập mảng a, m dòng, n cột
Ý tưởng
Xuất giá trị từng phần tử của mảng 2 chiều từ dòng
có 0 đến dòng m-1, mỗi dòng xuất giá giá trị của cột 0
đến cột n-1 trên dòng đó.
printf(“\n”);
}
}
Yêu cầu
Tìm xem phần tử x có nằm trong ma trận a kích
thước mxn hay không?
Ý tưởng
Duyệt từng phần của ma trận a. Nếu phần tử đang
xét bằng x thì trả về có (1), ngược lại trả về không có
(0).
Yêu cầu
Cho trước ma trận a kích thước mxn. Ma trận a có
phải là ma trậntoàn các số nguyên tố hay không?
Ý tưởng
Cách 1: Đếm số lượng số ngtố của ma trận. Nếu số
lượng này bằng đúng mxn thì ma trận toàn ngtố.
Cách 2: Đếm số lượng số không phải ngtố của ma
trận. Nếu số lượng này bằng 0 thì ma trận toàn ngtố.
Cách 3: Tìm xem có phần tử nào không phải số ngtố
không. Nếu có thì ma trận không toàn số ngtố.
if (dem == m * n)
return 1;
return 0;
}
if (dem == 0)
return 1;
return 0;
}
return 1;
}
Yêu cầu
Cho trước ma trận a, kích thước mxn. Tính tổng các
phần tử trên:
• Dòng d, cột c
• Đường chéo chính, đường chéo phụ (ma trận vuông)
• Nửa trên/dưới đường chéo chính (ma trận vuông)
• Nửa trên/dưới đường chéo phụ (ma trận vuông)
Ý tưởng
Duyệt ma trận và cộng dồn các phần tử có tọa độ (dòng,
cột) thỏa yêu cầu.
tong = 0;
return tong;
}
tong = 0;
return tong;
}
tong = 0;
return tong;
}
tong = 0;
return tong;
}
tong = 0;
return tong;
}
tong = 0;
return tong;
}
Yêu cầu
Cho trước ma trận a, kích thước mxn. Tìm giá trị lớn
nhất trong ma trận a (gọi là max)
Ý tưởng
Giả sử giá trị max hiện tại là giá trị phần tử đầu tiên
a[0][0]
Lần lượt kiểm tra các phần tử còn lại để cập nhật max.
max = a[0][0];
return max;
}
CHUỖI KÝ TỰ
1
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nội dung
1 Khái niệm
2 Khởi tạo
4 Bài tập
Chuỗi ký tự
2
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Khái niệm
Khái niệm
Kiểu char chỉ chứa được một ký tự. Để lưu
trữ một chuỗi (nhiều ký tự) ta sử dụng mảng
(một chiều) các ký tự.
Chuỗi ký tự kết thúc bằng ký tự „\0‟ (null)
Độ dài chuỗi = kích thước mảng – 1
Ví dụ
char szHoten[30]; // Dài 29 ký tự
char szNgaySinh[9]; // Dài 8 ký tự
Chuỗi ký tự
3
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Khởi tạo
Chuỗi ký tự
4
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Xuất chuỗi
Chuỗi ký tự
5
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nhập chuỗi
Chuỗi ký tự
6
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nhập chuỗi
Chuỗi ký tự
7
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Một số hàm thao tác trên chuỗi
Chuỗi ký tự
9
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm sao chép chuỗi
char s[100];
s = “Visual C++ 6.0”; // sai
strcpy(s, “Visual C++ 6.0”); // đúng
Chuỗi ký tự
10
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm tạo bản sao
char *s;
s = strdup(“Visual C++ 6.0”);
Chuỗi ký tự
11
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm chuyển thành chuỗi thường
Chuỗi ký tự
12
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm chuyển thành chuỗi IN
Chuỗi ký tự
13
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm đảo ngược chuỗi
Chuỗi ký tự
14
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm so sánh hai chuỗi
Chuỗi ký tự
15
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm so sánh hai chuỗi
Chuỗi ký tự
16
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm nối hai chuỗi
Chuỗi ký tự
17
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm tìm chuỗi trong chuỗi
Chuỗi ký tự
18
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Bài tập
1
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nội dung
4 Bài tập
Thông tin 1 SV
MSSV: kiểu chuỗi
Tên SV: kiểu chuỗi
NTNS: kiểu chuỗi
Phái: kiểu ký tự
Điểm Toán, Lý, Hóa: kiểu số thực
Yêu cầu
Lưu thông tin n SV?
Truyền thông tin n SV vào hàm?
Dữ liệu kiểu cấu trúc
3
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Đặt vấn đề
Nhận xét
Đặt tên biến khó khăn và khó quản lý
Truyền tham số cho hàm quá nhiều
Tìm kiếm, sắp xếp, sao chép,… khó khăn
Tốn nhiều bộ nhớ
…
Ý tưởng
Gom những thông tin của cùng 1 SV thành
một kiểu dữ liệu mới => Kiểu struct
Cú pháp
struct <tên kiểu cấu trúc>
{
<kiểu dữ liệu> <tên thành phần 1>;
…
<kiểu dữ liệu> <tên thành phần n>;
};
Ví dụ
struct SDiem2D
{
int m_nX;
int m_nY;
};
Ví dụ
struct SDiem2D
{
int m_nX;
int m_nY;
} diem2D1, diem2D2;
Cú pháp
typedef struct
{
<kiểu dữ liệu> <tên thành phần 1>;
…
<kiểu dữ liệu> <tên thành phần n>;
} <tên kiểu cấu trúc>;
<tên kiểu cấu trúc> <tên biến>;
Ví dụ
typedef struct
{
int m_nX;
int m_nY;
} SDiem2D;
struct SDiem2D diem2D1, diem2D2;
Dữ liệu kiểu cấu trúc
9
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Khởi tạo cho biến cấu trúc
Ví dụ
struct SDiem2D
{
int m_nX;
int m_nY;
} diem2D1 = {2912, 1706}, diem2D2;
Đặc điểm
Không thể truy xuất trực tiếp
Thông qua toán tử thành phần cấu trúc . hay
còn gọi là toán tử chấm (dot operation)
<tên biến cấu trúc>.<tên thành phần>
Ví dụ
struct SDiem2D
{
int m_nX;
int m_nY;
} diem2D1;
printf(‚x = %d, y = %d‛, diem2D1.m_nX, diem2D1.m_nY);
Dữ liệu kiểu cấu trúc
11
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Gán dữ liệu kiểu cấu trúc
Có 2 cách
<biến cấu trúc đích> = <biến cấu trúc nguồn>;
struct SHinhChuNhat
{
struct SDiem2D m_diem2DTraiTren;
struct SDiem2D m_diem2DPhaiDuoi;
} hinhChuNhat1;
…
hinhChuNhat1.m_diem2DTraiTren.m_nX = 2912;
hinhChuNhat1.m_diem2DPhaiDuoi.m_nY = 1706;
Dữ liệu kiểu cấu trúc
13
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Cấu trúc phức tạp
struct SNut
{
int m_nKhoa;
struct SNut *m_pNut;
};
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Ví dụ
struct SA
{
int m_nA;
double m_nB;
};
sizeof(A) = ???
Lưu ý
Kiểu cấu trúc được định nghĩa để làm khuôn
dạng còn biến cấu trúc được khai báo để sử
dụng khuôn dạng đã định nghĩa.
Trong C++, có thể bỏ từ khóa struct khi khai
báo biến (hoặc sử dụng typedef)
Khi nhập các biến kiểu số thực trong cấu trúc
phải nhập thông qua một biến trung gian.
struct SDiem2D { float m_nX, m_nY; } diem2D1;
float fTam;
scanf(‚%f‛, &fTam); diem2D1.m_nX = fTam;
Dữ liệu kiểu cấu trúc
20
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Mảng cấu trúc
SDiem2D arr1[20];
SDiem2D arr2[10] = {{3, 2}, {4, 4}, {2, 7}};
Khái niệm
Được khai báo và sử dụng như cấu trúc
Các thành phần của union có chung địa chỉ
đầu (nằm chồng lên nhau trong bộ nhớ)
Khai báo
union <tên kiểu union>
{
<kiểu dữ liệu> <tên thành phần 1>;
…
<kiểu dữ liệu> <tên thành phần 2>;
};
Ví dụ
struct SMyStruct union UMyUnion
{ {
char c; char c;
int n; int n;
} s; } u;
0 1 2 3 4 … … 0 1 2 3 … … …
01 02 00 00 00 … … 02 00 00 00 … … …
01
c n c
n
Dữ liệu kiểu cấu trúc
24
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Ví dụ
Phân số
Khai báo kiểu dữ liệu phân số (SPhanSo)
Nhập/Xuất phân số
Rút gọn phân số
Tính tổng, hiệu, tích, thương hai phân số
Kiểm tra phân số tối giản
Quy đồng hai phân số
Kiểm tra phân số âm hay dương
So sánh hai phân số
Dữ liệu kiểu cấu trúc
27
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Bài tập
Đơn thức
Khai báo kiểu dữ liệu đơn thức (SDonThuc)
Nhập/Xuất đơn thức
Tính tích, thương hai đơn thức
Tính đạo hàm cấp 1 của đơn thức
Tính đạo hàm cấp k của đơn thức
Tính giá trị đơn thức tại x = x0
Đa thức
Khai báo kiểu dữ liệu đa thức (SDaThuc)
Nhập/Xuất đa thức
Tính tổng, hiệu, tích hai đa thức
Tính đạo hàm cấp 1 của đa thức
Tính đạo hàm cấp k của đa thức
Tính giá trị đơn thức tại x = x0
Ngày
Khai báo kiểu dữ liệu ngày (SNgay)
Nhập/Xuất ngày (ngày, tháng, năm)
Kiểm tra năm nhuận
Tính số thứ tự ngày trong năm
Tính số thứ tự ngày kể từ ngày 1/1/1
Tìm ngày trước đó, sau đó k ngày
Tính khoảng cách giữa hai ngày
So sánh hai ngày
Dữ liệu kiểu cấu trúc
31
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Bài tập
Mảng phân số
Nhập/Xuất n phân số
Rút gọn mọi phân số
Đếm số lượng phân số âm/dương trong mảng
Tìm phân số dương đầu tiên trong mảng
Tìm phân số nhỏ nhất/lớn nhất trong mảng
Sắp xếp mảng tăng dần/giảm dần
Mảng điểm
Nhập/Xuất n điểm
Đếm số lượng điểm có hoành độ dương
Đếm số lượng điểm không trùng với các điểm
khác trong mảng
Tìm điểm có hoành độ lớn nhất/nhỏ nhất
Tìm điểm gần gốc tọa độ nhất
1
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Nội dung
Trong đó
• argc là số lượng đối số (tính luôn tên tập tin
chương trình)
• argv là mảng chứa các đối số (dạng chuỗi)
Ví dụ
Viết chương trình có tên Cong, nhận 2 đối số
x và y và xuất ra giá trị x + y.
argv = {“Cong.EXE”,
Cong.EXE “2912”,
2912 “1706”};
1706
argc = 3
Ví dụ
Viết chương trình có tên Cong, nhận 2 đối số
x và y và xuất ra giá trị x + y.
#include <stdio.h>
#include <stdlib.h> // atoi
void main(int argc, char *argv[]) {
if (argc == 3) {
int nX = atoi(argv[1]);
int nY = atoi(argv[2]);
printf(“%d + %d = %d”, nX, nY, nX+nY);
}
else
printf(“Sai! VD: Cong 2912 1706”);
}
Hàm nâng cao (phần 1)
6
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Các tham số của hàm main
Ví dụ
Viết chương trình có tên test nhận dữ liệu từ
tập tin input.txt, xử lý và xuất kết quả ra tập
tin output.txt.
argv = {“test”,
test “input.txt”,
input.txt “output.txt”};
output.txt
argc = 3
Ví dụ
Viết chương trình có tên test nhận dữ liệu từ
tập tin input.txt, xử lý và xuất kết quả ra tập
tin output.txt.
#include <stdio.h>
void main(int argc, char *argv[]) {
if (argc == 3) {
// Nhập dữ liệu từ tập tin argv[1]
// Xử lý
// Xuất kết quả ra tập tin argv[2]
}
else
printf(“Sai! VD: test in.txt out.txt\n”);
}
Hàm nâng cao (phần 1)
8
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm có đối số mặc định
Ví dụ
Viết hàm Tong để tính tổng 4 số x, y, z, t
int Tong(int x, int y, int z, int t)
{
return x + y + z + t;
}
Khái niệm
Hàm có đối số mặc định là hàm có một hay
nhiều tham số hình thức được gán giá trị.
Tham số này nhận giá trị mặc định đó nếu
không có đối số truyền vào cho tham số đó.
Phải được dồn về tận cùng bên phải.
Ví dụ
int Tong(int x, int y, int z = 0, int t = 0)
{
return x + y + z + t;
}
Hàm nâng cao (phần 1)
10
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm có đối số mặc định
Lưu ý
Muốn truyền đối số khác thay cho đối số mặc
định, phải truyền đối số thay cho các đối số
mặc định trước nó.
Ví dụ
In thông tin SV trong lớp gồm: họ tên, phái,
lớp, năm sinh
void xuatThongTin(char *szHoTen, char cPhai = 0,
char *szLop = “TH07”, int nNamSinh = 1989)
{
puts(szHoTen);
printf(cPhai == 0? “Nam\n” : “Nu\n”);
puts(szLop);
printf(“%d\n”, nNamSinh);
}
Ví dụ
In thông tin SV trong lớp gồm: họ tên, phái,
lớp, năm sinh
void main()
{
XuatThongTin(“Nguyen Van A”);
XuatThongTin(“Tran Thi B”, 1);
XuatThongTin(“Hoang Van C”, 0, “TH00”);
XuatThongTin(“Le D”, 1, “TH07”, 1988);
}
Nhận xét
x = a thường xuyên xảy ra thì nên chuyển x
thành tham số có đối số mặc định là a.
Ví dụ, hầu hết phai = 0 (nam), lop = “TH07”
và namsinh = 1989.
x = a và y = b thường xuyên xảy ra nhưng
y = b thường xuyên hơn thì nên đặt tham số
mặc định x trước y.
Ví dụ, lop = “TH07” xảy ra nhiều hơn
phai = 0 nên đặt lop sau phai.
Hàm nâng cao (phần 1)
14
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Chỉ thị tiền xử lý #define
Ví dụ
Xét 2 cách sau
#define PI 3.14159
float addPi(float s)
{
return s + PI;
}
void main()
{
float s = 0;
for (int i = 1; i <= 100000; i++)
s = s + PI; // Cách 1 (0.7s)
s = addPi(s); // Cách 2 (1.4s)
} 17
Hàm nâng cao (phần 1)
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm nội tuyến (inline)
Nhận xét
Sử dụng hàm giúp chương trình dễ hiểu nhưng
lại tốn chi phí cho lời gọi hàm.
Khắc phục
Sử dụng hàm nội tuyến (inline) bằng cách thêm
từ khóa inline trước prototype của hàm.
inline float addPi(float s) { return s + PI; }
Khái niệm
Sao chép thân hàm đến bất cứ nào nào hàm
được gọi kết quả giống hệt cách 1.
Hàm nâng cao (phần 1)
18
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm nội tuyến (inline)
Lưu ý
Giảm thời gian thực hiện hàm (gọi và kết thúc).
Giảm không gian bộ nhớ do các hàm con chiếm
dụng khi hàm được gọi.
Không cho phép các hàm nội tuyến đệ quy.
Phần lớn không cho phép thực hiện nội tuyến
các hàm sử dụng vòng lặp while.
Chỉ inline các hàm nhỏ, inline các hàm lớn sẽ gây
phản tác dụng (bộ nhớ cho hàm inline chiếm giữ
sẽ lâu giải phóng hơn).
Hàm nâng cao (phần 1)
19
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm trả về tham chiếu
Vídụ
Hàm chỉ trả về giá trị. Ví dụ, x = f();
Vậy, g() = x hợp lệ hay không?
Hợp lệ khi g(x) trả về tham chiếu đến một
biến (C++)
Cú pháp
<kiểu trả về> &<tên hàm>([<ds tham số>])
{
return <biến>;
}
Ví dụ
#include <stdio.h>
int x;
int &getx()
{
return x;
}
void main()
{
getx() = 5; // x = 5
}
Ứng dụng
Chỉ số của mảng trong C/C++ bắt từ 0
Không quen thuộc lắm.
Viết hàm để khi muốn truy cập đến phần tử
thứ i của mảng a ta sử dụng V(i) thay vì a[i-1]
int a[100];
int &V(int i)
{
return a[i-1];
}
…
V(1) = 2912; // a[0] = 2912;
Hàm nâng cao (phần 1)
22
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm trả về tham chiếu
Chú ý
Trong trường hợp sau, biến x phải là biến
toàn cục không nên sử dụng!
int x; // biến toàn cục
int &getx()
{
return x;
}
void main()
{
getx() = 2912;
}
Hàm nâng cao (phần 1)
23
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
&
VC
BB
Hàm trả về tham chiếu
Chú ý
Nếu không muốn sử dụng biến toàn cục, phải
truyền x ở dạng tham chiếu.
int &getx(int x) { // SAI! x là tham trị bản sao
return x;
}
int &getx() {
int x; // SAI! x là biến cục bộ
return x;
}
Ví dụ
#include <stdio.h>
void main()
{
int a[100];
for (int i = 1; i <= 100; i++)
V(a, i) = 0;
}
I. GIỚI THIỆU
Khi biên dịch chương trình (F7), chú ý cửa sổ Build ở dưới, các thông tin về lỗi (errors) và
cảnh báo (warnings) nếu có sẽ được liệt kê chi tiết ở đây:
Ví dụ trong hình: dòng màu vàng là lỗi, màu xanh là cảnh báo. Con số phía trước mỗi
lỗi/cảnh báo cho biết số thứ tự dòng code xuất hiện lỗi/cảnh báo (ở đây là dòng thứ 9). Dựa
vào những ký hiệu cũng như thông tin về lỗi/cảnh báo này, bạn có thể tìm ra nhanh chóng lỗi
của mình nằm ở đâu và cách sửa như thế nào.
Các bước cần làm khi biên dịch chương trình có lỗi:
1) Xem có bao nhiêu lỗi, bấm F4 để nhảy đến dòng chứa lỗi đầu tiên
2) Đọc xem thông báo lỗi là gì, sửa lỗi đó
3) Biên dịch lại project (F7) rồi quay lại bước 1
Trang 1
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B
Ví dụ: (9) missing ‘;’ before ‘return’ => Thiếu dấu ‘;’ trước câu lệnh return ở dòng 9. Rà soát
lại trước dòng 9, phát hiện thiếu dấu ‘;’ sau câu lệnh printf(“Hello World!”)
C1010: unexpected end of file while looking for precompiled header directive
ª Lỗi này xuất hiện khi bạn không tạo Empty project mà tạo một project có sẵn (Hello World)
với 2 file được tạo sẵn là StdAfx.h và StdAfx.cpp. Với loại project này, bạn phải #include
StdAfx.h ngay đầu file .cpp chứa hàm main của bạn. Nếu không trình biên dịch sẽ báo lỗi như
trên. Cách giải quyết:
¾ Cách 1: Thêm dòng #include “StdAfx.h” vào ngay đầu file .cpp chứa code chương
trình của bạn
Trang 2
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B
¾ Cách 2: Vào Project Æ Settings Æ chuyển sang tab C/C++, chọn Precompiled
Headers trong Category, check vào ô Not Using Precompile Header
ª Ví dụ: chuỗi đưa vào lệnh printf (dòng thứ 8) thiếu dấu đóng ngoặc kép ”
Trang 3
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B
ª Ví dụ:
Dòng 8 sử dụng biến giatri chưa được khai báo
Dòng 9 sử dụng hàm abs chưa được khai báo
Dòng 10 sử dụng hàm Xuat chưa được khai báo
ª Cách giải quyết: thêm vào các khai báo thích hợp (khai báo hàm abs được đặt trong math.h)
Trang 4
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B
Trang 5
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B
ª Ví dụ: hàm main được hiểu là hàm bên trong hàm Xuat và điều này không được phép
(illegal). Từ đó dẫn đến file source code không được kết thúc hợp lệ. Trường hợp này chỉ cần
thêm dấu ngoặc nhọn đóng hàm Xuat (hàm ngay phía trên hàm báo lỗi – main) lại.
Trang 6
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B
2. Sau khi chương trình đã hết lỗi, chạy thử chương trình với thông số như sau và ghi lại
kết quả chạy của 2 hàm TimSVTrungTen và TimSVTrungDiem
¾ Số lượng sinh viên: 4
¾ Sinh viên 1: Nguyen Van An – 07DB999 – 10
¾ Sinh viên 2: Nguyen Thanh Son – 07DB998 – 5
¾ Sinh viên 3: Nguyen Van An – 07DB997 – 4.5
¾ Sinh viên 4: Nguyen Van An – 07DB996 – 5
3. Hãy debug chương trình và liệt kê các tham số quan sát trong từng bước Debug của
hàm TimSVTrungTen và TimSVTrungDiem
Trang 7
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B
Cụ thể:
Debug hàm TimSVTrungTen
flag 0 0 0 …
i 0 0 0 …
j 1 2 3 …
sv_array[i].ten 0x0012ff1c ”a” … … …
sv_array[j].ten 0x0012ff3c “a” … … …
Tương tự cho hàm TimSVTrungDiem
4. Từ bảng liệt kê ở câu 3, hãy cho biết hàm TimSVTrungTen và TimSVTrungDiem
làm gì? (tham số đầu vào là gì? Kết quả đầu ra là gì? Các biến flag, i, j có nghĩa gì?)
5. Câu 2 cho kết quả đúng hay sai? Nếu sai, hãy cho biết lỗi sai nằm ở đâu? Đề xuất cách
sửa nếu có thể.
6. Theo bạn, chương trình còn có thể tiềm ẩn những lỗi nào nữa hay không? Nếu có hãy
nêu ra cụ thể lý do và cách sửa.
# Nộp bài: Bài làm bằng file Word, đặt tên file là MSSV.doc (Ví dụ: 07DB333.doc); ghi
rõ họ tên, MSSV, lớp, ca học vào đầu bài làm (Ví dụ ca học: sáng thú 5, PM2), lần lượt trả
lời từng câu hỏi. Nộp bài lên Moodle (chung 1 link duy nhất cho các ca)
# Thời hạn: 1 tuần [từ ngày 22/02/2008 đến 23h55’ ngày 29/02/2008]
# Điểm cộng: không bắt buộc nộp, bài nộp sẽ tính là bài tập cộng điểm (phải làm ít nhất 5
câu)
# Điểm trừ: các bài làm giống nhau (>70%) sẽ được trừ 1 điểm vào bài thi cuối kỳ.
Trang 8