117
NGÔN NGỮ LẬP C NGÔN NGỮ LẬP C Giáo viên Vũ Văn Định

TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

Embed Size (px)

Citation preview

Page 1: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

NGÔN NGỮ LẬP CNGÔN NGỮ LẬP C

Giáo viên

Vũ Văn Định

Page 2: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

2Ngôn ngữ lập trình C

Bài 1: Tổng quan về ngôn Bài 1: Tổng quan về ngôn ngữ lập trình Cngữ lập trình C

Ngôn ngữ C có một số các đặc điểm Ngôn ngữ C có một số các đặc điểm nổi bật sau :nổi bật sau : Bộ lệnh phù hợp với phương pháp lập Bộ lệnh phù hợp với phương pháp lập

trình cấu trúc.trình cấu trúc. Kiểu dữ liệu phong phú.Kiểu dữ liệu phong phú. Một chương trình C bao giờ cũng gồm Một chương trình C bao giờ cũng gồm

một hoặc nhiều hàm và các hàm rời nhau.một hoặc nhiều hàm và các hàm rời nhau. Là ngôn ngữ linh động về cú pháp, chấp Là ngôn ngữ linh động về cú pháp, chấp

nhận nhiều cách thể hiện chương trình .nhận nhiều cách thể hiện chương trình .

Page 3: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

3Ngôn ngữ lập trình C

I. Hướng dẫn sử dụng môi trương kết hợp Turbo CI. Hướng dẫn sử dụng môi trương kết hợp Turbo C1.1. Khởi độngKhởi động

C1: Từ DOS [ đường dẫn ]\ TC.EXEC1: Từ DOS [ đường dẫn ]\ TC.EXEC2: Từ Win C -> TC -> BIN -> TC.EXEC2: Từ Win C -> TC -> BIN -> TC.EXEC3: Start -> Run -> C:\TC\BIN\TC.EXEC3: Start -> Run -> C:\TC\BIN\TC.EXE

2.2. Mở FileMở FileMở file mới : File -> NewMở file mới : File -> NewMở file đã có: File -> OpenMở file đã có: File -> Open

3.3. Ghi FileGhi FileSave (F2) : Ghi tệp mới đang soạn thảo vào đĩaSave (F2) : Ghi tệp mới đang soạn thảo vào đĩaSave as : Ghi tệp đang soạn thảo vào đĩa theo tên mới Save as : Ghi tệp đang soạn thảo vào đĩa theo tên mới

hoặc đe lên tệp đã cóhoặc đe lên tệp đã có

Page 4: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

4Ngôn ngữ lập trình C

Chạy một chương trìnhChạy một chương trình F9 : Biên dịchF9 : Biên dịch Ctrl F9 : Thực thi chương trìnhCtrl F9 : Thực thi chương trình Alt F5 : Xem kết quảAlt F5 : Xem kết quả

Thoát khỏi CThoát khỏi C Thoát tạm thời về DOS : Dos ShellThoát tạm thời về DOS : Dos Shell Thoát hẳn khỏi C: File \ Quit ( Alt + X)Thoát hẳn khỏi C: File \ Quit ( Alt + X)

Page 5: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

5Ngôn ngữ lập trình C

II. Giới thiệu ngôn ngữ lập trình CII. Giới thiệu ngôn ngữ lập trình C

1. Các thành phần của NNLT C1. Các thành phần của NNLT C Tập các ký tựTập các ký tự

Chữ cái: A .. Z, a .. zChữ cái: A .. Z, a .. z Chữ số : 0..9Chữ số : 0..9 Ký hiệu toán học :Ký hiệu toán học : + - * / = ( )+ - * / = ( ) Ký tự gạch nối: _Ký tự gạch nối: _ Các ký hiệu đặc biệt khác như : . , ; : [ ] { } ? ! \ & | % # $,…Các ký hiệu đặc biệt khác như : . , ; : [ ] { } ? ! \ & | % # $,…

Từ khoáTừ khoá Là những từ có một ý nghĩa hoàn toàn xác địnhLà những từ có một ý nghĩa hoàn toàn xác định Asm, char, do, int, float, for, do, While,…Asm, char, do, int, float, for, do, While,…

Tên Tên Dùng để xác định các đại lượng khác nhau trong một chương trìnhDùng để xác định các đại lượng khác nhau trong một chương trình Bắt đầu bằng chữ cái hoặc gạch nốiBắt đầu bằng chữ cái hoặc gạch nối Độ dài cực đại mặc định là 32Độ dài cực đại mặc định là 32

Page 6: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

6Ngôn ngữ lập trình C

2. Các kiểu dữ liệu cơ sở trong C2. Các kiểu dữ liệu cơ sở trong C KiểuKiểu sốsố kýký tựtự (char) (char) KiểuKiểu sốsố nguyênnguyên ( (intint)) KiểuKiểu dấudấu phẩyphẩy đđộngộng ( (chínhchính xácxác đơđơn (float), n (float),

chínhchính xácxác képkép (double)) (double)) KiểuKiểu void void

Page 7: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

7Ngôn ngữ lập trình C

2.1 Kiểu ký tự (char)2.1 Kiểu ký tự (char) Một giá trị kiểu ký tự (char) chiếm 1 byte Một giá trị kiểu ký tự (char) chiếm 1 byte

trong bộ nhớ và biểu diễn một ký tự thông trong bộ nhớ và biểu diễn một ký tự thông qua bảng mã ASCII.qua bảng mã ASCII.

Ví dụVí dụKý tựKý tự Mã ASCIIMã ASCII

00 484811 494922 5050AA 6565aa 9797

Page 8: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

8Ngôn ngữ lập trình C

Trong ngôn ngữ C cung cấp hai kiểu ký tự Trong ngôn ngữ C cung cấp hai kiểu ký tự (char) là signed char và unsigned char (char) là signed char và unsigned char

Phạm viPhạm vi Số ký tựSố ký tự Kích Kích thướcthước

signed signed charchar

--128..127128..127

1 byte1 byte

unsigned unsigned char char

0..2550..255 1 byte1 byteVí dụ : char ch, ch1;

ch= ‘a’ ; ch1= 97;

Page 9: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

9Ngôn ngữ lập trình C

2.2 Kiểu số nguyên (int)2.2 Kiểu số nguyên (int)Kiểu số nguyên trong C gồm các kiểu sau:Kiểu số nguyên trong C gồm các kiểu sau:

KiểuKiểu Phạm vi biểu Phạm vi biểu diễndiễn

Kích thướcKích thước

intint -32768 -> -32768 -> 3276732767

2 byte2 byte

Unsigned intUnsigned int 0 -> 655350 -> 65535 2 byte2 byte-2147483648 -2147483648 - -

4 byte4 byte

4 byte4 byte

Page 10: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

10Ngôn ngữ lập trình C

2.3 Kiểu số thực hay còn gọi là kiểu dấu phẩy động2.3 Kiểu số thực hay còn gọi là kiểu dấu phẩy động

KiểuKiểu Phạm vi biểu diễnPhạm vi biểu diễn Số chữ số Số chữ số có nghĩacó nghĩa

Kích Kích thướcthước

floatfloat 3.4-38E -> 3.4E+383.4-38E -> 3.4E+38 7-87-8 4 byte4 byte

doubledouble 1.7E-308 -> 1.7E+3081.7E-308 -> 1.7E+308 15-1615-16 8 byte8 byte

laong laong doubledouble

3.4E-4932 -> 1.1E+49323.4E-4932 -> 1.1E+4932 17-1817-18 10 byte10 byte

Page 11: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

11Ngôn ngữ lập trình C

3 Hằng và biến3 Hằng và biến3.1 Hằng:3.1 Hằng: Khái niệm: hằng là giá trị bất biến trong Khái niệm: hằng là giá trị bất biến trong

chương trình không thay chương trình không thay đổi, không biến đổi, không biến đổi về mặt giá trị. đổi về mặt giá trị. Các loại hằng Các loại hằng được sử được sử dụng trong C tương ứng với các kiểu dữ dụng trong C tương ứng với các kiểu dữ liệu nhất địnhliệu nhất định

Trong C có ba loại hằng :Trong C có ba loại hằng : Hằng sốHằng số Hằng chuỗiHằng chuỗi Hằng ký tựHằng ký tự

Page 12: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

12Ngôn ngữ lập trình C

Hằng sốHằng số: là các giá trị số đã xác định, có thể : là các giá trị số đã xác định, có thể là kiểu nguyên hay kiểu thực là kiểu nguyên hay kiểu thực Hằng nguyên: Giá trị chỉ bao gồm các chữ Hằng nguyên: Giá trị chỉ bao gồm các chữ

số, dấu +, - được lưu trữ theo kiểu int. Ví số, dấu +, - được lưu trữ theo kiểu int. Ví dụ: 12,-12 dụ: 12,-12

Nếu giá trị vượt quá miền giá trị của int Nếu giá trị vượt quá miền giá trị của int hoặc có ký tự l (hay L ) theo sau giá trị thì hoặc có ký tự l (hay L ) theo sau giá trị thì lưu theo kiểu long int. Ví dụ: 43L hoặc 43l lưu theo kiểu long int. Ví dụ: 43L hoặc 43l là hằng nguyên lưu theo kiểu long int. là hằng nguyên lưu theo kiểu long int.

Hằng thực: Trong giá trị có dấu chấm thập Hằng thực: Trong giá trị có dấu chấm thập phân, hoặc ghi dưới dạng số có mũ, và được phân, hoặc ghi dưới dạng số có mũ, và được lưu theo kiểu float, double, long double. Ví lưu theo kiểu float, double, long double. Ví dụ: 1.2 , 2.1E -3 (2.1E-3=0.0021) hoặc 3.1e-dụ: 1.2 , 2.1E -3 (2.1E-3=0.0021) hoặc 3.1e-2 (3.1e-2=0.031). 2 (3.1e-2=0.031).

Page 13: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

13Ngôn ngữ lập trình C

Hằng ký tự Hằng ký tự Một hằng kiểu ký tự Một hằng kiểu ký tự được viết trong dấu được viết trong dấu

ngoặc đơn (' ) như 'A' hoặc 'z'. ngoặc đơn (' ) như 'A' hoặc 'z'. Hằng ký tự 'A' thực sự Hằng ký tự 'A' thực sự đồng nghĩa với giá trị đồng nghĩa với giá trị

nguynguyên 65, là giá trị trong bảng mã ASCII ên 65, là giá trị trong bảng mã ASCII của chữ hoa 'A' (Như vậy giá trị của hằng của chữ hoa 'A' (Như vậy giá trị của hằng chính là mã ASCII của nó). Ðối với một vài chính là mã ASCII của nó). Ðối với một vài hằng ký tự hằng ký tự đặc biệt, ta cần sử dụng đặc biệt, ta cần sử dụng cách cách viết thêm dấu \ , như '\t' tương ứng với phím viết thêm dấu \ , như '\t' tương ứng với phím tab: tab:

Hằng ký tự có thể tham gia vào phép toán Hằng ký tự có thể tham gia vào phép toán như mọi số nguyên khác:như mọi số nguyên khác:VD:VD: '8' - '1'= 56-49=7.'8' - '1'= 56-49=7.

Page 14: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

14Ngôn ngữ lập trình C

Cách viếtCách viết Ký tựKý tự‘‘\n’\n’ Xuống hàngXuống hàng‘‘\t’\t’ TabTab‘‘\o’\o’ ““nul” tương ứng với giá trị nul” tương ứng với giá trị

nguyên 0 trong bảng mã nguyên 0 trong bảng mã ASCIIASCII

‘‘\b’\b’ Backspacse Backspacse ‘‘\r’\r’ Về đầu dòngVề đầu dòng‘‘\f’\f’ Sang tráiSang trái‘‘\\’\\’ \\‘ ‘ \” ’\” ’ ””‘ ‘ \’ ’\’ ’ ’’

Page 15: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

15Ngôn ngữ lập trình C

Hằng chuỗiHằng chuỗi Là chuỗi ký tự nằm trong cặp dấu nháy kép Là chuỗi ký tự nằm trong cặp dấu nháy kép

" ". Các ký tự này cũng có thể là các ký tự " ". Các ký tự này cũng có thể là các ký tự được biểu diễn bằng chuỗi thoát.được biểu diễn bằng chuỗi thoát.

Ví dụ: "Turbo C", "Ngôn ngữ C++ \n\r"Ví dụ: "Turbo C", "Ngôn ngữ C++ \n\r" Một hằng chuỗi Một hằng chuỗi được lưu trữ tận cđược lưu trữ tận cùng bằng ùng bằng

một ký tự Nul (\0), ví dụ chuỗi "Turbo C" một ký tự Nul (\0), ví dụ chuỗi "Turbo C" được lưu trữ trong bộ nhớ như sau:được lưu trữ trong bộ nhớ như sau:

TT uu rr bb oo CC \0\0

Page 16: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

16Ngôn ngữ lập trình C

Cách Cách định nghĩa hằng sử dụng trong chương trđịnh nghĩa hằng sử dụng trong chương trìnhình Với các giá trị hằng thường Với các giá trị hằng thường được dđược dùng trong một ùng trong một

chương trình ta nên chương trình ta nên định nghĩa ở đầu chương trđịnh nghĩa ở đầu chương trình ình (sau các dòng khai báo những thư viện chuẩn) theo cú (sau các dòng khai báo những thư viện chuẩn) theo cú pháp:pháp:

#define <tên hằng> <giá trị>#define <tên hằng> <giá trị>Ví dụ: #define PI 3.1415Ví dụ: #define PI 3.1415

Page 17: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

17Ngôn ngữ lập trình C

3.2 Biến3.2 Biến- Cách khai báo: - Cách khai báo: Mỗi biến trong chương trình Mỗi biến trong chương trình

đều phải được khai báo trước khi sử dụng với đều phải được khai báo trước khi sử dụng với cú pháp khai: cú pháp khai: Kiểu dữ liệu   <danh_sách_tên_biến>;Kiểu dữ liệu   <danh_sách_tên_biến>;

Lưu ý: nếu có nhiều tên biến thì giữa các Lưu ý: nếu có nhiều tên biến thì giữa các tên biến phải có dấu , để ngăn cáchtên biến phải có dấu , để ngăn cáchVí dụ: int a,b; float x;Ví dụ: int a,b; float x;

- - Khởi Khởi đầu cho các biếnđầu cho các biếnNgay trên dòng khai báo ta có thể gán Ngay trên dòng khai báo ta có thể gán cho biến một giá trị. Việc làm này gọi cho biến một giá trị. Việc làm này gọi là khởi là khởi đầu cho biến.đầu cho biến.Ví dụ:  int a,b=6,d=1;Ví dụ:  int a,b=6,d=1;

Page 18: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

18Ngôn ngữ lập trình C

Cách truy xuất Cách truy xuất đến địa chỉ của biếnđến địa chỉ của biến Một số hàm của C dùng Một số hàm của C dùng đến địa chỉ của đến địa chỉ của

biến ví dụ như hbiến ví dụ như hàm àm scanfscanf. Ðể nhận . Ðể nhận địa địa chỉ của biến dchỉ của biến dùng toán tử: &ùng toán tử: &Ví dụ: &tên_biến -Ví dụ: &tên_biến - &a : địa chỉ của &a : địa chỉ của biến abiến a

Page 19: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

19Ngôn ngữ lập trình C

3.3 Cấu trúc tổng quát của chương 3.3 Cấu trúc tổng quát của chương trình Ctrình C

Một chương trình C chuẩn gồm có các Một chương trình C chuẩn gồm có các thành phần sau:thành phần sau:

1.1. Các chỉ thị tiền biên dịchCác chỉ thị tiền biên dịch2.2. Khai báo các kiểu dữ liệu mớiKhai báo các kiểu dữ liệu mới3.3. Khai báo hằng, khai báo biếnKhai báo hằng, khai báo biến4.4. Khai báo hàmKhai báo hàm5.5. Chương trình chínhChương trình chính

Page 20: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

20Ngôn ngữ lập trình C

1.1. Chỉ thị tiền biên dịch: giúp trình biên dịch thực Chỉ thị tiền biên dịch: giúp trình biên dịch thực hiện một số công việc trước khi thực hiện một số hiện một số công việc trước khi thực hiện một số công việc trước khi thực hiện biên dịch chính thức công việc trước khi thực hiện biên dịch chính thức VD: VD: #include <stdio.h>; #include <stdio.h>; #include <conio.h>; #include <conio.h>;

2.2. Khai báo kiểu dữ liệu mới: dung từ khoá Khai báo kiểu dữ liệu mới: dung từ khoá typedef. typedef. VD: VD: typedef int songuyen; typedef int songuyen; typedef float mang[10]; typedef float mang[10];

3.3. Khai báo hằng và biến: khai báo các hằng số và Khai báo hằng và biến: khai báo các hằng số và biến dùng trong chương trìnhbiến dùng trong chương trình

4.4. Khai báo hàm: khai báo các hàm tự viếtKhai báo hàm: khai báo các hàm tự viết5.5. Chương trình chính: hàm main là hàm bắt buộc Chương trình chính: hàm main là hàm bắt buộc

trong chương trình. Hàm main có thể trả về giá trị trong chương trình. Hàm main có thể trả về giá trị kiểu nguyên (int) hoặc không trả về giá trị nào kiểu nguyên (int) hoặc không trả về giá trị nào (void)(void)

Page 21: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

21Ngôn ngữ lập trình C

/* Chương trình in ra dòng chữ Trung tâm đào tạo Trí Đức trên màn hình */# include <stdio.h>void main () /* Ham chinh */{

printf(" \n Trung tâm đào tạo Trí Đức ");/*xuong dong in chu Trung tâm đào tạo Trí Đức */}

Page 22: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

22Ngôn ngữ lập trình C

* Chương trình tính chu vi và diện tích hình tròn, biết bán kính r là một hằng số có giá trị =3.1 */# include <stdio.h> /* khai báo thư viện hàm nhập xuất chuẩn */# include <math.h> /* khai báo thư viện hàm toán học */#define r 3.1void main (){

float cv,dt; /* khai bao bien chu vi va dien tich kieu so thuc */cv=2*r*M_PI; /* tinh chu vi */dt=M_PI*r*r; /* Tinh dien tich */printf("\nChu vi = %10.2f\nDien tich = %10.2f",cv,dt);/* In ket qua len man hinh */getch(); /* Tam dung chuong trinh */}

Page 23: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

23Ngôn ngữ lập trình C

*Chương trình này minh họa cách vừa khai báo, vừa khởi đầu một biến trong C */#include <stdio.h>void main(){

char ki_tu = 'a'; /* Khai báo/khởi đầu kí tự. */int so_nguyen = 15; /* Khai báo khởi đầu số nguyên */float so_thuc = 27.62; /* Khai báo/khởi đầu số thực/printf("%c la mot ki tu.\n",ki_tu);printf("%d la mot so nguyen.\n",so_nguyen);printf("%f la mot so thuc.\n",so_thuc);}

Page 24: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

24Ngôn ngữ lập trình C

Bài 2: Bài 2: Biểu thức và các phép toánBiểu thức và các phép toán

I. Biểu thứcI. Biểu thức Là sự kết hợp các phép toán và các toán Là sự kết hợp các phép toán và các toán

hạng để diễn đạt một công thức toán học hạng để diễn đạt một công thức toán học nào đó.nào đó.

Biểu thức trong C gồm có biểu thức toán Biểu thức trong C gồm có biểu thức toán học và biểu thức logichọc và biểu thức logic Biểu thức toán học bao gồm các phép toán số Biểu thức toán học bao gồm các phép toán số

học và các hằng, các biến, các hàmhọc và các hằng, các biến, các hàm Biểu thức logic bao gồm các biến, hằng, hàm và Biểu thức logic bao gồm các biến, hằng, hàm và

phép toán logic (!: phép phủ định, &&: phép và, phép toán logic (!: phép phủ định, &&: phép và, || : phép hoặc) || : phép hoặc)

Page 25: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

25Ngôn ngữ lập trình C

II. Các phép toánII. Các phép toán Phép toán số họcPhép toán số học

Phép toánPhép toán Ý nghĩaÝ nghĩa++ CộngCộng-- TrừTrừ** Nhân Nhân // ChiaChia%% Lấy phần dưLấy phần dưChú ý:Chú ý:

-Phép toán chia 2 số nguyên sẽ chặt cụt phần -Phép toán chia 2 số nguyên sẽ chặt cụt phần thập phân.thập phân.-Phép toán lấy phần dư không áp dụng cho các -Phép toán lấy phần dư không áp dụng cho các giá trị float và doublegiá trị float và double

Page 26: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

26Ngôn ngữ lập trình C

II. Các phép toánII. Các phép toán Phép toán quan hệPhép toán quan hệ

Phép toánPhép toán Ý nghĩaÝ nghĩa Ví dụVí dụ>> Có lớn hơn không?Có lớn hơn không? a>ba>b>=>= Có lớn hơn hay bằng không?Có lớn hơn hay bằng không? a>=ba>=b<< Có nhỏ hơn không?Có nhỏ hơn không? a<ba<b<=<= Có nhỏ hơn hay bằng không?Có nhỏ hơn hay bằng không? a<=ba<=b==== Có bằng hay không?Có bằng hay không? a==ba==b!=!= Có khác nhau không?Có khác nhau không? a!=ba!=b

Các phép toán quan hệ có độ ưu tiên thấp hơn so với các phép Các phép toán quan hệ có độ ưu tiên thấp hơn so với các phép toán số họctoán số học

Page 27: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

27Ngôn ngữ lập trình C

II. Các phép toánII. Các phép toán Phép toán logicPhép toán logic

Phép phủ định !Phép phủ định ! Phép và (AND) &&Phép và (AND) && Phép hoặc (OR) ||Phép hoặc (OR) ||

Các phép toán quan hệ có độ ưu tiên nhỏ hơn Các phép toán quan hệ có độ ưu tiên nhỏ hơn so với ! nhưng lớn hơn so với phép && và ||so với ! nhưng lớn hơn so với phép && và ||

Page 28: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

28Ngôn ngữ lập trình C

CCâu lệnh âu lệnh gán vgán và biểu thứcà biểu thứcCú pháp của lệnh gán: Cú pháp của lệnh gán: <tên biến> = <biểu thức>;<tên biến> = <biểu thức>;VD: VD: x = -10; x = -10;

m = y + 2 – m;m = y + 2 – m;Trong C cho phép người sử dụng được gộp lệnh gán Trong C cho phép người sử dụng được gộp lệnh gán theo cú pháp :theo cú pháp :

a = b = c = 7;a = b = c = 7;

Page 29: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

29Ngôn ngữ lập trình C

Phép toán tăng giảmPhép toán tăng giảm Toán tử + + : dùng để tăng giá trị của các Toán tử + + : dùng để tăng giá trị của các

biến nguyên hay biến thựcbiến nguyên hay biến thực Toán tử - - dùng để giảm giá trị của biến Toán tử - - dùng để giảm giá trị của biến

nguyên hay biến thựcnguyên hay biến thực Toán tử + + và -- đều có thể đứng trước hoặc Toán tử + + và -- đều có thể đứng trước hoặc

sau toán hạngsau toán hạng VD: + + n ; n+ +; --m ; m--;VD: + + n ; n+ +; --m ; m--; Khi các toán tử + +, -- đứng trước toán hạng Khi các toán tử + +, -- đứng trước toán hạng

thì giá trị của toán hạng được tăng hoặc thì giá trị của toán hạng được tăng hoặc giảm trước khi sử dụng và ngược lại nếu toán giảm trước khi sử dụng và ngược lại nếu toán tử ++, -- đứng sau toán hạng thì toán hạng tử ++, -- đứng sau toán hạng thì toán hạng được tăng hay giảm sau khi thực hiệnđược tăng hay giảm sau khi thực hiện

Page 30: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

30Ngôn ngữ lập trình C

Chuyển đổi kiểu giá trịChuyển đổi kiểu giá trịViệc chuyển đổi kiểu giá trị trong C thường Việc chuyển đổi kiểu giá trị trong C thường diễn ra tự động trong trường hợp sau:diễn ra tự động trong trường hợp sau:

Trong biểu thức có các toán hạng khác kiểuTrong biểu thức có các toán hạng khác kiểu Khi gán một giá trị kiểu này cho một giá trị Khi gán một giá trị kiểu này cho một giá trị

kiểu kháckiểu khác Ngoài ra ta có thể dùng phép chuyển kiểu để Ngoài ra ta có thể dùng phép chuyển kiểu để

ép kiểu dữ liệu sang kiểu khácép kiểu dữ liệu sang kiểu khác(type) biểu_thức(type) biểu_thức

Chú ý:Chú ý:- - Khi chuyển đổi kiểu tỏng biểu thức thì đối với Khi chuyển đổi kiểu tỏng biểu thức thì đối với

toán hạng có kiểu thấp hơn sẽ được nâng thành toán hạng có kiểu thấp hơn sẽ được nâng thành kiểu cao hơn trược khi htực hiện phép toán và kiểu cao hơn trược khi htực hiện phép toán và kết quả thu được sẽ có kết quả theo kiểu cao kết quả thu được sẽ có kết quả theo kiểu cao hơnhơn

Page 31: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

31Ngôn ngữ lập trình C

Kiểu int và kiểu long thì int ----> longKiểu int và kiểu long thì int ----> long int và float thì int ---> floatint và float thì int ---> float Float và double thì float -----> doubleFloat và double thì float -----> double Kiểu int có thể chuyển thành float và Kiểu int có thể chuyển thành float và

ngược lạingược lại

Page 32: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

32Ngôn ngữ lập trình C

I.I. Hàm xuất nhập chuẩn trong thư viện <stdio.h>Hàm xuất nhập chuẩn trong thư viện <stdio.h> Hàm đưa kết quả ra màn hìnhHàm đưa kết quả ra màn hìnhCú phápCú pháp: : printf(<dòng điểu khiển>, bt1, bt2,...btk);printf(<dòng điểu khiển>, bt1, bt2,...btk);Ý nghĩaÝ nghĩa: : bt1,...btk : là k biểu thức cần in kết quả ra màn hìnhbt1,...btk : là k biểu thức cần in kết quả ra màn hình<dòng điểu khiển> là một hằng xâu ký tự bao gồm 3 loại:<dòng điểu khiển> là một hằng xâu ký tự bao gồm 3 loại:- Ký tự diều khiển việc xuống dòng tiếp theo ‘\n’Ký tự diều khiển việc xuống dòng tiếp theo ‘\n’- Ký tự hiển thị: là ký tự được in ra màn hìnhKý tự hiển thị: là ký tự được in ra màn hình- Ký tự mô tả cách đưa ra màn hình của các biến(đặc tả Ký tự mô tả cách đưa ra màn hình của các biến(đặc tả

của kiểu). Mỗi biểu thức có đặc tả tương ứngcủa kiểu). Mỗi biểu thức có đặc tả tương ứng

Bài 3Bài 3Các hàm vào ra dữ liệuCác hàm vào ra dữ liệu

Page 33: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

33Ngôn ngữ lập trình C

Đặc tả kiểu nguyên đối với biểu thức có giá Đặc tả kiểu nguyên đối với biểu thức có giá trị kiểu số nguyên trị kiểu số nguyên %[n]d %[n]d . Trong đó . Trong đó

n là số nguyên xác định độ rộng tối n là số nguyên xác định độ rộng tối thiểu dành cho giá trị biểu thức in ra màn thiểu dành cho giá trị biểu thức in ra màn hìnhhình

Đặc tả kiểu số thực Đặc tả kiểu số thực %[n][.m]f. %[n][.m]f. Trong đó Trong đó m là số chữ số sau dấu phẩy, n là một số m là số chữ số sau dấu phẩy, n là một số

nguyên xác định độ rộng tối thiểu trên màn nguyên xác định độ rộng tối thiểu trên màn hình cho giá trị của biểu thức:hình cho giá trị của biểu thức:VD: VD:

Page 34: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

34Ngôn ngữ lập trình C

%c : in một ký tự có mã ASCII tương ứng%c : in một ký tự có mã ASCII tương ứng %[n]d : in một số nguyên với chiều dài tối thiểu là n%[n]d : in một số nguyên với chiều dài tối thiểu là n %[n]ld: in một số nguyên (long int)%[n]ld: in một số nguyên (long int) %[n.m]f : in một số thực vối chiều dài n và lấy m số thập %[n.m]f : in một số thực vối chiều dài n và lấy m số thập phânphân %s : in ra chuỗi ký tự%s : in ra chuỗi ký tự

Page 35: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

35Ngôn ngữ lập trình C

Hàm hiển thị một xâu ký tự ra màn hìnhHàm hiển thị một xâu ký tự ra màn hìnhCú pháp:Cú pháp: int puts(char *s);int puts(char *s); Ý nghĩa: Ý nghĩa: Hiển thị một xâu ký tự s lên màn Hiển thị một xâu ký tự s lên màn hình, sau khi in xong thì con trỏ sẽ được hình, sau khi in xong thì con trỏ sẽ được chuyển xuống dòng. Trong đó s là con trỏ chuyển xuống dòng. Trong đó s là con trỏ kiểu char trỏ tới vùng chứa xâu ký tựkiểu char trỏ tới vùng chứa xâu ký tự

Hàm đưa một ký tự ra màn hìnhHàm đưa một ký tự ra màn hìnhCú phápCú pháp: : int putchar(int ch);int putchar(int ch);Ý nghĩaÝ nghĩa: Hàm sẽ ký tự ch ra màn hình với ch : Hàm sẽ ký tự ch ra màn hình với ch là mã của lý tự cần in là mã của lý tự cần in

Page 36: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

36Ngôn ngữ lập trình C

Hàm nhận dữ liệu từ bàn phím Hàm nhận dữ liệu từ bàn phím Cú pháp: Cú pháp: scanf(“dt1dt2..dtk”, scanf(“dt1dt2..dtk”,

&biến1, ...&biếnk);&biến1, ...&biếnk);Ý nghĩa:Ý nghĩa:

dt1,...dtk là một hằng xâu ký tự đặc tả của k biếndt1,...dtk là một hằng xâu ký tự đặc tả của k biến &biến1, ..&biếnk: là địa chỉcủa biến trong bộ nhớ&biến1, ..&biếnk: là địa chỉcủa biến trong bộ nhớ

Hàm nhận từ bàn phím một xâu ký tựHàm nhận từ bàn phím một xâu ký tựCú pháp: Cú pháp: int *getchar(char *s);int *getchar(char *s);Ý nghĩa: Ý nghĩa:

Hàm nhận dãy ký tự từ bàn phím vào cho đến khi Hàm nhận dãy ký tự từ bàn phím vào cho đến khi gặp ký tự ‘\n’ thì dừng lạigặp ký tự ‘\n’ thì dừng lại

s là con trỏ trỏ tới vùng nhớ sẽ chứa xâu vừa s là con trỏ trỏ tới vùng nhớ sẽ chứa xâu vừa nhậnnhận

Page 37: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

37Ngôn ngữ lập trình C

Hàm nhận một ký tự từ bàn phímHàm nhận một ký tự từ bàn phímCú phápCú pháp: : getchar(void);getchar(void);Ý nghĩa:Ý nghĩa: nhận ký tự được nhập từ bàn phím nhận ký tự được nhập từ bàn phím

Page 38: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

38Ngôn ngữ lập trình C

II. Hàm xuất nhập chuẩn trong thư viện II. Hàm xuất nhập chuẩn trong thư viện <conio.h><conio.h>

Hàm getch() và getcheHàm getch() và getcheCú pháp Cú pháp :: int getch( void )int getch( void )

int getche( void )int getche( void )- Hai hàm trên chờ nhận một ký tự trực tiếp từ - Hai hàm trên chờ nhận một ký tự trực tiếp từ

bộ bộ đệm bđệm bàn phím. Nếu bộ àn phím. Nếu bộ đệm rỗng thđệm rỗng thì chờ. ì chờ. Khi một phím Khi một phím được ấn thđược ấn thì nhận ngay ký tự ì nhận ngay ký tự đó đó mmà không cần phải enter như các hàm nhập từ à không cần phải enter như các hàm nhập từ stdio.hstdio.h

- - Hàm getche() cho hiện ký tự lên màn hình còn Hàm getche() cho hiện ký tự lên màn hình còn getch() thì khônggetch() thì không

- Kết quả trả về của hàm là ký tự - Kết quả trả về của hàm là ký tự được ấn trên được ấn trên bàn phím.bàn phím.

Page 39: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

39Ngôn ngữ lập trình C

Xuất ký tự có màuXuất ký tự có màuCú phápCú pháp : : cprintfcprintf Ý nghĩaÝ nghĩa: in ra ký tự có màu : in ra ký tự có màu được ấn định được ấn định

bởi hbởi hàm textcolor.àm textcolor. Nhập ký tự có màuNhập ký tự có màuCú pháp:Cú pháp: cscanfcscanfÝ nghĩa:Ý nghĩa:+ Nội dung nhập có màu + Nội dung nhập có màu được ấn định bởi được ấn định bởi

hhàm textcoloràm textcolor+ Nhận nội dung trực tiếp từ bộ + Nhận nội dung trực tiếp từ bộ đệm bđệm bàn àn

phím. Vì vậy với hàm cscanf ta cũng phải phím. Vì vậy với hàm cscanf ta cũng phải khử ký tự \n trong bộ khử ký tự \n trong bộ đệm bằng %*c hoặc đệm bằng %*c hoặc bằng hbằng hàm getch()àm getch()

Page 40: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

40Ngôn ngữ lập trình C

III.Một số hàm thao tác trên màn hìnhIII.Một số hàm thao tác trên màn hình Hàm xóa màn hình:Hàm xóa màn hình: clrscr();clrscr();

Có tác dụng xóa toàn bộ m àn hình và sau khi Có tác dụng xóa toàn bộ m àn hình và sau khi xóa con trỏ sẽ ở vị trí góc phía bên trái.xóa con trỏ sẽ ở vị trí góc phía bên trái.

Hàm Hàm đặt tọa độ con trỏ: đặt tọa độ con trỏ: gotoxy(int x, int gotoxy(int x, int y);y);

Đặt con trỏ tại vị trí x, yĐặt con trỏ tại vị trí x, y Hàm Hàm đặt mầu nền textbackgroundđặt mầu nền textbackground

void textbackground(int color);void textbackground(int color); Đặt mầu nền Đặt mầu nền Color là một biểu thức Color là một biểu thức nguyên có giá trị từ 0 nguyên có giá trị từ 0 đến 7 tương ứng với đến 7 tương ứng với một trong 8 hằng số mmột trong 8 hằng số màu àu đầu tiđầu tiên của bảng ên của bảng mầu vmầu văn bản.ăn bản.

Page 41: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

41Ngôn ngữ lập trình C

Hàm Hàm đặt mầu chữ textcolorđặt mầu chữ textcolorvoid textcolor(int newColor);void textcolor(int newColor);

Lựa chọn mLựa chọn màu ký tự mới newColor.Trong đó àu ký tự mới newColor.Trong đó newColor là một biểu thức nguyên có giá trị newColor là một biểu thức nguyên có giá trị từ 0 từ 0 đến 15 tương ứng với một trong các đến 15 tương ứng với một trong các hằng số mhằng số màu của bảng mầu vàu của bảng mầu văn bản.ăn bản.

Page 42: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

42Ngôn ngữ lập trình C

Bài 4: Cấu trúc điều khiểnBài 4: Cấu trúc điều khiển CCâu lệnh, khối lệnhâu lệnh, khối lệnh

CCâu lệnhâu lệnh: mỗi c: mỗi câu âu lệnh thực hiện một công việc lệnh thực hiện một công việc và được kết thúc bởi dấu ;và được kết thúc bởi dấu ;

KhKhối lệnhối lệnh: là tập hợp các c: là tập hợp các câu âu lệnh bắt đầu bằng lệnh bắt đầu bằng dấu “{“ và kết thúc bằng dấu “}”dấu “{“ và kết thúc bằng dấu “}”

Page 43: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

43Ngôn ngữ lập trình C

I. Cấu trúc điều khiển ifI. Cấu trúc điều khiển if11. Cấu trúc if dạng 1. Cấu trúc if dạng 1

Cú pháp: Cú pháp: if (bt)if (bt) s ;s ;Ý nghĩa: bt là biểu thức lôgic, s là lệnh đơn Ý nghĩa: bt là biểu thức lôgic, s là lệnh đơn hoặc lệnh phức. nếu bt nhân giá trị true thì hoặc lệnh phức. nếu bt nhân giá trị true thì thực hiện s, ngược lại s được bỏ quathực hiện s, ngược lại s được bỏ qua

2. Cấu trúc if dạng 22. Cấu trúc if dạng 2Cú pháp: Cú pháp: if(bt)if(bt) s;s;

else else s1 ;s1 ;Ý nghĩa: bt là biểu thức lôgic, nếu bt nhận Ý nghĩa: bt là biểu thức lôgic, nếu bt nhận giá trị true thì thực hiện s bỏ qua s1, ngược giá trị true thì thực hiện s bỏ qua s1, ngược lại nếu bt nhận giá trị flase thì thực hiện s1 lại nếu bt nhận giá trị flase thì thực hiện s1 bỏ qua s(s và s1 có thể là lệnh đơn hoặc bỏ qua s(s và s1 có thể là lệnh đơn hoặc lệnh phức)lệnh phức)

Page 44: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

44Ngôn ngữ lập trình C

Chú ý : trong C cho phép sử dụng các cấu Chú ý : trong C cho phép sử dụng các cấu trúc if lồng nhau để giải quyết bài toántrúc if lồng nhau để giải quyết bài toán

3. Bài tập3. Bài tập- - Nhập 2 số thực a, b từ bàn phím. Tìm và in Nhập 2 số thực a, b từ bàn phím. Tìm và in

ra màn hình số lớn nhất và số bé nhấtra màn hình số lớn nhất và số bé nhất- Giải hệ phương trình bậc nhất hai ẩn sốGiải hệ phương trình bậc nhất hai ẩn số

ax + by = cax + by = cdx + ey = fdx + ey = f

Page 45: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

45Ngôn ngữ lập trình C

II. Cấu trúc rẽ nhánh switchII. Cấu trúc rẽ nhánh switch1. Cấu trúc tổng quát1. Cấu trúc tổng quátCú pháp:Cú pháp: switch (bt)switch (bt)

{{ case n1 : s1case n1 : s1case n2 : s2case n2 : s2

........case nk : skcase nk : sk[default : s(k+1 )][default : s(k+1 )]

}}

Page 46: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

46Ngôn ngữ lập trình C

Ý nghĩa:Ý nghĩa: Bt: là biểu thức toán học có giá trị kiểu Bt: là biểu thức toán học có giá trị kiểu

nguyênnguyên Ni(i=1..k): là các số kiểu nguyên, kiểu hằng Ni(i=1..k): là các số kiểu nguyên, kiểu hằng

ký tự, hoặc biểu thứcký tự, hoặc biểu thức Si(i=1..k): là các lệnh đơn hoặc lệnh phứcSi(i=1..k): là các lệnh đơn hoặc lệnh phức [default : s(k+1 )] : là phần tuỳ chọn có thể [default : s(k+1 )] : là phần tuỳ chọn có thể

có hoặc khôngcó hoặc không

Page 47: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

47Ngôn ngữ lập trình C

Hoạt động: lệnh switch phụ thuộc vào giá trị Hoạt động: lệnh switch phụ thuộc vào giá trị của biểu thức bt viết sau switch, nếu:của biểu thức bt viết sau switch, nếu:

Giá trị bt = ni thì thực hiện câu lệnh sau case Giá trị bt = ni thì thực hiện câu lệnh sau case ni;ni;

Khi giá trị biểu thức khác tất cả các ni thì thực Khi giá trị biểu thức khác tất cả các ni thì thực hiện câu lệnh sau default nếu có, hoặc thoát hiện câu lệnh sau default nếu có, hoặc thoát khỏi câu lệnh switch.khỏi câu lệnh switch.

Khi chương trình Khi chương trình đđã thực hiện xong câu lệnh ã thực hiện xong câu lệnh của case ni nào của case ni nào đó thđó thì nó sẽ thực hiện luôn các ì nó sẽ thực hiện luôn các lệnh thuộc case bên dưới nó mà không xét lại lệnh thuộc case bên dưới nó mà không xét lại điều kiện ( do các ni còn được xem như các điều kiện ( do các ni còn được xem như các nhnhãn). Vì vậy, ãn). Vì vậy, để chương trđể chương trình thoát khỏi lệnh ình thoát khỏi lệnh switch sau khi thực hiện xong một trường hợp, switch sau khi thực hiện xong một trường hợp, ta dùng lệnh break.ta dùng lệnh break.

Page 48: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

48Ngôn ngữ lập trình C

3. Bài tập3. Bài tập-- Viết chương trình nhập vào từ bàn Viết chương trình nhập vào từ bàn

phím một mã số nguyên và đưa ra đánh phím một mã số nguyên và đưa ra đánh gía trình độ theo yêu cầu:gía trình độ theo yêu cầu:

1: 1: trình độ sơ cấptrình độ sơ cấp 2 : trình độ trung cấp2 : trình độ trung cấp 3: trình độ Đại học3: trình độ Đại học 4: trình độ Cao học4: trình độ Cao học 5: trình độ Tiến sỹ5: trình độ Tiến sỹ Các số khác: Không xác địnhCác số khác: Không xác định

-- Cho một số tự nhiên, in ra màn hình tên Cho một số tự nhiên, in ra màn hình tên gọi của số lên màn hình(Bài số 12) gọi của số lên màn hình(Bài số 12)

Page 49: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

49Ngôn ngữ lập trình C

III. Câu lệnh lặp forIII. Câu lệnh lặp for1. Cú pháp: 1. Cú pháp:

for(<bt1> ; <bt2> ; <bt3>) for(<bt1> ; <bt2> ; <bt3>) S ; S ; Ý nghĩa: Ý nghĩa:

S là lệnh đơn hoặc lệnh phứcS là lệnh đơn hoặc lệnh phức bt1 : thường là một lệnh gán khởi tạo cho bt1 : thường là một lệnh gán khởi tạo cho

biến điều khiểnbiến điều khiển bt2: là biểu thức logic, giá trị của biểu thức bt2: là biểu thức logic, giá trị của biểu thức

lôgic này quyết định vòng lặp tiếp tục hay lôgic này quyết định vòng lặp tiếp tục hay kết thúckết thúc

bt3: thường là lệnh gán có tác dụng làm thay bt3: thường là lệnh gán có tác dụng làm thay đổi giá trị của biến điều khiểnđổi giá trị của biến điều khiển

Page 50: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

50Ngôn ngữ lập trình C

Hoạt động:Hoạt động: Bước 1: Thực hiện bt1Bước 1: Thực hiện bt1 Bước 2: Tính toán, xác định giá trị của bt2Bước 2: Tính toán, xác định giá trị của bt2 Bước 3: Nếu bt2 có giá trị false thì thoát khỏi vòng lặp. Bước 3: Nếu bt2 có giá trị false thì thoát khỏi vòng lặp.

Ngược lại bt2 có giá trị true thì s được thực hiệnNgược lại bt2 có giá trị true thì s được thực hiện Bước 4: sau khi thực hiện s thực hiện bt3 và quay lại Bước 4: sau khi thực hiện s thực hiện bt3 và quay lại

bước 2bước 2Nhận xét:Nhận xét: <t1> chỉ được thực hiện duy nhất một lần khi bắt đầu <t1> chỉ được thực hiện duy nhất một lần khi bắt đầu

vòng lặpvòng lặp <bt2>, <bt3> và S có thể được tính toán và thực hiện lặp <bt2>, <bt3> và S có thể được tính toán và thực hiện lặp

nhiều lần nhiều lần

Page 51: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

51Ngôn ngữ lập trình C

Chú ý khi sử dụng vòng lặp forChú ý khi sử dụng vòng lặp for <bt1>, <bt2>, <bt3> đều có thể vắng mặt <bt1>, <bt2>, <bt3> đều có thể vắng mặt

nhưng vẫn phải giữ lại dấu ( ; )nhưng vẫn phải giữ lại dấu ( ; ) Trường hợp đặc biệt <bt2> không có thì Trường hợp đặc biệt <bt2> không có thì

luôn được xem là nhận giá trị true, muốn luôn được xem là nhận giá trị true, muốn thoát khỏi vòng lặp phải dùng lệnh break, thoát khỏi vòng lặp phải dùng lệnh break, goto hoặc returngoto hoặc return

Có thể dùng cấu trúc các vòng for lồng nhauCó thể dùng cấu trúc các vòng for lồng nhau Khi gặp lệnh break thì chương trình sẽ thoát Khi gặp lệnh break thì chương trình sẽ thoát

khỏi vòng for sâu nhất còn chứa lệnh breakkhỏi vòng for sâu nhất còn chứa lệnh break Trong vòng for có thể sử dụng lệnh continue Trong vòng for có thể sử dụng lệnh continue

để chuyển tới chu trình mới của vòng lặpđể chuyển tới chu trình mới của vòng lặp

Page 52: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

52Ngôn ngữ lập trình C

2.2.Bài tậpBài tập Viết chương trình tính tổng của n số Viết chương trình tính tổng của n số đầu đầu

titiên của dãy số sau:ên của dãy số sau:S = 1+1/2+1/3+1/4+...+1/n.S = 1+1/2+1/3+1/4+...+1/n.

Viết chương trình tìm tất cả các số nguyên Viết chương trình tìm tất cả các số nguyên có ba chữ số sao cho tổng tam thừa của ba có ba chữ số sao cho tổng tam thừa của ba chữ số hàng trchữ số hàng trăm, hăm, hàng chục, hàng àng chục, hàng đơn vđơn vị ị sẽ bằng số nguyên sẽ bằng số nguyên đó. Ví dụ: 1đó. Ví dụ: 133+5+533+3+333=153 =153

Page 53: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

53Ngôn ngữ lập trình C

IV. Câu lệnh whileIV. Câu lệnh while1.1. Cú pháp :Cú pháp :

While (bt)While (bt)S;S;

Ý nghĩaÝ nghĩa: bt là biểu thức lôgic, S là một lệnh : bt là biểu thức lôgic, S là một lệnh hoặc một dãy lệnh hoặc một dãy lệnhHoạt độngHoạt động

- Xác định giá trị của bt. Nếu giá trị của bt= Xác định giá trị của bt. Nếu giá trị của bt= true(<>0) thì chuyển sang bước 2, ngược true(<>0) thì chuyển sang bước 2, ngược lại thì thoát khỏi vòng lặplại thì thoát khỏi vòng lặp

- Thực hiện S sau đó quay về bước 1(Lệnh S Thực hiện S sau đó quay về bước 1(Lệnh S có thể được thực hiện nhiều lần hoặc không có thể được thực hiện nhiều lần hoặc không được thực hiện lần nào nếu bt =false ngay được thực hiện lần nào nếu bt =false ngay từ đầu)từ đầu)

Page 54: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

54Ngôn ngữ lập trình C

Chú ý : trong câu lệnh lặp while ta có thể Chú ý : trong câu lệnh lặp while ta có thể dùng câu lệnh break để thoát khỏi vòng lặp dùng câu lệnh break để thoát khỏi vòng lặp theo ý muốntheo ý muốn

2. Bài tập :2. Bài tập :- Nhập hai số nguyên từ bàn phím, tìm và in Nhập hai số nguyên từ bàn phím, tìm và in

ra màn hình ước số chung lơn nhất của hai ra màn hình ước số chung lơn nhất của hai sốsố

- Tìm hình chữ nhật có diện tích lớn nhất khi Tìm hình chữ nhật có diện tích lớn nhất khi biết chu vi của nó(bài số 25)biết chu vi của nó(bài số 25)

Page 55: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

55Ngôn ngữ lập trình C

V. Câu lệnh do.. whileV. Câu lệnh do.. while1.1. Cú phápCú pháp

dodo SSwhile (bt);while (bt);

Ý nghĩa: S là một câu lệnh đơn hoặc phức, Ý nghĩa: S là một câu lệnh đơn hoặc phức, bt là biểu thức lôgicbt là biểu thức lôgic

Hoạt động: Hoạt động: - (1) Thực hiện lệnh S(1) Thực hiện lệnh S- (2) Xác định giá trị của bt. Nếu giá trị của (2) Xác định giá trị của bt. Nếu giá trị của

bt = true thì chuyển sang bước (1), ngược bt = true thì chuyển sang bước (1), ngược lại thì thoát khỏi vòng lặplại thì thoát khỏi vòng lặp

- Lệnh S luôn được thực hiện ít nhất 1 lần Lệnh S luôn được thực hiện ít nhất 1 lần trong câu lệnhtrong câu lệnh

Page 56: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

56Ngôn ngữ lập trình C

Bài 5: Dữ liệu kiểu mảngBài 5: Dữ liệu kiểu mảng1.1. Khái niệm:Khái niệm: Mảng được hiểu là một tập hợp các giá trị có Mảng được hiểu là một tập hợp các giá trị có

cùng kiểu dữ liệu nằm liên tiếp nhau trong bộ cùng kiểu dữ liệu nằm liên tiếp nhau trong bộ nhớ máy tínhnhớ máy tính

Mảng được coi như một biến mảng và tên Mảng được coi như một biến mảng và tên mảng được đặt theo quy tắc đặt tên biến mảng được đặt theo quy tắc đặt tên biến

Mảng có những thành phần sau:Mảng có những thành phần sau: Kiểu dữ liệu của các phần tử trong mảngKiểu dữ liệu của các phần tử trong mảng Tên mảngTên mảng Số chiều và kích thước của mỗi chiềuSố chiều và kích thước của mỗi chiều

Page 57: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

57Ngôn ngữ lập trình C

2. Cách khai báo biến mảng2. Cách khai báo biến mảng<kiểu_dl> <tên_mảng><ds các chiều <kiểu_dl> <tên_mảng><ds các chiều

của mảng>của mảng>VD: VD:

int A[10]; int A[10]; //mảng 1 chiều A gồm 10 phần tử kiểu số //mảng 1 chiều A gồm 10 phần tử kiểu số

nguyênnguyênfloat B[2] [3];float B[2] [3];

// Mảng 2 chiều B gồm 2 hàng và 3 cột, các // Mảng 2 chiều B gồm 2 hàng và 3 cột, các phần tử có kiểu số thựcphần tử có kiểu số thực

Page 58: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

58Ngôn ngữ lập trình C

3. Cách tổ chức và truy xuất đến phần tử mảng3. Cách tổ chức và truy xuất đến phần tử mảng Phần tử của mảng được xác định thông qua chỉ Phần tử của mảng được xác định thông qua chỉ

số. Chỉ số của phần tử trong mảng luôn là một số. Chỉ số của phần tử trong mảng luôn là một số nguyên không vượt qua kích thước của số nguyên không vượt qua kích thước của mảngmảng

Các phần tử của mảng được sắp xếp liền nhau Các phần tử của mảng được sắp xếp liền nhau trong bộ nhớ của máy tính và chỉ cho phép truy trong bộ nhớ của máy tính và chỉ cho phép truy cập đến địa chỉ trực tiếp của phần tử đối với cập đến địa chỉ trực tiếp của phần tử đối với mảng một chiều. Cách truy cập theo địa chỉ mảng một chiều. Cách truy cập theo địa chỉ

&tên_biến[i]&tên_biến[i] trong đó i là chỉ số của phần tửtrong đó i là chỉ số của phần tử

VD: VD: a= &a[0]a= &a[0]//Tên mảng chỉ tới địa chỉ phần tử đầu tiên của //Tên mảng chỉ tới địa chỉ phần tử đầu tiên của

mảngmảng

Page 59: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

59Ngôn ngữ lập trình C

4. Cách xuất nhập dữ liệu trên mảng4. Cách xuất nhập dữ liệu trên mảng- Nhập xuất trực tiếp ứng dụng cho mảng một Nhập xuất trực tiếp ứng dụng cho mảng một

chiều và mảng hai chiều có phần tử kiểu int chiều và mảng hai chiều có phần tử kiểu int thông qua địa chỉ thông qua địa chỉ

- Nhập dữ liệu cho mảngNhập dữ liệu cho mảngfor( i=0;i<5;i++) {for( i=0;i<5;i++) {

printf(“Phan tu thu %d= ”,i);printf(“Phan tu thu %d= ”,i);scanf(“%d”, &a[i]);scanf(“%d”, &a[i]);

} } -- In các phần tử của mảng ra màn hìnhIn các phần tử của mảng ra màn hình

for(i=0;i<n;i++) printf(“%6d”,a[i])for(i=0;i<n;i++) printf(“%6d”,a[i])

Page 60: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

60Ngôn ngữ lập trình C

- Nhập xuất dữ liệu gián tiếp thông qua một biến Nhập xuất dữ liệu gián tiếp thông qua một biến trung gian đối với mảng một chiều và mảng đa trung gian đối với mảng một chiều và mảng đa chiềuchiềufor(i=0;i<2;i++)for(i=0;i<2;i++)for(j=0;j<3;j++) {for(j=0;j<3;j++) {printf(“a[%d,%d]”, i, j);printf(“a[%d,%d]”, i, j);scantf(“%f”,&temp);scantf(“%f”,&temp);a[i] [j] = temp;a[i] [j] = temp;}}- Bài tậpBài tập- Nhập vào từ bàn phím n số nguyên, tìm và in ra Nhập vào từ bàn phím n số nguyên, tìm và in ra

màn hình số nguyên lớn nhất và số nguyên nhỏ màn hình số nguyên lớn nhất và số nguyên nhỏ nhấtnhất

- Nhập ma trận các số thực kích thước n hàng và Nhập ma trận các số thực kích thước n hàng và m cột. Tìm và in ra số thực lớn nhất trong ma m cột. Tìm và in ra số thực lớn nhất trong ma trậntrận

Page 61: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

61Ngôn ngữ lập trình C

Bài 6: Con trỏBài 6: Con trỏ1.1. Khái niệm con trỏ và địa chỉKhái niệm con trỏ và địa chỉ- Địa chỉ: Dựa vào kiểu dữ liệu khi khai báo biến Địa chỉ: Dựa vào kiểu dữ liệu khi khai báo biến

máy sẽ cấp phát cho biến một địa chỉ để lưu trữ máy sẽ cấp phát cho biến một địa chỉ để lưu trữ biến đó trên vùng nhớ. Mỗi biến có kiểu khác biến đó trên vùng nhớ. Mỗi biến có kiểu khác nhau thì được lưu vào các địa chỉ khác nhaunhau thì được lưu vào các địa chỉ khác nhau

- Con trỏ là một biến dùng để chứa địa chỉ. Mỗi Con trỏ là một biến dùng để chứa địa chỉ. Mỗi loại địa chỉ thì có loại con trỏ tương ứng. Trước loại địa chỉ thì có loại con trỏ tương ứng. Trước khi sử dụng biến con trỏ ta phải khai báo trước khi sử dụng biến con trỏ ta phải khai báo trước khi sử dụngkhi sử dụng

- Khai báo:Khai báo: <kiểu_DL> * <tên_biến_con_trỏ>;<kiểu_DL> * <tên_biến_con_trỏ>;- VD1:VD1: int x, y, *p, *c;int x, y, *p, *c;

x, y là hai biến kiểu nguyên, p, c là hai biến con x, y là hai biến kiểu nguyên, p, c là hai biến con trỏ kiểu nguyêntrỏ kiểu nguyên

Page 62: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

62Ngôn ngữ lập trình C

VD2:VD2: float *t, *d ;float *t, *d ;//Khai báo biến con trỏ t và d có kiểu thực//Khai báo biến con trỏ t và d có kiểu thực

Biến con trỏ được dùng theo hai trường hợp Biến con trỏ được dùng theo hai trường hợp sau:sau:

Tên con trỏ chỉ đến Tên con trỏ chỉ đến địa chỉ của biến được địa chỉ của biến được lưu trong con trỏ: lưu trong con trỏ:

float a,*p,*q;float a,*p,*q;p=&a; /* lưu địa chỉ của biến a vào con p=&a; /* lưu địa chỉ của biến a vào con

trỏ p */trỏ p */q= p; /* lưu địa chỉ trong p vào con trỏ q= p; /* lưu địa chỉ trong p vào con trỏ

q*/ q*/

Page 63: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

63Ngôn ngữ lập trình C

Dạng khai báo của con trỏ chỉ đến giá trị Dạng khai báo của con trỏ chỉ đến giá trị lưu tại vùng nhớ mà con trỏ trỏ tới. lưu tại vùng nhớ mà con trỏ trỏ tới. VD:VD: float x=5, y , z=20, *px, *pz;,*py; float x=5, y , z=20, *px, *pz;,*py;

px=& x; /* khi đó *px = x =5*/px=& x; /* khi đó *px = x =5*/pz=&z; /* *pz=z=20*/pz=&z; /* *pz=z=20*/

khi đó ba biểu thức sau là tương đương:khi đó ba biểu thức sau là tương đương:y=3*x+z;y=3*x+z; *py=3*x+z;*py=3*x+z;*py=3*(*px)+*pz;*py=3*(*px)+*pz;

Page 64: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

64Ngôn ngữ lập trình C

2. Con trỏ và mảng một chiều2. Con trỏ và mảng một chiềuCác phần tử của mảng có thể được xác định Các phần tử của mảng có thể được xác định thông qua con trỏ. Ta có khai báo :thông qua con trỏ. Ta có khai báo : float float a[10];a[10];//Khai báo mảng gồm 10 phần tử kiểu thực//Khai báo mảng gồm 10 phần tử kiểu thựcTa có tên mảng chính là một hằng địa chỉ Ta có tên mảng chính là một hằng địa chỉ trỏ tới địa chỉ phần tử đầu tiên của mảng và trỏ tới địa chỉ phần tử đầu tiên của mảng và a a tương đương với &a[0]tương đương với &a[0]a+i a+i tương đương với &a[i]tương đương với &a[i]*(a+i) tương đương với *(a+i) tương đương với a[i]a[i]

Vậy Vậy

a[k] a[k+1]a[k-1]

pa pa +ipa - i

Page 65: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

65Ngôn ngữ lập trình C

Các cách viết a[i], *(a+i), *(p+i), p[i] là Các cách viết a[i], *(a+i), *(p+i), p[i] là tương đương nhautương đương nhau

VD: Nhập từ bàn phím các phần tử của VD: Nhập từ bàn phím các phần tử của mảng và tính tổng các phần tử đómảng và tính tổng các phần tử đó

Page 66: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

66Ngôn ngữ lập trình C

#include<stdio.h>#include<stdio.h>#include<stdio.h>#include<stdio.h>void main()void main(){{ float a[5], s ; int i;float a[5], s ; int i;

for(i=0;i<5;i++) {for(i=0;i<5;i++) {printf(“\na[%d]= ”,i); scanf(“%f”,&a[i]); }printf(“\na[%d]= ”,i); scanf(“%f”,&a[i]); }

s=0;s=0;for (i=0;i<5;i++)for (i=0;i<5;i++) s+=a[i];s+=a[i];printf(“\n Tong =%8.2f”,s);printf(“\n Tong =%8.2f”,s);getch();getch();

}}Ví dụ: Tro1Ví dụ: Tro1

Page 67: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

67Ngôn ngữ lập trình C

3. Con trỏ với mảng nhiều chiều3. Con trỏ với mảng nhiều chiềuPhép toán lấy Phép toán lấy địa chỉ nói chung không dđịa chỉ nói chung không dùng ùng được đối được đối với các thvới các thành phần của mảng nhiều chiều (trừ trường ành phần của mảng nhiều chiều (trừ trường hợp mảng hai chiều các số nguyên). hợp mảng hai chiều các số nguyên). Ðể tính toán địa chỉ của thành phần a[i][j] chúng ta sử Ðể tính toán địa chỉ của thành phần a[i][j] chúng ta sử dụng công thức sau :dụng công thức sau :

(float *)a+i*n+j. (float *)a+i*n+j. a là một hằng con trỏ trỏ đến các dòng của một ma trân a là một hằng con trỏ trỏ đến các dòng của một ma trân hai chiều, vì vậyhai chiều, vì vậy

a trỏ đến dòng thứ nhấta trỏ đến dòng thứ nhấta+1 trỏ đến dòng thứ haia+1 trỏ đến dòng thứ haia+2 trỏ đến dòng thứ baa+2 trỏ đến dòng thứ ba

Page 68: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

68Ngôn ngữ lập trình C

Ðể tính toán Ðể tính toán được địa chỉ của phần tử ở dđược địa chỉ của phần tử ở dòng i cột j òng i cột j chúng ta phải dùng phép chuyển chúng ta phải dùng phép chuyển đổi kiểu bắt buộc đối đổi kiểu bắt buộc đối với a: (float * )a với a: (float * )a a là con trỏ trỏ đến thành phần a[0][0] của ma trận.a là con trỏ trỏ đến thành phần a[0][0] của ma trận.a[i][j] sẽ có địa chỉ là (float *a) +i*n+ja[i][j] sẽ có địa chỉ là (float *a) +i*n+jXét VD nhập giá trị của ma trận hai chiều: Xét VD nhập giá trị của ma trận hai chiều: Tro2Tro2

Page 69: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

69Ngôn ngữ lập trình C

#include <stdio.h>#include <stdio.h>#include <stdio.h>#include <stdio.h>void main()void main(){{ float a[10][20];float a[10][20]; int i,j,n;int i,j,n;

printf("Nhap vao kich thuoc ma tran n=");printf("Nhap vao kich thuoc ma tran n=");scanf("%n",&n); scanf("%n",&n); for(i=0;i<n;i++)for(i=0;i<n;i++)for(j=0;j<n;j++)for(j=0;j<n;j++){{ printf("a[%d][%d] = ",i,j);printf("a[%d][%d] = ",i,j);scanf("%f",(float *)a+i*20+j);scanf("%f",(float *)a+i*20+j);}}getch();getch();

}}

Page 70: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

70Ngôn ngữ lập trình C

4. Phép toán trên con trỏ4. Phép toán trên con trỏ- Phép gán: chỉ nên thực hiện trên các con trỏ có cùng Phép gán: chỉ nên thực hiện trên các con trỏ có cùng

kiểu, khi thực hiện trên con trỏ phải thực hiện phép ép kiểu, khi thực hiện trên con trỏ phải thực hiện phép ép kiểu:kiểu:Vd: int x;Vd: int x;

char *p;char *p;p=(char*)(&x);p=(char*)(&x);

- Phép tăng giảm địa chỉPhép tăng giảm địa chỉVD: float x[30], *px;VD: float x[30], *px;px=&x[10];// p là con trỏ thực trỏ tới phần tử x[10]px=&x[10];// p là con trỏ thực trỏ tới phần tử x[10]

px+i trỏ tới phần tử x[10+i]px+i trỏ tới phần tử x[10+i]px – i trỏ tới phần tử x[10-i]px – i trỏ tới phần tử x[10-i]

Page 71: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

71Ngôn ngữ lập trình C

- Phép so sánh: dùng so sánh các con trỏ cùng kiểu, giả Phép so sánh: dùng so sánh các con trỏ cùng kiểu, giả sử p1 và p2 là hai con trỏ kiểu float thì tồn tại phép so sử p1 và p2 là hai con trỏ kiểu float thì tồn tại phép so sánhsánhp1 < p2 // địa chỉ p1 trỏ tới thấp hơn địa chỉ p2 trỏ tớip1 < p2 // địa chỉ p1 trỏ tới thấp hơn địa chỉ p2 trỏ tớip1==p2p1==p2

5. Con trỏ kiểu void5. Con trỏ kiểu voidLà con trỏ đặc biệt không có kiểu, nó có thể nhận bất kỳ Là con trỏ đặc biệt không có kiểu, nó có thể nhận bất kỳ địa chỉ nào. Con trỏ kiểu void thường dùng làm đối để địa chỉ nào. Con trỏ kiểu void thường dùng làm đối để nhận bất kỳ địa chỉ nào thông qua phép ép kiểu trong nhận bất kỳ địa chỉ nào thông qua phép ép kiểu trong thân hàmthân hàmCác phép toán tăng giảm địa chỉ, so sánh không dùng Các phép toán tăng giảm địa chỉ, so sánh không dùng được con trỏ kiểu void được con trỏ kiểu void

Page 72: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

72Ngôn ngữ lập trình C

6. Mảng con trỏ6. Mảng con trỏMảng con trỏ là một mảng mà mỗi phẩn tử của nó có thể Mảng con trỏ là một mảng mà mỗi phẩn tử của nó có thể chứa một địa chỉ nào đó. Mảng con trỏ có nhiều kiểu, chứa một địa chỉ nào đó. Mảng con trỏ có nhiều kiểu, mỗi phẩn tử của mảng kiểu nào thì sẽ chứa địa chỉ kiểu mỗi phẩn tử của mảng kiểu nào thì sẽ chứa địa chỉ kiểu tương ứng với nó. Mảng con trỏ được khai báo theo mẫu tương ứng với nó. Mảng con trỏ được khai báo theo mẫu sau:sau:

<kiểu Dl> *<tênmảng>[N]<kiểu Dl> *<tênmảng>[N]Khi gặp khai báo mảng con trỏ thì máy sẽ cấp phát N Khi gặp khai báo mảng con trỏ thì máy sẽ cấp phát N khoảng nhớ liên tiếp cho N phần tử tương ứng trong khoảng nhớ liên tiếp cho N phần tử tương ứng trong mảngmảngChú ý: Mảng con trỏ không dùng để lưu số liệu, trước Chú ý: Mảng con trỏ không dùng để lưu số liệu, trước khi sử dụng mảng con trỏ cần gán cho mỗi phần tử một khi sử dụng mảng con trỏ cần gán cho mỗi phần tử một giá trị là địa chỉ của một biến hoặc của một phần tử giá trị là địa chỉ của một biến hoặc của một phần tử trong mảngtrong mảng

Page 73: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

73Ngôn ngữ lập trình C

Bài 7: Hàm và chương trìnhBài 7: Hàm và chương trình1.1. Khái niệm Khái niệm

Chương trìnhChương trình:: Một chương trình C bao gồm một Một chương trình C bao gồm một hoặc nhiều hàm. Hàm main() là thành phần bắt buộc hoặc nhiều hàm. Hàm main() là thành phần bắt buộc của chương trình. Chương trình bắt của chương trình. Chương trình bắt đầu thực hiện từ đầu thực hiện từ câu lệnh đầu ticâu lệnh đầu tiên của hàm main( ) cho ên của hàm main( ) cho đến khi gặp đến khi gặp dấu } cuối cdấu } cuối cùng của hàm này.ùng của hàm này.HàmHàm: Là một : Là một đoạn chương trđoạn chương trình ình độc lập thực hiện trọn độc lập thực hiện trọn vẹn một công việc rồi trả về một giá trị cho chương vẹn một công việc rồi trả về một giá trị cho chương trtrình đã gọi nó.ình đã gọi nó.Đặc điểm của hàm:Đặc điểm của hàm:

Là một Là một đơn vị độc lập của chương trđơn vị độc lập của chương trình. ình. Không cho phép xây dựng một hàm bên trong một Không cho phép xây dựng một hàm bên trong một

hàm kháchàm khác. .

Page 74: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

74Ngôn ngữ lập trình C

Page 75: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

75Ngôn ngữ lập trình C

2. Quy tắc xây dựng hàm: Một hàm gồm có các thành phần 2. Quy tắc xây dựng hàm: Một hàm gồm có các thành phần sausau

- Nguyên mẫu của hàm: Nguyên mẫu của hàm: Bao gồmBao gồm<kiểu dl của hàm> <<kiểu dl của hàm> <tên hàmtên hàm(ds các tham số)>;(ds các tham số)>;Có thể có hoặc không khai báo nguyên mẫu của hàm, Có thể có hoặc không khai báo nguyên mẫu của hàm, khi không khai báo nguyên mẫu thì bộ biên dịch sẽ khi không khai báo nguyên mẫu thì bộ biên dịch sẽ kiểm tra việc truyền tham số, giá trị trả về có phù hợp kiểm tra việc truyền tham số, giá trị trả về có phù hợp hay không rồi mới cho thực hiện hàm.hay không rồi mới cho thực hiện hàm.Tất cả nguyên mẫu của các hàm có trong chương trình Tất cả nguyên mẫu của các hàm có trong chương trình nên nên đặt trước hđặt trước hàm main()àm main()..

Page 76: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

76Ngôn ngữ lập trình C

Kiểu giá trị của hàmKiểu giá trị của hàmGiá trị trả về của hàm Giá trị trả về của hàm được xác định dựa vđược xác định dựa vào ào mục mục đích của hđích của hàmàm. Nếu các h. Nếu các hàm không trả àm không trả về giá trị ta phải khai báo kiểu void.về giá trị ta phải khai báo kiểu void.

Tên hàmTên hàmÐặt theo qui Ðặt theo qui định đối với danh địnhđịnh đối với danh định. Tên . Tên hàm trong nguyên mẫu và khi khai báo phải hàm trong nguyên mẫu và khi khai báo phải giống nhau.giống nhau.

Tham số của hàmTham số của hàmKhi viết một hàm ta phải xác Khi viết một hàm ta phải xác định xem hđịnh xem hàm àm có bao nhiêu tham số ? có bao nhiêu tham số ?

Nội dung của hàm Nội dung của hàm

Page 77: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

77Ngôn ngữ lập trình C

Cấu trúc của một hàmCấu trúc của một hàm<Kiểu trả về><Tên hàm>(<ds tham số hình thức hay <Kiểu trả về><Tên hàm>(<ds tham số hình thức hay

đối số>)đối số>){{ <Khai báo biến cục bộ>;<Khai báo biến cục bộ>;

<Các câu lệnh trong thân hàm>;<Các câu lệnh trong thân hàm>;[return<bt trả về giá trị hàm>];[return<bt trả về giá trị hàm>];};};

Chú ý:Chú ý:- Đối với các hàm không có kiểu trả về ta có hàm kiểu Đối với các hàm không có kiểu trả về ta có hàm kiểu

voidvoid- Hàm không có đối thì dùng kiểu void để khai báo đối. Hàm không có đối thì dùng kiểu void để khai báo đối.

VDVDvoid bell(void)void bell(void){{ int i;int i;for(i=0;i<10;i++) putch(7);for(i=0;i<10;i++) putch(7);}}

Page 78: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

78Ngôn ngữ lập trình C

Cách sử dụng hàmCách sử dụng hàm: Hàm được sử dụng thông qua lời gọi : Hàm được sử dụng thông qua lời gọi hàm.hàm.

<tên hàm> ([ds tham số thực])<tên hàm> ([ds tham số thực])- Tham số thực phải bằng tham số hình thứcTham số thực phải bằng tham số hình thức- Kiểu của tham số thực phải phù hợp với kiểu của tham Kiểu của tham số thực phải phù hợp với kiểu của tham

số hình thứcsố hình thức Hoạt động của hàm khi có lời gọi hàmHoạt động của hàm khi có lời gọi hàm Cấp phát bộ nhớ cho tham số hình thức và biến cục bộCấp phát bộ nhớ cho tham số hình thức và biến cục bộ Gán giá trị của tham số thực cho tham số hình thứcGán giá trị của tham số thực cho tham số hình thức Thực hiện các lệnh trong thân hàmThực hiện các lệnh trong thân hàm Khi gặp câu lệnh return hoặc dấu hiệu kết thúc hàm thì Khi gặp câu lệnh return hoặc dấu hiệu kết thúc hàm thì

bộ nhớ sẽ xoá các tham số hình thức và biến cục bộ sau bộ nhớ sẽ xoá các tham số hình thức và biến cục bộ sau đó thoát khỏi hàm quay về chương trình gọi hàm đó thoát khỏi hàm quay về chương trình gọi hàm

Page 79: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

79Ngôn ngữ lập trình C

3. Các tham số trong hàm3. Các tham số trong hàm3.13.1 Phân loại tham số theo cách sử dụng Phân loại tham số theo cách sử dụng o Tham số hình thức: Các tham số mà ta ghi trong Tham số hình thức: Các tham số mà ta ghi trong

nguyên mẫu hay ghi lúc khai báo hàm gọi là tham số nguyên mẫu hay ghi lúc khai báo hàm gọi là tham số hình thức.hình thức.

o Tham số thực:Các giá trị, biến mà ta ghi sau tên hàm Tham số thực:Các giá trị, biến mà ta ghi sau tên hàm khi gọi hàm khi gọi hàm đó để thực hiện gọi lđó để thực hiện gọi là tham số thực. à tham số thực. Trong C, các tham số thực lại chia ra làm hai loại:Trong C, các tham số thực lại chia ra làm hai loại:

Tham chiếu: Là các tham số thực mà ta truyền cho Tham chiếu: Là các tham số thực mà ta truyền cho Hàm dưới dạng con trỏ (dạng Hàm dưới dạng con trỏ (dạng địa chỉ). Tham chiếu địa chỉ). Tham chiếu mới ghi nhận lại được những kết quả vừa tính toán mới ghi nhận lại được những kết quả vừa tính toán trong Htrong Hàm khi Hàm kết thúc.àm khi Hàm kết thúc.

Tham trị : Là các tham số thực mà ta truyền cho Tham trị : Là các tham số thực mà ta truyền cho Hàm dưới dạng biến. Tham trị không bảo lưu lại Hàm dưới dạng biến. Tham trị không bảo lưu lại những kết quả thay những kết quả thay đổi của nó được tính toán trong đổi của nó được tính toán trong HHàm khi Hàm kết thúc.àm khi Hàm kết thúc.

Page 80: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

80Ngôn ngữ lập trình C

3.23.2 Phân loại theo công dụng Phân loại theo công dụng Tham số của một hàm có hai công dụng:Tham số của một hàm có hai công dụng:

Cung cấp các giá trị cho hàm khi ta gọi nó thực Cung cấp các giá trị cho hàm khi ta gọi nó thực hiện .hiện .

Lưu các kết quả tính toán Lưu các kết quả tính toán được trong quá trđược trong quá trình ình hàm hoạt độnghàm hoạt động

Tương ứng với công dụng ta có các loại tham Tương ứng với công dụng ta có các loại tham số:số:

Tham số vào: Cung cấp giá trị cho hàm.Tham số vào: Cung cấp giá trị cho hàm. Tham số ra: Lưu kết quả tính toán Tham số ra: Lưu kết quả tính toán được trong được trong

hhàm. àm. Tham số vừa vào, vừa ra: vừa cung cấp giá trị Tham số vừa vào, vừa ra: vừa cung cấp giá trị

cho hàm, vừa lưu kết quả tính toán cho hàm, vừa lưu kết quả tính toán được trong được trong hhàm.àm.

Page 81: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

81Ngôn ngữ lập trình C

4.4.Hàm có đối con trỏHàm có đối con trỏĐối số của hĐối số của hàm là con trỏ kiểu àm là con trỏ kiểu int int (float,double,. )(float,double,. ) thì tham số thực tương ứng thì tham số thực tương ứng phải là phải là địa chỉ của biến kiểu địa chỉ của biến kiểu int int (float,double,.)(float,double,.). Khi . Khi đó địa chỉ của biến được đó địa chỉ của biến được truyền cho đối con trỏ tương ứng.truyền cho đối con trỏ tương ứng.Khi muốn bảo lưu lại kết quả tính toán được Khi muốn bảo lưu lại kết quả tính toán được của các đối số trong hàm để sử dụng cho của các đối số trong hàm để sử dụng cho chương trình gọi hàm có đối số thì chúng ta chương trình gọi hàm có đối số thì chúng ta phải khai báo đối số của hàm là tham chiếu phải khai báo đối số của hàm là tham chiếu (con trỏ hay dạng địa chỉ).(con trỏ hay dạng địa chỉ).VD:VD:

Page 82: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

82Ngôn ngữ lập trình C

Bài 8: Chuỗi ký tựBài 8: Chuỗi ký tự1.1. Khái niệmKhái niệm Chuỗi ký tự là một dãy các ký tự Chuỗi ký tự là một dãy các ký tự đặt trong cặp đặt trong cặp

dấu nháy kép. Chuỗi rỗng được ký hiệu bằng hai dấu dấu nháy kép. Chuỗi rỗng được ký hiệu bằng hai dấu nháy kép đi liền nhau. Một chuỗi ký tự được cấp phát nháy kép đi liền nhau. Một chuỗi ký tự được cấp phát một khoảng nhớ cho một mảng kiểu char chứa các ký tự một khoảng nhớ cho một mảng kiểu char chứa các ký tự của chuỗi vcủa chuỗi và chứa thêm ký tự '\0' là ký tự kết thúc chuỗi.à chứa thêm ký tự '\0' là ký tự kết thúc chuỗi.

Mỗi ký tự của chuỗi Mỗi ký tự của chuỗi được chứa trong được chứa trong một phần tử một phần tử của mảng. Chuỗi ký tự là một trường hợp riêng của của mảng. Chuỗi ký tự là một trường hợp riêng của mảng một chiều khi mỗi thành phần của mảng là ký tựmảng một chiều khi mỗi thành phần của mảng là ký tự

Chuỗi ký tự thường được khai báo theo khai Chuỗi ký tự thường được khai báo theo khai báo theo báo theo hai mẫu:hai mẫu:

char ten_chuoi[] ;char ten_chuoi[] ; hoặc char *ten_chuoi;hoặc char *ten_chuoi;

Page 83: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

83Ngôn ngữ lập trình C

2. Các thao tác trên chuỗi2. Các thao tác trên chuỗiTrong C không tồn tại các phép toán so sánh, gán nội Trong C không tồn tại các phép toán so sánh, gán nội dung của chuỗi này cho chuỗi khác. dung của chuỗi này cho chuỗi khác. Ðể thực hiện các thao tác này ta sử dụng một thư viện Ðể thực hiện các thao tác này ta sử dụng một thư viện các hàm chuẩn là <các hàm chuẩn là <string.h>string.h>..

Hàm strlen: Hàm strlen: int strlen(char s[])int strlen(char s[])Trả về Trả về độ dđộ dài của chuỗi s, chính là chỉ số của ký tự ài của chuỗi s, chính là chỉ số của ký tự NULL trong chuỗi.NULL trong chuỗi.

Hàm strcpy: Hàm strcpy: strcpy(char dest[], char source[])strcpy(char dest[], char source[])Sao chép nội dung chuỗi source vào chuỗi dest.Sao chép nội dung chuỗi source vào chuỗi dest.

Hàm strchr: Hàm strchr: char *strchr(char s[], char c)char *strchr(char s[], char c)Tìm lần xuất hiện Tìm lần xuất hiện đầu tiđầu tiên của ký tự c trong chuỗi s, trả ên của ký tự c trong chuỗi s, trả về về địa chỉ của ký tự nđịa chỉ của ký tự này.ày.

Page 84: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

84Ngôn ngữ lập trình C

Hàm strncpy: Hàm strncpy: strncpy(char dest[], char source[], int n)strncpy(char dest[], char source[], int n) Sao chép n ký tự trong chuỗi source vào chuỗi dest. Sao chép n ký tự trong chuỗi source vào chuỗi dest. Trong trường hợp không có Trong trường hợp không có đủ n ký tự trong source thđủ n ký tự trong source thì ì hàm sẽ hàm sẽ điền thđiền thêm các ký tự trắng vào chuỗi dest.êm các ký tự trắng vào chuỗi dest.

Hàm strcat : Hàm strcat : strcat(char ch1[], char ch2[])strcat(char ch1[], char ch2[])Nối chuỗi ch2 vào cuối chuỗi ch1. Sau lời gọi hàm này Nối chuỗi ch2 vào cuối chuỗi ch1. Sau lời gọi hàm này độ dđộ dài chuỗi ch1 bằng tổng ài chuỗi ch1 bằng tổng độ dđộ dài của cả hai chuỗi ch1 ài của cả hai chuỗi ch1 và ch2 trước lời gọi hàm.và ch2 trước lời gọi hàm.

Hàm strncat : Hàm strncat : strncat(char ch1[], char ch2[],int n)strncat(char ch1[], char ch2[],int n)Nối n ký tự Nối n ký tự đầu tiđầu tiên của ch2 vào ch1ên của ch2 vào ch1

Page 85: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

85Ngôn ngữ lập trình C

Hàm strstr : Hàm strstr : char *strstr(char s1[], char s2[])char *strstr(char s1[], char s2[])Tìm kiếm chuỗi s2 trong chuỗi s1, Trả về Tìm kiếm chuỗi s2 trong chuỗi s1, Trả về địa chỉ địa chỉ của lần xuất hiện đầu ticủa lần xuất hiện đầu tiên của s2 trong s1 hoặc ên của s2 trong s1 hoặc NULL khi không tìm thấy.NULL khi không tìm thấy.

Hàm strcmp : Hàm strcmp : int strcmp(char ch1[], char ch2[])int strcmp(char ch1[], char ch2[])So sánh hai chuỗi ch1 và ch2. Nguyên tắc so So sánh hai chuỗi ch1 và ch2. Nguyên tắc so sánh theo kiểu từ sánh theo kiểu từ điển. Giá trị trả về:điển. Giá trị trả về: = 0 nếu chuỗi ch1 bằng chuỗi ch2= 0 nếu chuỗi ch1 bằng chuỗi ch2 > 0 nếu chuỗi ch1 lớn hơn chuỗi ch2> 0 nếu chuỗi ch1 lớn hơn chuỗi ch2 < 0 nếu chuỗi ch1 nhỏ hơn chuỗi ch2< 0 nếu chuỗi ch1 nhỏ hơn chuỗi ch2VD: Đếm số lần xuất hiện của ký tự a trong VD: Đếm số lần xuất hiện của ký tự a trong

một xâu ký tự cho trướcmột xâu ký tự cho trước

Page 86: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

86Ngôn ngữ lập trình C

#include<stdio.h>#include<stdio.h>#include<conio.h>#include<conio.h>#define HANG 128#define HANG 128void main()void main(){{ char xau[HANG];char xau[HANG]; int i,na;int i,na;

clrscr();clrscr();printf("\nNhap mot xau ky printf("\nNhap mot xau ky tu:");gets(xau);tu:");gets(xau);na=i=0;na=i=0;while(xau[i]) while(xau[i])

if (xau[i++]=='a') na++;if (xau[i++]=='a') na++;printf("\nXau co %d chu a",na);printf("\nXau co %d chu a",na);getch();getch();

return;return;}}

Page 87: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

87Ngôn ngữ lập trình C

3. Mảng và chuỗi ký tự3. Mảng và chuỗi ký tự Một dạng sử dụng con trỏ Một dạng sử dụng con trỏ đặc biệt lđặc biệt là việc sử dụng một à việc sử dụng một

mảng các biến con trỏ. Khai báo theo mẫumảng các biến con trỏ. Khai báo theo mẫutype *pointer_array[size];type *pointer_array[size];

VD: khai báoVD: khai báo char *temp[10];char *temp[10];sẽ khai báo một mảng 10 con trỏ sẽ khai báo một mảng 10 con trỏ charchar có thể có thể được dđược dùng ùng để khai báo một mảng để lưu trữ địa chỉ của mười chuỗi để khai báo một mảng để lưu trữ địa chỉ của mười chuỗi ký tự nký tự nào ào đó.đó.

Bài tập:viết chương trình nhập nhiều tên người vào từ Bài tập:viết chương trình nhập nhiều tên người vào từ bàn phím, sắp xếp lại theo thứ tự và in kết quả đã sắp bàn phím, sắp xếp lại theo thứ tự và in kết quả đã sắp xếp ra. xếp ra.

+ Sắp xếp lại các tên này theo thứ tự alphabet+ Sắp xếp lại các tên này theo thứ tự alphabet+ In các tên ra theo thứ tự đó.+ In các tên ra theo thứ tự đó.

Page 88: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

88Ngôn ngữ lập trình C

VD: xét một mảng các con trỏ ptr_array VD: xét một mảng các con trỏ ptr_array được được gán các địa chỉ của các biến int có giá trị vgán các địa chỉ của các biến int có giá trị và vị trí à vị trí bất kỳ. Dùng một hàm bất kỳ. Dùng một hàm để sắp xếp lại các địa chỉ để sắp xếp lại các địa chỉ nnày trong mảng ày trong mảng để sao cho các địa chỉ của các số để sao cho các địa chỉ của các số bé được xếp trước địa chỉ của các số lớn hơn. Lúc bé được xếp trước địa chỉ của các số lớn hơn. Lúc đó dđó dù chúng ta không làm thay ù chúng ta không làm thay đổi vị trí hoặc đổi vị trí hoặc thay đổi các giá trị của các biến nhưng mảng vẫn thay đổi các giá trị của các biến nhưng mảng vẫn giống như giống như một mảng chỉ một mảng chỉ đến các giá trị đđến các giá trị đã sắp ã sắp xếp có thứ tự.xếp có thứ tự.

Page 89: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

89Ngôn ngữ lập trình C

Bài tập:Bài tập: Viết chương trình Viết chương trình đếm số lần xuất hiện của một ký tự đếm số lần xuất hiện của một ký tự

trong một xâu ký tựtrong một xâu ký tự Viết chương trình nhập một chữ, xuất ra chữ đó nhiều Viết chương trình nhập một chữ, xuất ra chữ đó nhiều

lần dùng con trỏlần dùng con trỏ

Page 90: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

90Ngôn ngữ lập trình C

Bài 9: Cấp phát và giải phóng bộ nhớ độngBài 9: Cấp phát và giải phóng bộ nhớ động

1.1. Khái niệmKhái niệm Biến Biến động: động: Là các biến Là các biến được tạo ra lúc chạy chương được tạo ra lúc chạy chương

trtrình, ình, tùy theo nhu cầu. Số biến này hoàn toàn không tùy theo nhu cầu. Số biến này hoàn toàn không được xác định từ trước. được xác định từ trước. Các biến Các biến động không có tđộng không có tên ên (việc (việc đặt tđặt tên thực chất là gán cho nó một ên thực chất là gán cho nó một địa chỉ xác địa chỉ xác định). định).

Cách tạo ra biến động và truy nhập đến biến động Cách tạo ra biến động và truy nhập đến biến động được tiến hành như sau được tiến hành như sau Việc tạo ra biến động và xóa nó đi (để thu hồi lại bộ Việc tạo ra biến động và xóa nó đi (để thu hồi lại bộ nhớ) được thực hiện nhờ các hàm như malloc() và nhớ) được thực hiện nhờ các hàm như malloc() và free() đã có sẵn trong thư viện stdlib.hfree() đã có sẵn trong thư viện stdlib.h

Page 91: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

91Ngôn ngữ lập trình C

Việc truy nhập đến biến động được tiến hành nhờ các Việc truy nhập đến biến động được tiến hành nhờ các biến con trỏ. Các biến con trỏ được định nghĩa như các biến con trỏ. Các biến con trỏ được định nghĩa như các biến tĩnh ( được khai báo ngay từ đầu trong phần khai biến tĩnh ( được khai báo ngay từ đầu trong phần khai báo biến) và được dùng để chứa địa chỉ các biến độngbáo biến) và được dùng để chứa địa chỉ các biến động

VD1:VD1: int *p; /* Khai báo biến con trỏ p*/int *p; /* Khai báo biến con trỏ p*/p= (int *) malloc(100);/* Tạo biến động*/p= (int *) malloc(100);/* Tạo biến động*/

Ðoạn chương trình trên sẽ cấp phát 100 bytes trong bộ Ðoạn chương trình trên sẽ cấp phát 100 bytes trong bộ nhớ và gán địa chỉ khối bộ nhớ này cho pnhớ và gán địa chỉ khối bộ nhớ này cho p

VD2: cấp phát bộ nhớ chính xác cho 70 ký tự:VD2: cấp phát bộ nhớ chính xác cho 70 ký tự:/* Khai báo biến con trỏ kiểu char *//* Khai báo biến con trỏ kiểu char */

char *cp; char *cp; /* Tạo biến động *//* Tạo biến động */

cp=(char *) malloc(70);cp=(char *) malloc(70);

Page 92: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

92Ngôn ngữ lập trình C

2.2. Cấp phát và giải phóng bộ nhớ động (các hàm thuộc Cấp phát và giải phóng bộ nhớ động (các hàm thuộc stdlib.h và alloc.h)stdlib.h và alloc.h)

2.1 Cấp phát bộ nhớ động bằng hàm malloc( )2.1 Cấp phát bộ nhớ động bằng hàm malloc( )Cú phápCú pháp void *malloc(kiểu _dl size)void *malloc(kiểu _dl size)

Chức nChức năng: Hăng: Hàm malloc cấp phát một vùng nhớ có kích àm malloc cấp phát một vùng nhớ có kích thước là size.thước là size.

size là một giá trị kiểu_dl (là một kiểu dữ liệu size là một giá trị kiểu_dl (là một kiểu dữ liệu định sẵn định sẵn trong thư viện stdlib.h).trong thư viện stdlib.h).

Hàm malloc trả về con trỏ kiểu void chứa Hàm malloc trả về con trỏ kiểu void chứa địa chỉ ô nhớ địa chỉ ô nhớ đầu của vđầu của vùng nhớ ùng nhớ được cấp phát. Nếu không đủ vđược cấp phát. Nếu không đủ vùng nhớ ùng nhớ để cấp phát hàm trả về giá trị để cấp phát hàm trả về giá trị NULLNULL, vì vậy phải kiểm tra , vì vậy phải kiểm tra giá trị trả về khi sử dụng hàm malloc.giá trị trả về khi sử dụng hàm malloc.

Page 93: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

93Ngôn ngữ lập trình C

2.2 Cấp phát bộ nhớ động bằng hàm calloc2.2 Cấp phát bộ nhớ động bằng hàm callocCú phápCú pháp

(datatype *) calloc(n, sizeof(object));(datatype *) calloc(n, sizeof(object));Hàm calloc cấp phát bộ nhớ Hàm calloc cấp phát bộ nhớ động cho các kiểu dữ liệu động cho các kiểu dữ liệu Trong đ óTrong đ ó: :

(datatype *) là kiểu con trỏ trỏ tới kiểu dữ liệu datatype.(datatype *) là kiểu con trỏ trỏ tới kiểu dữ liệu datatype. n là số lượng object thuộc kiểu datatype cần cấp phát bộ n là số lượng object thuộc kiểu datatype cần cấp phát bộ

nhớ.nhớ. datatype có thể là kiểu dữ liệu cơ sở hoặc kiểu dữ liệu mớidatatype có thể là kiểu dữ liệu cơ sở hoặc kiểu dữ liệu mới

Page 94: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

94Ngôn ngữ lập trình C

2.3 Cấp phát bộ nhớ động bằng hàm relloc2.3 Cấp phát bộ nhớ động bằng hàm rellocCú phápCú pháp

(datatype *) realloc(buf _p, newsize);(datatype *) realloc(buf _p, newsize);HHàm có chức năng cấp phát lại bộ nhớàm có chức năng cấp phát lại bộ nhớTrong Trong đó:đó:

buf_p là con trỏ đang trỏ đến vùng ô nhớ đã được cấp buf_p là con trỏ đang trỏ đến vùng ô nhớ đã được cấp phát từ trước.phát từ trước.

newsize là kích thước mới cần cấp phát, có thể lớn hoặc newsize là kích thước mới cần cấp phát, có thể lớn hoặc nhỏ hơn.nhỏ hơn.

Page 95: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

95Ngôn ngữ lập trình C

2.4 Giải phóng bộ nhớ bằng hàm free2.4 Giải phóng bộ nhớ bằng hàm freeCú phápCú pháp

void free( void *prt)void free( void *prt)Hàm free giải phóng vùng nhớ Hàm free giải phóng vùng nhớ được trỏ đến được trỏ đến bởi con trỏ ptr. bởi con trỏ ptr. Nếu con trỏ ptr = NULL thì hàm free không Nếu con trỏ ptr = NULL thì hàm free không làm gì cả.làm gì cả.

Page 96: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

96Ngôn ngữ lập trình C

3. Bộ nhớ HEAP và cơ chế tạo biến động3. Bộ nhớ HEAP và cơ chế tạo biến động Các biến Các biến động do malloc tạo ra được C xếp vđộng do malloc tạo ra được C xếp vào một ào một

vùng ô nhớ tự do theo kiểu xếp chồng và vùng ô nhớ tự do theo kiểu xếp chồng và được gọi lđược gọi là à HEAP ( bộ nhớ cấp phát HEAP ( bộ nhớ cấp phát động). Ngôn ngữ C quản lý động). Ngôn ngữ C quản lý HEAP thông qua một con trỏ của HEAP lHEAP thông qua một con trỏ của HEAP là HEAPPTR. à HEAPPTR. Nó luôn trỏ vào byte tự do Nó luôn trỏ vào byte tự do đầu tiđầu tiên của vùng ô nhớ còn ên của vùng ô nhớ còn tự do của HEAP. Mỗi lần gọi malloc(), con trỏ của tự do của HEAP. Mỗi lần gọi malloc(), con trỏ của HEAP HEAP được dịch chuyển về phía đỉnh của vđược dịch chuyển về phía đỉnh của vùng ô nhớ tự ùng ô nhớ tự do một số byte tương ứng với kích thước của biến do một số byte tương ứng với kích thước của biến động động mới tạo ra. mới tạo ra.

Ngược lại, mỗi khi giải phóng bộ nhớ biến Ngược lại, mỗi khi giải phóng bộ nhớ biến động, bộ nhớ động, bộ nhớ biến động được thu hồibiến động được thu hồi

Page 97: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

97Ngôn ngữ lập trình C

Page 98: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

98Ngôn ngữ lập trình C

Bài Bài 1010: Kiểu cấu trúc: Kiểu cấu trúc1.1. Kiểu enumKiểu enum Câu lệnh khai báo kiểu enum có thể viết Câu lệnh khai báo kiểu enum có thể viết

theo bốn cáchtheo bốn cáchenum enum tk {pt1,pt2,...} tb1,tb2,...;tk {pt1,pt2,...} tb1,tb2,...;enum enum  tk {pt1,pt2,...}; tk {pt1,pt2,...};enum enum  {pt1,pt2,...} tb1,tb2,...; {pt1,pt2,...} tb1,tb2,...;enum enum  {pt1,pt2,...}; {pt1,pt2,...};

Trong đó :Trong đó : Tk là tên kiểu enum (một kiểu dữ liệu Tk là tên kiểu enum (một kiểu dữ liệu

mới),mới), pt1,pt2,... là tên các phần tử,pt1,pt2,... là tên các phần tử, tb1,tb2,... là tên biến kiểu enum.tb1,tb2,... là tên biến kiểu enum.

Page 99: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

99Ngôn ngữ lập trình C

Ví dụ: khai báo kiểu dữ liệu làm việc với các ngày Ví dụ: khai báo kiểu dữ liệu làm việc với các ngày trong tuần ta có thể dùng kiểu weekday và biến day như trong tuần ta có thể dùng kiểu weekday và biến day như sau:sau:enum enum  weekday{SUNDAY,MONDAY,TUESDAY,WEDSD weekday{SUNDAY,MONDAY,TUESDAY,WEDSDAY,THURSDAY, FRIDAY, SATURDAY} day;AY,THURSDAY, FRIDAY, SATURDAY} day;

Chú ý biến kiểu enum thực chất là biến nguyên, nó Chú ý biến kiểu enum thực chất là biến nguyên, nó được cấp phát 2 byte bộ nhớ và nó có thể nhận một giá được cấp phát 2 byte bộ nhớ và nó có thể nhận một giá trị nguyên bất kỳ.trị nguyên bất kỳ.

Page 100: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

100Ngôn ngữ lập trình C

2. Kiểu cấu trúc2. Kiểu cấu trúc2.1 Định nghĩa2.1 Định nghĩa

Cấu trúc là một kiểu dữ liệu bao gồm nhiều Cấu trúc là một kiểu dữ liệu bao gồm nhiều thành phần có thể thuộc nhiều kiểu dữ liệu thành phần có thể thuộc nhiều kiểu dữ liệu khác nhau. Các thành phần khác nhau. Các thành phần được truy nhập được truy nhập thông qua một tthông qua một tênên

2.2 Cú pháp tổng quát 2.2 Cú pháp tổng quát struct [tên_cấu_trúc] struct [tên_cấu_trúc] {{khai báo các thành phầnkhai báo các thành phần} [danh sách các biến cấu } [danh sách các biến cấu trúc];trúc];

Page 101: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

101Ngôn ngữ lập trình C

trong trong đó: đó: structstruct là từ khóa là từ khóa đứng trước một khai báo cấu đứng trước một khai báo cấu

trúc, trúc, têntên__cấucấu__trúctrúc là một tên hợp lệ là một tên hợp lệ được dđược dùng làm ùng làm

tên cấu trúc;tên cấu trúc; [danh sách các biến cấu trúc] [danh sách các biến cấu trúc] liệt kê các biến liệt kê các biến

có kiểu cấu trúc vừa khai báo có kiểu cấu trúc vừa khai báo VD:VD:

structstruct hoc_sinh { hoc_sinh {char ho_ten[20];char ho_ten[20];float diem;float diem;} hs,} hs, dshs[100];dshs[100];

Page 102: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

102Ngôn ngữ lập trình C

2.3 2.3 Cú pháp định nghĩa kiểu dữ liệu mớiCú pháp định nghĩa kiểu dữ liệu mớiNgôn ngũ C cho phép ta Ngôn ngũ C cho phép ta đặt lại tđặt lại tên kiểu dên kiểu dữữ liệu mới bằng câu lệnh:liệu mới bằng câu lệnh:

typedef kiểu_typedef kiểu_đđã_có tên_kiểu_mới;ã_có tên_kiểu_mới;trong trong đó : đó :

kiểu_kiểu_đđã_có là kiểu dữ liệu mà ta muốn ã_có là kiểu dữ liệu mà ta muốn đổi tđổi tên.ên.

tên_kiểu_mới là tên mới mà ta muốn tên_kiểu_mới là tên mới mà ta muốn đặt.đặt.

Page 103: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

103Ngôn ngữ lập trình C

2.4 Nguyên tắc truy cập đến thành phần của cấu 2.4 Nguyên tắc truy cập đến thành phần của cấu trúctrúc

Các thành phần của cấu trúc Các thành phần của cấu trúc được truy nhập được truy nhập thông qua tthông qua tên biến cấu trúc và tên thành phần. ên biến cấu trúc và tên thành phần. tên_biến_cấu_trúc.tên_thành_phầntên_biến_cấu_trúc.tên_thành_phầnĐể Để truy nhập đến các thtruy nhập đến các thành phần của biến hs ành phần của biến hs chúng ta viết như sau:chúng ta viết như sau:hs.ho_tenhs.ho_tenhs.diemhs.diemChú ý:Không nên sử dụng toán tử & Chú ý:Không nên sử dụng toán tử & đối với các đối với các ththành phần cấu trúc (ành phần cấu trúc (đặc biệt đối với các thđặc biệt đối với các thành ành phần không nguyên) trong khi nhập dữ liệuphần không nguyên) trong khi nhập dữ liệu

Page 104: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

104Ngôn ngữ lập trình C

2.5 Con trỏ cấu trúc2.5 Con trỏ cấu trúcCách khai báo Cách khai báo Một biến cấu trúc cũng là một biến trong bộ nhớMột biến cấu trúc cũng là một biến trong bộ nhớ, có thể , có thể

lấy địa chỉ của một biến cấu trúc bằng toán tử lấy địa chỉ lấy địa chỉ của một biến cấu trúc bằng toán tử lấy địa chỉ &. Giá trị trả lại l&. Giá trị trả lại là à địa chỉ đến trường đầu của cấu trúc.địa chỉ đến trường đầu của cấu trúc.

Có thể khai báo một biến con trỏ chỉ Có thể khai báo một biến con trỏ chỉ đến một cấu trúc để đến một cấu trúc để có thể lưu địa chỉ của một biến cấu trúc ncó thể lưu địa chỉ của một biến cấu trúc nào ào đó. Cú pháp đó. Cú pháp khai báo một biến con trỏ cấu trúc như sau:khai báo một biến con trỏ cấu trúc như sau:

struct tên_cấu_trúc *tên_con_trỏ;struct tên_cấu_trúc *tên_con_trỏ;VD: struct hoc_sinh *ptrhs;VD: struct hoc_sinh *ptrhs;

Việc truy xuất Việc truy xuất đến một thđến một thành phần của cấu trúc thông ành phần của cấu trúc thông qua một con trỏ qua một con trỏ được thực hiện bằng phép toán kép ->được thực hiện bằng phép toán kép ->

Page 105: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

105Ngôn ngữ lập trình C

VD:VD:printf("\nHo va ten hoc sinh %s",ptrhs->ho_ten);printf("\nHo va ten hoc sinh %s",ptrhs->ho_ten);printf("\nDiem %6.3f",ptrhs->diem);printf("\nDiem %6.3f",ptrhs->diem);

kết quả thực hiện hai câu lệnh này tương kết quả thực hiện hai câu lệnh này tương đương với hai đương với hai câu lệnh sau:câu lệnh sau:

printf("\nHo va ten hoc sinh %s",hs.ho_ten);printf("\nHo va ten hoc sinh %s",hs.ho_ten);printf("\nDiem %6.3f",hs.diem);printf("\nDiem %6.3f",hs.diem); Việc sử dụng con trỏ chỉ Việc sử dụng con trỏ chỉ đến cấu trúc thường được sử đến cấu trúc thường được sử

dụng để truyền cấu trúc đến cho một hdụng để truyền cấu trúc đến cho một hàmàm Một ứng dụng khác của con trỏ cấu trúc là dùng để xây Một ứng dụng khác của con trỏ cấu trúc là dùng để xây

dựng các cấu trúc tự trỏ như: danh sách liên kết (còn gọi dựng các cấu trúc tự trỏ như: danh sách liên kết (còn gọi là danh sách móc nối).là danh sách móc nối).

Page 106: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

106Ngôn ngữ lập trình C

2.6 Mảng có cấu trúc2.6 Mảng có cấu trúcMảng mà gồm các thành phần có kiểu cấu Mảng mà gồm các thành phần có kiểu cấu trúc trúc được gọi lđược gọi là mảng cấu trúc. Khai báo một à mảng cấu trúc. Khai báo một mảng các cấu trúc hoàn toàn tương tự như mảng các cấu trúc hoàn toàn tương tự như đối đối với khai báo một mảng bvới khai báo một mảng bình thường, chỉ có ình thường, chỉ có một một điểm khác lđiểm khác là thay cho tên các kiểu dữ liệu à thay cho tên các kiểu dữ liệu bình thường là một tên kiểu dữ liệu cấu trúc. bình thường là một tên kiểu dữ liệu cấu trúc. Ví dụ về khai báo một mảng có cấu trúc: Ví dụ về khai báo một mảng có cấu trúc: struct hoc_sinh dshs[100]; //hoc_sinh là kiểu struct hoc_sinh dshs[100]; //hoc_sinh là kiểu cấu trúc cấu trúc Việc sử dụng các mảng cấu trúc sẽ làm cho Việc sử dụng các mảng cấu trúc sẽ làm cho việc xử lý một tập hợp các biến cấu trúc trở việc xử lý một tập hợp các biến cấu trúc trở nên dễ nhìn hơn. Các quy nên dễ nhìn hơn. Các quy định về mảng cũng định về mảng cũng được áp dụng đối với mảng các cấu trúc. được áp dụng đối với mảng các cấu trúc.

Page 107: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

107Ngôn ngữ lập trình C

3. Cấu trúc tự trỏ3. Cấu trúc tự trỏCấu trúc có ít nhất một thành phần là con trỏ Cấu trúc có ít nhất một thành phần là con trỏ chỉ chỉ đến bản thân cấu trúc được gọi lđến bản thân cấu trúc được gọi là cấu trúc à cấu trúc tự trỏ.tự trỏ.

Ví dụ Ví dụ structstruct h_sinh{ h_sinh{char ho_ten[20];char ho_ten[20];float diem;float diem;}}struct h_sinh *next ;/*con trỏ chỉ struct h_sinh *next ;/*con trỏ chỉ đến học sinh đến học sinh tiếp theo trong danh sách*/tiếp theo trong danh sách*/khai báo này khai báo này định nđịnh nghĩa một cấu trúc tự trỏ có ghĩa một cấu trúc tự trỏ có thể dùng thể dùng để quản lý danh sách họ tđể quản lý danh sách họ tên học sinh ên học sinh và và điểm số học sinh. Danh sách này chỉ truy điểm số học sinh. Danh sách này chỉ truy cập được theo một chiềucập được theo một chiều

Page 108: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

108Ngôn ngữ lập trình C

3.1 Danh sách liên kết: danh sách liên kết 3.1 Danh sách liên kết: danh sách liên kết gồm các phần tử, mỗi phần tử có hai vùng gồm các phần tử, mỗi phần tử có hai vùng chính: vùng dữ liệu danh sách và vùng liên chính: vùng dữ liệu danh sách và vùng liên kết. Vùng liên kết là một hoặc nhiều con kết. Vùng liên kết là một hoặc nhiều con trỏ chỉ trỏ chỉ đến các phần tử trước hoặc sau đến các phần tử trước hoặc sau phần tử đang được xem xét tphần tử đang được xem xét tùy thuộc vào ùy thuộc vào yêu cầu của công việc cụ thểyêu cầu của công việc cụ thểCú pháp chung cho khai báo danh sách Cú pháp chung cho khai báo danh sách liên kết sử dụng kiểu dữ liệu con trỏ như liên kết sử dụng kiểu dữ liệu con trỏ như sau:sau:typedef struct kiểu_dữ_liệu{typedef struct kiểu_dữ_liệu{<khai báo phần dữ liệu><khai báo phần dữ liệu><khai báo các con trỏ liên kết><khai báo các con trỏ liên kết>}t_kiểu_dữ_liệu}t_kiểu_dữ_liệu

Page 109: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

109Ngôn ngữ lập trình C

Bài Bài 1111: Kiểu tập tin(File): Kiểu tập tin(File) File là loại dữ liệu có thể ghi lên đĩa để dùng File là loại dữ liệu có thể ghi lên đĩa để dùng

nhiều lần.Trong C chỉ có một loại File, nhưng cấu nhiều lần.Trong C chỉ có một loại File, nhưng cấu trúc của mỗi File có thể khác nhau. Cấu trúc này trúc của mỗi File có thể khác nhau. Cấu trúc này được hình thành khi ta ghi dữ liệu lên File, nó phụ được hình thành khi ta ghi dữ liệu lên File, nó phụ thuộc vào hàm mà ta dùng để ghi dữ liệu lên đĩa.thuộc vào hàm mà ta dùng để ghi dữ liệu lên đĩa.

Trong C có hai loại hàm thao tác trên file: Trong C có hai loại hàm thao tác trên file: Dùng những hàm cấp thấp làm việc với tập tin Dùng những hàm cấp thấp làm việc với tập tin

thông qua một số hiệu tập tin (file handle).thông qua một số hiệu tập tin (file handle). Dùng những hàm được xây dựng từ những hàm Dùng những hàm được xây dựng từ những hàm

cấp thấp, dễ sử dụng hơn. Có các hàm phục vụ cấp thấp, dễ sử dụng hơn. Có các hàm phục vụ cho việc đọc ghi trên từng loại dữ liệu (số, chuỗi, cho việc đọc ghi trên từng loại dữ liệu (số, chuỗi, ký tự, cấu trúc...). Các hàm này làm việc với tập ký tự, cấu trúc...). Các hàm này làm việc với tập tin thông qua một con trỏ tập tin. Con trỏ này tin thông qua một con trỏ tập tin. Con trỏ này được xác định khi ta mở tập tin.được xác định khi ta mở tập tin.

Page 110: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

110Ngôn ngữ lập trình C

1.1. Các kiểu xuất nhập dữ liệu trong tập tinCác kiểu xuất nhập dữ liệu trong tập tin1.11.1 Xuất nhập kiểu nhị phânXuất nhập kiểu nhị phân

Dữ liệu ghi lên tập tin không bị thay đổi và Dữ liệu ghi lên tập tin không bị thay đổi và khi đóng tập tin thì mã kết thúc tập tin sẽ khi đóng tập tin thì mã kết thúc tập tin sẽ được ghi lên đĩa là -1.được ghi lên đĩa là -1.

1.21.2 Xuất nhXuất nhậpập kiểu văn bản kiểu văn bản Chỉ khác kiểu nhập xuất nhị phân khi xử lý Chỉ khác kiểu nhập xuất nhị phân khi xử lý

ký tự xuống dòng và khi ta đóng tập tin thì ký tự xuống dòng và khi ta đóng tập tin thì mã kết thúc tập tin sẽ được ghi lên đĩa là 26. mã kết thúc tập tin sẽ được ghi lên đĩa là 26.

Khi ghi một ký tự chuyển dòng lên đĩa (mã Khi ghi một ký tự chuyển dòng lên đĩa (mã 10) sẽ ghi thành 2 ký tự mã 13 và mã 10. 10) sẽ ghi thành 2 ký tự mã 13 và mã 10.

Khi đọc nếu gặp hai ký tự liên tiếp là mã 10 Khi đọc nếu gặp hai ký tự liên tiếp là mã 10 và mã 13 sẽ gom lại thành một ký tự là mã và mã 13 sẽ gom lại thành một ký tự là mã 10.10.

Page 111: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

111Ngôn ngữ lập trình C

Chú ý:Chú ý: Tập tin khi ghi lên đĩa dưới dạng nào thì Tập tin khi ghi lên đĩa dưới dạng nào thì

phải đọc dưới dạng đó. Nếu không việc xử lý phải đọc dưới dạng đó. Nếu không việc xử lý sẽ không chính xác. sẽ không chính xác.

Trong C có hàm dùng để nhập xuất cho cả Trong C có hàm dùng để nhập xuất cho cả hai kiểu, có hàm chỉ dùng để nhập xuất cho hai kiểu, có hàm chỉ dùng để nhập xuất cho một kiểu nào đó.một kiểu nào đó.

2.2.Các hàm thao tác trên tập tinCác hàm thao tác trên tập tin Các hàm sau đây dùng chung cho cả hai Các hàm sau đây dùng chung cho cả hai

kiểu nhị phân và văn bản.kiểu nhị phân và văn bản.2.1 Mở file2.1 Mở file

FILE *fopen(const char FILE *fopen(const char *tên_tập_tin,const char *kiểu);*tên_tập_tin,const char *kiểu);

Page 112: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

112Ngôn ngữ lập trình C

Mở một tập tin. Nếu thành công trả về kết Mở một tập tin. Nếu thành công trả về kết quả là con trỏ FILE tương ứng với file vừa quả là con trỏ FILE tương ứng với file vừa mở, ngược lại trả về giá trị NULL.Sau khi mở mở, ngược lại trả về giá trị NULL.Sau khi mở file phải kiểm tra xem thao tác mở tập tin file phải kiểm tra xem thao tác mở tập tin thành công hay không.thành công hay không.

* tên tập tin: * tên tập tin: Là một hằng chuỗi, hoặc một Là một hằng chuỗi, hoặc một con trỏ chỉ đến vùng nhớ chứa tên tập tin.con trỏ chỉ đến vùng nhớ chứa tên tập tin.

* kiểu: * kiểu: là hằng chuỗi cho biết kiểu truy là hằng chuỗi cho biết kiểu truy nhập:nhập:

Page 113: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

113Ngôn ngữ lập trình C

2.2 Đóng file2.2 Đóng fileint fclose(FILE *f)int fclose(FILE *f)

Ðóng tập tin được chỉ đến bởi con trỏ f. Nếu Ðóng tập tin được chỉ đến bởi con trỏ f. Nếu thành công thì giá trị của hàm = 0 ngược lại có thành công thì giá trị của hàm = 0 ngược lại có giá trị EOF. Sau khi đóng con trỏ f sẽ không giá trị EOF. Sau khi đóng con trỏ f sẽ không còn trỏ đến file trước đó nữacòn trỏ đến file trước đó nữa

2.3 Làm sạch vùng đệm2.3 Làm sạch vùng đệmint fflush(FILE *f)int fflush(FILE *f)

Làm sạch vùng đệm của tập tin được chỉ đến Làm sạch vùng đệm của tập tin được chỉ đến bởi con trỏ f. Nếu thành công cho giá trị 0, bởi con trỏ f. Nếu thành công cho giá trị 0, ngược lại cho giá trị EOF.ngược lại cho giá trị EOF.

int flushalll(void)int flushalll(void) Làm sạch vùng đệm của tất cả các tập tin đang Làm sạch vùng đệm của tất cả các tập tin đang

mở. Nếu thành công giá trị của hàm bằng số mở. Nếu thành công giá trị của hàm bằng số tập tin đang mở, ngược lại cho giá trị EOFtập tin đang mở, ngược lại cho giá trị EOF

Page 114: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

114Ngôn ngữ lập trình C

2.4 Xoá tập tin2.4 Xoá tập tin int unlink(const char *tên_tập_tin)int unlink(const char *tên_tập_tin)

Xóa một tập tin trên đĩa. Nếu thành công giá Xóa một tập tin trên đĩa. Nếu thành công giá trị của hàm bằng 0 , ngược lại cho giá trị EOFtrị của hàm bằng 0 , ngược lại cho giá trị EOF

2.5 Đổi tên tập tin2.5 Đổi tên tập tin int rename(const char *tên_cũ,const char int rename(const char *tên_cũ,const char

*tên_mới)*tên_mới) Ðổi một tập tin trên đĩa. Nếu thành công giá Ðổi một tập tin trên đĩa. Nếu thành công giá

trị của hàm bằng 0 , ngược lại cho giá trị EOFtrị của hàm bằng 0 , ngược lại cho giá trị EOF2.6 Kiểm tra kết thúc tập tin2.6 Kiểm tra kết thúc tập tin

int feof(FILE *f) int feof(FILE *f) Cho giá trị khác không nếu ở cuối tập tin, Cho giá trị khác không nếu ở cuối tập tin,

ngược lại =0ngược lại =0

Page 115: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

115Ngôn ngữ lập trình C

3. Xuất nhập dữ liệu cho file3. Xuất nhập dữ liệu cho file3.1 Nhập xuất ký tự : (file kiểu nhị phân và văn bản)3.1 Nhập xuất ký tự : (file kiểu nhị phân và văn bản) Ghi ký tự lên tập tin:Ghi ký tự lên tập tin:

int putc(int ch, FILE *f)int putc(int ch, FILE *f)int fputc(int ch, FILE *f)int fputc(int ch, FILE *f)Ghi lên file f ký tự có mã = ch % 256 Nếu thành Ghi lên file f ký tự có mã = ch % 256 Nếu thành công kết quả = mã của ký tự đã ghi, ngược lại công kết quả = mã của ký tự đã ghi, ngược lại =EOF (-1)=EOF (-1)Trong trường hợp ghi theo văn bản thì khi gặp mã Trong trường hợp ghi theo văn bản thì khi gặp mã 10 sẽ ghi thành 13 và 1010 sẽ ghi thành 13 và 10

Ðọc ký tự từ tập tin:Ðọc ký tự từ tập tin:int getc( FILE *f)int getc( FILE *f)int fgetc( FILE *f)int fgetc( FILE *f)Ðọc một ký tự từ file f . Nếu thành công kết quả = Ðọc một ký tự từ file f . Nếu thành công kết quả = mã của ký tự đọc được, ngược lại = -1mã của ký tự đọc được, ngược lại = -1

Page 116: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

116Ngôn ngữ lập trình C

3.2 Nhập xuất chuỗi: (Dùng cho kiểu văn bản) 3.2 Nhập xuất chuỗi: (Dùng cho kiểu văn bản) Ghi một chuỗi:Ghi một chuỗi:

int fputs(const char *s, FILE *f)int fputs(const char *s, FILE *f)Ghi một chuỗi được chỉ tới bới con trỏ s vào file f.Ghi một chuỗi được chỉ tới bới con trỏ s vào file f.Kết quả = ký tự cuối được ghi nếu thành công, Kết quả = ký tự cuối được ghi nếu thành công, ngược lại =EOFngược lại =EOF

Ðọc một chuỗi:Ðọc một chuỗi:char *fgets(const char *s, int n, FILE *f)char *fgets(const char *s, int n, FILE *f)Ðọc một chuỗi từ File f và đưa vào vùng nhớ do s Ðọc một chuỗi từ File f và đưa vào vùng nhớ do s trỏ đến.trỏ đến.Việc đọc kết thúc khi đã đọc được n-1 ký tự , Việc đọc kết thúc khi đã đọc được n-1 ký tự , hoặc gặp ký tự xuống dòng , hoặc gặp ký tự kết hoặc gặp ký tự xuống dòng , hoặc gặp ký tự kết thúc File.thúc File.Nếu việc đọc có lỗi kết quả của hàm =NULL.Nếu việc đọc có lỗi kết quả của hàm =NULL.

Page 117: TIN HỌC ĐẠI CƯƠNG A2 NGÔN NGỮ LẬP TRÌNH C

117Ngôn ngữ lập trình C

3.3 Ðọc ghi dữ liệu theo khuôn dạng: (Dùng 3.3 Ðọc ghi dữ liệu theo khuôn dạng: (Dùng cho kiểu văn bản) cho kiểu văn bản)

Ghi dữ liệu theo khuôn dạng:Ghi dữ liệu theo khuôn dạng:int fprintf(FILE *f , const char *đặc tả,....)int fprintf(FILE *f , const char *đặc tả,....)... là danh sách các đối số tương ứng với các đặc ... là danh sách các đối số tương ứng với các đặc tả.tả.Sử dụng giống như hàm printf, dữ liệu sẽ được Sử dụng giống như hàm printf, dữ liệu sẽ được ghi lên file.ghi lên file.

Ðọc dữ liệu theo khuôn dạng:Ðọc dữ liệu theo khuôn dạng:fscanf(FILE *f , const char *đặc tả,....)fscanf(FILE *f , const char *đặc tả,....)... là danh sách các đối số tương ứng với các đặc ... là danh sách các đối số tương ứng với các đặc tả.tả.Sử dụng giống như hàm scanf, dữ liệu sẽ được Sử dụng giống như hàm scanf, dữ liệu sẽ được đọc từ File f rồi đưa vào các đối số tương ứng.đọc từ File f rồi đưa vào các đối số tương ứng.