Ng«n ng÷ lËp tr×nh C phÇn I: c¸c kh¸i niÖm c¬ b¶n Bµi 1.

Më ®Çu
Tãm t¾t lÞch sö ph¸t triÓn cña ng«n ng÷ C
Ng«n ng÷ lËp tr×nh C do Dennis Ritchie t¹o lËp v o n¨m 1972 t¹i Bell Telephone Laboratories. Môc ®Ých ban ®Çu cña ng«n ng÷ n y l ®Ó thiÕt kÕ hÖ ®iÒu h nh UNIX. C l mét ng«n ng÷ m¹nh v mÒm dÎo nªn nã ® ®îc rÊt nhiÒu ngêi sö dông. Kh¾p n¬i ngêi ta ® b¾t ®Çu dïng nã ®Ó viÕt mäi lo¹i ch¬ng tr×nh. Tuy nhiªn, c¸c tæ chøc kh¸c nhau ® b¾t ®Çu sö dông c¸c version kh¸c nhau cña C, v ® ph¸t sinh nhiÒu sù kh¸c nhau trong c¸c thao t¸c l m cho ngêi lËp tr×nh ph¶i ®au ®Çu. §Ó kh¾c phôc vÊn ®Ò n y, n¨m 1983, ViÖn Tiªu chuÈn Quèc gia cña Mü (ANSI) ® th nh lËp mét ñy ban ®Ó ®a ra mét ®Þnh nghÜa chuÈn cho ng«n ng÷ C, ®îc gäi l ANSI Standard C. Cã lÏ ph¶i nãi thªm mét chót vÒ tªn cña ng«n ng÷. Ng«n ng÷ n y cã tªn l C v× tríc nã ® cã mét ng«n ng÷ ®îc gäi l B. Ng«n ng÷ B do Ken Thompson ph¸t triÓn còng t¹i Bell Labs. Cã thÓ, B l ®Ó chØ tªn cña phßng thÝ nghiÖm, cßn C ch¾c l do ®øng sau B.

T¹i sao l¹i dïng C?
Trong thÕ giíi lËp tr×nh ng y nay, cã rÊt nhiÒu ng«n ng÷ lËp tr×nh bËc cao ®Ó lùa chän, ch¼ng h¹n nh C, Pascal, BASIC, Modula, v.v. TÊt c¶ ®Òu l nh÷ng ng«n ng÷ tuyÖt vêi phï hîp cho hÇu hÕt c¸c c«ng viÖc lËp tr×nh. Nhng tuy vËy, vÉn cã mét v i lý do ®Ó nhiÒu nh lËp tr×nh chuyªn nghiÖp c¶m thÊy C l ng«n ng÷ ®øng ®Çu, v×: C l mét ng«n ng÷ m¹nh v mÒm dÎo. H¹n chÕ duy nhÊt cña C chÝnh l sù h¹n chÕ trong t duy trõu tîng cña chÝnh ngêi lËp tr×nh m th«i. C ®îc sö dông cho nhiÒu môc ®Ých kh¸c nhau, nh thiÕt kÕ c¸c hÖ ®iÒu h nh, c¸c bé so¹n th¶o v¨n b¶n, ®å ho¹, trang tÝnh, v thËm chÝ l m c¸c ch¬ng tr×nh dÞch cho c¸c ng«n ng÷ kh¸c. C l mét ng«n ng÷ b×nh d©n ®îc nhiÒu ngêi lËp tr×nh chuyªn nghiÖp a dïng. B»ng chøng l ® cã rÊt nhiÒu ch¬ng tr×nh dÞch kh¸c nhau v nhiÒu tiÖn Ých kÌm theo. C l mét ng«n ng÷ chuyÓn ®æi ®îc tøc l mét ch¬ng tr×nh C ®îc viÕt cho mét hÖ m¸y vi tÝnh (vÝ dô IBM PC) cã thÓ ®îc dÞch v ch¹y trªn mét hÖ thèng kh¸c (vÝ dô DEC VAX) m chØ cÇn thay ®æi chót Ýt hoÆc kh«ng cÇn thay ®æi g× c¶.

C l mét ng«n ng÷ ng¾n gän, nã chØ bao gåm mét sè c¸c tõ ®îc gäi l tõ khãa (keyword) l m c¬ së ®Ó t¹o ra c¸c c©u lÖnh cña ng«n ng÷. Víi c¸c ®Æc ®iÓm trªn, C l sù lùa chän tuyÖt vêi ®èi víi mét ng«n ng÷ lËp tr×nh. Nhng cã lÏ ngêi ta cßn nghe nãi vÒ C++ v mét kü thuËt lËp tr×nh míi ®îc gäi l lËp tr×nh híng ®èi tîng. Còng kh«ng cã g× ®¸ng hoang mang cho l¾m v× thùc ra C++ chØ l mét ng«n ng÷ siªu C víi tÊt c¶ nh÷ng g× m C cã céng thªm víi kü thuËt lËp tr×nh híng ®èi tîng. NÕu ai ®ã b¾t ®Çu ngay b»ng viÖc häc C++, th× tÊt c¶ nh÷ng g× ® ®îc d¹y khi häc C vÉn cßn ®îc ¸p dông cho C++. Trong khi häc C, kh«ng nh÷ng chØ häc mét ng«n ng÷ lËp tr×nh phæ th«ng v m¹nh nhÊt h«m nay m cßn tù chuÈn bÞ cho m×nh mét kü thuËt lËp tr×nh híng ®èi tîng cho ng y mai.

ChuÈn bÞ cho viÖc lËp tr×nh
Khi gi¶i mét b i to¸n cÇn ph¶i tiÕn h nh mét sè bíc nhÊt ®Þnh. §Çu tiªn ph¶i h×nh th nh hay cßn gäi l ®Þnh nghÜa b i to¸n. NÕu kh«ng biÕt b i to¸n cÇn ph¶i gi¶i quyÕt l g× th× kh«ng thÓ n o t×m ra kÕt qña ®îc. Mét khi b i to¸n ® ®îc ®Þnh râ, th× cã thÓ lËp ra mét kÕ ho¹ch ®Ó gi¶i quyÕt nã. Sau khi ® cã mét kÕ ho¹ch th× viÖc thùc hiÖn b i to¸n n y sÏ trë nªn dÔ d ng. Cuèi cïng, mét khi kÕ ho¹ch ® ®îc thùc thi, th× c¸c kÕt qña ph¶i ®îc thö l¹i ®Ó kiÓm chøng xem liÖu b i to¸n ® ®îc gi¶i quyÕt ®óng v trän vÑn cha. Mét logic nh trªn cã thÓ ®îc ¸p dông cho nhiÒu lÜnh vùc kh¸c nhau bao gåm c¶ viÖc lËp tr×nh trªn m¸y tÝnh. Khi t¹o lËp mét ch¬ng tr×nh trong C, cÇn ph¶i tu©n theo mét thø tù cña c¸c bíc sau ®©y: X¸c ®Þnh c¸c môc tiªu cña ch¬ng tr×nh. X¸c ®Þnh c¸c ph¬ng ph¸p cÇn ph¶i sö dông trong khi viÕt ch¬ng tr×nh. T¹o lËp ch¬ng tr×nh ®Ó gi¶i quyÕt b i to¸n. Ch¹y ch¬ng tr×nh ®Ó xem kÕt qña.

Chu tr×nh ph¸t triÓn ch¬ng tr×nh
Chu tr×nh ph¸t triÓn ch¬ng tr×nh cã c¸c bíc riªng cña nã. Trong bíc thø nhÊt, mét bé so¹n th¶o sÏ ®îc sö dông ®Ó t¹o ra mét tÖp ®Üa chøa c¸c m gèc (source code). T¹i bíc thø hai, c¸c m gèc sÏ ®îc dÞch ®Ó t¹o ra mét tÖp ®Ých (object file). T¹i bíc thø ba, c¸c m ® ®îc dÞch sÏ ®îc kÕt nèi l¹i ®Ó t¹o ra mét tÖp ch¬ng tr×nh cã thÓ ch¹y ®îc (executable file). Cuèi cïng, bíc bèn l ®Ó ch¹y ch¬ng tr×nh v xem kÕt qu¶.

T¹o lËp m· gèc
C¸c m gèc l mét lo¹t c¸c c©u lÖnh, hoÆc lÖnh chØ thÞ cho m¸y tÝnh thùc hiÖn c¸c c«ng viÖc m ngêi lËp tr×nh mong muèn. VÝ dô, díi ®©y l mét dßng cña m gèc:

printf ("Chµo c¸c b¹n"); LÖnh n y chØ thÞ cho m¸y tÝnh hiÖn trªn m n h×nh th«ng ®iÖp Chµo c¸c b¹n.

DÞch c¸c m· gèc
C¸c m¸y tÝnh chØ hiÓu ®îc mét ng«n ng÷, ®ã l ng«n ng÷ m¸y (machine language). Bëi vËy, tríc khi mét ch¬ng tr×nh C cã thÓ ch¹y ®îc trªn mét m¸y tÝnh, nã ph¶i ®îc dÞch tõ c¸c m gèc sang m m¸y b»ng mét ch¬ng tr×nh ®îc gäi l ch¬ng tr×nh dÞch (compiler). Ch¬ng tr×nh dÞch lÊy c¸c m gèc l m input v cho ra mét tÖp ®Üa chøa c¸c c©u lÖnh m m¸y t¬ng øng víi c¸c c©u lÖnh m gèc. C¸c c©u lÖnh m m¸y ®îc t¹o ra bëi ch¬ng tr×nh dÞch ®îc gäi l c¸c m ®Ých v tÖp ®Üa chøa chóng ®îc gäi l tÖp ®Ých. TÖp ®Ých cã tªn trïng víi tªn tÖp gèc v lu«n cã ®u«i l OBJ. §u«i OBJ ®Ó chØ r»ng tÖp n y l tÖp ®Ých v sÏ ®îc sö dông bëi ch¬ng tr×nh kÕt nèi (linker).

KÕt nèi ®Ó t¹o ra mét tÖp cã thÓ ch¹y ®îc
CÇn ph¶i thùc hiÖn thªm mét bíc n÷a th× ch¬ng tr×nh míi cã thÓ ch¹y ®îc. Trong C cã mét bé phËn ®îc gäi l th viÖn. Th viÖn cña C chøa c¸c m ®Ých cña c¸c h m ® ®îc lËp s½n. VÝ dô, h m printf ®îc sö dông trong vÝ dô tríc l mét h m th viÖn. C¸c h m th viÖn thùc hiÖn c¸c c«ng viÖc thêng hay ph¶i dïng ®Õn, ch¼ng h¹n nh hiÖn c¸c th«ng tin lªn m n h×nh, ®äc sè liÖu tõ c¸c tÖp ®Üa. NÕu mét ch¬ng tr×nh cã sö dông c¸c h m th viÖn th× tÖp ®Ých cña nã cÇn ph¶i ®îc kÕt nèi víi m ®Ých cña c¸c h m n y ®Ó t¹o ra mét ch¬ng tr×nh cã thÓ ch¹y ®îc. TÖp n y cã tªn trïng víi tªn tÖp gèc v cã ®u«i l .EXE.

Ho n thiÖn chu tr×nh ph¸t triÓn
Sau khi dÞch v kÕt nèi cÇn ph¶i ch¹y thö ch¬ng tr×nh. NÕu kÕt qña nhËn ®îc kh«ng nh mong muèn th× cÇn ph¶i t×m ra nguyªn nh©n dÉn ®Õn c¸c sai sãt v söa l¹i ch¬ng tr×nh cho ®óng. Khi cã bÊt kú mét thay ®æi n o trong m gèc, ch¬ng tr×nh ph¶i ®îc dÞch v kÕt nèi l¹i. Chu tr×nh trªn sÏ ph¶i lÆp ®i lÆp l¹i cho ®Õn khi n o nhËn ®îc kÕt qña nh mong muèn. Mét ®iÓm lu ý cuèi cïng vÒ viÖc dÞch v kÕt nèi l , mÆc dï viÖc dÞch v kÕt nèi nh ® tr×nh bÇy trªn ®©y l hai giai ®o¹n t¸ch biÖt nhng nhiÒu ch¬ng tr×nh dÞch, ch¼ng h¹n c¸c ch¬ng tr×nh dÞch ch¹y díi DOS l¹i gép hai bíc trªn th nh mét. Cho dï nh vËy nhng vÉn cø ph¶i hiÓu r»ng ®©y l hai qóa tr×nh riªng rÏ ngay c¶ khi chóng chØ ®îc thùc hiÖn b»ng mét lÖnh.

Chu tr×nh ph¸t triÓn mét ch¬ng tr×nh C
Bíc 1: Sö dông mét bé so¹n th¶o ®Ó viÕt c¸c m· gèc. Th«ng thêng c¸c tÖp gèc cña C cã ®u«i l .C Bíc 2: Dïng mét ch¬ng tr×nh ®Ó dÞch ch¬ng tr×nh gèc. NÕu ch¬ng tr×nh dÞch kh«ng ph¸t hiÖn mét sai sãt n o trong ch¬ng tr×nh gèc nã sÏ sinh ra mét tÖp ®Ých. TÖp n y cã cïng tªn víi tÖp ch¬ng tr×nh gèc v ®u«i l .OBJ. NÕu ch¬ng

tr×nh dÞch t×m thÊy mét lçi n o ®ã, nã sÏ th«ng b¸o lªn m n h×nh v ta ph¶i trë l¹i tõ bíc mét ®Ó söa c¸c lçi ® ®îc ph¸t hiÖn trong ch¬ng tr×nh gèc. Bíc 3: KÕt nèi ch¬ng tr×nh b»ng bé kÕt nèi. NÕu kh«ng cã lçi, bé kÕt nèi sÏ sinh ra mét tÖp ®Üa cã tªn trïng víi tªn ch¬ng tr×nh ®Ých víi ®u«i .EXE chøa mét ch¬ng tr×nh cã thÓ ch¹y ®îc. Bíc 4: Ch¹y ch¬ng tr×nh. CÇn ph¶i ch¹y thö ch¬ng tr×nh sau khi kÕt thóc bíc 3 ®Ó xem kÕt qña ® ®óng nh mong muèn cha. NÕu cha th× ph¶i quay l¹i tõ bíc 1 v tiÕn h nh c¸c thay ®æi cÇn thiÕt trong m gèc.

KÕt luËn
C l mét c«ng cô lËp tr×nh m¹nh, th«ng dông v chuyÓn ®æi ®îc. B i n y gi¶i thÝch c¸c bíc kh¸c nhau trong qóa tr×nh viÕt mét ch¬ng tr×nh C. §ã l chu tr×nh so¹n th¶o/dÞch/kÕt nèi/kiÓm tra. ViÖc m¾c lçi trong khi ph¸t triÓn ch¬ng tr×nh l mét ®iÒu kh«ng thÓ tr¸nh khái. Ch¬ng tr×nh dÞch cña C sÏ ph¸t hiÖn c¸c lçi trong m gèc v hiÖn mét th«ng b¸o lçi vÒ kiÓu lçi v vÞ trÝ cña lçi. C¸c th«ng tin n y gióp ngêi lËp tr×nh söa l¹i m gèc mét c¸ch dÔ d ng. Tuy nhiªn, ch¬ng tr×nh dÞch kh«ng ph¶i lóc n o còng th«ng b¸o ®îc chÝnh x¸c kiÓu cña lçi còng nh vÞ trÝ cña chóng. §«i khi ngêi lËp tr×nh ph¶i vËn dông c¸c kiÕn thøc vÒ C ®Ó ph¸t hiÖn c¸c sai sãt ® g©y ra th«ng b¸o lçi.

C©u hái v tr¶ lêi
NÕu muèn cho mét ngêi n o ®ã mét ch¬ng tr×nh C th× ph¶i cho tÖp n o? C l mét ng«n ng÷ cã ch¬ng tr×nh dÞch. §iÒu ®ã cã nghÜa l , sau khi m gèc ® ®îc dÞch sÏ ph¸t sinh mét ch¬ng tr×nh cã thÓ ch¹y ®îc. Ch¬ng tr×nh n y cã thÓ tù ch¹y mét m×nh. NÕu muèn chuyÓn CHAO ®Õn nh÷ng ngêi n o ®ã, ®iÒu duy nhÊt cÇn l m l h y chuyÓn cho hä tÖp CHAO.EXE. Hä kh«ng cÇn tÖp gèc CHAO.C, hoÆc tÖp ®Ých CHAO.OBJ v thËm chÝ ngay c¶ ch¬ng tr×nh dÞch C n÷a. Sau khi ® t¹o ®îc tÖp cã thÓ ch¹y ®îc, th× cã cÇn ph¶i gi÷ tÖp gèc hoÆc tÖp ®Ých n÷a kh«ng? NÕu tÖp gèc bÞ mÊt th× sau n y kh«ng cßn c¸ch n o kh¸c ®Ó cã thÓ thay ®æi ®îc ch¬ng tr×nh ® dÞch v kÕt nèi. Do vËy nªn gi÷ l¹i c¸c tÖp gèc. Nhng ®èi víi c¸c tÖp ®Ých th× l¹i kh¸c. Cã mét v i lý do cÇn ph¶i gi÷ l¹i c¸c tÖp ®Ých, tuy nhiªn nÕu nãi ngay b©y giê th× cßn h¬i sím. Do vËy, cã thÓ xãa tÖp ®Ých mét khi ® cã tÖp cã thÓ ch¹y ®îc. NÕu cÇn tÖp ®Ých, cã thÓ dÞch l¹i tõ tÖp gèc. LiÖu cã thÓ bá qua c¸c th«ng b¸o nh¾c nhë kh«ng?

Mét sè th«ng b¸o nh¾c nhë kh«ng l m ¶nh hëng ®Õn viÖc ch¹y cña ch¬ng tr×nh. Mét sè kh¸c l¹i cã. NÕu ch¬ng tr×nh dÞch cho ra mét th«ng b¸o nh¾c nhë, th× ®ã l mét dÊu hiÖu b¸o r»ng cã mét c¸i g× ®ã kh«ng ho n to n ®óng. HÇu hÕt c¸c ch¬ng tr×nh dÞch ®Òu cho phÐp ®Æt møc nh¾c nhë. B»ng c¸ch dã th× chØ nhËn ®îc c¸c nh¾c nhë tõ møc n y trë ®i. Trong ch¬ng tr×nh, cÇn ph¶i xem tõng nh¾c nhë mét v quyÕt ®Þnh nªn kh¾c phôc nã hay l kh«ng. Tèt nhÊt l nªn söa l¹i m gèc sao cho kh«ng cßn mét th«ng b¸o lçi v nh¾c nhë n o.

LuyÖn lËp
Môc LuyÖn tËp cho c¸c c©u hái ®Ó gióp ngêi ®äc cñng cè l¹i kiÕn thøc cña m×nh v c¸c b i tËp nh»m cung cÊp c¸c kinh nghiÖm khi sö dông nh÷ng ®iÒu ® häc.

C©u hái
H y nªu ba lý do t¹i sao C l mét lùa chän tèt nhÊt vÒ ng«n ng÷ lËp tr×nh. Ch¬ng tr×nh dÞch l m c«ng viÖc g×? C¸c bíc trong chu tr×nh ph¸t triÓn ch¬ng tr×nh l g×? CÇn ph¶i gâ lÖnh n o ®Ó dÞch mét ch¬ng tr×nh cã tªn PROG1.C b»ng ch¬ng tr×nh dÞch C ? Ch¬ng tr×nh dÞch C kÕt nèi v dÞch b»ng mét lÖnh hay b»ng hai lÖnh riªng rÏ? Nªn dïng ®u«i n o cho c¸c tÖp gèc cña C? FILENAME.TXT cã hîp lÖ cho mét tÖp gèc cña C kh«ng? NÕu mét ch¬ng tr×nh ® ®îc dÞch v nã kh«ng l m viÖc nh mong muèn, th× nªn l m nh thÕ n o? M m¸y l g×? Bé kÕt nèi l m c«ng viÖc g×?

B i tËp
H y nhËp v dÞch ch¬ng tr×nh sau ®©y. Ch¬ng tr×nh n y l m viÖc g×? (kh«ng viÕt c¸c sè hiÖu dßng khi so¹n ch¬ng tr×nh) include <stdio.h> int bankinh, dientich; main()

{ printf( "NhËp b¸n kÝnh: " ); scanf( "%d", &bankinh ); dientich = 3.14159 * bankinh * bankinh; printf( "\n\nDiÖn tÝch = %d", dientich ); return 0; } 2. NhËp v dÞch ch¬ng tr×nh sau. Ch¬ng tr×nh n y l m viÖc g×? #include <stdio.h> int x,y; main() { for ( x = 0; x < 10; x++, printf( "\n" ) ) for ( y = 0; y < 10; y++ ) printf( "X" ); return 0; } 3. Ch¬ng tr×nh sau ®©y cã mét vÊn ®Ò. H y nhËp v dÞch nã. C¸c dßng n o sinh ra th«ng b¸o lçi? #include <stdio.h> main(); { printf( "H·y nh×n xem!" ) printf( "B¹n sÏ t×m thÊy nã!" );

return 0; } 4. Ch¬ng tr×nh sau ®©y còng cã mét vÊn ®Ò. H y nhËp v dÞch nã. C¸c dßng n o sinh ra th«ng b¸o lçi? #include <stdio.h> main() { printf( "§©y lµ mét ch¬ng tr×nh" ) do_it( "cã lçi!" ); return 0; } 5. Thay lÖnh sè 9 trong ch¬ng tr×nh ë b i tËp 2 nh díi ®©y. DÞch v ch¹y l¹i ch¬ng tr×nh. B©y giê ch¬ng tr×nh n y l m g×? 9: printf( "%c", 1 );

Bµi 2. C¸c thµnh phÇn cña mét ch¥ng tr×nh C
Mäi ch¬ng tr×nh C ®Òu chøa mét sè c¸c th nh phÇn ®îc liªn kÕt víi nhau theo mét c¸ch nhÊt ®Þnh. §Ó cã mét bøc tranh tæng thÓ, tríc hÕt nªn b¾t ®Çu xÐt mét ch¬ng tr×nh C ng¾n nhng ho n chØnh víi tÊt c¶ c¸c th nh phÇn cña nã.

Mét ch¬ng tr×nh C ng¾n
Chong tr×nh 2.1 l m gèc cña mét ch¬ng tr×nh cã tªn l NHAN.C. §©y l mét ch¬ng tr×nh rÊt ®¬n gi¶n: nã chØ bao gåm viÖc nhËp hai sè tõ b n phÝm v tÝnh tÝch cña chóng. ë ®©y cha cÇn ph¶i hiÓu tÊt c¶ c¸c lÖnh cña ch¬ng tr×nh, m chñ yÕu l l m quen víi c¸c th nh phÇn cña mét ch¬ng tr×nh C m th«i.

Tríc khi xÐt chi tiÕt ch¬ng tr×nh n y, cÇn ph¶i hiÓu râ kh¸i niÖm vÒ h m (function), v× h m l mét yÕu tè c¬ b¶n trong viÖc lËp tr×nh C. Mét h m l mét bé phËn ®éc lËp cña ch¬ng tr×nh, ®îc ®Æt tªn v thùc hiÖn mét c«ng viÖc n o ®ã. B»ng viÖc gäi tªn mét h m, ch¬ng tr×nh chÝnh cã thÓ thùc hiÖn c¸c lÖnh trong h m n y. Ch¬ng tr×nh chÝnh cã thÓ göi c¸c th«ng tin, ®îc gäi l ®èi sè (argument), cho h m, v h m cã thÓ ®a ra c¸c th«ng tin cho ch¬ng tr×nh. Cã hai kiÓu h m: c¸c h m th viÖn - mét bé phËn cña ch¬ng tr×nh dÞch cña C; v c¸c h m do ngêi sö dông tù ®Þnh nghÜa. Ch¬ng tr×nh 2.1. NHAN.C. 1: /* Ch¬ng tr×nh tÝnh tÝch cña hai sè. */ 2: #include<stdio.h> 3: int a,b,c; 4: int tich(int x, int y); 5: main() 6: { 7: /* NhËp sè thø nhÊt */ 8: printf("NhËp mét sè n»m gi÷a 1 vµ 100: "); 9: scanf("%d", &a); 10 11: /* NhËp sè thø hai */ 12: printf("NhËp mét sè kh¸c n»m gi÷a 1 vµ 100: "); 13: scanf("%d", &b); 14: 15: /* TÝnh vµ hiÖn kÕt qña */ 16: c = tich(a,b); 17: printf( "\n%d nh©n %d = %d", a, b, c); 18: }

19: 20: /* Hµm tÝnh tÝch cña hai ®èi sè */ 21: int tich(int x, int y) 22: { 23: return ( x * y ); 24: } Ch¬ng tr×nh n y sÏ hiÖn trªn m n h×nh c¸c dßng kÕt qña sau: NhËp mét sè n»m gi÷a 1 vµ 100: 35 NhËp mét sè kh¸c n»m gi÷a 1 vµ 100: 23 35 nh©n 23 = 805

C¸c th nh phÇn cña ch¬ng tr×nh
Sau ®©y l m« t¶ cña c¸c th nh phÇn kh¸c nhau cña ch¬ng tr×nh mÉu nãi trªn. C¸c sè hiÖu dßng kh«ng ph¶i l th nh phÇn cña ch¬ng tr×nh m chØ ®îc ®a v o ®Ó tiÖn viÖc theo dâi v ph©n tÝch.

H m main() (C¸c dßng 5-18)
Bé phËn duy nhÊt cÇn ph¶i cã trong mäi ch¬ng tr×nh C l h m main(). D¹ng ®¬n gi¶n nhÊt cña nã l : tªn h m main theo sau l mét cÆp dÊu ngoÆc trßn ( ) v mét cÆp dÊu ngoÆc nhän { } . N»m gi÷a c¸c dÊu ngoÆc nhän l c¸c lÖnh t¹o nªn th©n chÝnh cña ch¬ng tr×nh. Díi ®iÒu kiÖn b×nh thêng, ch¬ng tr×nh sÏ b¾t ®Çu thùc hiÖn tõ lÖnh thø nhÊt trong main() v kÕt thóc b»ng lÖnh cuèi cïng trong main().

ChØ thÞ #include (Dßng 2)
ChØ thÞ #include b¸o cho ch¬ng tr×nh dÞch cña C biÕt ph¶i thªm v o ch¬ng tr×nh mét tÖp trong khi dÞch. Mét tÖp ®îc thªm v o l mét tÖp ®Üa riªng biÖt chøa c¸c th«ng tin cÇn thiÕt cho ch¬ng tr×nh dÞch. Mét sè tÖp trong c¸c tÖp n y (®«i khi cßn gäi l c¸c tÖp tiªu ®Ò header files) ®îc cung cÊp cïng víi ch¬ng tr×nh dÞch. TÊt c¶ c¸c tÖp n y ®Òu cã ®u«i l .H. ChØ thÞ #include trong vÝ dô n y cã nghÜa l "Céng thªm néi dung cña tÖp stdio.h". HÇu hÕt c¸c ch¬ng tr×nh C ®Òu yªu cÇu mét hoÆc nhiÒu tÖp céng thªm.

§Þnh nghÜa biÕn
Mét biÕn l mét tªn gäi cho mét ®¹i lîng hoÆc mét ®èi tîng n o ®ã. Mçi biÕn ®Òu ®îc ph©n bæ mét ®Þa chØ trong bé nhí. Ch¬ng tr×nh C sö dông c¸c biÕn ®Ó lu gi÷ c¸c lo¹i d÷ liÖu kh¸c nhau trong qu¸ tr×nh thùc hiÖn ch¬ng tr×nh. Trong C, mét biÕn chØ cã thÓ ®îc sö dông sau khi ® ®îc ®Þnh nghÜa. Mét ®Þnh nghÜa biÕn cho ch¬ng tr×nh dÞch biÕt tªn cña biÕn v kiÓu cña d÷ liÖu m nã lu gi÷. Trong vÝ dô mÉu, ®Þnh nghÜa ë dßng 3, int a,b,c, ®Þnh nghÜa ba biÕn cã tªn l a, b, v c v mçi biÕn sÏ chøa mét gi¸ trÞ nguyªn (integer). Trong B i 3 sÏ nãi râ h¬n vÒ c¸c biÕn v c¸c ®Þnh nghÜa biÕn.

Khai b¸o h m (Dßng 4)
Mét khai b¸o h m cho ch¬ng tr×nh dÞch biÕt tªn v ®èi sè cña h m sÏ ®îc sö dông trong ch¬ng tr×nh. Khai b¸o n y ph¶i xuÊt hiÖn tríc khi h m ®îc sö dông. Khai b¸o h m kh¸c víi ®Þnh nghÜa h m. Mét ®Þnh nghÜa h m chøa c¸c lÖnh t¹o ra h m ®ã.

C¸c lÖnh ch¬ng tr×nh (C¸c dßng 8, 9, 12, 13, 16, 17, 23)
C«ng viÖc thùc sù cña mét ch¬ng tr×nh C ®îc thùc hiÖn bëi c¸c lÖnh cña nã. C¸c lÖnh cña C l : hiÖn c¸c th«ng tin trªn m n h×nh, ®äc c¸c phÝm ®îc gâ v o tõ b n phÝm, thùc hiÖn c¸c phÐp sè häc, gäi c¸c h m, ®äc c¸c tÖp ®Üa, v tÊt c¶ c¸c thao t¸c kh¸c m mét ch¬ng tr×nh cÇn ph¶i thùc hiÖn. Tõ b i n y trë ®i, mçi mét lÖnh C ®îc viÕt riªng trªn mét dßng v lu«n lu«n ®îc kÕt thóc b»ng mét dÊu chÊm phÈy (;). Sau ®©y l c¸c gi¶i thÝch ng¾n gän cho c¸c lÖnh cña ch¬ng tr×nh NHAN.C. printf() LÖnh printf() (c¸c dßng 8, 12, v 17) l mét h m th viÖn dïng ®Ó hiÖn th«ng tin lªn m n h×nh. LÖnh n y cã thÓ dïng ®Ó hiÖn mét th«ng b¸o v¨n b¶n ®¬n gi¶n (nh ë dßng 8 v 12) hoÆc mét th«ng b¸o v mét hoÆc nhiÒu biÕn ch¬ng tr×nh (nh ë dßng 17). scanf() LÖnh scanf() (c¸c dßng 9 v 13) còng l mét h m th viÖn dïng ®Ó ®äc d÷ liÖu tõ b n phÝm v g¸n d÷ liÖu n y cho mét hoÆc nhiÒu biÕn ch¬ng tr×nh. c = tich (a, b); LÖnh n y gäi mét h m cã tªn l tich().NghÜa l , nã thùc hiÖn c¸c lÖnh ch¬ng tr×nh chøa trong h m tich(). Nã cßn göi c¸c ®èi sè a v b cho h m. Sau khi c¸c lÖnh trong h m tich() ®îc ho n tÊt, tich() cßn ®a ra mét gi¸ trÞ cho ch¬ng tr×nh. Gi¸ trÞ n y ®îc lu gi÷ trong biÕn cã tªn l c. return (x * y);

LÖnh n y l mét bé phËn cña h m tich(). Nã tÝnh tÝch cña c¸c biÕn x v y råi chuyÓn kÕt qña cho ch¬ng tr×nh ® gäi tich().

§Þnh nghÜa h m (C¸c dßng 21-24)
Mét h m l mét ®o¹n m gèc ®éc lËp thùc hiÖn mét nhiÖm vô nhÊt ®Þnh. Mçi h m ®Òu cã mét tªn, v c¸c m gèc cña h m n y ®îc thùc hiÖn mçi khi tªn h m ®îc gäi trong mét ch¬ng tr×nh. H m cã tªn tich() ë c¸c dßng 21-24 l mét h m do ngêi sö dông tù ®Þnh nghÜa v tù viÕt trong qu¸ tr×nh ph¸t triÓn ch¬ng tr×nh. H m n y rÊt ®¬n gi¶n: nã chØ l m mçi mét viÖc l nh©n hai gi¸ trÞ víi nhau v ®a kÕt qña cho ch¬ng tr×nh ® gäi nã. C cßn cã c¸c h m th viÖn ®îc cung cÊp cïng víi ch¬ng tr×nh dÞch. C¸c h m th viÖn thùc hiÖn hÇu hÕt c¸c c«ng viÖc c¬ b¶n nhÊt (nh c¸c thao t¸c trªn m n h×nh, b n phÝm, ®äc/ghi ®Üa) m mét ch¬ng tr×nh cÇn ®Õn. Trong vÝ dô n y, printf() v scanf() l c¸c h m th viÖn.

C¸c chó thÝch trong ch¬ng tr×nh (C¸c dßng 1, 7, 11, 15, 20)
BÊt kú phÇn n o m khëi ®Çu b»ng /* v kÕt thóc b»ng */ ®Òu ®îc gäi l mét chó thÝch. Ch¬ng tr×nh dÞch bá qua tÊt c¶ c¸c chó thÝch v nh vËy th× chóng tuyÖt ®èi kh«ng ¶nh hëng ®Õn sù ho¹t ®éng cña mét ch¬ng tr×nh. Cã thÓ viÕt bÊt cø thø g× trong mét chó thÝch v nã sÏ kh«ng ¶nh hëng ®Õn ho¹t ®éng cña ch¬ng tr×nh. Mét chó thÝch cã thÓ chØ chiÕm mét phÇn n o ®ã cña mét dßng, to n bé mét dßng, hoÆc còng cã thÓ nhiÒu dßng. Tuy nhiªn, kh«ng nªn lång chó thÝch n y trong mét chó thÝch kh¸c. HÇu hÕt c¸c ch¬ng tr×nh dÞch ®Òu kh«ng chÊp nhËn lo¹i h×nh n y. NhiÒu ngêi míi b¾t ®Çu häc lËp tr×nh cho r»ng kh«ng cÇn ®Õn chó thÝch v l m nh vËy l mÊt th× giê. Thùc ra th× kh«ng h¼n l nh vËy. C¸c thao t¸c trong ch¬ng tr×nh cã thÓ rÊt râ r ng v dÔ theo dâi trong khi ®ang viÕt. Nhng khi ch¬ng tr×nh trë nªn d i h¬n v phøc t¹p dÇn lªn, hoÆc khi cÇn ph¶i söa ®æi mét ch¬ng tr×nh ® viÕt tõ nhiÒu th¸ng tríc th× c¸c chó thÝch thËt l cã gi¸ trÞ. Râ r ng l cÇn ph¶i t¹o ra mét thãi quen dïng c¸c chó thÝch ®Ó l m s¸ng tá tÊt c¶ c¸c cÊu tróc v c¸c ho¹t ®éng trong ch¬ng tr×nh.

C¸c dÊu ngoÆc nhän (C¸c dßng 6, 18, 22, 24)
C¸c dÊu ngoÆc nhän ({ } ) dïng ®Ó nhãm c¸c dßng lÖnh th nh mét khèi. C¸c lÖnh cña mét h m, kÓ c¶ h m main(), ph¶i ®îc ®Ó trong c¸c dÊu ngoÆc n y.

Ch¹y ch¬ng tr×nh
ChuyÓn v o th môc chøa ch¬ng tr×nh dÞch C.

Khëi ®éng bé so¹n th¶o. NhËp m gèc cña NHAN.C (lu ý, kh«ng nhËp c¸c sè hiÖu dßng). CÊt gi÷ tÖp ch¬ng tr×nh. DÞch v kÕt nèi ch¬ng tr×nh b»ng c¸ch ra c¸c lÖnh thÝch hîp víi ch¬ng tr×nh dÞch hiÖn cã. NÕu kh«ng cã sai sãt g× trong qóa tr×nh dÞch còng nh kÕt nèi, ch¹y ch¬ng tr×nh b»ng lÖnh run, hoÆc b»ng c¸ch gâ nhan t¹i dÊu nh¾c cña DOS. NÕu xuÊt hiÖn mét hoÆc nhiÒu th«ng b¸o lçi, quay l¹i tõ bíc hai v söa c¸c lçi ® m¾c ph¶i.

KÕt luËn
B i n y tuy ng¾n nhng rÊt quan träng. Nã cho biÕt cÊu tróc v c¸c th nh phÇn cña mét ch¬ng tr×nh C. Bé phËn duy nhÊt m mét ch¬ng tr×nh C yªu cÇu l h m main(). C«ng viÖc thùc sù cña ch¬ng tr×nh ®îc thùc hiÖn bëi c¸c lÖnh ch¬ng tr×nh. C¸c lÖnh n y híng dÉn cho m¸y tÝnh thùc hiÖn c¸c h nh ®éng m ch¬ng tr×nh mong muèn. B i n y cßn nãi vÒ c¸c biÕn v c¸c ®Þnh nghÜa biÕn, v chØ ra lîi Ých cña viÖc sö dông c¸c chó thÝch v c¸ch dïng chóng. Ngo i h m main() ra, mét ch¬ng tr×nh C cßn cã thÓ sö dông hai kiÓu h m kh¸c: c¸c h m th viÖn ®îc cung cÊp cïng víi bé ch¬ng tr×nh dÞch v c¸c h m do ngêi sö dông tù ®Þnh nghÜa.

C©u hái v tr¶ lêi
C¸c chó thÝch cã t¸c ®éng g× trªn mét ch¬ng tr×nh? C¸c chó thÝch l ®Ó cho ngêi lËp tr×nh. Khi ch¬ng tr×nh dÞch chuyÓn c¸c m gèc th nh c¸c m ®Ých, nã sÏ vøt bá c¸c chó thÝch v c¸c vïng tr¾ng. §iÒu ®ã cã nghÜa l chóng kh«ng hÒ cã mét t¸c ®éng n o lªn ch¬ng tr×nh cã thÓ ch¹y ®îc. C¸c chó thÝch cã l m cho ch¬ng tr×nh gèc d i h¬n, nhng ®iÒu ®ã còng kh«ng ®¸ng kÓ l¾m. VÒ l©u d i, nªn sö dông c¸c chó thÝch v c¸c kho¶ng trèng ®Ó ch¬ng tr×nh gèc dÔ ®äc v dÔ hiÓu h¬n. Sù kh¸c nhau gi÷a mét lÖnh v mét khèi l g×? Mét khèi l mét nhãm c¸c lÖnh ®îc ®Æt gi÷a c¸c dÊu ngoÆc nhän. Mét khèi cã thÓ ®îc sö dông ë hÇu hÕt c¸c vÞ trÝ m t¹i ®ã cã thÓ sö dông mét lÖnh. L m thÕ n o ®Ó t×m thÊy danh s¸ch c¸c h m th viÖn cã thÓ sö dông? NhiÒu ch¬ng tr×nh dÞch cã kÌm theo t i liÖu m« t¶ c¸c h m th viÖn. Chóng thêng ®îc xÕp theo thø tù tõ ®iÓn.

LuyÖn tËp
C©u hái ThuËt ng÷ n o dïng ®Ó chØ mét nhãm cña mét hoÆc nhiÒu lÖnh C ®îc ®Ó gi÷a c¸c dÊu ngoÆc nhän? Th nh phÇn n o ph¶i lu«n lu«n cã mÆt trong mét ch¬ng tr×nh C? L m thÕ n o ®Ó thªm v o c¸c chó thÝch ch¬ng tr×nh v t¹i sao ph¶i dïng chóng? Mét h m l g×? Trong C cã hai kiÓu h m. C¸c hiÓu ®ã l kiÓu g× v chóng kh¸c nhau nh thÕ n o? ChØ thÞ #include dïng ®Ó l m g×? B i tËp I. H y viÕt mét ch¬ng tr×nh C ng¾n nhÊt. II. Dïng ch¬ng tr×nh sau ®©y ®Ó tr¶ lêi cho c¸c c©u hái sau: A. C¸c dßng n o chøa c¸c lÖnh? B. C¸c dßng n o chøa c¸c ®Þnh nghÜa biÕn? C. C¸c dßng n o chøa c¸c khai b¸o h m? D. C¸c dßng n o chøa c¸c ®Þnh nghÜa h m? E. C¸c dßng n o chøa c¸c chó thÝch? /* BT2-2.C */ #include <stdio.h> void in_dong(void); main() { in_dong(); printf("\n Tù d¹y ch¬ng tr×nh C trong 21 ngµy!\n";

in_dong(); return 0} /* In mét dßng dÊu sao */ void in_dong(void) { int dem; for(dem = 0; dem = 21; dem printf("*"); } /* kÕt thóc ch¬ng tr×nh */ III. Ch¬ng tr×nh sau ®©y l m viÖc g×? /*BT2-3.C */ #include<stdio.h> main() { int ctr; for ( ctr=65; ctr,91; ctr++ ); printf( "%c", ctr ); return 0; } /* kÕt thóc ch¬ng tr×nh */ IV. Ch¬ng tr×nh sau ®©y l m viÖc g×? /* BT2-4.C */
++

)

#include<stdio.h> main() { char buffer(256); printf( "H·y viÕt tªn cña b¹n vµ Ên <Enter>:\n"; gets(buffer); printf( "\nTªn cña b¹n cã %d ch÷ c¸i vµ dÊu cÊch!", strlen( bufferr); return 0; }

Bµi 3. C¸c biÕn vµ c¸c h»ng
C¸c ch¬ng tr×nh m¸y tÝnh thêng l m viÖc víi c¸c kiÓu d÷ liÖu kh¸c nhau v cÇn mét c¸ch n o ®ã ®Ó lu gi÷ c¸c gi¸ trÞ sÏ ph¶i sö dông. C¸c gi¸ trÞ n y cã thÓ l c¸c sè hoÆc c¸c ký tù. C cã hai c¸ch ®Ó lu gi÷ c¸c gi¸ trÞ sè - biÕn (variable) v h»ng (contstant) - víi nhiÒu tuú chän kh¸c nhau cho mçi c¸ch. Mét biÕn l mét tªn gäi v ®îc ph©n bæ mét ®Þa chØ lu tr÷. §Þa chØ n y ®îc dïng ®Ó lu gi÷ gi¸ trÞ cña biÕn. Gi¸ trÞ n y cã thÓ thay ®æi trong khi ch¬ng tr×nh thùc hiÖn. Ngîc l¹i, mét h»ng cã mét gi¸ trÞ cè ®Þnh kh«ng ®îc thay ®æi. Tríc khi ®i v o c¸c biÕn, cÇn biÕt qua mét chót vÒ sù ho¹t ®éng cña bé nhí m¸y tÝnh.

Bé nhí cña m¸y tÝnh
M¸y tÝnh dïng mét bé nhí truy nhËp ngÉu nhiªn (random access memory - RAM) ®Ó lu gi÷ th«ng tin trong khi ®ang ho¹t ®éng. RAM ®îc ®Æt trong c¸c m¹ch tÝch hîp, hay cßn gäi l chip, n»m bªn trong m¸y tÝnh. C¸c th«ng tin lu trong RAM thêng xuyªn cã thÓ bÞ xãa v ®îc thay thÕ b»ng c¸c th«ng tin míi. Ngo i ra RAM chØ nhí th«ng tin khi m¸y ®ang ch¹y v c¸c th«ng tin sÏ bÞ mÊt khi t¾t m¸y. Mét byte l ®¬n vÞ c¬ b¶n cña bé nhí d÷ liÖu cña m¸y tÝnh. C¸c kiÓu d÷ liÖu kh¸c nhau ®îc lu gi÷ b»ng c¸c sè lîng byte kh¸c nhau. B¶ng 3.1. cho thÊy sù kh¸c nhau n y.

B¶ng 3.1. Sè lîng bytes cÇn thiÕt ®Ó lu gi÷ d÷ liÖu D÷ liÖu Sè bytes cÇn thiÕt Ch÷ c¸i x 1 Sè 100 2 Sè 120.145 4 Côm tõ Tù häc ng«n ng÷ C 17 Mét trang ®¸nh m¸y 3000 (gÇn ®óng) RAM trong m¸y tÝnh ®îc tæ chøc theo kiÓu tuÇn tù, byte n y tiÕp byte kia. Mçi byte cã mét ®Þa chØ duy nhÊt ®Ó ®Þnh danh cho nã v ph©n biÖt nã víi tÊt c¶ c¸c byte kh¸c trong bé nhí. C¸c ®Þa chØ ®îc g¸n cho c¸c vÞ trÝ bé nhí mét c¸ch tuÇn tù, khëi ®Çu tõ 0 cho ®Õn hÕt bé nhí cña m¸y.

C¸c biÕn
Mét biÕn l mét tªn gäi v ®îc ph©n bæ mét ®Þa chØ lu tr÷. §Þa chØ n y ®îc dïng ®Ó lu gi÷ gi¸ trÞ cña biÕn. Gi¸ trÞ n y cã thÓ thay ®æi trong khi ch¬ng tr×nh thùc hiÖn.

C¸c tªn biÕn
Trong C, c¸c tªn biÕn ph¶i tu©n theo c¸c qui t¾c sau: Tªn biÕn cã thÓ chøa c¸c ch÷, c¸c ch÷ sè v dÊu g¹ch díi (_). Ký tù ®Çu tiªn cña tªn ph¶i l mét ch÷. Cã thÓ dïng dÊu g¹ch díi nh l ký tù ®Çu tiªn, nhng kh«ng nªn l m nh vËy v× xem ra kh«ng ®îc hîp lý cho l¾m. Ch÷ hoa v ch÷ thêng l kh¸c nhau. Tøc l , Count v count l hai biÕn kh¸c nhau. C¸c tõ gi nh riªng (keyword) cña C kh«ng ®îc sö dông l m tªn biÕn. Mét keyword l mét tõ m C sö dông nh l mét th nh phÇn cña nã. Sau ®©y l mét sè vÝ dô vÒ c¸c tªn biÕn hîp lÖ v kh«ng hîp lÖ trong C: phantram /* hîp lÖ */ y2x5_fg7h /* hîp lÖ */ loinhuan_hangnam /* hîp lÖ */ _1995_thue /* hîp lÖ, nhng kh«ng nªn dïng */ Taikhoan#tk /* kh«ng hîp lÖ, v× ký tù # kh«ng hîp lÖ */

double /* kh«ng hîp lÖ, v× lµ keyword cña C */ 9thang /* kh«ng hîp lÖ, v× ký tù ®Çu tiªn lµ sè */ V× C ph©n biÖt ch÷ hoa víi ch÷ thêng, nªn phantram, Phantram, v PHANTRAM l tªn cña ba biÕn kh¸c nhau. Dï r»ng kh«ng b¾t buéc, nhng c¸c tªn biÕn trong C thêng ®îc viÕt b»ng ch÷ thêng, cßn tªn cña c¸c h»ng th× ®îc viÕt b»ng ch÷ hoa. §èi víi nhiÒu ch¬ng tr×nh dÞch, mét tªn biÕn cña C cã thÓ d i tíi 31 ký tù. Víi ®é d i nh vËy, cã thÓ t¹o ra c¸c tªn biÕn nãi lªn ®îc ý nghÜa cña d÷ liÖu ®îc lu gi÷ trong chóng. C¸c tªn cã bao h m ý nghÜa thêng gåm nhiÒu tõ. Cã thÓ dïng dÊu g¹ch díi ®Ó ph©n c¸ch c¸c tõ hoÆc c¸c côm tõ víi nhau cho dÔ hiÓu. Cßn mét kiÓu kh¸c gäi l bíu l¹c ® . Thay cho dÊu c¸ch, ngêi ta viÕt hoa ch÷ ®Çu tiªn cña mçi tõ. VÝ dô, TyLeLaiSuat, hoÆc TyleLaisuat. KiÓu n y cã vÎ thuËn tiÖn h¬n v× kh«ng ph¶i gâ thªm dÊu g¹ch díi.

C¸c kiÓu biÕn sè
C cung cÊp mét sè kiÓu biÕn sè kh¸c nhau. T¹i sao l¹i ph¶i cÇn mét sè kiÓu biÕn kh¸c nhau? §ã l v×, c¸c gi¸ trÞ sè kh¸c nhau yªu cÇu sè bytes ®Ó lu gi÷ kh¸c nhau v c¸c phÐp to¸n sè häc cã thÓ thùc hiÖn trªn chóng còng kh¸c nhau. C¸c sè nguyªn nhá (vÝ dô, 1, 19, -8) yªu cÇu Ýt byte ®Ó lu gi÷, v c¸c phÐp to¸n sè häc (céng, nh©n, v.v.) trªn c¸c sè n y cã thÓ ®îc thùc hiÖn rÊt nhanh b»ng m¸y tÝnh. Ngîc l¹i, nh÷ng sè nguyªn lín v c¸c sè dÊu chÊm ®éng (vÝ dô, 123000000 hoÆc 0.000000345213) yªu cÇu nhiÒu bytes h¬n v thêi gian tÝnh to¸n víi chóng còng l©u h¬n. B»ng c¸ch dïng c¸c kiÓu biÕn sè thÝch hîp, ch¬ng tr×nh sÏ ch¹y mét c¸ch hiÖu qña h¬n. C¸c biÕn sè cña C r¬i v o hai nhãm chÝnh sau ®©y: C¸c biÕn nguyªn (interger) dïng ®Ó lu gi÷ c¸c gi¸ trÞ kh«ng cã phÇn thËp ph©n. C¸c biÕn nguyªn l¹i ph©n th nh hai líp: biÕn nguyªn cã dÊu ®Ó ghi c¸c gi¸ trÞ nguyªn d¬ng v nguyªn ©m; biÕn nguyªn kh«ng dÊu chØ ®Ó ghi c¸c gi¸ trÞ kh«ng ©m (bao gåm c¶ sè 0). C¸c biÕn dÊu chÊm ®éng (Floating-point) gi÷ c¸c gi¸ trÞ cã phÇn thËp ph©n (sè thùc). Lu ý mét ®iÓm l , tríc ®©y ta vÉn quen dïng dÊu phÈy ®Ó ng¨n c¸ch phÇn nguyªn v phÇn ph©n cña mét sè, nªn míi cã tªn gäi dÊu phÈy ®éng, nay theo chuÈn cña ANSI th× ngêi ta dïng dÊu chÊm thËp ph©n, bëi vËp míi cã tªn gäi dÊu chÊm ®éng. Tõ nay trë ®i sÏ dïng dÊu chÊm thËp ph©n thay cho dÊu phÈy thËp ph©n. Cßn dÊu phÈy ®îc dïng l m dÊu ng¨n c¸ch h ng ngh×n, h ng triÖu, h ng tû, v.v.

B¶ng 3.2. C¸c kiÓu d÷ liÖu sè cña C KiÓu biÕn Keyword S« bytes MiÒn gi¸ trÞ ký tù char 1 -128 ®Õn 127

nguyªn int 2 -32768 ®Õn 32767 nguyªn ng¾n short 2 -32768 ®Õn 32767 nguyªn d i long 4 -2147483648 ®Õn 2147483647 ký tù kh«ng dÊu unsigned char 1 0 ®Õn 255 nguyªn kh«ng dÊu unsigned int 2 0 ®Õn 65535 nguyªn ng¾n kh. dÊu unsigned short 2 0 ®Õn 65535 nguyªn d i kh. dÊu unsigned long 4 0 ®Õn 4294967295 dÊu chÊm ®éng float 4 1.2E-38 ®Õn 3.4E38* ®é chÝnh x¸c ®¬n dÊu chÊm ®éng float 8 2.2E-308 ®Õn 1.8E308** ®é chÝnh x¸c gÊp ®«i
* **

MiÒn gÇn ®óng; ®é chÝnh x¸c= 7 ch÷ sè. MiÒn gÇn ®óng; ®é chÝnh x¸c= 19 ch÷ sè.

MiÒn gÇn ®óng trong b¶ng n y cã nghÜa l c¸c gi¸ trÞ cao nhÊt v thÊp nhÊt m mét biÕn ® cho cã thÓ nhËn. §é chÝnh x¸c nghÜa l ®óng ®Õn bao nhiªu ch÷ sè cña gi¸ trÞ ®îc ghi trong biÕn ® cho. (VÝ dô, nÕu tÝnh 1/3, th× kÕt qña ®óng l 0.333333.... víi c¸c sè 3 cø tiÕp tôc ®Õn v« h¹n. Mét biÕn víi ®é chÝnh x¸c ®¬n chØ ghi ®îc 7 con 3.) Trong b¶ng n y, c¸c kiÓu int v short int l gièng nhau. Nhng t¹i sao l¹i ph¶i cã hai kiÓu kh¸c nhau nh vËy? C¸c kiÓu biÕn int v short int l gièng hÖt nhau trªn c¸c hÖ thèng t¬ng thÝch víi c¸c m¸y tÝnh IBM-PC 16-bit, nhng chóng cã thÓ sÏ kh¸c nhau trªn c¸c phÇn cøng kiÓu kh¸c. Trªn mét hÖ VAX, mét biÕn short v mét biÕn int kh«ng cïng cì víi nhau. Mét biÕn short chiÕm 2 bytes, nhng mét biÕn int l¹i chiÕm nh÷ng 4 bytes. Do vËy, ®èi víi c¸c m¸y PC, hai kiÓu n y l nh nhau.

C¸c khai b¸o biÕn
Mäi biÕn cÇn ph¶i ®îc khai b¸o tríc khi ®îc ®em ra sö dông. Mét khai b¸o biÕn cho ch¬ng tr×nh dÞch biÕt tªn v kiÓu cña mét biÕn v cã thÓ khëi t¹o cho biÕn mét gi¸ trÞ n o ®ã. Mét khai b¸o biÕn cã d¹ng sau: tªnkiÓu tªnbiÕn TªnkiÓu x¸c ®Þnh kiÓu cña biÕn v ph¶i l mét trong c¸c keyword ® cho trong B¶ng 3.2. TªnbiÕn l tªn cña biÕn ®îc ®Æt theo c¸c qui t¾c ® nãi ë phÇn tríc. Cã thÓ khai b¸o nhiÒu biÕn cïng mét kiÓu trªn mét dßng, mçi biÕn c¸ch nhau b»ng mét dÊu phÈy. VÝ dô:

int tuoi, luong, con; /* ba biÕn nguyªn */ float phantram, tong; /* hai biªn ®éng */

Keyword typedef
Tõ khãa typedef ®îc sö dông ®Ó t¹o lËp mét tªn míi cho mét kiÓu d÷ liÖu ® cã. Nãi mét c¸ch chÝnh x¸c, typedef t¹o ra mét kiÓu ®ång nghÜa. VÝ dô, lÖnh typedef int integer; t¹o ra kiÓu integer tõ kiÓu int. Sau ®ã, cã thÓ dïng integer ®Ó ®Þnh nghÜa c¸c biÕn kiÓu int.

Khëi t¹o c¸c biÕn sè
Khi mét biÕn ®îc khai b¸o, ch¬ng tr×nh dÞch sÏ d nh ra mét vïng nhí cho biÕn n y. Tuy nhiªn, gi¸ trÞ ®îc nhí t¹i vïng n y cha ®îc x¸c ®Þnh. Nã cã thÓ l 0, hoÆc cã thÓ l mét gi¸ trÞ ngÉu nhiªn n o ®ã cßn l¹i sau khi vïng n y ®îc gi¶i phãng. Bëi vËy, tríc khi mét biÕn ®îc sö dông, nã ph¶i ®îc khëi t¹o b»ng mét gi¸ trÞ x¸c ®Þnh n o ®ã. ViÖc n y cã thÓ thùc hiÖn ho n to n ®éc lËp víi viÖc khai b¸o biÕn b»ng c¸ch dïng mét lÖnh g¸n. VÝ dô: int count; /* Dµnh mét vïng nhí cho biÕn count */ count = 0; /* Ghi 0 vµo count */ Cã thÓ khëi t¹o mét biÕn ngay khi khai b¸o b»ng c¸ch viÕt dÊu b»ng v gi¸ trÞ khëi t¹o sau tªn biÕn. VÝ dô int count = 0; double phantram = 0.01, tyle_thue = 20.5;

C¸c h»ng
Gièng nh mét biÕn, mét h»ng còng l mét tªn gäi v còng ®îc ph©n bæ mét ®Þa chØ trong bé nhí. Nhng kh«ng gièng nh mét biÕn, gi¸ trÞ ®îc ghi trong mét h»ng kh«ng ®îc thay ®æi trong qu¸ tr×nh thùc hiÖn cña ch¬ng tr×nh. C cã hai kiÓu h»ng, mçi kiÓu l¹i cã c¸c c¸ch sö dông kh¸c nhau.

C¸c h»ng thùc sù (literal constant)
Mét h»ng literal l mét gi¸ trÞ ®îc gâ trùc tiÕp v o ch¬ng tr×nh gèc bÊt cø khi n o nã ®îc cÇn ®Õn. §©y l hai thÝ dô: int count = 20;

float tyle_thue = 0.20; C¸c gi¸ trÞ 20 v .20 l c¸c h»ng literal. C¸c lÖnh trªn lu gi÷ c¸c gi¸ trÞ n y v o c¸c biÕn count v tyle_thue. Mét h»ng literal víi dÊu chÊm thËp ph©n l mét h»ng dÊu chÊm ®éng v ®îc ch¬ng tr×nh dÞch C xem nh mét sè cã ®é chÝnh x¸c gÊp ®«i. Mét h»ng kh«ng cã dÊu chÊm thËp ph©n ®îc ch¬ng tr×nh dÞch biÓu diÔn nh mét sè nguyªn. C¸c h»ng nguyªn cã thÓ ®îc viÕt theo ba d¹ng díi ®©y: Mét h»ng khëi ®Çu b»ng mét ch÷ sè kh¸c 0 ®îc xem l sè nguyªn c¬ sè 10 (decimal). Mét h»ng nguyªn hÖ 10 cã thÓ chøa c¸c sè 0-9 v mét dÊu trõ hoÆc + ë ®»ng tríc. Mét h»ng khëi ®Çu b»ng ch÷ sè 0 ®îc xem l mét sè nguyªn c¬ sè 8 (octal). C¸c h»ng hÖ 8 cã thÓ chøa c¸c ch÷ sè 0-7 v phÝa tríc cã thÓ cã thªm dÊu trõ hoÆc céng. Mét h»ng khëi ®Çu b»ng 0x hoÆc 0X ®îc xem l mét h»ng hÖ c¬ sè 16 (hexadecimal). C¸c h»ng hÖ 16 cã thÓ chøa c¸c ch÷ sè 0-9 v c¸c ch÷ A, B, C, D v F, v mét dÊu trõ hoÆc céng ë ®»ng tríc.

C¸c h»ng ký hiÖu (symbolic constant)
Mét h»ng ký hiÖu l mét h»ng ®îc ký hiÖu bëi mét tªn gäi (symbolic) n o ®ã. Gièng nh mét h»ng literal, gi¸ trÞ cña mét h»ng symbolic kh«ng thÓ thay ®æi. Gi¸ trÞ thùc sù cña h»ng symbolic chØ ®îc nhËp v o khi nã ®îc ®Þnh nghÜa. ViÖc sö dông mét h»ng kiÓu n y y hÖt nh sö dông mét biÕn. H»ng ký hiÖu cã hai u ®iÓm næi bËt so víi h»ng thùc sù. VÝ dô, ®Ó tÝnh chu vi v diÖn tÝch cña mét h×nh trßn khi biÕt b¸n kÝnh, cã thÓ viÕt nh sau: chu_vi = 3.14 * (2 * ban_kinh); dien_tich = 3.14 * ban_kinh * ban_kinh; Tuy nhiªn, nÕu ®Þnh nghÜa mét h»ng ký hiÖu víi tªn l PI v gi¸ trÞ l 3.14, th× ®o¹n ch¬ng tr×nh trªn cã thÓ thay b»ng: chu_vi = PI * (2 * ban_kinh); dien_tich = PI * ban_kinh * ban_kinh; Hai lÖnh n y trë nªn s¸ng sña v dÔ hiÓu h¬n. Thay v× ph¶i b¨n kho¨n vÒ gi¸ trÞ 3.14 cã nghÜa l g×, ë ®©y cã thÓ hiÓu ngay ®îc PI l g×. ¦u ®iÓm thø hai cña h»ng ký hiÖu l ë chç dÔ thay ®æi. TiÕp tôc vÝ dô trªn, ®Ó cho kÕt qña cña ch¬ng tr×nh chÝnh x¸c h¬n cÇn ph¶i thay gi¸ trÞ cña PI l 3.14 b»ng mét gi¸ trÞ kh¸c

víi ®é chÝnh x¸c cao h¬n, ch¨ng h¹n 3.14159. NÕu ® chãt dïng mét h»ng thùc sù cho sè PI, th× b©y giê ph¶i duyÖt l¹i tÊt c¶ ch¬ng tr×nh ®Ó thay c¸c gi¸ trÞ 3.14 b»ng 3.14159. Víi mét h»ng ký hiÖu, chØ cÇn thay ë ®óng mét chç, n¬i h»ng n y ®îc ®Þnh nghÜa. C cã hai ph¬ng ph¸p dïng ®Ó ®Þnh nghÜa mét h»ng ký hiÖu: chØ thÞ #define v tõ khãa const. ChØ thÞ #define l mét trong nh÷ng chØ thÞ tiÒn xö lý sÏ ®îc tr×nh bÇy trong c¸c b i sau. ChØ thÞ n y ®îc sö dông nh sau: #define TENHANG giatri Dßng n y t¹o lËp mét h»ng cã tªn l TENHANG víi gi¸ trÞ l giatri. Trong ®ã giatri chÝnh l mét h»ng sè, cßn TENHANG tu©n theo c¸c qui luËt gièng nh cña tªn biÕn. §Ó cho dÔ ph©n biÖt gi÷a mét h»ng v mét biÕn, ta nªn viÕt c¸c tªn h»ng b»ng ch÷ hoa, cßn tªn biÕn viÕt b»ng ch÷ thêng. Trong vÝ dô tríc, ®Ó ®Þnh nghÜa h»ng ký hiÖu PI, cã thÓ viÕt nh sau: #define PI 3.14159 Chó ý l , chØ thÞ #define kh«ng kÕt thóc b»ng dÊu chÊm phÈy (;).#define cã thÓ ®îc ®Æt ë bÊt cø chç n o trong ch¬ng tr×nh gèc, nhng chØ cã hiÖu lùc cho phÇn m gèc ®øng sau nã m th«i. Nãi chung, ngêi ta hay gom tÊt c¶ c¸c #define l¹i víi nhau v ®Æt chóng ë ®Çu tÖp ngay tríc h m main(). C¸ch thø hai ®Ó ®Þnh nghÜa mét h»ng ký hiÖu l dïng tõ khãa const. Mét biÕn ®îc khai b¸o l const th× kh«ng thÓ thay ®æi gi¸ trÞ trong khi ch¬ng tr×nh thùc hiÖn. §©y l mét v i vÝ dô: const int count = 100; const float pi= 3.14159; const long no= 12000000, float tyle_thue = 0.21; const t¸c ®éng lªn tÊt c¶ c¸c biÕn trªn dßng khai b¸o. Trong dßng thø ba, no v tyle_thue l c¸c h»ng ký hiÖu. NÕu trong ch¬ng tr×nh cã mét lÖnh n o ®ã ®Þnh thay ®æi gi¸ trÞ cña mét biÕn h»ng, th× ch¬ng tr×nh dÞch sÏ sinh ra mét th«ng b¸o lçi. VÝ dô, const int count = 100; count = 200; /* Sai! Kh«ng thÓ g¸n l¹i hoÆc thay ®æi gi¸ trÞ cña mét h»ng */ C¸c h»ng ký hiÖu ®îc ®Þnh nghÜa b»ng chØ thÞ #define v c¸c h»ng ®îc ®Þnh nghÜa b»ng const cã sù kh¸c nhau. Sù kh¸c nhau n y cã liªn quan ®Õn c¸c con trá v ph¹m vi cña c¸c biÕn. Con trá v ph¹m vi cña c¸c biÕn l hai kh¸i niÖm quan träng sÏ ®îc tr×nh bÇy trong c¸c b i sau.

KÕt luËn
B i n y ® tr×nh bÇy kü vÒ c¸c biÕn sè dïng ®Ó lu gi÷ c¸c d÷ liÖu trong qóa tr×nh thùc hiÖn ch¬ng tr×nh. Cã hai líp lín c¸c biÕn sè: nguyªn v dÊu chÊm ®éng. Trong mçi líp l¹i cã mét sè kiÓu. ViÖc sö dông kiÓu n o - int, long, float, hoÆc double - cho mét øng dông l tuú thuéc v o b¶n chÊt cña c¸c d÷ liÖu ®îc ghi trong biÕn. Mét biÕn cÇn ph¶i ®îc khai b¸o tríc khi ®îc sö dông. Mét khai b¸o biÕn cho ch¬ng tr×nh dÞch biÕt tªn v kiÓu cña biÕn. B i n y cßn nãi vÒ hai kiÓu h»ng cña C, h»ng thùc sù, v h»ng ký hiÖu. Kh«ng gièng nh c¸c biÕn, gi¸ trÞ cña mét h»ng kh«ng ®îc thay ®æi trong qu¸ tr×nh thùc hiÖn ch¬ng tr×nh. C¸c h»ng thùc sù l nh÷ng gi¸ trÞ ®îc gâ trùc tiÕp v o ch¬ng tr×nh gèc bÊt cø khi n o gi¸ trÞ n y ®îc cÇn ®Õn. C¸c h»ng ký hiÖu ®îc ®Æt tªn v tªn n y ®îc sö dông bÊt cø khi n o gi¸ trÞ cña h»ng ®îc cÇn ®Õn. C¸c h»ng ký hiÖu cã thÓ ®îc ®Þnh nghÜa v khëi t¹o b»ng chØ thÞ #define hoÆc tõ khãa const.

C©u hái v tr¶ lêi
C¸c biÕn long int chøa ®îc c¸c sè nguyªn lín h¬n, vËy t¹i sao kh«ng dïng chóng thay cho c¸c biÕn int ? Mét biÕn long int chiÕm nhiÒu RAM h¬n mét biÕn int. Trong c¸c ch¬ng tr×nh nhá, ®iÒu n y kh«ng ¶nh hëng l¾m. Tuy nhiªn, khi ch¬ng tr×nh c ng ng y c ng lín h¬n, th× nªn nghÜ ®Õn viÖc sö dông thËt tiÕt kiÖm bé nhí. §iÒu g× sÏ x¶y ra, nÕu g¸n mét sè thËp ph©n cho mét biÕn nguyªn? Cã thÓ g¸n mét sè thËp ph©n cho mét biÕn nguyªn. NÕu biÕn nguyªn n y l mét biÕn h»ng th× ch¬ng tr×nh dÞch sÏ cho ra mét th«ng b¸o nh¾c nhë (warning). Gi¸ trÞ ®îc g¸n sÏ bÞ chÆt ®i phÇn thËp ph©n. VÝ dô, nÕu g¸n gi¸ trÞ 3.14 cho mét biÕn nguyªn tªn gäi l pi, th× pi sÏ chØ chøa 3. PhÇn ph©n .14 bÞ bá ®i. §iÒu g× sÏ xÈy ra, nÕu g¸n mét sè v o mét kiÓu kh«ng ®ñ lín ®Ó chøa nã? NhiÒu ch¬ng tr×nh dÞch cho phÐp l m ®iÒu n y m kh«ng th«ng b¸o g× c¶. Tuy nhiªn, sè n y sÏ bÞ biÕn ®æi ®Ó võa víi kiÓu ® cho v ®«i khi cßn l m thay ®æi h¼n gi¸ trÞ cña nã. VÝ dô, nÕu g¸n 32768 cho mét biÕn kiÓu nguyªn cã dÊu hai bytes, th× biÕn n y sÏ nhËn gi¸ trÞ nguyªn l -1. NÕu g¸n gi¸ trÞ 65535 cho biÕn nguyªn n y, th× nã sÏ chøa gi¸ trÞ -32768. Nguyªn t¾c biÕn ®æi n y l , lÊy gi¸ trÞ lín nhÊt m kiÓu ®îc g¸n cã thÓ chøa ®îc trõ ®i gi¸ trÞ ®îc g¸n v chøa kÕt qña v o biÕn n y. §iÒu g× sÏ x¶y ra, nÕu g¸n mét sè ©m cho mét biÕn kiÓu kh«ng dÊu? Còng gièng nh c©u hái tríc, ch¬ng tr×nh dÞch cã thÓ sÏ kh«ng b¶o g× c¶ nhng kÕt qña l¹i kh«ng ®óng nh mong muèn. VÝ dô, nÕu g¸n -1 cho mét biÕn nguyªn kh«ng dÊu hai bytes, th× ch¬ng tr×nh dÞch sÏ ®Æt v o biÕn n y sè cao nhÊt cã thÓ (65535).

LuyÖn lËp
C©u hái
Cã g× kh¸c nhau gi÷a mét biÕn nguyªn v mét biÕn dÊu chÊm ®éng? H y cho biÕt hai lý do t¹i sao l¹i ph¶i dïng mét biÕn dÊu chÊm ®éng ®é chÝnh x¸c gÊp ®«i (kiÓu double) thay cho mét biÕn dÊu chÊm ®éng ®é chÝnh x¸c ®¬n (kiÓu float.) ViÖc dïng mét h»ng ký hiÖu thay cho mét h»ng thùc sù cã nh÷ng u ®iÓm n o? H y nªu hai ph¬ng ph¸p ®Ó ®Þnh nghÜa mét h»ng ký hiÖu cã tªn l MAXIMUM v cã gi¸ trÞ l 100. C¸c ký tù n o cã thÓ ®îc dïng ®Ó ®Æt tªn c¸c biÕn C? Sù kh¸c nhau gi÷a mét h»ng ký hiÖu v mét h»ng thùc sù l g×?

B i tËp
I. Nªn dïng kiÓu biÕn n o ®Ó lu gi÷ tèt nhÊt c¸c gi¸ trÞ sau ®©y: A. Tuæi cña mét ngêi trong nh÷ng n¨m s¾p tíi. B. Träng lîng cña mét ngêi b»ng kilogram. C. B¸n kÝnh cña mét ®êng trßn. D. L¬ng th¸ng cña b¹n. E. Gi¸ cña mét mÆt h ng n o ®ã. F. NhiÖt ®é. G. Kho¶ng c¸ch b»ng kilomet tõ tr¸i ®Êt ®Õn mét ng«i sao n o ®ã. II. H y t¹o lËp c¸c tªn biÕn thÝch hîp cho c¸c gi¸ trÞ trong b i tËp mét. III. H y viÕt c¸c khai b¸o cho c¸c biÕn trong b i tËp hai. IV. C¸c biÕn n o l hîp lÖ v kh«ng hîp lÖ trong sè c¸c biÕn sau? T¹i sao kh«ng hîp lÖ?

A. 123abc B. x C. tong_so D. trong_luong_#s E. mot F. tyle-phantram G. BAN_KINH H. Ban_kinh I. ban_kinh J. day_la_mot_bien_de_chua_chieu_rong_hop

Bµi 4. C©u lÖnh, BiÓu thøc vµ PhÐp to¸n
C¸c ch¬ng tr×nh C chøa c¸c c©u lÖnh (statement), v hÇu hÕt c¸c c©u lÖnh ®Òu chøa c¸c biÓu thøc (expression) v c¸c phÐp to¸n (operator). B i n y bao gåm c¸c môc sau: Mét c©u lÖnh l g×? Mét biÓu thøc l g×? C¸c phÐp to¸n to¸n häc, quan hÖ, v logic. TiÒn to¸n tö l g×? C©u lÖnh if.

C¸c c©u lÖnh
Mét c©u lÖnh l mét ph¬ng híng h nh ®éng híng dÉn cho m¸y tÝnh thùc hiÖn mét nhiÖm vô n o ®ã. Trong C, c¸c c©u lÖnh thêng ®îc viÕt trªn mét dßng, nhng còng cã nh÷ng c©u lÖnh ph¶i viÕt trªn nhiÒu dßng. Mäi c©u lÖnh cña C ®Òu kÕt thóc b»ng mét dÊu chÊm phÈy (;) (trõ c¸c chØ thÞ, ch¼ng h¹n nh #include v #define).

VÝ dô, x = 2+3; l mét c©u lÖnh g¸n. Nã chØ ra cho m¸y tÝnh lÊy 2 céng víi 3, g¸n kÕt qña v o biÕn x.

C¸c c©u lÖnh v c¸c kho¶ng tr¾ng
ThuËt ng÷ kho¶ng tr¾ng (whitespace) l ®Ó chØ c¸c dÊu c¸ch, tabs v c¸c dßng rçng trong ch¬ng tr×nh gèc. Ch¬ng tr×nh dÞch C kh«ng xÐt ®Õn c¸c kho¶ng tr¾ng. Khi ch¬ng tr×nh dÞch ®äc mét c©u lÖnh trong mét ch¬ng tr×nh gèc, nã sÏ ®äc tÊt c¶ c¸c ký tù trong c©u lÖnh n y cho ®Õn khi gÆp dÊu chÊm phÈy nhng bá qua tÊt c¶ c¸c kho¶ng tr¾ng. V× vËy, c©u lÖnh x=2+3; trªn ®©y l ho n to n t¬ng ®¬ng víi x = 2 + 3; v víi x = 2 + 3 ; Mçi c©u lÖnh nªn viÕt trªn mét dßng v nªn cã mét dÊu c¸ch ®øng tríc v mét dÊu c¸ch ®øng sau mçi tªn biÕn. Tríc v sau mçi khèi nªn cã mét dßng rçng ®Ó dÔ nhËn biÕt tõng khèi mét. Ngo i ra, cã thÓ dïng tabs ®Ó ®Èy mét khèi thôt v o so víi lÒ tr¸i nh»m t¹o ra mét cÊu tróc cã tÝnh chÊt ph©n cÊp trong ch¬ng tr×nh. Tuy nhiªn, trong mét h»ng c¸c ký tù (string constant) th× c¸c dÊu c¸ch v c¸c dÊu tabs l¹i kh«ng bÞ bá qua, chóng ®îc coi l mét bé phËn cña x©u ký tù n y. Mét x©u l mét d y c¸c ký tù. C¸c h»ng ký tù thùc sù l c¸c x©u ®îc ®Æt trong c¸c dÊu nh¸y v ®îc ch¬ng tr×nh dÞch xö lý tõng ký tù mét. NÕu chØ cã ®óng mét dÊu chÊm phÈy trªn mét dßng n o ®ã, th× dßng n y ®îc gäi l c©u lÖnh rçng. C©u lÖnh rçng kh«ng thùc hiÖn bÊt kú h nh ®éng n o.

C¸c c©u lÖnh phøc hîp
Mét c©u lÖnh phøc hîp (compound statement), hay cßn gäi l mét khèi (block), l mét nhãm gåm hai hay nhiÒu c©u lÖnh cña C ®îc ®Æt trong c¸c dÊu ngoÆc nhän. §©y l mét vÝ dô vÒ mét khèi: {

printf("Xin chµo, "); printf(c¸c b¹n!"); } Trong C, mét c©u lÖnh phøc hîp cã thÓ ®îc sö dông ë bÊt cø n¬i n o m mét c©u lÖnh ®¬n cã thÓ ®îc sö dông. Chó ý r»ng, cã thÓ cã mét v i c¸ch ®Ó viÕt c¸c dÊu ngoÆc. C©u lÖnh phøc hîp sau ®©y l t¬ng ®¬ng víi c©u lÖnh trªn: { printf("Xin chµo, "); printf(c¸c b¹n!");} Tuy nhiªn, viÖc ®Ó c¸c dÊu ngoÆc trªn hai dßng riªng biÖt l m cho dÔ nhËn ra n¬i b¾t ®Çu v n¬i kÕt thóc cña mét khèi h¬n.

C¸c biÓu thøc
Trong C, mét biÓu thøc l mét mÖnh ®Ò dïng ®Ó tÝnh ra mét gi¸ trÞ n o ®ã. C¸c biÓu thøc C cã thÓ cã ®é phøc t¹p tïy ý.

C¸c biÓu thøc ®¬n gi¶n
BiÓu thøc ®¬n gi¶n nhÊt cña C l biÓu thøc chØ cã mét biÕn, mét h»ng thùc sù, hoÆc mét h»ng ký hiÖu. §©y l mÊy vÝ dô: PI /* mét h»ng ký hiÖu (®· ®Þnh nghÜa trong ch¬ng tr×nh )*/ 20 /* mét h»ng thùc sù */ ty_le /* mét biÕn */ -1.25 /* mét h»ng thùc sù kh¸c */

C¸c biÓu thøc phøc t¹p
C¸c biÓu thøc phøc t¹p h¬n bao gåm c¸c biÓu thøc ®¬n gi¶n h¬n ®îc liªn kÕt víi nhau b»ng c¸c phÐp to¸n. VÝ dô, 2 + 10 l mét biÓu thøc gåm c¸c biÓu thøc con 2 v 10, v phÐp to¸n +. BiÓu thøc 2+10 cho ra kÕt qña l 12. Cã thÓ viÕt c¸c biÓu thøc phøc t¹p h¬n:

1.25 / 8 + 5 * ty_le + ty_le * ty_le / gia Khi mét biÓu thøc chøa nhiÒu phÐp to¸n, th× viÖc tÝnh to¸n biÓu thøc n y phô thuéc v o thø tù thùc hiÖn v ®é u tiªn cña phÐp to¸n. C¸c biÓu thøc cña C cßn cã rÊt nhiÒu ®iÒu thó vi. H y xÐt biÓu thøc sau: x = a + 10; C©u lÖnh n y tÝnh biÓu thøc a + 10 v g¸n kÕt qña cho x. Ngo i ra, to n bé c©u lÖnh n y ®Õn lît nã còng l mét biÓu thøc tÝnh ra gi¸ trÞ cña biÕn sè n»m bªn tr¸i dÊu b»ng. V× vËy cã thÓ viÕt c©u lÖnh sau: y = x = a +10; C©u lÖnh n y g¸n gi¸ trÞ cña biÓu thøc a + 10 cho c¶ hai biÕn x v y. Còng cã thÓ viÕt x = 6 + (y = 4 + 5); KÕt qña cña c©u lÖnh n y l y nhËn gi¸ trÞ 9 v x nhËn gi¸ trÞ 15. H y chó ý ®Õn c¸c dÊu ngoÆc ®¬n, chóng rÊt cÇn cho viÖc dÞch lÖnh n y.

C¸c phÐp to¸n
Mét phÐp to¸n l mét ký hiÖu b¸o cho C biÕt ph¶i thùc hiÖn mét ho¹t ®éng, hoÆc mét thao t¸c n o ®ã trªn mét hoÆc nhiÒu to¸n h¹ng (operand). Mét to¸n h¹ng l mét biÓu thøc. C¸c phÐp to¸n cña C ®îc chia th nh mét sè nhãm.

PhÐp g¸n
PhÐp g¸n ®îc ký hiÖu l dÊu b»ng (=). C¸ch dïng cña nã trong C cã kh¸c mét chót so víi c¸ch dïng cña nã trong to¸n häc th«ng thêng. NÕu viÕt x = y; trong mét ch¬ng tr×nh C, th× kh«ng ph¶i cã nghÜa l "x b»ng y.", m l "g¸n gi¸ trÞ cña y cho x." Trong mét c©u lÖnh g¸n, vÕ ph¶i cã thÓ l mét biÓu thøc bÊt kú cßn vÕ tr¸i ph¶i l mét tªn biÕn. V× vËy, d¹ng cña c©u lÖnh g¸n l :

tenbien = bieuthuc;
Khi ®îc thùc hiÖn, bieuthuc ®îc íc lîng v gi¸ trÞ cña kÕt qña ®îc g¸n cho tenbien.

C¸c phÐp to¸n häc

C cã hai phÐp to¸n häc mét to¸n h¹ng (®¬n nguyªn) v n¨m phÐp to¸n häc hai to¸n h¹ng (nhÞ nguyªn).

C¸c phÐp to¸n häc ®¬n nguyªn B¶ng 4.1. C¸c phÐp to¸n häc ®¬n nguyªn PhÐp to¸n Ký hiÖu H nh ®éng VÝ dô T¨ng ++ T¨ng gi¸ trÞ cña to¸n h¹ng lªn mét ++x, x++ Gi¶m -- Gi¶m gi¸ trÞ cña to¸n h¹ng ®i mét --x, x-C¸c phÐp t¨ng v gi¶m chØ ®îc sö dông víi c¸c biÕn, kh«ng ®îc sö dông víi c¸c h»ng. ++x; l t¬ng ®¬ng víi x = x + 1; --y; l t¬ng ®¬ng víi y = y - 1; C¸c phÐp to¸n ®¬n nguyªn cã hai kiÓu: kiÓu tríc v kiÓu sau. Hai kiÓu n y l kh«ng t¬ng ®¬ng. Chóng kh¸c nhau ë chç khi n o viÖc t¨ng hoÆc gi¶m ®îc thùc hiÖn. Khi ®îc sö dông ë kiÓu tríc, phÐp t¨ng v gi¶m sÏ thay ®æi gi¸ trÞ cña to¸n h¹ng tríc khi to¸n h¹ng ®îc sö dông. Khi ®îc sö dông ë kiÓu sau, phÐp t¨ng v gi¶m sÏ thay ®æi gi¸ trÞ cña to¸n h¹ng sau khi to¸n h¹ng ®îc sö dông. H y xÐt hai c©u lÖnh sau ®©y sÏ thÊy râ ®iÒu ®ã: x = 10; y = x++; Sau khi c¸c lÖnh n y ®îc thùc hiÖn, x cã gi¸ trÞ l 11, cßn y cã gi¸ trÞ l 10; gi¸ trÞ cña x ®îc g¸n cho y, v sau ®ã x míi ®îc t¨ng thªm mét. Ngîc l¹i, c¸c c©u lÖnh x = 10; y = ++x; cho x v y cïng mét gi¸ trÞ l 11; x ®îc t¨ng thªm mét, sau ®ã gi¸ trÞ cña nã míi ®îc g¸n cho y. Ch¬ng tr×nh sau minh häa sù kh¸c nhau gi÷a kiÓu tríc v kiÓu sau.

Ch¬ng tr×nh 4.1. MOT.C /*Minh ho¹ kiÓu tríc vµ kiÓu sau cña phÐp to¸n mét to¸n h¹ng */ #include<stdio.h> int a , b; main() { /* §Æt c¶ a vµ b b»ng 5 */ a = b =5; /* Sau ®ã in chóng vµ gi¶m ®i mét */ /* dïng kiÓu tríc cho b vµ kiÓu sau cho a */ printf("\n%d %d", a--, printf("\n%d %d", a--, printf("\n%d %d", a--, printf("\n%d %d", a--, printf("\n%d %d", a--, return 0; } KÕt qña cña ch¬ng tr×nh l 5 4 4 3 3 2 2 1 1 0
--

b); b); b); b); b);

--

--

--

--

C¸c phÐp to¸n häc nhÞ nguyªn B¶ng 4.2. l danh s¸ch c¸c phÐp to¸n häc nhÞ nguyªn. Bèn phÐp ®Çu rÊt quen thuéc. PhÐp thø n¨m, modulus (lÊy phÇn d cña phÐp chia), cã thÓ l cßn míi. Modulus cho phÇn d cña phÐp chia to¸n h¹ng thø nhÊt cho to¸n h¹ng thø hai. VÝ dô, 11 modulus 4 b»ng 3.

B¶ng 4.2. C¸c phÐp to¸n häc nhÞ nguyªn PhÐp to¸n Ký hiÖu H nh ®éng VÝ dô Céng + Céng hai to¸n h¹ng x + y Trõ - To¸n h¹ng thø nhÊt trõ to¸n h¹ng thø hai x - y Nh©n * Nh©n hai to¸n h¹ng cña nã x * y Chia / To¸n h¹ng thø nhÊt chia to¸n h¹ng thø hai x / y Modulus % LÊy phÇn d cña phÐp chia x % y

Thø tù thùc hiÖn c¸c phÐp to¸n v c¸c dÊu ngoÆc
Trong mét biÓu thøc cã chøa tõ hai phÐp to¸n trë lªn th× thø tù ®Ó thùc hiÖn chóng nh thÕ n o? TÇm quan träng cña c©u hái n y cã thÓ ®îc minh häa b»ng c©u lÖnh g¸n sau ®©y: x = 4 + 5 * 3; NÕu phÐp céng ®îc thùc hiÖn tríc, th× x = 9 *3; v x ®îc g¸n gi¸ trÞ 27. Ngîc l¹i, nÕu phÐp nh©n ®îc thùc hiÖn tríc, th× l¹i kh¸c: x = 4 + 15; v x ®îc g¸n gi¸ trÞ 19. Nh vËy l cÇn ph¶i cã c¸c luËt n o ®ã vÒ thø tù thùc hiÖn cña c¸c phÐp to¸n trong mét biÓu thøc. Thø tù n y ®îc gäi l quyÒn u tiªn cña c¸c phÐp to¸n. Mçi phÐp to¸n ®Òu cã mét quyÒn u tiªn x¸c ®Þnh. Khi mét biÓu thøc ®îc tÝnh to¸n, c¸c phÐp to¸n cã quyÒn u tiªn cao h¬n sÏ ®îc thùc hiÖn tríc. Thø tù thùc hiÖn cña c¸c phÐp to¸n l : T¨ng v gi¶m ®¬n nguyªn. Nh©n, chia, v modulus.

Céng v trõ NÕu mét biÓu thøc chøa tõ hai phÐp to¸n trë lªn cã cïng mét h¹ng u tiªn, th× chóng ®îc thùc hiÖn theo thø tù tõ tr¸i sang ph¶i. Trë l¹i vÝ dô tríc, c©u lÖnh x = 4 + 5 *3; g¸n gi¸ trÞ 19 cho x bëi v× phÐp nh©n ®îc thùc hiÖn tríc phÐp céng. VÉn vÝ dô n y, nÕu muèn céng 4 víi 5 sau ®ã míi nh©n víi 3 th× ph¶i l m nh thÕ n o? C dïng dÊu ngoÆc ®Ó ®iÒu chØnh l¹i thø tù thùc hiÖn phÐp to¸n. Mét biÓu thøc con ®îc ®ãng trong c¸c dÊu ngoÆc ®îc tÝnh tríc cho dï nã chøa phÐp to¸n n o. V× vËy, ®Ó thùc hiÖn ý ®Þnh trªn, cã thÓ viÕt: x = (4 + 5) * 3; BiÓu thøc con 4 + 5 trong c¸c dÊu ngoÆc ®¬n ®îc tÝnh tríc v v× thÕ gi¸ trÞ ®îc g¸n cho x l 27. Cã thÓ dïng nhiÒu cÆp dÊu ngoÆc lång nhau trong mét biÓu thøc. Khi c¸c dÊu ngoÆc lång nhau, viÖc tÝnh to¸n ®îc thùc hiÖn tõ biÓu thøc n»m trong cïng, sau ®ã tiÕn dÇn ra ngo i. H y xÐt biÓu thøc: x = 25 - (2 * (10 + (8 / 2)) BiÓu thøc n y ®îc xö lý theo c¸c bíc sau: BiÓu thøc trong nhÊt, 8 / 2, ®îc tÝnh tríc nhÊt v cho ra gi¸ trÞ 4. 25 - (2 * (10 + 4)) ChuyÓn ra ngo i, biÓu thøc tiÕp theo, 10 + 4, ®îc tÝnh v cho ra gi¸ trÞ 14. 25 - (2 * 14) BiÓu thøc ngo i cïng, 2 * 14, ®îc tÝnh v cho gi¸ trÞ 28. 25 - 28 BiÓu thøc cuèi cïng, 25 - 28, ®îc tÝnh v g¸n gi¸ trÞ -3 cho biÕn x. x = -3

Thø tù tÝnh to¸n c¸c biÓu thøc con
Nh ® nãi ë trªn, nÕu mét biÓu thøc C chøa nhiÒu h¬n mét phÐp to¸n cã cïng h¹ng u tiªn th× chóng ®îc thùc hiÖn theo thø tù tõ tr¸i qua ph¶i. VÝ dô, trong biÓu thøc

w * x / y * z w ®îc nh©n víi x tríc, chia kÕt qña thu ®îc cho y, v cuèi cïng míi nh©n kÕt qña cña phÐp chia n y víi z. Tuy nhiªn víi c¸c møc u tiªn kh¸c nhau th× kh«ng cã g× ®Ó ®¶m b¶o thø tù tõ_tr¸i_qua_ ph¶i. XÐt biÓu thøc sau: w * x / y + z / y Theo thø tù u tiªn, phÐp nh©n v chia ®îc thùc hiÖn tríc phÐp céng. Tuy nhiªn C kh«ng x¸c ®Þnh biÓu thøc con w * x / y ®îc tÝnh tríc hay tÝnh sau biÓu thøc con z / y. H y xem mét vÝ dô kh¸c: w * x / ++y + z / y NÕu biÓu thøc con thø nhÊt ®îc tÝnh tríc, th× y ®îc t¨ng thªm 1 khi biÓu thøc con thø hai ®îc tÝnh. NÕu biÓu thøc con thø hai ®îc tÝnh tríc, th× y cha ®îc t¨ng v kÕt qña sÏ kh¸c nhau. Do vËy, nªn tr¸nh viÕt c¸c biÓu thøc kiÓu n y trong ch¬ng tr×nh.

C¸c phÐp quan hÖ
C¸c phÐp quan hÖ cña C ®îc sö dông ®Ó so s¸nh c¸c biÓu thøc, chóng ®Æt ra c¸c c©u hái, vÝ nh, "x cã lín h¬n 100 kh«ng?", hoÆc "y cã b»ng 0 kh«ng ?". Mét biÓu thøc chøa mét phÐp quan hÖ chØ cã mét trong hai gi¸ trÞ, ®óng - true (1) hoÆc sai - false (0). S¸u phÐp quan hÖ cña C ®îc cho trong B¶ng 4.4. B¶ng 4.4. C¸c phÐp quan hÖ cña C PhÐp to¸n Ký hiÖu C©u hái ®îc ®Æt ra VÝ dô B»ng == To¸n h¹ng 1 cã b»ng to¸n h¹ng 2 kh«ng? x == y Lín h¬n > To¸n h¹ng 1 cã lín h¬n to¸n h¹ng 2 kh«ng? x > y Nhá h¬n < To¸n h¹ng 1 cã nhá h¬n to¸n h¹ng 2 kh«ng? x < y Lín h¬n >= To¸n h¹ng 1 cã lín h¬n hoÆc b»ng to¸n x>=y hoÆc b»ng h¹ng 2 kh«ng? Nhá h¬n <= To¸n h¹ng 1 cã nhá h¬n hoÆc b»ng to¸n h¹ng x<=y hoÆc b»ng 2 kh«ng? Kh«ng b»ng != To¸n h¹ng 1 kh«ng b»ng to¸n h¹ng 2 x != y ph¶i kh«ng?

Lu ý: Khi l m viÖc víi c¸c phÐp quan hÖ, ®óng (true) l 1 cßn sai (false) l 0. §õng nhÇm lÉn phÐp quan hÖ == víi phÐp g¸n =. §©y l mét trong nh÷ng lçi m ngêi lËp tr×nh C hay m¾c ph¶i.

C©u lÖnh if
C¸c phÐp quan hÖ ®îc sö dông chñ yÕu ®Ó x©y dùng c¸c biÓu thøc quan hÖ dïng trong c¸c c©u lÖnh if v while. C¸c c©u lÖnh trong mét ch¬ng tr×nh C thêng ®îc thùc hiÖn tõ trªn xuèng díi theo ®óng thø tù xuÊt hiÖn cña chóng trong ch¬ng tr×nh gèc. Mét c©u lÖnh ®iÒu khiÓn cã thÓ sÏ l m thay ®æi thø tù thùc hiÖn n y. C¸c c©u lÖnh ®iÒu khiÓn ch¬ng tr×nh cã thÓ l m cho c¸c c©u lÖnh kh¸c thùc hiÖn nhiÒu lÇn hoÆc kh«ng thùc hiÖn lÇn n o phô thuéc v o tõng ho n c¶nh cô thÓ. C©u lÖnh if l mét trong c¸c c©u lÖnh ®iÒu khiÓn ch¬ng tr×nh cña C. Ngo i ra cßn cã c¸c c©u lÖnh kh¸c, nh for, do v while. ë d¹ng th«ng thêng, c©u lÖnh if íc lîng mét biÓu thøc v thay ®æi sù thùc hiÖn ch¬ng tr×nh theo kÕt qña cña viÖc íc lîng n y. D¹ng cña if nh sau: if (biÓu thøc) c©u_lÖnh; NÕu biÓu thøc ®îc ®¸nh gi¸ l ®óng th× c©u_lÖnh ®îc thùc hiÖn. NÕu biÓu thøc nhËn gi¸ trÞ sai, th× c©u_lÖnh kh«ng ®îc thùc hiÖn v ®iÒu khiÓn chuyÓn ®Õn c©u lÖnh ®øng ngay sau c©u lÖnh if. Chó ý l c¶ hai dßng if (biÓu thøc) v c©u_lÖnh; míi hîp th nh mét c©u lÖnh if ho n chØnh v chóng kh«ng ph¶i l hai c©u lÖnh t¸ch rêi. Do vËy, kh«ng ®îc viÕt dÊu chÊm phÈy ë cuèi dßng if. Mét c©u lÖnh if cã thÓ ®iÒu khiÓn viÖc thùc hiÖn cña nhiÒu c©u lÖnh kh¸c b»ng c¸ch dïng mét khèi. V× vËy, cã thÓ viÕt mét c©u lÖnh if nh sau: if (biÓu_thøc) { c©u_lÖnh1; c©u_lÖnh2; /* cã thÓ viÕt thªm nhiÒu c©u lÖnh n÷a t¹i ®©y */ c©u_lÖnhn; }

Trong khi lËp tr×nh, c©u lÖnh if rÊt hay ®îc sö dông cïng víi c¸c biÓu thøc quan hÖ, hay nãi mét c¸ch kh¸c, "h y thùc hiÖn (c¸c) c©u lÖnh sau chØ khi ®iÒu kiÖn nh thÕ n y l ®óng". VÝ dô, if ( x > y ) y = x; C©u lÖnh n y g¸n gi¸ trÞ cña x cho y chØ khi x lín h¬n y. NÕu x kh«ng lín h¬n y, th× kh«ng cã phÐp g¸n n o xÈy ra c¶. Mét c©u lÖnh if cã thÓ chøa mét mÖnh ®Ò else (ngîc l¹i). MÖnh ®Ò n y ®îc ®a v o if nh sau: if (biÓu_thøc) c©u_lÖnh1; else c©u_lÖnh2; NÕu biÓu_thøc l ®óng, c©u_lÖnh1 ®îc thùc hiÖn. NÕu biÓu_thøc l sai, c©u_lÖnh2 ®îc thùc hiÖn. C¶ c©u_lÖnh1 v c©u_lÖnh2 ®Òu cã thÓ l mét khèi.

Có ph¸p cña c©u lÖnh if
D¹ng 1

if ( biÓu_thøc ) c©u _lÖnh1 c©u_lÖnh_tiÕp_theo

§©y l d¹ng ®¬n gi¶n nhÊt cña c©u lÖnh if. NÕu biÓu_thøc l ®óng, th× c©u_lÖnh1 ®îc thùc hiÖn. NÕu biÓu_thøc l kh«ng ®óng, th× c©u_lÖnh1 bÞ bá qua. D¹ng 2

if ( biÓu_thøc ) c©u _lÖnh1 else

c©u _lÖnh2 c©u_lÖnh_tiÕp_theo
§©y l d¹ng chung nhÊt cña c©u lÖnh if. NÕu biÓu_thøc m ®óng th× c©u_lÖnh1 ®îc thùc hiÖn, ngîc l¹i c©u_lÖnh2 ®îc thùc hiÖn.

D¹ng 3

if (biÓu_thøc1) c©u _lÖnh1 else if(biÓu_thøc2) c©u _lÖnh2 else c©u_lÖnh3 c©u_lÖnh_tiÕp_theo
§©y l d¹ng if lång nhau. NÕu biÓu_thøc1 l ®óng, th× c©u_lÖnh1 ®îc thùc hiÖn, ngîc l¹i, biÓu_thøc2 ®îc kiÓm tra. NÕu biÓu_thøc1 l kh«ng ®óng, v biÓu_thøc2 l ®óng, th× c©u_lÖnh2 ®îc thùc hiÖn. NÕu c¶ hai cïng kh«ng ®óng, c©u_lÖnh3 ®îc thùc hiÖn. ChØ cã mét trong ba c©u lÖnh n y ®îc thùc hiÖn m th«i.

VÝ dô 1 if ( luong > 10,000,000 ) thue = .50; else thue = .25;

VÝ dô 2 if ( tuoi <15 )

printf( "ThiÕu niªn"); else if( tuoi < 65 ) printf("Ngêi lín"); else printf("Ngêi giµ");

TÝnh gi¸ trÞ c¸c biÓu thøc quan hÖ
C¸c biÓu thøc quan hÖ cho ra mét gi¸ tri hoÆc sai (0) hoÆc ®óng (1). Dï r»ng c¸c biÓu thøc quan hÖ ®îc dïng phæ biÕn nhÊt trong c¸c c©u lÖnh if v c¸c cÊu tróc ®iÒu kiÖn kh¸c, chóng cßn ®îc sö dông nh c¸c gi¸ trÞ sè thuÇn tuý. Ch¬ng tr×nh 4.5 sau ®©y minh häa cho c¸ch dïng n y. Ch¬ng tr×nh 4.5. Tr×nh diÔn c¸ch tÝnh c¸c biÓu thøc quan hÖ /* Minh häa c¸ch tÝnh c¸c biÓu thøc quan hÖ */ #include <stdio.h> int a; main() { a = (5 == 5); /* cho ra gi¸ trÞ 1 */ printf("\na = (5 == 5)\na = %d", a); a = (5 != 5); /* cho ra gi¸ trÞ 0 */ printf("\na = (5 != 5)\na = %d", a); a = (12 == 12) + (5 != 1); /* cho ra 1 + 1 */ printf("\na = (12 == 12) + (5 != 1)\na = %d", a); return 0; } KÕt qña cña ch¬ng tr×nh n y l :

a = (5 == 5) a = 1 a = (5 != 5) a = 0 a = (12 == 12) + (5 != 1) a = 2 Xem ra kÕt qña n y míi ®Çu cã vÎ h¬i l¹. Khi dïng c¸c biÓu thøc quan hÖ, cã mét lçi m ngêi ta hay m¾c ph¶i l chØ dïng mét dÊu = cho phÐp quan hÖ b»ng. BiÓu thøc x = 5 cho gi¸ trÞ 5 ®ång thêi g¸n 5 cho x. ThÕ nhng, biÓu thøc x == 5 th× l¹i cho ra 0 hoÆc 1 (phô thuéc v o gi¸ trÞ cña x cã b»ng 5 hay kh«ng) v kh«ng l m thay ®æi gi¸ trÞ cña x. NÕu do s¬ xuÊt m viÕt l if (x = 5) printf("x b»ng 5"); th× th«ng b¸o n y lu«n lu«n ®îc in ra v× biÓu thøc ®îc kiÓm tra ë c©u lÖnh if bao giê còng nhËn gi¸ trÞ ®óng bÊt kÓ x cã b»ng 5 hay kh«ng. Cuèi cïng, cÇn ph¶i nh¾c l¹i mét lÇn n÷a l , c¸c phÐp quan hÖ ®îc dïng ®Ó t¹o lËp c¸c mèi quan hÖ gi÷a c¸c biÓu thøc. Mét biÓu thøc quan hÖ cho ra mét gi¸ trÞ sè, b»ng 0 (nÕu biÓu thøc cã nghÜa l sai) hoÆc b»ng 1 (nÕu biÓu thøc cã nghÜa l ®óng).

Thø tù thùc hiÖn cña c¸c phÐp quan hÖ
Gièng nh c¸c phÐp to¸n häc ® nãi trong b i tríc, c¸c phÐp quan hÖ còng cã c¸c quyÒn u tiªn riªng, quyÕt ®Þnh thø tù m chóng ®îc thùc hiÖn trong mét biÓu thøc cã nhiÒu phÐp to¸n. Ngo i ra, còng cã thÓ dïng c¸c dÊu ngoÆc ®Ó thay ®æi thø tù thùc hiÖn trong mét biÓu thøc cã dïng c¸c phÐp quan hÖ. Tríc hÕt, tÊt c¶ c¸c phÐp quan hÖ ®Òu cã quyÒn u tiªn thÊp h¬n c¸c phÐp to¸n häc. V× vËy, nÕu viÕt if ( x + 2 > y)

th× 2 ®îc céng víi x tríc, sau ®ã, kÕt qña n y míi ®îc ®em so s¸nh víi y. MÖnh ®Ò trªn t¬ng ®¬ng víi if ( (x + 2 ) > y) trong ®ã, dÊu ngoÆc ®îc sö dông ®Ó l m râ thªm thø tù thùc hiÖn cña c¸c phÐp trong biÓu thøc. Thø tù u tiªn cña c¸c phÐp quan hÖ: PhÐp to¸n QuyÒn u tiªn t¬ng ®èi < <= > >= 1 != == 2 V× vËy, x == y > z; l t¬ng ®¬ng víi x == ( y > z ); bëi v×, ®Çu tiªn C tÝnh biÓu thøc y > z ®Ó cho ra mét gi¸ trÞ hoÆc l 0 hoÆc l 1. TiÕp theo, C x¸c ®Þnh xem x cã b»ng gi¸ trÞ thu ®îc tõ bíc mét hay kh«ng. Kh«ng nªn dïng c©u lÖnh g¸n trong c¸c c©u lÖnh if. §iÒu ®ã cã thÓ l m cho ngêi ®äc ch¬ng tr×nh dÔ nhÇm lÉn. Hä cã thÓ hiÓu nhÇm l ch¬ng tr×nh viÕt kh«ng ®óng v söa l¹i phÐp g¸n th nh phÐp b»ng logic. §ång th¬× còng kh«ng nªn dïng phÐp "kh«ng b»ng" (!=) trong mét c©u lÖnh if cã chøa mét mÖnh ®Ò else. Tèt h¬n c¶ l nªn dïng phÐp "b»ng" (==) cïng víi else. VÝ dô, c©u lÖnh if (x != y ) c©u_lÖnh1; else c©u_lÖnh2; nªn thay b»ng c©u lÖnh sau th× dÔ hiÓu h¬n if ( x = y ) c©u_lÖnh2; else c©u_lÖnh1;

C¸c phÐp logic
§«i khi, cÇn ph¶i ®Æt ra nhiÒu c©u hái vÒ c¸c mèi quan hÖ cña c¸c biÓu thøc n o ®ã cïng mét lóc. C¸c phÐp logic cña C ®¶m b¶o viÖc kÕt nèi hai hay nhiÒu biÓu thøc quan hÖ th nh mét biÓu thøc ®Ó tÝnh ra ®îc mét gi¸ trÞ hoÆc l ®óng hoÆc l sai. Ba phÐp logic cña C ®îc cho trong B¶ng 4.7. B¶ng 4.7. C¸c phÐp logic cña C PhÐp to¸n Ký hiÖu VÝ dô v && biÓu_thøc1 && biÓu_thøc2 hoÆc ¦ ¦ biÓu_thøc1 ¦ ¦ biÓu_thøc2 kh«ng ! ! biÓu_thøc1 Ph¬ng thøc l m viÖc cña c¸c phÐp logic ®îc chØ ra trong B¶ng 4.8. B¶ng 4.8. Ph¬ng thøc l m viÖc cña c¸c phÐp logic BiÓu thøc Cho ra gi¸ trÞ (biÓu_thøc1 && biÓu_thøc2) True (1) chØ khi c¶ biÓu_thøc1 v biÓu_thøc2 ®Òu true; ngîc l¹i false (0). (biÓu_thøc1 ¦ ¦ biÓu_thøc2) True (1) nÕu biÓu_thøc1 hoÆc biÓu_thøc2 l true; false (0) chØ khi c¶ hai ®Òu false. (! biÓu_thøc1) False (0) nÕu biÓu_thøc1 l true; true (1) nÕu biÓu_thøc1 l false.

Nãi thªm vÒ c¸c gi¸ trÞ True/False (§óng/Sai)
C¸c biÓu thøc quan hÖ cña C cho ra gi¸ trÞ 0 ®Ó biÓu hiÖn l sai v cho ra gi¸ trÞ 1 ®Ó biÓu hiÖn l ®óng. Tuy nhiªn, bÊt kú mét gi¸ trÞ sè n o còng cã thÓ ®îc biÓu hiÖn nh l ®óng hoÆc nh l sai khi nã ®îc sö dông trong mét biÓu thøc hoÆc mét c©u lÖnh ®ang chê mét gi¸ trÞ logic (tøc l , mét gi¸ trÞ ®óng hoÆc sai). C¸c qui t¾c ¸p dông cho c¸c trêng hîp n y l : Mét gi¸ trÞ b»ng kh«ng ®îc coi l sai. Mét gi¸ trÞ kh¸c kh«ng ®îc coi l ®óng.

C¸c vÝ dô sau ®©y minh häa cho c¸c qui t¾c n y: x = 125; if (x) printf ("%d", x); Trong trêng hîp n y, gi¸ trÞ cña x ®îc in ra, v× x cã gi¸ trÞ kh¸c kh«ng nªn biÓu thøc (x) ®îc c©u lÖnh if cho l ®óng. Bëi vËy, ®èi víi mäi biÓu thøc C th× c¸ch viÕt (biÓu_thøc) l t¬ng ®¬ng víi c¸ch viÕt (biÓu_thøc != 0) C¶ hai ®Òu cho gi¸ trÞ ®óng nÕu biÓu_thøc kh¸c kh«ng, v c¶ hai ®Òu cho gi¸ trÞ sai nÕu biÓu_thøc b»ng kh«ng. B»ng phÐp to¸n kh«ng (!), ta còng cã thÓ viÕt (! biÓu_thøc) hoÆc t¬ng ®¬ng l (biÓu_thøc == 0)

Thø tù thùc hiÖn c¸c phÐp logic
C¸c phÐp logic còng cã mét thø tù u tiªn ngay trong chóng v c¶ víi c¸c phÐp kh¸c. PhÐp ! (not) cã cïng ®é u tiªn víi c¸c phÐp to¸n häc mét ng«i (®¬n nguyªn) ++ v -- V× vËy, phÐp ! cã thø tù u tiªn cao h¬n tÊt c¶ c¸c phÐp quan hÖ v tÊt c¶ c¸c phÐp to¸n häc hai ng«i (nhÞ nguyªn). Ngîc l¹i, c¸c phÐp && (and) v ¦ ¦ (or) cã thø tù u tiªn thÊp h¬n nhiÒu, thÊp h¬n tÊt c¶ c¸c phÐp to¸n häc v c¸c phÐp quan hÖ. && cã thø tù u tiªn cao h¬n ¦ ¦ . Còng nh ®èi víi c¸c phÐp kh¸c, dÊu ngoÆc cã thÓ ®îc sö dông ®Ó thay ®æi thø tù thùc hiªn khi dïng c¸c phÐp logic.

C¸c phÐp g¸n phøc hîp
C¸c phÐp g¸n phøc hîp (compound assignment) cña C cung cÊp mét gi¶i ph¸p ng¾n gän kÕt nèi mét phÐp to¸n häc nhÞ nguyªn víi mét phÐp g¸n. VÝ dô, gi¶ sö muèn t¨ng gi¸ trÞ cña x lªn 5, hay nãi c¸ch kh¸c céng 5 víi x v l¹i g¸n kÕt qña cho x th× cã thÓ viÕt nh sau: x = x + 5; Dïng mét phÐp g¸n phøc hîp, gÇn nh mét c¸ch viÕt t¾t cña phÐp g¸n, cã thÓ viÕt ng¾n gän: x += 5; Tæng qu¸t, phÐp g¸n phøc hîp cã d¹ng có ph¸p nh sau (trong ®ã op l mét phÐp nhÞ nguyªn):

biÓu_thøc1 op= biÓu_thøc2 lÖnh n y t¬ng ®¬ng víi biÓu_thøc1 = biÓu_thøc1 op biÓu_thøc2;

PhÐp ®iÒu kiÖn
PhÐp ®iÒu kiÖn l phÐp tam nguyªn duy nhÊt cña C, tøc l nã cã ba to¸n h¹ng. Có ph¸p cña nã l : BiÓu_thøc1 ? biÓu_thøc2 : biÓu_thøc3 NÕu biÓu_thøc1 cho ra true (kh¸c 0), th× biÓu thøc tæng thÓ n y cã gi¸ trÞ cña biÓu_thøc2. NÕu biÓu_thøc1 cho ra false (b»ng 0), th× biÓu thøc tæng thÓ cã gi¸ trÞ cña biÓu_thøc3. VÝ dô, c©u lÖnh x = y ? 1 : 100; g¸n 1 cho x, nÕu y l true, hoÆc g¸n 100 cho x, nÕu y l false. T¬ng tù nh vËy, ®Ó z lÊy gi¸ trÞ lín h¬n trong hai gi¸ trÞ x v y, cã thÓ viÕt z = (x > y) ? x : y; PhÐp ®iÒu kiÖn h¬i gièng víi c©u lÖnh if. C©u lÖnh trªn cã thÓ viÕt nh sau: if ( x > y) z = x; else z = y;

PhÐp dÊu phÈy
DÊu phÈy ®îc sö dông thêng xuyªn trong C ®Ó l m dÊu ng¨n c¸ch, t¸ch biÖt c¸c khai b¸o biÕn, c¸c ®èi sè cña h m, v.v. Trong mét sè trêng hîp nhÊt ®Þnh, dÊu phÈy l¹i h nh ®éng nh mét phÐp to¸n chø kh«ng cßn l mét dÊu ph©n c¸ch n÷a. Cã thÓ t¹o ra mét biÓu thøc b»ng c¸ch ghÐp hai biÓu thøc con b»ng dÊu phÈy. KÕt qña nh sau: C¶ hai biÓu thøc ®îc tÝnh nhng biÓu thøc bªn tr¸i ®îc tÝnh tríc. BiÓu thøc tæng thÓ nhËn gi¸ trÞ cña biÓu thøc bªn ph¶i. VÝ dô, c©u lÖnh

x = (a++ , b ++ ); t¨ng a, råi t¨ng b, sau ®ã g¸n gi¸ trÞ cña b (cha t¨ng) cho x. V× phÐp ++ ë ®©y l kiÓu sau, nªn gi¸ trÞ cña b - tríc khi ®îc t¨ng - ®îc g¸n cho x. Dïng c¸c dÊu ngoÆc l cÇn thiÕt bëi v× phÐp dÊu phÈy cã thø tù u tiªn thÊp, thËm chÝ thÊp h¬n c¶ phÐp g¸n.

KÕt luËn
Trong b i n y, nhiÒu kh¸i niÖm quan träng cña C ® ®îc tr×nh b y: mét c©u lÖnh C l g×, c¸c kho¶ng tr¾ng kh«ng cã ý nghÜa ®èi víi ch¬ng tr×nh dÞch cña C, v c¸c c©u lÖnh cña C ®Òu kÕt thóc b»ng mét dÊu chÊm ph¶y. Ngo i ra, chóng ta còng ® häc vÒ mét c©u lÖnh phøc hîp hay cßn gäi l mét khèi. Mét khèi chøa tõ hai c©u lÖnh trë lªn v ®îc ®ãng khung trong c¸c dÊu ngoÆc nhän, cã thÓ ®îc sö dông ë bÊt kú chç n o m mét c©u lÖnh ®¬n cã thÓ ®îc sö dông. NhiÒu c©u lÖnh ®îc t¹o th nh tõ mét sè biÓu thøc v c¸c phÐp to¸n. Mét biÓu thøc l mét mÖnh ®Ò n o ®ã dïng ®Ó tÝnh ra ®îc mét gi¸ trÞ sè. C¸c biÓu thøc phøc hîp cã thÓ chøa nhiÒu biÓu thøc ®¬n gi¶n h¬n (biÓu thøc con). C¸c phÐp to¸n l c¸c ký hiÖu cña C, dïng ®Ó híng dÉn m¸y tÝnh thùc hiÖn mét thao t¸c trªn mét hoÆc nhiÒu biÓu thøc. Mét sè phÐp to¸n l ®¬n nguyªn, cã nghÜa l chóng thao t¸c trªn mét to¸n h¹ng ®¬n. Tuy nhiªn, hÇu hÕt c¸c phÐp cña C ®Òu l nhÞ nguyªn, thao t¸c trªn hai to¸n h¹ng. Cã mét phÐp tam nguyªn, ®ã l phÐp ®iÒu kiÖn. C¸c phÐp to¸n cña C cã mét quyÒn u tiªn ph©n cÊp quyÕt ®Þnh thø tù m theo ®ã c¸c phÐp to¸n sÏ ®îc thùc hiÖn trong mét biÓu thøc cã chøa nhiÒu phÐp to¸n. C¸c phÐp to¸n cña C trong b i n y ®îc chia l m ba kiÓu: C¸c phÐp to¸n häc thùc hiÖn c¸c phÐp sè häc trªn c¸c to¸n h¹ng cña chóng. C¸c phÐp quan hÖ thùc hiÖn viÖc so s¸nh gi÷a c¸c to¸n h¹ng cña chóng. C¸c phÐp logic thao t¸c trªn c¸c biÓu thøc true/false. 0 ®Ó biÓu diÔn cho false, 1 ®Ó biÓu diÔn cho true.

C©u hái v tr¶ lêi
C¸c dÊu c¸ch v c¸c dßng tr¾ng cã l m ¶nh hëng ®Õn sù thùc hiÖn cña mét ch¬ng tr×nh kh«ng? C¸c kho¶ng tr¾ng (dÊu c¸ch, dßng tr¾ng, tabs) thêng ®îc dïng ®Ó l m ch¬ng tr×nh dÔ ®äc h¬n. Khi ch¬ng tr×nh ®îc dÞch, c¸c kho¶ng tr¾ng bÞ bá qua, v v× thÕ chóng kh«ng cã hiÖu lùc g× ®èi víi ch¬ng tr×nh ® dÞch v kÕt nèi. Sù kh¸c nhau gi÷a c¸c phÐp ®¬n nguyªn v nhÞ nguyªn l g×?

C¸c phÐp ®¬n nguyªn thao t¸c trªn mét biÕn cßn phÐp nhÞ nguyªn l m viÖc víi hai biÕn. PhÐp trõ (-) l ®¬n nguyªn hay nhÞ nguyªn? L c¶ hai. Ch¬ng tr×nh dÞch ®ñ th«ng minh ®Ó biÕt ph¶i l m g× víi phÐp n y. Nã biÕt ph¶i dïng kiÓu n o c¨n cø v o sè biÕn trong biÓu thøc ®îc sö dông. Trong c©u lÖnh sau, nã l ®¬n nguyªn x = -y; ngîc l¹i, trong trêng hîp sau l nhÞ nguyªn x = a - b; Mét sè ©m ®îc coi l ®óng(true) hay sai (false)? 0 l false, v mäi gi¸ trÞ kh¸c l true. V× vËy sè ©m l true.

LuyÖn tËp
C©u hái
1. C©u lÖnh sau ®©y ®îc gäi l g×, v ý nghÜa cña nã ra sao? x = 5 + 8; 2. Mét biÓu thøc l g×? 3. Trong mét biÓu thøc cã chøa nhiÒu phÐp to¸n, c¸i g× quyÕt ®Þnh thø tù thùc hiÖn cña chóng? 4. NÕu mét biÕn x cã gi¸ trÞ l 10, gi¸ trÞ cña x v a l bao nhiªu sau mçi lÇn c¸c c©u lÖnh sau ®©y ®îc thùc hiÖn t¸ch biÖt? a = x++; a = ++x; 5. BiÓu thøc 10 % 3 cho gi¸ trÞ bao nhiªu? 6. Cßn biÓu thøc 5 + 3 * 8 / 2 + 2 ? 7. H y viÕt thªm c¸c dÊu ngoÆc v o biÓu thøc trong c©u 6 ®Ó biÓu thøc míi cã gi¸ trÞ b»ng 16. 8. NÕu mét biÓu thøc ®îc ®¸nh gi¸ l false th× biÓu thøc n y cã gi¸ trÞ l mÊy?

9. PhÐp to¸n n o cã thø tù u tiªn cao h¬n? a. == hay < b. * hay + c. != hay == d. >= hay > 10. PhÐp g¸n phøc hîp l g× v nã cã Ých lîi nh thÕ n o?

B i tËp
1. Ch¬ng tr×nh sau viÕt kh«ng ®îc hay l¾m. H y nhËp v dÞch xem nã cã ch¹y kh«ng. #include<stdio.h> int x, y; main() { printf( "\nNhËp hai sè"); scanf( "%d %d, &x,&y);printf( "\n\n%d lín h¬n",(x>y)?x:y);return 0;} 2. H y viÕt l¹i ch¬ng tr×nh trªn cho dÔ ®äc h¬n. 3. H y viÕt l¹i ch¬ng tr×nh 4.1 ®Ó ®Õm theo chiÒu t¨ng dÇn thay cho gi¶m dÇn. 4. ViÕt mét c©u lÖnh if ®Ó g¸n gi¸ trÞ cña x cho biÕn y chØ khi x n»mg gi÷a 1 v 20. Gi÷ nguyªn y kh«ng ®æi nÕu x kh«ng n»m trong miÒn n y. 5. Dïng phÐp ®iÒu kiÖn ®Ó thùc hiÖn nhiÖm vô cña c©u 4. 6. ViÕt l¹i c¸c c©u lÖnh if lång nhau sau ®©y b»ng mét c©u lÖnh if ®¬n v c¸c phÐp phøc hîp. if (x < 1) if ( x >10) c©u_lÖnh; 7. C¸c biÓu thøc sau cho ra gi¸ trÞ n o ?

a. (1 + 2 * 3) b. 10 % 3 * 3 - (1 + 2) c. ((1 + 2) * 3) d. (5 == 5) e. (x = 5) 8. NÕu x = 4, y = 6, v z = 2, h y xem c¸c mÖnh ®Ò sau ®©y l true hay false a. if (x == 4) b. if (x != y - z) c. if (z = 1) d. if (y) 9. ViÕt mét c©u lÖnh if ®Ó kh¼ng ®Þnh mét ngêi l ngêi lín (21 tuæi) nhng cha gi (65 tuæi). 10. H y söa cho ch¬ng tr×nh sau ®©y ch¹y ®óng. /∗ µτ χη←νγ τρ⋅νη χ λι ... ∗/ #ινχλυδε <στδιο.η> ιντ ξ = 1; µαιν() { if (x == 1); printf ( " x b»ng 1"); otherwise printf (" x kh«ng b»ng 1"); return }