Professional Documents
Culture Documents
com
Apprenez programmer en C Tc gi: M@teo21
4) Chui k t
9) Test Program: Ngi Treo C
Bin kiu Char.
Mt s ch dn.
String hay cn gi l mng k t.
Gii php 1:
Cc thao tc vi chui k t.
Gii php 2:
tng ci tin.
Bi 1: Modular Programming
M-un Lp Trnh
Trong chng th hai ca bi hng dn, bn s khm ph nhng khi nim lp trnh ngn ng
C cao hn.
Prototypes
Nhng nu bn t sau main, chng trnh s khng hot ng v my tnh vn khng bit
function l g.
Ti ng vi bn v im ny !
Chng ta bt u vic bo trc cho my tnh nhng function ca chng ta bng cch vit cc
prototypes.
C code:
double dientichHinhChuNhat (double chieuRong, double chieuDai)
{
return chieuRong * chieuDai;
}
C code:
#include <stdio.h>
#include <stdlib.h>
// Doan code sau chinh la prototype cua function dientichHinhChuNhat :
return 0;
}
// function dientichHinhChuNhat bay gio co the dat o bat ki vi tri nao trong code source
Chc bn cng thy function main khng c prototype. V y cng l function duy nht khng
cn prototype, bi v my tnh bit r n l g ri (tt c cc chng trnh u dng n m,
n bt buc phi bit thi).
cho chnh xc hn, bn cn bit thm: dng code prototype khng cn thit
phi vit li tn ca cc bin s cn cho parameter. My tnh ch cn bit type ca
cc bin s thi.
C code:
double dientichHinhChuNhat (double , double);
V vi 2 cch vit , chng trnh u chy tt, nhng li ch ca cch vit u tin l bn c
th copy-paste nhanh chng v ch thm vo mi du chm phy cui.
Headers
Cho n lc ny, bn cng ch s dng duy nht mt file source cho project ca bn. V ti yu
cu bn gi file source ny l main.c
Trong thc t, chng trnh s khng c vit ht ton b trong mi file main.c
Chc chn l chng ta cng c th lm vy nhng vic m mm trong mt file cha 10000 dng
code tht s khng thit thc cht no. Chnh v vy, thng thng, mt project s c to
bi nhiu files.
Ok, khng sao, ti s gii thch li cho bn, vic chng ta thng nht chung v khi nim tht s
cn thit.
Bn thy trong hnh chp pha trn, bn tri, project ny ch cha duy nht mi file main.c
Sau y, ti s cho bn xem hnh nh mt chng trnh tht s, chng trnh m bn s thc hin
trong nhng bi sau: tr chi Sokoban
Bn thy y, c kh nhiu files khc nhau. Mt chng trnh bnh thng s ging nh trn:
bn s thy nhiu files c lit k ct bn tri.
Bn cng tm thy file main.c: bn trong cha function main. V hu nh mi chng trnh ti
vit, ti u function main trong file main.c (iu ny khng bt buc, mi ngi c cch sp
xp khc nhau, nhng theo ti tt nht bn nn thc hin ging ti im ny).
iu ty thuc vo bn.
Bnh thng, ngi ta thng hay sp xp nhng function c cng ch vo chung vi nhau.
Trong hnh v trn, trong file editor.c ti tp hp nhng functions lin quan n vic thay i cp
ca tr chi, trong file game.c, ti tp hp nhng functions lin quan n tr chi,...
Cc files .h v .c
nhng file .h: gi l file headers. Nhng file ny cha prototype ca cc functions.
nhng file .c: l nhng file source. Nhng file ny cha ni dung ca cc functions.
Bnh thng, ngi ta rt t khi nhng prototypes trong cc file .c ging nh va ri chng ta
lm trong file main.c (ch tr khi chng trnh qu nh).
Mi file .c tng ng vi mt file .h trong cha nhng prototype ca nhng functions. Xem
li hnh trn mt ln na:
C code:
#include <stdio.h>
#include <stdlib.h>
#include "game.h"
void play (SDL_Surface* screen)
{
//....
C code:
#include <stdio.h>
#include <stdlib.h>
#include "game.h" // them vao file game.h
C mt s khc bit y: Nhng file m bn chung trong folder project phi c vit
trong ngoc kp "..." ("game.h") v nhng file th vin ( c ci t trc, bnh thng nm
trong folder IDE ca bn) phi c vit trong ngoc nhn <...> (<stdio.h>).
Ngoc nhn < > thm vo mt file th vin tm thy trong folder ca IDE
Ngoc kp " " thm vo mt file tm thy trong folder project ca bn ( bn cnh
nhng file .c)
C code:
/*
game.h
-----
Noi dung : prototypes of functions in game.
*/
L do cng kh n gin.
Khi code source bn vit yu cu gi mt function, my tnh ca bn bt buc phi bit trc
function l g, n cn bao nhiu tham s (parameter),... V th ta cn n prototype: ging nh
mt bng hng dn s dng trc khi dng function cho my tnh.
iu ny ph thuc vo IDE bn s dng nhng v tng qut th qui trnh ny tng t nhau:
File/New/ Empty file
n gin l nh vy
Lu li file trong folder cha nhng files khc dng cho project (folder cha file main.c).
Folder project v sau s tng t nh hnh chp sau, bn thy nhng file .c v .h c t chung
vi nhau:
Chnh xc l vy !
Thng thng n c ci t chung vi IDE ca bn. IDE ti s dng l Code::Blocks,
nhng files nm y:
C:\Program Files\CodeBlocks\MinGW\include
C:\Program Files\CodeBlocks\MinGW\lib
Tm tt li, trong nhng file .c, bn cn phi thm nhng file .h ca cc th vin chun c th
dng nhng function standard nh printf. V nh my tnh ca bn c c bn hng dn s
dng trc khi dng v c th kim tra xem bn c gi function ng cch hay khng, v d bn
qun mt vi parameters dng cho function X.
Trong thi im hin ti, nhng ch th tin x l duy nht m bn bit l #include, cho
php thm file khc vo file hin ti. Nhng chng trnh tin x l cn lm c nhiu
iu khc m ta hc nhng bi sau nhng #include vn l ci quan trng nht cn bit.
Chng trnh tin x l s thay th nhng dng #include bng nhng file ch nh. N s
t ni dung ca nhng file .h ta yu cu vo file .c ang dng. V ngay lc ny, nhng
file .c c hon chnh, n cha tt c nhng prototypes ca cc functions bn dng ( file
.c ca bn lc ny n s to hn bnh thng).
Link editor (linker): l mt chng trnh tng hp li nhng file .o thnh mt file ln
cui cng: executable. Nhng file executable c ui .exe di Windows. (C ui khc
nu bn s dng mt h iu hnh khc).
Trong trng hp ny, giai on u biu khng thay i, nhng giai on linker th my
tnh phi lm vic nhiu hn mt t. N phi tng hp li cc file. (tm thi) vi cc th vin m
chng ta cn (.a .ou .lib ty theo compiler).
Trc khi kt thc bi hng dn, chng ta s tm hiu khi nim v phm vi s dng ca
functions v bin s. Chng ta s xem khi no nhng bin s v function c th s dng, c
ngha l chng ta c th gi c chng.
C code:
int triple (int soHang)
{
int ketqua= 0; // Bin s ketqua c lu li trong b nh
ketqua= 3 * soHang;
return ketqua;
} // Function kt thc, bin s ketqua b xa khi b nh
C code:
int triple (int soHang);
int main (int argc, char *argv[ ])
{
printf ("triple cua 15 la %d\n", triple (15));
printf ("triple cua 15 la %d\n", ketqua); // Error - Loi
return 0;
}
int triple (int soHang)
{
int ketqua= 0;
ketqua = 3 * soHang;
return ketqua;
}
Trong main, ti th s dng bin s ketqua. Bin s ketqua ny c khai bo trong function
triple, n khng s dng c trong function main !
Chng ta c th khai bo nhng bin s dng chung cho tt c cc functions cha trong tt c cc
file ca project. Ti s ch cho cc bn cch to ra n, nhng cn trnh s dng. Vic s dng n
c th gip bn n gin ha code source lc ban u nhng v sau khi bn c mt s lng ln
cc bin s, n s d dng khin bn nhm ln v gy ra li khng ng c.
C code:
#include <stdio.h>
#include <stdlib.h>
V d:
C code:
int triple (int soHang)
{
static int ketqua = 0; // Bien so ketqua duoc tao ra lan dau khi function duoc goi
ketqua = 3 * soHang;
return ketqua;
} // Bien so ketqua khong bi xoa di khi function ket thuc
Vy iu ny c ngha nh th no ?
C code:
int increase( );
return 0;
}
int increase ( )
{
static int soHang = 0;
soHang++;
return soHang;
}
Console
1
2
3
4
Khi function ny c gi li ln na, dng khai bo bin s b b qua. My tnh s s dng tip
tc vi bin s soHang c to ra trc .
By gi, function static triple ch c th gi bi mt function khc nm chung trong file cha n.
Nu bn th gi function triple bi mt function khc cha trong file khc, s khng hot ng.
Bi 2: Pointer
Con tr
Phn ln nhng ngi bt u hc C thng xuyn vp ng trong phn kin thc v con tr. V
ti hi vng bi hc ny s gip cc bn khng nm trong s . Hy tp trung gp i bnh
thng v b thm thi gian hiu r tng biu , v d c trong bi hc ny.
Mt vn nan gii
C code:
int function ( )
{
return giatri;
}
C code:
void function( )
{
Nhng nhn c hai gi tr tr v cng lc tht s l vic khng th. Chng ta khng th s
dng hai return cng lc.
C code:
#include <stdio.h>
#include <stdlib.h>
/* Toi dat cac prototypes tren cung. Vi day la mot chuong trnh kha nho nen toi khong
dat chung trong mot file.h, nhung trong mot chuong trinh that su, toi se dat chung trong
mot file.h nhu da huong dan o bai truoc*/
void chuyenDoi(int gio, int phut);
int main (int argc, char *argv[ ])
{
int gio = 0, phut = 90;
/*Chung ta co bien so "phut" gi tr 90. Sau khi ket thuc function, toi muon bien so
"gio" nhan gia tri 1 v bien so "phut" nhan gia tri 30 */
chuyenDoi(gio, phut);
printf ("%d gio va %d phut", gio, phut);
return 0;
}
void chuyenDoi(int gio, int phut)
{
gio= phut/ 60; // 90 / 60 = 1
phut= phut% 60; // 90 % 60 = 30
}
V y l kt qu:
Console
0 gio va 90 phut
Function chuyenDoi thc hin nhim v ca n. Trong function chuyenDoi, nhng bin s
"gio" v "phut" nhn gi tr chnh xc: 1 v 30.
a ch trong b nh
Nhc li kin thc
Trong c mt biu kh quan trng m ti cn nhc li trc khi dy bn nhng kin thc
mi:
a ch v gi tr
C code:
int tuoi = 10;
Vic ging nh, mi khi bn in vo tuoi trong code source, chng s c chuyn thnh
4655, v my tnh s bit c cn n a ch no trong b nh ly gi tr . V ngay sau ,
my tnh xem gi tr c cha trong a ch 4655 v tr li chng ta "bin s tuoi co gi tr l
10"!
C code:
printf ("Bien so tuoi co gia tri la : %d", tuoi);
Khuyn mi thm!
Kt qu
Console
Dia chi cua bien so tuoi la 0023FF74
l a ch ca bin s tuoi trong thi im chng trnh hot ng. Vng, 0023FF74 l mt
s, n n gin ch c vit trn h hexadecimal (thp lc phn), thay v h decimal (thp phn)
m chng ta thng s dng. Nu bn thay k hiu %p thnh %d, bn s nhn c mt s thp
phn m bn bit.
Vy chng ta s lm g vi tt c nhng th ?
Cch to mt con tr
C code:
int *pointer = NULL;
C code:
int tuoi = 10;
int *pointerTuoi = &tuoi;
Dng th hai thc hin cng lc hai vic. Nu bn thy phc tp nn khng mun gp hai vic
vi nhau, ti s tch bit chng bng cch chia thnh hai giai on, xem on code sau :
C code:
int tuoi = 10;
int *pointerTuoi; // 1) co nghia la "Toi tao mot con tro poiterTuoi"
pointerTuoi = &tuoi; // 2) co nghia la "con tro pointerTuoi chua dia chi cua bien so tuoi"
Bn cn nh rng khng c type "pointer" nh type int hay double. Ngi ta khng ghi nh sau:
pointer pointerTuoi;
Thay v vy, chng ta s s dng k t *, sau int. Ti sao li nh vy? Tht ra, chng ta cn phi
ch r type ca bin s m con tr s cha a ch ca n.
trn, pointerTuoi s cha a ch ca bin s tuoi (type l int), vy con tr phi c type int*
Nu bin s tuoi c type l double, ta phi vit double *pointerTuoi.
Chng ta bt u tin vo th gii huyn diu ca nhng con tr. Th gii b mt ca nhng
chng trnh vit trn ngn ng C (C++)
C code:
int tuoi = 10;
int *pointerTuoi = &tuoi;
printf ("%d", pointerTuoi);
Console
177450
C code:
int tuoi = 10;
int *pointerTuoi = &tuoi;
Console
10
Nu bn hiu c nguyn l hot ng, th chc chn, nhng thc mc s c sng t trong
cc bi hc sau.
Nhng iu cn nm vng
c th hiu c 4 im chnh trn. Bn cn test nhiu ln hiu cch n hot ng. Biu
sau y gip bn c th hiu r hn:
Tt c nhng iu trn l c bn. Bn phi hc thuc lng v tt nhin phi hiu r. ng ngi
c i c li nhiu ln. ng xu h nu khng hiu ngay c bi hc khi ch c qua ln u
tin, c nhiu vn chng ta cn nhiu ngy c th hiu r v i khi cn nhiu thng c
th s dng thnh tho.
Nu bn c cm gic khng theo kp, th hy ngh n nhng bc thy trong vic lp trnh: khng
ai trong s h c th hiu r hon ton hot ng ca con tr trong ln u tin. Nu c mt
ngi nh vy tn ti, bn hy gii thiu vi ti nh.
C code:
void triplePointer(int *pointerSoHang);
Console
15
V thng xuyn nht, ngi ta dng return thng bo li ca chng trnh: v d, function
tr v 1 (true) nu tt c din ra bnh thng, v 0 (false) nu c li trong chng trnh.
Trong nhng code source m chng ta va thy, khng c con tr trong function main. Duy nht
ch bin s soHang.
Con tr duy nht c s dng nm trong function triplePointer (c type int *)
Bn cn bit rng c cch vit khc cho on code va ri bng cch thm vo con tr trong
function main:
C code:
void triplePointer(int *pointerSoHang);
triplePointer (pointer); // Ta dua con tro (dia chi cua soHang) vao function
printf ("%d", *pointer); // Ta hien thi gia tri cua soHang voi *pointer
return 0;
}
Console
15
VD trong printf, ti mun hin th gi tr ca bin s soHang bng cch vit *pointer. Bn cn
bit rng ti vn th vit soHang: kt qu s ging nhau v*pointer v soHang u c chung mt
gi tr trong b nh
Trong chng trnh "Ln hn hay nh hn", chng ta s dng con tr bt chp vic bit n
l g, trong vic s dng function scanf.
Tht ra, function ny c tc dng c nhng thng tin m ngi dng nhp vo bn phm v gi
li kt qu.
C code:
int soHang = 0;
scanf ("%d", &soHang);
C code:
int soHang = 0;
int *pointer = &soHang;
scanf ("%d", pointer);
C code:
#include <stdio.h>
#include <stdlib.h>
void chuyenDoi(int *pointerGio, int *pointerPhut);
Console:
1 gio va 30 phut
Khng c g khin bn ngc nhin trong on code source ny. V nh mi khi, trnh nhng
nhm ln khng ng c, ti s gii thch nhng g din ra chc chn rng cc bn theo kp
ti, v y l mt bi hc quan trng, bn cn c gng rt nhiu hiu, v ti cng c gng ht
sc gii thch r rng gip cc bn hiu:
Bi 3 Array
Mng
Bi hc ny l phn tip theo ca bi trc, n gip bn hiu thm v cch s dng cc pointer.
Bn cm thy c cht kh khn trong vic s dng cc pointers?
Bn s khng trnh khi vic dng chng u! Cc pointers c s dng thng xuyn trong C,
ti ni vi bn iu ny!
Trong bi hc ny, chng ta s hc cch to nhng bin s type "array" hay cn gi l mng. Cc
mng c s dng thng xuyn trong C v n tin li trong vic sp xp mt chui cc gi tr.
Cc arrays trong b nh
R rng hn, mng c th cha mt s lng ln bin s cng type (long, int, char, double...).
Cui cng, mi trong mng cha mt s cng type. Nu mng c type int, th mi trong
mng cha mt s type int. Khng th to mng cng lc cha gi tr type int v double.
C code:
int array[4] ;
array[0] = 10;
array[1] = 23;
array[2] = 505;
array[3] = 8;
C code:
int array[4] ;
printf ("%d", array);
Console:
1600
C code:
int array[4];
printf ("%d", array[0]);
Console:
10
C code:
array[1] // Cho gia tri cua o thu 2 (o dau tien viet la [0])
*(array+ 1) // Tuong tu: cho gia tri o thu 2
C code:
int kichThuoc = 5;
int array[kichThuoc];
Cch vit ny khng c thng dng lm i vi cc compiler, nhiu khi chng trnh chy n
dng th 2 s dng li. T u n gi, ti hng dn bn ngn ng C89 nn chng ta s tuyt
i khng dng dng code th 2
C code:
int array[5] ;
Nhng thc hin iu ny, chng ta s dng mt k thut khc (chc chn, m bo c th
chy c trn mi iu kin) gi l phn b ng (dynamic allocation). Chng ta s c hc
v sau.
Lit k cc gi tr trong mng (array)
V vy, tt hn l s dng vng lp. V vng lp for rt tin li trong vic ny:
C code:
int main (int argc, char *argv[ ])
{
int array[4], i = 0;
array[0] = 10;
array[1] = 23;
array[2] = 505;
array[3] = 8;
for (i = 0 ; i < 4 ; i++)
{
printf ("%d\n", array[i]);
}
return 0;
}
Console:
10
23
505
8
C code:
int main (int argc, char *argv[ ])
{
int array[4], i = 0;
// Khoi tao cac gia tri trong array
for (i = 0 ; i < 4 ; i++)
{
array[i] = 0;
}
// Hien thi cac gia tri de kiem tra
for (i = 0 ; i < 4 ; i++)
{
printf ("%d\n", array[i]);
}
return 0;
}
Console:
0
0
0
0
Console:
0
0
0
0
Mt khc, li ch ca cch lm ny l, bn ch cn khai bo gi tr nhng u tin, nhng cn
li s t ng nhn gi tr 0:
C th, nu ti vit:
C code:
int array[4] = {10, 23}; // Gia tri nhap vao: 10, 23, 0, 0
Ch , thng gp li
int array[4] = {1};
Dng code ny s thm vo cc gi tr sau: 1, 0, 0, 0. Nhiu bn ngh rng dng code trn
s khi to mng vi tt cc gi tr l 1, nhng khng phi vy, lm iu ny cc bn
cn s dng vng lp.
C code:
// Prototype cua function hien thi
void hienThi (int *array, int kichThuocArray);
return 0;
}
Console
10
15
3
0
C code:
void hienThi (int array[ ], int kichThuocArray)
hot ng tng t nh trn, vic s dng nhng du ngoc vung cho php ngi c code hiu
r: function cn mt mng. C th hn ch c nhm ln l function cn mt con tr hoc bin
c bn no .
Ti thng s dng cch vit th hai a mng vo function, cc bn nn thc hin ging ti.
V trong cch vit ny chng ta khng cn khai bo kch thc trong ngoc vung.
Mt vi bi tp thc hnh!
Bi tp 1
To mt function tongArray tnh tng cc gi tr cha trong n (s dng return tr v gi
tr). V gip bn hiu r hn, y l prototype ca function cn vit:
C code:
int tongArray (int array[ ], int kichthuocArray);
Bi tp 2
To mt function trungBinhArray tnh trung bnh cc gi tr cha trong n.
Prototype:
C code:
double trungBinhArray (int array[ ], int kichThuocArray);
Bi tp 3
To mt function copyArray chp ni dung array ny sang mt array khc.
Prototype:
C code:
void copyArray (int array1[ ], int array2[ ], int kichThuoc);
Bi tp 4
Vit mt function maximumArray c nhim v so snh tt c cc gi tr cha bn trong array vi
giaTriMax. Nu c gi tr ln hn bin s giaTriMax a vo, n s chuyn thnh 0.
Prototype:
C code:
void maximumArray (int array[ ], int kichThuoc, int giaTriMax);
Bi tp 5
Bi tp ny kh hn hn cc bi tp kia nhng bn hon ton c kh nng thc hin.
Hy vit mt function sapXepArray sp xp li cc gi tr bn trong theo th t tng dn.
C code:
void sapXepArray (int array[ ], int kichThuoc);
Hy vit trong file array.c cha tt c cc functions cn thit v file array.h cha cc
prototypes ca cc functions .
No bt u lm vic thi !
Bi 4: String
Chui (mng k t)
String - Chui (mng k t) l mt thut ng tin hc chnh xc dng ch mt dy cc k t,
n gin l nh vy! Mt chui k t c lu trong b nh my tnh di dng bin s. Nh
vy ta c th lu tr tn ca ngi dng.
Liu bin kiu char c cho php cha nhng con s? Bn cn bit rng trong C ngi
ta rt him khi s dng chng lm iu . Bnh thng, ngay c i vi nhng con s tht
s nh, ngi ta vn dng int lu li. Hn rng ti s dng nhiu b nh hn so vi char
nhng trong thi i ngy nay, vn b nh khng cn ng lo na.
Console:
65
Chng ta thy ngay rng ch A vit hoa c thay bng s 65. Tng t nh vy B thay bng
66, C bng 67 Test th vi nhng ch ci vit thng, gi tr ca nhng ch ci s thay i.
V ch a khng ging nh A, my tnh phn bit ch ci vit hoa v vit thng.
Cch hin th mt k t:
Function printf, s tip tc lm chng ta ngc nhin, n c kh nng hin th mt ch ci. lm
iu , chng ta cn phi s dng k hiu %c (c vit tt ca character):
C code:
int main (int argc, char *argv[ ])
{
char letter = 'A';
printf ("%c\n", letter);
return 0;
}
Console:
A
C code:
int main (int argc, char *argv[ ])
{
char letter = 0;
scanf ("%c", &letter);
printf ("%c\n", letter);
return 0;
}
Console:
B
B
Cn nh:
Type char cho php nhp vo nhng gia tr t -128 n 127, unsigned char t 0 n 255.
C nhng bng chuyn i cho php my tnh chuyn t ch ci thnh s v ngc li.
Chng ta c th s dng type char ch cha MT ch ci.
A c chng trnh dch chuyn thnh mt s tng ng (thng thng l 65). Chng
ta dng nhng du ngoc n c c gi tr ca mt ch ci.
C code:
char string[5];
nu ti t vo string[0] ch ci H, string[1] ch ci e ti s to c mt dy k t ,
hoc l mt vn bn (text)
n gin l v my tnh cn bit khi no kt thc mt chui k t. K t \0 cho php gii thch:
Dng li, khng cn g c tip y na! .
Chui k t s kt thc bng \0, k t kt thc chui cho php my tnh bit rng chui k t s
kt thc y.
Vic ny ch c tc dng i vi nhng chui k t ( c ngha l vi type char*, hoc char[ ]).
i vi nhng dng mng khc, cc bn bt buc phi lu li ln ca chui u .
Khai bo v khi to chui k t
Nu ta mun khai bo mt t Hello , ta c th s dng phng php bun chn sau:
C code:
char string[6]; // mang string gom 6 char de luu tru H-e-l-l-o va \0
string[0] = 'H';
string[1] = 'e';
string[2] = 'l';
string[3] = 'l';
string[4] = 'o';
string[5] = '\0';
Phng php ny hot ng, bn c th kim tra li bng cch s dng printf.
Ah, ti qun mt printf: bn cn phi bit thm mt k t c bit khc l %s (s nh l mt
string).
V y l on code hon chnh to v hin th t Hello :
C code:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[ ])
{
char string[6]; // mang string gom 6 char de luu tru H-e-l-l-o v \0
// Khoi tao chuoi ky tu (Ta viet tung ky tu vao bo nho)
string[0] = 'H';
string[1] = 'e';
string[2] = 'l';
string[3] = 'l';
string[4] = 'o';
string[5] = '\0';
// Hien thi chuoi ky tu bang printf nho %s
printf ("%s", string);
return 0;
}
Console:
Hello
C code:
int main (int argc, char *argv[ ])
{
char string[ ] = "Hello"; // Do dai cua chuoi ky tu duoc may tinh tu dong tinh toan.
printf ("%s", string);
return 0;
}
Console:
Hello
dng u tin trong main, ti to mt bin s dng char[ ]. Ti cng c th vit l char*, kt
qu s vn nh nhau.
Khuyt im: Cch ny ch hot ng khi khi to chui, bn s khng th s dng tip nhng
phn sau ca chng trnh, bn khng th vit:
C code:
string = "Hello";
Sau phn khi to, bn ch c th lu mt t bng cch vit ring bit tng ch ci vo b nh.
Vn duy nht xy ra, bn s khng bit c bao nhiu ch ci ngi dng s nhp vo. Nu
bn yu cu nhp tn, c th ngi dng ch nhp vo Nhu (3 ch ci), v i lc ngi s
nhp vo Superman (nhiu ch ci hn).
lm iu ny, 36 k ca tn t l khng cho bn. i khi, chng ta cn khai bo mt mng
char ln hn, ln c th cha tn ca ngi dng. Chng ta s to mt char[100] cha
tn ngi dng. Vic ny khin bn c cm gic chng ta ang lng ph b nh my tnh, nhng
vn v b nh ny khng tht s ng lu tm (s c nhng chng trnh lm lng ph b
nh my tnh hn rt nhiu ln nh th ny, t t bn s thy).
C code:
int main (int argc, char *argv[ ])
{
char ten[100];
printf ("E ku, may ten gi vay? ");
scanf ("%s", ten);
printf ("Hello %s, tao rat vui vi duoc gap may!", ten);
return 0;
}
Console:
E ku, may ten gi vay? M0N1M
Hello M0N1M, tao rat vui vi duoc gap may!"
V y l phn ln nhng g phi lm yu cu ngi dng nhp vo mt t.
#include <string.h>
Prototype y:
size_t strlen(const char* string);
C code:
int main (int argc, char *argv[ ])
{
char string[ ] = "Xinchao";
long doDaiChuoi = 0;
// gia tri do dai cua chuoi se duoc luu lai trong bien so doDaiChuoi
doDaiChuoi = strlen (string);
// hien thi do dai chuoi
printf ("Chuoi %s co do dai %ld ki tu", string, doDaiChuoi);
return 0;
}
Console:
Chuoi Xinchao co do dai 7 ki tu
Function strlen ny c vit d dng bng cch s dng vng lp trn mng kiu char, v n s
dng li khi gp k t kt thc chui \0. N s ln lt truy cp vo cc c cha tng k t
ca chui, s lt truy cp s tng dn sau mi vng lp, v kt qu s tr v gi tr cui cng
ca nhng lt truy cp ny.
Ti s vit function strlen ca ring mnh. Vic ny s gip bn hiu r hn n hot nh th no:
C code:
long doDaiChuoi(const char* string);
return soLuongKiTu;
}
Gii thch
1. Function doDaiChuoi to vng lp trn mng string. N s lu li tng k t trong bin
kiTuHienTai. Khi kiTuHienTai tin n \0, vng lp s dng li.
2. Ti mi vng lp, ln s tng ln 1 sau mi ln truy cp cha k t.
3. Khi kt thc vng lp, s lng k t s bt i 1. iu ny c ngha l ta khng tnh k
t kt thc chui \0.
4. Cui cng, kt qu s c tr v soLuongKiTu.
5. Tr chi kt thc.
Prototype ca n l:
char* strcpy(char* copyString, const char* stringCopy);
Function tr v pointer ca copyString cng khng hu dng lm. Thc t, ta khng cn s dng
kt qu function ny tr v. Cng test th nh.
C code:
int main (int argc, char *argv[ ])
{
/* Chung ta khai bao bien "string" kieu char trong do co chua 1 chuoi ky tu va mot bien "copy"
voi kich thuoc 100 ky tu de bao dam co du cho trong */
Console:
string is : Text
copy is : Text
Biu s nh sau:
Phn sau ca copy cn nhiu nh khng dng n, v trn, ti khai bo copy c di l 100,
nhng trong v d ny, 5 l s dng. Li ch ca vic to ra mt mng ln hn l c th
s dng cho nhiu trng hp khc nhau, c th c mt s chui c di ln hn trong phn
sau ca chng trnh.
C code:
int main (int argc, char *argv[ ])
{
/* Chung ta se tao ra 2 mang ky tu, nho rang string1 phai du lon de chua
duoc nhung ky tu cua string2. Neu khong chuong trinh se bao loi. */
strcat (string1, string2); // Nhung ky tu cua string2 se duoc noi tiep vao string1
// Neu moi thu dien ra tot dep thi ket qua string1 se la "Hello M0N1M"
Console:
string1 is : Hello M0N1M
string2 is always : M0N1M
C code:
int strcmp(const char* string1, const char* string2);
Console:
Hai chuoi giong nhau!
Strchr: tm kim mt k t
Chc nng ca function strchr l tm kim mt k t trong chui.
Prototype ca function strchr y:
C code:
int main (int argc, char *argv[ ])
{
char string[ ] = "Text for test", *subString = NULL;
subString = strchr(string, 'f');
if (subString != NULL) // NULL la ko tim thay, vay dong nay nghia la neu ta tim dc gi do
{
printf ("Bat dau tu ky tu dau tien duoc tim thay, string duoc in ra la : %s \n", subString);
}
return 0;
}
Console:
Bat dau tu ky tu dau tien duoc tim thay, string duoc in ra la : for test
Khi ti vit mt printf ln subString, thng thng n s hin th kt qu l for test. Function
printf s hin th tt c nhng ch ci n gp ('f', 'o', 'r ', ' ' 't', 'e', 's', 't') n khi gp k t \0
thng bo l string kt thc y.
Bin th:
Ngoi ra cn c mt function strrchr vi cch hot ng hon ton ging nh strchr, khc
ch n s ch vo ch ci cui cng c tm thy trong string thay v ch ci u tin.
Lu :
Prototype ca function ny l:
if (subString != NULL)
{
printf ("Sau khi tim mot trong ba ky tu: x, f, s trong "Text for test"\n");
printf ("Bat dau tu ky tu dau tien duoc tim thay.\n");
printf ("Bien string duoc in ra la: %s", subString);
}
return 0;
}
Console:
Sau khi tim mot trong ba ky tu: x, f, s trong "Text for test"
Bat dau tu mot trong nhung ky tu dau tien duoc tim thay.
Bien string duoc in ra la: xt for test
Trong v d ny, ti a trc tip cc gi tr vo thng function (trong ngoc kp). Chng ta
khng b bt buc phi to mt bin s, vic vit trc tip nh th ny kh tin li.
Cc bn phi lu nhng cch vit sau:
Nu cc bn s dng ngoc kp c ngha l chui (mng k t).
Nu cc bn s dng mc n c ngha l k t
C code:
int main (int argc, char *argv[ ])
{
char *subString;
// Chung ta se tim kiem chuoi "test" trong "Text for test" :
subString = strstr("Text for test", "test");
if (subString != NULL)
{
printf ("Chuoi ky tu dau tien ma ban muon tim trong chuoi Text for test la: %s\n", subString);
}
return 0;
}
Tt c u ty theo chng trnh bn vit, nhng trong mi trng hp, nhng function ny l c
bn bn thc hin cc thao tc tm kim lin quan ti vn bn.
C code:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[ ])
{
char string[100];
long age = 18;
// Chuong trinh se viet "You are 18 years old !"
sprintf (string, "You are %ld years old !", age);
// Chung ta se in chuoi ky tu nay ra man hinh de dam bao chuong trinh hien thi dung
printf ("%s", string);
return 0;
}
Console:
You are 18 years old !
Bn cn bit rng ti cng khng th bit c tt c nhng function c trong string.h. Ti cng
khng yu cu bn phi hc thuc lng. Nhng bn cn phi bit cch dy k t hot ng vi \0
v nhng iu trn.
Tng kt !!!
My tnh khng th lm vic vi cc k t, n ch bit n nhng con s. Chng ta c
nhng con s gii quyt vn lin quan n nhng k t trong bng ch ci ca
mnh bng bng m tn l ASCII.
Mi bin kiu char ch c th cha mt v ch mt k t duy nht. Chng thng c
lu li ti mt a ch b nh ngu nhin trn my tnh, my tnh s t ng sp xp v
bin dch nhng bin ny.
c th to ra mt t hoc mt cm t chng ta phi to ra mt chui. Trong trng
hp ny, chng ta s s dng mng k t.
Tt c cc chui u c kt thc bi mt k t c bit, l k t kt thc chui \0
C rt nhiu functions dng x l chui c vit sn trong th vin string.h. V
vy ng qun khai bo th vin ny u chng trnh trc khi bn mun thao tc vi
chui k t nh.
Bn cn nh rng ngn ng C c bc tng i thp, c ngha l cc thao tc ca bn rt gn
vi cch hot ng ca my tnh.
Li ch khc l hin gi bn bit phng thc hot ng ca my tnh trn chui k t. Nhng
kin thc ti dy bn y s pht huy tc dng trong tng lai, ti c th chc m bo vi
bn.
Ngc li, vic lp trnh trn Java hay trn Basic khng cn thit phi hiu cch thc hot ng
ca my tnh, bn hin gi bt u hiu lm th no my tnh hot ng, iu ny theo ti l
rt quan trng.
Nghe c v hay y nhng c mt iu ng ngi l chng ny hi phc tp. Bn phi d on
trc ln ca array, ngh n lu li \0 Cc thao tc trn dy k t khng d dng nm
vng bi ngi mi bt u, phi cn thm mt t thc hnh c th t c.
Ni v phng din thc hnh mt cch chnh xc th ti c cng vic dnh cho bn.
Ti khuyn khch bn c gng thc hnh tht nhiu. Cn iu g tt hn bng cch lm vic trn
nhng chui k t? Nu cha ph, hy cng lc lm vic trn chui k t, mng v pointer
V y l vic ti mun bn lm: Bn va hc mt s functions trong th vin string.h, nhng
bn c kh nng t vit li cc function cho ring mnh.
(?)Nhng c cn thit ko? Nu cc function c vit ri, ti sao phi ph cng vit li?
Tht s th khng cn thit t no, v trong tng lai chc chn bn s s dng cc function trong
string.h ch khng phi nhng function ca ring bn. Nhng vic ny s gip bn luyn tp, ti
thy rng y l mt bi tp kh hay. Ti ch cho bn cch hot ng ca function strlen, iu
c th gip bn thc hin cc function khc.
Nhng, ng c gng vit li nhng function nh sprintf, y l mt function vi phc tp
tng i cao. Hy tm chp nhn vi cc function c trong string.h.
Nu bn b kt u , ng ngi t cu hi trn cc din n.
No, lm vic thi!
Bi 5: Preprocessor
Tin x l
Sau nhng bi hc v con tr (pointer), mng (array) v chui k t (string), chng ta s tm ngh
ngi mt cht.
Bi ny s vit v Tin x l (Preprocessor), y l nhng chng trnh c chy trc khi bin
dch (Compilation).
Ch th #include
Ging nh ti tng gii thch trong chng u tin, chng ta tm thy trong m ngun nhng
dng hi c bit gi l ch th tin x l (preprocessor directives).
Dng directive ny cho php thm ni dung mt file khc vo file ang vit.
Chng ta c bit dng #include thm vo file.c cc ni dung t nhng file.h ca cc th vin
(stdio.h, stdlib.h, string.h, math.h) v cng c th l t nhng file.h ca ring bn.
Code C:
#include <stdlib.h>
thm ni dung nhng file.h c trong th mc cha project ca bn, bn cn s dng nhng
du ngoc kp:
Code C:
#include "myfile.h"
C th hn, nhng chng trnh tin x l s bt u trc khi compile. N s qut cc tp tin
ca bn tm ra nhng ch th tin x l trc, l tt c nhng dng bt u bng #.
Code C:
#include "file.h"
long myFunction(int cai_nay, double cai_kia)
{
/* Source code of function */
}
void otherFunction(long value)
{
/* Source code of function */
}
C code:
long myFunction(int cai_nay, double cai_kia);
void otherFunction(long value);
Khi chng trnh tin x l chy n y, trc khi bin dch file.c, n s t file.h vo trong
file.c.
Cui cng, m ngun ca file.c trc khi bin dch s ging nh sau:
C Code:
long myFunction(int cai_nay, double cai_kia);
void otherFunction(long value);
Tht s khng c g qu kh hiu ng khng? Ti ngh rng c kh nhiu bn bit cch thc
hot ng ca n nh th no.
Chc nng ca cc #include khng c g khc ngoi hnh ng chn file ny vo file khc, v
cc bn phi bit rng vic hiu vn ny rt quan trng.
Khi chng trnh bn vit ngy cng phc tp v c qu nhiu file.c, ch cn s dng
#include gip chng s dng chung 1 file.h, bn s cm thy mnh tht may mn khi
khng phi tn qu nhiu thi gian copy & paste li nhng prototype c cng 1 chc
nng.
Ch th #define
Chng ta s tm hiu mt preprocessor directives mi: #define.
Lnh directive ny cho php khai bo mt hng s (constant) ca tin x l (preprocessor). N
cho php a gi tr s vo mt t.
Ly v d:
Code C:
#define MANG_SONG_NHAN_VAT_BAN_DAU 3
Bn s vit theo th t:
#define
T kha s c nhn gi tr
Gi tr
Code C:
const long MANG_SONG_NHAN_VAT_BAN_DAU = 3;
V dng:
Code C:
#define MANG_SONG_NHAN_VAT_BAN_DAU 3
Code C:
#define MANG_SONG_NHAN_VAT_BAN_DAU 3
int main (int argc, char *argv[ ])
{
long mang_song = MANG_SONG_NHAN_VAT_BAN_DAU;
/* Code ...*/
Code C:
int main (int argc, char *argv[ ])
{
long mang_song = 3;
/* Code ...*/
Trc khi bin dch, tt c nhng #define s c thay th bng cc gi tr tng ng. Compiler
s thy ni dung trong file sau khi qua tin x l, trong tt cc nhng ch cn thay th u
c thc hin
Mt li ch khc khi s dng #define l vic thay th s c thc hin trong tt c cc file cha
dng #define. Khc vi khi bn khai bo mt constant trong mt function, n ch c hiu lc
trong function , sau n s b xa i. Nhng i vi #define, n s tc ng ln tt c cc
function c trong file , v iu ny tht s rt tin li cho nhng ngi lp trnh.
C Code:
#define CHIEUDAI_CUASO 800
#define CHIEURONG_CUASO 600
Vit thm rng: nhng dng #define thng c t trong nhng file.h, bn cnh cc prototype
(Bn c th xem nhng file.h ca cc th vin nh stdio.h, bn s thy lun c nhng dng
#define!).
Nhng #define ging nh cch thc n gin , gip bn thay i kch thc ca s bng vic
thay i nhng #define, thay v phi r sot li ton b ni dung file tm ni m bn m ca s
thay i li kch thc. Vic ny s tit kim rt nhiu thi gian cho bn trong vic lp trnh.
Tm tt li, nhng constants ca preprocessor cho php chnh sa chng trnh ca bn trc
vic compilation. Ging nh mt dng mini-configuration.
Code C:
#define KICH_THUOC_TOI_DA 1000
int main (int argc, char *argv[ ])
{
char line1[KICH_THUOC_TOI_DA], line2[KICH_THUOC_TOI_DA];
// ...
C Code:
int main (int argc, char *argv[ ])
{
char line1[1000], line2[1000];
// ...
C Code:
#define CHIEUDAI_CUASO 800
#define CHIEUCAO_CUASO 600
#define SOLUONG_PIXELS (CHIEUDAI_CUASO * CHIEUCAO_CUASO)
Bn c th thc hin tt c cc php ton c bn m bn bit: php cng (+), php tr (-), php
nhn (*), php chia (/) v modulo (%).
Ngay lc ny y, khi ti ang vit nhng dng hng dn ny cho bn, bn cn bit rng c
mt s constant ti cha tng s dng n, ti s gii thiu cho bn mt s constant c ch m
ti bit.
Ti ngh rng nhng constant ny c ch trong vic khc phc li cc li chng trnh, ly v d :
C Code:
printf ("Co loi o dong %ld trong tap tin %s\n", __LINE__, __FILE__);
printf ("Tap tin nay duoc bien dich vao ngay: %s luc: %s\n", __DATE__, __TIME__);
Console:
Co loi o dong 9 trong tap tin main.c
Tap tin nay duoc bien dich vao ngay: 25 April 2015 luc: 15:36:10
Cch xc nh n gin
Code C:
#define CONSTANT
m khng cn bit gi tr ca n
Macros
Chng ta thy rng vi cc #define chng ta c th yu cu preprocessor thay th mt t kha
bng mt gi tr.
Ly v d:
Code C:
#define SOLUONG 9
Thc t #define c tc dng mnh hn rt nhiu, n cho php thay th c mt on code! Khi
ta s dng #define find / replace mt t bng mt on code, chng ta gi l macro.
y l mt v d ca macro n gin:
Code C:
#define CUCKOO( ) printf ("Cuckoo");
Console:
Cuckoo
Console:
Xin chao, toi ten la Minh
Toi song tai thanh pho HCM
Toi thich nghe nhac
Trong tnh hung nh vy, nhng macro ny cng hiu qu hn khi chng ta t vo chng
nhng parameter. N hot ng tng t nh cc function.
C Code:
#define NGUOI_TRUONG_THANH(tuoi) if (tuoi >= 18) \
printf ("Ban la nguoi truong thanh\n");
int main (int argc, char *argv[ ])
{
NGUOI_TRUONG_THANH(22)
return 0;
}
Console:
Ban la nguoi truong thanh
Cn vit thm rng ti c th thm vo mt else hin th Ban van chua truong
thanh . Hy lm th tp luyn, khng c cht kh khn no c v ng qun t thm
du antislash \ trc mi dng mi
Code C:
int main (int argc, char *argv[ ])
{
if (22 >= 18)
printf ("Ban la nguoi truong thanh\n");
return 0;
}
C Code:
#define NGUOI_TRUONG_THANH(tuoi, ten) if (tuoi >= 18) \
printf ("Ban la nguoi truong thanh %s\n", ten);
int main (int argc, char *argv[ ])
{
NGUOI_TRUONG_THANH(22, "Minh")
return 0;
}
Bnh thng chng ta khng cn thit phi s dng thng xuyn cc macro.
Nhng mt s trng hp, trong cc th vin tng i phc tp nh wxWidgets hay
QT (th vin dng to cc ca s bn s c hc sau ny) s dng rt nhiu cc
macro. Ti thy vic hng dn bn k t lc ny s gip bn thch ng d dng hn
trong tng lai.
iu kin - Conditions
Hy nm r: bn c th to ra nhng iu kin trong preprocessor
y l v d v cch chng hot ng:
C Code:
#if condition
/* Nhung ma nguon (source code) se duoc bien dich neu dieu kien dua ra la dung */
#elif condition2
/* Neu dieu kien tren khong dung, nhung ma nguon (source code) se duoc bien dich neu dieu
kien 2 dung */
#endif
T kha #if cho php a vo mt iu kin cho preprocessor. #elif c ngha tng t nh l
else if.
Trong trng hp iu kin tha mn, on code pha sau s c bin dch. Nu khng n s b
xa i trong thi im bin dch chng trnh. V n s khng xut hin khi chng trnh hon
tt.
#ifdef v #ifndef
By gi chng ta s thy li ch ca vic #define mt constant khng xc nh trc gi tr, nh
ti c hng dn bn trc :
C Code:
#define CONSTANT
C code:
Code C:
#define WINDOWS
#ifdef WINDOWS
/* Ma nguon cho Windows */
#endif
#ifdef LINUX
/* Ma nguon cho Linux */
#endif
#ifdef MAC
/* Ma nguon cho Mac */
#endif
y l cch vit cc chng trnh c th hot ng trn nhiu h iu hnh khc nhau, v d
trong Windows, bn ch vic t vo #define WINDOWS, sau bin dch.
Nu bn vit chng trnh hot ng trn Linux (tt nhin l trong m ngun ca bn phi c
phn m ngun dnh ring cho Linux), bn ch cn thm vo: #define LINUX, bin dch li, v
ln ny my tnh s bin dch phn m ngun cho Linux, cc phn khc s c b qua.
Th no l mt inclusion v hn ? ?
File A.h cha mt dng include file B.h. Ni dung ca file B s c a vo trong file A.
Nhng, hy ngh n trng hp c chui sau, gi s file B.h li include ngc li ni dung ca
A.h? Trng hp ny trong lp trnh thng hay xy ra.
Trong thc t, v buc phi thc thin qu nhiu cc inclusion, preprocessor dng li v bo
"m, tao chn my ci inclusion c chui ny ca my lm ri !!" v t nhin vic bin dch b
crash.
Code C:
#ifndef DEF_FILENAME // Neu constant chua duoc xac dinh file nay chua duoc dua vao
#define DEF_FILENAME // Ta xac dinh constant de lan sau file nay se khong dua vao lai nua
/* Noi dung cua file.h (cac includes khac, cac prototypes cho cac functions, cac dong
defines...)*/
#endif
Hy tng tng, khi file.h c include ln u tin. My tnh c iu kin "Nu constant
DEF_FILENAME cha c xc nh ". V y chnh l ln u tin file c c, constant
vn cha xc nh, do , preprocessor s c ni dung bn trong if
Code C:
#define DEF_ FILENAME
iu quan trng y l i tn constant cho mi tp tin .h khc nhau. Khng c dng cng
mt constant cho tt c nhng file.h, nu khng my tnh ch c file.h u tin ch khng phi
cc file khc.
Oh, y l mt lu nh trc khi kt thc: Ti chn thnh khuyn bn thm vi dng trng
ngay sau #endif cui file.h ca bn.
trnh #endif l dng cui cng ca file, ti gp li khi bin dch v v ti v cng vt
v tm ra nguyn nhn xut pht t u. N bo li "No new line at the end of file"
C Code:
#endif
Hy tp trung v chng ta s tip tc s dng li nhng kin thc ny trong nhng bi hc tip
theo.
Lu rng cc th vin thng nh ngha theo kiu ring ca chng. Bn s khng phi mt
qu nhiu thi gian trc khi x l mt kiu bin, hoc c th sau ny l nhng kiu chng
trnh Window, Audio, Keyboard
Nhng cu trc thng c nh ngha trong file.h, cng ging nh khi khai bo nhng nguyn
mu (prototypes) hay nhng nh ngha (defines).
Chng ta cng xem mt VD:
C code:
struct TenCauTruc
{
int bien1;
int bien2;
int bienKhac;
double soThapphan;
};
V d v cu trc (struct):
Gi s bn mun to ra mt bin lu ta mt im trn mn hnh. Chc chn bn s cn
n mt cu trc nh th ny khi to ra cc game 2D trong nhng phn tip theo, y l c hi
nng cao trnh mt cht.
i vi nhng bn cha c nhiu kin thc v nhng khi nim hnh hc khng gian 2 chiu
th sau y l mt s gii thch c bn cho hnh hc 2 chiu (2D).
C code:
struct Toadodiem
{
int x; // hoanh do cua diem
int y; // tung do cua diem
};
Cu trc (srtuct) ca chng ta c tn l Toadodiem gm c 2 bin x v y ln lt biu
din honh trn trc x v tung trn trc y.
Nu mun bn hon ton c th to ra mt cu trc (struct) mi cho khng gian 3 chiu (3D), ch
vic thm vo mt bin z biu din ta trn trc (thng gi l cao ). Vi nhng
kin thc ny, chng ta c th to ra mt cu trc qun l cc im trong khng gian 3D.
C code:
struct Taikhoan
{
char ten[100];
char ho[100];
char diachi[1000];
int tuoi;
int gioitinh; // Boolean : 1 = nam, 0 = nu
};
S dng cu trc:
By gi nhng cu trc ca chng ta c nh ngha trong cc file.h v chng ta c th s
dng cc function ca chng trong file.c
Vy hy cng xem lm th no to mt bin mang kiu Toadodiem (cu trc c to trn):
C code:
#include "main.h" // File.h chua cac prototypes va structs
return 0;
}
Tuy nhin cc lp trnh vin thng cm thy li khi phi lun thm t kha struct mi khi
khai bo cc bin t to. gii quyt vn ny, h pht minh ra mt lnh c bit, h gi
n l typedef.
Typedef:
Tr li vi nhng file.h c cha nhng nh ngha cu trc Toadodiem ca chng ta.
C code:
typedef struct Toadodiem Toadodiem;
struct Toadodiem
{
int x; // hoanh do cua diem
int y; // tung do cua diem
};
Ti s gii thch cho bn v dng mi c thm vo ny, n s c chia lm 3 phn chnh (ni
thm vi bn l ti khng h mc li khi lp li cm Toadodiem 2 ln).
1. typedef: s ch ra cho my tnh bit rng chng ta ang t mt tn thay th cho cu trc.
2. struct Toadodiem: y l tn ca cu trc m bn s t tn thay th vi typedef.
3. Toadodiem: y chnh l tn m bn t thay th cho cu trc struct Toadodiem. Bn c th
t mt tn bt k m bn thch, ti t l Toadodiem cho cc bn thy rng khi dng typedef,
bn s to ra mt cm t thay th cho cu trc vi chc nng tng ng.
return 0;
}
Ti khuyn khch cc bn nn tp thi quen dng typedef vi cc cu trc ging nh cch ti
lm vi cu trc Toadodiem trong bi hc ny. Hu ht cc lp trnh vin u lm nh vy. Vic
ny s gip cc bn tit kim thi gian khi khng phi vit li nhiu ln t struct trong c on
code. C mt iu l l hnh nh mt lp trnh vin gii th thng kh li.
C code:
int main (int argc, char *argv[ ])
{
Toadodiem diembatky;
diembatky.x = 10;
diembatky.y = 20;
return 0;
}
Vy tm li, truy cp vo cc bin thnh phn ca cu trc chng ta s vit theo cch sau:
C code:
tenbientutao.tenBienThanhPhanTrongCauTruc
Bin t to diembatky tch bit vi bin thnh phn x v y trong cu trc Toadodiem.
C code:
int main (int argc, char *argv[ ])
{
Taikhoan nguoidung;
return 0;
}
Console:
Ten ban la gi ? Nhan
Ho cua ban la gi ? Sieu
Ho ten day du cua ban la Sieu Nhan
C code:
Taikhoan nguoichoi1, nguoichoi2;
C code:
Taikhoan nguoichoi[2];
C code:
nguoichoi[0].ten
Khi to mt cu trc:
i vi nhng cu trc cng ging nh cc bin, mng hay con tr, ti khuyn khch cc bn
nn khi to chng khng cha gi tr no ngay t u. Ti ni tht y, hy ti nhc li
mt cht, khi mt bin bnh thng c to ra, n s mang gi tr bt k ca a ch c my
tnh cp pht cho n. i khi bin mang gi tr 0, nhng i khi n li mang mt gi tr rc ca
mt chng trnh khc s dng trc , nhng gi tr rc ny thng khng c ngha
(chng hn nh: -69,69).
Sn tin ti s nhc li mt cht v cc cch khi to:
Bin: chng ta thng cho n mang gi tr 0 lc u (trong nhng trng hp n gin).
Con tr: chng ta thng t gi tr l NULL. NULL l mt nh ngha c sn trong th vin
stdib.h ni chung n cng c ngha l gi tr 0, nhng chng ta vn s dng NULL bit c
rng l con tr ch khng phi bin bnh thng.
Mng: chng ta thng t gi tr 0 cho mi phn t ca mng.
i vi cu trc (struct), vic khi to s c mt cht ging vi mng. Tht vy, chng ta cng
xem khi khi to mt bin cu trc th nh th no nh:
C code:
Toadodiem diembatky = {0, 0};
Nh , chng c th khai bo trong cu trc Taikhoan nhng thng tin nh ten, ho, diachi, tuoi,
gioitinh nh sau:
C code:
Taikhoan nguoidung = {"", "", "", 0, 0};
C nhn ti khng thng s dng cch ny. Ti thch s dng mt hm taoToadodiem vi chc
nng khi to cc bin cho bin diembatky ca ti.
lm c vic bn phi to ra bin con tr. Nu ti ch s dng bin bnh thng, mt bn
sao s c to ra trong hm (n khng phi l bin bn to) v hm s thay i gi tr ca
bn sao ch khng phi gi tr ca bin m bn khi to. Nu cm thy kh hiu on ny,
bn c th xem li bi hc c v con tr.
V vy, by gi chng ta s phi hc cch s dng con tr (pointer) trong cu trc (struct). Mi
th bt u c cht th v ri y.
C code:
Toadodiem* diembatky = NULL;
C code:
Toadodiem *diembatky = NULL;
Ti vn thng lm nh cch trn, v trong trng hp nh ngha nhiu con tr trn cng mt
dng th bn phi t du * trc mi con tr . VD:
C code:
Toadodiem *diembatky1 = NULL, *diembatky2 = NULL;
Gi mt hm vo cu trc:
Nhng g chng ta quan tm y l lm sao s dng mt con tr cu trc trong hm, t ta
c th thay i trc tip gi tr ca bin.
C code:
int main (int argc, char *argv[ ])
{
Toadodiem diembatkyCuatoi;
taoToadodiem(&diembatkyCuatoi);
return 0;
}
C code:
void taoToadodiem(Toadodiem* diembatky)
{
*diembatky.x = 0;
*diembatky.y = 0;
}
Trng tht n gin ... nhng ti sao chng ta li khng th lm iu ? Nguyn nhn l v du
chm phn cch ch lm vic vi cc k t, n khng hiu du * l g. Nhng chng ta cn s
dng du * truy cp vo v thay i gi tr ca bin.
C code:
void taoToadodiem(Toadodiem* diembatky)
{
(*diembatky).x = 0;
(*diembatky).y = 0;
}
on code trn hot ng, bn c th kim tra th. Nhng bin kiu cu trc Toadodiem
c a vo hm v khi to cho chng gi tr x=0, y=0.
Trong ngn ng C, chng ta thng khi to cc cu trc theo cch n gin m ta thy
trn.
Tuy nhin, i vi C++, vic khi to thng c thit lp trong cc hm.
C code:
(*diembatky).x = 0;
Nhng nhng nh lp trnh vin thin ti vn thy cch ny cha nhanh, h cm thy kh
chu vi nhng cp du ngoc n. Ngay sau , nhng v li bing thng minh ny sng
to ra phm tt sau y thay th:
C code:
*diembatky -> x = 0;
C code:
void taoToadodiem(Toadodiem* diembatky)
{
*diembatky->.x = 0;
*diembatky->.y = 0;
}
C code:
int main (int argc, char *argv[ ])
{
Toadodiem diembatkyCuatoi;
Toadodiem *contro = &diembatkyCuatoi;
diembatkyCuatoi.x = 10; // Lam viec voi mot bien ta su dung dau cham
contro -> x = 10; // Lam viec voi mot con tro ta su dung mui ten
}
Gi tr ca x c gn bng 10 theo 2 cch: u tin ta lm vic trc tip trn bin, ln th hai ta
lm vic thng qua con tr.
C code:
typedef enum Volume Volume;
enum Volume
{
LOW, MEDIUM, HIGH
}
C code:
Volume music = MEDIUM;
S kt hp ca nhng gi tr:
Bn c thy rng ti vit IN HOA nhng gi tr trong danh sch lit k. Vic ny gi cho cc
bn nh v nhng hng s (constants) v nh ngha (defines) ng khng ?
Tht vy, n cng gn nh tng t nhng khng hon ton ging hn.
Trnh bin dch s t ng gn mt s cho tng gi tr trong danh sch lit k.
Trong trng hp danh sch lit k Volume ca chng ta, LOW mang gi tr 0, MEDIUM v
HIGH ln lt mang gi tr 1 v 2. S lin kt c my tnh t ng sp xp, v n lun bt u
bng gi tr 0.
Khng ging nh #define l mt trnh bin dch to ra MEDIUM 1, kiu lit k khng phi l
mt tin x l. N ch gn ging thi.
Thc t l khi bn khi to mt bin music = MEDIUM, chng trnh s t gi tr 1 vo b
nh .
Tng kt:
Cu trc (struct) l mt kiu bin t to, bn c th t mnh to ra n v s dng trong
chng trnh ca bn. Bin ny do bn nh ngha, khng nh cc kiu bin c bn nh
int, double
Mt cu trc lun cha nhng bin thnh phn, nhng bin thnh phn ny l cc bin
c bn kiu int, double , tng t nh vi mng nhng cu trc c th cha nhiu bin
khc kiu.
M v ng mt tp tin:
c v ghi d liu trong mt tp tin chng ta s s dng cc hm (functions) c sn trong th
vin stdio m chng ta c hc trc gi.
Vng v cng chnh n l ni cha 2 function quen thuc printf v scanf. Nhng n khng
ch cha duy nht 2 function ny m cn c c nhng function c to ra lm vic vi cc
tp tin.
Tt c nhng th vin (libraries) m chng ta tng s dng cho ti nay (stdlib.h, stdio.h,
math.h, string.h ) c gi l cc th vin chun. Chng s c IDE t ng nhn din d
cho bn c chy chng trnh trn bt k h iu hnh no Windows, Linux, Mac hay mt h
iu hnh no .
C code:
#include <stdlib.h>
#include <stdio.h>
fopen: hm m mt tp tin:
Trong bi hc v chui k t (string), chng ta bit cch s dng nguyn mu hm
(prototype) nh mt hng dn s dng ca hm (function). cng l thi quen ph bin
ca cc lp trnh vin, h c cc prototypes hiu v nhng functions c trong on code.
C code:
FILE* fopen(const char* tenTaptin, const char* chedoMotaptin);
Hm ny c 2 tham s:
Tn tp tin c m.
Ch m tp tin, nhn vo tham s ny bn c th thy c n din t nhng g bn mun lm
vi tp tin: chng hn nh c hoc ghi d liu hoc c 2 chc nng cng lc.
FILE c ci qui g trong nhng ti ngh d c cha g i na cng khng nh hng nhiu
n cng vic ca chng ta.
y l quy tc do ti t t ra (v rt nhiu lp trnh vin khc cng lm theo quy tc tng t).
Bn khng bt buc phi lm theo nhng quy tc ca ti v ngi to ra th vin stdio chc cng
c nhng quy tc ca ring mnh. V l do duy nht ti c th gii thch cho bn ti sao FILE li
c vit hoa trong th vin stdio, l v ngi to ra n mun nh vy ^^!
C code:
int main (int argc, char *argv[ ])
{
FILE* taptin = NULL;
return 0;
}
Bn s thy rng vic vit struct FILE *taptin = NULL l khng cn thit. Ngi to ra
stdio cng to ra mt typedef nh ti dy bn ta c th vit l FILE *taptin = NULL.
C code:
int main (int argc, char *argv[ ])
{
FILE* taptin = NULL;
return 0;
}
Vy tp tin ny lc no cng phi nm cng th mc cha chng trnh thc thi .exe sao?
C code:
taptin = fopen("folder/test.txt", "r+");
C code:
taptin = fopen("C:\\Program Files\\Notepad++\\readme.txt", "r+");
C code:
taptin = fopen("/home/Minh/folder/readme.txt", "r+");
By gi c 2 trng hp c th xy ra:
Sau khi thc hin thao tc m tp tin chng ta c th kim tra xem c thnh cng khng. Cch
kim tra rt n gin thi: nu con tr mang gi tr NULL, m tp tin tht bi. Nu con tr mang
mt gi tr bt k no khc NULL, m tp tin thnh cng.
C code:
int main (int argc, char *argv[ ])
{
FILE* taptin = NULL;
if (taptin != NULL)
{
// khac gia tri NULL thi ban co the doc va ghi du lieu vao tap tin roi
}
else
{
// Ban co the cho no hien thi thong bao loi neu thich
printf ("Khong the mo tap tin test.txt");
}
return 0;
}
fclose: ng mt tp tin
Nu tp tin c m thnh cng th bn c th c v ghi thm d liu vo ni dung ca n (cht
na thi chng ta s thy cch lm).
Mt khi bn xong vic vi tp tin th bn phi ng n li ng khng? Chng ta s thc hin
thao tc ny bng fclose, vic ny c vai tr gip gii phng b nh cho my tnh, iu cng
c ngha l nhng tp tin c np vo RAM s c xa sch.
Prototype ca fclose l:
C code:
int fclose(FILE* taptin);
Hm ny ch c mt tham s: l con tr ca tp tin.
N tr v mt gi tr kiu int cho bit ng c tp tin cha, gi tr l:
Gi tr bng 0: Nu tp tin c ng thnh cng.
Gi tr l EOF (End Of File): Nu vic ng tp tin tht bi. EOF c nh ngha sn trong
stdio.h tng ng vi mt s c bit, gi tr ny c nhim v thng bo cho my tnh v mt li
xy ra.
ng mt tp tin chng ta s lm nh sau:
C code:
fclose(taptin);
Tm li chng ta s lm theo cch sau m v ng mt tp tin trong project nh sau:
C code:
int main (int argc, char *argv[ ])
{
FILE* taptin = NULL;
if (taptin != NULL)
{
// Ban co the doc va ghi du lieu vao noi dung tap tin
// ...
return 0;
}
Ti khng s dng else hin th thng bo li nu thao tc m tp tin tht bi. Nhng nu
mun, ti tin l bn bit cch lm m ng khng.
Hy lun nh ng tp tin li mi khi hon thnh cng vic, iu ny gip gii phng b nh ca
my tnh.
Nu bn khng gii phng b nh cho my tnh, sau khi hon thnh, chng trnh ca bn s
chim rt nhiu b nh v n c th khng s dng c. Vi nhng v d nh nh trn c l
bn s khng thy c s quan trng ca vic ny nhng trong mt chng trnh ln hn, y
tht s l mt vn quan trng.
Chng ta s bt u vi vic hc cch ghi d liu vo mt tp tin trc (cng n gin thi) v
sau bn s hc cch lm th no c tp tin.
Ghi vo mt tp tin:
C mt vi hm c chc nng ghi d liu vo tp tin, vic chn ra cch no thch hp nht l ph
thuc vo bn.
y l 3 hm m chng ta s hc:
Hm fputc:
C code:
int fputc (int kytu, FILE* taptin);
Hm ny c 2 tham s:
Tham s 1: Bin i din cho k t c vit thm vo (bin c khai bo kiu int, nh
ti tng ni vi bn n cng tng ng khi khai bo kiu char, khc ch s k t
c th s dng y nhiu hn). VD bn c th vit trc tip k t A.
Tham s 2: Con tr n tp tin vit. theo nh vd ca chng ta con tr tn l taptin. Li
th ca vic gi con tr taptin mi ln cn s dng l c th m nhiu tp tin cng lc v
nh vy bn c th c v vit thm vo mi tp tin. Bn khng b gii hn phi m 1 tp
tin ti 1 thi im.
Ging nh khi thao tc m tp tin thnh cng, ti khng thng kim tra xem fputc c thc hin
tt nhim v ca n khng, nhng nu bn mun th bn c vic kim tra li.
C code:
int main (int argc, char *argv[ ])
{
FILE* taptin = NULL;
if (taptin != NULL)
{
fputc('A', taptin); // Ghi them vao tap tin ky tu A
fclose(taptin);
}
return 0;
}
Hm fputs:
C code:
char* fputs(const char* chuoi, FILE* taptin);
C code:
int main (int argc, char *argv[ ])
{
FILE* taptin = NULL;
if (taptin != NULL)
{
fputs("Xin chao anh chang dep trai\nBan co khoe khong ?", taptin);
fclose(taptin);
}
return 0;
}
Hm fprintf:
C code:
int main (int argc, char *argv[ ])
{
FILE* taptin = NULL;
int tuoi = 0;
if (taptin != NULL)
{
// Sau y chng ta s hi tui
printf (" Ban bao nhieu tuoi ? ");
scanf ("%d", &tuoi);
return 0;
}
Bn c th vn dng li nhng kin thc hc v hm printf p dng cho vic ghi d liu
vo tp tin i vi hm fprintf. y cng l l do ti sao ti rt hay s dng fprintf mi ln mun
thm d liu vo tp tin.
c mt tp tin:
Chng ta s s dng li hu ht cc hm dng ghi d liu trn, ch c mt cht thay i
trong tn ca chng:
1. fgetc: c mt k t
2. fgets: c mt chui
3. fscanf: c mt chui c nh dng
Ln ny ti s i nhanh hn mt cht trong vic gii thch v nhng hm ny. Nu bn hiu
nhng g ti ni trn v vic ghi d liu vo tp tin th nhng kin thc ny ch l chuyn nh.
Hm fgetc:
Prototype l:
C code:
int fgetc(FILE* taptin);
C Code:
int main (int argc, char *argv[ ])
{
FILE* taptin = NULL;
int kytuHientai = 0;
if (taptin != NULL)
{
// Vong lap lan luot doc tung ky tu
do
{
kytuHientai = fgetc(taptin); // Doc ky tu
printf ("%c", kytuHientai); // In ky tu do ra man hinh
} while (kytuHientai != EOF); // fgetc tiep tuc duoc goi lai vi bien kytuHientai khac EOF
fclose(taptin);
}
return 0;
}
Console:
Xin chao, day la noi dung cua tap tin test.txt !
Hm fgets:
Hm ny s c mt chui trong tp tin. N s gip bn tit kim thi gian thay v phi c tng
k t mt. Hm s c mt chui trn mt dng (n s dng li khi gp k t xung dng \n).
Nu bn mun c nhiu dng th hy to ra mt vng lp.
C code:
char* fgets(char* chuoi, int soKytuDuocdoc, FILE* taptin);
Li ch: N s bo m rng chng ta s khng ri vo tnh trng trn b nh. Tht vy, nu
mt dng ca bn qu ln so vi chui, hm c th s phi c nhiu k t hn. iu ny c th
gy ra li cho chng trnh.
C code:
#define SO_KY_TU_TOI_DA 1000 // Kich thuoc cua mang la 1000
if (taptin != NULL)
{
fgets (chuoi, SO_KY_TU_TOI_DA, taptin); /* Co toi da SO_KY_TU_TOI_DA trong tap
tin duoc doc, chung duoc luu tru vao "chuoi" */
printf ("%s", chuoi); // Hien thi chuoi len man hinh
fclose (taptin);
}
return 0;
}
Console:
Xin chao, day la noi dung cua tap tin test.txt !
S khc bit y l chng ta khng s dng vng lp. N hin th ton b chui trong mt ln.
Chc hn l bn thy nhng li ch ca #define trong nhng dng code trn nhm xc nh
kch thc cho mng, VD nh SO_KY_TU_TOI_DA c s dng 2 ln trong on code:
if (taptin != NULL)
{
while (fgets(chuoi, SO_KY_TU_TOI_DA, taptin) != NULL); /* Cu viec doc noi dung tap
tin mien sao khong xuat hien loi (NULL)*/
printf ("%s", chuoi); // Hien thi noi dung doc duoc len man hinh
fclose(taptin);
}
return 0;
}
Dng code trn thc hin 2 vic: N s c ni dung ca mt dng trong tp tin v kim tra xem
fgets c tr v gi tr NULL hay khng. C th hiu ni dung ca dng code trn l c ni
dung ca mt dng v tip tc c dng tip theo cho ti khi kt thc tp tin.
Hm fscanf:
Vn l mt nguyn tc hot ng tng t vi hm scanf m chng ta tng hc.
C code:
int main (int argc, char *argv[ ])
{
FILE* taptin = NULL;
int diemso[3] = {0}; // Mang chua 3 gia tri diem so cao nhat
if (taptin != NULL)
{
fscanf (taptin, "%d %d %d", &diemso[0], &diemso[1], &diemso[2]);
printf ("Cac diem so cao nhat la: %d, %d va %d", diemso[0], diemso[1], diemso[2]);
fclose (taptin);
}
return 0;
}
Console:
Cac diem so cao nhat la: 15, 20 va 30
Nh bn s thy, hm fscanf s nhn bit 3 gi tr c phn cch nhau bng nhng khong trng
("%d %d %d"). N s a vo mng ca chng ta 3 thnh phn. Sau bn c th dng printf
hin th mi gi tr nhn c.
Di chuyn mt tp tin:
Khi ny, ti ni vi bn v mt du nhy o ng khng? By gi chng ta s tm hiu chi
tit hn thy ht cng dng ca n.
C code:
long ftell (FILE* taptin);
Hm fseek:
Prototype ca hm fseek l:
C code:
int fseek(FILE* taptin, long vitri_chuyenden, int vitri_hientai);
Nu bn ghi thm d liu vo sau v tr kt thc ca tp tin, my tnh s b sung thm d liu
cho tp tin ca bn (ln sau khi m li tp tin ny bn s thy nhng thng tin c b sung
thm v tr cui cng).
Hm fseek c th s khng hot ng tt khi dng n m nhng tp tin cha ni dung dng
vn bn. Ni chung ngi ta thng dng n m cc tp tin cha ni dung dng nh phn.
Khi mt ngi c hoc ghi d liu trong tp tin dng vn bn, thng th k t s c
thay th bng k t. iu duy nht hu dng trong ch tp tin vn bn khi s dng hm fseek
l n gip a bn v v tr u hoc cui tp tin.
C code:
void rewind (FILE* taptin);
i tn v xa tp tin:
Chng ta s kt thc bi hc k ny vi 2 hm n gin:
rename: i tn tp tin.
remove: xa tp tin.
Hm rename: i tn tp tin.
Prototype ca hm l:
C code:
int rename(const char* teCu, const char* tenMoi);
C code:
int main (int argc, char *argv[ ])
{
rename("test.txt", "test_rename.txt");
return 0;
}
Hm remove: Xa tp tin.
C code:
int remove(const char* tentaptinMuonXoa);
C code:
int main (int argc, char *argv[ ])
{
remove("test.txt");
return 0;
}
Kt thc bi hc!
Bi 8: Cp pht ng
C code:
int number = 0;
Thc t l lu tr mt s chy t -128 n 127 (mt bin kiu float), my tnh ch cn 1 byte
trong b nh, n tht s rt nh.
Tuy nhin vi mt bin int, n thng chim 4 byte trong b nh, cn vi mt bin kiu double
s l 8 byte.
V mc ch ca chng ta l kim tra xem mi kiu bin s chim bao nhiu b nh trn my
tnh ca bn.
C code:
sizeof(int)
VD:
C code:
printf ("char : %d byte\n", sizeof(char));
printf ("int : %d byte\n", sizeof(int));
printf ("long : %d byte\n", sizeof(long));
printf ("double : %d byte\n", sizeof(double));
Bn s nhn thy rng kiu long v int chim cng mt dung lng b nh. Vic to mt bin
kiu long cng s chim 4 byte nh khi to mt bin int.
Tht ra th kiu long chnh l long int, tng t nh kiu int. n gin l n cng ch to ra
thm mt ci tn mi ch khng c g nhiu, ch vy thi! Trc y khi b nh my tnh vn
cha tt nh by gi th nhng ci tn khc nhau ca kiu bin thc s rt hu dng cho my
tnh ca chng ta. Cc lp trnh vin ngy trc lun phi suy ngh chn kiu bin ph hp
nht tit kim ti a b nh.
Vy chng ta c th bit kch thc ca nhng kiu bin ty chnh do mnh to ra (chng
hn nh i vi cu trc structure)
C code:
typedef struct Toado Toado;
struct Toado
{
int x;
int y;
};
return 0;
}
Console:
Toado : 8 byte
Vi nhng cu trc cha nhiu bin thnh phn th s chim nhiu b nh hn. Qu l hp l
lun ng khng ?
C code:
int number = 18;
Gi s bin c cp pht cho a ch 1600 trong b nh. Chng ta cng xem hnh sau thy r
hn:
C code:
int mang[100];
Vy thm ch mng khng cha g trong th n vn chim trc 400 byte b nh sao?
C code:
Toado mang[100];
iu quan trng l bn phi c gng hiu nhng tnh ton nh ca phn sau.
Cp pht ng.
Mi khi mun thc hin vic cp pht b nh ng theo cch th cng, bn nn thc hin ln
lt 3 bc sau:
C code:
void* malloc(size_t soByteCansudung);
Nu ti mun vui v mt cht (e hm!), ti s t mnh to mt bin kiu int trong b nh, ti
ang cp n vic s dng malloc vi sizeof (int) byte trong b nh.
C code:
int* capphatBonho = NULL; // Tao mot con tro kieu int
capphatBonho = malloc(sizeof(int)); // Nhung dia ch danh cho con tro da duoc danh rieng
C code:
int main (int argc, char *argv[ ])
{
int* capphatBonho = NULL;
capphatBonho = malloc(sizeof(int));
if (capphatBonho == NULL) // Neu viec cap phat bo nho ko thanh cong
{
exit(0); // Chung ta se ngung chuong trinh ngay lap tuc
}
// Chuong trinh se tiep tuc hoat dong neu moi viec dien ra thuan loi
return 0;
}
Nu gi tr con tr khc NULL, chng trnh c th tip tc hot ng, ngc li n s hin th
thng bo li hoc ngng chng trnh ngay lp tc. Nguyn nhn c th l do dung lng b
nh bn yu cu vt qu kh nng ca my tnh.
Cng ging nh khi ta s dng fclose ng tp tin khi khng cn s dng n, chng ta s s
dng hm free gii phng nhng vng b nh khng cn cn s dng na.
C code:
void free(void* contro);
Nhn chung th cch hot ng cng khng c qu nhiu im khc bit so vi nhng g ta
hc khi thao tc vi tp tin.
C code:
int main (int argc, char *argv[ ])
{
int* capphatBonho = NULL;
capphatBonho = malloc(sizeof(int));
if (capphatBonho == NULL) // chung ta kiem tra xem bo nho da duoc cap phat chua
{
exit(0); // Error: co loi va chuong trinh se bi ngung ngay lap tuc
}
return 0;
}
V d c th.
V vy cho nn nhng dng code nhn s phc tp hn. Nhng cc bn hy c gng hiu c n
i, iu ny tht s quan trng y:
C code:
int main (int argc, char *argv[ ])
{
int* capphatBonho = NULL;
// Su dung bo nho
printf ("Ban bao nhieu tuoi ? ");
scanf ("%d", capphatBonho);
printf ("Ban %d tuoi\n", *capphatBonho);
return 0;
}
Console:
Ban bao nhieu tuoi ? 69
Ban 69 tuoi
Tr li vi on code ca chng ta. Bin kiu int c cp pht ng. Suy cho cng nhng g
bn vit cng ging nh trc y khi tin trnh ny din ra mt cch t ng:
C code:
int main (int argc, char *argv[ ])
{
int bienCuatoi = 0; // Cap phat bo nho (qua trinh dien ra hoan toan tu dong)
// Su dung bo nho
printf ("Ban bao nhieu tuoi ? ");
scanf ("%d", &bienCuatoi);
printf ("Ban %d tuoi\n", bienCuatoi);
return 0;
} // Giai phong bo nho (dien ra tu dong moi khi ket thuc ham)
Ti khng hiu sao chng ta phi hc ci cch phc tp ny v liu c cn thit khng?
C phi bn ang t hi, vy th khi no chng ta nn dng phng php ny? Thng th ngi
ta s dng phng php cp pht ng khi to ra mt mng (array) m ta khng bit trc kch
thc ca n khi chy chng trnh l bao nhiu.
C code:
int tuoiBanbe[15];
C code:
int banbe[soluongBanbe];
C code:
banbe = malloc(soluongBanbe * sizeof(int));
C code:
int main (int argc, char *argv[ ])
{
int soluongBanbe = 0, i = 0;
int* tuoiBanbe = NULL; // con tro nay se duoc su dung nhu mot mang sau khi dung malloc
// Chung ta se yeu cau nguoi dung cho biet so luong ban be cua ho
printf ("Ban co bao nhieu nguoi ban ? ");
scanf ("%d", &soluongBanbe);
if (soluongBanbe > 0) // Phai co it nhat mot nguoi ban (xin chia buon neu ko co ai ^^!)
{
tuoiBanbe = malloc(soluongBanbe * sizeof(int)); // Phan phoi bo nho cho mang
if (tuoiBanbe == NULL) // Kiem tra xem viec cap phat bo nho co thanh cong ko?
{
exit(0); // Chuong trinh ngung lai ngay lap tuc
}
// Giai phong bo nho da duoc cap phat cho mang boi malloc, no ko con can thiet nua.
free(tuoiBanbe);
}
return 0;
}
Console:
Ban co bao nhieu nguoi ban ? 5
Nguoi ban thu 1 bao nhieu tuoi ? 18
Nguoi ban thu 2 bao nhieu tuoi ? 19
Nguoi ban thu 3 bao nhieu tuoi ? 20
Nguoi ban thu 4 bao nhieu tuoi ? 21
Nguoi ban thu 5 bao nhieu tuoi ? 22
Tng kt:
Mt bin s chim khng gian b nh nhiu hay t l ty thuc vo kiu ca n (int hay
double hay char )
Ngi ta c th bit c s byte m kiu bin s chim trong b nh bng cch s
dng sizeof ( ).
Cp pht ng l hnh ng d tr vng nh cho bin hoc mng.
Vic phn b b nh c thc hin vi hm malloc ( ) v iu quan trng ng nn
qun l hy nh gii phng b nh bng hm free ( ) ngay sau khi bn khng cn n
vng nh na.
c bit cp pht ng cho php to ra mng c kch thc c xc nh bi mt bin
trong khi chy chng trnh.
Bi 9: Test Program
Tr chi ngi treo c
a phn chng ta u tng bit qua tr ngi treo c ri ng ko? Nhng m by gi nhc
li mt cht v cch chi cng ch mt g ng ko: Mc tiu ca tr chi l tm ra t b n sau
ti a 10 ln on (bn cng c th t mnh thay i s ln on ti a ty chnh kh).
Quy cch chi.
Gi s t kha b n l RED.
Bn on ch A v my tnh s kim tra xem ch A c nm trong t ang b n ko.
C 2 kh nng s xy ra:
Ch ci bn on c cha trong t b n, lc ny mn hnh s hin th ch m bn tm
thy trong t b n .
Ch ci bn on khng c trong t ang b n (chng hn nh khi ny bn on ch A
nhng t b n l RED th lm g c ch A): My tnh s thng bo cho ngi chi l ch
va c on khng c cha trong t ang b n v t ng tr bt i mt ln on ca
h. Cho ti khi chng ta s dng ht tt c cc lt on m vn cha tm ra t b n th
xc nh l thua cmnr!!! n y th GAME OVER.
Bn cng bit trong thc t khi chi tr ny trn my tnh hoc kim t in th mi ln
chng ta on sai, hnh nh mt ngi b treo c s c v thm vo 1 nt cho n khi bn on
ng t b n hoc on sai ht th hnh v hon thnh (cng c ngha l b treo c v thua). Vi
console th chng ta ko thit k sinh ng nh vy c v ch hin th ch ci c thi, v vy
c g xi ny, chng ta s hin th mt cu thng bo Bn cn xxx ln on trc khi ngi ny
b treo c mi khi on sai cho n khi ht lt on.
Console:
Tu bi an: **D
Console:
Tu bi an: R*D
Console:
Tu bi an: E**E**E**
Console:
Chao mung ban tham gia tro choi NGUOI TREO CO!
Console:
Ban co 3 luot doan.
Tu bi an la gi? FACEB**K
Hay doan mot chu cai: O
C code:
scanf ("%c", &chuCaiBiMat);
C code:
int main (int argc, char* argv[ ])
{
char chuCaiBiMat = 0;
return 0;
}
Chuyn g xy ra?
// Lan luot doc tiep cac ky tu khac cho den khi gap \n
while (getchar ( ) != '\n') ;
Sao li xut hin du chm phy v tr kt thc dng cha vng lp while v chng ta
cng khng thy cp ngoc nhn ca vng lp nh ta hc cc bi trc.
Nhng nu l bn khng bit k thut c bit trn th vng lp trong code ca bn s nh sau:
C code:
while (getchar( ) != '\n')
{
Khng c g trong cp du ngoc nhn l hon ton bnh thng, bi v trong trng hp ny
chng ta tht s khng c cu lnh no cn thc hin c. Vic s dng du chm phy thay th
cho cp du ngoc nhn ch gip code ca bn gn gng hn thi.
Cui cng, hm docKytu s tr v k t u tin n c c, cng chng l gi tr ca bin kytu.
Tm li, c c mt t trong code ca bn, chng ta s khng s dng:
C code:
scanf ("%c", &chuCaiBiMat);
C code:
chuCaiBiMat = docKytu( );
Danh mc t b n:
Bt u chng trnh test ca bn, ti s yu cu bn t nhng t b mt trc tip vo nhng
dng code. V d nh sau:
C code:
char tuBimat [ ] = "LOVE"
Ci g gi l danh mc cc t b mt?
LOVE
MONEY
PROGRAM
FUNCTION
POINTER
LOOP
INSTRUCTION
STRING
VARIABLE
CONSTANT
DEFINE
gii quyt vn , c hai gii php. Bn c th nh ngha s t cha trong danh mc ngay
dng u tin ca tp tin:
3
LOVE
MONEY
LIFE
Tuy nhin, cch ny hi nhm chn, bi v chng ta s phi t mnh cp nht li thng s mi
ln thm vo 1 t trong danh mc (cch ny vn cn 1 cht bt tin im ny). V vy ti gi
cc bn c th to ra chc nng t ng m s t c cha trong tp tin danh mc t b n cho
chng trnh ca bn. Cng n gin thi, tng lin quan n vic m k t \n mi dng
trong tp tin.
Ti nhng cho bn suy ngh v gii php ny y. Ti s khng gip bn thm na nu khng
y u cn l chng trnh test ca bn na. Hy s dng tt c nhng kin thc m bn
c hc, bn hon ton c th thit k tr chi ny theo nh ti ni. C th s mt t nhiu
thi gian cng nh bn s cm thy d hoc kh nhng hy c gng t mnh sp xp, t chc
mi th theo cch ca bn (nh to function cho nhng g bn mun chng trnh lm nh),
ri bn cng s lm c thi.
Chc may mn, v hn na l ng nn ch !!!
ng c ngh rng ti ch vic t t xung mt cht l vit xong chng trnh. Ti cng nh
cc bn thi, cng phi bt u t nhng g n gin nht v ci tin chng t t c c kt
qu cui cng nh mnh mun.
Ti cng tng qun nhng kin thc c bn nh: qun khi to gi tr khi khai bo bin, qun
t cc nguyn mu hm (prototype) hoc xa i nhng bin khng cn gi tr s dng trong
chng trnh gii phng b nh. Thm ch, ti phi th nhn vi bn l ti cn qun c vic
t du chm phy cui cu lnh (instruction).
D c th nhng ti s khng vit ton b code cho bn thy mt ln. S rt di v nhn kh kinh
khng, ti s s lm cc bn b chong.
C code:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
return 0;
}
No, hy bt u bng vic khai bo nhng bin cn thit. Hy yn tm, ti khng ngh ht v
tt c nhng bin cn khai bo cho chng trnh cng mt lc, t ra th vn t hn ln u tin ti
tp tnh vit code:
C code:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
return 0;
}
Ti c tnh khai bo mi bin trn mt dng ring bit v ghi ch thm cho tng bin cc
bn d hiu. Trong thc t, bn khng bt buc phi ghi ch tt c ra nh th v c th khai bo
tt c nhng bin cng kiu trn cng mt dng.
Cc bin trn c khai bo kh hp l ng khng: bin kytu lu tr k t ngi chi on
c, bin tuBimat lu tr t b mt ca chng ta, boen soluotDoan m s lt on cn
li ca ngi chi (lt on = 0 ngha l thua)
Bin i l bin h tr ti lm vic vi mng, vng lp, n s gip bn kt thc vng lp.
Cui cng, bin m bn cn phi ngh n nht, th khc bit vi nhng bin cn li, mng
sokytuBimat cha cc thnh phn kiu Bolean. th bn s thy ti quy nh kch thc
sn cho n ng vi s k t ca t b n (l 8 k t). Khng phi mt s ngu nhin nh: mi
mt thnh phn trong mng i din cho mt k t ca t b mt. u tin i din cho k t
u tin, th 2 l k t th 2 v c th cho n k t cui.
C code:
printf ("Chao mung den voi tro choi Nguoi treo co !\n\n ");
C code:
while (soluotDoan > 0 && !win (sokytuBimat))
{
Ti khng th gii thch chi tit cho bn v function win ngay by gi nhng chng ta s ni v
n sau t pht na. By gi bn tm thi ch cn bit chc nng m n s lm trong chng trnh.
Xem th nh:
C code:
printf("\n\n Ban co %d luot doan de choi", soluotDoan);
printf("\n Tu bi mat la gi ?");
C code:
printf ("\n Xin moi ban doan mot ky tu: ");
kytu = docKytu( );
C code:
// Neu ky tu nhap vao khong dung
if (!kiemtraKytu (kytu, tuBimat, sokytuBimat))
{
soluotDoan--; // Giam bot mot lan doan cua nguoi choi
}
}
Chng ta kim tra xem k t ngi chi nhp vo c cha trong t b mt khng. on code trn
gi hm kiemtraKytu thc hin iu v t na bn s thy c th hm trng nh th no.
Khi ra khi vng lp chnh ca tr chi, chng trnh s kim tra xem liu ngi chi thng
hay cha trc khi chng trnh ngng li.
C code:
if (win(sokytuBimat))
printf ("\n\n Chuc mung, ban da chien thang ! Tu bi mat la : %s", tuBimat);
else
printf ("\n\n Xin chia buon, ban da thua !\n\n Tu bi mat la : %s", tuBimat);
return 0;
}
Chng ta dng hm win kim tra xem ngi chi c thng hay khng hin th thng bo
cho h bit.
C code:
int win(int sokytuBimat[ ])
{
int i = 0;
int nguoichoiChienThang = 1;
return nguoichoiChienThang;
}
C code:
int kiemtraKytu(char kytu, char tuBimat[ ], int sokytuBimat[ ])
{
int i = 0;
int kytuChinhXac = 0;
// Kiem tra xem ky tu cua nguoi choi da doan co nam trong tu bi mat ko
for (i = 0 ; tuBimat[i] != '\0' ; i++)
{
if (kytu == tuBimat[i]) // Neu ky tu co chua trong tu bi mat
{
kytuChinhXac = 1; // Ky tu se duoc luu tru gia tri the hien no la ky tu chinh xac
sokytuBimat[i] = 1; // Gui gia tri 1 vao o tuong ung voi vi tri cua ky tu do trong mang
}
}
return kytuChinhXac;
}
Trc khi tip tc, vic u tin cn lm l to ra mt danh mc t b mt cho tr chi. thi
im ny. d n ngn hay di khng quan trng, ch l lm th nghim cho bi hc ny thi.
LOVE
MONEY
PROGRAM
FUNCTION
POINTER
LOOP
INSTRUCTION
STRING
VARIABLE
CONSTANT
DEFINE
Sau khi hon thnh chng trnh, d nhin ti s c th quay li danh mc trn v thm vo tp
tin nhng t b mt khc tng thm s phong ph cho tr chi.
Xem th no:
C code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "danhmuc.h"
Hm chonTu:
Hm ny s cn mt tham s. l mt con tr n vng b nh, ni m n c th lu tr t
ngu nhin trong danh mc vo. Con tr ny s c cung cp bi main ( ).
C code:
int chonTu(char *tuDuocChon)
{
FILE* danhmuc = NULL; // Con tro tap tin de chua cac tap tin cua chung ta
int soThuTuCuaTu = 0, soThuTuCuaTuDuocChon = 0, i = 0;
int luuKytu = 0;
Ti to mt s bin cn thit cho chng trnh ca chng ta. Trong main ( ), c th bn thy
ti khng to ra tt c bin cng mt lc ngay khi mi bt u, c nhng th bn c th to ra
sau nu bn nhn thy bn cn n chng.
Tn ca cc bin trn cng cho bn thy nhim v, chc nng ca chng ri. Chng ta c con
tr danhmuc c tp tin danhmuc.txt, nhng bin tm thi lu tr k t
No xem th nh:
C code:
danhmuc = fopen("danhmuc.txt", "r"); // Tap tin duoc mo trong che do "read-only"
// Chung ta kiem tra xem thao tac mo tap tin co thanh cong khong
if (danhmuc == NULL) // Neu ban khong the mo tap tin
{
printf ("\n Khong the mo danh muc tu bi mat");
return 0; // Tra ve gia tri 0 cho biet thao tac mo tap tin that bai
// Sau khi nhan duoc gia tri tra ve cua return, ham ket thuc.
}
C code:
// Dem cac tu duoc chua trong tap tin (chi viec dem co bao nhieu ky tu \n thoi)
do
{
luuKytu = fgetc(danhmuc);
if (luuKytu == '\n')
soThuTuCuaTu ++;
} while(luuKytu != EOF);
C code:
soThuTuCuaTuDuocChon = tuNgauNhien(soThuTuCuaTu); // Chon mot tu ngau nhien
C code:
// Chuong trinh doc lai tu dau tap tin va ngung lai khi tim thay tu ngau nhien duoc chon
rewind(danhmuc);
while (soThuTuCuaTuDuocChon > 0)
{
luuKytu = fgetc(danhmuc);
if (luuKytu == '\n')
soThuTuCuaTuDuocChon --;
}
C code:
/* Con tro tap tin danhmuc duoc dat dung vi tri cua no.
Chung ta su dung ham fgets va quy dinh ham khong doc qua so luong ky tu cho phep*/
fgets(tuDuocChon, 100, danhmuc);
#endif
Tp tin danhmuc.c
V sau y l ton b ni dung ca tp tin danhmuc.c, xin mi cc bn thng thc:
C code:
/*
Nguoi Treo Co
danhmuc.c
------
Nhung function nay se chon ra mot tu ngau nhien trong tap tin chua danh muc tu bi an cua tro
choi Nguoi Treo Co
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "danhmuc.h"
// Chung ta kiem tra xem thao tac mo tap tin co thanh cong khong
if (danhmuc == NULL) // Neu ban khong the mo tap tin
{
printf ("\n Khong the mo danh muc tu bi mat");
return 0; // Tra ve gia tri 0 cho biet thao tac mo tap tin that bai
// Sau khi nhan duoc gia tri tra ve cua return, ham ket thuc.
}
// Dem cac tu duoc chua trong tap tin (chi viec dem co bao nhieu ky tu \n thoi)
do
{
luuKytu = fgetc(danhmuc);
if (luuKytu == '\n')
soThuTuCuaTu++;
} while(luuKytu != EOF);
// Chuong trinh doc lai tu dau tap tin va ngung lai khi tim thay tu ngau nhien duoc chon
rewind(danhmuc);
while (soThuTuCuaTuDuocChon > 0)
{
luuKytu = fgetc(danhmuc);
if (luuKytu == '\n')
soThuTuCuaTuDuocChon--;
}
/* Con tro tap tin danhmuc duoc dat dung vi tri cua no.
Chung ta su dung ham fgets va quy dinh ham khong doc qua so luong ky tu cho phep*/
fgets(tuDuocChon, 100, danhmuc);
C code:
#include <string.h>
#include "dico.h"
Bn khng c qun gii phng b nh cn s dng cho nhng mc ch khc nh. cng
chnh l l do cho s xut hin ca free ( ) cui main.c.
C code:
int main(int argc, char* argv[ ])
{
char kytu = 0; // Bien nay se luu tru ky tu cua nguoi choi (duoc tra ve boi ham scanf)
char tuBimat[100] = {0}; // Day la tu bi mat can tim ra
int *sokytuBimat = NULL; /* Mot mang co chua cac thanh phan dang Bolean. Moi o trong
mang se tuong ung voi mot ky tu nguoi choi se doan. Neu doan dung thi gia tri = 1, va neu sai thi
gia tri = 0 */
int soluotDoan = 10; // So luot doan con lai cua nguoi choi (0 = thua)
int i = 0; // Bien ho tro
int dodaiTu = 0;
C code:
if (!chonTu(tuBimat))
exit(0);
C code:
sokytuBimat = malloc(dodaiTu * sizeof(int)); /* mang sokytuBimat se duoc cap phat dong bo
nho (luc dau chung ta khong biet duoc kich thuoc cua mang nay) */
if (sokytuBimat == NULL)
exit(0);
Sau dng if kim tra gi tr ca con tr c bng NULL khng. Trong trng hp nu bng
NULL, chng t vic cp pht b nh tht bi, chng ta s dng chng trnh ngay lp tc
(bng cch gi hm exit (0) )
y l tt c nhng g bn cn chun b cho chng trnh. Su y chng ta cn thay i nt
phn cn li ca main.c thay th tt c cc con s 8 (s th hin di ca t FACEBOOK
m ta gi nh l t b mt lc u bi hc) bng bin dodaiTu. VD:
C code:
for (i = 0 ; i < dodaiTu ; i++)
sokytuBimat[i] = 0;
Ti cng phi thit k li prototype ca function win thm vo bin dodaiTu. Nu khng cc
hm s khng bit khi no phi dng vng lp.
C code:
/*
Nguoi Treo Co
main.c
------
Nhung function nay se chon ra mot tu ngau nhien trong tap tin chua danh muc tu bi an cua tro
choi Nguoi Treo Co
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "danhmuc.h"
printf ("Chao mung den voi tro choi Nguoi treo co !\n\n ");
if (!chonTu(tuBimat))
exit(0);
dodaiTu = strlen(tuBimat);
sokytuBimat = malloc(dodaiTu * sizeof (int)); /* mang sokytuBimat se duoc cap phat dong bo
nho (luc dau chung ta khong biet duoc kich thuoc cua mang nay) */
if (sokytuBimat == NULL)
exit(0);
/* Chung ta se tiep tuc tro choi neu con it nhat mot luot doan
Va van chua tim duoc tu bi mat*/
while (soluotDoan > 0 && !win(sokytuBimat, dodaiTu))
{
printf ("\n\n Ban co %d luot doan de choi ", soluotDoan);
printf ("\n Tu bi mat la gi ?");
if (win(sokytuBimat, dodaiTu))
printf ("\n\n Chuc mung, ban da chien thang ! Tu bi mat la : %s", tuBimat);
else
printf ("\n\n Xin chia buon, ban da thua !\n\n Tu bi mat la : %s", tuBimat);
free (sokytuBimat); // Giai phong bo nho da duoc phan bo (boi ham malloc)
return 0;
}
char docKytu( )
{
char kytuNhapVao = 0;
// Lan luot doc tiep cac ky tu khac cho den khi gap \n
while (getchar( ) != '\n') ;
return nguoichoiChienThang;
}
// Kiem tra xem ky tu cua nguoi choi da doan co nam trong tu bi mat ko
for (i = 0 ; tuBimat[i] != '\0' ; i++)
{
if (kytu == tuBimat[i]) // Neu ky tu co chua trong tu bi mat
{
kytuChinhXac = 1; // Ky tu se duoc luu tru gia tri the hien no la ky tu chinh xac
sokytuBimat[i] = 1; // Gui gia tri 1 vao o tuong ung voi vi tri cua ky tu do trong mang
}
}
return kytuChinhXac;
}
tng ci tin:
Ch, tr Ngi treo c ny c hi phc tp vi bn khng. By gi bn c mt chng
trnh chn ra t ngu nhin t mt tp tin ri ng khng.
Sau y l mt s tng ci tin bn th sc:
Hin nay, chng ta ch mi cho php mi ngi chi mt ln. Ngha l chng trnh s
ngng li khi c ngi chin thng hoc s dng ht lt on. By gi, bn hy th to
mt yu cu ngi chi xem h c mun chi li khng.
Bn cng c th to ra ch chi 2 ngi, ngi th nht s nhp t b n vo cho
ngi th 2 on.
Mc d khng bt buc nhng sao bn khng th v hnh ngi b treo c trn mn hnh
console (nh cc kim t in hay c) gi l bn c th lm bng hm printf.
Hy c gng b thi gian ra hiu bi hc ny v ci tin n ht mc c th nh.
C ln no, ng nn lng.