1. Trang chủ
  2. » Trung học cơ sở - phổ thông

Bai giang Lap trinh nang cao

64 6 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

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 Cu trúc chung ca 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 vi 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 kiu d liu 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, biu thc, khi lnh

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 Lnh vào/ra d liu

và cu trúc điu khin 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 Kiu mng 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 Kiu cu trúc kiu lit 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 hc:

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)

²Hng 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) ²Hng 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) ²Mng tr tr ti hng 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 Kiu d liu tp

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 dng: 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

Ngày đăng: 09/04/2021, 22:59

Xem thêm: