Tài liệu Đề cương bài giảng: Ngôn ngữ lập trình C:  1 
Bài 1: Ngôn ngữ lập trình C 
I. Các khái niệm cơ bản 
1. Bảng ký tự sử dụng trong C 
Bảng ký tự được sử dụng trong ngôn ngữ lập trình C bao gồm 
- Nhóm các chữ cái: chữ in hoa A,B,C,Z và chữ in thường a,b,c,,z 
- Nhóm các chữ số: 0,1,2,3,,9 
- Nhóm các dấu: +,-,*,/,,& 
Chú ý: ngôn ngữ C phân biệt chữ hoa và chữ thường do đó chúng ta phải 
thận trọng khi sử dụng các chữ cái hoa và thường. 
2. Tên và từ khoá 
Tên là một dãy các chữ cái, chữ số và dấu gạch nối. tên phải bắt đầu 
bằng chữ cái hoặc dấu gạch nối. 
Ví dụ: 
 Tên đúng: baitap1,vidu1, 
 Tên sai: ha noi, viet%nam 
Tên có thể do ngôn ngữ C sinh ra để nhằm hai mục đích: thứ nhất là 
định danh các thành phần có sẵn, thứ hai viết các lệnh trong chương trình. 
 Tên chuẩn là những tên do ngôn ngữ lập trình C đặt ra để định danh các 
thành phần. 
Ví dụ: scanf,printf,getch() 
Từ khoá (key word) là các tên do ngôn ngữ lập trình sinh ra để viết các 
lệnh, để định danh các thành phần đặc biệt. 
Ví dụ: for,while, i...
                
              
                                            
                                
            
 
            
                 57 trang
57 trang | 
Chia sẻ: honghanh66 | Lượt xem: 1300 | Lượt tải: 0 
              
            Bạn đang xem trước 20 trang mẫu tài liệu Đề cương bài giảng: Ngôn ngữ lập trình C, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
 1 
Bài 1: Ngôn ngữ lập trình C 
I. Các khái niệm cơ bản 
1. Bảng ký tự sử dụng trong C 
Bảng ký tự được sử dụng trong ngôn ngữ lập trình C bao gồm 
- Nhóm các chữ cái: chữ in hoa A,B,C,Z và chữ in thường a,b,c,,z 
- Nhóm các chữ số: 0,1,2,3,,9 
- Nhóm các dấu: +,-,*,/,,& 
Chú ý: ngôn ngữ C phân biệt chữ hoa và chữ thường do đó chúng ta phải 
thận trọng khi sử dụng các chữ cái hoa và thường. 
2. Tên và từ khoá 
Tên là một dãy các chữ cái, chữ số và dấu gạch nối. tên phải bắt đầu 
bằng chữ cái hoặc dấu gạch nối. 
Ví dụ: 
 Tên đúng: baitap1,vidu1, 
 Tên sai: ha noi, viet%nam 
Tên có thể do ngôn ngữ C sinh ra để nhằm hai mục đích: thứ nhất là 
định danh các thành phần có sẵn, thứ hai viết các lệnh trong chương trình. 
 Tên chuẩn là những tên do ngôn ngữ lập trình C đặt ra để định danh các 
thành phần. 
Ví dụ: scanf,printf,getch() 
Từ khoá (key word) là các tên do ngôn ngữ lập trình sinh ra để viết các 
lệnh, để định danh các thành phần đặc biệt. 
Ví dụ: for,while, if, int, float 
Chú ý: tên do chúng ta đặt ra không được phép trùng với từ khoá, không 
nên trùng với các tên chuẩn. 
3. Các kiểu dữ liệu 
Tên kiểu Miền giá trị độ lớn 
char một trong 256 ký tự thuộc 
bản mã ASCII 
1 byte 
int -32.768 đến 32.767 2 byte 
float -3.4.E.38 đến 3.4.E38 4 byte 
4. Khái niệm về hằng và biến nhớ 
 2 
a, Hằng 
Hằng(const) là một đại lượng không thay đổi giá trị trong toàn 
chương trình. 
Hằng có thể là số nguyên, số thực, ký tự hoặc chuỗi ký tự. để biểu 
diễn các giá trị hằng ta viết như sau: 
Đối với số nguyên : viết bình thường như trong toán học 
Ví dụ: 100,150,350 
Đối với số thực dùng dấu chấm để ngăn cách phần nguyên và phần 
thập phân, 
Ví dụ: 1.5, 2.3 
Đối với kí tự: viết các ký tự vào trong hai nháy kép 
Ví dụ: “ngay 20 tháng 12 nam 2009” 
b, Biến nhớ 
Là một đại lượng có thể thay đổi trong chương trình, biến nhớ được 
sử dụng để lưu dữ liệu của chương trình, do vậy nó rất quan trọng trong 
lập trình, nếu không có biến nhớ thì chúng ta không thể lập trình được 
bởi vì không có chỗ chứa dữ liệu cho việc tính toán và sử lý. 
5. Các phép toán 
 Các phép toán trong C gọi là các toán tử (operator), bao gồm: 
a. Các phép toán số học 
- Ký hiệu: +, -,*, /,% 
- Ý nghĩa: cộng ,trừ, nhân, chia, chia dư 
- Dữ liệu tác động: kiểu số nguyên hoặc số thực 
- Kết quả: các phép toán số học cho kết quả là dữ liệu kiểu số 
Ví dụ: 
 2+5, 5*6, 3/2 
Chú ý: đối với phép chia(/) nếu hai vế dữ liệu là số nguyên thì máy 
sẽ chia lấy phần nguyên, nếu một trong hai vế là số thực thì máy cho 
kết quả chính xác. 
Ví dụ: 
 7/4 sẽ cho kết quả là 1(là phần nguyên của 7 chia 4) 
 7.0/4 hoặc 7/4.0 sẽ cho kết quả là 1.75 
 7%4 sẽ cho kết quả là 3(là phân dư của 7 chia 4) 
b. Các phép toán quan hệ 
 3 
- Ký hiệu: >, =, <=, ==, != 
- Ý nghĩa : lớn hơn, nhỏ hơn, lớn hơn hoặc bằng, nhơ hơn hoặc 
bằng, so sánh bằng, và khác 
- Dữ liệu tác động: là các dữ liệu kiểu số và chữ, nếu là chữ thì máy 
sẽ so sánh mã ASCII của các chữ đo. 
- Kết quả: phép toán cho kết quả là loogic(đúng hoặc sai) 
c. Các phép kết nối logic 
- Ký hiệu: &&, ||, ! 
- Ý nghĩa và, hoặc, phủ định 
- Kiểu dữ liệu tác động: là các dữ liệu có giá trị đúng hoặc sai(kiểu 
logic) 
- Kết quả: cho kết quả logic(đúng hoặc sai) 
Bảng kết quả: 
E1 E2 E1&&E2 E1|| E2 !E1 
Đúng Đúng Đúng Đúng Sai 
Đúng Sai Sai Đúng Sai 
Sai Đúng Sai Đúng Đúng 
Sai Sai Sai Sai Đúng 
d. Phép gán 
Phép gán thực hiện tính toán và chuyển dữ liệu vào biến nhớ 
trong chương trình, cách thức như sau: 
 Vế_trái = vế_phải; 
Máy sẽ thực hiện tính toán vế phải và đưa kết quả vào vế trái do 
đó vế trái luôn luôn là một biến nhớ. 
Ví dụ : a =1; 
 b =1+6; 
 6 Dòng chú thích (Comment) 
Những chú thích thường được viết để mô tả công việc của một 
lệnh đặc biệt, một hàm hay toàn bộ chương trình. Trình biên dịch sẽ 
không dịch chúng. Trong C, chú thích bắt đầu bằng ký hiệu /* và kết 
thúc bằng */. Trong trường hợp chú thích chỉ trên một dòng ta có thể 
dùng //. 
II. Biểu thức, câu lệnh, khối lệnh và chương trình 
 4 
Biểu thức là sự kết hợp giữa các toán tử(phép toán ) và các dữ liệu để 
thực hiện tính toán, khi máy thực hiện tính biểu thức sẽ tuân theo thứ tự ưu 
tiên của phép toán cũng giống như toán học. 
Ví dụ: (8+3*(2-4))/2 máy sẽ thực hiện phép trù trước, rồi đến 
phép nhân,cộng, chia và kết quả là 1. 
Để yêu cầu máy thực hiện các thao tác chúng ta phải viết ra các lệnh 
tương ứng, bằng cách sử dụng các tên chuẩn và từ khóa kết hợp với viết 
biểu thức. Kết thúc mỗi câu lệnh phải có dấu chấm phẩy(;) 
Một câu lệnh được viết trên một dòng, và trên một dòng có thể viết được 
nhiều câu lệnh. 
Thồng thường một câu lệnh chưa đủ để thực hiện một chức năng hay 
một thao tác nào đó được yêu cầu, do vậy chúng ta phải viết thành nhiều 
câu lệnh và tạo thành một khối lệnh. Khối lệnh phải được viết vào trong 
cặp dấu ngoặc nhọn { } 
Ví dụ: 
 { 
 a = 5*4-2; b=2/3+5; 
 printf (“%d”,a+b); 
} 
III. Cấu trúc các thành phần một trương trình C 
a. Nạp thư viện 
b. Định nghĩa các hằng 
c. Khai báo các kiểu dữ liệu mới 
d. Khai báo các chương trình con 
e. Khai bào các biến nhớ toàn cục 
f. Viết chương trình chính 
g. Viết các chương trình con 
 Trong đó 
- Phần a dùng để lạp các thư viện cần sử dụng cho chương trình được 
viết như sau: 
#include 
Ví dụ: include 
- Phần b dùng để định nghĩa các giá trị hằng cách viết như sau 
#define tên hằng giá_trị_cần đặt_cho_hằng 
 Ví dụ: #define myname “abc” 
- Phần c khai báo biến nhớ trong chương trình thường được thực hiện ở 
phần đầu trong chương trình(hàm main), tuy nhiên trong môi trường 
TC3.0 có thể thực hiện bất cứ chỗ nào nhưng phải trước khi sử dụng 
chúng. 
 5 
Cú pháp: tên_kiểu_dữ_liệu tên_biến_nhớ; 
Ví dụ: int a; 
 float b; 
 int a,b,c; 
 float a=2.5,b=3; 
- Phần f viết trương trình chính, mỗi một chương trình có duy nhất một 
chương trình chính và nó sẽ điều khiển toàn bộ các hoạt động của 
chương trình. Chương trình chính được viết như sau: 
Void main() 
 { 
Các câu lệnh 
} 
Cấu trúc một chương trình C đơn giản 
 #include 
 #include 
 Void main() 
 { 
 Khai báo biến nhớ 
 Các câu lệnh 
} 
IV. Cách thực hiện một chương trình trên máy 
Khi thực hiện chương trình thì máy tình sẽ thực hiện các câu lệnh trong 
chương trình chính. Quá trình thực hiện sẽ tuần tự từ trên xuống dưới và từ 
trái sang phải. 
Ví dụ ta có chương trình sau 
#include 
#include 
void main() 
{ 
 A1; 
 A2; B1; 
 B2; C1; A3; 
} 
Thì máy sẽ thực hiện các câu lệnh theo tuần tự sau: A1,A2,B1,B2,C1,A3 
V. Môi trường lập trình TurboC 
1 . Giới thiệu TurboC và khởi động 
 6 
Sau khi cài đặt song ta có thư mục TC hoặc TC30 trong thư mục này có 
các thư mục con sau. 
 Để khởi động chương trình này chúng ta chạy tệp tin TC.EXE trong 
thư mục Bin của TurboC 
Màn hình giao diện của TurboC có dạng sau: 
2, Các thao tác lập trình trên TurboC 
 TC 
BIN 
INCLUDE 
 LIB 
Chứa các tệp tin chính của chýõng trình trong đó có 
tệp TC.EXE 
Chứa các tệp tin khai báo thý viện ( *.h) 
Chứa các tệp tin mã lệnh của các thý viện (*.LIB) 
 7 
Tên phím Ý nghĩa 
Alt + F Tạo một tệp chương trình mới 
F2 Ghi lại chương trình lên tệp trên đĩa 
F3 Mở một tệp chương trình đã lưu trên đĩa 
Alt + X Thoát khỏi chương trình TC 
Shift + các phím mũi 
tên 
Đánh dấu khối lệnh 
Ctrl + insert Chép khối đang đánh dấu vào máy 
Shift + insert Dán khối đã chép ở trong máy vào cị trí con trỏ trên màn 
hình 
Shift + Delete Cắt khối đang đánh dấu và đưa vào máy 
F9 Dịch và kiểm tra lỗi chương trình 
Ctrl + F9 Thực hiện chương trình 
Alt + Backspace Hủy thao tác vừa thực hiện 
F5 Phóng to hoặc thu nhỏ cửa sổ đang mở 
F6 Chuyển đổi giữa các cửa sổ đang mở 
Alt + F5 Hiển thị màn hình kết quả chương trình vừa chạy lần cuối 
cùng 
Alt + 0 Hiển thị tất cả các cửa sổ đang mở lên màn hình 
Một số thông báo lỗi hay gặp khi lập trình bằng TC 
Thông báo tiếng Anh Ý nghĩa tiếng Việt 
Undefined symbol ‘’ Chưa khai báo tên trong nháy 
Unable to open include file ’’ Không mở được tệp thư viện(có thể viết 
sai tên thư viện hoặc đường dẫn đến thư 
viện chưa đúng) 
Undefined symbol_main in modul 
c0.asm 
Chưa viết chương trình chính hoặc viết tên 
chương trình chính bị sai 
Compound statement missing } Thiếu dấu đóng ngoặc của khối lệnh 
Unexpected Thừa dấu đóng ngoặc của khối lệnh 
Unterminated string or character Chưa có dấu nháy kép kết thúc viết hằng 
 8 
constant chuỗi kí tự 
Statement missing ; Thiếu dấu chấm phẩy kết thúc câu lệnh 
Function call missing ) Thiếu đóng ngoặc khi viết lệnh 
If statement mising ( Lệnh if thiếu dấu mở ngoặc 
 9 
Bài 2: CẤU TRÚC LỆNH ĐIỀU KHIỂN 
I. Các lệnh đơn giản 
1. Lệnh hiện dữ liệu lên màn hình 
- Cú pháp: 
printf(“điều khiển”,các dữ liệu cần hiện); 
 Trong đó: 
- Điều khiển : Là các cặp kí tự điều khiển để hiện dữ liệu lên màn hình và 
phải được viết trong cặp dấu nháy kép, mỗi cặp kí tự điều khiển bao gồm 
dấu “%” và sau đó là một ký tự định kiểu. 
Cách viết Ý nghĩa 
%d Hiện số nguyên 
%c Hiện ký tự trong bảng mã 
ASCII 
%f Hiện số thực 
%s Hiện chuỗi ký tự 
- Dữ liệu cần hiện: Là các biểu thức dữ liệu cần hiện ra màn hình,các biểu 
thức này cách nhau bởi dấu phẩy. 
 Để sử dụng được lệnh hiện dữ liệu lên màn hình ta phải nạp thư viện 
Ví dụ: 
 printf(“%d”,65); 
thì kết quả hiện ra màn hình sẽ là: 65 
 printf (“%c”,65); 
thì máy sẽ hiện ra ký tự có mã là 65 và đó là: chữ A 
Chú ý: 
- Để hiện dữ liệu có xuống dòng trên màn hình ta sử dụng \n trong điều 
khiển của lệnh printf 
 Ví dụ 
 printf(“yen bai \n ngày %d”,12); 
màn hình sẽ hiện ra như sau: 
yen bai 
ngay 12 
- Để cách một khoảng trên màn hình như bấm phím Tab ta sử dụng \t trong 
điều khiển của lệnh printf. 
 10
Vidu: printf(“yen bai \n\t ngay %d”,12); 
Màn hình sẽ hiện ra như sau: 
Yen bai 
 ngay 12 
2. Lệnh nhập dữ liệu từ bàn phím 
Cú pháp : 
scanf(“điều khiển”,& tên biến nhớ); 
Trong đó 
 - điều khiển : Để quy định dữ liệu nhập vào dưới dạng nào, cách viết 
như điều khiển trong lệnh printf . 
- Tên biến nhớ: Dùng để lưu trữ dữ liệu nhập vào từ bàn phím, phải có 
dấu & ở trước. 
Để sử dụng được lệnh nhập dữ liệu từ bàn phím ta phải nạp thư viện 
. 
Ví dụ: 
scanf(“%d”,&a); 
Nhập một số nguyên từ bàn phím vào cho biến nhớ a. 
Chú ý: 
- Có thể nhập nhiều dữ liệu vào nhiều biến trong một lệnh scanf.Ta phải 
điền vào các điều khiển nhập cùng với các biến nhớ tương ứng cách nhau 
bởi dấu phẩy. 
Ví dụ: scanf(“%d%f”,&a,&b); 
Sẽ nhập số nguyên vào biến nhớ a, số thực vào biến nhớ b 
- Có thể quy định độ rộng dữ liệu khi nhập, phải viết độ rộng đó vào 
giữa dấu % và kí tự định kiểu tương ứng. Nếu gõ thừa máy sẽ tự 
động cắt bỏ. 
Ví dụ: 
 scanf(“%2d%5f”,&a,&b); 
nhập một số nguyên vào biến nhớ a tối đa là 2 chữ số, nhập số thực 
vào biến nhớ b, với độ rộng tối đa là 5 chữ số. 
Bài tậpvận dụng: 
Bài 2.1 
Viết chương trình nhập vào từ bàn phím 2 số nguyên. Tính tổng 
hai số đó, hiện kết quả ra màn hình. 
 #include 
 #include 
 Void main() 
 { 
 11
 int a,b; 
 clrscr(); 
 printf(“nhap so a =”); 
 scanf(“%d”,&a); 
printf(“nhap so b =”); 
 scanf(“%d”,&b); 
 printf(“tong hai so %d va %d la: %d”,a,b,a+b); 
 getch(); 
} 
 Bài 2.2 
Viết chương trình nhập vào từ bàn phím 5 số nguyên. Hiện 5 số 
vừa hập ra màn hình và trung bình cộng 5 số đó. 
 #include 
#include 
void main() 
{ 
 int a1,a2,a3,a4,a5; 
 clrscr(); 
 printf("nhap so thu nhat a1= ");scanf("%d",&a1); 
 printf("\nnhap so thu hai a2= ");scanf("%d",&a2); 
 printf("\nnhap so thu 3 a3= ");scanf("%d",&a3); 
 printf("\nnhap so thu 4 a4= ");scanf("%d",&a4); 
 printf("\nnhap so thu 5 a5= ");scanf("%d",&a5); 
 printf("5 so vua nhap la: %d\t%d\t%d\t%d\t%d\t",a1,a2,a3,a4,a5); 
 printf("\ntrung binh cong 5 so vua nhap la:%f",(a1+a2+a3+a4+a5)/5.0); 
 getch() ; 
} 
2. Các lệnh toán học 
Các lệnh toán học cung cấp bởi thư viện do vậy phải khai 
báo nạp thư viện ở đầu chương trình. 
Tên lệnh Ý nghĩa 
sin(E); Tính sin của E 
cos(E); Tính cos của E 
pow(E1,E2); Tính lũy thừa E2 của E1 
sqrt(E); Tính căn bậc hai của E 
abs(E); Tính trị tuyệt đối của E nguyên 
fabs(E); Tính trị tuyệt đối của E thực 
 12
 E là một biểu thức hay giá trị. 
Ví dụ 1: 
 printf(“hay nhap vao mot so nguyen”); 
 scanf(“%d”,&a); 
 printf(“can bac hai cua %d la:%f”,a,sqrt(a)); 
Ví dụ 2: 
Nhập x từ bàn phím, tính f(x), đưa kết quả ra màn hình. 
 )(3)(
3 xtgxxf  
Nội dung chương trình 
#include 
#include 
#include 
Void main() 
 { 
 int x; 
 clrscr(); 
 printf(“nhap so x =”); 
 scanf(“%d”,&x); 
 printf(“gia tri bieu thuc f(x) = %f ”,pow((x+3),1.0/3)+sin(x)/cos(x)); 
 getch(); 
 } 
 Bài tập 
Lập chương trình đọc vào từ bàn phím tọa độ 3 điểm A,B,C. Tính độ 
dài các đoạn thẳng AB, BC, CA. 
#include 
#include 
#include 
void main() 
{ 
 int xa,ya,xb,yb,xc,yc,xab,yab,xbc,ybc,xac,yac; 
 float ab,bc,ac; 
 clrscr(); 
 printf("nhap toa do diem A:\n xa= ");scanf("%d",&xa); 
 13
 printf("\n ya= ");scanf("%d",&ya); 
 printf("nhap toa do diem B:\n xb= ");scanf("%d",&xb); 
 printf("\n yb= ");scanf("%d",&yb); 
 printf("nhap toa do diem C:\n xc= ");scanf("%d",&xc); 
 printf("\n yc= ");scanf("%d",&yc); 
 xab=xa-xb;yab=ya-yb; 
 xbc=xb-xc;ybc=yb-yc; 
 xac=xa-xc;yac=ya-yc; 
 ab=sqrt(xab*xab+yab*yab); 
 bc=sqrt(xbc*xbc+ybc*ybc); 
 ac=sqrt(xac*xac+yac*yac); 
 printf("\ndo dai doan thang AB la: %f",ab); 
 printf("\ndo dai doan thang BC la: %f",bc); 
 printf("\ndo dai doan thang AC la: %f",ac); 
 getch() ; 
} 
3. Một số lệnh làm việc với màn hình và bàn phím 
Để sử dụng được lệnh làm việc với màn hình và bàn phím ta phải lạp 
thư viện ở đầu chương trình. 
Tên lệnh Ý nghĩa 
clrscr(); Xóa màn hình 
textcolor(m); Đặt mầu chữ 
textbackground(m) ; Đặt mầu nền cho chữ 
getch(); Chờ bấm một phím không hiện nên màn hình 
getche(); Chờ bấm một phím có hiện lên màn hình 
wherex(); Cho biết tọa độ cột hiện thời của con trỏ nháy 
wherey(); Cho biết tọa độ dòng hiện thời của con trỏ 
nháy 
textmode(m); Đặt chế độ văn bản hiển thị lên mà hình 
Ví dụ: 
 textcolor(red); 
 14
 printf (“Yen Bai ”); 
 textcolor(blue); 
 printf(“Ngay 12 thang 09 nam 2009”); 
hiện lên màn hình dòng chữ “Yen Bai” mầu đỏ, dòng chữ “Ngay 12 
thang 09 nam 2009” mầu xanh. 
II. Lệnh rẽ nhánh 
Lệnh rẽ nhánh cho phép chương trình thực hiện các khối lệnh tùy theo 
từng trường hợp cụ thể. Ngôn ngữ C có các lệnh rẽ nhánh sau: 
1. Lệnh if 
Lệnh rẽ nhánh này cho phép rẽ hai nhánh ứng với trường hợp đúng 
hoặc sai của biểu thức trọn, cách viết như sau: 
Cú pháp: if(điều_kiện_lựa_trọn) 
 Hành_động_1; 
 else 
 hành_động_2; 
Trong đó: 
- Điều kiện lựa trọn: là biểu thức logic có giá trị đúng hoặc sai 
- Hành động 1 và 2: là các khối lệnh để thực hiện cho trường hợp 1 và 2 
tương ứng. 
Sơ đồ khối: 
Biểu_thức 
lựa_Chọn 
Hành động 1 Hành động 2 
đúng sai 
 15
Chức năng: Máy sẽ thực hiện hành động 1 nếu điều kiện lựa chọn có giá 
trị dúng, ngược lại máy sẽ thực hiện hành động 2 
Ví dụ: 
 if(x%2 = =0) 
 printf(“ so x là so chan”); 
 else 
 printf(“so x la so le”); 
Chú ý: 
- Mỗi khối lệnh có thể có một hoặc nhiều lệnh, nếu nhiều lệnh phải có 
cặp dấu đóng mở ngoặc nhọn { } 
- Lệnh if này có thể không sử dụng hành động 2 và từ khóa else, khi đó 
nếu biểu thức trọn có giá trị sai thì máy sẽ bỏ qua(không làm gì cả). 
Bài tập: 
Viết chương trình giải bất phương trình bậc nhất: ax + b > 0 
 #include 
#include 
void main() 
{ 
 int a,b; 
 clrscr(); 
 printf("nhap he so a = ");scanf("%d",&a); 
 printf("nhap he so b = ");scanf("%d",&b); 
 if(a = =0) 
 { 
 if(b > 0) printf("\n BPT luon dung voi moi x"); 
 else printf("\n BPT vo nghiem"); 
 } 
 if(a > 0) printf("\n Nghiem cua BPT la: x > %f",-b*1.0/a); 
 if(a < 0) printf("\n Nghiem cua BPT la: x < %f",-b*1.0/a); 
 getch() ; 
} 
Viết chương trình giải phương trình bậc hai 
 16
#include 
#include 
#include 
void main() 
{ 
 int a,b,c; 
 float d,x1,x2; 
 clrscr(); 
 printf("nhap he so a= ");scanf("%d",&a); 
 printf("nhap he so b= ");scanf("%d",&b); 
 printf("nhap he so c= ");scanf("%d",&c); 
 if(a = = 0) 
 printf("\nkhong phai la phuong trinh bac hai "); 
 else 
 { 
 d=b*b-4*a*c; 
 if(d < 0) 
 printf("\nphuong trinh vo nghiem"); 
 else 
 if(d = = 0) 
 printf("\nphuong trinh co nghiem kep x1,2 = %f",-b/2.0*a); 
 else 
 { 
 printf("\n Nghiem cua phuong trinh la:"); 
 printf("\n x1= %f",(-b+sqrt(d))/2.0*a); 
 printf("\n x2= %f",(-b-sqrt(d))/2.0*a); 
 } 
 } 
 getch() ; 
} 
2. Lệnh switch 
 17
Lệnh switch cho phép rẽ nhiều nhánh với các trường hợp bằng xảy ra 
khi so sánh biểu thức chọn với các giá trị trong từng trường hợp đó. 
Cú pháp: 
 switch(biểu_thức_chọn) 
 { 
 case giá_trị_1: hành động 1;[break;] 
 case giá_trị_2: hành động 2;[break;] 
 . 
 case giá_trị_k: hành động k;[break;] 
 default: hành động x; 
} 
Trong đó: 
- Biểu thức trọn: là biểu thức dạng đếm được có thể là số nguyên hoặc ký 
tự, dùng để so sánh lựa trọn. 
- Các giá trị 1,2,,k là các giá trị số nguyên hoặc ký tự để so sánh. 
- Các hành động 1,2,,k là các khối lệnh để thực hiện ứng với từng 
trường hợp trên. 
- Từ khóa break sau mỗi hành động để kết thúc lệnh sau mỗi trường hợp 
sẩy ra. Có thể có hoặc không có các từ khóa break này. 
Sơ đồ khối: 
 18
Chức năng: 
Máy sẽ so sánh biểu thức trọn lần lượt với các giá trị 1, giá trị 2, giá trị 
3, giá trị k. Nếu gặp một giá trị i(i=1,2,..,k) nào đó bằng giá trị biểu thức 
chọn thì máy sẽ thực hiện các hành động đứng sau giá trị i đó đến khi gặp 
từ khóa break hoăc hết mọi hành động có trong lệnh switch. Nếu tất cả các 
trường hợp từ 1 đến k không sẩy ra điều kiện bằng thì mặc định máy sẽ 
thực hiện hành động X sau từ khóa default. 
Chú ý: 
- Lệnh switch có thể không có phần từ khóa default và khối lệnh x, khi 
đó máy sẽ không làm gì trong trường hợp không xẩy ra điều kiện bằng 
giữa biểu thức trọn và giá trị tương ứng của case. 
 19
Ví dụ: 
 switch(t) 
 { 
 case 1: printf(“chu nhat”);break; 
 case 2: printf(“thu 2”);break; 
 case 3: printf(“thu 3”);break; 
 case 4: printf(“thu 4”);break; 
 case 5: printf(“thu 5”);break; 
 case 6: printf(“thu 6”);break; 
 case 7: printf(“thu 7”);break; 
 default: printf(“khong la mot ngay trong tuan”); 
} 
Bài tập: 
 Viết chương trình đọc vào từ bàn phím một số nguyên n(1  n  10) 
rồi đưa ra tiếng anh của số đó. Chẳng hạn ,nếu gõ vào n = 2 thì đưa ra: 2 -> 
TWO 
#include 
#include 
void main() 
{ 
 int so; 
 clrscr(); 
 printf("hay nhap vao mot so:(tu 1->10): "); 
 scanf("%d",&so); 
 switch(so) 
 { 
 case 1:printf("\n so 1 tieng anh la ONE");break; 
 case 2:printf("\n so 2 tieng anh la TWO");break; 
 case 3:printf("\n so 3 tieng anh la THREE");break; 
 case 4:printf("\n so 4 tieng anh la FOUR");break; 
 case 5:printf("\n so 5 tieng anh la FIVE");break; 
 case 6:printf("\n so 6 tieng anh la SIX");break; 
 case 7:printf("\n so 7 tieng anh la SEVEN");break; 
 case 8:printf("\n so 8 tieng anh la EIGHT");break; 
 case 9:printf("\n so 9 tieng anh la NINE");break; 
 20
 case 10:printf("\n so 10 tieng anh la TEN");break; 
 default: printf("\n nhap du lieu sai"); 
 } 
 getch() ; 
} 
III.Lệnh lặp 
Lệnh lặp cho phép máy thực hiện một hành động nào đó lặp lại nhiều lần, 
mặc dù chúng ta chỉ viết một lần, ngôn ngữ C có các lệnh lặp sau đây. 
1. Lệnh for 
Cú pháp: 
for (nhóm lệnh 1;biểu thức 2; nhóm lệnh3) 
Hành động lặp; 
Trong đó : 
- Các nhóm lệnh 1,2,3 là các lệnh điều khiển trong quá trình lặp của for 
- Hành động lặp là khối lệnh để máy tính thực hiện lặp lại nhiều lần. 
Sơ đồ khối: 
Chức năng: 
Máy thực hiện nhóm lệnh 1 duy nhất một lần đầu tiên, sau đó thực hiện 
tính biểu thức 2 và nếu kêt quả tương ứng với giá trị đúng thì máy thực hiện 
hành đông lặp, tiếp theo máy thực hiện nhóm lênh 3, và lặp lại kiểm tra biểu 
thức 2 cho đến khi kết quả tương ứng với giá trị sai. 
 21
Vi dụ: 
For(i=1;i<5;i++) 
printf(“\n i= %d”,i); 
Sẽ hiện ra các số nguyên từ 1 đến 4 ra màn hình. 
 for (i = 4;i>=1;i--) 
 printf(“\n i = %d”,i); 
 sẽ hiện các số nguyên từ 4 xuống 1 ra màn hình. 
Chú ý : 
- Trong hành động lặp có thể có một lệnh hoặc nhiều lệnh, nếu có nhiều 
lệnh thì phải có cặp dấu mở đóng ngoặc nhọn {} để tạo khối 
- Trong lệnh này chỉ có nhóm lệnh 1 được thực hiện một lần đầu tiên, 
còn lại các biểu thức 2 và nhóm lệnh 3 và hành động lặp, sẽ thực hiện 
nhiều lần trong quá trình lặp. 
- Các nhóm lệnh 1,3 và biểu thức 2 có thể không xuất hiện trong lênh for 
nhưng phải có dấu chấm phẩy (;) khi đó nếu không có biểu thức 2 thì 
máy sẽ xem như điều kiện lặp luôn luôn đúng và sẽ lặp vô tận. 
- Trong mỗi nhóm lệnh 1 và 3 có thể có nhiều lệnh cách nhau bởi dấu 
phẩy đối với biểu thức 2 có thể thay đổi bằng một nhóm lệnh và khi đó 
máy sẽ lấy kết quả của lệnh cuối cùng làm điều kiện lặp hoặc dừng. 
Bài tập 
Nhập vào một số n từ bàn phím, hiện lên màn hình các số chẵn và lẻ từ 1 
đến n (hiện hết số chẵn rồi mới hiện số lẻ). 
#include 
#include 
void main() 
{ 
 int n,i; 
 clrscr(); 
 printf("Nhap vao so n= ");scanf("%d",&n); 
 printf("\n Cac so chan tu 1 den %d la: ",n); 
 for(i=1; i<=n;i++) 
 if(i%2 = =0)printf(" %d",i); 
 22
 printf("\n Cac so le tu 1 den %d la:",n); 
 for(i=1;i<=n;i++) 
 if(i%2!=0)printf(" %d",i); 
 getch() ; 
} 
Nhập n, tính tổng S=1+
n
1
...
4
1
3
1
2
1
 (n số hạng) 
 #include 
 #include 
 void main() 
 { 
 int i, n; 
float s = 0; 
clrscr(); 
printf(“\n nhap n= ”); scanf(“%d”,&n); 
for(i=1;i<=n;i++) 
s = s + 1.0/i ; 
printf(“\n Tong la: %f”,s); 
printf(“\n nhan mot phim bat ki de thoat ”); 
getch(); 
 } 
Lập chương trình xếp các dấu * thành một hình thoi n dòng với n nhập từ 
bàn phím 
#include 
#include 
void main() 
{ 
 int n,x=40,y=1; 
 clrscr(); 
 printf("nhap so luong dong n= "); 
 scanf("%d",&n); 
 for(int i=1;i<=n;i++) 
 { 
 for(int j=0;j<=20;j++) 
 23
 { 
 gotoxy(x,y) ; 
 printf("*"); 
 x++; 
 } 
 x=40-y; 
 y++; 
 } 
 getch() ; 
} 
2. Lệnh While 
Cú pháp 
while (điều kiện lặp) 
 Hành động lặp; 
Trong đó: 
- Điều kiện lặp : là biểu thức so sánh hoặc biểu thức nguyên 
- Hành động lặp: là các lệnh sẽ được thực hiện hiều lần trong quá trình 
lặp, nếu có nhiều lệnh phải có dấu { } để đóng khối. 
Sơ đồ khối 
Chức năng: 
Trong khi điều kiện lặp vẫn có giá trị đúng thì máy sẽ lặp thực hiện 
khối lệnh, và sẽ dừng lại nếu điều kiện sai 
Ví dụ: 
 x=1; y=10; 
 while(x<y) 
 { 
Điều kiện 
lặp 
Hành động lặp 
đúng 
sai 
 24
 Printf(“\n x = %d va y = %d”,x,y); 
 x +=2;y--; 
} 
Chú ý: nếu hành động sai ngay từ đầu thì máy sẽ không thực hiện hành động 
lặp dù chỉ một lần. 
3. Lệnh do- while 
Cú pháp: 
 do{ 
hành động lặp; 
 }while(điều kiện lặp); 
Trong đó: hành động lặp và điều kiện lặp giống như lệnh while ở trên 
Sơ đồ khối 
Chức năng: máy sẽ thực hiện hành động lặp nhiều lần cho đến khi điều kiện 
lặp có giá trị sai. 
 Ví dụ: 
 x=1; y=10; 
 do{ 
 printf(“\n x=%d và y=%d”,x,y); 
 x+=2;y--; 
} while(x<y); 
Điều kiện 
lặp 
Hành động lặp 
đúng 
sai 
 25
Chú ý: 
- Hành động lặp ít nhất được thưc hiện một lần dù cho điều kiện lặp luôn 
có giá trị sai vì máy kiểm tra điều kiện lặp sau khi thực hiện hành động 
lặp, điều này khác với lệnh while. 
 Bài tập: 
 Lập chương trình nhập một dãy các số nguyên vào từ bàn phím cho 
đến khi gặp số 0. tính tổng các số dương và trung bình cộng các số âm 
#include 
#include 
void main() 
{ 
 int i=1,so,dem = 0; 
 float tong_duong = 0,tong_am = 0; 
 clrscr(); 
 printf("\nnhap vao mot day cac so nguyen:"); 
 do 
 { 
 printf("\nnhap so thu %d: ",i); 
 scanf("%d",&so); 
 if(so>0)tong_duong = tong_duong+so; 
 else 
 { 
 tong_am = tong_am + so; 
 if(so!=0)dem++; 
 } 
 i++; 
 }while(so!=0); 
 printf("\ntong cac so duong la: %f",tong_duong); 
 if(dem!=0) 
 printf("\nTBC cac so am la: %f",tong_am/dem); 
 getch() ; 
} 
 26
Lập chương trình tìm các số có 3 chữ số sao cho số đó bằng tổng lập phương 
các chữ số của nó 
#include 
#include 
#include 
void main() 
{ 
 int i =100, tram,chuc,donvi; 
 clrscr(); 
 printf("cac so tim duoc la:\n"); 
 do{ 
 tram=i/100; 
 chuc=(i%100)/10; 
 donvi=(i%100)%10; 
 if(i==(pow(tram,3)+pow(chuc,3)+pow(donvi,3))) 
 printf(" %d",i); 
 i++; 
 }while(i<1000); 
 getch(); 
} 
4. Lệnh break, continue, goto 
lệnh break có tác dụng dừng vòng lặp (for ,while, do-while) trong mọi 
trường hợp. 
Lệnh continue làm cho chương trình bỏ qua phần còn lại của vòng lặp và 
nhảy sang lần lặp tiếp theo. Những câu lệnh viết sau lệnh continue sẽ không 
được thực hiện. 
 ví dụ: 
 for(i=0; i <10;i++) 
 { 
 printf(“%d”,i); 
 if(i>5) continue; 
 i++; 
 27
} 
 Lệnh goto: Lệnh này cho phép nhảy vô điều kiện tới bất kỳ điểm nào 
trong chương trình. 
Ví dụ: 
 Nhập vào từ bàn phím 1 số bất kì. Kiểm tra số đó là chẵn hay lẻ, hiện 
kết quả lên màn hình. Sau khi hiện song hỏi người dùng có tiếp tục chương 
trình không. Nếu có thì lập lại hành động trước đó. Nếu không thì kết thúc 
chương trình. 
 #include 
#include 
void main() 
{ 
 int x; 
 char ch; 
 L: 
 clrscr(); 
 printf("nhap mot so bat ki: "); 
 scanf("%d",&x); 
 if(x%2 = =0)printf(“\nso do la so chan”); 
 else printf(“\nso do la so le”); 
 printf("\n co tiep tuc truong trinh ko(c/k)?"); 
 ch=getche(); 
 if(ch = ='c')goto L; 
 getch() 
 } 
Bài tập: 
 Nhập vào từ bàn phím 3 số bất kì. Hiện số lớn nhất trong 3 số đó lên 
màn hình. Sau khi hiện song hỏi người dùng có tiếp tục chương trình không. 
Nếu có thì lập lại hành động trước đó. Nếu không thì kết thúc chương trình. 
#include 
#include 
void main() 
{ 
 int a1,a2,a3; 
 28
 int max; 
 char ch; 
 L: 
 clrscr(); 
 printf("nhap so thu nhat: "); 
 scanf("%d",&a1); 
 printf("nhap so thu hai: "); 
 scanf("%d",&a2); 
 printf("nhap so thu 3: "); 
 scanf("%d",&a3); 
 max = a1; 
 if(a2>max)max =a2; 
 if(a3>max)max =a3; 
 printf("\n so lon nhat la: %d",max); 
 printf("\n co tiep tuc truong trinh ko(c/k)?"); 
 ch=getche(); 
 if(ch = ='c')goto L; 
 getch() ; 
} 
 29
Bài 4 CHƯƠNG TRÌNH CON 
I. Khái niệm 
Chương trình con là mô-đun chương trình độc lập, hoạt động dưới sự 
điều khiển của một mô-đun chương trình khác. 
Chương trình con được dùng để tôí ưu hóa việc tổ chức chương trình, 
chia một chương trình lớn thành nhiều công việc độc lập nhỏ. Dùng chương 
trình con thực hiện các công việc nhỏ, tạo thành mô-đun. Khi đó nhiệm vụ 
chương trình chính chỉ là cung cấp dữ liệu đầu vào cho các mô-đun để hoàn 
thành công việc của mình. Một chương trình viết theo cách này gọi là 
chương trình cấu trúc. 
Có thể minh họa chương trình con như hình sau : 
Để nhận các dữ liệu đưa vào cho chương trình con và nếu có thể chứa 
dữ liệu kết quả ra chúng ta phải sử dụng tham số (parameters) của chương 
trình con. 
 Tham số tồn tại dưới hai hình thức đó là tham số thực và tham số hình 
thức. Tham số hình thức là tham số để khai báo và xây dựng trương trình 
con, còn tham số thực để xác định dữ liệu đưa vào khi gọi chương trình con. 
 Trong một số ngôn ngữ lập trình cung cấp hai loại chương trình con 
riêng biệt đó là hàm(function) và thủ tục (procedures) nhưng trong C chỉ 
cung cấp một loại đó là hàm 
Để tạo một hàm chúng ta cần xác định 
- Hàm tạo ra sẽ thực hiện công việc gì ? 
- Sau khi thưc hiện song có cần trả về một dữ liệu hay nhiều dữ liệu 
không ? 
- Để thực hiện được công việc đó ta cần những dữ liệu nào ? 
Chương trình 
con thực hiện 
công việc A 
Dữ liệu đưa vào 
để thực hiện 
công việc A 
Dữ liệu kết quả 
của công việc A 
 30
II, Khai báo và xây dựng hàm 
1. khai báo hàm 
Khai báo hàm được thực hiện ở phần đầu chương trình, khai báo để chỉ 
cho máy biết các thông tin về hàm bao gồm : kiểu dữ liệu trả về có hay 
không ,tên hàm, các tham số bao gồm kiểu và tên của từng tham số. 
Cú pháp khai báo như sau : 
Tên_kiểu_trả_về tên_hàm(kiểu1 tham_số1,kiểu2 tham_số2 ..... ) ; 
Trong đó : 
- Tên kiểu trả về : là một tên kiểu dữ liệu quy định kết quả trả về là khiểu 
gì. 
- Tên hàm : tự đặt theo quy định đặt tên của ngôn ngữ C. 
- Kiểu1 tham_số1 : xác định tên của tham số thứ nhất và kiểu của tham 
số đó,... 
Ví dụ : 
 int sum(int a , int b) ; 
 float max(float x, float y); 
Nếu trong hàm không có dữ liệu trả về thì viết kiểu trả về là void nếu 
không có tham số thì bỏ trống và phải có cặp dấu đóng mở ngoăc () sau tên 
hàm. 
Ví dụ: 
 void hien(); 
2. Xây dựng hàm 
Sau khi khai báo xong hàm chúng ta có thể viết lệnh thực hiện công việc 
đặt ra cho chương trình con. 
Cú pháp: 
Tên_kiểu_trả_về tên_hàm(kiểu1 tham_số1,kiểu2 tham_số2 ..... ) ; 
 { 
 Các câu lệnh thực hiện công việc đặt ra cho hàm. 
} 
Khi cần kết thúc thực hiện hàm và trả về dữ liệu nào đây, chúng ta viết 
lệnh return vào vị trí cần thiết nhất trong hàm. 
 Cú pháp: 
 return giá-trị-dữ-liệu-trả-về; 
 Ví dụ: 
 31
 int sum(int a, int b) 
 { 
 return a+b; 
} 
 Hoặc 
 float max(float x, float y) 
 { 
 if(x>y) 
 return x; 
 else 
 return y; 
} 
Đối với hàm có kiểu void có thể không cần lệnh return 
 Ví dụ: 
 void hien() 
 { 
 printf(“ho va ten: Nguyen Van Nam”); 
 printf(“Ngay sinh :12\08\2009”); 
 printf(“que quan : Yen Bai”); 
} 
Chú ý: 
Thông thường với những chương trình đơn giản có ít chương trình con thì 
người ta viết lệnh cho hàm ngay tại nơi khai báo. 
3. Lời gọi hàm 
Khi thực hiện chương trình máy sẽ thực hiện các lệnh trong chương trình 
chính(hàm main), do đó để yêu cầu máy thực hiện công việc của chương 
trình con ta phải viết lệnh gọi chương trình con với cú pháp sau. 
 Tên-hàm(các-tham-số-thực-chuyền-vào); 
Lời gọi này có thể là một câu lệnh độc lập hoặc đặt trong biểu thức, nếu 
đặt trong biểu thức thì hàm đó phải có giá trị trả về để thực hiện tính toán 
biểu thức đó. 
Ví dụ: 
 printf(“Tong hai so 5 va 6 la: %d”,tong(5,6)); 
hoặc : 
 float x ; 
 x = max(a,b) ; 
hoăc : 
 hien(); 
 32
Chú ý: Thông thường lời gọi hàm được viết trong chương trình chính, tuy 
nhiên có thể viết trong chương trình con khác. Các chương trình con có thể 
gọi lẫn nhau. 
4. Các vấn đề ở tham số 
- Biến toàn cục và biến cục bộ 
Biến toàn cục là biến nhớ được khai báo ở ngoài mọi hàm(thường được 
khai báo ở trên cùng sau khai báo thư viện), có tác dụng đến toàn bộ 
chương trình cả chương trình chính và chương trình con. 
Biến cục bộ là biến nhớ được khai báo bên trong một chương trình con, 
chỉ có tác dụng ở trong chương trình con đó. Bên ngoài chương trình con 
đó thì biến đó không được sử dụng nữa. 
Ví du: 
 #include 
 #include 
 int a,b; 
 int sum() 
 { 
 int c = a + b; 
 return c; 
} 
int tich() 
{ 
 int c ; 
 c =a*b; 
 return c; 
} 
void main() 
{ 
 clrscr(); 
 printf(“nhap vao so a = ”); scanf(“%d”,&a); 
 printf(“nhap vao so b = ”);scanf(“%d”,&b); 
 printf(“\n tong hai so: %d”,sum()); 
 printf(“\n tich hai so la: %d”,tich()); 
 getch(); 
} 
Trong ví dụ trên hai biến a và b là biến toàn cục được sử dụng trong cả 3 
hàm sum, max và main. Trong hàm sum và max đều có biến cục bộ là c 
 33
nhưng biến c trong hàm sum sẽ độc lập và riêng biệt so với c trong hàm 
max. 
- Tham số hình thức và tham số thực 
Tham số hình thức là tham số được khai báo khi xây dựng hàm, nó 
mang ý nghĩa hình thức để nhận dữ liệu đầu vào cho một hàm. 
Tham số thực là tham số được xác định khi chúng ta gọi hàm, đó là 
các dữ liệu được truyền vào cho hàm thực hiện tính toán. 
Ví dụ: 
 int sum(int a, int b) 
 { 
 return (a+b); 
} 
void main() 
{ 
 int x = 5; 
 printf(“tong hai so la:”, sum(5,x*2-1)); 
} 
Trong ví dụ trên tham số a và b trong khai báo hàm sum là tham số 
hình thức, còn lời gọi hàm sum(5,x*2-1) thì 5 và x*2-1 là tham số thực, đó 
là các hằng số và biểu thức. 
Bài tập: 
Viết chương trình con tìm Max, Min 3 sô nguyên, chương trình chính 
nhập vào 3 số nguyên, hiện số lớn nhất và nhỏ nhất ra màn hình. 
#include 
#include 
int max(int a,int b,int c) 
{ int max=a; 
 if(max<b)max=b; 
 if(max<c)max=c; 
 return max; 
} 
int min(int a, int b, int c) 
{ 
 int min=a; 
 if(min>b)min=b; 
 if(min>c)min=c; 
 return min; 
 34
} 
void main() 
{ 
 int a,b,c; 
 clrscr(); 
 printf("\nnhap vao 3 so nguyen:"); 
 printf("\nso thu nhat: ");scanf("%d",&a); 
 printf("\nso thu hai: ");scanf("%d",&b); 
 printf("\nso thu ba : ");scanf("%d",&c); 
 printf("\n so lon nhat la: %d",max(a,b,c)); 
 printf("\n so nho nhat la: %d",min(a,b,c)); 
 getch() ; 
} 
 35
Bài 5: KIỂU DỮ LIỆU MẢNG VÀ LIỆT KÊ 
I, Khai báo kiểu mảng 
1 khái niệm và ý nghĩa của mảng 
Mảng là cấu trúc dữ liệu cho phép quản lý một danh sách hữu hạn các 
dữ liệu cùng kiểu có kí tự 
Ví dụ: Để chứa 5 dữ liệu số nguyên sau 10, 12, 25, 30, 40 
Chúng ta có thể sử dụng 5 biến nhớ khác nhau 
 a = 10, b = 12, c = 25, d = 30, e = 40 
tuy nhiên nếu số lượng dữ liệu tăng thì cách này không phù hợp, và chúng ta 
sẽ sử dụng cấu trúc mảng, minh hoạ như sau: 
10 12 25 30 40 .... 
Các dữ liệu trong mảng phải cùng kiểu(số nguyên, số thực, ký tự ... ). 
 Mảng để chứa dữ liệu như trên là mảng 1 chiều, chúng ta có thể sử 
dụng mảng 2 chiều hoặc mảng nhiều chiều. 
 Ví dụ về mảng 2 chiều: 
10 2 5 .... 
45 23 56 .... 
8 5 20 .... 
.... .... .... .... 
 Mảng hai chiều là một bảng các dữ liệu được xếp theo hàng và cột, 
mỗi dữ liệu sẽ chứa trong ô được xác định bằng cách chỉ ra ở hàng nào và 
cột nào. 
2. Khai báo kiểu mảng và biến mảng 
 cú pháp: 
 tên_kiểu_dữ_liệu tên_mảng[số_lượng_phần_tử_tối_đa]; 
Trong đó: 
 Tên kiẻu dữ liệu qui định mảng có thể chứa được dữ liệu có kiểu như 
thế nào(int, float, char...) 
 Tên mảng do chúng ta đặt theo quy định đặt tên của ngôn ngữ C 
 36
Ví dụ: 
 int a[20]; 
 float b[50]; 
Để khai báo mảng hai hoặc nhiều chiều ta chỉ cần thêm kích thước(số phần 
tử) ở chiều tiếp theo 
Cách khai báo mảng hai chiều: 
 Tên_kiểu_dữ_liệu tên_mảng[kích_thước_hàng] 
[kích_thước_cột]; 
 int a[10] [15]; 
 float b[100] [100]; 
3, Cách tổ chức dữ liệu mảng tên máy và truy nhập các phần tử 
 Đối với mảng một chiều các phần tử chứa dữ liệu được sắp xếp liên 
tục trong bộ nhớ máy, và mỗi phần tử sẽ có một chỉ số (là số thứ tự) của 
phần tử đó trong mảng. 
 Phần tử đầu tiên có chỉ số là 0, tiếp theo là 1 và tiếp tục cho đến hết, 
vậy sẽ dừng lại ở chỉ số bằng số lượng phần tử -1. 
Minh hoạ bằng hình sau: 
10 25 15 30 ..... 
0 1 2 3 .... 
Kích thước của mảng (tính bằng byte) sẽ là: số lượng phần tử của mảng 
nhân với kích thước của kiểu dữ liệu của mảng đó. 
 Ví dụ: 
 int a[20]; 
Thì mảng sẽ chiếm kích thước bộ nhớ là: 20 x 2 = 40 byte 
 Để truy nhập đến các phần tử ta sử dụng tên và các chỉ số của phần tử 
đó theo cú pháp sau: 
 Tên_mảng[chỉ_số_phần_tử_cần_truy_nhập]; 
 Ví dụ: 
 a[0]=10; 
 Nếu là mảng hai chiều thì các dữ liệu của mảng được lưu trữ tuần tự 
theo quy tắc ưu tiên hàng (lưu trữ hết hàng này đến hàng khác). 
 Các hàng và cột có chỉ số bắt đầu từ 0 theo chiều từ trên xuống theo 
hàng và từ trái sang phải theo cột. 
 37
4 6 2 .... 0 
8 9 45 .... 1 
2 8 6 .... 2 
6 9 2 .... 3 
.... .... .... .... .... 
0 1 2 ...... 
Để truy nhập đến các phần tử của mảng hai chiều ta sử dụng tên mảng và chỉ 
số hàng và chỉ số cột theo cú pháp sau: 
 Tên_mảng_hai_chiều[chỉ_số_hàng] [chỉ_số_cột]; 
 Ví dụ: 
 a[1][2] = 5; 
Chú ý: 
 Số lượng dữ liệu lưu trong mảng có thê ít hơn số lượng phần tử đã 
khai báo, nhưng không vượt quá số lượng phần tử đã khai báo đó. Thông 
thường sử dụng mảng sẽ có một số nguyên n để lưu số lượng dữ liệu được 
lưu trong mảng tương ứng. 
 Danh sách các dữ liệu lưu trong mảng phải liên tục nhau để quản lý và 
sử lý dễ dàng. 
II- Các xử lý trên mảng 
1, Nhập dữ liệu vào mảng 
chương trình: 
 printf("nhap so luong phan tu cho mang n = "); 
 scanf("%d",&n); 
 for(i=0;i<n;i++) 
 { 
 printf("nhap du lieu a[%d]=",i); 
 scanf("%d",&a[i]); 
 } 
2 , Hiện dữ liệu ra màn hình 
chương chình: 
 38
printf("\n du lieu trong mang la:\n"); 
for(i=0;i<n;i++) 
 { 
 printf("%5d",a[i]); 
 } 
chú ý: Nếu muốn hiển thị dữ liệu các phần tử mảng ra màn hình theo điều 
kiện nào đó ta chỉ cần thêm điều kiện vào sau lệnh for 
ví dụ: 
 printf("du lieu trong mang la:\n"); 
 for(i=0;i<n;i++) 
{ 
 if(a[i]%2 = = 1) 
 printf("&5d",a[i]); 
} 
3 Tính toán trên các phần tử 
Tính tổng: 
Chương trình 
 int tong = 0; 
 for (i=0;i<n;i++) 
 { 
 tong = tong + a[i]; 
} 
 printf("Tong cua cac phan tu trong mang la: %d",tong); 
Tính trung bình 
 float t_binh = 0; 
 for (i=0;i<n;i++) 
 { 
 t_binh = t_binh +a[i]; 
} 
t_binh = t_binh /n; 
printf("Trung binh cua cac phan tu trong mang la: %f",t_binh); 
Chú ý: 
Để tính toán các phần tử thoả mãn một điều kiện ta chỉ cần thêm lệnh if 
vào trước khối lệnh tính 
Ví dụ: tính tổng các số dương 
 int tong = 0; 
 39
 for (i=0;i<n;i++) 
 if(a[i]>0) 
 tong = tong + a[i]; 
 printf("tong cua cac so duong trong mang la: %d",tong); 
4 Tìm kiếm các phần tử 
 Tìm min 
 Sơ đồ thuật toán 
 Chương trình 
 int min =0; 
 for (i = 0;i<n;i ++) 
 { 
 if(a[min] >a[i]) 
 min = i; 
 } 
printf("so nho nhat trong mang la :%d",a[min]); 
 Tìm max, tương tự như tìm min chỉ thay điều kiện so sánh lớn 
hơn(a[min]>a[i]) bằng điều kiện nhỏ hơn (a[max]< a[i]). 
5 sắp xếp các phần tử 
- Sắp xếp các phần tử theo chiều tăng hoặc giảm 
Chương trình 
for( i = 0; i < n;i + +) 
 for(j = i+1;j<n-1;j++) 
 if(a[i]>a[j]) 
 { 
 tg = a[i]; 
 a[i] = a[j]; 
 a[j] = tg; 
 } 
Nếu chuyển thành sắp xếp không tăng(giảm dần) chỉ cần thay điều kiện sắp 
xếp thành a[i] < a[j] 
Bài tập: 
 Lập trình đọc vào từ bàn phím hai dãy số nguyên. Dãy A có n số, dãy B 
có m số. Tính tổng của mỗi dãy, so sánh xem dãy nào có tổng lớn hơn. Đưa 
kết quả ra màn hình bao gồm: dãy A, dãy B, tổng dãy A,B, so sánh. 
 40
#include 
#include 
void nhap(int n,int C[]) 
 { for(int i=0;i<n;i++) 
 { 
 printf("\n Nhap so thu %d ",i+1); 
 scanf("%d",&C[i]); 
 } 
 } 
void hien(int n,int C[]) 
 { 
 for(int i=0;i<n;i++) 
 { 
 printf(" %d",C[i]); 
 } 
 } 
int tong(int n,int C[]) 
 { int sum=0; 
 for(int i=0;i<n;i++) 
 sum=sum+C[i]; 
 return sum; 
 } 
void main() 
{ 
 clrscr(); 
 int A[100],B[100],m,n; 
 printf("\nnhap so luong phan tu day A: n= "); 
 scanf("%d",&n); 
 printf("\nnhap so luong phan tu day B: m= "); 
 scanf("%d",&m); 
 printf("\n Nhap gia tri cho day A:"); 
 nhap(n,A); 
 printf("\n Nhap gia tri cho day B"); 
 nhap(m,B); 
 printf("\n Day A vua nhap la:"); 
 hien(n,A); 
 printf("\n Day B vua nhap la:"); 
 hien(m,B); 
 printf("\n tong day A la: %d",tong(n,A)); 
 printf("\n tong day B la: %d",tong(m,B)); 
 41
 printf("\n Day lon hon la: "); 
 if(tong(n,A)>tong(m,B)) printf("A"); 
 else printf("B"); 
 getch() ; 
} 
Nhập ma trận A có m hàng n cột đưa ra màn hình ma trận A vừa nhập để 
kiểm tra. 
#include 
#include 
void main() 
{ 
 int n,m,i,j,A[100][100]; 
 clrscr(); 
 printf("nhap so hang cua ma tran: n= "); 
 scanf("%d",&n); 
 printf("nhap so cot cua ma tran: m= "); 
 scanf("%d",&m); 
 //nhap gia tri cho ma tran 
 for(i=0;i<n;i++) 
 { 
 for(j=0;j<m;j++) 
 { 
 printf("A[%d][%d]= ",i+1,j+1); 
 scanf("%d",&A[i][j]); 
 } 
 } 
 // hien ma tran vua nhap 
 printf("\nMa tran ban vua nhap la:"); 
 for(i=0;i<n;i++) 
 { printf("\n"); 
 for(j=0;j<m;j++) 
 { 
 printf("%d ",A[i][j]); 
 } 
 } 
 getch(); 
} 
 42
Nhập vào từ bàn phím một dãy số nguyên. Tìm số lớn nhất, nhỏ nhất và vị 
trí của số đó trong mảng. 
#include 
#include 
void main() 
{ 
 int i,n,A[100],max=0,min=0; 
 clrscr(); 
 printf("nhap so luong phan tu cua day: "); 
 scanf("%d",&n); 
 //nhap gia tri cho day 
 for(i=0;i<n;i++) 
 { 
 printf("\n Nhap A[%d] = ",i+1); 
 scanf("%d",&A[i]); 
 } 
 //tim Max, Min 
 for(i=1;i<=n;i++) 
 { 
 if(A[max]<A[i]) max=i; 
 if(A[min]>A[i]) min=i; 
 } 
 printf("\nSo lon nhat trong day la: %d",A[max]); 
 printf("\t Vi tri so do la: %d",max+1); 
 printf("\nSo nho nhat trong day la: %d",A[min]); 
 printf("\t Vi tri so do la: %d",min+1); 
 getch(); 
} 
Nhập và từ bàn phím một dãy số nguyên, xắp xếp dãy đó theo chiều tăng 
dần và giảm dần. hiện lên màn hình: dãy số vừa nhập, dãy đã sắp xếp. 
#include 
#include 
void nhap(int n,int C[]) 
 { for(int i=0;i<n;i++) 
 { 
 43
 printf("\n Nhap so thu %d ",i+1); 
 scanf("%d",&C[i]); 
 } 
 } 
void hien(int n,int C[]) 
 { 
 for(int i=0;i<n;i++) 
 { 
 printf(" %d",C[i]); 
 } 
 } 
void tang(int n, int C[]) 
 { int tg; 
 for(int i=0;i<n;i++) 
 for(int j=0;j<n-1;j++) 
 if(C[j] >C[j+1]) 
 { 
 tg=C[j]; 
 C[j]=C[j+1]; 
 C[j+1]=tg; 
 } 
 } 
void giam(int n, int C[]) 
 { int tg; 
 for(int i=0;i<n;i++) 
 for(int j=0;j<n-1;j++) 
 if(C[j] <C[j+1]) 
 { 
 tg=C[j]; 
 C[j]=C[j+1]; 
 C[j+1]=tg; 
 } 
 } 
void main() 
{ 
 clrscr(); 
 int A[100],n; 
 printf("\nnhap so luong phan tu day : n= "); 
 scanf("%d",&n); 
 printf("\n Nhap gia tri cho day :"); 
 44
 nhap(n,A); 
 printf("\n Day vua nhap la:"); 
 hien(n,A); 
 //hien day da xap xep tang dan 
 printf("\n Day da xap xep tang dan la:"); 
 tang(n,A); 
 hien(n,A); 
 //hien day da xap xep giam dan 
 printf("\n Day da xap xep giam dan:"); 
 giam(n,A); 
 hien(n,A); 
 getch() ; 
} 
 45
 Bài 6 QUẢN LÝ VÀ SỬ LÝ TRUỖI KÝ TỰ 
I, Khái niệm 
 1, Khai báo biến chứa chuỗi ký tự 
 trong C không có kiểu xâu, do vậy ngôn ngữ C sử dụng mảng để lưu trữ 
chuỗi ký tự, mỗi phần tử của mảng sẽ là một kiểu dữ liệu kiểu char 
Cú pháp khai báo: 
 char biến_xâu[n]; 
với n là số nguyên dương bất kỳ (<64kb),chỉ số tối đa các ký tự của xâu. 
Ví dụ: 
 char s[100]; 
 sẽ khai báo mảng s để lưu chuỗi ký tự 
2 Cách tổ chức lưu trữ chuỗi ký tự trong mảng 
Các ký tự được lưu theo thứ tự từ trái sang phải của chuỗi và bắt đầu 
bằng phần tử có chỉ số 0 cho đến hết chuỗi. 
Kết thúc một chuỗi (ở sau ký tự cuối cùng) sẽ có dấu hiệu đặc biệt kết 
thúc đó là ký tự '\0'. Và đó cũng là để xác định độ dài thực của chuỗi ký tự 
có trong mảng. 
Để truy nhập đến từng ký tự của xâu ta viết 
 biến_xâu[giá_trị_chỉ_số]; 
trong đó giá trị chỉ số xác định vị trí ký tự trong xâu 
 Vì kết thúc mỗi chuỗi lưu trong mảng có thêm ký tự ' \0' nên số ký tự 
tối đa có thể lưu trong mảng sẽ là số phần tử của mảng -1. 
 Ví dụ: 
 char s[100]; 
 thì mảng s sẽ lưu được 99 ký tự tối đa, còn phải trừ ra một phần tử 
cuối để chứa '\0' 
T R A N Y E N \0 ... 
... 
0 1 2 3 4 5 6 7 8 9 10 97 98 99 
giả sử sâu s lưu chuỗi "TRAN YEN" thì sâu sẽ được tổ chức như hình trên, 
các ký tự có chỉ số 0 đến hết trên mảng s. 
 46
 giả sử ta có 4 lệnh sau: 
 s[0] = 'V'; 
s[1] = 'a'; 
s[2] = 'n'; 
s[3] = ' '; 
thì sẽ thay chữ "TRAN" trong mảng thành chữ "Van " 
II, Các sử lý trên chuỗi ký tự 
Ngôn ngữ C cung cấp các lệnh sử lý xâu trong thư viện , do đó 
ta phải khai báo thư viện này ở đầu chương trình 
1, Nhập và hiện chuỗi ký tự 
Chúng ta có thể sử dụng lệnh scanf() để nhập chuỗi, tuy nhiên lệnh này 
chỉ thực hiện nhập chuỗi không dấu cách, để nhập chuỗi đúng đắn ta sử dụng 
lệnh sau: 
 gets(tên_biến) 
Ví dụ: 
char s[100]; 
printf(“nhập một chuỗi ký tự:”); 
gets(s); 
Chú ý: Nếu trước lệnh nhập chuỗi có lệnh nhập số thì phải xóa vùng đệm 
bàn phím trước khi nhập chuỗi bằng lệnh sau: 
 fflush(stdin); 
Ví dụ 
 int n; 
 char s[50]; 
 printf(“nhap so n =”); 
 scanf(“%d”,&n); 
 printf(“nhap chuoi s = ”); 
 fflush(stdin); gets(s); 
Để hiện chuỗi kí tự ra màn hình ta có thể sử dụng một trong các lệnh sau: 
 printf(“%s”,xâu_cần_hiện); 
 puts(xâu_cần_hiện); 
2, Các lệnh sử lý chuỗi ký tự 
- Lệnh cho biết độ dài thực sự (số ký tự) của chuỗi ký tự lưu trong mảng 
 int strlen(s); 
ví dụ: 
 char s[100] = “Ha Noi Viet Nam”; 
 int a = strlen(s); 
 47
sẽ trả về độ dài thực của sâu s gán vào biến nhớ a, cụ thể là a = 15 
- Lệnh gán chuỗi từ sâu này vào sâu khác 
 strcpy(s1, s2 ); 
sẽ thưc hiện chép chuỗi ký tự trong sâu s2 vào s1. 
Chú ý: Trong ngôn ngữ C không thể sử dung phép gán ( = ) để gán hai chuỗi 
do đó phải sử dụng lệnh strcpy này. 
 Lệnh nối hai sâu lại với nhau 
 strcat( s1,s2); 
sẽ thưc hiện nối sâu S2 vào sâu S1 
ví dụ: 
 char s1[100] = “Ha Noi”; 
 char s2[100] =”Viet Nam”; 
strcat (s1,s2); 
kết quả xâu s1 sẽ thay đổi và đó là:”Ha NoiViet Nam” 
- Lệnh chuyển sâu thành chữ hoa 
 strupr(s); 
- Lệnh chuyển sâu thành chữ thường. 
 strlwr(s); 
3, Đêm ký tự, đếm từ 
 Cho một chuỗi s và đếm xem trong chuỗi có bao nhiêu chữ thỏa mãn 
một điều kiện nào đó: 
 dem = 0 
 for( i =0; i<strlen(s);i++) 
 if(s[i] thỏa mãn điều kiện) dem ++; 
 printf(“so ky tu dem duoc la: %d”,dem) ; 
- Thuật toán đếm số từ co trong chuỗi s theo tiêu chuẩn nhận biết đầu từ( là 
cặp ký tự thỏa mãn ký tự trước là dấu cách, ký tự sau khác dấu cách). 
if(s[0] = = ‘ ’ ) dem = 0 ; 
else dem = 1; 
for( i = 1;i < strlen(s);i++ ) 
{ 
 if(s[i] = =’ ’&& s[i+1]!=’ ’) 
 dem ++; 
} 
printf(“so tu dem duoc là: %d”,dem) ; 
 48
4. Chuẩn hóa chuỗi ký tự 
 Một chuỗi ký tự ở dạng chuẩn nếu không có dấu cách ở đầu , không 
có dấu cách ở cuối và giữa hai từ có duy nhất một dấu cách. 
 Thuật toán chuẩn hóa được chia làm 3 bước như sau 
Bước 1 : Xóa dấu cách ở đầu 
 int i = 0 ; 
 while (s[i] = =’ ’&&i < strlen(s)) i++ ; 
 strcpy(&s[0],&s[i]); 
Bước 2: Xóa dấu cách thừa giữu hai từ 
int i = 0; 
while(i<strlen(s)-1) 
 { 
 if(s[i] = = ‘ ‘&& s[i+1] = = ‘ ‘ ) 
 strcpy(&s[i],&s[i+1]); 
 else i++ 
} 
Bước 3 xóa dấu cách ở cuối chuỗi 
while(s[strlen(s)-1] = =’ ’ ) s[strlen(s)-1]= ‘\0’; 
5 Tách từ 
- Tách từ đầu tiên 
 i=0; 
 while(s[i] = =' ')i++; 
 for(j=0;(i<strlen(s))&&(s[i]!=' ');i++,j++) 
 tudau[j] = s[i]; 
 tudau[j]='\0'; 
- Tách từ cuối cùng 
 i = strlen(s)-1; 
 while(s[i] = =' ')i--; 
 j=i; 
 while(s[i]!=' ')i--; 
 i++; 
 for(int x = 0;i<=j;i++) 
 49
 { 
 tucuoi[x] = s[i]; 
 x++; 
 } 
 tucuoi[x] = '\0'; 
Bài tập 
Lập trình đọc vào một sâu. Đọc vào từ bàn phím một kí tự bất kì, rồi đếm 
xem số lần xuất hiện ký tự này trong sâu. Báo kết quả ra màn hình. 
#include 
#include 
#include 
int dem(char s[ ],char a) 
{ 
 int d=0;//so ki tu 
 int l=strlen(s); 
 for(int i=0;i<l;i++) 
 { 
 if(s[i] = = a) 
 d++; 
 } 
 return d; 
} 
void main() 
{ 
 int i; 
 char s[100],ch; 
 clrscr(); 
 printf("\n nhap vao mot cau: "); 
 fflush(stdin);gets(s); 
 printf("\n Nhap vao mot ki tu bat ki:"); 
 ch = getche(); 
 //dem so lan xuat hien cua ki tu 
 printf("\nki tu %c xuat hien %d lan trong xau ",ch,dem(s,ch)); 
 getch(); 
} 
 50
Viết chương trình đọc vào một xâu. Đếm số từ của một sâu. Từ được hiểu là 
xâu khác rỗng và không có dấu cách. 
#include 
#include 
#include 
int sotu(char S[]) 
{ 
 int dem=0,n; 
 n=strlen(S); 
 if(S[0]!=' ')dem=1; 
 for(int i=1;i<n;i++) 
 { 
 if(S[i]= =' '&& S[i+1]!=' ')dem++; 
 } 
 return dem; 
} 
void main() 
{ 
 int i; 
 char s[100]; 
 clrscr(); 
 printf("\n nhap vao mot sau ki tu: "); 
 fflush(stdin);gets(s); 
 //dem so tu cua mot sau 
 printf("sau ban vua nhap co: %d tu",sotu(s)); 
 getch(); 
} 
Lập trình đọc vào một câu từ bàn phím rồi đưa ra màn hình dưới dạng một 
cột. thí dụ đọc vào TIÊN HỌC LỄ HẬU HỌC VĂN kết quả đưa ra thành 
 TIÊN 
 HỌC 
 LỄ 
 HẬU 
 HỌC 
 VĂN 
#include 
 51
#include 
#include 
void hien(char s[]) 
{ 
 int l=strlen(s),n=0; 
 while(s[n]= =' ')n++; 
 for(int i = n ; i<l ; i++) 
 { if(s[i]!=' ') 
 printf("% c",s[i]); 
 else 
 printf("\n"); 
 } 
} 
void main() 
{ int i; 
 char s[100]; 
 clrscr(); 
 printf("\n nhap vao mot cau: "); 
 fflush(stdin);gets(s); 
 printf("hien cau moi tu tren mot dong la:\n"); 
 hien(s); 
 getch(); 
} 
Nhập vào từ bàn phím họ tên của một người. Hiện tên và họ của người đó 
lên màn hình. 
#include 
#include 
#include 
void main() 
{ 
 char s[100],ten[10],ho[10]; 
 int i=0,j=0; 
 clrscr(); 
 printf("\n nhap vao ten cua mot nguoi: "); 
 fflush(stdin);gets(s); 
 // tach ho 
 while(s[i]= =' ')i++; 
 52
 do{ 
 ho[j]=s[i]; 
 i++; j++; 
 }while(s[i]!=' '); 
 ho[j]='\0'; 
 printf("\n ho cua nguoi nay la: %s",ho); 
 // tach ten 
 j=0; 
 i=strlen(s); 
 while(s[i]= =' ')i--; 
 int i1=i; 
 while(s[i1]!=' ')i1--; 
 do{ 
 ten[j]=s[i1]; 
 i1++; j++; 
 }while(i1<=i); 
 ten[j]='\0'; 
 printf("\n ten cua nguoi nay la: %s",ten); 
 getch(); 
} 
 53
Bai 7 BIẾN CON TRỎ 
1. Biến trỏ là gì: 
 Biến trỏ là biến đặc biệt, dùng để lưu địa chỉ vùng nhớ của một biến 
khác, chứ không lưu trữ giá trị của biến đó. Khích thước của biến trỏ phụ 
thuộc vào cách khai báo. Được minh họa bằng hình sau. 
Có hai kiểu biến trỏ: Biến trỏ có kiểu và biến trỏ không kiểu 
 Biến trỏ có kiểu : loại biến trỏ này chỉ chứa địa chỉ vùng nhớ của một 
kiểu dữ liệu nào đó, kiểu dữ liệu này được xác định khi khai báo biến trỏ. Và 
kiểu của biến trỏ xác định kích thước của vùng nhớ mà biến trỏ đến 
Ví dụ biến trỏ kiểu int sẽ trỏ đến vùng nhớ có kích thước là 2 bytes, kiểu 
floast sẽ trỏ đến vùng nhớ có kích thước là 4 bytes. 
 Biến trỏ không kiểu: loại biến trỏ này có thể chứa địa chỉ vùng nhớ có 
kích thước bất kỳ. 
Vùng nhớ động: là vùng nhớ được cấp phát khi cần và giải phóng khỏi bộ 
nhớ khi sử dụng song. Để truy cập đến vùng nhớ động chúng ta phải dùng 
biến trỏ. 
2 khai báo biến trỏ: 
- biến trỏ có kiểu 
 kiểu_dữ_liệu_mà_biến_trỏ_đến *tên_biến_trỏ; 
- biến trỏ không kiểu: 
void *tên_biến_trỏ 
ví dụ: 
 54
 int *p,*q; 
 float *a,*b; 
 void *i; 
3 Các thao tác trên biến trỏ 
Xác định địa chỉ của vùng nhớ(hoặc biến nhớ) 
 Ngôn ngữ C sử dụng toán tử & hoặc hàm để lấy địa chỉ vùng nhớ của 
một biến 
Cú pháp xác định địa chỉ vùng nhớ thông qua toán tử &. 
 &tên_biến_lấy_địa_chỉ 
 Hàm xác định địa chỉ. 
 FP_SEG(đối_tượng_lấy_địa_chỉ) 
Ví dụ: 
 int a = 5,*p; 
 p = &a; 
Truy nhập dữ liệu của vùng nhớ qua biến trỏ 
 Chúng ta sử dụng toán tử * để truy nhập dữ liệu trên vùng nhớ đang 
được trỏ bởi biến trỏ như sau: 
 *tên-biến-trỏ 
Ví dụ: 
 int a=5,*p; 
 p = &a; 
 a = *p+2; 
kết quả a = 7. 
 Các phép toán 
- Phép cộng trừ: +, - 
- Phép tăng giảm: ++, - -, +=, - = 
Phép tăng giảm tác động lên biến trỏ không thực hiện theo kiểu số học 
đơn thuần, mà máy sẽ thực hiện chuyển nơi trỏ của biến trỏ đến ô nhớ 
tiếp theo sau hoặc trước so với ô trỏ hiện tại. 
 Ví dụ: 
 55
 P - -; 
 Sẽ cho biến trỏ P trỏ đến ô nhớ kế tiếp ô nhớ hiện tại. 
- Phép so sánh: 
 ,= =,>=, <=, != 
Phép so sánh trên biến trỏ sẽ thực hiện so sánh địa chỉ được lưu ở 
trong biến trỏ và trả về kết quả dạng dúng hoặc sai tương ứng với 
phép so sánh được sử dụng. 
4 Cấp phát bộ nhớ 
Để sử dụng bộ nhớ một cách tối ưu chúng ta thực hiện cấp phát động 
vùng nhớ khi cần và giải phóng chúng khi không sử dụng nữa. 
Cú pháp: 
 Tên_biến = (tên_kiểu*)malloc(số_byte); 
Trong đó: 
 Số_byte = số lượng * sizeof(kiểu) 
Ví dụ: 
 int *a =(int*)malloc(100*sizeof(int)); 
sẽ tạo ra một vùng nhớ để chứa 100 số nguyên và được trỏ bởi biến 
trỏ a. 
Hàm giải phóng vùng nhớ 
 free(tên_biến_trỏ); 
Bài tập 
 Khai báo 1 biến nguyên a và biến trỏ kiểu nguyen p, cho p trỏ đến a. 
in ra màn hình địa chỉ của a, nội dung trong p, địa chỉ của biến trỏ p. 
 #include 
#include 
#include 
void main() 
{ 
 int a, *p; 
 clrscr(); 
 p=&a; 
 printf("\nDia chi cua bien nho a= %x",&a); 
 printf("\nNoi dung cua bien tro p= %x",p); 
 printf("\n dia chi cu bien tro p= %x",&p); 
 getch(); 
 56
} 
Viết chương trình nhập vào từ bàn phím n số nguyên, cấp phát một vùng 
nhớ động để lưu trữ n số nguyên đó, hiện các số vừa nhập, tính tổng, trung 
bình cộng, max, min của dãy số đó. 
#include 
#include 
#include 
void main() 
{ 
 clrscr(); 
 int *a,n ,i; 
 printf("\n nhap so luong phan tu n= "); 
 scanf("%d",&n); 
 // cap phat bo nho 
 a=(int*)malloc(n*sizeof(int)); 
 //nhap du lieu 
 for(i=0;i<n;i++) 
 { 
 printf("\n Nhap so thu %d ",i+1); 
 scanf("%d",a+i); 
 } 
 // hien du lieu 
 printf("\n day so vua nhap la: "); 
 for(i=0; i<n; i++) 
 { 
 printf(" %d",*(a+i)); 
 } 
 //tinh tong 
 int tong=0; 
 for(i=0; i<n; i++) 
 { 
 tong=tong+ *(a+i); 
 } 
 printf("\n tong cua day so do la: %d",tong); 
 //tinh tb cong 
 57
 printf("\n Trung binh cong cua day do la: %f",tong/(n*1.0)); 
 // tim max 
 int max= *a; 
 for(i=0; i<n; i++) 
 { 
 if(max< *(a+i)) 
 max= *(a+i); 
 } 
 printf("\n so lon nhat la: %d",max); 
 //tim min 
 int min = *a; 
 for(i=0; i<n; i++) 
 { 
 if(min >*(a+i)) 
 min = *(a+i); 
 } 
 printf("\n so nho nhat la: %d", min); 
 getch(); 
} 
            Các file đính kèm theo tài liệu này:
 de_cuong_ngon_ngu_c_827.pdf de_cuong_ngon_ngu_c_827.pdf