int interrupt _interrupt __interrupt _loadds __loadds long near _near __near new operator pascal _pascal __pascal private protected public register return _saveregs __saveregs _seg __seg[r]
(1)1 Chương Cấu trúc chung của chương trình C
I Giới thiệu vềngơn ngữ C
II Các phần tử cơ bản của ngôn ngữ C
III Cấu trúc chung của một chương trình C (viết trên DOS)
IV Các bước viết chạy thử chương trình C
I Giới thiệu về ngơn ngữ C
1 Ngơn ngữ lập trình C 2 Trình biên dịch C
3
1 Ngơn ngữ lập trình C
w Năm 1973 ngơn ngữ lập trình C ra đời với mục đích ban đầu là để viết hệ điều hành
Unix máy tính mini PDP Sau đó C đã
được sử dụng rộng rãi nhiều loại máy tính khác và đã trở thành một ngơn ngữ lập trình có cấu trúc rấtđược ưa chuộng.
w C ngôn ngữ lập trình bậc trung, có tính cấu trúc và định kiểu.
2 Trình biên dịch C
w C++ ngơn ngữ lập trình phát triển từ ngơn ngữ C, trình biên dịch C++ biên dịch
được chương trình viết ngơn ngữ C
w Borland C++ 3.1 chương trình biên dịch chương trình C++ C viết DOS Windows
w Là phần mềm hãng Borland (Mỹ)
(2)5
II Các phần tử cơ bản của ngôn ngữ C
1 Bộ ký tự 2 Từ khoá
3 Các tên tự đặt 4 Các tên chuẩn 5 Dấu chấm phẩy 6 Lời thích
1 Bộ ký tự của ngôn ngữ C
w Mọi ngôn ngữ lập trìnhđềuđược xây dựng ký tự Các ký tự ghép lại với tạo thành từ Các từ lại liết kết với theo quy tắc để tạo thành câu lệnh Một chương trình bao gồm nhiều câu lệnh diễn đạt thuật tốnđểgiải tốn nàođó
w Bộký tự ngơn ngữ C gồm có ký tự sau:
n 26 chữcái hoa: A, B,C,…Z 26 chữcái thường: a…z n 10 chữsố: 0, 1, 2,…,
n Các ký hiệu toán học: + - * / = ) (
7
1 Bộ ký tự của ngôn ngữ C
n Ký tựgạch nối _
n Các dấu chấm câu ký tự đặc biệt khác: , ;
: [] ? ! \ & | % # $ …
n Dấu cách khoảng trống dùng đểngăn cách
giữa từ
Chú ý: Khi viết chương trình ta khơng sử dụng ký tự khơng có tập ký tựtrên
2 Từ khoá
w Từ khoá từ riêng ngôn ngữ C Chúng
được sử dụng cho kiểu liệu, toán tử câu lệnh
w Các từ khố C gồm có:
(3)9
2 Từ khoá
far _fastcall fastcall float for friend goto huge _huge huge if inline
int interrupt _interrupt interrupt _loadds loadds long near _near near new operator pascal _pascal pascal private protected public register return _saveregs saveregs _seg seg short signed sizeof _ss ss static struct switch template this typedef union unsigned virtual void volatile while
3 Các tên tự đặt
w Tên dùngđểxácđịnh đại lượng khác chương trình tên hằng, tên biến, tên hàm, tên trỏ, tên cấu trúc, tên tệp, tên nhãn,…
w Tên dãy ký tự chữ cái, chữ số dấu gạch nối song ký tự phải chữ dấu gạch nối Tên khơng đặt trùng với từ khố
w Một sốví dụvềtênđặt sai: 3XYZ_7 R#3
F(x) case
Al pha
11
4 Tên chuẩn
w Tên chuẩn tên đã được trình biên dịch
đặt Tên chuẩn có thể là tên hằng, tên các hàm.
Ghi nhớ: + Các từ khoá, tên tự đặt, tên chuẩn phân biệt chữ hoa chữ thường, nghĩa viết hoa, viết thường khác nhau.
Ví dụ: Tên AB khác với tên ab
+ Riêng từ khố, tên chuẩn ln ln dùng chữ thường, tên chuẩn hằng thường chữ hoa.
5 Dấu chấm phẩy
w Dấu chấm được dùng để ngăn cách giữa các câu lệnh Dấu chấm phẩy thường đặt ở cuối
câu lệnh không thể thiếu được trong
chương trình C.
Ví dụ:
(4)13
6 Lời giải thích
w Lời giải thích người lập trình đưa vào để cho chương trình dễ hiểu, dễ đọc Lời giải thích có thể đặt bất kỳ đâu chương trình nhưng phảiđặt cặp
/* */
hoặc đặt sau //
w Dùng /* */ lời giải thích nằm trên nhiều dịng, dùng // lời giải thích nằm trên một dịng.
//Khai báo sửdụng thưviện chương trình con, thưviện lớp #include<stdio.h>
……
//Khai báo hàm (chương trình con) ……
int main() {
//Khai báo biến, ……
//Các lệnh chương trình ……
return 0; }
//Định nghĩa hàm ……
III Cấu trúc chung chương trình C (viết DOS)
Tương đương với BEGIN PASCAL
Tương đương với END PASCAL Tương đương với USES PASCAL
Thân chương trình
15
Các bước viết chạy thử chương trình C
Bước 1:Soạn thảo chương trình - Chạy trình soạn thảo văn text
- Gõ vào chương trình ghi thành tệp cóđi c Bước 2:Biên dịch chương trình
- Chạy trình biên dịch C/C++đểbiên dịch chương trình - Nếu có lỗi vềmặt cú pháp quay lại bước 1đểsửa Bước 3:Chạy thửchương trình
- Từtrong IDE,ấn Ctrl+F9
(5)Lập trình nâng cao - Chương 02 - Ngơ Công Thắng
Chương Các kiểu dữ liệu cơ sở
I Khái niệm về kiểu dữ liệu
1 Khái niệm kiểu liệu Các kiểu dữliệu C
II Các kiểu dữ liệu cơ sở
1 Kiểu ký tự Kiểu sốnguyên
3 Kiểu sốthực (sốdấu phẩyđộng)
2
I.1 Khái niệm về kiểu dữ liệu
²Một kiểu dữ liệu một tập giá trị mà có thể lưu trữ trong máy, trên đó xác định một số phép tốn.
²Các kiểu dữ liệu C gồm có n Các kiểu liệu cơsở
wKiểu ký tự
wKiểu sốnguyên
wKiểu sốthực (sốdấu phẩyđộng)
Lập trình nâng cao - Chương 02 - Ngơ Cơng Thắng
2 Các kiểu dữ liệu C ²Các kiểu dữ liệu có cấu trúc
n Kiểu mảng n Kiểu xâu ký tự n Kiểu cấu trúc n Kiểu tệp
²Kiểu người lập trình tự định nghĩa: Kiểu liệt kê
4
II Các kiểu dữ liệu cơ sở (chuẩn)
1 Kiểu ký tự 2 Kiểu số nguyên
(6)Lập trình nâng cao - Chương 02 - Ngô Công Thắng
II.1 Kiểu ký tự
²Kiểu ký tự C định nghĩa với tên char, gồm 256 ký tự bảng mã ASCII Kiểu ký tự có kích thước byte
²Hằng ký tự ký tự cụthể đặt dấu phẩy Ví dụ: ’A’, ’b’, ’9’
²Một sốhằng ký tự điều khiển:
’\n’ New line,đặt trỏmàn hình xuốngđầu dịng ’\t’ Tab
’\b’ Backspace
’\r’ Carriage return,đưa trỏ hình đầu dịng
6
II.1 Kiểu ký tự
²Hằng xâu ký tự là một dãy ký tự đặt giữa hai dấu nháy kép Ví dụ: ”Nhap vao mot so”
²Kiểu ký tự có thể được dùng như kiểu số nguyên với tên sau:
n char: có giá trị-128 – 127
n unsigned char: có giá trị – 255
²Tất cả các ký tự đều lưu trữ trong bộ nhớ dưới dạng số là mã ASCII của ký tự đó.
Lập trình nâng cao - Chương 02 - Ngô Công Thắng
II.2 Kiểu số nguyên
² Kiểu sốnguyên C++định nghĩa với nhiều tên,
được chia thành hai nhóm: kiểu số nguyên có dấu kiểu sốnguyên không dấu
² Kiểu sốnguyên có dấu gồm có: Tên kiểu
short int long
Kích thước byte
2 byte byte
Khoảng giá trị -32768 - 32767 -32768 - 32767 -231 – 231-1
8
2 Kiểu số ngun
² Kiểu sốngun khơng dấu gồm có: Tên kiểu
unsigned short unsigned int unsigned unsigned long
Kích thước byte
2 byte byte
Khoảng giá trị - 65535 - 65535
0 - 232-1
² Các sốngun viết bình thường Ví dụ: -45 2056 345
Chú ý: Các số nguyên vượt khoảng int
(7)Lập trình nâng cao - Chương 02 - Ngô Công Thắng
3 Kiểu số thực
Kiều số thực C định nghĩa với nhiều tên khác nhau:
Tên kiểu float double long double
Kích thước byte byte 10 byte
Khoảng gía trị 3.4E-38–3.4E38 1.7E-308–1.7E308 3.4E-4932–1.1E4932
Độchính xác 7-8 chữsố 15-16 chữsố 18-19 chữsố
Khoảng giá trịcủa kiểu sốthực giá trịtuyệt
đối sốthực mà lưu trữ máy Giá trị có giá trị tuyệt đối nhỏ cận xem
10
3 Kiểu số thực
²Hằng sốthực có cách viết:
n Dạng thập phân: gồm có phần nguyên, dấu chấm thập
phân phần thập phân Ví dụ: 34.75 -124.25
n Dạng mũ(dạng khoa học): gồm phần trị phần mũ
cơ số 10, phần trị số nguyên thực, phần mũ số nguyên âm dương Hai phần cách chữe E
Ví dụ: 125.34E-3 số125.34x10-3= 0.12534 0.12E3 số0.12x103= 120
(8)Lập trình nâng cao - Chương 03 - Ngô Công Thắng
Chương Các khai báo, biểu thức, khối lệnh
I Các khai báo II Biểu thức III Khối lệnh
2
I.1 Khai báo sử dụng thư viện hàm ²Các trình biên dịch C có sẵn nhiều chương trình
con (gọi hàm), hàm nàyđể thư viện hàm khác Muốn sử dụng hàm ta phải khai báo sử dụng thưviện hàm chứa hàm
²Cú pháp khai báo sau:
#include<tên tệp header> #include “tên tệp header”
Tên tệp header thưviện hàm cóđi h
Ví dụ: #include<stdio.h> //Khai báo sử dụng chương trình vào/ra
Lập trình nâng cao - Chương 03 - Ngô Công Thắng
I.2 Khai báo hằng
²Khai báo hằng là đặt tên cho một giá trị cụ thể
²Cú pháp khai báo hằng:
#define Tên_hằng Giá_trị_của_hằng Ví dụ:#define PI 3.141593
²Khai báo hằng có thể đặt bất kỳ đâu trong chương trình Khi biên dịch chương trình, tất cả tên hằng được sử dụng sau dòng khai báo hằng sẽ được thay bằng giá trị của tên hằng.
4
I.3 Khai báo biến
²Biến ô nhớ nhớ (RAM) máy tính dùngđểcất chứa liệu
²Khai báo biến đặt tên cho ô nhớ xác định kiểu liệu cho nhớ Ơ nhớ có kiểu liệu chứa giá trị kiểu liệu Khai báo biến để đâu chương trình
²Cú pháp: Tên_kiểu_dl Tên_biến;
Ví dụ: int a; //biến tên a, có kiểu sốnguyên int
n Nếu có nhiều biến kiểu có thểkhai báo nhau,
giữa tên biến phân tách dấu phẩy
(9)Lập trình nâng cao - Chương 03 - Ngơ Cơng Thắng
I.3 Khai báo biến (tiếp)
²Khi khai báo biến có thể khởi tạo giá trị ban
đầu cho biến bằng đặt dấu bằng một giá trị nào đó cách sau tên biến.
Ví dụ: int a,b=20,c,d=35;
6
II Biểu thức
1 Biểu thức
2 Phép toán sốhọc
3 Phép toán quan hệ logic Phép toán tăng giảm
5 Thứ tự ưu tiên phép toán Các hàm sốhọc
7 Câu lệnh gán biểu thức gán Biểu thứcđiều kiện
9 Chuyểnđổi kiểu giá trị
Lập trình nâng cao - Chương 03 - Ngô Công Thắng
II.1 Biểu thức
²Biểu thức sự kết hợp giá trị bằng các phép tốn đểcó được một giá trị mới Các giá trị đem kết hợp được gọi tốn hạng. Tốn hạng có thểlà hằng, biến, hàm.
²Biểu thức dùng để bảo máy tính thực hiện một tính tốn nào đó để có được một giá trị mới.
²Mỗi biểu thức sẽ có một giá trị và nói chung cái có giá trị đều được coi biểu thức.
8
II.1 Biểu thức (tiếp) ²Có hai loại biểu thức:
n Biểu thức số: có giá trị nguyên thực
n Biểu thức logic: có giá trị (giá trị khác 0)
hoặc sai (giá trịbằng 0)
²Ví dụ:
(a+b+c)/2 (-b-sqrt(delta))/(2*a)
(10)Lập trình nâng cao - Chương 03 - Ngơ Cơng Thắng
II.2 Phép toán số học ²Phép toán hai ngôi: + - * / %
n % phép lấy phần dư, ví dụ: 11%2 =
n Phép chia hai sốnguyên chỉgiữ lại phần nguyên
Ví dụ: 11/2 =
²Phép tốn một ngơi: dấu âm –
Ví dụ-(a+b)
²Các phép toán số học tác động tất cả các kiểu dữ liệu cơ bản.
10
II.3 Phép toán so sánh logic
² Các phép toán so sánh logic cho ta giá trị (có giá trịkhác 0) sai (có giá trị 0)
² Các phép tốn so sánh gồm có:
Phép toán > >=
< <= = = !=
Ý nghĩa Lớn
Lớn Nhỏ
Nhỏ
Bằng (hai dấu sát nhau) Khác
Lập trình nâng cao - Chương 03 - Ngô Công Thắng 11
II.3 Phép toán quan hệ logic (tiếp) ² Các phép tốn logic gồm có:
Phép tốn ! &&
| |
Ý nghĩa
Phủđịnh (NOT) Và (AND) Hoặc (OR)
12
II.4 Phép toán tăng giảm
²C++ có hai phép tốn ngơi để tăng giảm giá trị của biến (có kiểu nguyên thực) Toán tử tăng ++ cộng vào toán hạng nó, tốn tử giảm trừ tốn hạng nóđi
Ví dụ: giả sửbiến nđang có giá trịlà 8, sau phép tính ++n làm cho n có giá trị 9, sau phép tính n làm cho n có giá trịlà
²Phép tốn ++ đứng trước sau tốn hạng Nếu đứng trước tốn hạng tăng/giảm trước sử dụng, nếuđứng sau tốn hạng tăng/giảm sau
(11)Lập trình nâng cao - Chương 03 - Ngô Công Thắng 13
II.5 Thứ tự ưu tiên của phép toán
²Khi biểu thức có chứa nhiều phép tốn phép tốn thực theo thứ tự ưu tiên: Các phép tốn có mức ưu tiên cao thực trước, phép toán mức ưu tiên thực từ trái qua phải từphải qua trái
²Bảng thứ tự ưu tiên phép toán: Các phép toán loại mức ưu tiên Các phép tốn loại có mức ưu tiên cao nhất, đến phép toán loại 2, 3,… Các phép tốn loại (phép tốn ngơi), 14 (phép tốn điều kiện) 15 (phép toán gán) kết hợp từ phải qua trái, phép tốn cịn lại kết hợp từ trái qua phải
14
II.5 Thứ tự ưu tiên của phép toán (tiếp)
TT Loại phép toán Phép toán Ý nghĩa Cao ( )
[ ] -> ::
Lời gọi hàm, dấu ngoặc Truy nhập phần tửmảng Truy nhập gián tiếp Truy nhập trực tiếp Truy nhập tên miền Phép tốn ngơi !
~ + -++
Phủ định (NOT)
Đảo bit Dấu dương Dấu âm Toán tửtăng Toán tửgiảm
Lập trình nâng cao - Chương 03 - Ngơ Cơng Thắng 15
II.5 Thứ tự ưu tiên của phép toán (tiếp)
TT Loại phép toán Phép toán Ý nghĩa Phép tốn ngơi &
* sizeof
new delete (Kiểu dl)
Lấyđịa chỉbiến Truy nhập qua trỏ Cho kích thước tốn hạng Cấp phát bộnhớ động Giái phóng bộnhớ Phép ép kiểu dữliệu Phép toán truy
nhập thành viên
.* ->* Phép toán nhân *
/ %
Nhân Chia
Chia lấy phần dư
16
5 Thứ tự ưu tiên của phép toán (tiếp)
TT Loại phép toán Phép toán Ý nghĩa Phép toán cộng +
-Cộng Trừ Phép toán dịch bit >>
<<
Dịch phải Dịch trái Phép toán quan hệ <
<= > >=
Nhỏhơn
Nhỏhơn Lớn
Lớn Phép toán so sánh
bằng
== !=
(12)Lập trình nâng cao - Chương 03 - Ngô Công Thắng 17
5 Thứ tự ưu tiên của phép toán (tiếp)
TT Loại phép toán Phép toán Ý nghĩa Phép toán vềbit & Phép AND bit 10 Phép toán vềbit ^ Phép XOR bit 11 Phép toán vềbit | Phép OR bit 12 Phép toán logic && Phép AND logic 13 Phép toán logic || Phép OR logic
14 Phép tốn điều kiện ? : Ví dụ: a ? x : y //nếu a
đúng x, cịn khơng y
18
5 Thứ tự ưu tiên của phép toán (tiếp)
TT Loại phép toán Phép toán Ý nghĩa 15 Phép toán gán =
*= /= %=
+= -= &=
^= |= <<= >>=
Phép gánđơn giản Phép gán nhân Phép gán chia
Phép gán chia lấy phần dư Phép gán cộng
Phép gán trừ Phép gán AND bit Phép gán XOR bit Phép gán OR bit Phép gán dịch trái bit Phép gán dịch phải bit 16 Dấu phẩy ,
Lập trình nâng cao - Chương 03 - Ngô Công Thắng 19
II.6 Một số hàm toán học cơ bản
Các hàm số học nằm thư viện hàm math, muốn sử dụng hàm ta phải khai báo: #include<math.h>
Dướiđây sốhàm sốhọc hay dùng: Tên hàm Ý nghĩa
cos(x) sin(x) acos(x) asin(x)
Cho cos(x) Cho sin(x) Cho arccos(x) Cho arcsin(x)
20
6 Các hàm toán học cơ bản (tiếp)
Tên hàm Ý nghĩa tan(x)
fabs(x) exp(x) log(x) log10(x) pow(y,x) sqrt(x)
Cho tgx Cho |x| ex
Cho lnx Cho log10x
Cho yx
(13)Lập trình nâng cao - Chương 03 - Ngô Công Thắng 21
II.7 Câu lệnh gán biểu thức gán ²Câu lệnh gán
n Để đưa giá trịvào biến thời điểm lập trình
ta sử dụng lệnh gán Có lệnh gán đơn giản lệnh gán phức hợp
n Lệnh gán đơn giản có dạng: Biến = Biểu thức;
Lệnh gán đưa giá trị biểu thức bên phải vào biến bên trái Vế trái phép gán chỉcó thể biến chỉmột mà thơi
Ví dụ: a = 2*x*x + 3*x + 1;
22
II.7 Câu lệnh gán biểu thức gán (tiếp)
²Câu lệnh gán
n Lệnh gán phức hợp có dạng:
Biến Phép_tốn= Biểu thức;
Phép tốn để trước dấu bằng, phép toán sốhọc phép toán bit
Ví dụ: a += 2;
Lệnh gán đem giá trị biến kết hợp với giá trị biểu thức theo phép toán đưa kết vào biến, tức thực phép toán trước gán a *= 5; //lệnh tươngđương với lệnh a = a*5;
Lập trình nâng cao - Chương 03 - Ngô Công Thắng 23
II.7 Câu lệnh gán biểu thức gán (tiếp) ²Biểu thức gán
n Biểu thức gán biểu thức có dạng:
v = e
(Sau biểu thức gán khơng có dấu chấm phẩy) trongđó v biến, e biểu thức
n Biểu thức gán thực gán e vào v Giá trịcủa biểu thức gán
là giá trị biểu thức e, kiểu biểu thức gán kiểu biến v Biểu thức gán sử dụng biểu thức khác, chẳng hạnđem gán giá trịcủa vào biến
Ví dụ:sau lệnh a = b = 5; a b sẽbằng biểu thức gán
đưa vào b lệnh gán đưa giá trị biểu thức gán b=5 vào a
24
II.8 Biểu thức điều kiện
²Biểu thức điều kiện biểu thức có dạng: e1 ? e2 : e3
trong e1, e2, e3 biểu thức nàođó
²Giá trị biểu thức điều kiện giá trị e2 e1 (có giá trị khác 0) giá trị e3 e1 sai (có giá trịbằng 0)
²Biểu thức điều kiện thực biểu thức, ta sử dụng biểu thức khác
(14)Lập trình nâng cao - Chương 03 - Ngô Công Thắng 25
II.9 Chuyển đổi kiểu giá trị
²Việc chuyển đổi kiểu giá trị thường diễn cách tự động hai trường hợp sau:
n Khi biểu thức có tốn hạng khác kiểu
n Khi gán giá trịkiểu cho biến kiểu khác ²Chuyển đổi kiểu biểu thức: Khi hai toán hạng
trong phép tốn có kiểu khác kiểu thấp
hơn nâng thành kiểu cao Kết thu
được giá trịcó kiểu cao
Ví dụ:giữa int long int chuyển thành long int float int chuyển thành float
26
9 Chuyển đổi kiểu giá trị (tiếp) ²Chuyển đổi kiểu gán: Giá trị của vế phải
được chuyển sang kiểu của vế trái.
²Ta cũng có thể thực hiện chuyển đổi kiểu theo ý muốn bằng tốn tử ép kiểu, có dạng: (Tên kiểu muốn ép) Biểu_thức
Ví dụ: (int) x (float)(a+b)
Lập trình nâng cao - Chương 03 - Ngô Công Thắng 27
III Khối lệnh
²Nhiều lệnh đặt dấu ngoặc { } tạo thành khối lệnh
{ a=2; b=3;
cout<<a<<’ ’<<b; }
²C++ coi khối lệnh câu lệnh riêng lẻ Bởi chỗ viết câu lệnh chỗ viết đặt khối lệnh Sau dấu ngoặc } khối lệnh khơng có dấu chấm phẩy
28
III Khối lệnh (tiếp)
²Bên khối lệnh chứa khối lệnh khác Sự lồng không bị hạn chế Lưu ý thân hàm khối lệnh, khối lệnh chứa khối lệnh bên khơng khối lệnh chứa
²Các biến không khai báo đầu hàm mà khai báoở đầu khối lệnh Biếnđược khai báo khối lệnh có phạm vi hoạt động khối lệnh Khi máy bắt đầu thực khối lệnh biến khai báo bên hình thành
(15)Lập trình nâng cao - Chương - Ngơ Công Thắng Chương Lệnh vào/ra dữ liệu
và cấu trúc điều khiển chương trình
I Lệnh vào/ra dữ liệu II Lệnh lựa chọn III Lệnh lặp
IV Lệnh break continue
2
I Lệnh vào/ra dữ liệu
1 Khai báo thư viện hàm vào/ra dữ liệu 2 Lệnh lấy dữ liệu vào từ bàn phím 3 Lệnh đưa dữ liệu hình
4 Kết hợp giữa lệnh printf scanf để tổ chức lấy dữ liệu vào từ bàn phím
Lập trình nâng cao - Chương - Ngô Công Thắng
I.1 Khai báo thư viện hàm vào/ra dữ liệu
²Để có thể sử dụng lệnh vào/ra dữ liệu của C lập trình DOS ta phải khai báo sử dụng thư viện hàm stdio:
#include<stdio.h>
4
I.2 Lệnh lấy dữ liệu vào từ bàn phím
²Để lấy liệu từ bàn phím vào biến ta dùng lệnh scanf theo cú pháp sau:
scanf(đặc tả kiểu dl,địa chỉcác nhớ);
Trong đó: 1) đặc tả kiểu dl xâu ký tự điều khiển chứa đặc tả chuyển dạng liệu,
đặc tảtương ứng với địa chỉô nhớ;
(16)Lập trình nâng cao - Chương - Ngơ Công Thắng
I.2 Lệnh lấy dữ liệu vào từ bàn phím 3)Đặc tảchuyển dạng dữliệu có cấu trúc chung nhưsau:
%[*][w]Ký tự chuyển dạng
- Nếu có dấu * trường vào dị đọc bình thường giá trịcủa khơngđược lưu vào bộnhớ.Đặc tảchứa dấu * sẽkhơng có nhớtươngứng
- w sốxácđịnh chiều dài cựcđại trường vào Nếu khơng có tham sốw tham sốnày lớn độ dài trường vào tồn trường vào đọc, nội dung nóđược dịch vàđượcđưa vào ô nhớtươngứng Nếu w nhỏhơnđộdài trường vào tương ứng phần
đầu trường vào có độdài wđượcđọc,được dịch
được gán vào ô nhớ tương ứng Phần lại dùng chođặc tảtiếp theo Ví dụ: vdch4_01.cpp
6
I.2 Lệnh lấy dữ liệu vào từ bàn phím
4) Ký tự chuyển dạng xác định cách thức dò
đọc dữ liệu dòng vào cũng như phương pháp chuyển dịch thơng tin đọc được trước khi gán cho các địa chỉ tương ứng.
Lập trình nâng cao - Chương - Ngô Công Thắng
Các ký tự chuyển dạng dữ liệu dùng cho scanf
Ký tự chuyển dạng
Ý nghĩa
c Đọc ký tự,đối tươngứng ô nhớkiểu char d Đọc giá trịint,đối tươngứng ô nhớkiểu int ld Đọc giá trịlong,đối tươngứng ô nhớkiểu long
o Đọc giá trịkiểu int hệ8,đối tươngứng ô nhớkiểu int lo Đọc giá trịkiểu long hệ8,đối tươngứng ô nhớkiểu long
x Đọc giá trịkiểu int hệ16,đối tươngứng ô nhớkiểu int lx Đọc giá trịkiểu long hệ16,đối tươngứng ô nhớkiểu long f e Đọc giá trịkiểu float,đối tươngứng ô nhớkiểu float lf le Đọc giá trịkiểu double,đối tươngứng ô nhớkiểu double
s Đọc xâu ký tự,đối tươngứng mảng ô nhớkiểu char
8
Các ký tự chuyển dạng dữ liệu dùng cho scanf
Ký tựchuyển dạng
Ý nghĩa
[dãy ký tự] Đọc ký tựcho tới gặp ký tựkhông thuộc tập ký tựtrong hai dấu [ ].Đối tươngứng làđịa chỉcủa mảng ô nhớ kiểu char Khoảng trắng cũngđược xem ký tự
(17)Lập trình nâng cao - Chương - Ngơ Công Thắng
I.3 Lệnh đưa dữ liệu hình
²Cú pháp:
printf(dk,các liệu cần đưa ra);
Trong đó: 1) dk xâu ký tự điều khiển có chứa:
+ Các ký tự điều khiển, ví dụnhư ‘\n’, ‘\t’, ‘\b’ + Các đặc tảchuyển dạng tạo khuôn liệu,
đặc tả dùng cho liệu tương ứng cần đưa hình
+ Các ký tự thơng thường
2) Các liệu cần đưa hằng, biến, biểu thức Có liệu đưa phải có nhiêuđặc tả chuyển dạng
10
Đặc tả chuyển dạng dữ liệu
²Cấu trúc chung:
%[-][fw][.pp]Ký tự chuyển dạng
- Nếu khơng có dấu trừ - liệu phải số chỗ hình dành cho liệu, thừa chỗ đểtrống Với liệu số, fw bắt đầu số chỗ trống điền đầy số0
- Nếu có dấu trừthì liệu trái, chỗ thừa lnđểtrống
Ví dụtrên máy với dữliệu cầnđưa -2503
Lập trình nâng cao - Chương - Ngô Công Thắng 11
Đặc tả chuyển dạng dữ liệu (tiếp) ²Cấu trúc chung:
%[-][fw][.pp]Ký tự chuyển dạng
- fw số nguyên xác định số chỗ trên màn hình dành cho dữ liệu đưa Nếu khơng có fw hoặc nếu fw nhỏ hơn độ dài thực tế của dữ liệu số chỗ trên hình dành cho dữ liệu sẽ bằng độ dài của dữ liệu.
- pp số nguyên xác định số chữ số sau dấu chấm thập phân pp chỉ dùng cho dữ liệu là số thực.
12
Các ký tự chuyển dạng dữ liệu dùng cho printf
Ký tự chuyển dạng
Kiểu dữ liệu
Các chuyển dạng
c char Dữliệuđược coi ký tự
d i int Dữliệuđược coi sốnguyên có dấu ld li long Dữliệuđược coi sốnguyên có dấu
u int Dữliệuđược coi sốnguyên không dấu o int Dữliệuđược coi sốhệ8 không dấu lo long Dữliệuđược coi sốhệ8 không dấu x int Dữliệuđược coi sốhệ16 không dấu lx long Dữliệuđược coi sốhệ16 không dấu
(18)Lập trình nâng cao - Chương - Ngô Công Thắng 13
I.4 Kết hợp giữa lệnh printf scanf để tổ chức lấy dữ liệu vào từ bàn phím
²Trước mỗi lệnh nhập dữ liệu scanf ta nên dùng lệnh printf để đưa một lời nhắc nhập vào dữ liệu gì.
printf(“Lời nhắc: ”); scanf( );
14
Một chương trình C đơn giản Ví dụ 4.1:
Chương trình lấy vào bán kính của một hình trịn, sau đó tính và đưa diện tích và chu vi của hình trịn.
Lập trình nâng cao - Chương - Ngô Công Thắng 15
II Lệnh lựa chọn
1 Lệnh kiểm tra điều kiện if 2 Lệnh thử và rẽ nhánh switch
16
II.1 Lệnh kiểm tra điều kiện if
²Lệnh kiểm tra điều kiện đểbảo máy kiểm tra
điều kiện, làm cơng việc này, sai làm cơng việc khác Biểu thức điều kiện biểu thức logic có giá trị (khác 0) sai (bằng 0)
²Lệnh có dạng:
(1) if (điều kiện) Câu lệnh;
(19)Lập trình nâng cao - Chương - Ngơ Công Thắng 17
II.1 Lệnh kiểm tra điều kiện if (tiếp)
²Lưuđồ thực lệnh dạng (1) (2) sau:
Điều kiện
Câu lệnh
Lệnh Đúng
Sai (1)
Câu lệnh Điều kiện
Câu lệnh
Lệnh
Đúng Sai
(2)
18
II.1 Lệnh kiểm tra điều kiện if (tiếp)
² Ví dụ4.1:
Viết chương trình nhập vào sốthực, kiểm tra số dương thìđưa hình bậc số đó, âm
đưa thơng báo “Sốâm khơng có bậc 2”
//Khai bao su dung thu vien chuong trinh #include<stdio.h>
#include<math.h> int main()
{ float a;
printf(“Nhap vao mot so: ”); scanf(“%f”,&a); if (a>=0) printf("Can bac bang: %6.2f”,sqrt(a)); else printf("So am khong co can bac 2”);
return 0; }
Lập trình nâng cao - Chương - Ngô Công Thắng 19
II.2 Lệnh thử rẽ nhánh switch ² Khi cần kiểm tra giá trịcủa biểu thức xem có giá trịnào
nhiều giá trịkhông ta dùng lệnh switch
² Cú pháp: có dạng (1)
switch (Biểu thức) {
case hằng1:
Các câu lệnh; break; case hằng2:
Các câu lệnh; break; ……
case hằngN:
Các câu lệnh; break; }
Khơng có chấm phẩy
Khơng có chấm phẩy
Các lệnh ứng với
Để thoát khỏi switch Các lệnh ứng với Các lệnh ứng với N
20
II.2 Lệnh thử rẽ nhánh switch (tiếp)
(2)
switch (Biểu thức) {
case hằng1: Các câu lệnh; break; case hằng2:
Các câu lệnh; break; …… case hằngN:
Các câu lệnh; break; default:
Các câu lệnh; break; }
Không có dấu chấm phẩy
Khơng có dấu chấm phẩy
Các lệnh ứng với
(20)Lập trình nâng cao - Chương - Ngơ Công Thắng 21
II.2 Lệnh thử rẽ nhánh switch (tiếp)
²Biểu thức sau từ khoá switch phảiđặt ngoặc đơn
²Biểu thức phải kiểu phải kiểu số nguyên ký tự
²Các giá trị biểu thức (các kết hợp với nhau) Sau phải có dấu hai chấm
²Trước phải có từ khố case, tức khơng thể có nhiều chung từ khố case
²Nếu muốn nhiều chung câu lệnh nàyđểgần chỉviết lệnh câu lệnh breakởhằng
22
II.2 Lệnh thử rẽ nhánh switch (tiếp)
Lưuđồthực lệnh switch sau:
Biểu thức = 1?
Các lệnh ứng với
Đúng
Các lệnh ứng với N
Đúng Sai
Các lệnh ứng với default
(nếu có) Lệnh tiếp theo Sai
Biểu thức = N?
Lập trình nâng cao - Chương - Ngô Công Thắng 23
II.2 Lệnh thử rẽ nhánh switch (tiếp)
Ví dụ4.2:
Viết chương trình nhập vào tháng năm, cho biết tháng năm đó có bao nhiêu ngày?
(Chương trình trang sau)
24
II.2 Lệnh thử rẽ nhánh switch (tiếp) //Khai bao su dung thu vien chuong trinh
#include<stdio.h>
int main() {
int thang,nam;
printf("Nhap vao thang: ");scanf("%d",&thang); printf("Nhap vao nam: ");scanf("%d",&nam); switch(thang) { case 1: case 3: case 5: case 7: case 8: case 10: case 12:
printf("Thang co 31 ngay!"); break;
case 4: case 6: case 9: case 11:
printf("Thang co 30 ngay!"); break;
case 2:
if(nam%4==0) printf("Thang co 29 ngay!"); else printf("Thang co 28 ngay!"); break;
default:
printf("Thang nhap vao ko dung!"); break;
(21)Lập trình nâng cao - Chương - Ngô Công Thắng 25
III Lệnh lặp
1 Lệnh lặp với số lần lặp xác định for 2 Lệnh lặp với lần lặp không xác định
26
III.1 Lệnh lặp với số lần xác định for
²Cú pháp:
for (Biểu thức khởi tạo;Biểu thức kiểm tra; Biểu thức tăng/giảm) Câu lệnh Khối lệnh
n Biểu thức khởi tạo dùng để khởi tạo giá trị ban đầu
cho biến điều khiển vòng lặp thực lần bắtđầu vào vịng lặp for
Lập trình nâng cao - Chương - Ngô Công Thắng 27
III.1 Lệnh lặp với số lần xác định for (tiếp)
n Biểu thức kiểm tra dùng để kiểm tra giá trị
của biến điều khiển xem tiếp tục lặp hay kết thúc Biểu thức kiểm tra thường là biểu thức logic có giá trị đúng hoặc sai, khi có giá trị đúng vẫn lặp, có giá trị sai thì kết thúc.
n Biểu thức tăng/giảm dùng để thay đổi biến
điều khiển theo chiều tăng hoặc giảm.
28
III.1 Lệnh lặp với số lần xác định for (tiếp) ²Lưu đồ thực lệnh
for bên:
²Ba biểu thức lệnh for khơng có hai dấu chấm phẩy thiếu Khi không viết biểu thức kiểm tra mặc định biểu thức kiểm tra có giá trị true,
điều làm cho vòng lặp lặp
Lệnh Biểu thức khởi tạo
Biểu thức kiểm tra Các lệnh
vòng lặp Biểu thức tăng/giảm
Đúng
(22)Lập trình nâng cao - Chương - Ngơ Cơng Thắng 29
III.1 Lệnh lặp với số lần xác định for (tiếp)
²Ví dụ:
for (i=1;i<=10;i++) printf(“%d\n”,i); for (i=10;i<=20;i+=2)
{
printf(“%d”,i); printf(“\n”); }
Không có dấu chấm phẩy
30
III.1 Lệnh lặp với số lần xác định for (tiếp)
Ví dụ: 1) Tính S = + + + … + N (tính theo phương pháp cộng dồn)
BTVN:
1) Viết chương trình tính gần số π theo công thức sau (với n sốhạng đầu tiên):
2) Tính n!
Lập trình nâng cao - Chương - Ngô Công Thắng 31
III.2 Lệnh lặp với số lần lặp không xác định
²Lệnh lặp kiểm tra điều kiện trước while while (Biểu thức kiểm tra)
Câu lệnh;
Khơng có dấu chấm phẩy
32
III.2 Lệnh lặp với số lần lặp không xác định (tiếp)
²Lưu đồ thực hiện lệnh while
Biểu thức kiểm tra
Các lệnh vòng lặp
Đúng
Sai
(23)Lập trình nâng cao - Chương - Ngơ Công Thắng 33
III.2 Lệnh lặp với số lần lặp không xác định (tiếp)
²Lệnh lặp kiểm tra điều kiện sau do-while do
Câu lệnh;
while (Biểu thức kiểm tra);
Khơng có dấu chấm phẩy
34
III.2 Lệnh lặp với số lần lặp không xác định (tiếp)
²Lưu đồ thực hiện lệnh … while
Biểu thức kiểm tra Các lệnh
vòng lặp
Đúng
Sai Lệnh
Lập trình nâng cao - Chương - Ngô Công Thắng 35
III.2 Lệnh lặp với số lần lặp khơng xác định (tiếp)
Ví dụ: Tìm USCLN(a, b) BTVN:
1) Viết chương trình tính extheo cơng thức:
Với độchính xác 10-5, tức ta cần chọn n cho
2) Làm lại tính gần số PI với độ xác 10-4.
36
IV Lệnh break continue
²Lệnh break được dùng để thoát khỏi lệnh for, while, do-while switch Nếu lệnh này lồng lệnh break khỏi lệnh bên trong nhất chứa nó.
²Với lệnh break ta có thể thốt khỏi vịng lặp từ một điểm bất kỳ bên vòng lặp mà khơng dùng đến điều kiện kết thúc vịng lặp.
(24)Lập trình nâng cao - Chương - Ngô Công Thắng 37
IV Lệnh break continue
²Lệnh continue chỉ dùng với lệnh lặp for, while do-while.
²Lệnh continue khơng làm khỏi lệnh lặp mà làm cho lệnh lặp bỏ qua lệnh sau lệnh continueđể thực hiện vòng lặp tiếp theo.
38
Lệnh continue (tiếp) ²Tác động của
lệnh continue đối với lệnh for.
Biểu thức khởi tạo Biểu thức
kiểm tra Lệnh 1; Lệnh 2;
continue;
Lệnh N; Biểu thức tăng/giảm
Đúng
Sai
Lệnh
Lập trình nâng cao - Chương - Ngơ Cơng Thắng 39
Lệnh continue (tiếp) ²Tác động của
lệnh continue đối
với lệnh while. Bikiểểu thm traức
Lệnh 1; Lệnh
continue;
Lệnh N; Đúng
Sai
Lệnh
40
Lệnh continue (tiếp)
²Tác động lệnh continue lệnh do-while
Biểu thức kiểm tra Lệnh 1; Lệnh 2;
continue;
Lệnh N;
Đúng
(25)Lập trình nâng cao - Chương 05 - Ngô Công Thắng
Chương Kiểu mảng xâu ký tự
I Mảng II Xâu ký tự
III Bài tập chương 5
2
I Mảng
1 Khái niệm về kiểu mảng
2 Khai báo biến mảng một chiều
3 Truy nhập phần tử của mảng một chiều 4 Khởi tạo mảng một chiều
5 Mảng nhiều chiều
6 Chú ý vềchỉ số của phần tử mảng 7 Vào/ra với biến mảng
Lập trình nâng cao - Chương 05 - Ngô Công Thắng
I.1 Khái niệm về kiểu mảng
²Mảng một nhóm biến nằm cạnh nhau có kiểu, tên Mỗi biến được gọi là một phần tử Các phần tử của mảng được truy nhập trực tiếp thông qua tên biến mảng chỉ số.
²Số phần tử của mảng được xác định từ khi định nghĩa mảng. Đây là điểm hạn chế của mảng bởi nếu khơng dùng hết biến của mảng sẽgây lãng phí bộ nhớ.
4
I.2 Khai báo biến mảng một chiều
²Khai báo biến mảng xácđịnh tên biến mảng, kiểu phần tử, sốchiều kích thước chiều
²Cú pháp khai báo biến mảng chiều:
Kiểu_phần_tử Tên_biến_mảng[Kích thước];
trong kích thước số phần tử mảng, phải cho dạng biểu thức Kiểu phần tửcó thểlà kiểu
Ví dụ:int a[5];
(26)Lập trình nâng cao - Chương 05 - Ngô Công Thắng
I.3 Truy nhập phần tử của mảng một chiều
²Các phần tử của mảng được đánh số Các số này gọi chỉ số Phần tử đầu tiên có chỉ số là 0, phần tử thứ 2 có chỉ số là 1,… Mảng có kích thước n phần tử cuối có chỉ số n-1.
²Ví dụ: nếu ta định nghĩa một biến mảng int a[5];
thì ta được một biến mảng tên a có phần tử, phần tử đầu tiên có chỉ số là 0, phần tử thứ 5 có chỉsố là 4.
6
I.3 Truy nhập phần tử của mảng một chiều
²Mỗi phần tử của mảng có thể truy nhập trực tiếp thông qua tên biến mảng chỉ số của nó
đặt ngoặc vng [] Chỉ số của phần tử có thểcho dưới dạng hằng hoặc biểu thức.
²Ví dụ: 5 phần tử của mảng a ở ví dụ trên có tên a[0], a[1],… Ta có thể dùng lệnh sau:
a[0]=100; cout<<a[1];
for(int i=0;i<5;++i) scanf(“%d”,&a[i]);
Lập trình nâng cao - Chương 05 - Ngô Công Thắng
I.4 Khởi tạo mảng một chiều
²Ta có thể khởi tạo giá trị cho phần tử của mảng khai báo bằng cách liệt kê các giá trịkhởi tạođặt ngoặc {}.
²Ví dụ:
Các giá trị khởi tạo
Kích thước mảng
int a[5] = {12, 6, 10, 7, 19};
Dấu chấm phẩy
8
I.4 Khởi tạo mảng một chiều (tiếp)
²Nếu số giá trị khởi tạo kích thước mảng phần tử cịn lại khởi tạo Nếu số giá trị khởi tạo lớn kích thước mảng trình biên dịch sẽbáo lỗi
Ví dụ:int a[3] = {6,8}; //a[0]=6, a[1]=8, a[2]=0 int a[2] = {8, 6, 9}; //Báo lỗi
²Với mảng khởi tạo khơng cần xác định kích thước mảng Khi trình biên dịch
đếm số giá trị khởi tạo dùng số làm kích thước mảng.Ví dụ:
(27)Lập trình nâng cao - Chương 05 - Ngô Công Thắng
I.5 Mảng nhiều chiều
²Mảng chiều mảng mà phần tử truy nhập qua số Mảng nhiều chiều mảng mà phần tử truy nhập qua nhiều chỉsố
²C cho phép khai báo mảng nhiều chiều với kích thước chiều khác Cú pháp chung sau:
Kiểu Tên_biến_mảng[Kích thước chiều 1][Kích thước chiều 2]…;
²Ví dụ:
int a[4][3];
Lưu ý chiều phảiđược bao cặp ngoặc []
10
I.5 Mảng nhiều chiều (tiếp)
²Để truy nhập phần tử mảng m chiều ta phải dùng m chỉsố Chỉ sốcủa chiều có giá trịtừ 0đến kích thước chiều trừ Cú pháp chung sau:
Tên_biến_mảng[chỉsốchiều 1][Chỉsốchiều 2]…
²Mảng chiều xem mảng chiều có phần tử mảng chiều
²Ta khởi tạo giá trị cho phần tử mảng nhiều chiều định nghĩa Ví dụ:
int a[2][3] = {{5, 7, 9},{3, 6, 7}};
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 11
I.6 Chú ý về chỉ số của phần tử mảng ²Trình biên dịch C sẽ không báo lỗi chỉ số
dùng để truy nhập phần tử của mảng nằm ngoài khoảng cho phép, tức nhỏ hơn 0 hoặc lớn hơn kích thước mảng trừ 1. Điều này rất nguy hiểm bởi nếu ta ghi dữ liệu vào phần tử mảng với chỉ số nằm ngồi khoảng cho phép có thể ghi đè lên dữ liệu của chương trình khác đang chạy hoặc chính chương trình của ta.
12
I.7 Vào/ra với biến mảng
²Không dùng được lệnh printf scanf với cả biến mảng, chỉ dùng được với từng phần tử của mảng Ví dụ:
int a[5];
for(int i=0;i<5;++i)
{printf("Nhap vao phan tu thu %d: ”, i+1); scanf(“%d”,&a[i]);
}
(28)Lập trình nâng cao - Chương 05 - Ngô Công Thắng 13
Bài tập
1 Cho dãy số nguyên a1, a2, a3,…, an Sắp xếp dãy số tăng dần từ trái qua phải.
2 Cho dãy số a1, a2, a3,…, an Tính tổng và trung bình cộng số dương mà chia hết cho 3.
3 Cho ma trận nguyên có m hàng, n cột Tính tổng trung bình cộng phần tử dương chẵn. Đưa ma trận đã nhập kết quả ra hình Ma trận đưa phải theo hàng, cột.
14
II Xâu ký tự
1 Khái niệm về kiểu xâu ký tự 2 Khai báo biến xâu ký tự 3 Khởi tạo biến xâu ký tự 4 Vào/ra với biến xâu
5 Các hàm chuẩn xử lý xâu ký tự 6 Mảng xâu ký tự
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 15
II.1 Khái niệm về kiểu xâu ký tự ²Xâu ký tự là một dãy ký tự có ký tự cuối
cùng ký tự rỗng Ký tự rỗng có giá trị số là 0 viết '\0'.
²Xâu ký tự được C lưu trữ như một mảng ký tự, cho phép truy nhập vào từng ký tự của xâu như truy nhập vào từng phần tử của mảng Tuy nhiên, một số trường hợp C xem xâu ký tự như những kiểu dữ liệu cơ bản Ví dụ, có thể nhập vào và đưa cả biến xâu bằng lệnh scanf printf.
16
II.2 Khai báo biến xâu ký tự
²Khai báo biến xâu ký tự xác định tên biến xâu sốký tự cựcđại chứa biến xâu
²Cú pháp khai báo biến xâu ký tự giống cú pháp khai báo biến mảng chiều:
char Tên_biến_xâu[Kích thước]; Ví dụ:
char s[16];
trong số ký tự cực đại cho dạng biểu thức
(29)Lập trình nâng cao - Chương 05 - Ngô Công Thắng 17
II.3 Khởi tạo biến xâu
²Khi định nghĩa biến xâu ta có thể khởi tạo cho Dưới đây cách khởi tạo:
n Khởi tạo biến mảng:
char str[6] = {'D', 'H', 'N', 'N', 'I', '\0'};
n Khởi tạo xâu:
char str[6] = "DHNNI";
Hằng xâu dãy ký tự đặt dấu phẩy kép Khi viết xâu ta không viết ký tự '\0', ký tự trình biên dịch thêm vào Hằng xâu rỗng xâu khơng có ký tựnào ""
18
II.3 Khởi tạo biến xâu (tiếp)
²Lưu ý khởi tạo cho biến xâu xâu sốký tự cực đại biến xâu phải lớn sốký tự xâu 1, trình biên dịch
đưa thêm vào biến xâu ký tựrỗng Ví dụ: char str[5] = "DHNNI"; //Sai
char str[6] = "DHNNI"; //Đúng
²Cũng giống biến mảng, khởi tạo cho biến xâu không cần xác định số ký tự cực đại, trình biên dịch xác định số ký tự cực đại sốký tựcủa xâu cộng thêm Ví dụ: char str[] = "DHNNI";
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 19
II.4 Vào/ra với biến xâu
²Có thể dùng lệnh printf scanf với cả biến xâu Ví dụ:
char str[11];
printf(“%s”,str); scanf(“%s”,str);
²scanf chỉ nhập vào được xâu ký tự
khơng có dấu cách.
²Sử dụng gets(Biến xâu) để nhập vào xâu ký tự có cả dấu cách Ví dụ: gets(str);
20
II.5 Các hàm chuẩn xử lý xâu ký tự ²C có một thư viện hàm làm việc với xâu ký
tự là string.lib Muốn sử dụng hàm ta phải khai báo sử dụng:
#include<string.h>
²Hàm lấy độ dài của xâu: strlen(s) cho độ dài của xâu s (khơng tính ký tự '\0') Ví dụ: strlen(“08T1A”) => 5
²Hàm copy xâu: strcpy(s1, s2) copy xâu s2
(30)Lập trình nâng cao - Chương 05 - Ngô Công Thắng 21
II.5 Các hàm chuẩn xử lý xâu ký tự (tiếp) ²Hàm nối xâu: strcat(s1,s2) nối xâu s2 vào cuối biến xâu s1, s2 xâu biến xâu, biến xâu s1 phải có sốký tự cực đạiđủ chứa ký tự s2 thêm vào
²Hàm so sánh xâu: strcmp(s1,s2) so sánh hai xâu s1 s2 theo mã ASCII, có phân biệt chữ hoa chữ thường Hàm trảvề giá trịint:
< s1 < s2 ==0 s1 == s2 > s1 > s2
22
II.5 Các hàm chuẩn xử lý xâu ký tự (tiếp)
²Hàm đảo xâu: strrev(s) đảo ngược ký tự trong xâu s, đầu về cuối, cuối về đầu.
²Hàm chuyển chữ thường thành chữ hoa:
strupr(s) chuyển chữ cái thường trong
xâu s thành chữ hoa, chữ khác không
thay đổi.
²Hàm chuyển chữ hoa thành chữ thường:
strlwr(s) chuyển chữ cái hoa xâu s thành chữ thường, chữ khác không thay
đổi.
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 23
II.6 Mảng xâu ký tự
²Một mảng xâu ký tự hay sử dụng, chẳng hạn dùng để lưu trữ danh sách tên, danh sách mật khẩu, danh sách tên tệp,…
²Để tạo mảng biến xâu rỗng ta tạo mảng hai chiều xâu ký tự mảng mảng xâu ký tựthực chất mảng mảng
²Ví dụ: để lưu trữ họ tên, họ tên có tối đa 20 ký tự tađịnh nghĩa mảng xâu sau:
char names[5][21]; Đoạn chương trình cho phép người sử dụng nhập vào họ tên để lưu mảng
24
II.6 Mảng xâu ký tự (tiếp)
for(int i=0;i<5;++i) {
printf("Nhap vao mot ho ten (an enter de thoat): “); gets(names[i]);
if(strlen(names[i])==0) break;
(31)Lập trình nâng cao - Chương 05 - Ngô Công Thắng 25
II.6 Mảng xâu ký tự (tiếp)
²Ta cũng có thể khởi tạo mảng xâu khi
định nghĩa giống như các mảng khác Ví dụ: char Thu[7][] =
{"Thu Hai", "Thu Ba", "Thu Tu", "Thu Nam", "Thu Sau", "Thu Bay", "Chu Nhat"};
26
Bài tập chương 5
²Bài Viết chương trình nhập vào dãy n số nguyên, xếp dãy số theo thứ tự không giảm phương pháp xếp chọn
²Bài Hình vng kỳ ảo bậc n định nghĩa ma trận vuông cấp n cho:
n Chứađủn2sốtựnhiênđầu tiên (1, 2, 3,…, n2)
n Tổng sốtrên hàng tổng sốtrên cột tổng sốtrênđường chéo tổng số trênđường chéo phụ
Viết chương trình nhập vào sốtự nhiên lẻ n, đưa hình hình vng kỳ ảo bậc n lẻ
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 27
Bài tập chương (tiếp)
Ví dụ dưới đây hình vng kỳ ảo bậc 3 và bậc 5:
8
17 24 15 23 14 16 13 20 22 10 12 19 21 11 18 25
28
Bài tập chương (tiếp)
²Bài Viết chương trình nhập vào số tự nhiên n, đưa hình số nhị phân tương ứng dạng xâu ký tự
(32)Lập trình nâng cao - Chương 06 - Ngô Công Thắng Chương Kiểu cấu trúc kiểu liệt kê
I Kiểu cấu trúc (struct) II Kiểu liệt kê (enum)
2
I Kiểu cấu trúc
1 Khái niệm về kiểu cấu trúc 2 Khai báo kiểu cấu trúc 3 Khai báo biến cấu trúc
4 Truy nhập thành phần của cấu trúc 5 Khởi tạo biến cấu trúc
6 Phép gán biến cấu trúc 7 Mảng cấu trúc
Lập trình nâng cao - Chương 06 - Ngô Công Thắng
1 Khái niệm về kiểu cấu trúc
²Ngồi kiểu dữ liệu có sẵn C, người lập trình cịn có thể tạo những kiểu dữ liệu của riêng mình: Kiểu cấu trúc kiểu liệt kê.
²Một cấu trúc một nhóm phần tử có thể có kiểu dữ liệu khác Các phần tử này gọi thành phần của cấu trúc Kiểu cấu trúc C tương đương với kiểu bản ghi trong Pascal.
4
2 Khai báo kiểu cấu trúc
²Khai báo cấu trúc mô tả về các thành phần của cấu trúc Cú pháp như sau:
struct Tên_kiểu_cấu trúc {
Kiểu_1 Tên_thành_phần_1; Kiểu_2 Tên_thành_phần_2; .
};
Từ khoá
Các thành phần cấu trúc Dấu chấm phẩy kết thúc
(33)Lập trình nâng cao - Chương 06 - Ngơ Công Thắng
2 Khai báo kiểu cấu trúc (tiếp)
²Ví dụ: Để lưu trữ thơng tin nhân phịng tổ chức với thơng tin họtên, ngày sinh, địa chỉ, lương ta khai báo kiểu cấu trúc nhưsau:
struct nhansu {
char hoten[30]; char ngaysinh[10]; char diachi[40]; float luong; };
6
2 Khai báo kiểu cấu trúc (tiếp)
²Sau khai báo kiểu cấu trúc ta dùng tên kiểu cấu trúc tên kiểu liệu cơbản
²Kiểu thành phần cấu trúc kiểu cấu trúc, tức cấu trúc chứa cấu trúc khác Ví dụ:
struct ngaythang {
int ngay,thang,nam; };
struct nhansu {
char hoten[30];
ngaythang ngaysinh;
char diachi[40]; float luong; };
Lập trình nâng cao - Chương 06 - Ngô Công Thắng
3 Khai báo biến cấu trúc
²Việc khai báo kiểu cấu trúc không tạo ra vùng nhớ chứa cấu trúc mà chỉ mơ tả về cấu trúc xem có những gì.
²Muốn có vùng nhớ chứa cấu trúc ta phải khai báo biến cấu trúc Cú pháp:
struct Tên_kiểu_cấu_trúc Tên_biến_cấu trúc; Ví dụ:
struct nhansu ng1,ng2;
8
4 Truy nhập thành phần cấu trúc
²Để truy nhập thành phần cấu trúc ta dùng tốn tử chấm Cú pháp:
Tên_biến_cấu_trúc.Tên_thành_phần Ví dụ:
struct thisinh {
char SBD[15]; float toan,ly,hoa; } ts;
//Khai bao bien cau truc thisinh ts;
//Nhap du lieu cho thi sinh
(34)Lập trình nâng cao - Chương 06 - Ngơ Cơng Thắng
5 Khởi tạo biến cấu trúc
² Khi khai báo biến cấu trúc ta có thểkhởi tạo giá trị cho thành phần cấu trúc khởi tạo cho phần tử mảng
Ví dụ:
//Khai bao kieu cau truc struct thisinh
{
char SBD[15]; float toan,ly,hoa; };
//Khai bao va khoi tao bien cau truc struct thisinh ts={"NNHA23456", 7, 8, 9};
10
6 Phép gán biến cấu trúc
²Ta gán biến cấu trúc cho biến cấu trúc kiểu Ví dụ:
//Khai bao kieu cau truc struct thisinh
{
char SBD[15]; float toan,ly,hoa; };
//Khai bao bien cau truc
struct thisinh ts1={"NNHA23456",7,8,9}; struct thisinh ts2;
ts2=ts1;
Lập trình nâng cao - Chương 06 - Ngô Công Thắng 11
7 Mảng cấu trúc
²Sau khai báo kiểu cấu trúc tên kiểu cấu trúc
được dùng kiểu liệu khác Chẳng hạn, dùng cấu trúc làm kiểu phần tử mảng
Ví dụ:
//Khai bao kieu cau truc struct thisinh
{
char SBD[15]; float toan,ly,hoa; };
//Khai bao bien cau truc thisinh ds[100];
strcpy(ds[0].SBD,"NNHA23456"); ds[0].toan=8;
ds[0].ly=8; ds[0].hoa=9;
12
Ví dụ
Viết chương trình quản lý điểm mơn học sinh viên Mỗi sinh viên có thơng tin họ tên, lớp,
(35)Lập trình nâng cao - Chương 06 - Ngô Công Thắng 13
II Kiểu liệt kê
²Kiểu liệt kê kiểu liệu người lập trình tự
định nghĩa cách liệt kê tất giá trị Các giá trịcủa kiểu liệt kê tên tự đặt
²Để định nghĩa kiểu liệt kê ta dùng từ khóa enum
theo cú pháp sau:
enum Tên_kiểu_liệt_kê {Danh sách tên tự đặt};
Ví dụ:enum boolean {TRUE, FALSE}; enum mausac {Xanh, Do, Tim, Vang};
enum days_of_week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
14
II Kiểu liệt kê (tiếp)
²Sau khai báo kiểu liệt kê ta có thể khai báo biến kiểu liệt như các biến kiểu khác: Tên_kiểu_liệt_kê Danh_sách_các_biến;
Ví dụ: Giả sử các kiểu liệt kê đã được khai báo ở trên, ta khai báo biến liệt kê:
days_of_week day1, day2;
²Để đưa giá trị vào biến liệt kê ta dùng lệnh gán:
Ví dụ: day1 = Mon; day2 = Sat;
Lập trình nâng cao - Chương 06 - Ngơ Cơng Thắng 15
II Kiểu liệt kê (tiếp)
²Các giá trị kiểu liệt kê lưu trữ số nguyên kiểu int, giá trị tên 0, giá trị tên 1,…
Ví dụ: Với kiểu liệt kê days_of_week Sun có giá trị0, Mon có giá trị1, Tue có giá trị3,…
²Ta thayđổi giá trịsốcủa giá trịtên
n Cho giá trịtên có giá trịsốbắtđầu từmột sốkhác Ví dụ: enum mausac {Xanh=5, Do, Tim, Vang};
(36)Lập trình nâng cao - Chương 07 - Ngô Công Thắng Chương Con trỏ
I. Địa chỉvà trỏ
II Con trỏ, mảng xâu ký tự
III Quản lý bộ nhớ với hàm malloc() free() IV Bài tập chương 7
2
I Địa chỉ trỏ
1. Địa chỉ(hằng trỏ) 2 Toán tử địa chỉ& 3 Khai báo biến trỏ
4 Truy nhập biến qua trỏ 5 Con trỏ void và trỏ NULL 6 Các phép toán trỏ 7 Con trỏ trỏtới trỏ
Lập trình nâng cao - Chương 07 - Ngô Công Thắng
1 Địa chỉ (hằng trỏ)
²Mỗi byte bộ nhớ máy tính có một địa chỉ Các địa chỉ này số bắt đầu từ 0 trở
đi Ví dụ có MB bộ nhớ thì địa chỉ thấp nhất và địa chỉ cao nhất 1.048.575.
²Bất kỳ chương trình khi được nạp vào bộ nhớ đều chiếm một khoảng địa chỉ. Điều đó có nghĩa mọi biến mọi hàm trong chương trình đều bắt đầu tại một địa chỉ cụ thể Hình 7.1 cho thấy các địa chỉ bộ nhớ.
4
1 Địa chỉ (hằng trỏ) tiếp
Hình 7.1Địa chỉbộnhớ
0
chương trình
655.359
var1 var2 var3
var4
int char float int 314.810
(37)Lập trình nâng cao - Chương 07 - Ngơ Cơng Thắng
2 Toán tử địa chỉ &
²Toán tử địa chỉ ký hiệu &, được dùng
để lấy địa chỉ của một biến Toán tử & phải đặt trước tên biến muốn lấy địa chỉ. Ví dụ: Chương trình sau sẽ đưa ra địa chỉ của biến nguyên a, b, c.
6
3 Khai báo biến trỏ
²Vì địa nhớ số nên lưu trữ biến giống giá trị kiểu int, char float Một biến mà chứa giá trị địa gọi biến trỏ hay gọi tắt trỏ Nếu trỏ chứa địa biến ta nói trỏtrỏ tới biếnđó
²Để khai báo biến trỏta dùng cú pháp sau: Kiểu* Tên_biến_con_trỏ;
trong Kiểulà kiểu liệu đối tượng mà biến trỏ trỏ tới Dấu * có nghĩa trỏ tới Nên để dấu * bên cạnh tên kiểu để nhấn mạnh phần kiểu khơng phải tên biến trỏ
Lập trình nâng cao - Chương 07 - Ngô Công Thắng
3 Khai báo biến trỏ (tiếp)
² Ví dụ: int a; int* ptr; ptr = &a;
Lệnh khai báo biến trỏ có tên ptr trỏ tới sốnguyên int Nói cách khác trỏptr có thểchứađịa biến nguyên
² Để khai báo nhiều biến trỏ trỏtới kiểu dữliệu ta viết:
Kiểu *Biến1, *Biến2, *Biến3,…;
Mặc dù dấu * để cạnh tên biến trỏ nên hiểu phần kiểu
Ví dụ: int *p, *q;
8
3 Khai báo biến trỏ (tiếp)
²Khi khai báo biến trỏ biến trỏ chứa giá trị vô nghĩa (trừ khởi tạo) Giá trị vơ nghĩa địa nhớ nàođó nằm phần chương trình ta hệ
điều hành Điều nguy hiểm ta đưa giá trị vào ô nhớ trỏ trỏ tới Bởi vậy, trước sử dụng trỏta phảiđưađịa chỉvào
(38)Lập trình nâng cao - Chương 07 - Ngô Công Thắng
4 Truy nhập biến qua trỏ
²Một câu hỏi đặt nếu không biết tên một biến mà chỉ biết địa chỉ của có truy nhập được vào biến đó khơng? Câu trả lời là có Con trỏ chứa địa chỉ của một biến nên ta có thểtruy nhập biến qua trỏ.
²Để truy nhập tới biến trỏ ptr trỏ tới ta dùng toán tử truy nhập gián tiếp * đặt trước tên biến trỏ: *ptr *ptr tương đương với tên của biến, chỗ nào dùng được tên biến thì chỗ đó dùng được *ptr.
10
4 Truy nhập biến qua trỏ
²Toán tử truy nhập gián tiếp ký hiệu * có nghĩa làgiá trịcủa biếnđược trỏtới biến con trỏ nằm bên phải nó, khác với dấu * khai báo biến trỏcó nghĩa làtrỏtới
²Ví dụ:
int v; //Khai báo biến có kiểu int
int* p; //Khai báo biến trỏp trỏtới int p = &v; //Gánđịa chỉcủa biến v cho trỏp v = 3; //Gán vào v
*p = 3; //Gán vào v gián tiếp qua trỏp v p
Lập trình nâng cao - Chương 07 - Ngô Công Thắng 11
5 Con trỏ trỏ tới void và trỏ NULL ²Ta biết trỏ trỏ tới kiểu chứa
được địa biến kiểu Tuy nhiên C++ cịn có loại trỏ đa trỏ tới bất kỳkiểu dữliệu Con trỏ gọi trỏtrỏ tới void Khai báo trỏtrỏtới void nhưsau:
void* ptr;
²Con trỏNULL trỏkhơng trỏtới gì, chứa giá trị rỗng (bằng 0) Để có trỏ rỗng ta gán giá trị vào biến trỏ Ta sử dụng tên đểtạo trỏrỗng
int* ptr=NULL;
12
5 Con trỏ trỏ tới void và trỏ NULL (tiếp) ²Ví dụ:
int ivar; float fvar; int* iptr; float* fptr; void* vptr; iptr = &ivar;
//iptr = &fvar; //lỗi gán float* tới int* fptr = &fvar;
(39)Lập trình nâng cao - Chương 07 - Ngơ Cơng Thắng 13
6 Các phép toán trỏ ²Các phép tốn số học:
n Chỉcó phép toán dùng với trỏlà +, -,
++,
n Khi cộng trừ biến trỏvới số số
đó phải ngun
n Các phép toán số học tác động trỏ khác
với bình thường Cụ thể tăng biến trỏ lên đơn vị địa chứa biến trỏ không tăng lên mà tăng lên lượng kích thước kiểu liệu trỏtrỏ tới (thường với kiểu int, với kiểu float với kiểu double)
14
6 Các phép toán trỏ (tiếp)
n Ví dụ: giả sử p trỏ int chứa địa 200, sau
lệnh ++p;
được thực p sẽcó giá trị 202 Nếu p trỏ float sau lệnh p sẽcó giá trịlà 204
²Các phép tốn so sánh: có thể so sánh hai biến trỏ bằng phép toán so sánh Tuy nhiên việc so sánh chỉ có ý nghĩa trong hai trường hợp sau:
n So sánh hai trỏ đểxem chúng có trỏNULL
khơng
Lập trình nâng cao - Chương 07 - Ngô Công Thắng 15
6 Các phép toán trỏ (tiếp)
n So sánh hai trỏ chúng liên quan tới mộtđối
tượng, chẳng hạn trỏtới biến
²Phép gán: Có thể gán biến trỏ cho biến trỏcó kiểu trỏtới
²Lưu ý: Khi dùng toán tửtăng giảm với biến trỏtrỏtới phải ý thứ tự thực phép tốn Ví dụ: ta viết
*p++;
thì trỏsẽ tăng lên biến trỏ trỏ tới tăng lên 1, phép tốn * ++ mức ưu tiên, kết hợp từ phải qua trái Muốn tăng biến trỏtrỏtới ta phải viết:
(*p)++;
16
7 Con trỏ trỏ tới trỏ
²Trong C++, một trỏ có thể trỏ tới một con trỏ khác, tức một trỏ có thể chứa
địa chỉ của một biến trỏ khác.
Giá trị Biến Địa
Con trỏ
Giá trị Biến Địa
Con trỏ Địa
(40)Lập trình nâng cao - Chương 07 - Ngô Công Thắng 17
7 Con trỏ trỏ tới trỏ (tiếp)
² Để khai báo biến trỏ trỏ tới trỏ ta dùng thêm dấu * Ví dụ:
int** p; //p trỏtrỏtới trỏint
² Đểtruy nhập tới biến qua trỏtrỏtới trỏta phải dùng hai lần toán tửtruy nhập gián tiếp Kiểu truy nhập gọi truy nhập gián tiếp bội (Multiple Indirection) Ví dụ:
char ch; char* p; char** mp; ch='A'; p=&ch; mp=&p;
cout<<"Ky tu nam bien ch la: "<<**mp;
18
II Con trỏ, mảng xâu ký tự
1 Con trỏ và mảng 2 Con trỏ và xâu ký tự
Lập trình nâng cao - Chương 07 - Ngô Công Thắng 19
1 Con trỏ mảng
² Con trỏ sử dụng để truy nhập vào phần tử mảng làmđối sốtruyền vào hàm Và mảng làmđối số truyền vào hàm trỏcũng hữu ích
² Các phần tửcủa mảng truy nhập qua ký hiệu mảng ([]) ký hiệu trỏ(*) Ví dụ:
int a[5]={31,54,77,52,93}; int i;
//Dua bang ky hieu cua mang for(i=0;i<5;i++) printf("%i ",a[i]); //Dua bang ky hieu cua tro for(i=0;i<5;i++) printf("%i ",*(a+i));
20
1 Con trỏ mảng (tiếp)
²Biểu thức *(a+i) tương đương với a[i] Ví dụ, với i=2 *(a+2) phần tử thứ3 (có giá trịlà 77)
(41)Lập trình nâng cao - Chương 07 - Ngô Công Thắng 21
1 Con trỏ mảng (tiếp) ²Địa chỉ của phần tử mảng
31 54 77 52 93
a[0] a[1] a[2] a[3] a[4]
a a+1 a+2 a+3 a+4
Địa phần tử
22
1 Con trỏ mảng (tiếp)
²Hằng trỏ và biến trỏ: Tên biến mảng một địa chỉ cụ thể mà hệ thống đã chọn để đặt mảng. Địa chỉ này không thể thay đổi nó được trì biến mảng cịn tồn tại Người ta gọi các địa chỉ không thay đổi được hằng trỏ Vì tên biến mảng a ở ví dụ trên hằng nên ta khơng thể viết a++ hay a+=2.
Một địa chỉ thì khơng thể thay đổi nhưng biến trỏ chứa địa chỉ thì có thể thay đổi.
Lập trình nâng cao - Chương 07 - Ngô Công Thắng 23
1 Con trỏ mảng (tiếp) ²Hằng trỏ và biến trỏ: (tiếp)
Ví dụ sau dùng biến trỏ để đưa phần tử của mảng:
int a[5]={31,54,77,52,93}; int i;
int *p=a; //p tro toi phan tu dau tien cua mang a //Dua bang bien tro
cout<<"Dua bang bien tro: "<<'\n'; for(i=0;i<5;i++) cout<<*p++<<' ';
24
2 Con trỏ xâu ký tự
²Như ta biết, xâu ký tự thực chất mảng ký tự Bởi ta dùng ký hiệu trỏ để truy nhập vào ký tự xâu giống truy nhập vào phần tử mảng Ví dụ:
char s[6]=”DHNNI”;
cout<<*(s+1);//Dua ky tu thu la H
²Con trỏ trỏ tới xâu ký tự: Khi khai báo khởi tạo biến xâu ký tự ta khai báo mảng ký tự khai báo trỏ trỏ tới kiểu ký tự Ví dụ:
(42)Lập trình nâng cao - Chương 07 - Ngô Công Thắng 25
2 Con trỏ xâu ký tự (tiếp)
Sau khai báo ta hai biến xâu ký tựs1 s2 Tuy nhiên hai biến xâu có khác nhau: s1 địa chỉ, trỏ, s2 biến trỏ; s2 thay
đổi cịn s1 khơng thểthayđổi Ví dụ: char s1[]="Khai bao nhu mot mang"; char* s2 ="Khai bao nhu mot tro"; cout<<s1<<'\n';
cout<<s2<<'\n';
//s1++; //Bao loi, s1 la hang tro s2++; //Duoc
cout<<s2; //Chi hien: hai bao nhu mot tro
Chú ý:Khi thayđổi s2 ký tự xâu sẽthayđổi
Ởví dụtrên, sau tăng s2 lên ký tự xâu h
26
2 Con trỏ xâu ký tự (tiếp) ²Mảng trỏ trỏ tới hằng xâu ký tự:
n Giống mảng biến kiểu int float, ta
cũng có mảng trỏ Mảng trỏ hay dùng mảng trỏtrỏtới xâu ký tự
n Ta xét hai cách khai báo sau đây: //Dùng mảng hai chiều
char days[7][10]={"Sunday","Monday","Tuesday","Wednesday", "Thursday","Friday","Saturday"};
//Dùng trỏ
char* days[7]={"Sunday","Monday","Tuesday","Wednesday", "Thursday","Friday","Saturday"};
Lập trình nâng cao - Chương 07 - Ngô Công Thắng 27
2 Con trỏ xâu ký tự (tiếp)
²Mảng trỏtrỏtới xâu ký tự: (tiếp)
wNếu khai báo theo mảng hai chiều mảng chứa xâu ký tựphải có kích thước (10) Do đó, với xâu có số ký tự nhỏ 10 sẽgây lãng phí bộnhớ
wNếu khai báo theo trỏ trình biên dịch C++
để xâu ký tựliên tiêp nhớvà dùng mảng trỏ để trỏ tới xâu (Hình trang sau cho thấy xâu ký tựtrong nhớ) Một xâu ký tựlà mảng kiểu char, dođó mảng trỏ trỏ tới xâu ký tự thực chất mảng trỏ trỏ tới char.Đây lý ta khai báo char*
28
2 Con trỏ xâu ký tự (tiếp)
S u n d a y \0 M o n d a y \0 T u e f200 f199 f198 f197 f196 f195 f194 f193 f192 f191 f190 f189 f188 f187 f186 f185 f184 f200 f193 f186 f178 f168 f168 f160 f153 f144
Mảng trỏ
Các xâu ký tự
Địa ký tự
đầu tiên
địa xâu Các địa
(43)Lập trình nâng cao - Chương 07 - Ngô Công Thắng 29
Bài tập
Viết chương trình nhập vào một họ tên Tách tên và đưa tên hình.
30
III Quản lý bộ nhớ với malloc free
1 Cách sử dụng bộ nhớ của một chương trình C 2 Các loại biến chương trình C
3 Hạn chế của mảng 4 Hàm malloc() free() 5 Mảng động
Lập trình nâng cao - Chương 07 - Ngô Công Thắng 31
1 Cách sử dụng bộ nhớ của một chương trình C ²Một chương trình C
chạy chiếm vùng nhớ nhớ Vùng nhớ nàyđược chia thành phần: phần chứa mã chương trình, phần chứa biến tĩnh biến (gọi Heap), phần chứa biến tự động (gọi Stack) Stack mở rộng từ
địa cao xuống địa thấp, Heap mở rộng từ địa chỉthấp lênđịa chỉcao
Địa cao
Địa thấp
Stack
Heap
Mã chương trình
Biến tồn cục
32
2 Các loại biến chương trình C
a) Sự khác khai báo vàđịnh nghĩa
(44)Lập trình nâng cao - Chương 07 - Ngơ Cơng Thắng 33
a) Sự khác giữa khai báo định nghĩa ²Một khai báo (declaration) xác định tên kiểu
dữ liệu Nhiệm vụ khai báo cung cấp thơng tin cho trình biên dịch, khơng u cầu trình biên dịch làm bất cứviệc
²Trái lại, định nghĩa (definition) yêu cầu trình biên dịch phải cấp phát bộnhớ cho biến
²Trong số trường hợp khai báo yêu cầu trình biên dịch cấp phát bộnhớ, chẳng hạn khai báo biến Tuy nhiên, với định nghĩa trường hợp yêu cầu cấp phát bộnhớ
34
b) Thời gian tồn phạm vi hoạt động loại biến
²Các loại biến có hai đặc tính phạm vi hoạt
động thời gian tồn Phạm vi hoạt động liên quan đến phần chương trình truy nhập (sử dụng) biến Thời gian tồn khoảng thời gian trongđó biến tồn Phạm vi hoạt động biến lớp, hàm, file hay số file Thời gian tồn biến trùng với mộtđối tượng, hàm hay tồn bộchương trình
²Có loại biến sau: biến tự động, biến ghi, biến khối lệnh, biến ngồi, biến tĩnh
Lập trình nâng cao - Chương 07 - Ngô Công Thắng 35
Các biến tự động (automatic variable) ²Các biến tự động biến được khai báo
trong một hàm Sở dĩ gọi chúng biến tự
động bởi chúng được tự động tạo hàm
được gọi bị hủy hàm kết thúc.
n Biến tự động có phạm vi hoạt động
hàm Do đó, biến i khai báo hàm hoàn toàn khác với biến iđược khai báo hàm khác
n Mặc định biến tự động không khởi tạo,
bởi sau chúng hình thành chúng có giá trịvơ nghĩa
36
Các biến ghi (register variable)
²Biến ghi loại biến tự động đặc biệt Nó
được đặt ghi CPU nhớ Việc truy nhập biến ghi nhanh biến thơng thường Biến ghi có lợi dùng làm biến điều khiển cho lệnh lặp bên trong lệnh lặp lồng Ta nên dùng đến hai biến ghi hàm
²Để khai báo biến ghi ta dùng từ khóa register trước khai báo biến thơng thường
(45)Lập trình nâng cao - Chương 07 - Ngô Công Thắng 37
Các biến khối lệnh
²Các biến tự động có thể được khai báo ở bất kỳ đâu một hàm hoặc một khối lệnh Khối lệnh phần chương trình nằm giữa hai dấu ngoặc { }, chẳng hạn như thân lệnh if hay thân lệnh lặp Các biến được khai báo một khối lệnh có phạm vi hoạt
động chỉ trong khối lệnh đó.
38
Các biến (external variable) ²Các biến biến được khai báo ở
bên ngồi tất cả các hàm Các biến ngồi có phạm vi hoạt động từ vị trí khai báo đến cuối file khai báo chúng Thời gian tồn tại của các biến ngồi thời gian tồn tại của chương trình, tức chương trình kết thúc các biến mới bị hủy Khác với biến tự
động, biến ngoài được tự động khởi tạo bằng nếu ta khơng khởi tạo.
Lập trình nâng cao - Chương 07 - Ngô Công Thắng 39
Các biến (tiếp)
//Bat dau file
int a; //a la bien ngoai
void afunc();
//Cuoi file
40
Các biến ngồi (tiếp)
²Nếu chương trình được chia thành nhiều file thì biến ngồi chỉ có thể dùng được trong
file khai báo chúng, không dùng được trong
các file khác. Để sử dụng một biến ngoài đã
được định nghĩa ở một file ta phải khai báo biến đó dùng từ khóa extern.
²Để các biến chỉ truy nhập được trong file khai báo chúng, không truy nhập được từ
file khác ta dùng từ khóa static Từ khóa
(46)Lập trình nâng cao - Chương 07 - Ngơ Cơng Thắng 41
Các biến ngồi (tiếp) Ví dụ1: Truy nhập biến nhiều file //Bat dau file
int a; //a la bien ngoai //Cuoi file
//Bat dau file
extern int a; //khai bao su dung bien ngoai a o file //Trong file co the truy nhap bien a
//Cuoi file
//Bat dau file
//Khong khai bao su dung bien ngoai a nen file // khong the truy nhap bien a
//Cuoi file
42
Các biến (tiếp)
Ví dụ2: Hạn chếviệc truy nhập biến ngồi //Bat dau file
static int a; //dinh nghia bien ngoai a
//bien a chi truy nhap duoc file //Cuoi file
//Bat dau file
extern int a; //Khong dung duoc khai bao //Cuoi file
Lập trình nâng cao - Chương 07 - Ngơ Cơng Thắng 43
Các biến ngồi (tiếp) ²Có hai vấn đề khi sử dụng biến ngồi:
n Vì biến ngồi truy nhập từ
hàm chương trình nên dễ bị thayđổi làm dữliệu
n Vì biến ngồi có phạm vi hoạt động
nơi chương trình nên ta phải quan tâm đến vấn đề kiểm soát tên biến để cho khơng có hai biến trùng tên
44
Các biến tĩnh cục bộ (local static) ²Các biến tĩnh cục bộ được sử dụng ta
(47)Lập trình nâng cao - Chương 07 - Ngơ Công Thắng 45
3 Hạn chế của việc lưu trữ bằng mảng ²Mảng hay sử dụng cần lưu trữ số
lượng lớn biến hay đối tượng Tuy nhiên thời
điểm viết chương trình ta phải xác định kích thước mảng khơng đợi đến chương trình thực hiện.Đoạn chương trình sau sinh lỗi:
printf(“Nhap vao kich thuoc mang: ”);scanf(“%i”,&size);
int a[size]; //Lỗi, kích thước mảng phải
²Trong nhiều trường hợp, thời điểm viết chương trình ta khơng biết cần bộnhớ Nếu dự trù nhiều mà không dùng hết lãng phí nhớ, dự trù mà cần lưu trữ nhiều khơng có chỗ chứa Vấn đề khắc phục chế cấp phátđộng bộnhớ hàm malloc() free()
46
4 Hàm malloc() free()
²Trong C có hàm thực hiện chức năng cấp phát và giải phóng bộ nhớ, đó hàm malloc() và free() Muốn sử dụng hai hàm chương trình ta phải khai báo sử dụng thư viện stdlib (#include<stdlib.h>).
²Cú pháp cấp phát bộnhớ động như sau:
Biến_con_trỏ = (Kiểu_dl_của_biến*) malloc(sizeof(Kiểu_dl_của_biến)); trong đó Biến trỏ phải được khai báo trỏ
đến kiểu dữ liệu của biến. Ví dụ: int* p=NULL;
p = (int*) malloc(sizeof(int));
Lập trình nâng cao - Chương 07 - Ngô Công Thắng 47
4 Hàm malloc() free()
²Hàm malloc() sẽ cấp phát một ô nhớ trong phần nhớ Heap chương trình đang chạy, đủ
để chứa một giá trị có kiểu Kiểu_dl_của_biến và trảvề một trỏ trỏ tới nó.
²Vì kích thước phần Heap có giới hạn nên có thể sẽ hết Nếu phần nhớ Heap đã hết mà ta vẫn cấp phát hàm malloc() sẽ trả về con trỏ rỗng (NULL) Bởi vậy, luôn phải kiểm tra con trỏ được trả về bởi hàm malloc() trước dùng nó.
if(!Biến_con_trỏ) printf(“Cap phat bo nho bi loi!”);
48
4 Hàm malloc() free() (tiếp) ²Cú pháp giải phóng bộ nhớ được cấp phát bởi
hàm malloc()
free(p);
Trong đó p trỏ trỏ tới vùng nhớ được cấp phátđộng bởi hàm malloc().
(48)Lập trình nâng cao - Chương 07 - Ngơ Cơng Thắng 49
4 Hàm malloc() free() (tiếp) ²Ví dụvềsử dụng hàm malloc() free():
//Khai bao su dung thu vien chuong trinh #include<stdio.h>
#include<stdlib.h> int main() {
int* p;
p = (int*) malloc(sizeof(int)); //cap phat bo nho chua kieu int if(p != NULL)
{
printf("Cap phat bo nho bi loi“); return 1;
}
*p=100; //Gan 100 vao o nho vua duoc cap
printf(”*p = %i”,*p); //Hien thi noi dung cua o nho vua duoc cap free(p); //Giai phong o nho vua duoc cap
return 0; }
50
5 Cấp phát mảng động với calloc()
² Với cơchế cấp phát động bộnhớ ta cấp phát nhớ cho cảmột biến mảng.Điều cho phép xácđịnh sốphần tử mảng chạy chương trình Đểcấp phát động cho mảng chiều ta dùng hàm calloc() với cú pháp sau:
Biến_con_trỏ= (KPT*) calloc(size, sizeof(KPT));
trong KTP kiểu phần tử, size số phần tửcủa mảng size có thểlà hằng, biến biểu thức
int a[100];
int *a = (int*) calloc(100,sizeof(int)); a[0]=25; a[1]=15;
² Để giải phóng vùng nhớ cấp phát cho mảng ta dùng hàm free() vớiđối sốlà Biến trỏtrỏtới mảng:
free(Biến_con_trỏ);
Ví dụ
Nhập vào dãy số nguyên có n phần tử Tìm phần tử có giá trị lớn nhất.
Lập trình nâng cao - Chương 07 - Ngơ Cơng Thắng 51
52
5 Mảng động (tiếp)
²Với mảng động ta thay đổi kích thước mảng mà giữ nội dung mảng banđầu
²Để thayđổi kích thước mảngđộng ta dùng hàm realloc() với cú pháp sau:
p = (KPT*) realloc(p, size_new);
Trong KPT kiểu phần tử, p trỏ trỏ tới mảng động, size_new kích thước mảng
động
(49)Ví dụ
Nhập vào dãy số ngun có n phần tử Chèn thêm phần tử x vào cuối dãy.
Lập trình nâng cao - Chương 07 - Ngơ Công Thắng 53
54
5 Mảng động (tiếp)
²Ví dụvề mảngđộng:
//Khai bao su dung thu vien chuong trinh #include<stdio.h>
#include<stdlib.h> int main() {
int* a; int n,i;
printf("Nhap vao so phan tu cua mang: ");scanf("%i",&n);
a = (int*) calloc(n, sizeof(int));//Cap phat bo nho cho mang n phan tu nguyen if(!a)
{
printf("Cap phat bo nho bi loi"); return 1;
}
//Tiếp trang sau
Lập trình nâng cao - Chương 07 - Ngô Công Thắng 55
5 Mảng động (tiếp) ²Ví dụ về mảng động: (tiếp)
//Nhap cac gia tri vao mang
printf("Nhap vao mang so nguyen:\n" ); for(i=0;i<n;i++)
{
printf("Nhap vao so thu %i: ",i+1); scanf(“%i“,&a[i]); }
//Mo rong kich thuoc mang them 10 phan tu a = (int*) realloc(a, n + 10);
//Dua cac so nhap vao man hinh printf("Cac so da nhap la:\n"); for(i=0;i<n;i++) printf("%i ",a[i]);
free(a); //Giai phong vung nho cap phat cho mang return 0;
}
56
Bài tập chương 7
²Bai Cho dãy số nguyên a1, a2, a3,…, an Sắp xếp dãy số tăng dần Yêu cầu chương trình có sử dụng mảng độngđể chứa dãy số
²Bài Viết chương trình nhập vào dãy n số nguyên, lưu dãy sốnày danh sách liên kết
đơn P Hãy tạo danh sách liên kết đơn Q đảo ngược P
²Bài Viết chương trình nhập vào dãy n số nguyên, lưu dãy sốnày danh sách liên kết
(50)Lập trình nâng cao - Chương 08 - Ngô Công Thắng Chương Hàm C
I Khai báo hàm II. Định nghĩa hàm III Sử dụng hàm
IV Con trỏ trỏtới hàm V Xây dựng thư viện hàm
2
I Khai báo hàm
1 Giới thiệu về hàm 2 Cú pháp khai báo hàm
3 Các tham số trong khai báo hàm
Lập trình nâng cao - Chương 08 - Ngô Công Thắng
1 Giới thiệu về hàm
²Trong C tất chương trình conđều gọi hàm
²Ngồi hàm thư viện có sẵn, người lập trình tự tạo hàm Để tạo hàm người lập trình phải khai báo định nghĩa
²Khai báo hàm (function declaration or prototype) xác định tên hàm, kiểu liệu trả về, số lượng tham sốvà kiểu tham số
²Định nghĩa hàm (function definition) xác định công việc mà hàm thực thông qua lệnh hàm
²Các hàm C không lồng nhau, tức hàm ta định nghĩa hàm khác
4
2 Cú pháp khai báo hàm
²Cú pháp khai báo hàm nằm một dòng, kết
thúc bằng dấu chấm phẩy.
Kiểu_trả_vềTên_hàm(Kiểu_1 Tên_tham_số_1, Kiểu_2 Tên_tham_số_2,…);
Ví dụ: float inchtomet(float x); int cong(int a, int b);
²Một khai báo hàm không cho biết những có
trong thân hàm Nó chỉ báo cho trình biên dịch
(51)Lập trình nâng cao - Chương 08 - Ngơ Cơng Thắng
2 Cú pháp khai báo hàm (tiếp)
²Khai báo hàm đặt đâu trước gọi hàm Tốt để đầu tệp chứa chương trình (chứa hàm main) để trước hàm gọi Trong chương trình nhiều file khai báo hàm thườngđể file header có h, cịn cácđịnh nghĩa hàm để file thư viện có obj lib
²Nếu hàm định nghĩa trước gọi hàm khơng cần khai báo hàm Tuy nhiên nên có khai báo hàm chương trình có nhiều hàm lớn hay chương trình nằm nhiều file
6
3 Các tham số khai báo hàm
²Nếu hàm khơng có tham số thì dấu
ngoặc đơn của khai báo hàm để trống Ví dụ: int xoa();
²Tên của tham số trong khai báo hàm có
thể khơng cần xác định Ví dụ: float inchtomet(float, float);
Lập trình nâng cao - Chương 08 - Ngô Công Thắng
II Định nghĩa hàm
1 Cú pháp định nghĩa hàm 2 Lệnh return
3 Hàm không trả về giá trị
8
1 Cú pháp định nghĩa hàm
Kiểu_trả_vềTên_hàm(Kiểu_1 Tên_tham_số_1, Kiểu_2 Tên_tham_số_2,…) {
//Các lệnh hàmđể }
Ví dụ:
int cong(int a, int b) {
int z; z = a + b; return z; }
(52)Lập trình nâng cao - Chương 08 - Ngô Công Thắng
1 Cú pháp định nghĩa hàm (tiếp) ²Dòng đầu tiên trong định nghĩa hàm giống
trong khai báo hàm, chỉ khác khơng có dấu chấm phẩy tham số bắt buộc phải có tên.
²Khi đã có khai báo hàm thì định nghĩa hàm thường để sau hàm main hoặc để trong một tệp obj (lib). Để quen dần với việc viết các chương trình lớn, thực hành viết các khai báo hàm tệp h, các định nghĩa hàm để trong tệp obj (lib).
10
2 Lệnh return
²Lệnh return sử dụng hàm Lệnh return thực hai chức năng:
n Làm cho hàm trởvềchương trình gọi n Được dùngđểtrảvềmột giá trị
²Cú pháp dùng lệnh return sau: return Giá_trị_trả_về; return;
²Lệnh return dùng vị trí hàm thườngởcuối hàm
²Với hàm có trả giá trịthì lệnh return bắt buộc phải có
Lập trình nâng cao - Chương 08 - Ngô Công Thắng 11
3 Hàm không trả về giá trị
²Với hàm không trả về giá trị thì khai báo và định nghĩa hàm ta phải khai báo kiểu trả về là void Ví dụ:
void chao();
²Nếu sử dụng lệnh return hàm khơng trả vềgiá trịthì chỉdùngđược dạng:
return;
12
III Sử dụng hàm
1 Lời gọi hàm
2 Truyền đối số theo giá trị 3 Truyền đối số theo tham chiếu 4 Truyền trỏ tới hàm
(53)Lập trình nâng cao - Chương 08 - Ngơ Cơng Thắng 13
1 Lời gọi hàm
²Một hàm, sau định nghĩa khai báo, có
thể thực lệnh gọi hàm (lời gọi
hàm) chương trình Có thể gọi từ hàm main, gọi từ hàm khác gọi từmột hàm thành viên lớp
²Cú pháp gọi hàm sau:
Tên_hàm(Danh sách cácđối số, có);
²Nếu hàm khai báo định nghĩa có tham số gọi hàm ta phải truyền giá trị cho hàm qua tham số Các giá trịtruyền cho hàm gọi đối số Cácđối sốcó thể hằng, biến, mảng, trỏ,…
14
1 Lời gọi hàm (tiếp)
²Ví dụ: giả sử ta khai báo hàm cộng hai giá trị float
int cong(int a, int b); Ta gọi hàm sau: cong(7,8);
²Lời gọi hàm có trả giá trị sử dụng biểu thức, lời gọi hàm không trả giá trị không dùng biểu thức Khi dùng biểu thức khơng có dấu chấm phẩy sau lời gọi hàm Ví dụ:
a = cong(7,8) +2; cout<<a;
Lập trình nâng cao - Chương 08 - Ngô Công Thắng 15
1 Lời gọi hàm (tiếp) ²Hoạt động của lời gọi hàm
sdfghjkl sdfghjkl
func1();
sdfghjkl sdfghjkl
func1();
sdfghjkl sdfghjkl
func1();
sdfghjkl
Chương trình gọi hàm
Lời gọi hàm
void func1() {
sdfghjkl sdfghjkl sdfghjkl
}
Cùng mã dùng cho tất lời gọi hàm
16
Ví dụ về hàm
(54)Lập trình nâng cao - Chương 08 - Ngơ Công Thắng 17
2 Truyền đối số theo giá trị (tiếp) ²Trong C, các đối số truyền vào cho hàm là
truyền theo giá trị.
²Khi truyền đối số cho hàm theo giá trị thì hàm sẽ tạo biến mới (tên biến này là tên của tham số), copy giá trị của các
đối số vào biến mới thao tác các biến mới Bởi vậy sau gọi hàm các
đối số không bị thay đổi giá trị mặc dù bên trong hàm giá trịcủa đối số bịthayđổi.
18
2 Truyền đối số theo giá trị (tiếp) #include<iostream.h>
void DoiCho(int a, int b); int main()
{
int x=12,y=15; clrscr();
printf("Truoc doi cho: x= %d, y= %d“,x,y); DoiCho(x,y);
printf(“Sau doi cho: x= %d, y= %d“,x,y); }
void DoiCho(int a,int b) //Khai bao de truyen doi so theo gia tri {
int tmp=a; a=b; b=tmp; }
Lập trình nâng cao - Chương 08 - Ngơ Cơng Thắng 19
3 Truyền trỏ tới hàm
²Để truyền trỏ tới hàm ta phải thực hiện hai bước:
n Khai báo tham số (khi khai báo định
nghĩa) trỏ
n Khi gọi hàm thìđối sốtruyền cho hàm làđịa Ví dụ:
void DoiCho(int* a, int* b); int x = 12,y = 15;
DoiCho(&x,&y);
20
3 Truyền trỏ tới hàm (tiếp)
²Khi truyền trỏtới hàm biến trỏtrỏtới có thểbịthay đổi hàm
Ví dụ:Đổi chỗgiá trịcủa hai biến
void DoiCho(int* a,int* b);
DoiCho(&x,&y);
void DoiCho(int* a,int* b) {
(55)Lập trình nâng cao - Chương 08 - Ngô Công Thắng 21
4 Truyền mảng tới hàm
²Khi tên mảng sử dụng mà số kèm theo địa bắt đầu mảng Do đó, dùng mảng làm đối số truyền tới hàm có địa mảng truyền tới hàm tồn mảng Điều có nghĩa khai báo tham số hàm tham số phải có kiểu trỏ
²Bởi địa mảng truyền tới hàm nên thay đổi hàm lên mảng giữ nguyên hàm kết thúc
22
4 Truyền mảng tới hàm (tiếp)
²Ví dụ:Viết hàmđưa phần tử mảng void print(int* m);
int x[7]={2,5,8,1,6,7,10};
print(x);
void print(int* m) {
for(int i=0;i<7;i++) printf(“%d ”,m[i]); }
Lập trình nâng cao - Chương 08 - Ngô Công Thắng 23
IV Con trỏ trỏ tới hàm
²Một đặc điểm rất mạnh của C trỏ hàm. Mặc dù hàm không phải biến nhưng nó vẫn có địa chỉ trong bộ nhớ. Địa chỉ này có thể chứa một trỏ Vì địa chỉ của hàm chứa trỏ nên ta có thể sử dụng con trỏthay cho tên hàm.
²Để có địa chỉ của hàm ta dùng tên hàm khơng có đối số (giống như tên biến mảng là địa chỉ của mảng).
24
IV Con trỏ trỏ tới hàm (tiếp)
²Để có trỏ chứa địa hàm ta khai báo trỏ trỏ tới kiểu giống kiểu trả hàm, theo sau tham số hàm đặt ngoặc
đơn Ví dụ: giả sử hàm Tong có hai tham số kiểu int, kiểu trả int Khi ta khai báo trỏtrỏtới hàm sau:
int Tong(int a, int b); //Khai bao hàm
(56)Lập trình nâng cao - Chương 08 - Ngô Công Thắng 25
IV Con trỏ trỏ tới hàm (tiếp)
²Ví dụ: Viết chương trình tính tổng, hiệu, tích và thương của hai số nguyên nhập vào từ bàn phím Chương trình yêu cầu người sử dụng lựa chọn một cách tính.
V-Xây dựng thư viện hàm
1) Các khai báo hàm để trong tệp header (.h) 2) Cácđịnh nghĩa hàm để trong tệp c
3) Biên dịch tệp định nghĩa hàm thành tệp obj 4) Tạo thư viện hàm có đi lib bằng trình tlib 5) Khai báo thư viện hàm tệp chương
trình chính: #include”thuvien.h”
Chú ý: Tệp header tệp thư viện hàm để trong thư mục với tệp chương trình chính.
(57)Lập trình nâng cao - Chương 09 - Ngô Công Thắng Chương Kiểu dữ liệu tệp
I Giới thiệu về tệp II Tệp nhị phân III Tệp văn bản
IV Truy nhập trực tiếp phần tử của tệp V Tệp không xác định kiểu dữ liệu
I Giới thiệu về tệp
1 Khái niệm về tệp 2 Cấu trúc của tệp 3 Phân loại tệp 4 Khai báo tệp
Lập trình nâng cao - Chương 09 - Ngô Công Thắng
1 Khái niệm về tệp
l Kiểu tệp bao gồm một tập hữu hạn các phần tử có kiểu dữ liệu.
l Số phần tử của tệp không cần xác định khi khai báo biến tệp.
l Các phần tử của tệp được lưu trữ trên bộ nhớ ngoài. Đây là đặc điểm khác với tất cả các kiểu dữ liệu khác.
2 Cấu trúc của tệp
l Các phần tử tệp xếp thành dãy byte liên tiếp Sau phần tử liệu cuối phần tử EOF Phần tử liệu mà mã kết thúc tệp
EOF 45 12 20 25 15 72 81
0 10 12 14 16
Vị trí byte
Con trỏ vị
(58)Lập trình nâng cao - Chương 09 - Ngô Công Thắng
3 Phân loại tệp
l Dựa vào cách lưu trữ dữ liệu tệp ta có các loại tệp sau:
§ Tệp nhị phân (binary): Dữ liệu ghi tệp nhị phân có dạng byte nhị phân giống nhớ
§ Tệp văn (text): Dữ liệu ghi tệp thành ký tự bảng mã ASCII Trên tệp văn có mã xuống dòng gồm ký tự LF (mã 10) CR (mã 13)
4 Khai báo tệp
l Kiểu tệp đã được trình biên dịch định nghĩa với tên chuẩn FILE.
l Khai báo tệp ta khai báo biến trỏ trỏ tới kiểu FILE.
Ví dụ: FILE *f;
l Con trỏ tệp sẽ trỏ tới vùng nhớ chứa các thông tin về tệp bộ nhớ ngồi.
Lập trình nâng cao - Chương 09 - Ngô Công Thắng
II Tệp nhị phân
1 Ghi dữ liệu tệp nhị phân 2. Đọc dữ liệu từ tệp nhị phân
1 Ghi dữ liệu tệp nhị phân
l B1: Mở tệp để ghi bằng hàm fopen()
fp = fopen(Tên tệp, Kiểu truy nhập);
trong đó: +) fp trỏ tệp được khai báo trỏ tới kiểu FILE;
(59)Lập trình nâng cao - Chương 09 - Ngô Công Thắng
Các kiểu truy nhập tệp nhị phân
Kiểu Ý nghĩa
“wb” Mởtệp để ghi theo kiểu nhị phân Nếu tệpđã có sẽbị xóa
“rb” Mở tệp để đọc theo kiểu nhị phân Nếu tệp khơng có sinh lỗi
“ab” Mở tệp theo kiểu nhị phân để ghi bổ sung vào cuối tệp Nếu tệp chưa có sẽtạo tệp
“r+b” Mở tệp để đọc/ghi theo kiểu nhị phân Nếu tệp sẽsinh lỗi
“w+b” Mởtệp mớiđể đọc/ghi theo kiểu nhịphân Nếu tệpđã có bịxóa
“a+b” Mở tệp theo kiểu nhị phân để đọc/ghi bổ sung vào cuối tệp Nếu tệp chưa có sẽtạo tệp
1 Ghi dữ liệu tệp nhị phân (tiếp)
l B2: Ghi dữliệu tệp hàm fwrite()
fwrite(ptr, size, n, fp);
trong đó: +) ptr trỏtrỏ tới vùng nhớ chứa phần tử dữliệu cần ghi
+) size kích thước phần tửtheo byte +) n sốphần tửcần ghi
+) fp trỏtệp
Nếu có lỗi khơng ghi được, hàm trả Nếu khơng có lỗi hàm trảvề số phần tửghi
Ví dụ:
FILE *f = fopen(“songuyen.dat”,”wb”); int a=200;
fwrite(&a,sizeof(a),1,f);
Lập trình nâng cao - Chương 09 - Ngô Công Thắng 11
1 Ghi dữ liệu tệp nhị phân (tiếp) l B3: Đóng tệp
fclose(fp);
trong đó fp trỏ tệp. Ví dụ:
fclose(fp);
2 Đọc dữ liệu từ tệp nhị phân
l B1: Mở tệp để đọc bằng hàm fopen()
fp = fopen(Tên tệp, Kiểu truy nhập);
trong đó: +) fp trỏ tệp được khai báo trỏ tới kiểu FILE;
(60)Lập trình nâng cao - Chương 09 - Ngô Công Thắng 13
2 Đọc dữ liệu từ tệp nhị phân (tiếp)
l B2: Đọc liệu từtệp hàm fread()
fread(ptr, size, n, fp);
trong đó: +) ptr trỏ trỏ tới vùng nhớ chứa phần tửdữliệu đọc
+) size kích thước phần tử theo byte +) n số phần tử cần đọc
+) fp trỏ tệp
Hàm fread đọc n phần tử tệp kể từ vị trí trỏ vị Hàm trả số phần tử đọc
2 Đọc dữ liệu từ tệp nhị phân (tiếp) l B2: Đọc dữ liệu từ tệp bằng hàm fread()
fread(ptr, size, n, fp);
Nếu trỏ chỉ vị đã ở cuối tệp (EOF) mà vẫn đọc sẽ sinh lỗi.
Trước khi đọc tệp cần kiểm tra trỏ chỉ vị đã ở cuối tệp chưa => dùng hàm feof(con trỏ tệp)
Nên đọc từng phần tử tệp, trước khi đọc cần kiểm tra vị trí trỏ chỉ vị.
Lập trình nâng cao - Chương 09 - Ngô Công Thắng 15
2 Đọc dữ liệu từ tệp nhị phân (tiếp) l B3: Đóng tệp
fclose(fp);
trong đó fp trỏ tệp. Ví dụ:
fclose(fp);
Ví dụ
Viết chương trình tạo tệp “sonuyen.dat” chứa n số nguyên nhập vào từ bàn phím.
(61)Lập trình nâng cao - Chương 09 - Ngô Công Thắng 17
III Tệp văn bản
1 Ghi dữ liệu tệp văn bản 2. Đọc lại dữ liệu từ tệp văn bản
1 Ghi dữ liệu tệp văn bản
B1: Mở tệp để ghi bằng hàm fopen()
fp = fopen(“Tên tệp”,”Kiểu truy nhập”); trong đó: +) fp trỏ tệp được khai báo trỏ tới kiểu FILE;
+) Tên tệp có thể là hằng xâu hoặc biến xâu Trong tên tệp có thể có đường dẫn. + Kiểu truy nhập tệp hằng xâu diễn tả cách truy nhập vào tệp.
Lập trình nâng cao - Chương 09 - Ngơ Cơng Thắng 19
Các kiểu truy nhập tệp văn bản
Kiểu Ý nghĩa
“wt” Mở tệp để ghi theo kiểu văn Nếu tệpđã có sẽbị xóa
“rt” Mở tệp để đọc theo kiểu văn Nếu tệp khơng có sinh lỗi
“at” Mởtệp theo kiểu văn bảnđểghi bổsung vào cuối tệp Nếu tệp chưa có sẽtạo tệp
“r+t” Mởtệp mớiđể đọc/ghi theo kiểu văn Nếu tệp khơng có sinh lỗi
“w+t” Mởtệp để đọc/ghi theo kiểu văn Nếu tệpđã có bịxóa
1 Ghi dữ liệu tệp văn bản (tiếp)
B2: Ghi dữliệu tệp văn
- Ghi liệu theo định dạng tệp văn giống
như đưa liệu hình fprintf(fp,dk,…); đó: +) fp trỏ tệp
+) dk xâu ký tự có chứa đặc tả chuyển dạng liệu
(62)Lập trình nâng cao - Chương 09 - Ngô Công Thắng 21
1 Ghi dữ liệu tệp văn bản (tiếp)
B2: Ghi dữ liệu tệp văn bản
- Ghi cả xâu ký tự ra tệp văn bản.
fputs(s,fp); trong đó: +) fp trỏ tệp +) s hằng xâu hoặc biến xâu.
Hàm fputs() khơng ghi ký tự ‘\0’ tệp. Ví dụ: fputs(“Hung Yen”,fp);
1 Ghi dữ liệu tệp văn bản (tiếp)
B3: Đóng tệp
fclose(fp); trong đó fp trỏ tệp.
Lập trình nâng cao - Chương 09 - Ngô Công Thắng 23
2 Đọc lại dữ liệu từ tệp văn bản
B1: Mở tệp để đọc bằng hàm fopen() fp = fopen(“Tên tệp”,”Kiểu truy nhập”); trong đó: +) fp trỏ tệp được khai báo trỏ tới kiểu FILE;
+) Tên tệp có thể là hằng xâu hoặc biến xâu Trong tên tệp có thể có đường dẫn. +) Kiểu truy nhập tệp hằng xâu diễn tả cách truy nhập vào tệp.
2 Đọc lại dữ liệu từ tệp văn bản (tiếp)
B2: Đọc lại dữ liệu từ tệp
- Đọc dữ liệu có định dạng
fscanf(fp, dk, …)
trong đó: +) fp trỏ tệp
+) dk hằng xâu ký tự có chứa đặc tả chuyển dạng dữ liệu.
+) … các địa chỉ vùng nhớ chứa dữ liệu
đọc được.
(63)Lập trình nâng cao - Chương 09 - Ngô Công Thắng 25
2 Đọc lại dữ liệu từ tệp văn bản (tiếp)
B2: Đọc lại dữ liệu từ tệp
- Đọc một xâu ký tự từ tệp
fgets(s, n, fp); trong đó: +) s biến xâu ký tự. +) n số ký tự tối đa sẽ đọc. +) fp trỏ tệp
Ví dụ: fgets(s,20,fp);
2 Đọc lại dữ liệu từ tệp văn bản (tiếp)
B3: Đóng tệp
fclose(fp); trong đó fp trỏ tệp.
Lập trình nâng cao - Chương 09 - Ngô Công Thắng 27
IV Truy nhập trực tiếp phần tử của tệp
1 Các hàm di chuyển trỏ chỉ vị
2 Truy nhập một phần tử bất kỳ của tệp 3 Một số hàm thao tác tệp
1 Các hàm di chuyển trỏ chỉ vị
l Hàm rewind(fp) chuyển trỏ phần tử tệp, fp trỏ tệp
l Hàm fseek(fp, sb, xp)
trong đó: +) fp trỏ tệp +) sb số byte cần di chuyển
+) xp vị trí xuất phát xp nhận giá trị sau:
SEEK_SET 0: xuất phát từ đầu tệp
SEEK_CUR 1: xuất phát từ vị trí trỏ vị
(64)Lập trình nâng cao - Chương 09 - Ngô Công Thắng 29
1 Các hàm di chuyển trỏ chỉ vị (tiếp) Hàm fseek() di chuyển trỏ chỉ vị của tệp fp từ vị trí xác định bởi xp qua số byte sb. Chiều di chuyển về cuối tệp nếu sb dương, về đầu tệp nếu sb âm.
Hàm trả về 0 nếu di chuyển thành công, trả về giá trị khác không nếu di chuyển không thành công.
Chú ý: Không nên dùng fseek cho tệp văn bản.
1 Các hàm di chuyển trỏ chỉ vị (tiếp)
l Hàm ftell(fp) cho biết vị trí hiện tại của con trỏ chỉ vị.
Ứng dụng: 1) Xác định kích thước tệp 2) Xác định số phần tử tệp
EOF
20 15 10
0
Lập trình nâng cao - Chương 09 - Ngô Công Thắng 31
2 Truy nhập một phần tử bất kỳ của tệp
B1: Mở tệp với kiểu truy nhập “r+b”
B2: Di chuyển trỏ chỉ vị tới phần tử cần
đọc/ghi
B3: Đọc/ghi phần tử B4: Đóng tệp
3 Một số hàm thao tác tệp
l Hàm fcloseall() đóng tất tệp mở l Hàm fflush(con trỏ tệp) làm vùng đệm tệp l Hàm fflushall() làm vùng đệm tất
các tệp mở
l Hàm ferror(con trỏ tệp) kiểm tra lỗi thao tác tệp, khơng có lỗi trả 0, có lỗi trả giá trị khác