Trườngưđạiưhọcưbáchưkhoaưhàưnội Ngôn ngữ lập trình C Ngời soạn: Nguyễn Quang Huy 12/2000 Bai giang ngon ngu lap trinh C - Chơng Cơ ngôn ngữ c TổngưquanưvềưngônưngữưC Cấuưtrúcưchungưcủaưmộtưchươngư trìnhưC Cácưthànhưphầnưcơưbảnưcủaư ngônưngữ Cácưkiểuưdữưliệuưcơưbản Cácưcấuưtrúcưlệnhưcơưbảnưtrongư C VàoưraưtrongưC Bai giang ngon ngu lap trinh C Tỉng quan vỊ ng«n ngữ c DoưB.W.Kerninghanư&ưD.M.Ritchieư(1970)ưphátư triểnưtạiưBellưlab TạiưsaoưlạiưsửưdụngưC? NNLTưvạnưnăng Tínhưkhảưchuyểnư(portability) Độưthíchưnghiưcao,ưtínhưmềmưdẻo,ưNNLTư chuyênưnghiệp Tínhưhiệuưquả Bai giang ngon ngu lap trinh C - Cấu trúc chung chơng trình C #includeư #includeư /*ưChươngưtrìnhưchínhư */ voidưmain() { ưưprintf(Hello,ư world!\n); ưư/*ưĐợiưấnưmộtưphímư*/ ưưgetch(); } Phầnưdẫnưhướngưbiênư dịch Phầnưkhaiưbáo Phầnưchươngưtrìnhư Bai giang ngon ngu lap trinh C - Các thành phần ngôn ngữ Bộưchữưviết:ư phânưbiệtưchữưhoaưvàưchữưthường Tên: quyưtắcưđặtưtên Từưkhoá:ưasm,ưbreak,ưcase,ưchar,ưconst,ư continue,ưif,ư Cácưkiểuưdữưliệuưcơưbản Cácưbiến Cácưhằng Biểuưthức Bai giang ngon ngu lap trinh C - Các kiểu liệu Kiểu Kích thớc char int long unsigned float double Ph¹m vi 255 -32768 32767 -2147483648 2147484647 65535 3.4e-38 3.4e+38 1.7e-308 1.7e+308 Bai giang ngon ngu lap trinh C - byte bytes bytes bytes bytes bytes Khai báo biến [ = ]; Giáưtrịưcủaưbiếnưcóưthểưđượcưkhởiưgánưkhiưkhaiư báo Víưdụ: int i, j; float f; char ch, ch1 = ‘A’, ch2 = ‘\n’; double eps = 1E-6; Bai giang ngon ngu lap trinh C - Khai báo Hằngưtượngưtrưng: #define Víưdụ: #define MAX 100; #define ECHO "DHBK Hanoi" Hằngưbiến: const =; Víưdụ: const long MAX = 100L; const char ECHO[30] = "DHBK Hanoi"; Bai giang ngon ngu lap trinh C - BiÓu thøc (1/5) Cácưphépưtoánưsốưhọc:ư+,ư-,ư*,ư/,ư%,ưCácưphépưtoánưquanưhệ:ư>,ư=,ư i+=exp; Bai giang ngon ngu lap trinh C - 10 Kiểu cấu trúc (2/5) Khaiưbáoưbiếnưcấuưtrúc: struct Tên_kiểu tên_biến; Víưdụ: struct Address addr1, addr2; Khaiưbáoưcấuưtrúcưvớiưtypedef: #typedef struct Tªn_kiĨu Tªn_kiĨu_míi VÝdơ: #typedef struct Address TAddress; TAddress addr1, addr2; Bai giang ngon ngu 56 KiĨu cÊu tróc (3/5) • Truyưnhậpưtớiưcácưtrườngưtrongưcấuưtrúc: tên_biến.tên_trờng Víưdụ: strcpy(addr.name,"Nguyen Van A"); addr.number = 100; TrênghỵpcontrácÊutróc: VÝdơ: TAddress *pAddr; (*pAddr).number = 100; pAddr->number = 100; Bai giang ngon ngu 57 KiĨu cÊu tróc (4/5) Cấuưtrúcưthườngưđượcưdùngưđểưxâyưdựngưmộtư bảngưcácưcấuưtrúc: Víưdụ: TAddress addrs[50]; Cấuưtrúcưđượcưsửưdụngưtrongưcácưdanhưsáchưmócư nối: struct Simple { TAddress addr; struct Simple *next; }; Bai giang ngon ngu 58 KiĨu cÊu tróc (5/5) • CÊutrócbit: struct Tên_kiểu { /* khai báo trờng */ tên_trờng : độ_dài; }; Víưdụ: struct Person { char name[50]; unsigned short age:6; // 64 int sex:1; // }; Bai giang ngon ngu 59 Kiểu hợp (1/2) Khaiưbáoưkiểuưhợp : union Tên_kiểu { type_1 trờng_1 : độ_rộng_1; type_2 trờng_2 : độ_rộng_2; } tên_biến; Cácưtrườngưđềuưcóưcùngưđịaưchỉư Kíchưthướcưcủaưhợpưlàưkíchưthướcưcủaưtrườngưdàiưnhất Cácưthaoưtácưtrênưhợpưcũngưgiốngưnhưưtrênưcấuưtrúc Bai giang ngon ngu 60 KiĨu hỵp (2/2) VÝdơ: union Registers { struct WORDREGS { unsigned int ax,bx,cx,dx,si,di,cflag,flags; } x; struct BYTEREGS { unsigned char al,ah,bl,bh,cl,ch,dl,dh; } h; }; union Registers reg; reg.h.ah = 1; reg.x.cx = 15; Bai giang ngon ngu 61 Kiểu tệp TrongưCưcóưhaiưloạiưtệp:ưtệpưnhịưphânưvàưtệpư vănưbản Khaiưbáoưtệp:ưconưtrỏưtệp FILE *fp; Cácưthaoưtácưtrênưtệp:ư Hệưthốngưvàoưraưmứcư2ư(mứcưcao)ư:ưlàmưviệcư quaưcácưkênhưvào/ra Hệưthốngưvàoưraưmứcư1ư(mứcưthấp)ư:ưlàmư việcưquaưcácưthẻưtệp Bai giang ngon ngu 62 KiĨu tƯp : HƯ thèng vµo møc fopen():ưmởưmộtưtệpưtinư: FILE *fopen(char *filename,char *mode); Cácưchếưđộưmởưtệp: r rb ”rt” ”r+b””r+t” “w” ”wb” ”wt” ”w+b””w+t” “a” ”ab” ”at” ”a+b” ưưa+t Víưdụ: fp=fopen(exercise,w); fclose():ưđóngưtệpưtinưđãưđượcưmởưtrướcưđóưbởiư fopen(): int fclose(FILE *fp); Bai giang ngon ngu 63 KiĨu tƯp : HƯ thèng vµo mức Mộtưsốưhàmưcơưbảnư:ư • • • • putc() getc() fseek() fprintf() fscanf() fflush() feof() ferror() rewind() Bai giang ngon ngu 64 HÖ thèng vào mức 2: Example Ví dụ:ưTạoưtệpưbackupưcủaưautoexec.bat:ư #include int main(void) { FILE *in, *out; if ((in = fopen("\\AUTOEXEC.BAT", "rt")) == NULL) { fprintf(stderr, "Cannot open input file.\n"); return 1; } Bai giang ngon ngu 65 HƯ thèng vµo møc 2: Example (t.) if ((out = fopen("\\AUTOEXEC.BAK", "wt")) == NULL) { fprintf(stderr, "Cannot open output file.\n"); return 1; } while (!feof(in)) fputc(fgetc(in), out); fclose(in); fclose(out); return 0; } Bai giang ngon ngu 66 KiĨu tƯp : HƯ thèng vào mức Mộtưsốưhàmưcơưbảnư:ư • read() write() open() close() lseek() Bai giang ngon ngu 67 Hệ thống vào mức 1: Example Víưdụ:ưTạoưmộtưtệpưvănưbảnưbằngưhàmưopen #include #include #include #include int main(void) { int handle; char msg[] = "Hello world"; Bai giang ngon ngu 68 HƯ thèng vµo møc 1: Example (t.) if ((handle = open("TEST.$$$", O_CREAT | O_TEXT)) == -1) { perror("Error:"); return 1; } write(handle, msg, strlen(msg)); close(handle); return 0; } Bai giang ngon ngu 69 END Thank you! Bai giang ngon ngu 70 ... Tráiưsangư phải Bai giang ngon ngu lap trinh C 13 Các cấu trúc lệnh C Câuưlệnhưđơn: Câuưlệnhưghép:ư Cấuưtrúcưtuầnưtự Cấuưtrúcưđiềuưkiện Cấuưtrúcưlặp ; { } Bai giang ngon ngu lap trinh C -... } Bai giang ngon ngu lap trinh C - 16 CÊu tróc lặp (1/3) CâuưlệnhưFOR: for ( Bt1; Bt2; Bt3 ) Lenh; VÝdô:tÝnhN! long Gt,i,N; Gt = 1; for (i=1; i