Tải bản đầy đủ (.pdf) (20 trang)

Ôn tập các kiến thức cơ bản về lập trình C

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (580.44 KB, 20 trang )

Bách khoa Online: hutonline.net

Bách Khoa Online: hutonline.net

Tìm kiếm & download ebook: bookilook.com


Bỏch khoa Online: hutonline.net

ôn tập CáC KIếN THứC CB Về LậP TRìNH C
[]

A.CáC PHầN Tử Cơ BảN:


Các phép tính:
ã Phép toán cơ bản: + , - , * , / , %(lấy phần d).
ã Phép toán tăng giảm: x++ hay ++x ( x--,--x): tăng (giảm) x xuống 1 đơn
vị.
ã Phép toán trên Bit: & (and), | (or), ^ (XOR), << (dịch trái), >> (dịch
phải).
ã Biểu thức điểu kiện: cú pháp: BT1? BT2: BT3

(BT: Biểu thức). Nếu

BT1 đúng(<>0) thì BT điều kiện trên = giá trị của BT2 ngợc lại = giá trị của
BT3 nếu BT1 sai (=0). VD: printf(Min of a & b: %d,aa:b);


Kiểu dữ liệu:


ã int (-32768 ... 32767) (2 hoặc 4 Byte);
ã char (-128 ... 127)

unsigned int (0 ... 65535).

(1 Byte); unsigned char (0 ... 255).

• long (-2147483648 ... 2147483647) (4 Byte). unsigned long (0 ...
4294967297).
• float (3.4 E-38 ... 3.4E+38) (4 Byte).
• double (1.7E-308 ... 1.7E+308) (8 Byte). long double (3.4E-4932 ...
1.1E4932).
ã Định nghĩa kiểu với typedef: typedef khaibáo.... VD: tạo một kiểu ma
trận kích thớc [20][20] với tên l matrix : typedef

float

matrix[20][20];


Biến, hằng số:
ã Khai báo biến: kiểudữliệu

tênbiến; hay kiểudữliệu

tênbiến =

giátrịkhởiđầu;
ã Khai báo hằng số: const type NAME=giátrị; hay


#define tênhằngsố

gíatrị;
ã VD: const float Pi=3.14;
HTD (TH0003)

C Programming (Se)

#define Pi 3.14;
Page: 1


Bỏch khoa Online: hutonline.net


Các hm cơ bản : (Các hm kiểm tra đựơc khai báo trong <ctype.h>).
ã

fabs(x): lấy giá trị tuyệt đối.

ã sin(x), cos(x), tan(x): lấy sin, cos, tang

ã log(x): tÝnh ln(x).
• log10(x): tÝnh lg(x).
• pow(x,n): tÝnh x mị n (xn).

của x.
ã floor(x): Lấy phần nguyên của số x.

ã M_PI: H»ng sè Pi.


• exp(x): tÝnh e mị x (ex).
• flushall(): xoá bộ đệm bn phím.
ã void calloc(unsigned n, unsigned size): cấp phát vùng nhớ n*size byte,
nếu thnh công hm trả về địa đầu vùng nhớ đợc cấp, ngợc lại trả về
NULL. Để giải phóng vùng nhớ đợc cấp phát bởi malloc hay calloc do pt
trá tíi ta dïng : void free(void *pt); <alloc.h>


int getchar(void): nhËn mét ký tù tõ bμn phím (stdin), trả về ký tự nhận
đợc.

ã

int random(int n): cho một giá trị ngẫu nhiên từ 0 ... n-1. <stdlib.h>

ã

int tolower(int c): đổi ký tự chữ hoa sang chữ thừơng. <ctype.h>

ã

int toupper(int c): đổi ký tự chữ thờng sang chữ hoa.<ctype.h>

ã

int isalnum(int c): kiểm tra c có phải l ký tự alphanumeric? (chữ cái hay
số).

ã


int isalpha(intc): kiểm tra c có phải l chữ cái không?

ã

int isdigit(int c): kiểm tra c có phải l chữ số không?

ã

Int ispunct(int c): kiểm tra c có phải l ký tự chấm câu không?

ã

int isxdigit(int c): kiểm tra c có phải l chữ số hệ 16 không?

ã

int isupper(int c): kiểm tra c có phải l chữ hoa (từ A đến Z) không.

Chi chú: Các hm kiểm tra nếu thoả thì trả về giá trị <>0, ngợc lại trả về 0.
Tên biến = Biểuthức / biến;



Phép gán:



Xuất nhập dữ liệu:
ã Xuất: printf(ký tự điều khiển,bt1,bt2,...);

Trong đó danh s¸ch biĨu thøc cã thĨ bao gåm biĨu thøc, số, hay văn bản,
các đối tợng phải cách nhau bởi dÊu phÈy.
Vd: printf( “Nam %d la the ky %d: ”, 1999+2, 40/
2);

HTD (TH0003)

C Programming (Se)

Page: 2


Bỏch khoa Online: hutonline.net


ã Nhập:

Nam 2001 la the ky 20

scanf(các



tự

định

dạng,biến1,

biến2,...).


scanf(%d%d,&a,&b);

b.Cấu trúc điều kiện, rẽ nhánh v vòng lặp:


if (bieuthuc) lệnh1;
hay if (bieuthuc) lƯnh1;
else lƯnh2;
Trong cÊu tróc thø 1, nÕu bieuthuc cho giá trị khác 0 thì thực hiện lệnh1 v =0 thì

thôi, còn trong cấu trúc thứ 2 nếu bieuthuc cho giá trị khác 0 thì thực hiện lệnh1 v =0
thì thực hiện lệnh2. Chú ý l trong thân if v else chỉ l 1 câu lệnh đơn, nếu có nhiều
lệnh thì phải lồng vo {...};


switch (biểu thức)
{
case x: lệnh; break;
..........
case n: lƯnh; break;
default :lƯnh; break;
}
ý nghÜa: c©u lƯnh rÏ nhánh switch sẽ tính giá trị của biểu thức v thực hiện lệnh
tơng ứng trong case no có giá trị ny. Nếu không có giá trị trong case no = giá
trị của biểu thức thì thực hiện lệnh sau default.



for (biếnđkh[= giá trị đầu]; điều kiện ; phép toán thay đổi giá trị biến đkh ) lệnh

;
Nếu có nhiều lệnh thì phải lồng vo {... };



while (biểu thức) lệnh; Nếu cã nhiỊu lƯnh th× lång vμo{... };
ý nghÜa: Trong khi biĨu thøc <>0 th× thùc hiƯn lƯnh.

‰

do lƯnh while(biĨu thøc) ; NÕu cã nhiỊu lƯnh th× lång vμo {}.
ý nghÜa: Thùc hiƯn lƯnh nhiỊu lÇn trong biĨu thøc <>0 .

‰

goto v nhÃn: (NhÃn (handle) có dạng nh tên biến, đứng tr−íc dÊu 2 chÊm :)

HTD (TH0003)

C Programming (Se)

Page: 3


Bỏch khoa Online: hutonline.net

Cú pháp: goto nhÃn; Khi gặp dòng ny máy sẽ nhÃy đến câu lệnh có nhÃn viết
sau từ khoá goto.

CONTINUE, BREAK V SIZEOF:

o Câu lệnh continue dùng để bắt đầu một vòng lặp mới của chu trình bên trong
nhất chứa nó. Trong thân for máy sẽ chuyển đến bớc khởi đầu kế tiếp. Còn
trong while v do while máy sẽ chuyển đến xác định giá trị biĨu thøc sau while
vμ tiÕn hμnh kiĨm tra ®iỊu kiƯn kết thúc vòng lặp, (continue không dùng cho
switch).
o Câu lệnh break cho phÐp ta tho¸t khái for, while, do while v switch. Khi có
nhiều vòng lặp lồng nhau, break sẽ đa ra khỏi vòng lặp hay switch bên trong
nhất.
o Toán tư sizeof cho kÝch th−íc (byte) cđa mét kiĨu hay một đối tợng dữ liệu,
cú pháp:
sizeof(kiểudữliệu) hay sizeof(đốitợngdữliệu). Các kiểu dữ liệu nh int, char,
float, kiểu tự định nghĩa,... Các đối tợng dữ liệu nh mảng, cấu trúc, biến,...
Thờng dùng để xác định số phần tử của mảng khi đợc khởi đầu:
int a[]={1,2,3,4,5,6};
int spt=sizeof(a)/sizeof(int);
C. Hm (FUNCTION):


Định nghĩa Hm:
<Kiềudữliệu / void> TênHm (Danhsáchthamsố)
<Khai báo kiểu cho các tham số>;
{Khai báo biến cục bộ v thân hm};



Sử dụng Hm:
Tên hm (Danhsáchcácthamsốthựcnếucó);




Truyền tham số:
+ Truyền bằng trị: đây l chế độ truyền tham số mặc định của C. Với cách truyền
ny giá trị của tham số thực sẽ không bị thay đổi sau khi hμm thùc hiƯn.
+Trun b»ng biÕn: tøc mn trun c¶ nội dung lẫn địa chỉ của biến. Khi đó ta
phải sư dơng biÕn con trá.

HTD (TH0003)

C Programming (Se)

Page: 4


Bỏch khoa Online: hutonline.net

D. Mảng (Array):


Mảng 1 chiều:
ã Khai báo tờng minh: Kiểu tenmang[số phần tử] ;
ã Khai báo không tờng minh: Kiểu tenmang []; Cách khai báo ny đợc sử
dụng trong các trờng hợp: vừa khai báo vừa gán trị (vd: int a[]={1,2,3,7};
), mảng l tham số hm (vd: int nhapmang(int a[],int n, int m) ;).
ã Xuất/ nhập mảng: ta dùng vòng lặp for(vd for (i=1; icó thể tạo một hm để nhập mảng với số phần tử không biết trớc, kết thúc
khi nhập số 0.
void nhap(int a[], int*n)
{
for (*n=0;*n<20,(*n)++)
{

printf(A[%d]:,*n);
scanf(%d,&a[*n]);
if (a[*n]==0) break;
}
}
ã Sắp xếp mảng giảm dần (Buble sort).
for (i=0;ifor (j=i+1;jif (A[i]{
tam=A[i];
A[i]=A[j];
A[j]=tam;
}



Mảng 2 chiều:
ã Khai báo tờng minh: Kiểu tenmang[sốcột][sốdòng] ; Vd: a[20][10];
ã Khai báo kh«ng t−êng minh: KiĨu tenmang [ ][sècét] ; sư dơng cách ny
trong các trờng hợp: vừa khai báo vừa gán trị(Vd: int a[][3]={{1,2,3},{-1,2,-3}};), mảng l tham số hm( Vd: void nhap(a[][max], int n);).

HTD (TH0003)

C Programming (Se)

Page: 5


Bỏch khoa Online: hutonline.net


ã Xuất/ nhập mảng: ta dùng 2 vòng lặp for I:=1 to n do for j:=1 to m do...
Chú ý l ta không thể dùng phép toán địa chỉ để nhập các phần tử của mảng
hai chiều (ngoại trừ mảng kiểu int), m phải thông qua một biến tạm trung
gian.
ã Thao tác: (i: đkh dòng, j: đkh cột, n: số dòng)
+Đờng chéo:

+Các phần tử đối xứng:
-Qua đờng chÐo chÝnh: a[i][j] vμ a[j][i].
-Qua ®−êng chÐo phơ: a[i][j] vμ a[n-j-1][n-i-1].
-Qua tâm: a[i][j] v a[n-i-1][n-j-1].
ã Duyệt ma trận:
+ Nữa trên ®/c chÝnh:
for (i=0; ifor (j=i+1; j+ N÷a d−íi ®/c chÝnh:
for (i=1; ifor (j=0; j+ Nữa trái ma trận:
for (i=0; ifor (j=0; j+ Nằm trên đờng chéo chính:
for (i=0; ivới a[i][i] l các pt trên đ/c chính.
+ Đ/C song song với ®/c chÝnh:
for (i=0; ivíi a[i][i+k] lμ c¸c pt // víi ®/c chÝnh.

E. Con Trá (Pointer):

HTD (TH0003)

C Programming (Se)

Page: 6


Bỏch khoa Online: hutonline.net


Khai báo:
+ <Kiểu dữ liệu> *Tên_con_trỏ; Vd:

int *pt,*x;

+ Mảng con trỏ: <Kiểu dữ liệu> *Tên_con_trỏ[sốphầntửmảng]; Vd:

int

*pt[10];
+ Hm con trỏ: *Tên_hm (Danh sách các tham số)...;


Các phép toán trên con trỏ:
+ Phép gán: khi thực hiện phép gán cho biến con trỏ thì biểu thức bên phải phép
gán phải có giá trị l địa chỉ của một biến hay m¶ng vμ ph¶i cïng kiĨu víi kiĨu con
trá.
Vd:

int x,*pt; ...


p=&a;

+ PhÐp to¸n lÊy néi dung cđa biÕn do con trỏ chỉ đến(*): *tên_biến_con_trỏ. VD:
y=*x;
+ Phép toán tăng giảm: pt++,pt--; Chú ý trong phép toán ny l mỗi lần tăng
(giảm) l tăng (giảm) kích thớc của kiểu dữ liệu m nó trỏ đến (chứ không phải l
một đơn vị).


Con trỏ lμ tham sè Hμm: NÕu mét hμm cã tham sè lμ kiĨu con trá th× khi trun
tham sè nμy cho hm phải truyền địa chỉ của biến có kiểu tơng øng.
Vd:

‰

void input (int a[], int*x); Gäi hμm: input (a,&x);

Con trá v mảng:
+Mảng một chiều:
ã Đối với mảng một chiều khi sử dụng mảng nếu chỉ ghi tên mảng m không
ghi chỉ số thì có nghĩa l địa chỉ của phần tử thứ zero của mảng.( array <=>
&array[0]).
ã Khi một hm có tham số l mảng thì khi gọi hm ta chỉ truyền tên của mảng,
không phải ghi chỉ số mảng. Vd: input (a , n); nhËp m¶ng A gåm n phần tử.
+Mảng nhiều chiều:
ã Đối với mảng hai chiều khi sử dụng mảng nếu chỉ ghi tên mảng m không
ghi chỉ số thì có nghĩa l địa chỉ của hng đầu tiên trong ma trận. (a &a[0]
(&a[0][0]).
ã Không thể dùng phép toán địa chỉ để nhập cho mảng hai chiỊu (ngo¹i trõ

kiĨu int).

HTD (TH0003)

C Programming (Se)

Page: 7


Bỏch khoa Online: hutonline.net

ã Không thể dùng biến con trỏ để nhập cho mảng hai chiều.
Giải pháp cho trờng hợp ny l ta nhập thông qua một biến tạm sau đó gán lại
biến tạm ny cho cho phần tử tơng ứng của mảng.

F. CHUổI (string):


Khai báo: tơng tự nh khai báo mảng ta cũng có hai cách khai báo l khai báo
tờng minh v không tờng minh:
char tenchuoi [chiều di thực+1];
char tenchuoi [ ];



Các thao tác trên kiểu chuổi:
+ Nhập:
ã LƯnh scanf(“%s”,tenchuoi); LƯnh nμy kh«ng thĨ nhËp vμo mét chi có
chứa ký tự khoảng trắng, tab, enter, v để lại ký tự \n trong bộ đệm bn
phím.

ã Lệnh gets(tenchuoi); Đợc khai báo trong string.h. Lệnh ny có thể nhập
đợc chuổi có khoảng trắng, kết thúc khi gặp ký tự xuống dòng(\0).
+ Xuất:
ã Lệnh printf(%s,tenchuoi);
ã Lệnh puts(tenchuoi); Xuất chuổi v xuống dòng.
+ Gán chuổi:
Muốn sử dụng phép gán chuổi ta phải sử dụng biến con trỏ v hm calloc để
cấp phát vïng nhí cho biÕn nμy.
Vd:

char *str;
str=calloc(40,sizeof(char));
str=“MediaSpace Club”;...

ˆ

C¸c hμm th−êng dïng với kiểu chuổi, ký tự: (phần lớn đợc khai báo trong
“string.h”).
• strcat( char*dest, char *scr): nèi chi dest víi chi scr;
ã strspn(*str, *str_con): cho độ di đoạn đầu tiên lớn nhất của str m mọi ký tự
của đoạn đều có mặt trong chuỗi str_con.
ã strlen(char *str): cho chiều di thực cđa chi str.
• char *strupr(char *s): chun chi tõ ký tù th−êng sang HOA.

HTD (TH0003)

C Programming (Se)

Page: 8



Bách khoa Online: hutonline.net

• char *strlwr(char *s): chun chi tõ ký tự HOA sang thờng.
ã char *strrev(char *s): đảo ngợc cả chuổi trừ ký tự kết thúc(\0).
ã char *strcpy(char *dest, char *scr): sao chÐp toμn bé chi src sang chi
dest.
• char *strncpy(char *dest, char *scr,n): sao n ký tự đầu cđa chi src sang
chi dest.
• char *strchr(char *str, int c): tìm sự xuất hiện đầu tiên của c trong str. Nếu
tìm thấy hm trả về địa chỉ của ký tự tìm đợc trong str, ngợc lại trả về
NULL.
ã char *strstr(char *str, char *str_con): tìm sự xuất hiện đầu tiên của str_con
trong str. Nếu thấy, hm cho địa chỉ của chuỗi con (trùng với str_con) trong
str, ngợc lại hm trả về NULL.
ã char *strbrk(char *s1, char *s2): duyệt trong s1 để tìm ký tự đầu tiên khớp
với bất kỳ ký tự no của s2. Nếu có xuất hiện, hm cho địa chỉ của ký tự tìm
thấy trong s1, ngựơc lại hm trả về NULL.
ã int strcmp(char *s1, char *s2): so sánh 2 chi theo thø tù, hμm tr¶ vỊ < 0
nÕu chuỗi s1 < chuỗi s2 ; = 0 nếu chuỗi s1 = chuỗi s2 ; >0 nếu chuỗi s1 lớn
hơn chuỗi s2.
ã int stricmp(char *s1, char *s2): giống nh strcmp nhng không phân biệt
chữ HOA, chữ thờng khi so sánh.
ã int memcmp(char *s1, char *s2, unsighed n);
So s¸nh chi s1 v s2 một cách chính xác, phân biệt HOA thờng trong phạm
vi n byte v trả về: <0 nếu s1 nhá h¬n s2; = 0 nÕu s1 trïng s2 ; >0 nếu s1 lớn
hơn s2.
ã char * strncat(char *s,char *s1,int n): ghép n ký tự đầu tiên của s1 vo s.
ã char *itoa(int x,char *s,int cs): Chuyển số nguyên x trong hệ đếm cơ số cs
(cs=10: hệ 10, cs=8:hệ 8, cs=16:hệ 16) sang chuỗi v lu vo vùng nhớ s. Hm

trả về địa chỉ của vùng s . (stdlib.h)
ã int atoi(char *s): chuyển chuỗi s sang giá trị int.
ã long atol(char *s): chuyển chuỗi s sang giá trị long.

HTD (TH0003)

C Programming (Se)

Page: 9


Bỏch khoa Online: hutonline.net

G. CấU TRúC (STRUCTURE):


Định nghĩa kiểu v khai báo biến tách biệt:
+ Định nghĩa kiểu:
struct tên_cấu_trúc
{
kiểu tên_thnh_phần 1;
kiểu tên_thnh_phần 2;...
kiểu tên_thnh_phần n;
};
+ Khai báo biến:
struct tên_cấu_trúc biến_1, biến_2,...,biến_n;
+ Mảng cấu trúc:

struct tên_cấu_trúc tênmảng[spt];


chúng ta cũng có thể sử dụng typedef trớc từ khoá struct để định nghĩa kiểu cấu
trúc, khi đó muốn khai báo biến ta không cần đặt struct trớc tên_cấu_trúc.


Định nghĩa kiểu v khai báo biến kết hợp:
struct tên_cấu_trúc
{
các thnh phần cấu trúc giống nh trên;
} biến_1,biến_2,...,biến_n;



Truy xuất đến các thnh phần cấu trúc:
+ Đơn giản:

biến_cấu_trúc.biến_thnh_phần;

+ Phức tạp:

biến_cấu_trúc.biến_cấu_trúc_2.biến_thnh_phần;

đợc

sử

dụng khi biến cấu trúc 2 l thnh phần trực tiếp của một biến câu trúc lớn hơn (Cấu
trúc lồng nhau).


Một số phép toán cơ bản trên kiểu cấu trúc:

các thao tác trên biến cấu trúc phải đợc thực hiện thông qua các thnh phần của nó
(ngoại trừ phép gán). Thao tác trên các thnh phần của cấu trúc cũng nh thao tác
trên các biến có kiểu tơng øng. Vd:
+ NhËp: scanf(“%s”,&nhanvien.ten);
+ XuÊt: printf(“\n Ten nhan vien la: %s.”,nhanvien.ten);
+ Céng: luong=nhanvien1.luong + nhanvien2.luong;

HTD (TH0003)

C Programming (Se)

Page: 10


Bách khoa Online: hutonline.net

+ G¸n: ta cã thĨ g¸n hai biến cấu trúc cho nhau; gán biến cho phần tử mảng; gán
phần tử mảng cho biến; gán hai phần tử mảng cho nhau. Điều cần lu ý l các biến
v các phần tử mảng phải cùng kiểu.
+ Khởi tạo giá trị đầu cho cấu trúc: ta khởi tạo giá trị b»ng c¸ch viÕt vμo sau
khai b¸o cđa chóng c¸c gi¸ trị của các thnh phần.
Vd: struct nhanvien2{Nguyen Van A, 1990, 500000};
‰

Con trá kiĨu cÊu tróc:
+ Khai b¸o:

kiĨu_cÊu_tróc

+ Truy xt:


cã 2 cách truy xuất đến thnh phần của biến con trỏ:

*tên_biến_con_trỏ;

-

Tên_biến_con_trỏ -> tên_thnh_phần

-

(*Tên_biến_con_trỏ).tên_thnh_phần

8. KIểU Tập TIN (FILE):


Khai báo: FILE *fp; // Khai báo biến con trỏ kiểu File với tên fp



MÃ chuyển dòng v kết thúc File:
ã Mà chuyển dòng: Đối với File mở theo kiểu nhị phân mà chuyển dòng l mÃ
10 (LF), còn với kiểu văn bản sẽ l mà 13 v 10.
ã Mà kết thúc: khi gặp mà kết thúc hm feof(fp) cho giá trị <>0. Trong khi ®äc
nÕu gỈp ký tù cã m· 26 hc ký tù cuối cùng trong File, ta sẽ nhận đợc m kết
thúc File EOF (số -1).



Đóng mở File v đọc ghi dữ liệu:

ã Mở File: FILE *fopen(const char *tênfile, const char*kiểu); Hm dùng để
mở một File, nếu thnh công trả về con trỏ kiểu File ứng với File vừa mở, ngợc
lại trả về NULL. Trong đó đối số kiểu mang các giá trị sau:
+ Kiểu văn bản: r(read), w(write), a(append), r+, w+ . a+.
+ Kiểu nhị phân: rb, wb, ab, r+b, w+b, a+b. (Ctrl+F1->detail).
ã Đóng File: int fclose(FILE *fp); Với fp l con trỏ tơng ứng với File cần đóng.
Để đóng tất cả các File đang mở ta dùng hm: int fcloseall(void); Nếu thnh
công 2 hm ny cho giá trị <> 0, ngợc lại trả về EOF.
ã Ghi ký tự: int putc(int ch, FILE *fp); int fputc(int ch, FILE *fp); Víi ch l
giá trị nguyên, fp l con trỏ File. Hm ny sÏ ghi vμo file mét ký tù cã m· =

HTD (TH0003)

C Programming (Se)

Page: 11


Bách khoa Online: hutonline.net

ch%256. NÕu thμnh c«ng tr· vỊ m· ký tự đợc ghi, ngợc lại trả về EOF. Lm
việc với Text&Binary.
ã Đọc ký tự từ File: int getc(FILE *fp); int fgetc(FILE *fp); Hμm ®äc mét ký
tù tõ File fp, nếu thnh công hm cho mà đọc đợc (0 ... 255), ngợc lại trả về
EOF.
ã Ghi dữ liệu theo khuôn d¹ng: int fprintf(FILE *fp, const char *control, ...);
Víi fp lμ con trỏ File, control chứa địa chỉ của chuổi điều khiĨn (gièng nh−
trong hμm printf), ... lμ danh s¸ch c¸c đối m giá trị của chúng cần ghi vo File.
VD: fprintf(fp,\n this year: %d,iYear);
ã Đọc dữ liệu theo khuôn dạng: int scanf(FILE *fp, const char *control,...);

Víi fp lμ con trá File, control chứa địa chỉ của chuổi điều khiển (giống nh
trong hm printf), ... l danh sách các đối chứa kết quả đọc đợc từ File.
VD:

fscanf(fp,%d%f,&ia,&fa);

ã Ghi chuổi ký tự: int fputs(const char *s, FILE *fp); Víi s lμ con trỏ chỉ tới
địa chỉ đầu của một chuổi ký tự kÕt thóc b»ng ‘\0’. Hμm sÏ ghi chi s lªn File
fp, nếu thnh công trả về ký tự cuối cùng đợc ghi vo File, ngợc lại trả về
EOF.
ã Đọc chuổi (d·y) ký tù tõ File: char *fgets(char *s, int n, FILE *fp); Víi s
lμ con trá kiĨu char trá tíi vïng nhí ®Ĩ chøa chi ®äc tõ File, n lμ số nguyên
xác định độ di cực đại của dÃy cần ®äc, fp lμ con trá File. Hμm sÏ ®äc mét d·y
ký tù tõ File fp vμo vïng nhí s, nÕu thnh công hm trả về địa chỉ vùng nhận kết
quả,

ngợc

lại

tr

về

NULL.

VD:

while(!eof(fp))


fgets(s,256,fp);
ã Ghi một số nguyên theo kiểu nhị phân: int putw(int n, FILE *fp); Với n l
giá trị nguyên, fp l con trỏ File. Nếu thnh công hm trả về số nguyên đợc
ghi, ngợc lại trả về EOF.
ã Đọc một số nguyên theo kiểu nhị phân: int getw(FILE *fp); Với fp l con trỏ
File. Hm đọc một số nguyên(2 byte), nếu thnh công trả về số nguyên đọc
đợc, khi có lỗi hoặc cuối File hm trả về EOF.
ã Ghi các mẫu tin lªn File: int fwrite( void *pt, int size, int n, File *fp); Víi pt
lμ con trá trá tíi vïng nhớ chứa dữ liệu cần ghi, size l kích thớc cña mÉu tin
(byte), n lμ sè mÉu tin, fp lμ con trá File. Hμm sÏ ghi n mÉu tin kÝch th−íc size
HTD (TH0003)

C Programming (Se)

Page: 12


Bách khoa Online: hutonline.net

byte tõ vïng nhí pt lªn File fp. Hm trả về một giá trị = số mẫu tin thực sự đợc
ghi.
ã Đọc các mẫu tin từ File: int fread( void *pt, int size, int n, File *fp); Víi pt
lμ con trá trá tíi vïng nhí chøa d÷ liệu đọc đợc, size l kích thớc của mẫu tin
(byte), n l số mẫu tin cần đọc, fp l con trá File. Hμm sÏ ®äc n mÉu tin kÝch
th−íc size byte tõ File fp vμo vïng nhí pt. Hμm tr¶ về một giá trị = số mẫu tin
thực sự đọc đợc. Các hm fread, fwrite thờng dùng để đọc ghi các đối tợng
có cùng độ lớn nh cấu trúc, số thực,...


Một số hm khác thao tác trên FILE: (cấp II)

ã int fflush(FILE *fp); lm sạch vùng đệm File fp, thnh công ->0, ngợc lại >EOF.
ã int fflushall(void); lm sạch vùng đệm của các File đang mở, nếu thnh công
hm trả về giá trị số tệp đang mở, ngợc lại trả vè EOF.
ã int ferror(FILE *fp); dùng kiểm tra lỗi thao tác trên File fp. Hm trả về giá trị
<>0 nếu có lỗi, ngợc lại trả về 0.
ã void perror(const char *s); in chuổi s v thông bo lỗi hệ thống.
ã int unlink(const char *filename); xoá một File trên đĩa, nếu thnh công hm
cho giá trị 0, ngợc lại trả về EOF.
ã void rewind(FILE *fp); chuyển con trỏ chỉ vị của File fp về đầu File.
ã int fseek(FILE *fp, long sb, int xp); di chun con trá chi vÞ cđa File fp từ vị
trí xác định xp qua |sb| byte. Chiều di chun lμ vỊ ci tƯp nÕu sb>0 vμ ci tệp
nếu sb<0. Khi thnh công hm trả về 0, ngợc lại hm trả về giá trị <>0. Không
nên dùng trên kiểu văn bản vì sự chuyển vị sẽ thiếu chính xác. xp cho biết vị trí
xuất phát, có thể nhận các giá trị: 0 (xuất phát từ đầu tệp), 1 (từ vị trí hiện tại
của con trỏ chuyển vị), 2 (xuất phát từ cuối tệp).
ã long ftell(FILE *fp); trả về vị trí hiện tại của con trỏ chỉ vị (byte) đợc tính từ
0. Nếu có lỗi hm trả về -1L.

9. mn hình văn bản v âm thanh:


Mn hình văn bản:

HTD (TH0003)

C Programming (Se)

Page: 13



Bách khoa Online: hutonline.net

• void textmode(int mode); chän mode mμn hình văn bản, mode bao gồm
LASTMODE, BW40, C40, BW80, C80, MONO. (conio.h). Các giá trị của
mode đợc mô tả trong help online víi index lμ text_modes.
• void textbackground( int color); đặt mu cho nền (cửa sổ).
ã void textcolor(int color); đặt mu chữ. Với color mang giá trị từ 0-15 hay các
hằng số định nghĩa sẵn nh: BLACK, WHILE, BLUE, RED, CYAN,
YELLOW, BROWN,.. Các giá trị của color đợc trình by trong help online
víi index lμ COLORS.
• void window(int xtr, int ytr,int xd,int yd); thiÕt lËp mét cưa sỉ víi gãc trên
trái (xt, yt) v dới phải (xd, yd). Chú ý r»ng nªn dïng hμm cprintf vμ scanf thay
cho printf vμ scanf sẽ cho một mn hình đẹp hơn.
ã void clrscr(void); xoá cửa sổ hiện tại, đa con trỏ về góc trên trái của cửa sổ.
ã void clreol(void); xoá đến cuối dòng trong cử sỗ.
ã void gotoxy(int x, int y); chuuển con trỏ đến vị trí x,y trong cửa sổ
ã int wherex(void), wherey(void); cho biÕt vÞ trÝ ngang, däc cđa con trỏ trong
cửa sổ.


Âm thanh:
ã sound(n): Dùng loa CPU phát ra một âm thanh với tần số n.
ã delay( m): Kéo dμi mét nèt nh¹c trong thêi gian lμ m mili giây.
ã nosound(): Tắt âm thanh đà phát.

Dùng các hm trên chúng ta sẽ phát ra các âm thanh l các note nhạc với cao độ l n v
trờng độ m. Sau đây l 7 tần số tơng ứng với 7 note nhạc cơ bản ờ quÃng tám thứ I:
Đô: 132

♦ MI: 164


♦ SOL: 192

♦ Rª: 146

♦ FA: 172

♦ LA: 216

SI: 244

Đề đợc note thăng ta lấy (note thờng t−¬ng øng céng víi note cao h¬n kÕ tiÕp)/2, vμ
note giáng thì cũng lấy (note thờng tơng ứng cộng với note thấp hơn kế tiếp)/2.Đối
với các note ở các quảng tám cao hơn hay thấp hơn thì ta chỉ việc nhân hay chia đôi
các note tơng ứng. Các note lặng ta sẽ phát một note với tần số khoảng 30.000Hz
(Siêu ©m).
HTD (TH0003)

C Programming (Se)

Page: 14


Bỏch khoa Online: hutonline.net

VD: Rê#=(Rê+Mi)/2; Rêb(Rê giáng)=(Rê+Đô)/2; Đố=Đô*2;...
Về trờng độ ta lấy note Đen lm chuẩn, v qui định trờng độ của các note khác
(note móc, nốt tròn, đen chấm, tròn chấm,...) theo qui tắc nhạc lý v lấy theo chuẩn
của note Đen. Thông thờng với tiết tấu trung bình thì note Đen đợc qui định
khoảng từ 300-400, tuỳ theo tiết tấu nhanh hay chậm của mỗi bi hát cụ thể m ta

qui định cho hợp lý.
10. đồ hoạ:


Khởi động chế độ Đồ hoạ:

void initgraph(int *graphdriver, int *graphmode, char *driverpath); Với
driverpath l đờng dẫn chứa các file điều khiển đồ hoạ (thừơng l
C:\\BorlandC\\Bgi), graphdriver v graphmode dùng xác định mn hình v kiểu đồ
hoạ sẽ sử dụng. Nếu không biết kiểu mn hình đang sử ta sử dụng DETECT cho
graphdriver để chơng trình tự nhận dạng, Các giá trị của graphriver đợc trình by
trong help online với index l graphics_rivers vμ graphics_modes.
VD: #include <stdio.h>;
#include <conio.h>;
#include <graphics.h>;
main()
{
int gr_drive = DETECT, gr_mode;
initgraph(&gr_drive, &gr_mode, "c:\\tc\\bgi");
outtext("Graphic example");
getch();
}


Các hm thờng dùng:

ã Lỗi đồ hoạ: phát sinh khi khởi động chế độ dồ hoạ v khi dùng các hm. Hm int
graphresult( void) trả về lỗi khi phát hiện, hm char grapherrormsg(int
errorcode) trả về thông bo lỗi do graphresult phát hiện. Các mà lỗi của
graphresult đợc trình bμy trong help online víi index lμ graphics_errors.

• Chän mμu nỊn: void setbkcolor(int color);
• Chän mμu nÐt: void setcolor( int color);
HTD (TH0003)

C Programming (Se)

Page: 15


Bỏch khoa Online: hutonline.net

ã Chọn mẫu v mu tô: void setfillstyle( int pattern, int color); Các giá trị của
pattern(mẫu tô) đợc trình by trong help online với index l fill_parttens.
ã Chän mÉu cho nÐt: void setlinestyle(int linestyle, int pattern, int thickness);
cho phép ta qui định 3 yếu tố l kiểu linestyle(0[nÐt liỊn],1[nÐt chÊm], 2[nÐt chÊm
g¹ch], 3[nÐt g¹ch], 4[mÉu tù t¹o]) bỊ dμy thickness(1[b×nh th−êng[, 3 [dμy gÊp ba]
vμ mÉu tù tạo patern (nếu qui định linestyle l 4). Để nhận giá trị hiện hnh cua 3
yếu tố trên ta dùng hm void getlinesettingstyle(struct linesettingtype, *
linenifo); , Cách định nghĩa mẫu tự tạo v cấu trúc của linesettingtype đợc trình
by trong help online với index l setlinestyle v linesettingstyle.
ã Thay đổi giải mu mặc định: void setpalette(int colornum, incolor);
ã Xác nhận gi¶i mμu hiƯn hμnh: void palette(struct palettetype *palette); CÊu
tróc cđa palettetype đợc trình by trong help online với index l palettetype.
ã Các hm getcolor(), getbkcolor() v getmaxcolor() trả về mu đà xác định với
setcolor, setbkcolor, v số lợng mu cực đại thụôc dÃy mu hiện hnh.
ã Vẽ cung tròn: void arc(int x, int y, int gocdau, int goccuoi, int bankinh); Góc:
độ.
ã Vẽ đờng tròn: void circle(int x, int y,int bankinh);
ã VÏ cung ellipse: void ellipse(intx, int y, int gocdau, int goccuoi, int xr, int yr);
Víi xr lμ b¸n trơc ngang v yr l bán trục đứng.

ã Vẽ v tô hình qu¹t: void pieslice(int x, int y, int gocdau, int goccuoi, int
bankinh);
ã Vẽ đờng gấp khúc v đa giác: drawpoly(n,a); Với n l số điểm, a l mảng kiểu
int chứa toạ ®é cđa c¸c ®iĨm( a[0]=x1, a[1]=y1, a[2]=x2, a[3]=y2,...). NÕu nÕu
®iĨm cuối xn, yn trùng với điểm đầu x1, y1 ta sẽ đợc một đa giác.
ã Tô mu đa giác: fillpoly(n,a); hm ny sẽ tô mu 1 đa giác có các n đỉnh.
ã Vẽ đờng thẳng: void line(int x1, int y1, int x2, int y2); Vẽ đờng thẳng nối hai
điểm (x1,y1) v (x2,y2) nhng không lm thay đổi vị trí con trỏ. Hm void
lineto(int x, int y); Vẽ đờng thẳng từ ®iĨm hiƯn t¹i tíi (x,y) vμ chun con trá ®Õn
®iĨm (x,y). Hμm void linerel(int dx, int dy); sÏ vÏ mét đờng thẳng từ vị trí hiện
HTD (TH0003)

C Programming (Se)

Page: 16


Bách khoa Online: hutonline.net

hμnh (x,y) cđa con trá ®Õn ®iĨm (x+dx, y+dy), con trỏ đợc di chuyển đến vị trí
mới.
ã Di chuyển con trỏ tới toạ độ (x,y): void moveto(intx, inty);
ã Vẽ hình chữ nhật. Hm void rectangle(int x1, int y1, int x2, int y20; sẽ vẽ một
đờng chữ nhật có các // các cạnh của mn hình, (x1,y1) l toạ độ đỉnh trên, (x2,y2)
l toạ độ đỉnh dới. Hm void bar(intx1, int y1, int x2, int y2); sÏ vÏ v tô mu
một hình CN. Hm void bar3d(int x1, int y1, int x2, int y2, int depth, int top);
vÏ vμ tô một khối hộp chữ nhật, depth qui định số điểm ảnh trên chiều sâu của khối
3D, top có thể nhận các giá trị l 1(có nắp), 0(không nắp).
ã Thiết lËp cưa sỉ viewport: void setviewport(int x1, int y1, int x2, int y2, int
clip); Víi 2 ®iĨm lμ 2 gãc trên trái v dới phải của cửa sổ, clip=1 không cho phÐp

vÏ ra ngoμi viewport vμ clip=0 th× cho phÐp. §Ĩ nhËn viewport hiƯn hμnh ta dïng
hμm void getviewsettings(struct viewporttype *vp). (Help online với index l
viewporttype).
ã Xoá viewport: void clearviewport(void);
ã Xoá mn hình v đa con trỏ về (0,0): void cleardevice(void);
ã Tô v lấy mu tô Điểm. Tô: void

putpixel(int x, inty, int color); Hμm

getpixel(int x, int y); sÏ tr· vÒ giá trị mu tại điểm (x,y), nếu điểm cha đợc tô
hm sẽ trả về 0.
ã Tô miền: void floodfill(int x, int y, int border); border chứa giá trị của một mu.
ã Hiển thị văn bản. Hm void outtext (char *s); sẽ hiện thị chuổi do s trỏ tới tại vị
trí hiƯn t¹i cđa con trá. Hμm outtextxy(int x, inty, char *s); sẽ hiển thị VB ở toạ độ
(x,y).
ã Chọn Font (.CHR): void settextstyle(int font, int direction, int charsize); Víi
direction =0(ngang), =1(dọc). Charsize có giá trị từ 1(8*8pixel)->10(80*80pixel).
font nhận các giá trị 0(default), 1(triplex), 2(small), 3(sanserif), 4(gothic).
ã Vị trí hiển thị Text: void settextjustify(int horiz, int vert); Víi horiz = 0(VB ở
bên phải con trỏ), 1(tâm VB theo vị trí con trỏ), 2(bên trái con trỏ). Vert = 0(VB ở
bên phải con trá), 1(t©m VB theo vtr cđa con trá), 2(phÝa d−íi con trá).
• LÊy chiỊu cao vμ réng cđa Text: int textheight(char*s); int textwidth(char *s);
HTD (TH0003)

C Programming (Se)

Page: 17


Bách khoa Online: hutonline.net


• Hμm imagesize(int x1, int y1, int x2, int y2);tr¶ vỊ sè byte dïng l−u ¶nh trong 1
phạm vi.
ã Hm void getimage( int x1, int y1, int x2, int y2, void *bitmap); dùng lu các
điểm ảnh trong ph¹m vi HCN vμo vïng nhí do bitmap trá tíi. Vïng nhí vμ biÕn
bitmap cho bëi hμm void *malloc(unsigned n);
• Hμm putimage(int x, int y, void *bitmap, int copymode); dïng sao chép ảnh trong
vùng nhớ bitmap ra mn hình tại vị trí (x,y). Tham số copymode =0(chép nguyên
xi), =1(các điểm ảnh trong bitmap kết hợp với các điểm trên mn h×nh = phÐp
XOR), =2( ...”.... =phÐp or), =3(......”......”and), =4(....’’.....NOT).

11. kü thuật sửa lỗi v rở rối chơng trình:
+ Ngời ta nghiên cứu v cho rằng khoảng 80% thời gian của các lập trình viên l dùng
để kiểm tra v sửa chữa những chơng trình đà có. Thông thờng có 3 loại lỗi sau: lỗi
cú pháp (syntax), lỗi run-time (chia cho zero, gán sai kiểu, sử dụng biến không khai
báo, ...), v lỗi logic. Lỗi logic l lỗi khó sửa nhất, vì đây l lỗi sai trong thuật giải
chơng trình.
+ Phơng pháp duy nhất để sữa các lỗi cú pháp l bạn phải biết chơng trình của mình
mắc phải lỗi gì, điều ny đợc Borland C++ thông báo trong cửa sổ Message, v từ đây
bạn có thể tra cứu các phơng pháp sữa chữa trong các sách tra cứu, đặt biệt l trong
help online của Borland C++.
+ Khi gặp các lỗi Logic lm cho chơng trình chạy không đúng hay cho kết quả sai ta
có thể sử dụng các chức năng Debug của Borland C để tiến hnh rở rối:
-Chạy từng bớc: dùng phím F7, với mỗi lần nhấn F7 l dòng đợc lm sáng sẽ
đợc thực hiện. Nhờ chạy từng bớc nh vậy ta sẽ dễ dng xử lý đợc các lỗi Logic
trong chơng trình. Có thể thay phím F7 bằng F8. Sự khác nhau duy nhất giữa hai
phím ny l l F7 sẽ thực hiện từng dòng bên trong hm đợc gọi, còn F8 thì sẽ thực
hiện hm ny v bớc qua nó.
-Kết hợp với chạy
từng dòng l ta sư dơng cưa

sỉ EVALUATION (nhÊn
Ctrl+F4), víi cưa sỉ nμy ta
HTD (TH0003)

C Programming (Se)

Page: 18


Bỏch khoa Online: hutonline.net

có thể quan sát giá trị của các biến, mảng,... qua mỗi dòng thực chơng trình (gõ vo
tên biến, mảng,.. cần xem trong khung Evaluate v xem giá trị trong khung result), hay
lm thay đổi giá trị c¸c biÕn, tÝnh to¸n c¸c biĨu thøc, c¸c hμm...
-Dïng cưa sổ Watch (Window\Watch) để theo dõi sự thay đổi giá trị của các
biến, mảng. Để xem các biến trong cửa sổ Watch, ta chọn Debug\Watch\Add Watch v
gõ tên biến cần xem vo, nhấn F7 hay F8 để chạy từng bớc chơng trình v xem gía
trị của biến. Có thể nhập vo nhiều biến, mỗi lần chỉ đợc nhập một biến. Để xoá một
biến ta chỉ di chuyển đến biến muốn xoá trong cửa sổ Watch v nhấn Delete. Nếu
không thấy cửa sổ Watch khi chạy từng bớc chơng trình, ta nhấn F5.
-Dùng cửa sổ User Screen để quan sát kết quả thực hiện của chơng trình:
Window\ User Screen hay Alt+F5.
Ngoi ra còn nhiều kỹ thuật khác nh sử dụng điểm gÃy, inspect, call stack,... để
gở rối các hm, chơng trình. Các bạn có thể xem chi tiết trong các sách tham khảo về
Lập trình C.
Lu ý:
HTD - TH0003 (5.2001).
Se (9.2001).

HTD (TH0003)


C Programming (Se)

Page: 19



×