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

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

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Phép toán tăng giảm: x++ hay ++x( x--,--x): tăng(giảm) x xuống 1 đơn vị

HTD (TH0003) C Programming (Se) Page: 1 ôn tập CáC KIếN THứC CB Về LậP TRìNH C [] A.CáC PHầN Tử Cơ BảN: Các phép tính: Phép toán cơ bản: + , - , * , / , %(lấy phần d). Phép toán tăng giảm: x++ hay ++x ( x--,--x): tăng (giảm) x xuống 1 đơn vị. Phép toán trên Bit: & (and), | (or), ^ (XOR), << (dịch trái), >> (dịch phải). Biểu thức điểu kiện: cú pháp: BT1? BT2: BT3 (BT: Biểu thức). Nếu BT1 đúng(<>0) thì BT điều kiện trên = giá trị của BT2 ngợc lại = giá trị của BT3 nếu BT1 sai (=0). VD: printf(Min of a & b: %d,a<b? a:b); Kiểu dữ liệu: int (-32768 . 32767) (2 hoặc 4 Byte); unsigned int (0 . 65535). char (-128 . 127) (1 Byte); unsigned char (0 . 255). long (-2147483648 . 2147483647) (4 Byte). unsigned long (0 . 4294967297). float (3.4 E-38 . 3.4E+38) (4 Byte). double (1.7E-308 . 1.7E+308) (8 Byte). long double (3.4E-4932 . 1.1E4932). Định nghĩa kiểu với typedef: typedef khaibáo VD: tạo một kiểu ma trận kích thớc [20][20] với tên l matrix : typedef float matrix[20][20]; Biến, hằng số: Khai báo biến: kiểudữliệu tênbiến; hay kiểudữliệu tênbiến = giátrịkhởiđầu; Khai báo hằng số: const type NAME=giátrị; hay #define tênhằngsố gíatrị; VD: const float Pi=3.14; #define Pi 3.14; HTD (TH0003) C Programming (Se) Page: 2 Các hm cơ bản : (Các hm kiểm tra đựơc khai báo trong <ctype.h>). fabs(x): lấy giá trị tuyệt đối. sin(x), cos(x), tan(x): lấy sin, cos, tang của x. floor(x): Lấy phần nguyên của số x. exp(x): tính e mũ x (e x ). flushall(): xoá bộ đệm bn phím. log(x): tính ln(x). log10(x): tính lg(x). pow(x,n): tính x mũ n (x n ). M_PI: Hằng số Pi. void calloc(unsigned n, unsigned size): cấp phát vùng nhớ n*size byte, nếu thnh công hm trả về địa đầu vùng nhớ đợc cấp, ngợc lại trả về NULL. Để giải phóng vùng nhớ đợc cấp phát bởi malloc hay calloc do pt trỏ tới ta dùng : void free(void *pt); <alloc.h> int getchar(void): nhận một ký tự từ bn phím (stdin), trả về ký tự nhận đợc. int random(int n): cho một giá trị ngẫu nhiên từ 0 . n-1. <stdlib.h> int tolower(int c): đổi ký tự chữ hoa sang chữ thừơng. <ctype.h> int toupper(int c): đổi ký tự chữ thờng sang chữ hoa.<ctype.h> int isalnum(int c): kiểm tra c có phải l ký tự alphanumeric? (chữ cái hay số). int isalpha(intc): kiểm tra c có phải l chữ cái không? int isdigit(int c): kiểm tra c có phải l chữ số không? Int ispunct(int c): kiểm tra c có phải l ký tự chấm câu không? int isxdigit(int c): kiểm tra c có phải l chữ số hệ 16 không? int isupper(int c): kiểm tra c có phải l chữ hoa (từ A đến Z) không. Chi chú: Các hm kiểm tra nếu thoả thì trả về giá trị <>0, ngợc lại trả về 0. Phép gán: Tên biến = Biểuthức / biến; Xuất nhập dữ liệu: Xuất: printf(ký tự điều khiển,bt1,bt2, .); Trong đó danh sách biểu thức có thể bao gồm biểu thức, số, hay văn bản, các đối tợng phải cách nhau bởi dấu phẩy. Vd: printf( Nam %d la the ky %d: , 1999+2, 40/ 2); HTD (TH0003) C Programming (Se) Page: 3 ệ Nam 2001 la the ky 20 Nhập: scanf(các ký tự định dạng,biến1, biến2, .). scanf(%d%d,&a,&b); b.Cấu trúc điều kiện, rẽ nhánh v vòng lặp: if (bieuthuc) lệnh1; hay if (bieuthuc) lệnh1; else lệnh2; Trong cấu trúc thứ 1, nếu bieuthuc cho giá trị khác 0 thì thực hiện lệnh1 v =0 thì thôi, còn trong cấu trúc thứ 2 nếu bieuthuc cho giá trị khác 0 thì thực hiện lệnh1 v =0 thì thực hiện lệnh2. Chú ý l trong thân if v else chỉ l 1 câu lệnh đơn, nếu có nhiều lệnh thì phải lồng vo { .}; switch (biểu thức) { case x: lệnh; break; case n: lệnh; break; default :lệnh; break; } ý nghĩa : câu lệnh rẽ nhánh switch sẽ tính giá trị của biểu thức v thực hiện lệnh tơng ứng trong case no có giá trị ny. Nếu không có giá trị trong case no = giá trị của biểu thức thì thực hiện lệnh sau default. for (biếnđkh[= giá trị đầu]; điều kiện ; phép toán thay đổi giá trị biến đkh ) lệnh ; Nếu có nhiều lệnh thì phải lồng vo { . }; while (biểu thức) lệnh; Nếu có nhiều lệnh thì lồng vo{ . }; ý nghĩa : Trong khi biểu thức <>0 thì thực hiện lệnh. do lệnh while(biểu thức) ; Nếu có nhiều lệnh thì lồng vo {}. ý nghĩa : Thực hiện lệnh nhiều lần trong biểu thức <>0 . goto v nhãn: (Nhãn (handle) có dạng nh tên biến, đứng trớc dấu 2 chấm :) HTD (TH0003) C Programming (Se) Page: 4 Cú pháp: goto nhãn; Khi gặp dòng ny máy sẽ nhãy đến câu lệnh có nhãn viết sau từ khoá goto. CONTINUE, BREAK V SIZEOF: o Câu lệnh continue dùng để bắt đầu một vòng lặp mới của chu trình bên trong nhất chứa nó. Trong thân for máy sẽ chuyển đến bớc khởi đầu kế tiếp. Còn trong while v do while máy sẽ chuyển đến xác định giá trị biểu thức sau while v tiến hnh kiểm tra điều kiện kết thúc vòng lặp, (continue không dùng cho switch). o Câu lệnh break cho phép ta thoát khỏi for, while, do while v switch. Khi có nhiều vòng lặp lồng nhau, break sẽ đa ra khỏi vòng lặp hay switch bên trong nhất. o Toán tử sizeof cho kích thớc (byte) của một kiểu hay một đối tợng dữ liệu, cú pháp: sizeof(kiểudữliệu) hay sizeof(đốitợngdữliệu). Các kiểu dữ liệu nh int, char, float, kiểu tự định nghĩa, . Các đối tợng dữ liệu nh mảng, cấu trúc, biến, . Thờng dùng để xác định số phần tử của mảng khi đợc khởi đầu: int a[]={1,2,3,4,5,6}; int spt=sizeof(a)/sizeof(int); C. Hm (FUNCTION) : Định nghĩa Hm: <Kiềudữliệu / void> TênHm (Danhsáchthamsố) <Khai báo kiểu cho các tham số>; {Khai báo biến cục bộ v thân hm}; Sử dụng Hm: Tên hm (Danhsáchcácthamsốthựcnếucó); Truyền tham số: + Truyền bằng trị: đây l chế độ truyền tham số mặc định của C. Với cách truyền ny giá trị của tham số thực sẽ không bị thay đổi sau khi hm thực hiện. +Truyền bằng biến: tức muốn truyền cả nội dung lẫn địa chỉ của biến. Khi đó ta phải sử dụng biến con trỏ. HTD (TH0003) C Programming (Se) Page: 5 D. Mảng (Array): Mảng 1 chiều: Khai báo tờng minh: Kiểu tenmang[số phần tử] ; Khai báo không tờng minh: Kiểu tenmang []; Cách khai báo ny đợc sử dụng trong các trờng hợp: vừa khai báo vừa gán trị (vd : int a[]={1,2,3,7}; ), mảng l tham số hm (vd : int nhapmang(int a[],int n, int m) ;). Xuất/ nhập mảng : ta dùng vòng lặp for(vd for (i=1; i<n; i++) ;), hay ta có thể tạo một hm để nhập mảng với số phần tử không biết trớc, kết thúc khi nhập số 0. void nhap(int a[], int*n) { for (*n=0;*n<20,(*n)++) { printf(A[%d]:,*n); scanf(%d,&a[*n]); if (a[*n]==0) break; } } Sắp xếp mảng giảm dần (Buble sort) . for (i=0;i<n-1;i++) for (j=i+1;j<n;j++) if (A[i]<A[j]) { tam=A[i]; A[i]=A[j]; A[j]=tam; } Mảng 2 chiều: Khai báo tờng minh : Kiểu tenmang[sốcột][sốdòng] ; Vd: a[20][10]; Khai báo không tờng minh : Kiểu tenmang [ ][sốcột] ; sử dụng cách ny trong các trờng hợp: vừa khai báo vừa gán trị(Vd: int a[][3]={{1,2,3},{-1,- 2,-3}};), mảng l tham số hm( Vd: void nhap(a[][max], int n);). Xuất/ nhập mảng: ta dùng 2 vòng lặp for I:=1 to n do for j:=1 to m do . Chú ý l ta không thể dùng phép toán địa chỉ để nhập các phần tử của mảng hai chiều (ngoại trừ mảng kiểu int), m phải thông qua một biến tạm trung gian. Thao tác : (i: đkh dòng, j: đkh cột, n: số dòng) +Đờng chéo: +Các phần tử đối xứng: -Qua đờng chéo chính: a[i][j] v a[j][i]. -Qua đờng chéo phụ: a[i][j] v a[n-j-1][n-i-1]. -Qua tâm: a[i][j] v a[n-i-1][n-j-1]. Duyệt ma trận : + Nữa trên đ/c chính: for (i=0; i<n-1; i++) for (j=i+1; j<n; j++) + Nữa dới đ/c chính: for (i=1; i<n; i++) for (j=0; j<i; j++) + Nữa trái ma trận: for (i=0; i<n; i++) for (j=0; j<n/2; j++) + Nằm trên đờng chéo chính: for (i=0; i<n; i++) với a[i][i] l các pt trên đ/c chính. + Đ/C song song với đ/c chính: for (i=0; i<n-k; i++) với a[i][i+k] l các pt // với đ/c chính. HTD (TH0003) C Programming (Se) Page: 6 E. Con Trỏ (Pointer): HTD (TH0003) C Programming (Se) Page: 7 Khai báo: + <Kiểu dữ liệu> *Tên_con_trỏ; Vd : int *pt,*x; + Mảng con trỏ: <Kiểu dữ liệu> *Tên_con_trỏ[sốphầntửmảng]; Vd : int *pt[10]; + Hm con trỏ: *Tên_hm (Danh sách các tham số) .; Các phép toán trên con trỏ: + Phép gán: khi thực hiện phép gán cho biến con trỏ thì biểu thức bên phải phép gán phải có giá trị l địa chỉ của một biến hay mảng v phải cùng kiểu với kiểu con trỏ. Vd: int x,*pt; . p=&a; + Phép toán lấy nội dung của biến do con trỏ chỉ đến(*): *tên_biến_con_trỏ. VD : y=*x; + Phép toán tăng giảm: pt++,pt--; Chú ý trong phép toán ny l mỗi lần tăng (giảm) l tăng (giảm) kích thớc của kiểu dữ liệu m nó trỏ đến (chứ không phải l một đơn vị). Con trỏ l tham số Hm: Nếu một hm có tham số l kiểu con trỏ thì khi truyền tham số ny cho hm phải truyền địa chỉ của biến có kiểu tơng ứng. Vd: void input (int a[], int*x); Gọi hm: input (a,&x); Con trỏ v mảng: +Mảng một chiều: Đối với mảng một chiều khi sử dụng mảng nếu chỉ ghi tên mảng m không ghi chỉ số thì có nghĩa l địa chỉ của phần tử thứ zero của mảng.( array <=> &array[0]). Khi một hm có tham số l mảng thì khi gọi hm ta chỉ truyền tên của mảng, không phải ghi chỉ số mảng. Vd: input (a , n); nhập mảng A gồm n phần tử. +Mảng nhiều chiều: Đối với mảng hai chiều khi sử dụng mảng nếu chỉ ghi tên mảng m không ghi chỉ số thì có nghĩa l địa chỉ của hng đầu tiên trong ma trận. (a &a[0] (&a[0][0]). Không thể dùng phép toán địa chỉ để nhập cho mảng hai chiều (ngoại trừ kiểu int). HTD (TH0003) C Programming (Se) Page: 8 Không thể dùng biến con trỏ để nhập cho mảng hai chiều. Giải pháp cho trờng hợp ny l ta nhập thông qua một biến tạm sau đó gán lại biến tạm ny cho cho phần tử tơng ứng của mảng. F. CHUổI (string): Khai báo: tơng tự nh khai báo mảng ta cũng có hai cách khai báo l khai báo tờng minh v không tờng minh: char tenchuoi [chiều di thực+1]; char tenchuoi [ ]; Các thao tác trên kiểu chuổi: + Nhập: Lệnh scanf(%s,tenchuoi); Lệnh ny không thể nhập vo một chuổi có chứa ký tự khoảng trắng, tab, enter, v để lại ký tự \n trong bộ đệm bn phím. Lệnh gets(tenchuoi); Đợc khai báo trong string.h. Lệnh ny có thể nhập đợc chuổi có khoảng trắng, kết thúc khi gặp ký tự xuống dòng(\0). + Xuất: Lệnh printf(%s,tenchuoi); Lệnh puts(tenchuoi); Xuất chuổi v xuống dòng. + Gán chuổi: Muốn sử dụng phép gán chuổi ta phải sử dụng biến con trỏ v hm calloc để cấp phát vùng nhớ cho biến ny. Vd: char *str; str=calloc(40,sizeof(char)); str=MediaSpace Club; . Các hm thờng dùng với kiểu chuổi, ký tự: (phần lớn đợc khai báo trong string.h). strcat( char*dest, char *scr): nối chuổi dest với chuổi scr; strspn(*str, *str_con): cho độ di đoạn đầu tiên lớn nhất của str m mọi ký tự của đoạn đều có mặt trong chuỗi str_con. strlen(char *str): cho chiều di thực của chuổi str. char *strupr(char *s): chuyển chuổi từ ký tự thờng sang HOA. HTD (TH0003) C Programming (Se) Page: 9 char *strlwr(char *s): chuyển chuổi từ ký tự HOA sang thờng. char *strrev(char *s): đảo ngợc cả chuổi trừ ký tự kết thúc(\0). char *strcpy(char *dest, char *scr): sao chép ton bộ chuổi src sang chuổi dest. char *strncpy(char *dest, char *scr,n): sao n ký tự đầu của chuổi src sang chuổi dest. char *strchr(char *str, int c): tìm sự xuất hiện đầu tiên của c trong str. Nếu tìm thấy hm trả về địa chỉ của ký tự tìm đợc trong str, ngợc lại trả về NULL. char *strstr(char *str, char *str_con): tìm sự xuất hiện đầu tiên của str_con trong str. Nếu thấy, hm cho địa chỉ của chuỗi con (trùng với str_con) trong str, ngợc lại hm trả về NULL. char *strbrk(char *s1, char *s2): duyệt trong s1 để tìm ký tự đầu tiên khớp với bất kỳ ký tự no của s2. Nếu có xuất hiện, hm cho địa chỉ của ký tự tìm thấy trong s1, ngựơc lại hm trả về NULL. int strcmp(char *s1, char *s2): so sánh 2 chuổi theo thứ tự, hm trả về < 0 nếu chuỗi s1 < chuỗi s2 ; = 0 nếu chuỗi s1 = chuỗi s2 ; >0 nếu chuỗi s1 lớn hơn chuỗi s2. int stricmp(char *s1, char *s2): giống nh strcmp nhng không phân biệt chữ HOA, chữ thờng khi so sánh. int memcmp(char *s1, char *s2, unsighed n); So sánh chuổi s1 v s2 một cách chính xác, phân biệt HOA thờng trong phạm vi n byte v trả về: <0 nếu s1 nhỏ hơn s2; = 0 nếu s1 trùng s2 ; >0 nếu s1 lớn hơn s2. char * strncat(char *s,char *s1,int n): ghép n ký tự đầu tiên của s1 vo s. char *itoa(int x,char *s,int cs): Chuyển số nguyên x trong hệ đếm cơ số cs (cs=10: hệ 10, cs=8:hệ 8, cs=16:hệ 16) sang chuỗi v lu vo vùng nhớ s. Hm trả về địa chỉ của vùng s . (stdlib.h) int atoi(char *s): chuyển chuỗi s sang giá trị int. long atol(char *s): chuyển chuỗi s sang giá trị long. HTD (TH0003) C Programming (Se) Page: 10 G. CấU TRúC (STRUCTURE): Định nghĩa kiểu v khai báo biến tách biệt: + Định nghĩa kiểu: struct tên_cấu_trúc { kiểu tên_thnh_phần 1; kiểu tên_thnh_phần 2; . kiểu tên_thnh_phần n; }; + Khai báo biến: struct tên_cấu_trúc biến_1, biến_2, .,biến_n; + Mảng cấu trúc: struct tên_cấu_trúc tênmảng[spt]; chúng ta cũng có thể sử dụng typedef trớc từ khoá struct để định nghĩa kiểu cấu trúc, khi đó muốn khai báo biến ta không cần đặt struct trớc tên_cấu_trúc. Định nghĩa kiểu v khai báo biến kết hợp: struct tên_cấu_trúc { các thnh phần cấu trúc giống nh trên; } biến_1,biến_2, .,biến_n; Truy xuất đến các thnh phần cấu trúc: + Đơn giản: biến_cấu_trúc.biến_thnh_phần; + Phức tạp: biến_cấu_trúc.biến_cấu_trúc_2.biến_thnh_phần; đợc sử dụng khi biến cấu trúc 2 l thnh phần trực tiếp của một biến câu trúc lớn hơn (Cấu trúc lồng nhau). Một số phép toán cơ bản trên kiểu cấu trúc: các thao tác trên biến cấu trúc phải đợc thực hiện thông qua các thnh phần của nó (ngoại trừ phép gán). Thao tác trên các thnh phần của cấu trúc cũng nh thao tác trên các biến có kiểu tơng ứng. Vd: + Nhập: scanf(%s,&nhanvien.ten); + Xuất: printf(\n Ten nhan vien la: %s.,nhanvien.ten); + Cộng: luong=nhanvien1.luong + nhanvien2.luong; [...]... giải chơng trình + Phơng pháp duy nhất để sữa c c lỗi c pháp l bạn phải biết chơng trình c a mình m c phải lỗi gì, điều ny đ c Borland C+ + thông báo trong c a sổ Message, v từ đây bạn c thể tra c u c c phơng pháp sữa chữa trong c c sách tra c u, đặt biệt l trong help online c a Borland C+ + + Khi gặp c c lỗi Logic lm cho chơng trình chạy không đúng hay cho kết quả sai ta c thể sử dụng c c ch c năng... c thể gán hai biến c u tr c cho nhau; gán biến cho phần tử mảng; gán phần tử mảng cho biến; gán hai phần tử mảng cho nhau Điều c n lu ý l c c biến v c c phần tử mảng phải c ng kiểu + Khởi tạo giá trị đầu cho c u tr c: ta khởi tạo giá trị bằng c ch viết vo sau khai báo c a chúng c c giá trị c a c c thnh phần Vd: struct nhanvien2{Nguyen Van A, 1990, 500000}; Con trỏ kiểu c u tr c: + Khai báo: kiểu _c u_tr c. .. Với fp l con trỏ File, control chứa địa chỉ c a chuổi điều khiển (giống nh trong hm printf), l danh sách c c đối m giá trị c a chúng c n ghi vo File VD: fprintf(fp,\n this year: %d,iYear); Đ c dữ liệu theo khuôn dạng: int scanf(FILE *fp, const char *control, ); Với fp l con trỏ File, control chứa địa chỉ c a chuổi điều khiển (giống nh trong hm printf), l danh sách c c đối chứa kết quả đ c đ c từ File... dụng c a sổ EVALUATION (nhấn Ctrl+F4), với c a sổ ny ta HTD (TH0003) C Programming (Se) Page: 18 c thể quan sát giá trị c a c c biến, mảng, qua mỗi dòng th c chơng trình (gõ vo tên biến, mảng, c n xem trong khung Evaluate v xem giá trị trong khung result), hay lm thay đổi giá trị c c biến, tính toán c c biểu th c, c c hm -Dùng c a sổ Watch (Window\Watch) để theo dõi sự thay đổi giá trị c a c c biến,... mảng Để xem c c biến trong c a sổ Watch, ta chọn Debug\Watch\Add Watch v gõ tên biến c n xem vo, nhấn F7 hay F8 để chạy từng b c chơng trình v xem gía trị c a biến C thể nhập vo nhiều biến, mỗi lần chỉ đ c nhập một biến Để xoá một biến ta chỉ di chuyển đến biến muốn xoá trong c a sổ Watch v nhấn Delete Nếu không thấy c a sổ Watch khi chạy từng b c chơng trình, ta nhấn F5 -Dùng c a sổ User Screen để quan... trình, ta nhấn F5 -Dùng c a sổ User Screen để quan sát kết quả th c hiện c a chơng trình: Window\ User Screen hay Alt+F5 Ngoi ra c n nhiều kỹ thuật kh c nh sử dụng điểm gãy, inspect, call stack, để gở rối c c hm, chơng trình C c bạn c thể xem chi tiết trong c c sách tham khảo về Lập trình C Lu ý: HTD - TH0003 (5.2001) Se (9.2001) HTD (TH0003) C Programming (Se) Page: 19 ... đ c ghi c c đối tợng c c ng độ lớn nh c u tr c, số th c, Một số hm kh c thao t c trên FILE: (c p II) int fflush(FILE *fp); lm sạch vùng đệm File fp, thnh c ng ->0, ng c lại >EOF int fflushall(void); lm sạch vùng đệm c a c c File đang mở, nếu thnh c ng hm trả về giá trị số tệp đang mở, ng c lại trả EOF int ferror(FILE *fp); dùng kiểm tra lỗi thao t c trên File fp Hm trả về giá trị 0 nếu c ... X c nhận giải mu hiện hnh: void palette(struct palettetype *palette); C u tr c của palettetype đ c trình by trong help online với index l palettetype C c hm getcolor(), getbkcolor() v getmaxcolor() trả về mu đã x c định với setcolor, setbkcolor, v số lợng mu c c đại thụ c dãy mu hiện hnh Vẽ cung tròn: void arc(int x, int y, int gocdau, int goccuoi, int bankinh); G c: độ Vẽ đờng tròn: void circle(int... File VD: fscanf(fp,%d%f,&ia,&fa); Ghi chuổi ký tự: int fputs(const char *s, FILE *fp); Với s l con trỏ chỉ tới địa chỉ đầu c a một chuổi ký tự kết th c bằng \0 Hm sẽ ghi chuổi s lên File fp, nếu thnh c ng trả về ký tự cuối c ng đ c ghi vo File, ng c lại trả về EOF Đ c chuổi (dãy) ký tự từ File: char *fgets(char *s, int n, FILE *fp); Với s l con trỏ kiểu char trỏ tới vùng nhớ để chứa chuổi đ c từ File,... lỗi, ng c lại trả về 0 void perror(const char *s); in chuổi s v thông bo lỗi hệ thống int unlink(const char *filename); xoá một File trên đĩa, nếu thnh c ng hm cho giá trị 0, ng c lại trả về EOF void rewind(FILE *fp); chuyển con trỏ chỉ vị c a File fp về đầu File int fseek(FILE *fp, long sb, int xp); di chuyển con trỏ chi vị c a File fp từ vị trí x c định xp qua |sb| byte Chiều di chuyển l về cuối

Ngày đăng: 26/04/2013, 17:13

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan