ậ
ầ ề
ể ử ụ ụ ư ướ ụ ổ ế ệ i đây là 3 công c ph bi n và ti n L p trình C: Bài 1 – Hello World ậ 1. Ph n m m l p trình C Chúng ta có th s d ng các công c khác nhau nh ng đ ợ l ấ i nh t
ươ ể ề ạ ầ ộ ng t.
Dev C CodeBlocks Visual C … Ngoài ra b n nào dùng Linux thì chúng ta có th dùng Geany cũng là m t ph n m m t ố ố đ i t ạ
ệ ọ ậ ủ ể ụ ụ ể ử ụ ầ ộ ạ ư ề Các b n có th s d ng m t trong các ph n m m trên đ ph c v cho vi c h c t p c a mình ặ nh ng mình khuyên các b n nên dùng Dev C ho c CodeBlocks (trong windows) và Geany trong Linux.
ươ ầ
ng trình đ u tiên Hello World ầ ấ ơ ủ ả ộ ộ ươ ầ 2. Ch Và đây là n i dung bài đ u tiên c a chúng ta. N i dung r t đ n gi n: Ch ng trình đ u tiên
HelloWorld.cpp code in devC by nguyenvanquan7826
1
2
3
4
5
6
7
8
9 // Chuong trinh in ra dong chu: Chuong trinh C dau tien cua toi !
#include
ậ ấ ề ở ụ ể ạ ị ươ thanh công c đ biên d ch và ch y ch ng ế ặ ứ B n n F9 ho c cái nút th 3 (4 màu li n nhau) ả ủ trình. K t qu c a chúng ta:
ị ạ ễ ắ ầ t hàng này là hàng di n gi ằ // cho bi ủ ượ ị ng trình, dòng này không đ ế ả c d ch và cũng không thi hành l nh gì c . M c đích c a ơ ạ ế ươ t i ch ệ ọ ạ ng trình rõ ràng h n. Sau này b n đ c l i (chú thích). Khi d ch và ch y ả ụ ươ ng trình bi
ể ứ ứ ề ử
ươ ạ ầ ư ệ ủ ị ế ế ủ ử ụ
ư ệ ch a phát bi u ti n x lý #include
i. V ch c năng c a t ng th vi n mình s nói trong các bài sau nhá. ể ế ạ ng trình C (b n có th vi ng trình rõ ràng ẽ ề ặ ề ấ ể ươ ắ ầ ề ẽ ươ ạ ươ ng trình C đ u b t đ u thi hành t ọ ế t theo d ng int main() đ ch ọ ố ừ ặ t đây là kh i hàm (function). Hàm int main() có t ừ khóa int ế ắ ầ ớ ạ ằ ị ể ả ề ặ c p d u ngo c móc {} gi i h n thân c a hàm. Thân hàm b t đ u b ng ấ ấ ặ ằ ế ỗ ỉ
ượ ọ ệ ế ệ ộ ộ ự ị c g i là m t câu l nh, k t thúc m t câu l nh trong C
ấ ẩ ượ ọ ạ ơ ươ ừ ạ ỉ ị i n i mà nó đ ng trình t c g i. i ch ả ả ề ị ể ư ầ
ư ệ ẩ ư vì trong chu n C không có th không dùng th vi n conio.h ể ừ ượ ệ ằ Dòng th 1:ứ b t đ u b ng ươ ch ệ vi c ghi chú này giúp ch ươ ch ng trình làm gì. Dòng th 2,3: ch khai báo c a hàm th vi n này đ báo cho trình biên d ch C bi ư ệ ẽ trình s báo l Dòng th 4ứ : int main() là thành ph n chính c a m i ch ủ ạ main() ho c void main(). Tuy nhiên, b n nên vi ụ ể ơ h n (V v n đ này mình s nói c th sau). M i ch ấ ế ặ hàm main. C p d u ngo c () cho bi ầ t hàm này tr v giá tr ki u nguyên (int). đ u tiên cho bi ủ ứ Dòng th 5 và 9: ấ d u { và k t thúc b ng d u }. Dòng th 6:ứ printf (“Chuong trinh C dau tien cua toi !\n”); , ch th cho máy in ra chu i ký t ằ n m trong nháy kép (“”). Hàng này đ ả ph i là d u ấ ch m ph y( ; ). Dòng th 7:ứ system(“pause”); ch th máy d ng l ế ể ừ Trong Th này ta dùng đ d ng màn hình xem k t qu Dòng 8: return 0; Tr v giá tr ki u nguyên là 0 theo nh đúng ban đ u là khai báo int main(). L u ý:ư ươ ng trình này mình 1. Trong ch ừ đó cũng không dùng đ vi n này, và t c getch() đ d ng màn hình mà mình đã thay b ng
ạ ị ủ ể ỏ ệ ư ả ề ạ ng i là tr v 0. Còn sai th nào
ế
ậ ấ ậ
ẽ ấ ấ ươ ự ả ố ơ ng đ i dài tuy nhiên thì khi th c hành s th y r t là đ n gi n. Đây là ế t
ệ l nh system(“pause”); ể ả ề ươ 2. Khi dùng hàm return đ tr v giá tr c a hàm thì các b n có th b qua l nh này ch ế ả ề ẩ ề ạ ẫ trình v n ch y nh ng v chu n là sai, tr v 1 cũng sai, tóm l mình nói sau. ư ủ Bài c a chúng ta coi nh là h t !!! ể ữ ệ L p trình C: Bài 2 – Ki u d li u và nh p xu t trong C Bài hôm nay nhìn t ụ ụ m c l c bài vi ộ N i dung (cid:0) ể ữ ệ ể đi u khi n
o o o
(cid:0)
ệ
o o o o o
ể
A. Ki u d li u trong C ự ề 1. Các ký t ừ 2. T khóa ể ế 3. Ki u và bi n ấ ậ B. Nh p, Xu t trong C ữ ệ ỗ ị ạ 1. Chu i đ nh d ng d li u ấ ữ ệ 2. Xu t d li u: printf(); ậ ữ ệ 3. Nh p d li u: scanf(); ỗ ậ 4. Nh p chu i trong C ệ ượ ng trôi l nh 5. Hi n t ể ữ ệ A. Ki u d li u trong C ự ề đi u khi n 1. Các ký t ả ố ề ộ ầ
ố
ế ế \n : Nh y xu ng dòng k ti p canh v c t đ u tiên. ộ \t : Canh c t tab ngang. ả ề ầ \r : Nh y v đ u hàng, không xu ng hàng. ế \a : Ti ng kêu bip. \\ : In ra d u \ấ \” : In ra d u “ấ \’ : In ra d u ‘ấ %%: In ra d u %ấ
ỉ ể ộ ộ ự ề đi u ộ ố ạ ể ể ể ử ươ ự ể ề ậ ự ể đi u khi n quen thu c, hay dùng, ngoài ra còn m t só ký t ệ ể ạ ạ ự ề đi u khi n các b n hãy ch y th ch ng trình sau và t rút ra nh n
Đây ch là m t s ký t khi n khác các b n có th xem thêm trong các tài li u. D hi u rõ v các ký t xét cho riêng mình. code by nguyenvanquan7826
#include
02
int main(){ 03
printf("\a"); 04
05 printf("Hinh nhu vua co tieng gi keu @@\n");
printf("Ban dang o dong thu 2\nBay gio xuong dong 3 roi ne ^^\n"); 06
printf("\tDong nay cach ra 1 tab thi phai?\n"); 07
printf("\t\t\t\t\t\tCach ra nhieu tab qua \rVe dau dong thoi\n"); 08
printf("Dau \\ \nDau \'\nDau \" \nDau %%"); 09
10
// day la mot dong ghi chu 11
12
13 /*
Day la mot doan ghi chu 14
Doan ghi chu nay co 2 dong 15
16 */
17
18 // system("pause"); // su dung de dung man hinh neu ban dung devC
19 return 0;
20 }
ừ ữ ự ẵ ị ạ ừ 2. T khóa Là các t mà ngôn ng C đã xây d ng s n, chúng ta không nên đ nh nghĩa l i chúng.
ể ự ứ ủ ồ ổ ể ự ư ướ
ướ ề ạ ị ậ ụ c, cái r đ đ ng rau,… ị ươ ứ ng ng v i mi n giá tr và lo i giá tr mà nó c khác nhau và t ớ ộ ớ ể ứ ể ự ế ố ế ể 3. Ki u và bi n ể ữ ệ a. Ki u d li u ể ữ ệ ố Ki u d li u gi ng nh là các thùng ch a, v t d ng đ đ ng đ dùng c a chúng ta. VD ca ố ướ ể ự u ng n c đ đ ng n ạ ữ ệ ỗ M i lo i d li u có kích th ệ có th th c hi n. VD ki u ể int chi m 2 byte b nh và đ ch a các s nguyên,…
ỗ ể ề ằ ể ữ ệ ể ị ế ạ ầ ộ ệ t ki u và bi n. ươ ứ ế ế ư ổ ầ ể ự ị ố ng ng bi n a l u giá tr s ế ươ ứ ng ng v i m i ki u d li u chúng ta có các bi n, h ng thu c các ki u đó và có mi n giá ị ươ ứ ổ ế ư ể ự ư
ằ ổ ể ế ự ể ươ ể ng trình còn h ng thì không th .
ế ấ ạ ự ữ ệ ỗ i. Ký t ụ ồ liên t c g m: Ký t ch , s và d u g ch d ượ ặ ướ ớ ự ạ ướ ặ ự ữ ố i. Khi đ t tên không đ c đ t trùng v i các
ạ ấ ặ ớ ố ử ụ ặ ự ầ đ u là s ); numodd (s d ng d u g ch ngang); int (đ t tên trùng v i ả ữ ng ừ ẫ ạ ặ khóa, do đó b n đ t tên là Case v n
ể
ể ữ ệ Ki u d li u trong C ằ b. Bi n – h ng ớ T ể ư tr t ng ng nh trên dùng đ l u giá tr . Các b n c n phân bi ố VD cái r A đ đ ng rau mu ng, cái r B đ đ ng rau c n thì t ặ ị ố 5, còn bi n b l u giá tr s 9 m c dù chúng cùng ki u ệ Bi n có th thay đ i trong quá trình th c hi n ch ế ể Cách khai báo bi n: ki u_d _li u tên_bi n; ộ ợ ệ ế là m t chu i ký t – Tên bi n h p l ữ ặ ấ ả ầ ủ đ u c a tên ph i là ch ho c d u g ch d ừ t khóa. Ví d 1 :ụ Các tên đúng: delta, a_1, Num_ODD, Case Các tên sai: 3a_1 (ký t ấ ắ ừ t khóa) ; del ta (có kho ng tr ng); f(x) (có d u ngo c tròn) ữ ườ ệ ư L u ý: Trong C, tên phân bi t ch hoa, ch th ụ Ví d 2 : number khác Number ; case khác Case (case là t đúng) Cú pháp: ki u danh_sach_cac_bien; VD: code by nguyenvanquan7826
#include
02
03 int main(){
int a, b; // khai bao 2 bien kieu so nguyen 04
float c, d; // khai bao 2 bien kieu so thuc 05
a = 1; 06
b = 2; 07
c = 3.4; 08
d = 5.6; 09
10
int e = 4, f = 6; 11
12
printf("a = %d; b = %d\n", a, b); 13
printf("c = %f; d = %f\n", c, d); 14
printf("e = %d; f = %d\n", e, f); 15
16
17 // system("pause"); // su dung de dung man hinh neu ban dung devC
18 return 0;
19 }
ồ ấ ạ ề ệ ấ ấ ầ ẽ ị ế ụ ể ở ế ử ụ ể ấ ượ t theo đ th y đ c cách khai báo bi n là ok roài. !
ị ế ạ ậ ủ ạ ẽ ẫ ử ụ ả ạ ầ ượ ậ ị ế ị c, vì v y b n c n ph i xác đ nh đúng v ạ ử ụ ướ ế ấ t c các hàm, c u trúc… Các ắ ầ ế ả ế ạ ấ ả ủ ng trình. Chu trình s ng c a nó là b t đ u ch y ng đ n toàn b ch ế ể ử ụ c khi s d ng bi n. ặ ị ộ ươ ng trình. ế ế ị ắ ầ ừ ặ ố ưở ỉ ả ấ lúc hàm, c u trúc đ ng ượ c ế ế ụ ộ V trí bi n đ t bên trong hàm, c u trúc…. Ch nh h ấ ủ ự ệ ệ ế ạ ẽ ấ ơ ồ ụ ế ề ạ ơ
ư Nh trên các b n th y c u trúc khai báo r i đó. Còn v l nh xu t ra màn hình các giá tr thì có ộ ố ề m t s đi u khác đó là cách s d ng %d, %f . Cái này mình s nói c th ph n sau, đ n đây ạ ứ ế các b n c vi V trí khai báo bi n: ả ắ ế Khi l p trình, b n ph i n m rõ ph m vi c a bi n. N u khai báo và s d ng không đúng, ế không rõ ràng s d n đ n sai sót khó ki m soát đ ế ế trí, ph m vi s d ng bi n tr ụ V trí bi n đ t bên ngoài t ế Khai báo bi n ngoài (bi n toàn c c): ế ố ưở bi n này có nh h ươ ươ ch ng trình đ n lúc k t thúc ch ấ Khai báo bi n trong (bi n c c b ): ộ ộ n i b bên trong hàm, c u trúc đó…. Chu trình s ng c a nó b t đ u t ự ọ g i th c hi n đ n lúc th c hi n xong. Lý thuy t đôi khi m h , các b n làm ví d sau và ch y s th y rõ h n nhi u. code by nguyenvanquan7826
01 #include
02
03 int a = 1, b = 5; // khai bao bien toan cuc, no se duoc dung o bat ky dau 04
05 int main(){ 06 // khai bao 2 bien trong ham main, no se duoc dung trong toan bo ham main ke tu dong nay 07 int c = 4, d = 6; 08
09 { 10 int e = 6, d = 8; 11 c = 7; 12 printf("gia tri cac bien trong khoi:\n"); 13 printf("e = %d \t d = %d \t c = %d\n", e, d, c); 14 } 15
16 printf("gia tri cac bien trong ham main:\n"); 17 printf("c = %d \t d = %d\n", c, d); 18
19 printf("gia tri cac bien toan cuc:\n"); 20 printf("a = %d \t b = %d\n", a, b); 21
22 // system("pause"); // su dung de dung man hinh neu ban dung devC 23 return 0; 24 }
ươ ế ả ự ư ẫ ậ ng trình, xem k t qu và t ể ế rút ra nh n xét nhá, n u v n ch a rõ có th
ể ằ ở ấ ỳ ươ ạ ạ Các b n ch y ch ỏ ự ế h i tr c ti p trên blog. Cách khai báo h ng:ằ ạ Khai báo h ng b n có th khai báo b t k đâu trong ch ng trình, khai
ở ằ ừ ẽ ượ ị đâu thì t c xác đ nh. đó h ng s đ ấ ả ở ố cu i nhá) ấ ư ộ ố ườ ộ i dùng vì khi dùng const trong m t nh m t s ng ị ủ ằ ấ ổ ượ ợ c giá tr c a h ng.
báo Cú pháp: #define ten_hang gia_tri (Không có d u ch m ph y Chú ý chúng ta không dùng c u trúc const ẫ ố ườ ng h p ta v n thay đ i đ s tr code by nguyenvanquan7826
#include
02
#define a 6 // hang so 03
#define c 'a' // hang ky tu 04
#define s "nguyenvanquan7826" // hang chuoi 05
06
int main(){ 07
printf("hang a = %d\n", a); 08
printf("hang c = %c\n", c); 09
printf("hang s = %s\n", s); 10
11
12 // system("pause"); // su dung de dung man hinh neu ban dung devC
13 return 0;
14 }
ậ ả
ấ
ạ ậ ỗ ị
ề ộ ố ị ạ ạ ớ ế ẽ c khi đ n v i ph n nh p, xu t d li u cho các bi n mình s nói v m t s đ nh d ng đ ể ấ ạ ế ấ ấ ữ ệ ả ị đ nh d ng:
ạ Các b n ch y và c m nh n nhá B. Nh p, Xu t trong C ữ ệ 1. Chu i đ nh d ng d li u ậ ầ Tr nh p và xu t. Sau đây là các d u mô t ự ơ đ n
ệ ấ
ệ ố
ấ ệ ấ ụ ớ ướ ậ %c : Ký t %s : Chu iỗ %d : S nguyên h 10 có d u ộ ẽ %f : S ch m đ ng (VD 5.54 khi in s ra 5.540000) ộ %e : S ch m đ ng (ký hi u có s mũ) ẽ ộ %g : S ch m đ ng (VD 5.54 khi in s in ra 5.54) %x : S nguyên hex không d u (h 16) ệ %o : S nguyên bát phân không d u (h 8) ể ỉ ố dùng kèm v i %d, %x, %o đ ch s nguyên dài (ví d %ld) ố ố ấ ố ấ ố ấ ố ố ề ố l : Ti n t
ấ ữ ệ ể printf đ xu t d li u ra màn hình console.
ấ ữ ệ 2. Xu t d li u: printf(); ử ụ Chúng ta s d ng hàm code by nguyenvanquan7826
#include
02
int main(){ 03
int a = 12; 04
float b = 13.5; 05
char c = 'Q'; 06
long d = 3454; 07
08 char* s = "nguyenvanquan7826"; // khai bao kieu chuoi
09
10 printf("tong cua %d va %f la %f \n", a, b, a+b);
11 printf("tich cua %d va %ld la %ld \n", a, d, a*d);
12 printf("ky tu c la: %c \n", c);
13 printf("chuoi s la: %s \n", s);
14 printf("dinh dang so mu cua b la %e \n", b);
15 printf("so he 16 va he 8 cua %d la %x va %o \n", a, a, a);
16 printf("ma ASCII cua %c la %d", c, c);
17
18 // system("pause"); // su dung de dung man hinh neu ban dung devC
19 return 0;
20 }
ả ấ ủ ệ ệ ể ơ Mình xin gi i thích 1 câu l nh đ làm rõ h n vi c xu t c a chúng ta.
ạ ạ ớ ự có s qua l ị ể ự ạ ự ằ ạ ế ể ị ố có mã là s Vd trên câu ẽ ủ ả ư ấ ủ ả ẫ ấ ộ ả ạ ậ
ấ ạ
ự ấ ố ề ộ ỗ ề ộ ấ ố ề ộ ư ề trái
ố ớ ố i v i nhau thông qua mã ASCII Các b n cũng chú ý là đ i v i s nguyên và ký t ự ủ nên chúng ta có th in mã c a ký t b ng đ nh d ng %d và cũng có th in ký t ổ Ở nào đó thông qua đ nh d ng %c. Tuy nhiên b n ch t c a bi n không thay đ i. ể ế ố ệ l nh in mã ASCII c a c s cho s nguyên nh ng b n ch t c v n là m t bi n ki u char. ạ Các b n hãy ch y và c m nh n ! ộ ế ị Ti p nhá, m t vài cách xu t có đ nh d ng: ề ộ có b r ng 5 %5c : Xu t ký t ề ộ %5d : S nguyên có b r ng 5 ấ %20s : Xu t chu i có b r ng 20 ẩ ấ ố ự %5.3f : Xu t s th c có b r ng 5 trong đó có 3 s sau d u ph y %5d : S nguyên có b r ng 5 nh ng căn l ạ ố ậ
ả Ch y và c m nh n vd ! code by nguyenvanquan7826
#include
02
int main(){ 03
int a = 12; 04
float b = 13.5; 05
char c = 'Q'; 06
long d = 3454; 07
08 char* s = "nguyenvanquan7826"; // khai bao kieu chuoi
09
10 printf("%6d %5.3f %.3f \n", a, b, a+b);
11 printf("%5d %5ld %5ld \n", a, d, a*d);
printf("%5c \n", c); 12
printf("%30s \n", s); 13
14
// system("pause"); // su dung de dung man hinh neu ban dung devC 15
return 0; 16
} 17
ử ụ ệ ừ ậ scanf đ nh p li u t bàn phím
ậ ữ ệ 3. Nh p d li u: scanf(); ể Ta s d ng hàm code by nguyenvanquan7826
#include
02
int main(){ 03
int a; 04
float b; 05
06
printf("Nhap so nguyen a = "); 07
scanf("%d", &a); 08
09
printf("Nhap so thuc b = "); 10
scanf("%f", &b); 11
12
printf("a = %d \t b = %.3f", a, b); 13
14
15 // system("pause"); // su dung de dung man hinh neu ban dung devC
16 return 0;
17 }
ố ố ấ ừ ỗ ị ế ướ ậ ỗ ạ ặ ẽ ị ự ư ươ ạ ạ ể ự ế & tr c m i bi n. N u không s sai. ượ ặ c đ t trong ngo c kép: “ ” và các đ nh d ng t ng t nh khi chúng ta
ể ươ ứ ể ẽ ầ ỗ ị ế ế ạ ộ ng ng, n u khác ki u s d n đ n sai sót.
ớ ỗ
ạ ẽ ấ ằ ậ ượ ế ể ể ậ ỗ ậ ượ ướ ấ c chu i ế c đó b n nh p s thì sau đó không nh p đ ạ ớ ươ ng trình sau:
ụ T ví d này ta th y cú pháp đ nh p: scanf (“chu i đ nh d ng”[, đ i 1, đ i 2,…]); ừ Chú ý đ ng quên ký t ỗ ị Chu i đ nh d ng đ ấ ữ ệ xu t d li u. ươ ứ ng ng v i m i đ nh d ng là m t ki u t T ậ 4. Nh p chu i trong C ỗ ạ N u các b n dùng hàm scanf đ nh p chu i thì b n s th y r ng không th nh p đ ỗ ữ ậ ố ặ ế c chu i n a. N u có d u cách ho c n u tr ể ử ạ ạ không tin b n có th th ch y v i ch code by nguyenvanquan7826
#include
02
int main(){ 03
int tuoi = 0; 04
// khai bao chuoi co toi da 30 ky tu 05
char ten[30], tenNguoiYeu[30]; 06
07
printf("Ho va ten cua ban ten la gi?"); 08
scanf("%s", ten); // nhap chuoi khong can dau & 09
10
printf("Ban bao nhieu tuoi roi?"); 11
scanf("%d", &tuoi); 12
13
printf("Nguoi yeu cua ban ten la gi?"); 14
scanf("%s", tenNguoiYeu); 15
16
17 printf("\n====\n");
18 printf("%s \n%d \n%s", ten, tuoi, tenNguoiYeu);
19 // system("pause"); // su dung de dung man hinh neu ban dung devC
return 0; 20
21 }
ậ ượ ế ả ổ ườ ạ ẽ K t qu là b n s không nh p đ c tu i và tên ng ư i yêu nh hình sau.
ấ ắ ả ỉ ọ ượ ữ ệ ỉ ạ ộ ệ ỗ ầ ẽ ượ ư ấ ậ ượ c l u vào b đ m bàn phím do đó b n ch nh n đ ế ị ế ỗ ấ c đ u cách mà thôi (ch ế ả ướ ấ ể ữ ệ ủ ượ ạ ẽ ậ ẽ c, tenNguoiYeu c d li u không có kho ng tr ng (đ u cách, d u tab, enter, …) và c chu i đ u ợ c s nh n giá tr ti p theo ữ Nguyen), sau m i d u cách, các giá tr ti p theo n u phù h p ẽ ế ậ ượ tuoi ki u nguyên nên không nh n đ ị c là ch ữ Van.
ệ ượ
ượ ọ ờ ạ ự ệ ậ c g i là hi n t c và chu i ngay sau đó thì hi n t ạ ậ ọ ị c l u vào b đ m và khi đ c giá tr nh p cho ệ b n th c hi n cho nh p ng trôi l nh. N u bây gi ọ ượ ng này cũng x y ra vì scanf không đ c đ c phím ượ ư ậ ể ế ả ộ ệ ỗ ỗ
enter là ki u chu i nên nó gán luôn cho chu i đó. ử ụ ộ ệ ỗ ậ ượ ấ c chu i có kho ng tr ng (d u cách) chúng ta s d ng hàm gets.
ộ ệ ể ể ầ ằ ỗ ị c và chu i sau ta c n xóa b đ m bàn phím b ng
Lý do là scanf ch đ c đ các kho ng cách này s đ tiên tr ớ v i ki u d li u c a các bi n ti p theo thì nó s gán luôn cho chúng và b n s không đ ị ế ể ậ ữ nh p n a. Do ậ ượ trong các giá tr nh n đ ệ 5. Hi n t ng trôi l nh ệ ượ ư ệ ượ ng nh trên đ Hi n t ệ ượ ỗ ố ướ s tr ố ấ enter khi b n nh n lúc nh p xong s , nó đ ấ ự ỗ chu i nó tìm trong b đ m th y ký t ả ắ Đ nh p đ ậ ố ướ ệ Đ không b trôi l nh khi nh p s tr l nhệ fflush(stdin); ngay sau khi nh p s . ậ ố code by nguyenvanquan7826
#include
02
int main(){ 03
int tuoi = 0; 04
05 // khai bao chuoi co toi da 30 ky tu
char ten[30], tenNguoiYeu[30]; 06
07
printf("Ho va ten cua ban ten la gi?"); 08
gets(ten); // nhap chuoi khong can dau & 09
10
printf("Ban bao nhieu tuoi roi?"); 11
scanf("%d", &tuoi); 12
fflush(stdin); 13
14
printf("Nguoi yeu cua ban ten la gi?"); 15
gets(tenNguoiYeu); 16
17
18 printf("\n====\n");
19 printf("%s \n%d \n%s", ten, tuoi, tenNguoiYeu);
20 // system("pause"); // su dung de dung man hinh neu ban dung devC
21 return 0;
22 }
ạ ế ạ ộ ẽ fflush(stdin) trong fflush(stdin); s không ho t đ ng, b n hãy đ c bài ể ế ụ N u b n dùng Linux thì ubuntu (linux) ho cặ gets() and fget() in C/C++ đ bi ạ ọ ắ t cách kh c ph c.
ả B ng mã ASCII
ậ
ệ ớ ẽ ớ ử ạ trong C ự ệ ử i thi u t i các b n cách th c hi n các phép toán trong C, các toán t ữ ệ ữ L p trình C: Bài 3 – Phép toán, toán t ọ Bài h c hôm nay s gi ể ử đ x lý d li u n a.
ộ N i dung (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) ướ c (cid:0) ọ ử toán h c ệ ử quan h ử ậ lu n lý ả ử tăng/gi m ử ở ạ kh i t o ệ ử ề đi u ki n ử ẩ ph y ử ấ l y kích th ủ 1.Toán t 2.Toán t 3.Toán t 4.Toán t 5.Toán t 6.Toán t 7.Toán t 8.Toán t ộ ư 9.Đ u tiên c a các toán t ử
ọ ơ ả ử ọ toán h c 1.Toán t ử ấ C cung c p 5 toán t toán h c c b n
ả STT Toán tử Tên Ví dụ K t quế
1 + C ngộ 4+12.6 16.6
2 Trừ 42.5 1.5
3 * Nhân 4*2 8
4 / Chia 6/3 2
5 % L y dấ ư 6%4 2
ả STT Toán tử Tên Ví dụ K t quế
1 + C ngộ 4+12.6 16.6
ử ọ Các toán t toán h c trong C
ử ụ Th làm 1 ví d :
code by nguyenvanquan7826 fileName: toantu.cpp
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20 #include
ả K t quế
5 + 4.500000 = 9.500000 5 – 7 = 2 7 * 6.000000 = 42.000000 7 / 5 = 1 4.500000 / 5 = 0.900000 4.500000 / 6.000000 = 0.750000 7 % 5 = 2
ả ề ử ấ i ầ ư ể ượ ằ ố ượ ạ ạ l y ph n d (%) yêu c u c hai toán h ng là s nguyên. Nó tr v ph n d còn l c 1 và ố ầ ả c tính toán b ng cách chia s nguyên 7 cho 5 đ đ ầ ư ụ ế ế ầ ư Toán t ủ c a phép chia. Ví d 7 % 5 đ ả ph n d là 2; vì th k t qu là 2.
ế ả ả ẽ ế ạ ng, n u c hai toán h ng là s nguyên sau đó k t qu s là m t s nguyên. Tuy ộ ố ộ ố ự ặ ả ả ẽ ế ạ ố ườ Thông th ố ự ộ nhiên, m t ho c c hai toán h ng là s th c thì sau đó k t qu s là m t s th c.
ố ạ ả ử ủ ượ ư chia là s nguyên thì sau đó phép chia đ ộ ườ ố ả ầ ả ệ ự c th c hi n nh là ử ụ ng mà chúng ta s d ng. Phép ả ứ ng. Ví d : 7 / 5 =1 ch không ph i 7 ụ ặ ả ự ồ ể ể ắ ố ủ ể ể ể ự ệ ể ầ ể ế Khi c hai toán h ng c a toán t ố m t phép chia s nguyên và không ph i là phép chia thông th ươ ế chia s nguyên luôn cho k t qu là ph n nguyên c a th ộ ố ụ ỗ ể / 5 = 1.4. Đ kh c ph c l i này thì ta có th chuy n m t s ho c c 2 s sang ki u th c r i ư ể th c hi n phép chia. Cách chuy n ki u (hay ép ki u) ta nh sau: (ki u c n chuy n) (bi n).
ế ể ủ
ớ ể ờ ạ ỉ ạ ầ ớ ạ ể ờ ộ ể ể ế ể ư ạ ị ổ ị ứ ờ ễ ụ i. Ví d cho d .
ầ
ị ứ
ế
L u ýư khi ép ki u th này thì ki u c a các bi n ban đ u không thay đ i mà ch là giá tr t c
ổ
i th i đi m đó thay đ i sang ki u m i). Đ l u l
th i (t
i giá tr t c th i này b n c n khai
ể ầ
báo thêm m t bi n m i có ki u c n chuy n và gán giá tr đó l
code by nguyenvanquan7826 fileName: epkieu.cpp
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21 #include
ế ả K t qu :
7 / 5 = 1 7 / 5 = 1.400000 7 / 5 = 1.400000 7 / 5 = 1.000000
ố ử ệ ả ề ế quan h đ so sánh các s . Các toán t quan h tr v 1 (thay cho k t ệ ể ế ả ặ ả ệ ử quan h 2.Toán t ử ấ C cung c p 6 toán t qu đúng) ho c 0 (thay cho k t qu sai).
ả STT Toán tử Tên K t quế Ví dụ
== 5 == 5 So sánh b ngằ 1 1
!= 5 != 5 So sánh khác 2 0
ớ > 5 > 4 ơ So sánh l n h n 3 1
< 5 < 4 ỏ ơ So sánh nh h n 4 0
ơ >= 5 >= 4 5 1 ớ So sánh l n h n ặ ằ ho c b ng
ỏ ơ <= 5 <= 5 6 1 So sánh nh h n ặ ằ ho c b ng
ử Các toán t ệ quan h trong C
ể ử ớ ề ế ả c so sánh ch không ph i là ,… tuy nhiên không so sánh ứ ể ủ ấ ị ỉ ủ ẽ ở ư ệ ỗ th vi n string và s tìm hi u sau. Khi so ự ự ớ v i nhau thì b n ch t ta có th hi u là máy so sánh các mã ASCII c a các ký t ả ẽ ả ề ự ử ụ này đ so sánh các giá tr , các ký t Chúng ta s d ng các toán t ỗ ượ ị ẽ ẫ các xâu v i nhau vì đi u này s d n đ n các đ a ch c a chu i đ ộ n i dung chu i. Chúng ta có các hàm so sánh xâu ể ể sánh các ký t ị ớ v i nhau. VD. ‘A’ >’B’ s tr v giá tr 0 vì ‘A’ có mã ASCII là 65 còn ‘B’ là 66.
lu n lý ứ ư ể ậ ố ử lu n lý cho vi c k t n i các bi u th c lu n lý. Gi ng nh các toán t ệ ử ậ ử ậ 3.Toán t ấ C cung c p ba toán t quan h , các toán t ử ậ lu n lý ệ ế ố ớ ng t ặ i 0 ho c 1. ướ ượ c l
ả STT Toán tử K t quế Tên Ví dụ
! ủ ị Ph đ nh !5 1 0
&& Phép và 5 > 4 && 5 > 6 2 0
|| Phép ho cặ 5 > 4 || 5 > 6 3 1
ử ậ Các toán t lu n lý trong C
ấ ả ệ ộ ệ ợ ươ ứ i t ế ố ụ ớ ừ ộ ả ử tăng/gi m 4.Toán t ộ ộ ử tăng m t (++) và gi m m t ( ) cung c p các ti n l Các toán t ừ ộ ế ố m t bi n s . Ví d v i khai báo thêm1 vào m t bi n s hay tr đi 1 t
ng ng cho vi c c ng int i = 5, k; ả ế ế ả Toán tử Tên K t qu k K t qu i Ví dụ
ề ố Tăng 1 (ti n t ) k = ++i 6 ++ 6
ậ ố Tăng 1 (h u t ) k = i++ 5 ++ 6
ả ề ố Gi m 1 (ti n t ) k = – i 4 4
ả ậ ố GI m 1 (h u t ) k = i 5 4
ế ả ế ả Toán tử Tên Ví dụ K t qu k K t qu i
++ ề ố Tăng 1 (ti n t ) k = ++i 6 6
ử ậ Các toán t lu n lý trong C
ứ ướ ể ẽ ấ ể ế ứ ệ T c là ta có: ượ ++i thì i đ ượ ư i++ thì i đ c tăng tr c đ a vào th c hi n bi u th c tr ứ ả ể ự ệ c sau đó s l y k t qu đ th c hi n bi u th c ớ ướ ự c sau đó m i tăng i lên 1
ể ư ể ộ ả ượ ư ữ ộ ứ ấ ỳ ạ ứ ượ ế ể ế ị c s d ng đ l u tr m t bi n. Toán h ng trái nên là m t giá tr trái và ữ c l u tr c tính và k t qu đ ử ở ạ kh i t o kh i t o đ ả ượ ể ị ỉ ị 5.Toán t ử ở ạ ượ ử ụ Toán t ộ ạ toán h ng ph i có th là m t bi u th c b t k . Bi u th c đ ở ị c ch đ nh b i giá tr trái. trong v trí đ
ươ ươ Toán tử Ví dụ T ng đ ớ ng v i
= x = 5 Gán 5 cho x
+= x += 5 x = x + 5
= x = 5 x = x – 5
*= x *= 5 x = x * 5
/= x /= 5 x = x / 5
%= x %= 5 x = x % 5
ử ở ạ Các toán t kh i t o trong C
ộ ể ở ạ ủ ứ ở ạ ộ ị ượ ư c l u trong toán ả ạ c s d ng nh là toán h ng ph i ể ượ ế ố c k t n i theo ị ủ ể ượ ử ụ ở ạ ng kh i t o nào có th đ ể ể ế ộ ở ạ ộ ấ ỳ ố ượ ứ
ở ạ ể ứ ụ ự ứ ng t cho các hình th c kh i t o khác.
Phép toán kh i t o chính nó là m t bi u th c mà giá tr c a nó là giá tr đ ư ạ h ng trái c a nó. Vì th m t phép toán kh i t o có th đ ủ c a m t phép toán kh i t o khác. B t k s l ụ cách này đ hình thành m t bi u th c. Víd : int m,n,p; m = n = p = 100; // nghĩa là: n = (m = (p= 100)); m = (n = p = 100) + 2; // nghĩa là: m = (n = (p= 100)) + 2; ươ ệ Vi c này có th ng d ng t Ví d :ụ m = 100; m += n = p = 10; // nghĩalà: m= m+ (n = p = 10);
ệ
đi u ki n ệ ử ề ủ ứ ầ ạ 6.Toán t Toán t ử ề đi u ki n yêu c u 3 toán h ng. Hình th c chung c a nó là:
ạ ạ 1 ạ toán h ng 1? toán h ng 2: toán h ng 3
ạ ượ ề ả ộ ệ c xem nh là m t đi u ki n. N u k t qu không ị ủ ế ả ế ượ ạ c l c l c l i, ầ c ạ c ượ ướ ượ ế ư ng và đ ng và giá tr c a nó là k t qu sau cùng. Ng ả ị ủ Toán h ng đ u tiên đ là 0 thì toán h ng 2 đ ạ toánh ng 3 đ ượ ướ ượ ượ ướ ượ c l ụ ế ng và giá tr c a nó là k t qu sau cùng. Ví d : c
ậ 1 2 int m = 1, n = 2; ị int min = (m < n? m :n); // min nh n giá tr 1
ằ ử ề ủ ệ ạ ỉ đi u ki n thì ch có m t ệ ứ ề ộ ộ ứ ụ c th c hi n. Đi u này là quan tr ng khi m t ho c c hai ch a hi u ng ph ứ ụ ớ ạ ọ ể ủ ổ ệ ị ủ ng c a chúng làm chuy n đ i giá tr c a bi n). Ví d , v i m = 1và n = 2 ự c l ứ Chú ý r ng trong các toán h ng th 2 và toán h ng th 3 c a toán t ặ ả ượ ạ toán h ng đ ế ệ ướ ượ (nghĩa là, vi c thì trong:
1 int min = (m < n ? m++ : n++);
ượ ướ ượ ư ở c tăng lên b i vì m++ đ c ở ng nh ng n không tăng vì n++ không đ ứ c l ệ c ề ể ộ ượ ng. B i vì chính phép toán đi u ki n cũng là m t bi u th c nên nó có th đ ề ệ ủ ứ ề ể
ạ c l ng nhau. ượ ướ m đ c ể ượ ử ụ ượ c s d ng l ể ệ ư ộ nh m t toán h ng c a phép toán đi u ki n khác, có nghĩa là các bi u th c đi u ki n có th ượ ồ đ Ví d :ụ
1 2 int m = 1, n = 2, p =3; int min = (m < n ? (m < p ? m: p) : (n < p ? n: p));
ộ ể ứ ử ụ ph y. Toán t ử ẩ ạ ả ử ng toán h ng trái sau đó là toán h ng ph i, và ạ ả ư ướ ượ c l ả ế
ạ ạ ụ ữ ể
ử ẩ
ph y
7.Toán t
ể ượ ế ố
ề
ứ
ể
c k t n i vào cùng m t bi u th c s d ng toán t
Nhi u bi u th c có th đ
ầ
ẩ
ạ
ầ
ạ
ph y yêu c u 2 toán h ng. Đ u tiên nó
ị ủ
ả ề
tr v giá tr c a toán h ng ph i nh là k t qu sau cùng.
ụ
Ví d : int m, t;
m = (t =2, t5 + 10)
Khi đó t =2 và m = 25+10 = 20.
ả
Ví d n a đ các b n ch y và xem kêt qu .
code by nguyenvanquan7826
#include
ế ả K t qu :
min = 5 c = 9 d = 11
l y kích th ướ c ử ữ ụ ể ụ ữ ệ ụ ể ướ ủ ấ ỳ ạ h u d ng, sizeof, đ tính toán kích th ể ấ ầ ộ ỉ ữ ả ề ể ữ ệ ể ự ứ ị ể c c a nh ng th c th đã ch đ nh theo byte. ộ ạ ụ ử ử ấ 8.Toán t ấ C cung c p toán t c c a b t k h ng m c d li u ạ hay ki u d li u nào. Nó yêu c u m t toán h ng duy nh t có th là tên ki u (ví d , int) hay ướ ủ ụ m t bi u th c (ví d , 100) và tr v kích th Ch y th ví d nhá.
code by nguyenvanquan7826
#include
ế ả K t qu :
char size = 1 byte short size = 2 byte int size = 4 byte long size = 4 byte float size = 4 byte double size = 8 byte 1.55 size = 8 byte “Hello” size = 6 byte
ủ
ộ ư ứ ự ộ ấ ứ đ ng trong m t bi u th c là r t quan tr ng và đ c xác
ử ở ứ ơ ẽ ơ ộ ư ử ơ ử 9.Đ u tiên c a các toán t ể ử ượ ướ ượ mà các toán t Th t c ử ậ ư ị đ nh theo các lu t u tiên. Các lu t này chia các toán t toán t c l ậ ộ ư m c cao h n s có đ u tiên cao h n các toán t ượ ọ ộ ố ứ ộ ư C ra thành m t s m c đ u tiên. Các ấ có đ u tiên th p h n.
ộ ư ả ử B ng đ u tiên các toán t
ẽ ấ
ậ ộ (cid:0) L p trình C: Bài 4 – C u trúc r nhánh N i dung ệ ố ệ (cid:0) ệ L nh và kh i l nh 1.L nh if và if else
o o
ệ a.L nh if ệ b.L nh if else (cid:0) ệ
o o
2.L nh switch và switch default a.L nh switchcase b.L nh switch … case…default
ệ
ố ệ ộ ứ ụ ề ể ể ấ Là m t tác v , bi u th c, hàm, c u trúc đi u khi n…
ệ ệ L nh và kh i l nh a.L nh:ệ VD: 1 x = x + 2;
2 printf("Day la mot lenh\n");
ệ ộ ượ ọ ở ặ ấ Là m t dãy các câu l nh đ c b c b i c p d u { },
ố ệ b.Kh i l nh: VD 1 { //dau khoi
a = 5; 2
b = 6; 3
4 printf("Tong %d + %d = %d", a, b, a+b);
5 } //cuoi khoi
ệ 1.L nh if và if else ệ a.L nh if
ư ồ L u đ if VD: 1 if (a>0) {
2 printf ("So %d la so duong !", a);
3 }
ệ b.L nh if else
ư ồ
L u đ ifelse if (a > 0){ 1
printf ("So %d la so duong !", a); 2
}else{ 3
printf ("So %d khong la so duong !", a); 4
} 5
ụ ấ
Ngoài ra chúng ta còn có c u trúc if lông nhau. Xét ví d sau: 1 if (a > 0) {
printf ("So %d la so duong !", a); 2
} else { 3
if (a == 0) { 4
printf ("So %d la so 0 !", a); 5
} else { 6
printf ("So %d la so am!", a); 7
} 8
} 9
ồ ớ ẽ ệ ư ạ ậ ệ ữ ế ợ ả ặ ầ Các l nh if…else l ng nhau thì else s luôn luôn k t h p v i if nào ch a có else g n ố ệ ữ ể
ệ
ư ấ ố ộ ơ ơ ớ ử ề ị ằ ẻ ả ủ ặ ạ ề ế ứ ể ả ể ử ụ ệ ộ ế ử ụ ậ ủ ả ộ ị ụ ể i thì còn tùy thu c vào gi i thu t c a bài toán.
ượ ạ c l ệ L u ý:ư ặ ấ nh t. Vì v y khi g p nh ng l nh if không có else, B n ph i đ t chúng trong nh ng kh i l nh ệ ị ể rõ ràng đ tránh b hi u sai câu l nh. 2.L nh switch và switch default ệ L nh switch cũng gi ng c u trúc if, nh ng nó m m d o h n và linh đ ng h n nhi u so v i s ụ d ng if. Tuy nhiên, nó cũng có m t h n ch là k t qu c a bi u th c ph i là giá tr h ng ư nguyên (có giá tr c th ). M t bài toán s d ng l nh switch thì cũng có th s d ng if, nh ng ng a.L nh switchcase
ư ồ
ố ừ ậ ọ ươ ứ 1>5 và in ra cách đ c t ng ng:
L u đ switchcase
VD: Nh p vào 1 s t
01 #include
02
03 int main(){
04 int a;
05 printf("Nhap a = ");
06 scanf("%d",&a);
07
08 switch(a){
09 case 1: printf("Mot"); break;
10 case 2: printf("Hai"); break;
11 case 3: printf("Ba"); break;
12 case 4: printf("Bon"); break;
13 case 5: printf("Nam"); break;
14 }
15
16 return 0;
17 }
ệ b.L nh switch … case…default
ư ồ
ọ ươ ứ ả ừ ế ậ ố ừ 1>5 và in ra cách đ c t ng ng, n u không ph i t ố 15 thì in ra s
L u đ switchcasedefault
VD: Nh p vào 1 s t
khác:
01 #include
02
int main(){ 03
int a; 04
05 printf("Nhap a = ");
06 scanf("%d",&a);
07
08 switch(a){
09 case 1: printf("Mot"); break;
10 case 2: printf("Hai"); break;
11 case 3: printf("Ba"); break;
12 case 4: printf("Bon"); break;
13 case 5: printf("Nam"); break;
14 default: printf("So khac"); break;
15 }
16
17 return 0;
18 }
ề ệ ệ ẽ ỏ ệ ế l nh này dùng đ thoát kh i vòng for, while, do… while, và switch. N u có ỏ ệ ề ệ ặ ủ ệ ộ ồ dùng đ b d vi c th c hi n m t vòng l p c a các l nh for, while, do
ư ế ể ệ ạ ỉ ị chuy n không đi u ki n t ự ặ ệ ớ ệ i l nh có nhãn ch đ nh. Nhãn có d ng nh tên bi n và ấ ấ
ở sau. ấ ặ
ậ ộ Ngoài ra còn có các l nh r nhánh không đi u ki n Break, continue, goto. ể –L nh break: ẽ nhi u chu trình l ng nhau thì s ra kh i chu trình trong cùng. ệ ể ỏ ở ệ L nh continue : ộ ớ ể while, và chuy n sang ngay m t vòng l p m i. ề L nh goto: thêm d u hai ch m ‘:’ L p trình C: Bài 5 – C u trúc vòng l p N i dung (cid:0) ệ ệ ề A.L nh r nhánh không đi u ki n
o o o
(cid:0) ặ
o o o o ệ
ệ ẽ ẽ ệ 1.L nh break: ệ 2.L nh goto ệ 3.L nh continue ệ B.Các l nh vòng l p ệ 1.L nh for ụ ề ệ Ví d v l nh for. ệ 2. L nh while ệ 3. L nh do while ề A.L nh r nhánh không đi u ki n
ị ỏ ặ ề ệ ệ ệ ệ ừ ể ệ ặ ử ụ ể ề ố ợ ườ ố ừ ườ ỏ ứ ệ ớ ệ ặ ướ ế ế ử ụ ệ ể ệ ả ỏ c chúng ta đã s d ng l nh break trong switch đ nh y b các câu l nh k ti p
ể ớ ứ ị i m t câu l nh nào đó đ ng sau nhãn đã ch đ nh. Nhãn là tên ể ạ ể ướ ệ ệ ả ớ ế ợ ộ ầ ứ ệ ỉ ớ ệ i. L nh goto k t h p v i l nh if cũng có th t o c l nh mà ta c n nh y t ặ
goto nhan;
ệ 1.L nh break: ặ ng l nh break dùng đ thoát kh i vòng l p không xác đ nh đi u ki n d ng ho c Thông th ỏ ỉ ị ạ ạ b n mu n d ng vòng l p theo đi u ki n do b n ch đ nh Vi c dùng l nh break đ thoát kh i ặ vòng l p th ng s d ng ph i h p v i l nh if. L nh break dùng trong for, while, do…while, ệ switch. L nh break thoát kh i vòng l p ch a nó. Trong bài tr i.ạ còn l ệ 2.L nh goto ệ L nh goto dùng đ chuy n t ợ ệ h p l nh đ ng tr ộ ra m t vòng l p. ệ Cú pháp l nh goto: Cú pháp nhãn: nhan : l nh;ệ code by nguyenvanquan7826
#include
02
int main(){ 03
int a, kt; 04
tieptuc : printf("Nhap a = "); 05
scanf("%d", &a); 06
07
switch(a) { 08
case 1: printf("Mot"); break; 09
case 2: printf("Hai"); break; 10
case 3: printf("Ba"); break; 11
case 4: printf("Bon"); break; 12
case 5: printf("Nam"); break; 13
14 default: printf("Khong phai so tu 1 den 5");
15 }
16
17 printf("\nBan muon tiep tuc? 1 de tiep tuc, 0 de dung: ");
scanf("%d", &kt); 18
19
if(kt) goto tieptuc; 20
21
return 0; 22
23 }
ệ ể ử ụ ạ ầ ả ằ ệ c phép nh y trong hàm đó và ượ ộ ố ư ượ ả ệ ả ừ c phép nh y t ngoài vào trong m t kh i nh ng đ c phép nh y sang hàm khác. ả ừ c dùng l nh goto nh y t
ệ ệ ủ ặ ứ ượ ề ể ầ ấ ộ ặ
ơ ượ ệ ẽ ể ừ ệ ẽ ị ỏ ấ đó th y rõ h n đ c vai trò c a các ề
ệ ặ
ệ
ệ ặ ạ ộ ố ầ ủ ự ặ ặ ỗ ộ ộ ị ị i m t s l n xác đ nh c a m t (ho c m t chu i) hành Tuy nhiên khi s d ng l nh goto b n c n chú ý các đi m sau: ỉ ượ ế ệ N u l nh goto và nhãn n m trong 1 hàm thì l nh goto ch đ không đ ượ Không đ ố trong kh i ra ngoài. ệ 3.L nh continue ể ề ề ượ Đ c dùng trong vòng l p for, while, do…while. Khi l nh continue thi hành quy n đi u khi n ặ ầ ẽ s trao qua cho bi u th c đi u ki n c a vòng l p g n nh t. Nghĩa là l n ng c lên đ u vòng ứ ấ ả ữ ặ t c nh ng l nh đi sau trong vòng l p ch a continue s b b qua không thi hành. l p, t ủ ặ ể ờ chúng ta s đi tìm hi u các l nh vòng l p đ t Bây gi ệ ẽ ệ l nh r nhánh không đi u ki n B.Các l nh vòng l p 1.L nh for Vòng l p xác đ nh th c hi n l p l đ ng.ộ
ứ
ị ế ề ở ạ ệ ệ ặ
ể ế ụ ề ề ị ế ể
ể ể ứ ệ ể ặ ị ị ị ủ ề ướ ứ ứ ự ể ng:
0). Tùy vào giá tr c a bi u th c 2 mà th c hi n theo 2 h ẽ
ỏ ẽ ự ế ặ ấ ở ố cu i ế ế ặ ệ i b ị ể ướ ứ ặ ư ồ L u đ vòng l p for ể Các bi u th c : ể ầ ứ Bi u th c 1: kh i t o giá tr ban đ u cho bi n đi u khi n. ể ể ệ ứ Bi u th c 2: là quan h logic th hi n đi u ki n ti p t c vòng l p. ổ ứ ể Bi u th c 3: phép gán dùng thay đ i giá tr bi n đi u khi n. ạ ộ Cách ho t đ ng: ướ ị ủ B c 1: Xác đ nh giá tr c a bi u th c 1 ướ ị ủ B c 2: Xác đ nh giá tr c a bi u th c 2 (ki m tra đi u ki n đúng hay sai t c 1 ho c ệ ứ ặ + N u sai (0) s thoát kh i vòng l p ố ệ ệ + N u đung (1) s th c hi n kh i l nh trong vòng for đ n khi g p d u } ẽ ướ ướ vòng for ho c l nh continue thì s t c 3. B c 3: Tính giá tr bi u th c 3, sau đó quay l ạ ướ i b c 2.
ự ệ ờ ộ ầ ỉ ượ cũng ch đ ọ ề ầ c tính toán m t l n khi g i th c hi n for. i nhi u l n. ể ự ằ ể ắ ứ ể ẩ ả ể ể ể ẩ ả ẫ ặ ứ Bi u th c 1 bao gi ứ Bi u th c 2, 3 và thân for có th th c hi n l p l ứ ấ Bi u th c 1, 2, 3 ph i phân cách b ng d u ch m ph y ( ; ), các bi u th c có th v ng ặ ả ể ố ỏ ượ ệ ặ ạ ấ ấ c xem là luôn luôn đúng. Mu n thoát kh i ộ ở ấ ứ ế ặ ớ ặ ể ỗ ủ ứ ể ộ ị ứ ể trái sang ph i. Tính đúng sai c a dãy bi u ệ t thành m t dãy bi u th c con phân cách nhau b i d u ả ượ ượ ứ ố ẩ ứ ể c xác đ nh t ị c xác đ nh b i bi u th c con cu i cùng. ể ứ ứ ề ấ ứ ố ệ ể ề ặ ộ ừ ở Trong thân for (kh i l nh) có th ch a m t ho c nhi u c u trúc đi u khi n khác, vòng
ặ ấ ặ ệ ặ ố ị
ể ể ể ệ ể ử ụ ể ử ụ ế ặ ỏ ấ ẽ ể ỏ ế Trong thân for có th dùng l nh goto đ thoát kh i vòng l p đ n v trí mong mu n. ể ở ề ộ Trong thân for có th s d ng return đ tr v m t hàm nào đó. ầ ệ Trong thân for có th s d ng l nh continue đ chuy n đ n đ u vòng l p (b qua các ệ ạ
L u ý:ư ấ ư m t 1,2 ho c c 3 nh ng v n ph i có d y ch m ph y này. ứ N u bi u th c 2 không có, vòng for đ ả vòng l p for ph i dùng m t trong l nh break, goto ho c return. ể ế ể V i m i bi u th c có th vi ph y. Khi đó các bi u th c con đ ể th c con trong bi u th c th 2 đ ặ l p khác. Khi g p l nh break, c u trúc l p sâu nh t s thoát ra. câu l nh còn l
i trong thân).
ệ ế i đây mình s th c hi n trên ki u m ng (s h c ư ể ớ ấ ẽ ọ ở ủ ứ ả i c u trúc l nh các bài sau) nên n u ệ for c a chúng ta ch không ể
ừ ế 1 đ n 10 ẽ ự ề ả ỉ ầ ớ ả i ki u m ng. ố for in các s nguyên t
ụ ề ệ Ví d v l nh for. ụ ướ Trong các ví d d ạ các b n ch a rõ v m ng thì ch c n quan tâm t ế ầ t quan tâm t c n thi ử ụ VD1: S d ng vòng code by nguyenvanquan7826
#include
02
03 int main(){
int i; 04
for (i = 1; i <= 10; i++) { 05
printf("%5d", i); 06
} 07
08
return 0; 09
} 10
ể ả ả ứ ủ ể ộ c m ng trong đó các bi u th c c a vòng for là m t ử ụ ứ ượ ở ấ ể ẩ
VD2: S d ng vòng for in đ đ o ng dãy bi u th c con phân cách nhau b i d u ph y. code by nguyenvanquan7826
#include
02
int main(){ 03
int i, j, n = 4, a[] = {1, 3, 7, 2}; // mang a gom 4 phan tu 04
05
/* Xuat mang ban dau*/ 06
07
printf("Mang ban dau: "); 08
for (i = 0; i < n; i++) { 09
printf("%5d",a[i]); 10
} 11
printf("\n"); 12
13
/* Dao nguoc mang*/ 14
15
16 for (i = 0, j = n 1; i <= j; i++, j) {
// doi cho 2 phan tu a[i] va a[j] 17
int temp = a[i]; 18
a[i] = a[j]; 19
a[j] = temp; 20
21 }
22
/* Xuat mang sau khi dao nguoc*/ 23
24
printf("Mang dao nguoc: "); 25
for (i = 0; i < n; i++) { 26
printf("%5d",a[i]); 27
28 }
printf("\n"); 29
30
return 0; 31
32 }
ử ụ ượ ử ụ ứ ể ắ ả ặ c m ng trong đó v ng m t bi u th c 2, ta s d ng ể ả ặ ỏ
VD3: S d ng vòng for in đ đ o ng ể ệ l nh break đ thoát kh i vòng l p code by nguyenvanquan7826
01 #include
02
03 int main(){
04 int i, j, n = 4, a[] = {1, 3, 7, 2}; // mang a gom 4 phan tu
05
06 /* Xuat mang ban dau*/
07
08 printf("Mang ban dau: ");
09 for (i = 0; i < n; i++) {
10 printf("%5d",a[i]);
11 }
12 printf("\n");
13
14 /* Dao nguoc mang*/
15
16 for (i = 0, j = n 1; ; i++, j) {
17 if (i >= j) break;
18 // doi cho 2 phan tu a[i] va a[j]
19 int temp = a[i];
20 a[i] = a[j];
21 a[j] = temp;
22 }
23
24 /* Xuat mang sau khi dao nguoc*/
25
26 printf("Mang dao nguoc: ");
27 for (i = 0; i < n; i++) {
28 printf("%5d",a[i]);
29 }
30 printf("\n");
31
32 return 0;
33 }
ọ ệ
VD4: Minh h a l nh continue trong vòng for. code by nguyenvanquan7826
#include
02
int main(){ 03
int i, n = 4, a[] = {1, 3, 7, 2}; // mang a gom 4 phan tu 04
05
printf("Cac so duong trong mang: "); 06
for (i = 0; i < n; i++) { 07
if (a[i] <= 0) continue; 08
printf("%5d",a[i]); 09
10 }
11
12 return 0;
13 }
ệ 2. L nh while
ư
ứ ể ệ ệ L u đô l nh while ơ ể ể Ta có th hi u đ n gi n: ả Trong khi bi u th c còn đúng thì làm l nh, khi sai thì thoát
ộ ặ ể ề ể ứ ứ ứ ể ẩ ủ ể ở ấ ề ế ị ể ở ứ ế Bi u th c: có th là m t bi u th c ho c nhi u bi u th c con. N u là nhi u bi u th c ể ứ ượ c quy t đ nh b i bi u ố ứ ố ệ ề ể ể ứ ệ ề ấ ế ể ể ử ụ ặ ể ầ ặ ỏ ộ Trong thân while (kh i l nh) có th ch a m t ho c nhi u c u trúc đi u khi n khác. Trong thân while có th s d ng l nh continue đ chuy n đ n đ u vòng l p (b qua các ệ ạ i trong thân). ứ ễ ể ặ ộ ằ ặ ệ ỏ ố ể con thì cách nhau b i d u ph y (,) và tính đúng sai c a bi u th c đ th c con cu i cùng. câu l nh còn l ế ạ N u bi u th c là m t h ng khác không thì nó luôn đúng và vòng l p di n ra vô h n. ư ớ ệ ể Mu n thoát kh i vòng l p while tùy ý có th dùng các l nh break, goto, return nh v i l nh for.
ậ ẩ
ậ VD: Nh p m t kh u: code by nguyenvanquan7826
#include
#define PASS "nguyenvanquan7826" // dat pass 02
03
int main(){ 04
char pass[100]; 05
06
/* Ham strcmp tra ve ket qua la 0 khi 2 chuoi bang nhau */ 07
08
09 while(strcmp(pass, PASS) != 0) {
10 printf("Nhap pass: ");
11 gets(pass);
12 }
13
14 printf("Mat khau dung roi!");
15
16 return 0;
17 }
ệ 3. L nh do while
ư ồ ệ
ệ ứ
ơ ậ ừ ự ặ ả Làm l nh trong khi bi u th c đúng, h sai thì thoát. ế ể ể ể ẽ ự ễ ệ ệ ấ ệ ệ ứ ệ ầ
ể ứ ừ ầ đ u.
L u đ l nh dowhile ể ể Ta có th hi u đ n gi n: ừ T đây ta có nh n xét: vòng l p while thì có th không th c hi n l nh nào n u ngay t ban ầ đ u bi u th c sai, còn l nh do while thì s th c hi n l nh ít nh t 1 l n dù bi u th c có sai ngay t VD: code by nguyenvanquan7826
1 #include
2
3 int main(){
4 do {
printf("khoi lenh duoc thuc hien\n"); 5
6 } while(5 > 8);
7
8 return 0;
9 }
ậ L p trình C: Bài 6 – Hàm
ộ N i dung (cid:0) ở ầ (cid:0) ề ắ ủ (cid:0) ộ ố ụ ọ ươ ứ ề 1. M đ u v hàm ạ ộ 2. Nguyên t c ho t đ ng c a hàm ậ 3. M t s ví d và nh n xét quan tr ng t ng ng v hàm ả ề ỗ ớ ầ
ế ị c khi đ nh nghĩa (vi t) hàm
ệ ẫ ướ ể ị ả ơ ị ừ ủ VD1: Hàm tính giai th a c a n hàm tr v giá tr . ố ổ VD2: Sai l m v i hàm đ i ch 2 s . VD3: Hàm hoán vị ọ VD4: Các hàm g i nhau. ướ VD5: Khai báo hàm tr VD6: Hàm đ quy VD7: Dùng d n h ng #define đ đ nh nghĩa hàm đ n gi n
ế ả ậ ươ ậ ng trình sau, quan sát k t qu và nh n xét. ươ
o o o o o o o ở ầ ề 1. M đ u v hàm ạ Hãy nh p và ch y 2 ch ng trình 1: Ch code by nguyenvanquan7826
#include
02
void loiKhuyen(){ 03
printf("Neu hoc nghiem tuc va cham chi thi ban se thay:\n"); 04
05 printf("Khong co viec gi kho\n");
06 printf("Chi so long khong ben\n");
07 printf("Dao nui va lap bien\n");
08 printf("Quyet chi at lam nen\n");
09 printf("\n");
} 10
11
12 int main(){
13 printf("Hoc bai nay kho qua!\n");
14 loiKhuyen();
15
16 printf("Hoc C kho qua!\n");
17 loiKhuyen();
18
19 return 0;
20 }
ế
ươ
ả K t qu : Hoc bai nay kho qua! Neu hoc nghiem tuc va cham chi thi ban se thay: Khong co viec gi kho Chi so long khong ben Dao nui va lap bien Quyet chi at lam nen Hoc C kho qua! Neu hoc nghiem tuc va cham chi thi ban se thay: Khong co viec gi kho Chi so long khong ben Dao nui va lap bien Quyet chi at lam nen ng trình 2: Ch code by nguyenvanquan7826
#include
02
void vechu(char chu, int soluong){ 03
int i; 04
for (i = 0; i < soluong; i++) { 05
printf("%c", chu); 06
07 }
08 printf("\n");
} 09
10
11 int main(){
12 vechu('h', 20);
13 vechu('a', 30);
14 vechu('h', 12);
15 vechu('a', 5);
16 vechu('p', 10);
17
18 return 0;
19 }
ế
ố ặ ặ ệ ng trình có m t s l nh, ho c công vi c nào đó có d ng gi ng ho c ạ ỏ ộ ố ệ i nhi u l n ự ặ ạ ệ ọ ệ ỉ ầ ờ ươ ch c và xây d ng nó thành m t ch ng trình ươ ng trình con ấ ộ ng trình c n th c hi n công vi c đó thì ch c n g i ch
ộ ệ ượ ặ ặ ạ ố ạ ự ặ ề ầ i nhi u l n ỡ ng trình đ
ươ ươ ng trình 1: main và 1 ch Có 2 ch ươ ng trình, 1 ch ố ng trình chính: ị ể ữ ệ ủ c ề ộ ố ự ấ ự ủ ệ ệ ả ộ ươ ng trình c a ta. Hàm loiKhuyen th c hi n m t s công vi c (xu t ra 5 dòng ỗ ọ
ươ ươ ng trình 1, nó g m 2 hàm, 1 hàm chính ng t ư ố ự ư ươ nh ch ụ vechu(char chu, int soluong); có 2 tham s hình th c ộ ầ ộ ọ ư ng trình trên.
ắ ầ ượ ự ứ ẽ ệ c th c hi n, t c s ượ ọ ở ấ ỳ ỗ b t k ch nào đó thì hàm b t đ u đ c g i. ố ự ẽ ự ề ố ỗ ế ứ ươ ứ ự ệ ệ ế t các câu l nh trong thân hàm đ n khi nào l nh reuturn ở ề ươ ự ỏ ọ ng trình đã g i nó và th c ặ ấ ế ệ ủ ệ ả K t qu : hhhhhhhhhhhhhhhhhhhh aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa hhhhhhhhhhhh aaaaa pppppppppp ư ế ươ N u nh trong ch ể ị ầ ặ ề ầ ở ự ươ các v trí khác nhau, đ kh i m t th i gian và ng t t nhau c n l p đi l p l ổ ứ ữ ứ công s c sao chép nh ng dãy l nh đó ta nên t ự ươ ệ ầ ỗ con, ch nào trong ch ọ ươ ng trình con đó g i là hàm. đó mà thôi. Các ch ố ệ ươ ộ ng trình con th c hi n m t kh i công vi c đ Hàm là m t ch c l p đi l p l ệ ụ ể ể ươ ộ ươ trong khi ch y ch ng trình ho c dùng tách m t kh i công vi c c th đ ch ứ ạ ph c t p. ươ Trong ch ng trình ượ ph :ụ loiKhuyen không có tham s và không tr v giá tr nào nên ki u d li u c a hàm đ ả ề ọ khai báo là void. C main và loiKhuyen đ u g i là hàm. Hàm main là hàm chính th c thi và ạ ch y toàn b ch ữ ư ch nh trên). Trong hàm main ta có 2 ch g i hàm loiKhuyen(); ồ ng trình 2: cũng t Trong ch ứ ụ là main và 1 hàm ph , nh ng hàm ph là ể ể là chu thu c ki u char và soluong thu c ki u int. Trong hàm main ta có 3 l n g i hàm vechu ươ ố ự ầ ượ ớ t nh trong ch v i các tham s th c l n l ạ ộ ủ ắ 2. Nguyên t c ho t đ ng c a hàm ặ ờ ọ Khi máy g p l i g i hàm ế ể ờ r i ch đó đ đi đ n hàm đ ệ ố N u là hàm có tham s thì máy s th c hi n truy n tham s th c cho các tham s hình th c t ng ng trong hàm. ắ ầ ệ ầ ượ Máy b t đ u th c hi n l n l ạ ừ ủ ho c d u } c a hàm thì d ng l ươ hi n ti p các câu l nh c a ch i thoát kh i hàm tr v ch ng trình này.
ị ị ủ ẽ
ế ộ ố ụ ề ứ ể N u hàm tr v giá tr thì giá tr c a bi u th c return trong hàm s là giá tr c a hàm. ươ ứ ng ng v hàm
ả ề
ị ủ ả ề ậ ọ 3. M t s ví d và nh n xét quan tr ng t ị ừ ủ VD1: Hàm tính giai th a c a n hàm tr v giá tr . code by nguyenvanquan7826
#include
02
long giaiThua(int n) { 03
long gt = 1; 04
int i; 05
for (i = 2; i <= n; i++){ 06
07 gt *= i;
08 }
09 return gt;
10 }
11
12 int main(){
13 printf("5! = %ld \n", giaiThua(5));
14 printf("6! + 1 = %ld \n", giaiThua(6) + 1);
15 return 0;
16 }
ế
ị ậ ế ượ ử ụ ề ể ế c coi nh 1 bi n và đ ừ ủ ố ứ ể ố ươ ứ ả ề ề ị c truy n vào vì v y nó có ả c s d ng trong các bi u th c, s d ng đ in ra luôn k t qu . ng ng cho hàm và tr v giá tr qua
ớ ỗ
ả K t qu : 5! = 120 6! + 1 = 721 ả ề Trong VD này hàm giaiThua tr v giá tr là giai th a c a s n đ ượ ử ụ ể ượ ư th đ ẽ ở ấ ặ b t ký đâu thì nó s truy n 1 tham s t Khi g p hàm ệ l nh return. ố ổ ầ VD2: Sai l m v i hàm đ i ch 2 s . code by nguyenvanquan7826
01 #include
02
void hoanvi(int a, int b) { 03
int temp = a; 04
a = b; 05
b = temp; 06
07 }
08
int main(){ 09
int a, b; 10
printf("Nhap 2 so a, b:\n"); 11
scanf("%d%d", &a, &b); 12
13
14 printf("Ban da nhap:\n a = %d \n b = %d\n", a, b);
15
16 hoanvi(a, b);
17
18 printf("Sau khi goi ham hoanvi:\n a = %d\n b = %d", a, b);
19 return 0;
20 }
ế
ậ ả K t qu khi nh p a = 3, b = 8. Nhap 2 so a, b: 3 8 Ban da nhap: a = 3 b = 8 Sau khi goi ham hoanvi: a = 3 b = 8
ươ ổ ị ị ể ữ ể ế ng trình này chúng ta xây d ng 1 hàm hoán v đ chuy n đ i v trí gi a 2 b n a và b, ị ủ ự ị ổ ử ụ ượ ẽ ị
ớ V i ch tuy nhiên chúng ta đã s d ng tham tr nên các giá tr c a a và b không thay đ i hay nói cách khác là chúng không đ c hoán v cho nhau. Sau đây ta s xem VD3. VD3: Hàm hoán vị code by nguyenvanquan7826
#include
02
void hoanvi(int *a, int *b) { 03
int temp = *a; 04
*a = *b; 05
*b = temp; 06
07 }
08
int main(){ 09
int a, b; 10
printf("Nhap 2 so a, b:\n"); 11
scanf("%d%d", &a, &b); 12
13
14 printf("Ban da nhap:\n a = %d \n b = %d\n", a, b);
15
16 hoanvi(&a, &b);
17
18 printf("Sau khi goi ham hoanvi:\n a = %d\n b = %d", a, b);
19 return 0;
20 }
ế
ả K t qu : Nhap 2 so a, b: 3 8
ỉ ủ ề ế ể ề &a, &b, v đi u này ta s tìm hi u xâu h n ọ ỏ Ở đây ệ ể ắ ạ ỏ ể ư ị ẽ ụ ượ i thi u thêm đ chúng ta có th kh c ph c đ ơ ở bài con tr . ầ c tình tr ng sai l m bên trên. ể ử ụ ượ ư ể c ki u ư ề ấ
Ban da nhap: a = 3 b = 8 Sau khi goi ham hoanvi: a = 8 b = 3 ể Trong VD3 này ta đã truy n vào 2 bi n ki u con tr đ l u đ a ch c a a và b và khi g i hàm ề ề ứ hoanvi ch ng ta truy n vào là ể ỉ ớ mình ch gi ứ ế Chú ý: N u chúng ta l u file là .cpp (t c là dùng C++) thì chúng ta có th s d ng đ ằ ế truy n tham bi n b ng d u & nh sau: code by nguyenvanquan7826
#include
02
void hoanvi(int &a, int &b) { 03
int temp = a; 04
a = b; 05
b = temp; 06
07 }
08
int main(){ 09
int a, b; 10
printf("Nhap 2 so a, b:\n"); 11
scanf("%d%d", &a, &b); 12
13
14 printf("Ban da nhap:\n a = %d \n b = %d\n", a, b);
15
16 hoanvi(a, b);
17
18 printf("Sau khi goi ham hoanvi:\n a = %d\n b = %d", a, b);
return 0; 19
20 }
ư ậ ề ả ề ị ượ c ụ ẽ ị ng t ề ề ừ ạ ứ ế ỉ
ọ
ạ ư ỗ ế i vì trong C không có cách truy n nh v y. Tuy nhiên n u b n l u file là .c thì máy s báo l ả ề ể ể ấ ượ ỉ ế c tr v , đ có th l y đ t thì các hàm tr v giá tr thì ch có 1 giá tr đ Chúng ta đã bi ế ươ ị ừ ả ấ ặ ự ư ả ử ụ hàm ta ph i s d ng t nhi u giá tr t nh ví d hoanvi này. N u g p TH ph i l y ờ ử ụ ạ ị ừ hàm thì các b n hãy s d ng 1 trong 2 cách mà t m th i chúng ta v a minh nhi u giá tr t ọ h a, (chú ý là dùng tham bi n ch trong C++, t c là file .cpp). VD4: Các hàm g i nhau. code by nguyenvanquan7826
#include
02
int max_2(int a, int b) { 03
return a > b ? a : b; 04
05 }
06
int max_3(int a, int b, int c) { 07
return max_2(max_2(a, b), c); 08
09 }
10
11 int main(){
12 int a = 7, b = 13, c = 4;
13 printf("So lon nhat la %d", max_3(a, b, c));
14 return 0;
15 }
ố ể ủ ố ví d này chúng ta xây d ng 2 hàm đ tìm max c a 2 s và 3 s . Trong hàm max_2 chúng ta ọ ấ ệ đ tìm s l n nh t trong 2 só. Trong hàm max_3 ta đã g i hàm di u ki n ế ử ề ể ầ ự ể ố ớ ố ớ ấ ồ ấ ố ượ ố ớ ớ c só sánh v i c tìm ra s l n
ượ ọ ướ ư c nó nh ng các hàm khai báo c g i các hàm đã khai báo tr ứ ượ ọ ướ ế ọ Ở ụ ử ụ toán t s d ng max_2 đ n 2 l n đ tìm s l n nh t trong a, b r i l y s tìm đ nh t.ấ Chú ý: Hàm khai báo sau đ tr c không đ c g i hàm khai báo sau. T c là trong VD trên n u ta g i hàm max_3 trong
ụ ể ẽ ắ ỗ ề i. Đ kh c ph c đi u này chúng ta th ướ ặ ị ng trình sau đó chúng ta đ nh nghĩa các hàm ngay bên d ở ườ ng khai báo các hàm i ho c sau hàm main() ta ươ ụ ế
ị ế ướ c khi đ nh nghĩa (vi t) hàm hàm max_2 thì máy s báo l ầ đ u ch xét ví d ti p: VD5: Khai báo hàm tr code by nguyenvanquan7826
#include
02
int max_2(int a, int b); 03
int max_3(int a, int b, int c); 04
int max_4(int a, int b, int c, int d); 05
06
int max_3(int a, int b, int c) { 07
return max_2(max_2(a, b), c); 08
} 09
10
int max_2(int a, int b) { 11
return a > b ? a : b; 12
} 13
14
15 int main(){
16 int a = 7, b = 13, c = 4, d = 16;
17 printf("So lon nhat trong a, b, c la %d\n", max_3(a, b, c));
18 printf("So lon nhat trong a, b, c, d la %d\n", max_4(a, b, c, d));
19 return 0;
} 20
21
22 int max_4(int a, int b, int c, int d) {
23 return max_2(max_2(a, b), max_2(c, d));
24 }
ư ậ ướ ị c nh th này và đ nh nghĩa sau. Nh v y ư ế ố ượ i khi mà chúng ta mu n dùng các hàm trong nhau. ộ ố ỗ c m t s l ể ọ ẫ ử ụ ể ọ ộ ệ ẽ t các hàm có th g i l n nhau và m t hàm cũng có th g i chính nó, đó là ta s d ng
Khi làm vi c chúng ta nên khai báo các hàm tr chúng ta s tránh đ ế Ta đã bi ệ hàm đ quy. ệ VD6: Hàm đ quy code by nguyenvanquan7826
01 #include
02
03 int giaiThua(int n) {
04 if(n == 0) return 1; // dieu kien dung
05 return giaiThua(n1) * n; // loi goi chinh no
} 06
07
08 int main() {
09 int n = 5;
10 printf("%d! = %d",n, giaiThua(n));
11 return 0;
} 12
ệ ư ề ờ ọ là đi u ki n d ng và l i g i chính nó.
ệ ừ ả ơ ẫ ướ ể ị ế ố ng #define đ đ nh nghĩa hàm đ n gi n L u ý trong hàm đ quy luôn luôn có 2 y u t VD7: Dùng d n h code by nguyenvanquan7826
1 #include
2
3 #define tong(x, y) x + y
4
5 int main() {
6 int a = 5, b = 8;
printf("%d + %d = %d",a, b, tong(a, b)); 7
8 return 0;
9 }
ắ ơ ả ề ầ ề ấ ặ ệ ề ẽ ế ụ ế ề ư ỏ t là hàm liên quan đ n m ng và con tr . Chúng ta s ti p t c tìm hi u chúng
ả ệ ẫ ậ ơ ả ướ ự ạ ng d n l p trình c c b n c th c hi n tron lo t bài h ế ượ t đ
ả
ượ ề ế c v hàm, nh ng còn r t nhi u đi u c n nói v hàm Đ n đây chúng ta đã c b n n m đ ở ả ữ n a, đ c bi ỏ ớ các bài sau cùng v i m ng và con tr . Bài vi ậ L p trình C: Bài 7 – M ng trong C ộ N i dung (cid:0) (cid:0) ụ ở ầ Ví d m đ u ề ả 1. M ng 1 chi u
ả ấ ế ấ ề ầ ử ầ ử ủ ả trong m ng. ả c a m ng ử ụ ậ ấ ư ậ ộ
o o o o o
a. Cách khai báo m ng 1 chi u b. Cách truy xu t đ n các ph n t c. Cách nh p và xu t các ph n t ả d. Nh p xu t m ng s d ng hàm e. M t vài l u ý khác (cid:0) ề 2. M ng 2 chi u
ả ụ ở ầ ụ ậ ấ ố ố ổ ố
Ví d m đ u Xét ví d nh p 5 s nguyên, xu t ra màn hình 5 s và tính t ng 5 s đó. code by nguyenvanquan7826
01 #include
02
03 int main() {
04 int a, b, c, d, e; // 5 bien
05
06 printf("Nhap a = ");
07 scanf("%d", &a);
08
09 printf("Nhap b = ");
10 scanf("%d", &b);
11
12 printf("Nhap c = ");
scanf("%d", &c); 13
14
printf("Nhap d = "); 15
scanf("%d", &d); 16
17
printf("Nhap e = "); 18
scanf("%d", &e); 19
20
21 int tong = a + b + c + d + e;
22 printf("Tong cua %d + %d + %d + %d + %d = %d", a, b, c, d, e, tong);
23
return 0; 24
} 25
ố ậ ấ ấ ế ụ ư ẻ ấ ấ ả ả ề ế ệ ấ ụ ế ố ế ủ ể ể
ề ả ử ụ có cùng ki u d li u. M ng có m ng 1 chi u, 2 chi u,… và ậ ợ ể ữ ệ ả ề ự ự ả ả ả ể ữ ệ ả ươ ứ ng ng (m ng nguyên, m ng th c, m ng ký t ề ả ụ ề ả ằ ờ i ví d trên b ng cách s d ng m ng 1 chi u. i quy t l
ươ ạ ng trình này, sau đó hãy xem chi ti ế ở ướ d t i.
ả ử Nh ví d ta th y nh p h t 5 s và xu t chúng ta màn hình có v r t v t v và ta đã ph i s ụ d ng quá nhi u bi n, n u s bi n c a chúng ta không ph i là 5 mà là 50, 500,… thì vi c này ả ề ắ qu là r t khó khăn. Đ kh c ph c đi u này chúng ta hãy s d ng ki u m ng. ả ầ ử M ng Là t p h p các ph n t ả ể ỗ m i ki u d li u thì có 1 ki u m ng t ề ề ả ủ ế ỗ (chu i)),… Ta ch y u xét v m ng 1 chi u và m ng 2 chi u. ử ụ ế ạ ẽ ả chúng ta s gi Bây gi ề ả 1. M ng 1 chi u ử ọ ạ Các b n th đ c và ch y ch code by nguyenvanquan7826
01 #include
02
03 int main() {
04 // khai bao mang a co n phan tu
05 int n = 5;
06 int a[n], i, s = 0;
07
// thuc hien nhap tung phan tu mang 08
for (i = 0; i < n; i++) { 09
printf("Nhap a[%d] = ", i); 10
scanf("%d", &a[i]); 11
12 }
13
// thuc hien in cac phan tu cua mang ra man hinh 14
printf("\nMang da nhap \n"); 15
for (i = 0; i < n; i++) { 16
printf ("%d \t", a[i]); 17
18 }
19
// tinh tong cac so trong mang 20
21
for (i = 0; i < n; i++) { 22
s += a[i]; // s = s + a[i] 23
24 }
printf("\nTong cac so trong mang: %d\n", s); 25
26
27 return 0;
28 }
ế
ả K t qu : Nhap a[0] = 3 Nhap a[1] = 4 Nhap a[2] = 6 Nhap a[3] = 2 Nhap a[4] = 7
ề
ể ữ ệ i đa trong m ng]>; ề ả t
ầ ử ả
ể ộ thu c ki u nguyên. Sau khi khai báo ta có 1 ư ả Mang da nhap
3 4 6 2 7
Tong cac so trong mang: 22
ả
a. Cách khai báo m ng 1 chi u
ố
ầ ử ố
ả
ả ầ ử
ả
ầ ử ỗ ề ả trong m ng. ầ ử c khai báo, m i ph n t ướ ế ả ụ ả ỉ ố ỉ ố ể trong m ng đ u có ch s đ tham chi u. Ch s ầ c m ng). Trong ví d trên, ta khai báo m ng 10 ph n
ỉ ố ả Khai báo m ng a có 10 ph n t
ấ ế
b. Cách truy xu t đ n các ph n t
ả
ượ
Sau khi m ng đ
ế
ớ
ắ ầ ừ
b t đ u t
0 đ n n1 (v i n là kích th
ế
ỉ ố ắ ầ ừ
ử
0 đ n 9.
thì ch s b t đ u t
t
ấ
ấ
ấ ầ ử ủ ả
ệ ớ ừ ầ ử ầ c a m ng ả trong m ng ta c n duy t t i t ng ph n t ả trong m ng và ể ế ậ ộ
ả Truy xu t m ng trong C ậ c. Cách nh p và xu t các ph n t ầ ử ậ ữ ệ Đ nh p d li u cho các ph n t ằ ti n hành nh p b ng m t vòng for 1 for (i = 0; i < n; i++) {
printf("Nhap a[%d] = ", i); 2
scanf("%d", &a[i]); 3
4 }
ầ ử ệ ấ ượ ế ươ ự Vi c xu t các ph n t ả trong m ng cũng đ c ti n hành t ng t :
for (i = 0; i < n; i++) { 1
printf ("%d \t", a[i]); 2
3 }
ứ ặ
ấ ậ ử ụ
ề ầ ư ề ả ấ ậ ễ ậ ấ
ể ử ụ Ngoài ra chúng ta cũng có th s d ng các vòng l p khác nh while, do while,… ả d. Nh p xu t m ng s d ng hàm ề ả Trong nhi u bài toán, chúng ta ph i nh p nhi u m ng, và xu t nhi u l n, khi đó hãy đ a nh p xu t vào hàm cho d dùng. code by nguyenvanquan7826
01 #include
02
03 void nhapMang(int a[], int n) {
04 int i;
05 // thuc hien nhap tung phan tu mang
06 for (i = 0; i < n; i++) {
07 printf("Nhap a[%d] = ", i);
08 scanf("%d", &a[i]);
09 }
10 }
11
12 void xuatMang(int a[], int n) {
13 int i;
14 for (i = 0; i < n; i++) {
15 printf ("%d \t", a[i]);
16 }
17 }
18
19 int main() {
// khai bao mang a co n phan tu 20
21 int n = 5;
22 int a[n];
23 nhapMang(a, n);
24 xuatMang(a, n);
25
26 return 0;
27 }
ố ộ ỏ ả ưở ế ế ư ả ư ự ầ ử ủ ệ ớ ả ả c a m ng s b nh h
ả ể ở ạ ộ ở ạ
ớ ở ạ ầ ử ở ạ ượ ầ ử ế ỗ t quá 5 ph n t ế i, n u thi u ph n t ẽ máy s báo l ị ầ ử ế đó nh n giá tr là 0.
ế ướ ố ượ ư c s l ng.
t tr ị ươ ứ ng ng. ố ả ử ụ ứ ặ nh n giá tr t ả ng s d ng khi dùng m ng làm tham s hình th c trong hàm.
ả
ề
ể ấ ậ ấ ậ ư ộ
ề ự ư ả ng t nh m ng 1 chi u.
ể ữ ệ ả ố ộ
ộ ầ ử ồ ỗ ề
ỏ
ả
L u ý: M t m ng có m i quan h v i 1 con tr , m ng có th coi nh 1 con tr nên khi truy n
ổ
ẽ ị ả
m ng vào hàm thì các ph n t
ng n u có s thay đ i nào trong m ng.
ư
e. M t vài l u ý khác
ả
Kh i t o m ng: Chúng ta có th kh i t o m ng trong quá trình khai báo ngay. VD: float a [5]
= {3.4, 5, 6, 7, 4,2}
V i cách kh i t o này n u ta kh i t o v
ậ
nào thì ph n t
VD: float a [5] = {3.4, 5, 7} => a[4] = a[5] = 0.
i.ỗ
VD: float a [5] = {3.4, 5, 7, 1, 2, 3} => máy báo l
ở ạ
ả
Ngoài ra chúng ta có cách khai báo và kh i t o m ng ch a bi
ầ ử ậ
VD: int a[] = {3,6,2,5} => M ng có 4 ph n t
ườ
Ho c: int a[]; => Th
2. M ng 2 chi u
Chúng ta có th coi nó nh m t ma tr n. Các tính ch t, cách khai báo, nh p xu t,… cũng
ươ
t
ố
Khai báo:
ả
ề M ng 2 chi u trong C code by nguyenvanquan7826
#include
#define MAX 10 02
03
// nhap mang n hang, m cot 04
void nhapMang(int a[MAX][MAX], int n, int m) { 05
int i, j; 06
for (i = 0; i < n; i++) { 07
for (j = 0; j < m; j++) { 08
printf("Nhap a[%d][%d] = ", i, j); 09
scanf("%d", &a[i][j]); 10
11 }
12 }
13 }
14
// xuat mang n hang, m cot 15
void xuatMang(int a[MAX][MAX], int n, int m) { 16
int i, j; 17
for (i = 0; i < n; i++) { 18
for (j = 0; j < m; j++) { 19
printf ("%3d", a[i][j]); 20
21 }
printf("\n"); // xuong dong khi het 1 dong 22
23 }
24 }
25
26 int main() {
// khai bao mang a co n phan tu 27
28 int n = 2, m = 3;
29 int a[MAX][MAX];
30 nhapMang(a, n, m);
31 xuatMang(a, n, m);
32
33 return 0;
34 }
ấ ề ề ả ả ớ ộ c a m ng 2 chi u (và m ng nhi u chi u) đ ể ề ề ề ề ậ ả ả ự ư ề ầ ử ủ ượ Chú ý: Th c ch t trong b nh , các ph n t c ế ổ ứ ch c nh là nhi u m ng 1 chi u liên ti p nhau, vì v y ta có th quy m ng 2 chi u thành t ả m ng 1 chi u.
ữ ả ổ ứ ư
ề ự ỗ ch c, l u tr m ng 2 chi u trong C trong c
Cách t ậ L p trình C: Bài 8 – Chu i ký t ộ N i dung (cid:0) (cid:0) ấ (cid:0) ậ ộ ố ỗ 1. Khai báo chu iỗ ỗ 2. Nh p xu t chu i ề 3. M t s hàm v chu i và ký t ự .
ầ ử ồ ộ ư ể ự có ki u char nh ký t ố , con s và c xem nh là m t m ng 1 chi u g m các ph n t ự ặ ư ỗ ượ Chu i đ ấ ứ b t c ký t ề ả ư ệ t nh +, , *, /, $, #… đ c bi
ộ ở ự ự ỗ c, m t chu i s đ c k t thúc b i ký t null (‘\0’ : kí t r ng). ỗ ẽ ượ ế ượ ư ướ ỗ ữ ư Theo quy ụ Ví d : chu i “Infoworld” đ c l u tr nh sau:
ư ỗ ự ữ Cách l u tr chu i ký t
1. Khai báo chu iỗ VD:
code by nguyenvanquan7826
#include
ế ả K t qu :
Xin chao, ten ban la gi? Minh la: hapham Chao mung ban hapham den voi TUT lap trinh C cua nguyenvanquan7826
ế . Ngoài ra nó còn cho chúng ta bi ử ậ ễ ế ấ ạ ớ ị ậ ự VD trên đã cho chúng ta cách khai báo xâu ký t t cách nh p ả xu t luôn, tuy nhiên các b n th nh p v i tên: Nguy n Văn A, Hoàng Th B và xem k t qu
ề ạ ỗ ằ ự null, nên khi b n khai báo chu i có chi u dài 50 kí t ự ỉ ch
ị ủ ừ khi khai báo: nhá. ỗ ế Chú ý: Do chu i k t thúc b ng kí t ự ể ứ . có th ch a 49 kí t ỗ ở ạ Kh i t o chu i: ở ạ ể Ta có th kh i t o giá tr c a xâu ngay t 1 char hoten[50] = "ha pham"; // ok
ượ ị Tuy nhiên chúng ta không đ c gán giá tr khi đã khai báo.
1 2 char hoten[50]; hoten = "ha pham"; // sai
ấ ậ
ậ ấ ạ ậ ệ ề ệ ượ i bài ấ Nh p xu t trong c ặ , đ c bi t là v hi n t ng trôi
ề ỗ ộ ố ỗ 2. Nh p xu t chu i ỗ ệ Vi c nh p xu t chu i mình đã nói t l nh.ệ 3. M t s hàm v chu i và ký t ộ bàn phím và đ i n enter ợ ấ ộ ệ ể ộ ị ự lên màn ả ấ ự ể ộ ị ậ getche() : nh p vào m t ký t bàn phím và hi n th ký t ự ừ t ợ ấ lên màn hình (không đ i n
ự . ự ừ ậ t getchar() : nh p vào m t ký t ự ừ ậ t bàn phím hay b đ m. Và không hi n th ký t getch() : nh p vào m t ký t ầ hình. Không c n ph i n enter. enter). Putchar(ch); in ký tự ch lên màn hình ế ự. (các hàm này trong th vi n ị ư ệ ctype.h) N u đúng thì hàm cho giá tr ế ể Các hàm ki m tra ký t khác 0. N u sai thì hàm cho giá tr b ng 0. ự ữ có là ch cái không. ự ữ ố có là ch s không. ng không.
ể ể ể ể ể ố ị ằ Int isalpha(int c) : ki m tra ký t Int isdigit(int c) : ki m tra xem ký t ự ữ ườ có là ch th Int islower(int c): ki m tra ký t ữ ự Int isupper(int c): ki m tra ký t có là ch hoa không. ự có là tr ng không (\n, d u cách, \t). Int ispace(int c): ki m tra ký t
ấ ư ệ string.h) ử Các hàm s lý xâu ký t
ữ ằ ự. (các hàm này n m trong th vi n ủ ữ ườ ữ ữ ườ ng trong xâu s sang ch hoa. ng. ố ở ơ ế ị ằ ả ề ế ơ ớ ế ươ ữ ườ ư ả ề ộ Int strlen(char *s) tr v đ dài c a xâu s; ổ Char *strupr(char *s) đ i ch th ổ Char *strlwr(char *s) đ i ch hoa sang ch th Char *strcat(char *s1, char *s2) n i xâu s2 vào xâu s1; ị ị Int strcmp(char *s1, char *s2) cho giá tr âm n u xâu s1 nh h n xâu s2. Và cho giá t ằ ng n u xâu s1 l n h n xâu s2. Tr v giá tr b ng 0 n u xâu s1 b ng xâu s2. ệ Int strcmpi (char *s1, char *s2) so sánh 2 xâu nh ng không phân bi t ch th ng và ch ữ
ự ầ ủ ự ầ đ u c a xâu s2 sang xâu s1 c vào xâu s. ế ấ Char *strcpy(char *s1, char *s2) copy xâu s2 vào xâu s1. Char *strncpy(char *s1, char *s2, int n) sao chép n ký t Char *strnset(char *s ,int c, int n) dùng đ sao chép n l n ký t Char *strstr(char *s1, char *s2) tìm s xu t hi n c a xâu s2 trong xâu s1. N u tìm th y ạ ỉ ủ ị ệ ủ i cho NULL. ế ị ỉ ượ ả c xâu s.N u thành công hàm cho đ a ch xâu đã Char *strrev(char *s) dùng đ o ng
ư ể ằ . Trong C không có hàm xóa nh ng ta có th xóa b ng cách ỉ ủ ỉ ủ c. VD ta có xâu ht = “Nguyen Van ị sau đè lên đ a ch c a ký t ư ị ố
d hoa. ể ự ấ hàm cho đ a ch c a xâu con trong xâu s1. Trái l đ o.ả ự Cách xóa ký t copy đ a ch c a ký t ự A”, mu n xóa ký t
trong xâu ự “uy” ta làm nh sau: ự ướ tr strcpy(&ht[2],&ht[4]);
ỏ
ậ ộ L p trình C: Bài 9 – Con tr trong c N i dung (cid:0) ế
ế
o o
ỏ 1. Bi n con tr ở ầ VD m đ u a. Khai báo bi n con tr ỏ
ỏ ớ ủ i c a con tr ỏ
ế
o o o
ị b. Quy đ nh vùng tr t c. Cách truy xu tấ d. M t s phép toán trên bi n con tr ỏ (cid:0) ấ ồ ộ ố 2. C p phát và thu h i vùng nh ớ ấ ồ ớ ạ
o o
a. C p phát: b. Thu h i và ki m tra vùng nh còn l i (cid:0) ố ế ướ ướ ề ế ể ỏ ử ụ t và s d ng tr ể ế ườ ế ớ c đây đ u là bi n có kích th ế ầ ự ế ế t trong quá trình th c thi ch ạ ộ ượ i ta g i các bi n ki u này là bi n tĩnh. Khi khai báo bi n tĩnh, m t l ươ ẽ ượ ấ ẽ ồ ạ ng ô nh này hay không. M t khác, các bi n tĩnh d ng này s t n t ế c c p phát mà không c n bi ớ ươ ỉ ử ụ ặ ữ 3. Hàm có đ i là con tr ế Các bi n chúng ta đã bi ọ ị đ nh. Ng các bi n này s đ ế ượ ụ d ng h t l ự ờ th i gian th c thi ch ế ươ ng trình dù có nh ng bi n mà ch ể ữ ệ c và ki u d li u xác ng ô nh cho ử ng trình có s ố i trong su t ầ ồ ỏ ng trình ch s d ng 1 l n r i b .
ộ ố ạ ử ụ ể ặ ế ế ả M t s h n ch có th g p ph i khi s d ng các bi n tĩnh:
ế ươ ấ ấ ị ỗ ớ ư ớ i. ớ C p phát ô nh d , gây ra lãng phí ô nh . C p phát ô nh thi u, ch ự ng trình th c thi b l
ộ ặ ạ ạ ấ ế ế ế ữ ệ ọ t g i là bi n ặ ể
ữ ể Đ tránh nh ng h n ch trên, ngôn ng C cung c p cho ta m t lo i bi n đ c bi ộ đ ng v i các đ c đi m sau:
ỉ ệ ứ ự ươ ắ ầ ng trình ch không phát sinh lúc b t đ u ươ ớ Ch phát sinh trong quá trình th c hi n ch ng trình. ỉ ị ế ướ ủ ớ ượ ấ ớ c c a bi n, vùng nh và đ a ch vùng nh đ c c p ạ ế ể ả ể ế ệ ộ t ki m ch trong b nh . Tuy nhiên các i phóng đ ti ế ượ ế ỉ ỗ ể ậ ệ ữ ể ế ắ ặ ạ ươ ng trình, kích th ổ ể Sau khi s d ng xong có th gi ấ ị ộ i cung c p cho ta m t lo i bi n đ c bi c. Vì th , ạ ụ t n a đ kh c ph c tình tr ng này, ể ặ ớ ỉ ủ ữ ệ ữ ế ế ứ ữ ệ ứ ị ỉ ủ
ể ữ ệ ụ ế ỏ ộ c c a bi n con tr không ph thu c vào ki u d li u, luôn có kích th ướ ố c c
ề ượ ấ ở ữ ấ ị ớ ơ ị c c p phát cho 1 vùng nh nh t đ nh c khai báo đ u đ nh ng n i (đ a
ỗ ỉ ế ể ư ữ ị ỉ ủ ế ỏ là bi nế dùng đ l u tr đ a ch c a các bi n đó.
ch Khi ch y ch phát cho bi n có th thay đ i. ớ ử ụ ộ ị bi n đ ng không có đ a ch nh t đ nh nên ta không th truy c p đ n chúng đ ế ạ ấ ngôn ng C l ỏ đó là bi n con tr (pointer) v i các đ c đi m: ỉ ứ ị ỏ Bi n con tr không ch a d li u mà ch ch a đ a ch c a d li u hay ch a đ a ch c a ớ ứ ữ ệ ô nh ch a d li u. ướ ủ Kích th ị đ nh là 2 byte. ỏ ế 1. Bi n con tr ượ ế M i bi n khi đ ch ) khác nhau. Bi n con tr ở ầ VD m đ u
#include
int main() {
/* khai bao bien x va bien con tro px */
int x, *px;
px = &x;
/* &x : tra ve dia chi cua bien x
* px = &x : gan dia chi cua bien x cho px hay px tro den x
*/
x = 42;
printf("Vi tri cua bien x la %p \n", &x);
printf("Noi dung cua bien x la %d \n", x);
printf("Vi tri cua bien x la %p \n", px);
printf("Noi dung cua bien x la %d \n", *px);
*px = 7826;
printf("\n \n\n");
printf("Noi dung cua bien x la %d \n", x);
printf("Noi dung cua bien x la %d \n", *px);
return 0;
}
ế
ộ ố ể ể
ỏ
ươ ứ ế ộ ỗ ỏ ể ng ng m t bi n con tr có ki u đó. ớ ể ế ể ỏ ộ ả K t qu : Vi tri cua bien x la 0xbff327e4 Noi dung cua bien x la 42 Vi tri cua bien x la 0xbff327e4 Noi dung cua bien x la 42 ——– Noi dung cua bien x la 7826 Noi dung cua bien x la 7826 ụ ở ầ Qua ví d m đ u này ta có th rút ra m t s đi m sau: ế a. Khai báo bi n con tr ể ữ ệ V i m i ki u d li u ta có t ỏ ế Ki u * Tên bi n con tr ; Trong VD trên ta khai báo 1 bi n con tr px thu c ki u int.
ị ỏ i c a con tr
ỉ ủ ế ế ỉ ị ị ử ỏ & đ l y đ a ch c a 1 bi n và sau đó gán đ a ch đó cho bi n con tr .
ỏ
ư ị i) ớ ấ ữ ỏ ớ (tr t ớ ấ ấ ỏ ớ
ệ ế Trong VD trên ta có th th y sau phép gán i. px = &x ; thì vi c ta vi t:
ỏ ớ ủ b. Quy đ nh vùng tr t ể ấ Ta dùng toán t ế ỏ Tên con tr = &bi n; c. Cách truy xu tấ V i con tr px bên trên ta có 2 phép tuy xu t là: ỉ px : L y đ a ch mà nó l u gi ị *px : L y giá tr trong vùng nh mà nó tr t ể ấ ươ ẽ ươ
ể ử ụ ẽ ươ ươ ứ ể px s t *px s t ớ ng v i &x ớ ng v i x. và ta có th s d ng *px trong các phép toán, bi u th c. ế ộ ố ỏ ng đ ng đ d. M t s phép toán trên bi n con tr
#include
int main() {
/* khai bao bien x va 2 bien con tro px, qx */
int x, *px, *qx;
px = &x;
printf("Nhap gia tri cho vung nho px tro toi: ");
scanf("%d", px);
/* px la con tro nen khong viet scanf("%d", &px); */
qx = px; /* gan gia tri cua px cho qx, qx cun tro toi x*/
printf("Vi tri cua bien x la %p \n", &x);
printf("Vi tri cua bien x la %p \n", px);
printf("Vi tri cua bien x la %p \n", qx);
printf("Noi dung cua bien x la %d \n", x);
printf("Noi dung cua bien x la %d \n", *px);
printf("Noi dung cua bien x la %d \n", *qx);
// tang gia tri cua o nho len, <=> x = x + 7826
*px += 7826;
printf("Noi dung cua bien x la %d \n", x);
px++;
/* cong them mot don vi cho px
* => px tro toi vung nho tiep theo
*/
printf("Vi tri px tro toi la %p \n", px);
return 0;
}
ế
ộ ố ề ặ ấ ỏ
ả K t qu : Nhap gia tri cho vung nho px tro toi: 42 Vi tri cua bien x la 0xbfba58a0 Vi tri cua bien x la 0xbfba58a0 Vi tri cua bien x la 0xbfba58a0 Noi dung cua bien x la 42 Noi dung cua bien x la 42 Noi dung cua bien x la 42 Noi dung cua bien x la 7868 Vi tri px tro toi la 0xbfba58a4 Trong vd trên ta th y có m t s phép toán trên con tr hay g p sau: (ngoài ra còn nhi u phép toán khác).
ỏ ộ ệ ể ể ượ ặ ự ế ộ ố ị ệ ỏ ậ ự c gán cho nhau ho c th c hi n các phép toán c ng ệ VD trên ta th c hi n các phép toán: ứ ỉ ủ ế ể ỏ ế ế ớ ỏ ể ừ ị ỏ ữ ố ỏ ươ ự ệ ả ự ư nh ỏ ừ ượ c th c hi n trên bi n con tr t ả ấ ế ố ọ ng t ơ ừ ệ ộ ế t duy nh t là nó tăng gi m, c ng tr theo đ n byte mà
ỏ ế ị ỉ ả ử s px đang tr đ n đ a ch : ị ỏ ế ỏ ể ị ế ế ỗ ộ 2 bi n con tr cùng ki u có th đ Ở ừ cho m t s nguyên, tr 2 con tr cho nhau. ị ủ Gán: qx = px; Khi này qx nh n giá tr c a px hi n có là đ a ch c a bi n x, t c là qx và ư px cùng tr đ n x. ngoài ra ta có th gán nh sau: qx = px + 2; v i qx, px là các bi n con tr ể ẽ ả ề cùng ki u. Phép tr 2 con tr cùng ki u s tr v 1 giá tr nguyên (int). Đây chính là ả ầ ử kho ng cách (s ph n t ) gi a 2 con tr đó ộ Tăng: Các phép tăng gi m, c ng tr đ ể ớ v i các bi n s h c. Đi m khác bi ể ủ ki u c a nó có. VD. Trong VD trên ta có phép tăng: px++; Khi này gi 0xbfba58a0 thì sau phép tăng nó có giá tr là (tr đ n v trí) 0xbfba58a4 (tăng lên 4) vì px là ớ ể con tr ki u int mà m i bi n ki u int chi m 4 byte trong b nh .
ị ủ ế ằ Ở ỏ ớ ừ ớ ị ị ở ẫ ổ ỉ ô nh (đ a ch ) mà px tr t i, t ự ế ị ủ ổ ổ ể Ngoài ra chúng ta đ ý còn phép thay đ i giá tr c a bi n x b ng phép toán *px += 3; ấ phép toán này th c ch t là ta đã thay đ i giá tr đó d n ế đ n giá tr c a bi n x cũng thay đ i theo.
ạ Các b n chú ý:
ị ể ượ Tùy theo trình d ch mà dung l ế ư ủ ị ạ ị ể ế i chi m 2 byte). Đ bi t dung ể ng c a các ki u là khác nhau. (trong trình d ch này thì ế ề ậ ạ ng t ng ki u b n dùng toán t ử sizeof() mà trong bài 2 đã đ c p. ỏ ế ỏ ộ ỉ ừ ỗ ộ ế
ỉ ủ ớ ồ
ụ ầ
ể ki u int chi m 4 byte nh ng trong trình d ch khác thì nó l ượ l ể M i bi n con tr , dù là con tr thu c ki u nào (int, float, double,…) cũng ch chi m 2 ữ byte b nh đ l u tr đĩa ch c a các bi n. ấ ấ ỏ ướ c khi vào ph n này ta làm ví d nho nh .
ế ớ ể ư 2. C p phát và thu h i vùng nh a. C p phát: Tr
#include
int main() {
int *px;
*px = 42;
printf("Vi tri con tro px la %p \n", px);
printf("Gia tri con tro px tro toi la %d \n", *px);
return 0;
}
ỗ ả ẽ ươ ạ ẽ ể ạ ượ ng c mà ch i (có c nh báo), khi ch y s không th ch y đ ẽ ỉ ỏ ấ ế ỏ ế ư ư ấ ạ ể ể ư ị ươ ng t ạ ữ ữ ệ ấ ư ạ
ẽ ạ ố ườ ư ng nh ng t ạ ử ụ ấ t nh t là ta ỏ ớ ẫ ệ ấ ấ ỗ i mà v n ch y bình th c khi s d ng. L i này s xu t hi n rõ nh t khi b n s d ng con tr v i ả
ể ấ ớ ị ỗ Có m t s trình d ch s không báo l ẽ ử ụ ẽ ề ậ ề ớ ể ấ
ư ệ ể ỏ ị Khi biên d ch thì s không co l trình s thoát ra luôn. ớ ỉ Nguyên nhân là khi khai báo bi n con tr px thì máy m i ch cung c p 2 byte đ l u đ a ch ớ ể ự ư ợ ỏ ủ nh h p c a bi n con tr mà ch a c p phát vùng nh đ con tr px l u tr d li u. (t ấ ấ ộ ố i không cung c p cho b n ru ng đ t tác xã cung c p 2 Kg thóc cho b n đ làm gi ng nh ng l ạ ậ ể ạ đ b n reo m v y ). ộ ố L u ý:ư ướ ấ nên c p phát tr ữ m ng mà lát n a ta s đ c p. ỏ ấ Thôi ta đi vào v n đ chính, làm sao đ c p phát vùng nh cho con tr . Đ c p phát vùng nh cho con tr ta dùng các hàm sau trong th vi n stdlib.h. malloc : tên con tr = (ki u con tr *) malloc (sizeof(ki u con tr )); ỏ ỏ ể ể ỏ ỏ
ỏ ỏ calloc : tên con tr = (ki u con tr *) malloc (n, sizeof(ki u con tr )); ướ ủ ể ố ầ ủ ể ể ỏ ỏ c c a ki u; n là s l n c a sizeof(ki u con tr ) ể Trong đó sizeof(ki u con tr ) là kích th ượ ấ đ c c p.
#include
#include
int main() {
int *px, *qx;
px = (int *) malloc(sizeof(int));
qx = (int *) calloc(1, sizeof(int));
printf("Vi tri con tro px la %p \n", px);
printf("Gia tri con tro px tro toi la %d \n", *px);
printf("Vi tri con tro qx la %p \n", qx);
printf("Gia tri con tro qx tro toi la %d \n", *qx);
return 0;
}
ơ ấ ạ ả ự ớ ấ ẽ ấ ạ ầ ấ ỳ ệ ư ữ ệ ị ư ị ớ ể ỏ ớ ậ ế ẽ ự ộ đ ng gán luôn giá tr 0 cho ô nh mà bi n qx tr t
ớ ệ ế ng ô nh nào đó mà trong quá trình làm vi c ta thi u và
ỏ ể ỏ ố ượ ầ ấ ể ng c n c p phát * sizeof(ki u con
ầ ấ ớ ố ượ ầ ố ấ ớ ớ ữ ấ
ỏ ng c p phát = 15. ớ
ng c n c p phát = cũ + m i. ấ ố ượ ể ớ ể free(tên con tr );ỏ
ế ố t cách truy n các tham s a,b trong hàm HoanVi là cách ả ư ề ế ề ặ ằ ị ỉ ượ ệ ổ ả ử ạ ằ ư ứ ể ố ể Ở ữ đây các b n chú ý: s khác nhau duy nh t gi a malloc và calloc mà các b n hi u đ n gi n ữ ế t ô đó có d là v i malloc thì khi c p phát máy s c p phát cho px 1 ô b t k mà không c n bi li u là gì hay không có d li u (do đó *px có giá tr nh trên) còn calloc cũng v y nh ng khác ấ 1 đi m là sau khi c p phát thì máy s t i, ị ặ ị ứ t c qx có giá tr m c đ nh là 0. ố ượ ỏ ế ấ Khi c p phát cho bi n con tr 1 s l ử ụ ệ realloc: ầ ấ c n c p phát thêm thì ta s d ng l nh ỏ tên con tr = (ki u con tr *) realloc (tên con tr , s l tr ));ỏ Trong đó: s l VD: Ban đ u ta c p phát cho con tr px là 10 ô nh . Sau đó mu n c p phát thêm cho nó 5 ô nh n a thì s l ồ ạ b. Thu h i và ki m tra vùng nh còn l i ấ ổ ộ Đ thu h i b nh đã c p phát ta dùng hàm ỏ ố 3. Hàm có đ i là con tr ề Hàm chúng ta đã bi Nh trong bài ị ứ ằ truy n b ng tham tr ch không ph i truy n b ng đ a ch (hay tham bi n) nên m c dù trong ị ẫ ế ị hàm thì giá tr các bi n đã đ ổ ượ ch a th thay đ i đ ư ự c thay đ i nh ng sau khi hàm th c hi n xong thì các giá tr v n ỏ ề ẽ i b ng cách truy n tham s hình th c là con tr a c. Và ta s ph i s a l
ể ổ ổ ạ ị ỉ ủ ớ i đ a ch c a các ô nh đó. Khi đó ta ả ố ớ ệ ể ỏ và con tr b đ khi th c hi n hoán đ i có th hoán đ i t ượ ế m i có đ ự c k t qu mong mu n.
#include
void hoanVi(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int a = 42, b = 7826;
printf("Truoc khi goi ham hoan vi: a = %d, b = %d \n", a, b);
hoanVi(&a, &b);
printf("Sau khi goi ham hoan vi: a = %d, b = %d \n", a, b);
return 0;
}
ệ ữ ỗ ỏ ố ả ự
ậ ộ L p trình C: Bài 10 – M i quan h gi a con tr và m ng, chu i ký t N i dung (cid:0) ỏ ả (cid:0) ậ (cid:0) ự (cid:0) ề ấ ỏ ỏ ề 1. Con tr và m ng 1 chi u. ả 2. Nh p m ng trong hàm ỏ 3.Con tr và xâu ký t ả ỏ 4. Con tr và m ng 2 chi u, m ng các con tr – Con tr đa c p ề ả ả ỏ
o o
ả ỏ a. Con tr và m ng 2 chi u b. M ng các con tr
ề ỏ ả
ư ộ ể ế ả ậ ỏ M ngả chúng ta đã bi t ta có th coi bi n m ng nh m t con tr , vì v y ta có ủ ế ể ế ậ ả
1. Con tr và m ng 1 chi u. ư Nh trong bài ỏ ả ể ử ụ th s d ng chính bi n m ng đó đ truy c p m ng theo cách c a con tr . code by nguyenvanquan7826
#include
02
void nhapMang(int a[], int n) { 03
04 int i;
for (i = 0; i < n; i++) { 05
printf("Nhap a[%d] = ", i); 06
scanf("%d", &a[i]); 07
08 }
09 }
10
void nhapContro(int a[], int n){ 11
12 int i;
for (i = 0; i < n; i++) { 13
printf("Nhap a[%d] = ", i); 14
scanf("%d", a + i); 15
16 }
17 }
18
19 void xuatMang(int a[], int n) {
20 int i;
21 for (i = 0; i < n; i++) {
22 printf ("%d \t", a[i]);
23 }
24 }
25
26 int main() {
27 // khai bao mang a co n phan tu
28 int n = 5;
29 int a[n];
30 nhapContro(a, n);
31 xuatMang(a, n);
32
33 return 0;
34 }
ườ ẽ ớ ng, mình s không nói nhi u n a. ộ ậ ằ ỉ hàm th nh t ta đã quen v i cách nh p bình th ỏ hàm th hai, chúng ta ch thay &a b ng a+i vì khi khai báo a[20] thì a coi nh là m t con tr ứ ấ ứ ẽ ấ ớ ế ừ ứ ế ị ề ữ ư ỉ ủ a đ n a + 19. Và a + i là đ a ch c a a[i] (t c ỏ ế ị Ở Ở và máy s c p phát cho ta các ô nh liên ti p t nó <=> &a[i]). a tr đ n v trí a[0].
ỏ ả
ể ả ỏ ỏ ớ ầ ả ỏ i đ u m ng thì con tr đó ả ở
Con tr và m ng trong C ạ Ngoài ra b n có th khai báo 1 m ng sau đó dùng 1 con tr tr t cũng tr thành m ng đó. code by nguyenvanquan7826
01 #include
02
03 int main() {
04 int n = 5, i;
05 int a[n], *pa;
06 pa = a; // con tro pa tro toi dau mang a
07
08 for (i = 0; i < n; i++) {
09 printf("Nhap a[%d] = ", i);
10 scanf("%d", pa + i);
11 }
12
for (i = 0; i < n; i++) { 13
printf ("%d \t", *(pa + i)); 14
15 }
16
return 0; 17
18 }
ạ ẫ ử ụ ầ ấ ượ ỏ ớ ể ư ữ ả ấ ả ở ầ ấ ệ ả ớ ườ ự ỏ ớ ớ ạ i sao ta không c n c p phát ô nh cho con tr pa mà v n s d ng đ c bình ng, b i vì ta đã khai báo m ng a[20] nên máy đã c p phát ô nh đ l u tr m ng a, khi ta ớ ồ i m ng a thì các ô nh này đã có r i nên không c n c p phát ô nh ữ
Các b n chú ý: t th ỏ th c hi n tr con tr pa t ụ cho pa n a. Ta xét ví d sau: code by nguyenvanquan7826
#include
#include
03
int main() { 04
int n = 5, i; 05
06
07 // cap phat bo nho cho pa
08 int *pa = (int *) malloc(n * sizeof(int));
09
10 for (i = 0; i < n; i++) {
11 printf("Nhap a[%d] = ", i);
12 scanf("%d", pa + i);
13 }
14
for (i = 0; i < n; i++) { 15
printf ("%d \t", *(pa + i)); 16
} 17
18
return 0; 19
} 20
ể ỏ ư c, do đó cũng không th tr pa t ớ ị i v ư ớ ự ả ầ ấ trong VD này ta không khai báo m ng a nh VD tr ệ ượ ướ c ta c n c p phát các ô nh cho pa nh trên.
ậ ả
ậ ợ ư ả ầ ướ ấ ậ c chúng ta c n ph i ư ế c khi c p phát ho c nh p, v y n u chúng ta ch a bi t ể ậ ụ ả ụ ướ i vì nh các ví d tr ế ậ ạ ậ ố ượ ướ ố c s ph n t ầ ử ủ ạ mà l ặ i ph i dùng hàm đ nh p m ng thì sao. Các b n xem ví d sau.
Ở ố trí nào, mà mu n th c hi n đ 2. Nh p m ng trong hàm ả ả ệ Vi c nh p m ng không ph i lúc nào cũng thu n l ả c a m ng tr ng ph n t có s l ả ầ ử tr code by nguyenvanquan7826
#include
#include
03
void nhapContro(int *(*a), int *n) { 04
int i; 05
06
printf("Nhap so phan tu cua mang: "); 07
scanf("%d", n); // khong phai &n 08
*a = (int *) malloc ((*n) * sizeof(int)); 09
// *a : lay dia chi cua mang a chu khong phai gia tri cua a 10
11
for (i = 0; i < *n; i++) { 12
printf("Nhap a[%d] = ", i); 13
scanf("%d", (*a + i)); 14
} 15
16 }
17
18 void xuatMang(int *a, int n) {
19 int i;
20 for (i = 0; i < n; i++) {
21 printf ("%d \t", a[i]);
22 }
23 }
24
25 int main() {
26 int *a, n;
27
28 nhapContro(&a, &n); // lay dia chi cua a va n
29 xuatMang(a, n);
30
31 return 0;
32 }
ộ ớ ấ ấ ậ ệ ự
ả ậ ồ ỏ ấ ấ ấ ể ứ ủ ể ữ ấ ị ủ ể ả ầ ị ỉ ả ư ố ỏ HoanVi(int *a,int *b) v y.ậ
ự
ự ư ả ươ ầ ả nên ph n này nó cũng t nh m ng 1 ng t ự ụ ơ ề ả ằ
ả Trong VD này ta th c hi n nh p và xu t m ng trong hàm, c p phát b nh cũng trong hàm ươ luôn. Các chú thích mình đã ghi rõ trong ch ng trình r i. J. ằ Có 1 đi m chú ý là trong hàm nh p m ng a b ng con tr thì có 2 d u *. 1 d u là c a m ng a ề (d u th 2), còn d u đ u tiên là dùng đ truy n đ a ch làm giá tr c a m ng có th gi ấ nguyên khi ra kh i hàm, nó gi ng nh là d u * trong hàm ỏ 3.Con tr và xâu ký t ự ả ấ b n ch t cũng là m ng các ký t Do xâu ký t ẽ chi u, mình s nói qua 1 chút b ng 1 ví d đ n gi n. code by nguyenvanquan7826
#include
#include
03
04 int main() {
05 char *name;
06 name = (char *) malloc (100*sizeof(char));
07
08 printf("What your name? ");
09 gets(name);
10
11 printf("Oh, Hello %s", name);
12
13 return 0;
14 }
ấ ỏ ỏ
ả ả ề ề ỏ ỏ
ề ề ả ầ ả ỏ ỏ
ng t ự ư ả ề ả ớ ư t th c ch t trong máy tính thì b nh l u m ng 2 chi u gi ng nh m ng 1 ố ỏ ố ư ả ể ể ễ ề ằ
ả 4. Con tr và m ng 2 chi u, m ng các con tr – Con tr đa c p a. Con tr và m ng 2 chi u ầ ể Ph n trên chúng ta đã tìm hi u v con tr và m ng 1 chi u, và ph n này con tr và m ng 2 ề ự ư ậ ươ chi u cũng t nh v y. ư ộ ấ ế Nh ta đã bi ả ậ ề chi u. Vì v y ta hoàn toàn có th bi u di n m ng 2 chi u b ng con tr gi ng nh m ng 1 chi u.ề code by nguyenvanquan7826
01 #include
02 #include
03
04 int main() {
05 double a[10][10], *pa;
06 int n, m, i;
07 pa = (double *) a;
08 printf("Nhap so hang va so cot: ");
09 scanf("%d %d", &n, &m);
10
for (i = 0 ; i < n * m; i++) { 11
printf("Nhap a[%d][%d] = ", i / m, i % m); 12
scanf("%lf", pa + i); 13
14 }
15
for (i = 0 ; i < n * m; i++) { 16
if (i % m == 0) printf("\n"); // xuong dong 17
printf("%5.2lf", *(pa + i)); 18
19 }
20
21 return 0;
22 }
ế
ể ậ ặ ỏ ể ự ư ả ầ ề ườ ươ nh m ng 2 chi u bình th ư ng nh sau. ng t
ả K t qu : Nhap so hang va so cot: 2 3 Nhap a[0][0] = 4.23 Nhap a[0][1] = 5.7 Nhap a[0][2] = 1.2 Nhap a[1][0] = 8.6 Nhap a[1][1] = 3.456 Nhap a[1][2] = 12 4.23 5.70 1.20 8.60 3.46 12.00 Ngoài ra, chúng ta có th không c n dùng pa mà dùng ngay a là 1 con tr . Ho c ta có th nh p 1 cách t code by nguyenvanquan7826
01 #include
02 #include
03
04 int main() {
05 double a[10][10], *pa;
06 int n, m, i, j;
07 pa = (double *) a;
08 printf("Nhap so hang va so cot: ");
09 scanf("%d %d", &n, &m);
10
11 for (i = 0 ; i < n; i++) {
12 for (j = 0 ; j < m; j++) {
13 printf("Nhap a[%d][%d] = ", i, j);
14 scanf("%lf", pa + i * 10 + j);
15 }
16 }
17
18 for (i = 0 ; i < n; i++) {
19 printf("\n"); // xuong dong
20 for (j = 0 ; j < m; j++) {
21 printf("%5.2lf", *(pa + i * 10 + j));
22 }
23 }
24
25 return 0;
26 }
ạ ạ ở pa + i*10 + j. Đó là vì i sao ta l i có ớ ủ ế ả ớ ộ ẫ ồ ạ ế ạ ư hàm main() ta khai báo là a[510][10] Các b n l u ý là t ề ấ nên máy c p phát cho chúng ta các ô nh c a m ng 2 chi u v i 10 hàng, 10 c t mà n u ta ko dùng h t thì nó v n t n t i.
ề
ỏ ạ ể ế ư không th vi vì theo khai báo thì a là ề ể ế t a[i][j] nh ng ư ậ ế ỉ ượ ế c phép vi t pa[i ị ề ấ 10+j] (l y đ a ch ).
ị ả
ứ ậ ể ả ả ợ ộ ỏ ỏ ́ ̣ ̉ ̉ ̉ ệ ớ ủ ề ề ả ả ỗ ệ ớ ề ề ả ạ ỏ ố ỗ ả Con tr và m ng 2 chi u trong C ể ế Các b n chú ý là ta có th vi t pa[i][j] ả ầ ỏ t nh v y còn pa là 1 con tr và khi ta gán pa = a thì ta đã ng m m ng 2 chi u nên ta có th vi 10+j] (l y ấ ậ ả ị đ nh coi a là m ng 1 chi u. Vì v y n u có thì chúng ta cũng ch đ ỉ giá tr ) và &pa[i ỏ b. M ng các con tr ộ M ng con tr là m t m ng ch a t p h p các con tr cùng m t ki u. ̀ ỏ Float *a[10]; // khai bao môt mang con tro. Gôm 10 con tro: a[0], a[1], …a[9]; là 10 con tr . ư ậ Liên h v i m ng 2 chi u thì ta có nh n xét sau: M i hàng c a m ng 2 chi u ta coi nh 1 ẽ ả i có m i quan h v i 1 m ng 1 chi u, ta có hình v : m ng 1 chi u. Mà m i con tr thì l
ả ỏ
M ng các con tr code by nguyenvanquan7826
#include
#include
03
int main() { 04
05 double a[10][10], *pa[10];
int n, m, i, j; 06
07
printf("Nhap so hang va so cot: "); 08
scanf("%d %d", &n, &m); 09
10
for (i = 0 ; i < n; i++) { 11
pa[i] = a[i]; // con tro thu i tro den hang thu i 12
for (j = 0 ; j < m; j++) { 13
printf("Nhap a[%d][%d] = ", i, j); 14
scanf("%lf", &pa[i][j]); 15
16 }
17 }
18
for (i = 0 ; i < n; i++) { 19
printf("\n"); // xuong dong 20
for (j = 0 ; j < m; j++) { 21
printf("%5.2lf", pa[i][j]); 22
23 }
24 }
25
26 return 0;
27 }
ỏ ế ề ả ỗ ộ c pa[i][j] đó là do m i pa là 1 con tr đ n m ng m t chi u. pa[i][j] ế ượ t đ VD này ta vi ỏ th j c a con tr pa[i].
ầ ấ ố ộ ư ấ ề ả ộ ớ ớ ả trên chúng ta đ u xét khi mà khai báo m ng a[][] nên không c n c p phát b nh ỏ ớ mu n c p phát b nh cho con tr v i m ng 2 chi u gi ng nh c p phát ề ố ấ ư ờ m ng 1 chi u thì ta làm nh sau:
ở ở S dĩ ầ ử ứ ủ ứ t c là ph n t ụ ở Các ví d ỏ cho con tr , bây gi ề ở ả code by nguyenvanquan7826
#include
#include
03
int main() { 04
double **pa; 05
int n, m, i, j; 06
07
08 printf("Nhap so hang va so cot: ");
09 scanf("%d %d", &n, &m);
10
11 // cap phat n o nho cho n con tro (n hang)
12 pa = (double**) malloc(n * sizeof(double));
13
14 for (i = 0 ; i < n; i++) {
15 // cap phat m o nho cho moi con tro (moi hang)
16 pa[i] = (double *) malloc(m * sizeof(double));
17 for (j = 0 ; j < m; j++) {
18 printf("Nhap a[%d][%d] = ", i, j);
19 scanf("%lf", &pa[i][j]);
} 20
} 21
22
23 for (i = 0 ; i < n; i++) {
24 printf("\n"); // xuong dong
25 for (j = 0 ; j < m; j++) {
26 printf("%5.2lf", pa[i][j]);
27 }
28 }
29
30 return 0;
31 }
ể ỏ ỏ ế ấ ỏ ỏ ỏ
ả ể ấ
ậ ộ ặ Đây cũng có th coi là m ng con tr , ho c con tr tr đ n con tr (con tr đa c p). L p trình C: Bài 11 – Ki u c u trúc – struct N i dung (cid:0) ể ấ 1. Ki u c u trúc
ể ấ ở ầ ự ậ ể ấ ế
o o o o
VD m đ u ế ấ a. Xây d ng ki u c u trúc, khai báo bi n c u trúc ầ ủ ấ b. Truy c p đên các thành ph n c a c u trúc c. Gán các bi n có cùng ki u c u trúc (cid:0) ả (cid:0) ấ ỏ ấ
ả ụ ộ ớ ề ể ấ ấ ể ế ậ 2. M ng c u trúc 3. Con tr c u trúc ơ ỗ ọ ớ ồ ậ ữ ệ ạ ả ả ư ế ư ư ầ ừ ọ ỳ ậ ể ấ ậ ạ ể ấ ể ấ ỉ ầ ớ ồ ồ không nên, hãy dùng ki u c u trúc. V i ki u c u trúc ch c n 1 ả
ể ữ ệ ư ớ ỉ ề ể ữ ệ ố ớ ể ư
ở ầ Cách đ n gi n nh t đ ti p c n v ki u c u trúc là xét ví d sinh viên. M t l p có 100 sinh viên m i sinh viên g m h tên và mã sinh viên. Hãy nh p d li u cho l p đó. Hehe. B n nghĩ ả ế đ n cách dùng 2 m ng: 1 m ng l u tên, 1 m ng l u mã sinh viên đúng không. Đúng, cách đó không sai… nh ng hãy xem yêu c u ti p theo… Thi h c k xong, hãy nh p đi m cho t ng ỗ sinh viên, m i sinh viên g m 10 môn (Toán, Tin, Hóa, V t lý,…). Hehe. B n th y sao nào… ả Dùng 12 m ng chăng… m ng mà thôi. ể ấ 1. Ki u c u trúc ể ư ả Đ i v i m ng, ch có th l u nhi u thông tin có cùng ki u d li u. Nh ng v i structure ta có ề th l u thông tin có nhi u ki u d li u khác nhau. VD m đ u
#include
#include
// khai bao struct
struct sinhvien {
char MSV[20]; // ma sinh vien
char hoten[30]; // ho ten sinh vien
double toan, tin, anh; // cac diem toan, tin, anh
};
/* Hay thay tat ca __fpurge(stdin); thanh fflush(stdin) khi ban lam tren windowns*/
int main() {
/* khai bao 2 bien sv1, sv2 va 1 mang
* CNPMK10A gom 100 sinh vien
*/
struct sinhvien sv1, sv2, CNPMK10A[100];
printf("Nhap du lieu cho sv1:\n");
printf("MSV: "); __fpurge(stdin);
gets(sv1.MSV);
printf("Ho ten: "); __fpurge(stdin);
gets(sv1.hoten);
printf("Diem toan, tin, anh: "); __fpurge(stdin);
scanf("%lf %lf %lf", &sv1.toan, &sv1.tin, &sv1.anh);
printf("Nhap du lieu cho sv2:\n");
printf("MSV: "); __fpurge(stdin);
gets(sv2.MSV);
printf("Ho ten: "); __fpurge(stdin);
gets(sv2.hoten);
printf("Diem toan, tin, anh: "); __fpurge(stdin);
scanf("%lf %lf %lf", &sv2.toan, &sv2.tin, &sv2.anh);
printf("\n Thong tin sinh vien \n");
printf("%20s %30s %7s %7s %7s\n", "MSV", "Ho ten", "Toan", "Tin", "Anh");
printf("%20s %30s %7.2lf %7.2lf %7.2lf\n", sv1.MSV, sv1.hoten, sv1.toan, sv1.tin, sv1.anh);
printf("%20s %30s %7.2lf %7.2lf %7.2lf\n", sv2.MSV, sv2.hoten, sv2.toan, sv2.tin, sv2.anh);
return 0;
}
ế ả K t qu :
Nhap du lieu cho sv1:
MSV: DTC1
Ho ten: Pham Thi Ha
Diem toan, tin, anh: 9 9 8
Nhap du lieu cho sv2:
MSV: DTC2
Ho ten: Nguyen Van Quan
Diem toan, tin, anh: 9 9 8
Thong tin sinh vien
MSV Ho ten Toan Tin Anh
DTC1 Pham Thi Ha 9.00 9.00 8.00
DTC2 Nguyen Van Quan 9.00 9.00 8.00
ề ấ ả VD m đ u này, chúng ta có r t nhi u đi u ph i bàn…
ở ầ ự ể ế ấ
ể ấ ể ư ự ự Ở a. Xây d ng ki u c u trúc, khai báo bi n c u trúc ệ ể ấ Nh VD trên, đ xây d ng 1 ki u c u trúc ta th c hi n theo cú pháp:
ấ ể struct tên _ki u_c u_trúc
{
ầ ủ ể Khai báo các thành ph n c a ki u;
};
ồ ể ấ ự ư ươ ườ ể nh 1 ki u bình th ng t ỉ ệ ể ế ữ ừ ế ố ớ ở ướ c: (Đ i v i C++ thì không c n). tr ấ ể ế ấ ế ấ ể ấ ộ ố ư ự ng (int, float, Sau khi có ki u c u trúc r i thì cái ki u đó nó t ầ char,…) và ta ch vi c khai báo bi n n a là xong. Tuy nhiên khai báo bi n thì c n có thêm t ầ khóa struct struct tên_ki u_c u_trúc tên_bi n_c u trúc; Ngoài ta chúng ta còn m t s cách xây d ng ki u c u trúc và khai báo bi n c u trúc nh sau:
ấ ể struct tên _ki u_c u_trúc
{
ầ ủ ể Khai báo các thành ph n c a ki u;
ể ấ ế ộ } danh sách các bi n thu c ki u c u trúc ;
Ho cặ
struct
{
ầ ủ ể Khai báo các thành ph n c a ki u;
ể ấ ế ộ } danh sách các bi n thu c ki u c u trúc ;
ớ ắ ả ở ấ ngay sau c u trúc vì ữ ở ể ề ậ ừ ữ ầ ừ typedef. T khóa này dùng ể ữ ệ ế ấ ộ V i cách khai báo này, ta b t bu c ph i khai báo các bi n c u trúc ị ể ấ các v trí khác n a. không có tên ki u c u trúc đ cho ta khai báo ế ọ ầ Trong ph n này ta c n đ c p đ n 1 t khóa quan tr ng n a, đó là ớ ể ị đ đ nh nghĩa 1 ki u d li u m i.
typedef struct sinhvien {
char MSV[20]; // ma sinh vien
char hoten[30]; // ho ten sinh vien
double toan, tin, anh; // cac diem toan, tin, anh
} kieuSinhVien;
ể ữ ệ ư ể ạ ầ ề Khi này ta có kieuSinhVien là 1 ki u d li u (nh int, double, …) và ta có th khai báo các bi n c u trúc thông qua nó. Trong này có vài đi u các b n c n chú ý:
ừ ế ộ c đ t sau t khóa struct) thì khi khai báo bi n thu c ể ả ượ ặ ở ướ tr c nó. (VD: sinhvien svA; > Sai còn struct sinhvien
ượ ể ừ không đ c có t struct ở ướ ế ấ ể ấ V iớ sinhvien (ki u c u trúc đ ừ ẫ ki u này ta v n ph i có t struct svA; > đúng), (chú ý trong C++ thì không c n).ầ V iớ kieuSinhVIen thì khi khai báo bi n thu c ki u này ta ộ tr ế c nó. (VD: struct kieuSinhVIen svA; > sai, kieuSinhVIen svA; > đúng).
ư ồ ạ ể Ngoài ra ta còn có th khai báo ki u c u trúc l ng nhau: VD nh trong 1 sinh viên có ngày sinh, trong ngày sinh l ể ấ i có ngày, tháng, năm sinh.
struct ngaysinh {
int ngay, thang, nam;
}
typedef struct sinhvien {
char MSV[20]; // ma sinh vien
char hoten[30]; // ho ten sinh vien
double toan, tin, anh; // cac diem toan, tin, anh
struct ngaysinh ns;
} kieuSinhVien;
ặ ấ Ho c ta khai báo ngay trong c u trúc:
typedef struct sinhvien {
char MSV[20]; // ma sinh vien
char hoten[30]; // ho ten sinh vien
double toan, tin, anh; // cac diem toan, tin, anh
struct ngaysinh {
int ngay, thang, nam;
} ns;
} kieuSinhVien;
ầ ủ ấ
ậ ậ ể ử ụ ử ấ ầ ủ ấ ch m (.). ấ ậ ư ư ể i h tên, đi m toán ấ ớ i ngày sinh và tháng sinh.
ấ ượ ớ c t ị ỗ ư ườ ậ ị ầ ủ ấ ầ ấ ng và ta gán giá tr ho c nh p xu t giá tr cho chúng nh cách bình th ế i các thành ph n c a c u trúc thì m i thành ph n đó là 1 bi n bình ặ ng mà chúng ta
ế ể ệ ầ ằ
b. Truy c p đên các thành ph n c a c u trúc ế Đ truy nh p đ n thành ph n c a c u trúc ta s d ng toán t ầ Tên_c u_trúc . tên_thành_ph n; Nh VD trên ta truy c p nh sau: ấ ớ ọ sv1.hoten; sv1.toan; // truy xu t t sv1.ns.ngay; sv1.ns.thang; // truy xu t t … Khi đã truy xu t đ ườ th ẫ v n làm. ử Ngoài ra n u thành ph n nào đó dài dòng thì ta có th tránh vi c dài dòng này b ng cách s ừ ụ d ng t VD thay vì vi khóa define. t:ế
sv1.ns.thang;
sv1.ns.nam;
Ta vi t:ế
#define p sv1.ns
p.thang;
p.nam;
ể ấ ế c. Gán các bi n có cùng ki u c u trúc
#include
#include
struct sinhvien {
char MSV[20]; // ma sinh vien
char hoten[30]; // ho ten sinh vien
double toan, tin, anh; // cac diem toan, tin, anh
};
/* Hay thay tat ca __fpurge(stdin); thanh fflush(stdin) khi ban lam tren windowns*/
int main() {
/* khai bao 2 bien sv1, sv2 va 1 mang
* CNPMK10A gom 100 sinh vien
*/
struct sinhvien sv1, sv2, CNPMK10A[100];
printf("Nhap du lieu cho sv1:\n");
printf("MSV: "); __fpurge(stdin);
gets(sv1.MSV);
printf("Ho ten: "); __fpurge(stdin);
gets(sv1.hoten);
printf("Diem toan, tin, anh: "); __fpurge(stdin);
scanf("%lf %lf %lf", &sv1.toan, &sv1.tin, &sv1.anh);
sv2 = sv1; // gan gia tri cua sv1 cho sv2
printf("\n Thong tin sinh vien \n");
printf("%20s %30s %7s %7s %7s\n", "MSV", "Ho ten", "Toan", "Tin", "Anh");
printf("%20s %30s %7.2lf %7.2lf %7.2lf\n", sv2.MSV, sv2.hoten, sv2.toan, sv2.tin, sv2.anh);
return 0;
}
ủ ở ầ ể ấ
ầ ủ ữ ệ ọ Sau khi gán sv2 = sv1 thì m i thông tin c a sv1 có thì sv2 cũng có. ị Ngoài ra ta còn có th gán giá tr kh i đ u cho c u trúc. struct sinhvien sv1 = {“ABC”, “Nguyen Van Quan”, 9, 9, 8, {4, 5, 1992}}; Khi đó ta có các d li u ban đ u c a sv1 là:
MSV: ABC
hoten: Nguyen Van Quan
toan: 9
tin: 9
anh: 8
ngày sinh: 4/5/1992.
ả ấ
ề ể ấ ụ ề ấ ộ ể ơ ả ễ ể ấ ư ủ ể ể ả ọ ớ 2. M ng c u trúc ờ Bên trên ta đã tìm hi u c b n v ki u c u trúc và m t vài ví d v c u trúc sinhvien. Bây gi ta tìm hi u cách bi u di n 1 m ng 50 sinh viên c a 1 l p h c có ki u c u trúc nh trên. Ta xét VD:
#include
#include
struct sinhvien {
char MSV[20]; // ma sinh vien
char hoten[30]; // ho ten sinh vien
double diemTB; // diem trung binh
struct ngaysinh {
int ngay, thang, nam;
} ns;
};
void fflush_stdin(){
__fpurge(stdin);
}
int main() {
int n = 2, i;
struct sinhvien CNPMK10A[n];
for (i = 0; i < n; i++) {
#define sv CNPMK10A[i]
printf("Nhap du lieu cho sinh vien thu %d:\n", i + 1);
printf("MSV: "); fflush_stdin();
gets(sv.MSV);
printf("Ho ten: "); fflush_stdin();
gets(sv.hoten);
printf("Diem TB: "); fflush_stdin();
scanf("%lf", &sv.diemTB);
printf("Ngay sinh: ");
scanf("%d/%d/%d", &sv.ns.ngay, &sv.ns.thang, &sv.ns.nam);
}
printf("\n Thong tin sinh vien \n");
printf("%20s %30s %7s %10s\n", "MSV", "Ho ten", "Diem Tb", "Ngay sinh");
for (i = 0; i < n; i++) {
#define sv CNPMK10A[i]
printf("%20s %30s %7.2lf %02d/%02d/%4d\n", sv.MSV, sv.hoten, sv.diemTB, sv.ns.ngay, sv.ns.thang, sv.ns.nam);
}
return 0;
}
ế ả K t qu :
Nhap du lieu cho sinh vien thu 1:
MSV: DTC1
Ho ten: Pham Thi Ha
Diem TB: 9.2
Ngay sinh: 21/01/1993
Nhap du lieu cho sinh vien thu 2:
MSV: DTC2
Ho ten: Nguyen Van Quan
Diem TB: 9.2
Ngay sinh: 31/12/1992
Thong tin sinh vien
MSV Ho ten Diem Tb Ngay sinh
DTC1 Pham Thi Ha 9.20 21/01/1993
DTC2 Nguyen Van Quan 9.20 31/12/1992
ỏ ấ ỏ ấ 3. Con tr c u trúc ề Xét VD v con tr c u trúc:
#include
#include
struct sinhvien {
char MSV[20]; // ma sinh vien
char hoten[30]; // ho ten sinh vien
double diemTB; // diem trung binh
struct ngaysinh {
int ngay, thang, nam;
} ns;
};
// fflush(stdin) tren windows
void fflush_stdin(){
__fpurge(stdin);
}
int main() {
int n = 2, i;
// cap phat bo nho
struct sinhvien *CNPMK10A = (struct sinhvien*) malloc(n * sizeof(struct sinhvien));
for (i = 0; i < n; i++) {
printf("Nhap du lieu cho sinh vien thu %d:\n", i + 1);
printf("MSV: "); fflush_stdin();
gets(CNPMK10A[i].MSV);
printf("Ho ten: "); fflush_stdin();
gets(CNPMK10A[i].hoten);
printf("Diem TB: "); fflush_stdin();
scanf("%lf", &(CNPMK10A+i)>diemTB);
printf("Ngay sinh: ");
scanf("%d/%d/%d", &(CNPMK10A+i)>ns.ngay, &(CNPMK10A+i) >ns.thang, &(CNPMK10A+i)>ns.nam);
}
printf("\n Thong tin sinh vien \n");
printf("%20s %30s %7s %10s\n", "MSV", "Ho ten", "Diem Tb", "Ngay sinh");
for (i = 0; i < n; i++) {
#define ns CNPMK10A[i].ns
printf("%20s %30s %7.2lf %02d/%02d/%4d\n", CNPMK10A[i].MSV, (*(CNPMK10A+i)).hoten, (CNPMK10A+i)>diemTB, ns.ngay, ns.thang, ns.nam);
}
return 0;
}
ậ ầ ấ ể ấ ữ ệ ầ ủ ỏ ấ ậ Truy c p các thành ph n c u trúc Đ truy c p đ l y d li u các thành ph n c a con tr c u trúc ta có 3 cách sau:
Cách 1: CNPMK10A[i].diemTB; Cách 2: (*(CNPMK10A+i)).diemTB; Cách 3: (CNPMK10A+i) >diemTB;
ậ ớ i DTB.
ị ề C 3 cách trên đ u truy c p t ỉ Đ l y đ a ch ta cũng có 2 cách:
Cách 1: &CNPMK10A[i].DTB; Cách 2: &(CNPMK10A+i)>diemTB ế ằ ả
ể ả ể ấ ậ ộ L p trình C: Bài 12 – Danh sách liên k t cài b ng m ng N i dung (cid:0) (cid:0) (cid:0) ỗ ỗ ặ ở ạ ể ầ (cid:0) ầ ử (cid:0) (cid:0) (cid:0) (cid:0) ầ ử ầ ử ứ ầ ử x trong danh sách th k trong danh sách có n i dung x trong danh sách (cid:0) ỉ 1. Cài đ t (khai báo) danh sách 2. Kh i t o danh sách r ng 3. Ki m tra danh sách r ng, danh sách đ y ị 4. Chèn ph n t vào v trí k trong danh sách ậ 5. Nh p danh sách 6. Tìm ph n t 7. Xóa ph n t 8. Xóa ph n t ươ 9. Ch ộ ng trình hoàn ch nh (full)
ể ượ ế ặ ằ ả ỏ ế Danh sách liên k t có th đ ặ ằ c cài đ t b ng m ng ho c b ng con tr . Trong bài vi t này
ạ ẫ ạ ử ụ ượ ọ ườ ả ng d n các b n s d ng m ng :), Lo i danh sách này th ng đ c g i là danh
ể ữ ệ ầ ử ố ể ả t i đa là N có ki u d li u là item ể ấ ể ữ ệ ổ ế ể ệ ố ầ ử ệ ố ẽ ủ hi n có c a danh sách. ụ ể ư ẽ ướ mình s h ế ế sách k ti p. ặ 1. Cài đ t (khai báo) danh sách ầ Đ khai báo danh sách này ta c n có 1 m ng có s ph n t ể (item này là ki u d li u t ng quan, khi làm nó s là ki u int, float hay ki u c u trúc sinh ầ viên). C n thêm 1 bi n size th hi n s ph n t C th nh sau:
#define N 100 //so phan tu toi da la 100
typedef int item;
/*kieu cac phan tu la item
ma cu the o day item la kieu int */
typedef struct
{
item Elems[N]; //mang kieu item
int size; //so phan tu toi da cua mang
}List; //kieu danh sach List
ở ạ ỗ
ầ ử ỉ ầ ậ ằ ườ trong danh sách b ng 0. Vì v y ch c n khai báo tr ng ủ ằ ượ ủ 2. Kh i t o danh sách r ng ố ỗ Danh sách c a ta r ng khi s ph n t size c a ta b ng 0 là đ c.
void Init(List *L) //ham khoi tao danh sach rong
/*Danh sach L duoc khai bao kieu con tro
de khi ra khoi ham no co the thay doi duoc*/
{
(*L).size = 0; //size = 0.
}
ể ể ể ỗ ỗ ầ ố ầ ử ủ ằ c a danh sách có b ng 0 hay ầ ỗ ầ 3. Ki m tra danh sách r ng, danh sách đ y ỉ ệ Đ ki m tra danh sách r ng hay đ y ta ch vi c xem s ph n t ằ không (r ng) và có b ng N hay không (đ y).
int Isempty (List L)
{
return (L.size==0);
}
int Isfull (List L)
{
return (L.size==N);
}
ả ề ữ ệ ự ầ ử ầ ướ ậ ị ầ ử 4. Chèn ph n t vào v trí k trong danh sách ầ ử c khi chèn ph n t Tr vào trong danh sách chúng ta nên xây d ng 1 hàm tr v d li u ủ ữ ệ (nh p vào d li u) c a ph n t c n chèn đó.
item init_x() //khoi tao gia tri x
{
int temp;
scanf("%d",&temp);
return temp;
}
ế ư ể ậ ầ ầ ầ ị ẽ ế ể
ể ượ ả ị ầ
ị ề ả ố ố ợ
ể
x vào v trí k trong danh sách (trong m ng) ta c n dùng 1 vòng for đ di
v trí k v phía cu i m ng, sau đó chèn x vào v trí k. Cu i cùng ta tăng ế
ầ ử
c ph n t
ầ ử ừ ị
t ơ Sau đó ti n hành chèn:
Trong quá trình chèn chúng ta c n ki m tra xem danh sách đ y ch a, nh p v trí k c n chèn và
ki m tra nó, n u phù h p (0 ầ ử Chèn ph n t vào danh sách int Insert_k (List *L, item x, int k)//chen x vao vi tri k { if (Isfull(*L)) //kiem tra danh sach day { printf("Danh sach day !"); return 0; } if (k<1 || k>(*L).size+1) //kiem tra dieu kien vi tri chen { printf("Vi tri chen khong hop le !\n"); return 0; } printf ("Nhap thong tin: "); x = init_x(); //gan x = ham khoi tao x int i; //di chuyen cac phan tu ve cuoi danh sach for (i = (*L).size; i >= k; i) (*L).Elems[i] = (*L).Elems[i1]; (*L).Elems[k1]=x;//chen x vao vi tri k (*L).size++;//tang size len 1 don vi. return 1; } ậ ậ ả ớ 5. Nh p danh sách
ườ
ư
Nh p nh bình th ng v i m ng void Input (List *L) { int n; printf("Nhap so phan tu cua danh sach: "); scanf("%d",&(*L).size); int i; for (i=0; i<(*L).size; i++) { printf("Nhap phan tu thu %d : ",i+1); (*L).Elems[i] = init_x(); } } x trong danh sách ủ ư ế ế ố ị ị ầ ử
6. Tìm ph n t
ệ ừ ầ
Ta duy t t đ u đ n cu i danh sách n u có giá tr x thì đ a ra v trí c a nó. int Search (List L, item x) { int i; for (i=0; i if (L.Elems[i] == x) return i+1; return 0; } th k trong danh sách ậ ỗ ể ầ ử ứ
ả ế ỗ ị
c khi xóa ta ph i ki m tra xem danh sách có r ng không. N u không r ng ta nh p vào v ướ
ầ ể ề ướ ơ ị ầ ư ạ ầ ử ừ
k+1 v tr
l c 1 đ n v . tuy
ầ
ế
i thông tin n u ta c n dùng xóa tr
ơ ố 7. Xóa ph n t
Tr
ợ
ế
trí c n xóa và ki m tra (phù h p n u 0 ầ ử Xóa ph n t trong danh sách int Del_k (List *L, item *x, int k) { if (Isempty(*L)) { printf("Danh sach rong !"); return 0; } if (k<1 || k>(*L).size) { printf("Vi tri xoa khong hop le !"); return 0; } *x=(*L).Elems[k1]; //luu lai gia tri cua phan tu can xoa int i; for (i=k1; i<(*L).size1; i++) //don cac phan tu ve truoc (*L).Elems[i]=(*L).Elems[i+1]; (*L).size; //giam size return 1; } ể ầ ử
ầ ử ướ ằ ầ ử c b ng hàm ế
ế ụ ử ụ ộ
ộ
ị ả ề x tr
ể ủ ị ầ ử ở ị v trí có n i dung x trong danh sách
8. Xóa ph n t
có n i dung x trong danh sách ta ti n hành tìm ph n t
Đ xóa ph n t
search sau đó giá tr tr v là v trí c a x, ta ti p t c s d ng hàm del_k đ xóa ph n t
mà ta tìm đ c.ượ int Del_x (List *L, item x) { if (Isempty(*L)) { printf("Danh sach rong !"); return 0; } int i = Search(*L,x); if (!i) { printf("Danh sach khong co %d",x); return 0; } do { Del_k(L,&x,i); i = Search(*L,x); } while (i); return 1; } ươ ỉ 9. Ch ng trình hoàn ch nh (full) #include #include #define N 100 //so phan tu toi da la 100 typedef int item; /*kieu cac phan tu la item ma cu the o day item la kieu int */ typedef struct { item Elems[N]; //mang kieu item int size; //so phan tu toi da cua mang }List; //kieu danh sach List void Init(List *L); //ham khoi tao danh sach rong void Init(List *L); //ham khoi tao danh sach rong int Isempty (List L); //kiem tra danh sach rong int Isfull (List L); //kiem tra danh sach day int Insert_k (List *L, item x, int k); //chen x vao vi tri k void Input (List *L);//nhap danh sach void Output (List L);//xuat danh sach int Search (List L, item x); //tim phan tu x trong danh sach int Del_k (List *L, item *x, int k);//xoa phan tu tai vi tri k int Del_x(List *L, item x);//xoa phan tu x trong danh sach item init_x(); //tao phan tu x. // void Init(List *L) //ham khoi tao danh sach rong /*Danh sach L duoc khai bao kieu con tro de khi ra khoi ham no co the thay doi duoc*/ { (*L).size = 0; //size = 0. } int Isempty (List L) { return (L.size==0); } int Isfull (List L) { return (L.size==N); } item init_x() //khoi tao gia tri x { int temp; scanf("%d",&temp); return temp; } int Insert_k (List *L, item x, int k)//chen x vao vi tri k { if (Isfull(*L)) //kiem tra danh sach day { printf("Danh sach day !"); return 0; } if (k<1 || k>(*L).size+1) //kiem tra dieu kien vi tri chen { printf("Vi tri chen khong hop le !\n"); return 0; } printf ("Nhap thong tin: "); x = init_x(); //gan x = ham khoi tao x int i; //di chuyen cac phan tu ve cuoi danh sach for (i = (*L).size; i >= k; i) (*L).Elems[i] = (*L).Elems[i1]; (*L).Elems[k1]=x;//chen x vao vi tri k (*L).size++;//tang size len 1 don vi. return 1; } void Input (List *L) { int n; printf("Nhap so phan tu cua danh sach: "); scanf("%d",&(*L).size); int i; for (i=0; i<(*L).size; i++) { printf("Nhap phan tu thu %d : ",i+1); (*L).Elems[i] = init_x(); } } void Output (List L) { printf("Danh sach: \n"); int i; for (i=0; i printf("%5d",L.Elems[i]); printf("\n"); } int Search (List L, item x) { int i; for (i=0; i if (L.Elems[i] == x) return i+1; return 0; } int Del_k (List *L, item *x, int k) { if (Isempty(*L)) { printf("Danh sach rong !"); return 0; } if (k<1 || k>(*L).size) { printf("Vi tri xoa khong hop le !"); return 0; } *x=(*L).Elems[k1]; //luu lai gia tri cua phan tu can xoa int i; for (i=k1; i<(*L).size1; i++) //don cac phan tu ve truoc (*L).Elems[i]=(*L).Elems[i+1]; (*L).size; //giam size return 1; } int Del_x (List *L, item x) { if (Isempty(*L)) { printf("Danh sach rong !"); return 0; } int i = Search(*L,x); if (!i) { printf("Danh sach khong co %d",x); return 0; } do { Del_k(L,&x,i); i = Search(*L,x); } while (i); return 1; } int main() { List L; Init(&L); Input(&L); Output(L); int lua_chon; printf("Moi ban chon phep toan voi DS LKD:"); printf("\n1: Kiem tra DS rong"); printf("\n2: Do dai DS"); printf("\n3: Chen phan tu x vao vi tri k trong DS"); printf("\n4: Tim mot phan tu trong DS"); printf("\n5: Xoa phan tu tai vi tri k"); printf("\n6: XOa phan tu x trong DS"); printf("\n7: Thoat"); do { printf("\nBan chon: "); scanf("%d",&lua_chon); switch (lua_chon) { case 1: { if (Isempty(L)) printf("DS rong !"); else printf ("DS khong rong !"); break; } case 2: printf ("Do dai DS la: %d.",L.size);break; case 3: { item x; int k; printf ("Nhap vi tri can chen: "); scanf ("%d",&k); if (Insert_k(&L,x,k)) { printf ("DS sau khi chen:\n"); //xuat danh sach sau khi chen Output(L); } break; } case 4: { item x; printf ("Moi ban nhap vao phan tu can tim: "); scanf("%d",&x); int k=Search(L,x); if (k) printf ("Tim thay %d trong DS tai vi tri thu: %d",x,k); else printf ("Khong tim thay %d trong danh sach !",x); break; } case 5: { int k; item x; printf ("Nhap vi tri can xoa: "); scanf ("%d",&k); if (Del_k (&L,&x,k)) { printf ("DS sau khi xoa:\n"); Output(L); } break; } case 6: { item x; printf ("Nhap phan tu can xoa: "); scanf ("%d",&x); if (Del_x(&L,x)) { printf ("DS sau khi xoa:\n"); Output(L); } break; } case 7: break; } }while (lua_chon !=7); return 0; } ế ơ ằ ậ ỏ L p trình C: Bài 13 – Danh sách liên k t đ n cài b ng con tr ộ N i dung (cid:0) (cid:0) (cid:0) ặ
ở ạ
ể (cid:0) ộ (cid:0) (cid:0) ầ (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) 1. Cài đ t danh sách
ỗ
2 Kh i t o danh sách r ng
ỗ
3 Ki m tra danh sách r ng hay không
4 Tính đ dài danh sách
ạ
5 T o 1 Node trong danh sách
ị
6 Chèn Node P vào v trí đ u tiên
ị
7. Chèn Node P vào v trí k trong danh sách
ị
ầ ử
8 Tìm ph n t
co giá tr x trong danh sách
ầ
ầ ử ở ị
9 Xóa ph n t
v trí đ u tiên
ầ ư ở ị
v trí k
10. Xóa ph n t
ị
ầ ử
11. Xóa ph n t
có giá tr x
ỉ
ươ
ng trình hoàn ch nh (full)
12. Ch ặ ằ ể ượ ả ặ ằ
c cài đ t b ng m ng ho c b ng con tr . Trong bài vi t này ế
ẫ ẽ ướ ạ ử ụ ỏ
ọ ắ ạ ỏ ng d n các b n s d ng con tr :), Lo i danh sách này g i t ế
t là danh sách liên ấ ả ề ừ ư ế ẩ ờ ẫ c mình vi t code t bây gi ẽ
mình s xen l n t c đ u là chu n C, nh ng t
ể ạ Danh sách liên k t có th đ
mình s h
ế ơ
k t đ n
ướ
Trong các bài tr
ủ
ấ
chút c u trúc c a C++ nên code trong bài này b n đ trong file *.cpp nhé. ể ượ ế ả ư Danh sách liên k t có th đ c mô t nh sau: ế ơ
Danh sách liên k t đ n ể ỗ ữ ệ ủ
ớ ố ầ ử ế ỏ ỏ ớ ả ơ ể
Trong đó Data là d li u c a m i Node, có th là Sinh viên, công nhân,… (có ki u item, và
mình làm đ n gi n v i s nguyên), Next là con tr tr t ti p theo. i ph n t ặ 1. Cài đ t danh sách
code by nguyenvanquan7826
1
2
3
4
5
6
7 typedef int item; //kieu cac phan tu dinh nghia la item
typedef struct Node //Xay dung mot Node trong danh sach
{
item Data; //Du lieu co kieu item
Node *next; //Truong next la con tro, tro den 1 Node tiep theo
};
typedef Node *List; //List la mot danh sach cac Node ở ạ ỗ 2 Kh i t o danh sách r ng
code by nguyenvanquan7826 1
2
3
4 void Init (List &L) // &L lay dia chi cua danh sach ngay khi truyen vao ham
{
L=NULL; //Cho L tro den NULL
} ổ ượ ư ề ể
c đ có th thay đ i đ ướ ể
ỏ ờ ọ ị ủ ố
ướ ầ i g i hàm ta c n có & tr ề ị c giá tr c a đ i mà ta truy n vào hàm ta th òng
ử
c bi n tuy nhiên khi chúng ta s
ế
i g i hàm ta tiên hành truy n bi n ư ị ở ạ
ỉ
ế ướ
ở ề ộ ỉ Trong các bài tr
ế
dùng bi n con tr (*) và trong l
ỉ
ề
ụ
d ng cách truy n đ a ch ngay khi kh i t o hàm thì trong l
ả ấ
bình th òng mà không ph i l y đ a ch (thêm &) tr
ị
(Đây là m t cách truy n đ a ch cho bi n trong hàm ế
ờ ọ
ế ữ
c bi n n a.
C++.) ể ỗ ề ả ỏ 3 Ki m tra danh sách r ng hay không
Cái này kh i gi i thích nhi u: code by nguyenvanquan7826
int Isempty (List L)
1
{
2
return (L==NULL);
3
}
4 ộ ể ệ ừ ầ ệ ừ ế ế ố 4 Tính đ dài danh sách
Ta dùng 1 Node đ duy t t ừ
đ u đ n cu i, v a duy t v a đ m code by nguyenvanquan7826
int len (List L)
01
{
02
Node *P=L; //tao 1 Node P de duyet danh sach L
03
int i=0; //bien dem
04
while (P!=NULL) //trong khi P chua tro den NULL (cuoi danh sach thi lam)
05
{
06
i++; //tang bien dem
07
P=P>next; //cho P tro den Node tiep theo
08
}
09
return i; //tra lai so Node cua l
10
}
11 ứ ễ ả ả ấ ẽ
ớ ướ ẽ ạ
5 T o 1 Node trong danh sách
ệ ạ
Vi c t o 1 Node ch a thông tin trong danh sách s giúp ta d dàng chèn, xóa và qu n lý danh
ơ
sách h n. Tr c tiên ta s ph i c p phát vùng nh cho Node và sau đó gán Data vào là ok code by nguyenvanquan7826
1
2
3
4
5
6 Node *Make_Node (Node *P, item x) //tao 1 Node P chua thong tin la x
{
P = (Node *) malloc (sizeof (Node)); //Cap phat vung nho cho P
P>next = NULL; //Cho truong Next tro den NULL
P>Data = x; //Ghi du lieu vao Data
return P; 7 } ầ ị ỏ ế ỉ ệ ỏ ạ ề c tiên ta cho P tr đ n L, sau đó ch vi c cho L tr l i v P 6 Chèn Node P vào v trí đ u tiên
ướ
ầ
ể
Đ chèn P vào đ u danh sách tr
là ok ầ Chèn vào đ u danh sách liên két code by nguyenvanquan7826
1
2
3
4
5
6
7 void Insert_first (List &L, item x) //Chen x vao vi tri dau tien trong danh sach
{
Node *P;
P = Make_Node(P,x); //tao 1 Node P
P>next = L; //Cho P tro den L
L = P; //L tro ve P
} ướ ợ ệ ể ể ế ị ki m tra ti p chèn vào v trí 1
ỏ ế ế
không, n u h p l
ị ệ ế ớ ỏ ế ế ế ị
7. Chèn Node P vào v trí k trong danh sách
ị
ợ ệ
c tiên ta ki m tra v trí chèn có h p l
Tr
ệ ằ
ự
hay k >1 . V i k >1 ta th c hi n duy t b ng Node Q đ n v trí k1 sau đó cho P>Next tr đ n
Node Q>Next, ti p đ n cho Q>Next tr đ n P ử ị Chèn phàn t ế
vào v trí k trong danh sách liên k t code by nguyenvanquan7826
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21 void Insert_k (List &L, item x, int k) //chen x vao vi tri k trong danh sach
{
Node *P, *Q = L;
int i=1;
if (k<1 || k> len(L)+1) printf("Vi tri chen khong hop le !"); //kiem tra dieu kien
else
{
P = Make_Node(P,x); //tao 1 Node P
if (k == 1) Insert_first(L,x); //chen vao vi tri dau tien
else //chen vao k != 1
{
while (Q != NULL && i != k1) //duyet den vi tri k1
{
i++;
Q = Q>next;
}
P>next = Q>next;
Q>next = P;
}
}
} ầ ử co giá tr x trong danh sách ả ề ị ặ ế ế ấ ấ ị
ế ượ c 8 Tìm ph n t
ệ
Ta duy t danh sách cho đ n khi tìm th y ho c k t thúc và tr v v trí n u tìm th y, ng
ạ ả ề
l
i tr v 0 code by nguyenvanquan7826
01
02
03
04
05
06
07
08
09
10
11
12 int Search (List L, item x) //tim x trong danh sach
{
Node *P=L;
int i=1;
while (P != NULL && P>Data != x) //duyet danh sach den khi tim thay hoac ket thuc danh sach
{
P = P>next;
i++;
}
if (P != NULL) return i; //tra ve vi tri tim thay
else return 0; //khong tim thay
} ầ ử ở ị
ư ầ
v trí đ u tiên
ị ủ ầ ử ầ ỏ ế ề ế c tiên ta l u giá tr c a ph n t đ u tiên vào bi n x, sau đó ti n hành cho L tr đ n L 9 Xóa ph n t
ướ
Tr
>Next ầ ử ầ Xóa ph n t đ u tiên trong danh sách code by nguyenvanquan7826
1
2
3
4
5 void Del_frist (List &L, item &x) //Xoa phan tu dau tien
{
x = L>Data; //lay gia tri ra neu can dung
L = L>next; //Cho L tro den Node thu 2 trong danh sach
} ầ ư ở ị
ệ ế ỏ ế ầ ư ế ế k ti p k mà b qua k. ư ạ ị ầ ư i giá tr c n xóa tuy nhiên các b n c n l u l ỏ
ư
ạ ầ ư ạ
i nh ở ị v trí k
10. Xóa ph n t
ế
ị
Dùng P duy t đ n v trí k1 và ti n hành cho P>Next tr đ n ph n t
L u ý trong hình mình quên không l u l
khi xóa ầ
v trí đ u tiên. ầ ử ứ Xóa ph n t ế
th k trong danh sách liên k t code by nguyenvanquan7826
01
02
03
04
05
06
07
08
09
10
11
12 void Del_k (List &L, item &x, int k) //Xoa Node k trong danh sach
{
Node *P=L;
int i=1;
if (k<1 || k>len(L)) printf("Vi tri xoa khong hop le !"); //kiem tra dieu kien
else
{
if (k==1) Del_frist(L,x); //xoa vi tri dau tien
else //xoa vi tri k != 1
{
while (P != NULL && i != k1) //duyet den vi tri k1
{ 13
14
15
16
17
18
19 P=P>next;
i++;
}
P>next = P>next>next; //cho P tro sang Node ke tiep vi tri k
}
}
} ầ ử ị có giá tr x ằ ạ ị ậ ấ
i v trí tìm th y mà ta nh n 11. Xóa ph n t
ả
Đon gi n là ta tìm x trong danh sách b ng hàm Search và xóa t
cượ
đ code by nguyenvanquan7826
1
2
3
4 void Del_x (List &L, item x) //xoa phan tu x trong danh sach
{
while (Search(L,x)) Del_k (L,x,Search(L,x)); //trong khi van tim thay x thi van xoa
} ỉ
ỉ ỉ
ng trình hoàn ch nh (full)
ng trình hoàn ch nh
ng trình hoàn ch nh ươ
12. Ch
ươ
ể
click đ xem ch
ể
ươ
click đ xem ch
#include 025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068 L=NULL; //Cho L tro den NULL
}
int Isempty (List L)
{
return (L==NULL);
}
int len (List L)
{
Node *P=L; //tao 1 Node P de duyet danh sach L
int i=0; //bien dem
while (P!=NULL) //trong khi P chua tro den NULL (cuoi danh sach thi lam)
{
i++; //tang bien dem
P=P>next; //cho P tro den Node tiep theo
}
return i; //tra lai so Node cua l
}
Node *Make_Node (Node *P, item x) //tao 1 Node P chua thong tin la x
{
P = (Node *) malloc (sizeof (Node)); //Cap phat vung nho cho P
P>next = NULL; //Cho truong Next tro den NULL
P>Data = x; //Ghi du lieu vao Data
return P;
}
void Insert_first (List &L, item x) //Chen x vao vi tri dau tien trong danh sach
{
Node *P;
P = Make_Node(P,x); //tao 1 Node P
P>next = L; //Cho P tro den L
L = P; //L tro ve P
}
void Insert_k (List &L, item x, int k) //chen x vao vi tri k trong danh sach
{
Node *P, *Q = L;
int i=1;
if (k<1 || k> len(L)+1) printf("Vi tri chen khong hop le !"); //kiem tra dieu kien
else
{
P = Make_Node(P,x); //tao 1 Node P 069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112 if (k == 1) Insert_first(L,x); //chen vao vi tri dau tien
else //chen vao k != 1
{
while (Q != NULL && i != k1) //duyet den vi tri k1
{
i++;
Q = Q>next;
}
P>next = Q>next;
Q>next = P;
}
}
}
int Search (List L, item x) //tim x trong danh sach
{
Node *P=L;
int i=1;
while (P != NULL && P>Data != x) //duyet danh sach den khi tim thay hoac ket thuc danh sach
{
P = P>next;
i++;
}
if (P != NULL) return i; //tra ve vi tri tim thay
else return 0; //khong tim thay
}
void Del_frist (List &L, item &x) //Xoa phan tu dau tien
{
x = L>Data; //lay gia tri ra neu can dung
L = L>next; //Cho L tro den Node thu 2 trong danh sach
}
void Del_k (List &L, item &x, int k) //Xoa Node k trong danh sach
{
Node *P=L;
int i=1;
if (k<1 || k>len(L)) printf("Vi tri xoa khong hop le !"); //kiem tra dieu kien
else
{
if (k==1) Del_frist(L,x); //xoa vi tri dau tien
else //xoa vi tri k != 1
{
while (P != NULL && i != k1) //duyet den vi tri k1 113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156 {
P=P>next;
i++;
}
P>next = P>next>next; //cho P tro sang Node ke tiep vi tri k
}
}
}
void Del_x (List &L, item x) //xoa phan tu x trong danh sach
{
while (Search(L,x)) Del_k (L,x,Search(L,x)); //trong khi van tim thay x thi van xoa
}
void Input (List &L) //nhap danh sach
{
int i=0;
item x;
do
{
i++;
printf ("Nhap phan tu thu %d : ",i);
scanf("%d",&x);
if (x != 0) Insert_k(L,x,len(L)+1);
} while(x != 0); //nhap 0 de ket thuc
}
void Output (List L) //xuat danh sach
{
Node *P=L;
while (P != NULL)
{
printf("%5d",P>Data);
P = P>next;
}
printf("\n");
}
int main()
{
List L;
Init(L);
Input(L);
Output(L); 157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 int lua_chon;
printf("Moi ban chon phep toan voi DS LKD:");
printf("\n1: Kiem tra DS rong");
printf("\n2: Do dai DS");
printf("\n3: Chen phan tu x vao vi tri k trong DS");
printf("\n4: Tim mot phan tu trong DS");
printf("\n5: Xoa phan tu tai vi tri k");
printf("\n6: XOa phan tu x trong DS");
printf("\n7: Thoat");
do
{
printf("\nBan chon: ");
scanf("%d",&lua_chon);
switch (lua_chon)
{
case 1:
{
if (Isempty(L)) printf("DS rong !");
else printf ("DS khong rong !");
break;
}
case 2: printf ("Do dai DS la: %d.",len(L));break;
case 3:
{
item x;
int k;
printf ("Nhap phan tu can chen vao DS: ");
scanf("%d",&x);
printf ("Nhap vi tri can chen: ");
scanf ("%d",&k);
Insert_k (L,x,k);
printf ("DS sau khi chen:\n");
Output(L);
break;
}
case 4:
{
item x;
printf ("Moi ban nhap vao phan tu can tim: ");
scanf("%d",&x);
int k=Search(L,x);
if (k) printf ("Tim thay %d trong DS tai vi tri thu: %d",x,k);
else printf ("Khong tim thay %d trong danh sach !",x); 201
202
203
204
205
206
207 break;
}
case 5:
{
int k;
item x;
printf ("Nhap vi tri can xoa: ");
scanf ("%d",&k);
Del_k (L,x,k);
printf ("DS sau khi xoa:\n");
Output(L);
break;
}
case 6:
{
item x;
printf ("Nhap phan tu can xoa: ");
scanf ("%d",&x);
Del_x (L,x);
printf ("DS sau khi xoa:\n");
Output(L);
break;
}
case 7: break;
}
}while (lua_chon !=7);
return 0;
} ế ậ
ộ L p trình C: Bài 14 – Danh sách liên k t kép
N i dung (cid:0) (cid:0) ỗ ể (cid:0) (cid:0) ặ
ở ạ
ộ
ạ (cid:0) ị ầ (cid:0) ố ươ ự ư ầ ng t nh đ u danh sách (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) ỉ 1 Cài đ t danh sách
2 Kh i t o và ki m tra r ng
3. Đ dài danh sách
ứ
4. T o 1 Node P ch a thông tin
5. Chèn ph n t
6. Chèn ph n t
7. Chèn ph n t
8. Xóa ph n t
9. Xóa ph n t
10. Tìm ph n t
11. Xóa ph n t
ươ
12. Ch ầ ử
vào v trí đ u tiên
ầ ử
vào cu i danh sách t
ị
ầ ử
vào v trí k
ầ ử ầ
ố
đ u, cu i danh sách
ầ ử ở ị
v trí k
ầ ử
x trong DS
ầ ử
x trong DS
ng trình hoàn ch nh ộ ạ ầ ử ư ế ỗ ế ớ liên k t v i ầ ử ứ ế
ướ Danh sách liên k t kép cũng là m t d ng danh sách liên k t nh ng m i ph n t
ph n t c và sau nó trong danh sách đ ng tr ế Danh sách liên k t kép ặ ươ ư ố ố ớ ế ng đ i gi ng v i DSLKD nh ng có thêm ấ
ộ ướ 1 Cài đ t danh sách
ủ
C u trúc c a 1 Node trong danh sách liên k t kép t
ỏ ỏ ề
m t con tr tr v Node tr c nó code by nguyenvanquan7826
typedef int item;
01
02
typedef struct Node //cau truc 1 Node
03
{
04
item Data; //du lieu cua Node
05
Node *Left; //Con tro trai
06
Node *Right; //con tro phai
07
};
08
09
typedef struct DList //cau truc Cua List
10
{
11
Node *Head; //con tro dau
12
Node *Tail; //con tro cuoi
13
};
14 ấ ỏ ỏ ế ư ư ủ ầ ỏ ỏ ế ỏ ỏ ế ố ủ ầ C u trúc c a DSLKK không nh DSLKD có 1 Con tr tr đ n đ u DS, nh ng DSLKK ngoài
con tr tr đ n đ u danh sách còn có thêm 1 con tr tr đ n Node cu i c a danh sách ể ở ạ ố ỏ ở ạ ỉ ầ ể ỗ ỗ
ỏ ầ ỏ ề ủ 2 Kh i t o và ki m tra r ng
ỏ
Kh i t o ta cho 2 con tr đ u và cu i tr vê NULL, Khi ki m tra r ng thi ch c n xem con tr
ầ
đ u có tr v NULL không là đ code by nguyenvanquan7826
01
02
03
04
05
06
07
08
09
10 void Init(DList &L)
{
L.Head = NULL; // Con tro dau tro den NULL
L.Tail = NULL; // Con tro cuoi tro den NULL
}
int Isempty (DList L) //kiem tra DS rong
{
return (L.Head == NULL);
} ộ ủ ứ ể ố ỏ ư
ỏ ở ầ ố ể ế ư ố 3. Đ dài danh sách
ộ
ể
ệ
Đ tìm đ dài c a DSLKK ta hoàn toàn có th làm gi ng nh DSLKD, t c dùng con tr duy t
ể
ế
ừ ầ
đ u đ n cu i, nh ng trong DSLKK ta có th dùng 2 con tr
t đ u và cu i đ đ m code by nguyenvanquan7826 01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16 int Len (DList L) // Do dai danh sach
{
Node *PH = L.Head, *PT = L.Tail; //tao Node PH (con tro duyet tu dau DS) vÃ
PT (con tro duyet tu cuoi DS) de duyet danh sach L
int i = 0; //bien dem
if (PH != NULL) i = 1;
while (PH != NULL) //trong khi P chua tro den NULL (cuoi danh sach thi lam)
{
if (PH == PT) break;
PH = PH>Right; //cho PH tro den Node tiep theo
i++;
if (PH == PT) break;
PT = PT>Left; //cho PT tro den Node truoc do
i++;
}
return i; //tra lai so Node cua L
} ạ ứ 4. T o 1 Node P ch a thông tin
code by nguyenvanquan7826
1
2 Node *Make_Node (item x) //tao 1 Node P chua thong tin la x
{ 3
4
5
6
7
8 Node *P = (Node *) malloc (sizeof (Node)); //Cap phat vung nho cho P
P>Data = x; //Ghi du lieu vao Data
P>Left = NULL;
P>Right = NULL;
return P;
} ầ ử ầ ị ướ ế ầ c khi chèn vào đ u danh sách c n ki m tra xem danh sách r ng hay không. N u danh sách ể
ế ỏ ế ỗ
ệ ự ề ỗ vào v trí đ u tiên
5. Chèn ph n t
ầ
Tr
ỗ
r ng ta cho Head và Tail đ u tr đ n P. N u không r ng th c hi n chèn. code by nguyenvanquan7826
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16 void Insert_first (DList &L, item x) //Chen x vao vi tri dau tien trong danh sach
{
Node *P;
P = Make_Node(x); //tao 1 Node P
if (Isempty(L)) //Neu danh sach rong
{
L.Head = P;
L.Tail = P;
}
else
{
P>Right = L.Head;
L.Head>Left = P;
L.Head = P;
}
} ố ươ ự ư ầ ng t nh đ u danh sách vào cu i danh sách t ầ ử
6. Chèn ph n t
code by nguyenvanquan7826
01
02
03
04
05
06
07
08
09
10
11
12
13
14 void Insert_last (DList &L, item x) //Chen x vao vi tri cuoi trong danh sach
{
Node *P;
P = Make_Node(x); //tao 1 Node P
if (Isempty(L)) //Neu danh sach rong
{
L.Head = P;
L.Tail = P;
}
else
{
L.Tail>Right = P; //ket noi voi danh sach
P>Left = L.Tail; //P tro ve Node truoc
L.Tail = P; //luu lai vi tri cuoi 15
16 }
} ầ ử ướ ể ả ầ ố ợ ị ị c khi chèn vào v trí k c n ki m tra v trí k có phù h p, có ph i đ u danh sách hay cu i ị
vào v trí k
ầ
ữ ự ệ ế 7. Chèn ph n t
Tr
danh sách. N u chèn vào gi a danh sách ta th c hi n theo 4 b ướ
c ế ị Chèn x vào v trí k trong danh sách liên k t kép code by nguyenvanquan7826
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22 void Insert_k (DList &L, item x, int k) //chen x vao vi tri k trong danh sach
{
Node *PH = L.Head, *PT, *R;
int i=1, l = Len(L);
if (k<1 || k> l+1) printf("Vi tri chen khong hop le !"); //kiem tra dieu kien
else
{
R = Make_Node(x); //tao 1 Node P
if (k == 1) Insert_first(L,x); //chen vao vi tri dau tien
else
if (k == l+1) Insert_last(L,x); //chen vao vi tri cuoi
else //chen vao vi tri 1 23
24
25
26 PT>Left = R; //(4)
}
}
} ố đ u, cu i danh sách ầ ử ầ
8. Xóa ph n t
code by nguyenvanquan7826
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20 // Lay gia tri can xoa ra, sau do bo qua 1 Node dau tien
void Del_first (DList &L, item &x) //Xoa phan tu dau tien
{
if (!Isempty(L))
{
x = L.Head>Data; //lay gia tri ra neu can dung
L.Head = L.Head>Right; //Cho L tro den Node thu 2 trong danh sach
}
}
// Lay gia tri can xoa ra, sau do bo qua 1 Node cuoi
void Del_last (DList &L, item &x) //Xoa phan tu dau tien
{
if (!Isempty(L))
{
x = L.Tail>Data;
L.Tail = L.Tail>Left;
L.Tail>Right = NULL;
}
} v trí k
ầ ả ầ ể ợ ố ị ầ ử ở ị
ở ị
v trí k c n ki m tra v trí k có phù h p, có ph i đ u danh sách hay cu i danh 9. Xóa ph n t
ướ
c khi xóa
Tr
ở ữ
gi a
sách hay code by nguyenvanquan7826
01
02
03
04
05
06
07
08
09
10
11
12 void Del_k (DList &L, item &x, int k) //Xoa Node k trong danh sach
{
Node *PH = L.Head, *PT;
int i=1, l = Len(L);
if (k<1 || k> l) printf("Vi tri xoa khong hop le !"); //kiem tra dieu kien
else
{
if (k == 1) Del_first(L,x); //xoa vi tri dau tien
else
if (k == l) Del_last(L,x); //xoa vi tri cuoi
else //xoa vi tri 1 13
14
15
16
17
18
19
20
21
22
23
24 while (PH != NULL && i != k1) //duyet den vi tri k1
{
i++;
PH = PH>Right;
}
x = PH>Right>Data;
PT = PH>Right>Right; //xac dinh vi tri k+1
PH>Right = PT;
PT>Left = PH;
}
}
} ầ ử
10. Tìm ph n t
x trong DS
code by nguyenvanquan7826
01
02
03
04
05
06
07
08
09
10
11
12 int Search (DList L, item x) //tim x trong danh sach
{
Node *P=L.Head;
int i=1;
while (P != NULL && P>Data != x) //duyet danh sach den khi tim thay hoac ket thuc danh sach
{
P = P>Right;
i++;
}
if (P != NULL) return i; //tra ve vi tri tim thay
else return 0; //khong tim thay
} ầ ử
x trong DS
11. Xóa ph n t
code by nguyenvanquan7826
1
2
3
4
5
6
7
8
9 void Del_x (DList &L, item x) //xoa phan tu x trong danh sach
{
int l = Search(L,x);
while (l)
{
Del_k (L,x,l); //trong khi van tim thay x thi van xoa
l = Search(L,x);
}
} ng trình hoàn ch nh ỉ
ỉ ươ
ươ ỉ
ng trình hoàn ch nh
ng trình hoàn ch nh ươ
12. Ch
ể
click đ xem ch
ể
click đ xem ch
001
002 #include 003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046 typedef int item;
typedef struct Node //cau truc 1 Node
{
item Data; //du lieu cua Node
Node *Left; //Con tro trai
Node *Right; //con tro phai
};
typedef struct DList //cau truc Cua List
{
Node *Head; //con tro dau
Node *Tail; //con tro cuoi
};
void Init(DList &L);
int Isempty (DList L); //kiem tra DS rong
int Len (DList L); // Do dai danh sach
Node *Make_Node (Node *P, item x); //tao 1 Node P chua thong tin la x
void Insert_first (DList &L, item x);
void Insert_last (DList &L, item x);
void Insert_k (DList &L, item x, int k); //chen x vao vi tri k trong danh sach
void Del_first (DList &L, item &x); //Xoa phan tu dau tien
void Del_k (DList &L, item &x, int k); //Xoa Node k trong danh sach
int Search (DList L, item x); //tim x trong danh sach
void Del_x (DList &L, item x); //xoa phan tu x trong danh sach
void Input (DList &L); //nhap danh sach
void Output (DList L); //xuat danh sach
void Init(DList &L)
{
L.Head = NULL; // Con tro dau tro den NULL
L.Tail = NULL; // Con tro cuoi tro den NULL
}
int Isempty (DList L) //kiem tra DS rong
{
return (L.Head == NULL);
}
int Len (DList L) // Do dai danh sach
{
Node *PH = L.Head, *PT = L.Tail; //tao Node PH (con tro duyet tu dau DS) và 047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090 (con tro duyet tu cuoi DS) de duyet danh sach L
int i = 0; //bien dem
if (PH != NULL) i = 1;
while (PH != NULL) //trong khi P chua tro den NULL (cuoi danh sach thi lam)
{
if (PH == PT) break;
PH = PH>Right; //cho PH tro den Node tiep theo
i++;
if (PH == PT) break;
PT = PT>Left; //cho PT tro den Node truoc do
i++;
}
return i; //tra lai so Node cua L
}
Node *Make_Node (item x) //tao 1 Node P chua thong tin la x
{
Node *P = (Node *) malloc (sizeof (Node)); //Cap phat vung nho cho P
P>Data = x; //Ghi du lieu vao Data
P>Left = NULL;
P>Right = NULL;
return P;
}
void Insert_first (DList &L, item x)
{
Node *P;
P = Make_Node(x); //tao 1 Node P
if (Isempty(L)) //Neu danh sach rong
{
L.Head = P;
L.Tail = P;
}
else
{
P>Right = L.Head;
L.Head>Left = P;
L.Head = P;
}
}
//Chen vao cuoi danh sach cung tuong tu
void Insert_last (DList &L, item x)
{ 091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134 Node *P;
P = Make_Node(x); //tao 1 Node P
if (Isempty(L)) //Neu danh sach rong
{
L.Head = P;
L.Tail = P;
}
else
{
L.Tail>Right = P; //ket noi voi danh sach
P>Left = L.Tail; //P tro ve Node truoc
L.Tail = P; //luu lai vi tri cuoi
}
}
void Insert_k (DList &L, item x, int k) //chen x vao vi tri k trong danh sach
{
Node *PH = L.Head, *PT, *R;
int i=1, l = Len(L);
if (k<1 || k> l+1) printf("Vi tri chen khong hop le !"); //kiem tra dieu kien
else
{
R = Make_Node(x); //tao 1 Node P
if (k == 1) Insert_first(L,x); //chen vao vi tri dau tien
else
if (k == l+1) Insert_last(L,x); //chen vao vi tri cuoi
else //chen vao vi tri 1 135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178 if (!Isempty(L))
{
x = L.Head>Data; //lay gia tri ra neu can dung
L.Head = L.Head>Right; //Cho L tro den Node thu 2 trong danh sach
}
}
void Del_last (DList &L, item &x) //Xoa phan tu dau tien
{
if (!Isempty(L))
{
x = L.Tail>Data;
L.Tail = L.Tail>Left;
L.Tail>Right = NULL;
}
}
void Del_k (DList &L, item &x, int k) //Xoa Node k trong danh sach
{
Node *PH = L.Head, *PT;
int i=1, l = Len(L);
if (k<1 || k> l) printf("Vi tri xoa khong hop le !"); //kiem tra dieu kien
else
{
if (k == 1) Del_first(L,x); //xoa vi tri dau tien
else
if (k == l) Del_last(L,x); //xoa vi tri cuoi
else //xoa vi tri 1 179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222 Node *P=L.Head;
int i=1;
while (P != NULL && P>Data != x) //duyet danh sach den khi tim thay hoac ket
thuc danh sach
{
P = P>Right;
i++;
}
if (P != NULL) return i; //tra ve vi tri tim thay
else return 0; //khong tim thay
}
void Del_x (DList &L, item x) //xoa phan tu x trong danh sach
{
int l = Search(L,x);
while (l)
{
Del_k (L,x,l); //trong khi van tim thay x thi van xoa
l = Search(L,x);
}
}
void Input (DList &L) //nhap danh sach
{
int i=0;
item x;
do
{
i++;
printf ("Nhap phan tu thu %d : ",i);
scanf("%d",&x);
if (x != 0) Insert_k(L,x,Len(L)+1);
} while(x != 0); //nhap 0 de ket thuc
}
void Output (DList L) //xuat danh sach
{
Node *P=L.Head;
while (P != L.Tail>Right)
{
printf("%5d",P>Data);
P = P>Right;
} 223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266 printf("\n");
}
int main()
{
DList L;
Init(L);
Input(L);
Output(L);
int lua_chon;
printf("Moi ban chon phep toan voi DS LKD:");
printf("\n1: Kiem tra DS rong");
printf("\n2: Do dai DS");
printf("\n3: Chen phan tu x vao vi tri k trong DS");
printf("\n4: Tim mot phan tu trong DS");
printf("\n5: Xoa phan tu tai vi tri k");
printf("\n6: XOa phan tu x trong DS");
printf("\n7: Thoat");
do
{
printf("\nBan chon: ");
scanf("%d",&lua_chon);
switch (lua_chon)
{
case 1:
{
if (Isempty(L)) printf("DS rong !");
else printf ("DS khong rong !");
break;
}
case 2: printf ("Do dai DS la: %d.",Len(L));break;
case 3:
{
item x;
int k;
printf ("Nhap phan tu can chen vao DS: ");
scanf("%d",&x);
printf ("Nhap vi tri can chen: ");
scanf ("%d",&k);
Insert_k (L,x,k);
printf ("DS sau khi chen:\n");
Output(L);
break; 267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301 }
case 4:
{
item x;
printf ("Moi ban nhap vao phan tu can tim: ");
scanf("%d",&x);
int k=Search(L,x);
if (k) printf ("Tim thay %d trong DS tai vi tri thu: %d",x,k);
else printf ("Khong tim thay %d trong danh sach !",x);
break;
}
case 5:
{
int k;
item x;
printf ("Nhap vi tri can xoa: ");
scanf ("%d",&k);
Del_k (L,x,k);
printf ("DS sau khi xoa:\n");
Output(L);
break;
}
case 6:
{
item x;
printf ("Nhap phan tu can xoa: ");
scanf ("%d",&x);
Del_x (L,x);
printf ("DS sau khi xoa:\n");
Output(L);
break;
}
case 7: break;
}
}while (lua_chon !=7);
return 0;
} ậ ế ặ ệ ạ ầ ự mà phép chèn và xóa đ c th c hi n t i đ u ế
ố ủ ọ ầ ườ ủ ỉ L p trình C: Bài 15 – Cài đ t ngăn x p (Stack)
ứ ự
ộ
Ngăn x p (Stack) là m t danh sách có th t
ố
cu i c a danh sách và ng ượ
i ta g i đ u cu i này là đ nh (top) c a stack ể ặ ả ỏ ộ Trong bài này chúng ta tìm hi u cách cài đ t Stack trên m ng và trên con tr
N i dung (cid:0) ả ỗ ể ầ ỗ ư vào Stack (Push)
i Top nh ng không xóa (Peak) i Top (Pop)
ng trình (full) (cid:0) ặ
1. Stack cài đ t trên m ng
ở ạ
1.1 Kh i t o danh sách r ng, ki m tra danh sách r ng, đ y
ầ ử
1.2 Thêm ph n t
ấ ữ ệ ạ
1.3 L y d li u t
ấ ữ ệ ạ
1.4 Xóa và l y d li u t
ộ ươ
1.5 Code toàn b ch
ỏ
ặ
2. Stack cài đ t trên con tr ấ ỗ ể ỗ ộ ạ ư vào Stack (Push)
i Top nh ng không xóa (Peak) ấ ữ ệ ạ
i Top (Pop)
ỉ ươ ng trình hoàn ch nh (full code) (cid:0) ự
2.1 Xây d ng c u trúc
ở ạ
2.2 Kh i t o danh sách r ng, ki m tra danh sách r ng, đ dài danh sách
2.3 T o 1 Node
ầ ử
2.4 Chèn ph n t
ấ ữ ệ ạ
2.5 L y d li u t
2.6 Xóa và l y d li u t
2.7 Ch
ử ụ ẵ (cid:0) ủ 3. S d ng Stack có s n trong C++
4. VÍ d v ng d ng c a Stack
ả ụ ề ứ
ụ
ặ
1. Stack cài đ t trên m ng
code by nguyenvanquan7826 #define Max 100 //so phan tu toi da cua Stack 1 typedef int item; //kieu du lieu cua Stack 2 struct Stack 3 { 4 int Top; //Dinh Top 5 item Data[Max]; //Mang cac phan tu 6 7 }; ở ạ ỗ ể ầ
ỗ
1.1 Kh i t o danh sách r ng, ki m tra danh sách r ng, đ y
code by nguyenvanquan7826 void Init (Stack &S) //khoi tao Stack rong 01 02 { 03 S.Top = 0; //Stack rong khi Top la 0 04 } 05 06 int Isempty(Stack S) //kiem tra Stack rong 07 { 08 return (S.Top == 0); 09 } 10 11 int Isfull(Stack S) //kiem tra Stack day 12 { 13 return (S.Top == Max); // 14 } ầ ử vào Stack (Push) ầ ử ể ơ ị 1.2 Thêm ph n t
Đ chèn thêm ph n t ị
vào Stack ta chèn vào v trí Top, và tang Top lên 1 đ n v code by nguyenvanquan7826 void Push(Stack &S, item x) //them phan tu vao Stack 1 2 { if (!Isfull(S)) 3 4 { S.Data[S.Top] = x; //Gan du lieu 5 S.Top ++; //Tang Top len 1 6 7 } 8 } ấ ữ ệ ạ ư i Top nh ng không xóa (Peak) 1.3 L y d li u t
code by nguyenvanquan7826 int Peak(Stack S) //Lay phan tu o dau Stack nhung khong xoa 1 2 { return S.Data[S.Top1]; //Lay du lieu tai Top 3 4 } ấ ữ ệ ạ 1.4 Xóa và l y d li u t i Top (Pop) code by nguyenvanquan7826 1 int Pop(Stack &S) //Loai bo phan tu khoi Stack 2 { 3 if (!Isempty(S)) 4 { S.Top ; //Giam Top 5 return S.Data[S.Top]; //Lay du lieu tai Top 6 7 } 8 } ộ ươ
ươ ỉ 1.5 Code toàn b ch
ể
click đ xem ch ng trình (full)
ng trình hoàn ch nh ỏ ạ ơ ể ấ ng nh ng link ho t h n vì nó dùng con trỏ đ c p ườ
ế ị ừ ặ ả ự
link d phòng
ặ
2. Stack cài đ t trên con tr
ư
ỏ ẫ
Stack trên con tr v n là stack bình th
ả
phát và qu n lý, không b th a ho c thi u gì c . ấ ự
2.1 Xây d ng c u trúc
code by nguyenvanquan7826 typedef int item; //kieu du lieu 01 struct Node 02 03 { item Data; //du lieu 04 Node *Next; //link 05 06 }; typedef struct Stack 07 08 { Node *Top; 09 10 }; ở ạ ỗ ộ ể ỗ
2.2 Kh i t o danh sách r ng, ki m tra danh sách r ng, đ dài danh sách
code by nguyenvanquan7826 01 void Init (Stack &S) //khoi tao Stack rong 02 { 03 S.Top = NULL; 04 } 05 06 int Isempty(Stack S) //kiem tra Stack rong 07 { 08 return (S.Top == NULL); 09 } 10 11 int Len (Stack S) 12 { Node *P = S.Top; 13 int i=0; 14 while (P != NULL) //trong khi chua het Stack thi van duyet 15 { 16 i++; 17 P = P>Next; 18 } 19 return i; 20 } 21 ạ 2.3 T o 1 Node
code by nguyenvanquan7826 1 Node *MakeNode(item x) //tao 1 Node 2 { 3 Node *P = (Node*) malloc(sizeof(Node)); 4 P>Next = NULL; 5 P>Data = x; 6 return P; 7 } vào Stack (Push)
ỉ ầ ỏ ạ ỏ ồ ỏ
vào Stack thì ch c n cho con tr Note đó tr và Top, r i Top tr l i nó là ầ ử
2.4 Chèn ph n t
ầ ử
ể
Đ chèn ph n t
xong code by nguyenvanquan7826 void Push(Stack &S, item x) //them phan tu vao Stack 1 { 2 Node *P = MakeNode(x); 3 P>Next = S.Top; 4 S.Top = P; 5 } 6 ấ ữ ệ ạ ư i Top nh ng không xóa (Peak) 2.5 L y d li u t
code by nguyenvanquan7826 int Peak(Stack S) //Lay phan tu o dau Stack nhung khong xoa 1 { 2 return S.Top>Data; 3 } 4 ấ ữ ệ ạ i Top (Pop)
ị
ỏ ế ỉ ầ ứ ỏ 2.6 Xóa và l y d li u t
Ta ch c n cho con tr Top tr đ n v trí th 2 thôi. code by nguyenvanquan7826 int Pop(Stack &S) //Loai bo phan tu khoi Stack 1 { 2 if (!Isempty(S)) 3 { 4 item x = S.Top>Data; //luu lai gia tri 5 S.Top = S.Top>Next; //Xoa phan tu Top 6 return x; 7 } 8 } 9 ng trình hoàn ch nh (full code) ươ ỉ ươ
2.7 Ch
ể
click đ xem ch ỉ
ng trình hoàn ch nh ẵ ỉ ệ ứ ế ự ẵ ng th c (hàm) liên quan đ n Stack, ta ch vi c khai báo ự
link d phòng
ử ụ
3. S d ng Stack có s n trong C++
ươ
Trong C++ đã xây d ng s n các ph
ử ụ
và s d ng
code by nguyenvanquan7826 #include #include 03 using namespace std; 04 05 int main() { 06 stack 08 for (int i = 0; i < 10; i++) { 09 S.push(i*78 + 26); // chen cac phan tu vao stack 10 } 11 12 cout << "Do dai stack: " << S.size() << "\n"; 13 14 // xuat tat ca phan tu trong stack 15 while (!S.empty()) { // trong khi stack chua trong 16 int x = S.top(); // lay gia tri top 17 S.pop(); // loai bo khoi stack 18 cout << x << " "; 19 } 20 cout << "\n"; 21 22 return 0; 23 } 24 ủ ụ ụ ề ứ ổ ơ ố ề ứ ụ ể ể ẽ ụ
ơ ố ậ ừ ứ
bàn phím 4. VÍ d v ng d ng c a Stack
Stack có nhi u ng d ng, sau đây là 1 ng d ng trong chuy n đ i c s . Code sau s chuy n
ố ơ ố
s c s 10 sang c s x nh p t
code by nguyenvanquan7826 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ậ ự ế ợ ơ ế ti ng Anh: First In ộ ấ
ướ ư ỉ ấ ỏ ệ
ng làm vi c theo c ch FIFO (vi
ể ượ
ng có th đ
ệ ở ố ễ ợ ố ượ
ố ượ
ợ
c phép l y ra kh i hàng đ i. Vi c thêm m t đ i t ế ắ ừ ế
t t
t t
ợ ấ ỳ
c thêm vào hàng đ i b t k lúc nào, nh ng ch
ộ ố ượ
ng luôn di n ra cu i hàng đ i và ầ ử ừ ầ ợ L p trình C: Bài 16 – Xây d ng ngăn x p (Queue)
ữ ệ
ể ứ
Hàng đ i (Queue) là m t c u trúc d li u dùng đ ch a các đ i t
ướ
ợ
First Out), nghĩa là “vào tr
c” Trong hàng đ i, các đ i t
c ra tr
ầ
ớ ượ
ố ượ
có đ i t
ng thêm vào đ u tiên m i đ
ượ ấ
ộ
đ u hàng đ i.
m t ph n t c l y ra t luôn đ ộ N i dung (cid:0) ả ặ
1. Queue cài đ t trên m ng
ở ạ
ể ỗ
ỗ ầ ố
đ u Queue (Pop)
ầ ử ầ đ u Queue ợ 1.1 Kh i t o Queue r ng.
1.2 Ki m tra Queue r ng, đ y
ầ ử
1.3 Thêm ph n t
vào cu i Queue (Push)
ầ ử ầ
1.4 Xóa ph n t
1.5 Xem thông tin ph n t
1.6 hàng đ i vòng (Queue Circular) ỉ ng trình hoàn ch nh (full code) 1.7 Ch (cid:0) ấ ỗ ạ ố
vào cu i Queue đ u Queue ỉ ng trình hoàn ch nh (full code) (cid:0) ươ
ỏ
ặ ằ
2. Queue cài đ t b ng con tr
ự
2.1 Xây d ng c u trúc
ở ạ
2.2 Kh i t o.
ể
2.3. Ki m tra r ng
2.4 T o 1 Node P
ầ ử
2.5 Thêm ph n t
ầ ử ầ
2.6 Xóa ph n t
ươ
2.7 Ch
ử ụ (cid:0) Ứ ụ ủ ẵ
3. S d ng Quêu có s n trong C++
4. ng d ng c a queue ả ế ể ễ ằ ở ầ ố ế
trong Stack b ng cách dùng 1 bi n đ m (count) đ cho d dàng, và ph n Queue ể ế
ế ầ ử
ấ ẽ ử ụ ặ
1. Queue cài đ t trên m ng
bàiỞ Stack, chúng ta có th đ m s ph n t
ế
này tôi s s d ng bi n đ m đó trong c u trúc.
code by nguyenvanquan7826 #define Max 5 //so phan tu toi da cua Queue 1 typedef int item; //kieu du lieu 2 3 struct Queue 4 5 { 6 int Front, Rear; //front: phan tu dau hang, rear: phan tu cuoi hang 7 item Data[Max]; //Mang cac phan tu 8 int count; //dem so phan tu cua Queue 9 }; ỗ ở ạ
ở ạ ầ ư ị ể ề ề ề ỗ 1.1 Kh i t o Queue r ng.
Đ kh i t o Queue r ng ta c n đ a v trí Front v 0, Rear v 1, cout v 0.
code by nguyenvanquan7826 1 void Init (Queue &Q) //khoi tao Queue rong 2 { 3 Q.Front = 0; //phan tu dau 4 Q.Rear = 1; // phan tu cuoi o 1 (khong co phan tu trong Q) Q.count = 0; //so phan tu bang 0 5 6 } ể ỗ
ỉ ầ ể ỗ ớ ầ
1.2 Ki m tra Queue r ng, đ y
ể
ầ
Ki m tra r ng đ y ch c n ki m tra count so v i 0 và max
code by nguyenvanquan7826 int Isempty (Queue Q) //kiem tra Queue rong 01 02 { if (Q.count == 0) //so phan tu = 0 => rong 03 return 1; 04 return 0; 05 06 } 07 int Isfull (Queue Q) //kiem tra Queue day 08 09 { if (Q.count == Max) //so phan tu = Max => day 10 return 1; 11 return 0; 12 13 } ố vào cu i Queue (Push)
ị
ư ầ ử
ủ ị 1.3 Thêm ph n t
Tăng v trí c a Rear lên 1 và đ a data vào v trí đó code by nguyenvanquan7826 void Push(Queue &Q, item x) //them phan tu vao cuoi Queue 1 2 { if (Isfull(Q)) printf("Hang doi day !"); 3 4 else 5 { Q.Data[++Q.Rear] = x; //tang Rear len va gan phan tu vao 6 Q.count++; //tang so phan tu len 7 8 } 9 } ướ ự ệ ể ế ỗ ầ ử ề ầ ằ c tiên ph i ki m tra Queue r ng không, n u không r ng ta th c hi n di chuy n các ph n t trong hàng v đ u hàng b ng ầ ử ầ
đ u Queue (Pop)
ỗ
ể
ư ế ả ố ố 1.4 Xóa ph n t
ả
Tr
vòng for (gi ng nh x p hàng khi mua hàng) sau đó gi m Rear và count xu ng. code by nguyenvanquan7826 int Pop(Queue &Q) //Loai bo phan tu khoi dau hang doi 01 { 02 if (Isempty(Q)) printf("Hang doi rong !"); 03 else 04 { 05 item x = Q.Data[Q.Front]; 06 for (int i=Q.Front; i Q.Data[i] = Q.Data[i+1]; 08 Q.Rear; // giam vi tri phan tu cuoi xuong 09 Q.count;//giam so phan tu xuong 10 return x; //tra ve phan tu lay ra 11 12 } 13 } ầ ử ầ đ u Queue 1.5 Xem thông tin ph n t
code by nguyenvanquan7826 item Qfront (Queue Q) //xem thong tin phan tu dau hang 1 2 { if (Isempty(Q)) printf("Hang doi rong !"); 3 else return Q.Data[Q.Front]; 4 5 } ợ ấ ợ ể ầ ả ể i là khi xóa ph n t đ u Queue chúng ta c n di chuy n ầ ử ầ
ư ề ướ ầ ử ấ
ề ụ ể ả ắ ả ớ ử ượ ự
phía sau v tr đ c 1.6 hàng đ i vòng (Queue Circular)
ự
ư
Nh trên chúng ta xây d ng Queue d a vào m ng, và th y 1 đi m b t l
ể
ấ ả
t c các ph n t
t
c. Đ kh c ph c đi u này chúng ta có th coi m ng đó nh 1 m ng v i các phân t
ế
x p vòng tròn. ầ ử ơ ả ở ố ả cu i m ng ầ ư
đ n gi n, tuy nhiên c n l u ý khi thêm và xóa ph n t
ậ ầ ử
ở ể
ắ ụ ư ể ế mà Rear và Front
ẽ ở ề ị
Max thì s tr v v trí 0. Khi đó ta có th thêm, xóa các ph n t
(Max1). Đ kh c ph c ta chia Front và Rear lây d cho Max. V y là N u Front và Rear
code by nguyenvanquan7826 void Push_Circular(Queue &Q, item x) //them phan tu vao cuoi hang doi vong 01 02 { if (Isfull(Q)) printf("Hang doi day !"); 03 04 else 05 { Q.Data[(++Q.Rear) % Max] = x; 06 //tang Rear len va gan phan tu vao, Neu Rear dang o vi tri Max1 thi tang ve vi tri 0 07 Q.count++; //tang so phan tu len 08 09 } 10 } 11 int Pop_Circular(Queue &Q) //Loai bo phan tu khoi dau hang doi vong 12 13 { 14 if (Isempty(Q)) printf("Hang doi rong !"); 15 item x = Q.Data[Q.Front]; Q.Front = (Q.Front++) % Max; //tang vi tri phan dau tien len,neu dang o Max1 thi ve 0 16 17 Q.count;//giam so phan tu xuong 18 return x; //tra ve phan tu lay ra 19 } ng trình hoàn ch nh (full code) ươ ỉ ươ
1.7 Ch
ể
click đ xem ch ỉ
ng trình hoàn ch nh ặ ằ ỏ ự
link d phòng
2. Queue cài đ t b ng con tr ấ ự
2.1 Xây d ng c u trúc
code by nguyenvanquan7826 typedef int item; //kieu du lieu 01 02 struct Node 03 { item Data; 04 Node * Next; 05 06 }; struct Queue 07 08 { 09 Node * Front, *Rear; //Node dau va Node cuoi 10 int count; //dem so phan tu 11 }; ở ạ ở ạ ỏ ề 2.2 Kh i t o.
Kh i t o Queue ta cho Front và Rear cùng tr v NULL, count =0.
code by nguyenvanquan7826 1 void Init(Queue &Q) 2 { 3 Q.Front = Q.Rear = NULL; 4 Q.count = 0; 5 } ể ỗ 2.3. Ki m tra r ng
code by nguyenvanquan7826 1 int Isempty (Queue Q) //kiem tra Queue rong 2 { 3 if (Q.count == 0) //so phan tu = 0 => rong 4 return 1; 5 return 0; 6 } ạ 2.4 T o 1 Node P code by nguyenvanquan7826 Node *MakeNode(item x) //tao 1 Node 1 2 { Node *P = (Node*) malloc(sizeof(Node)); 3 4 P>Next = NULL; 5 P>Data = x; 6 return P; 7 } ầ ử ố
vào cu i Queue ớ ạ ỏ ề ứ ể ế ả ỗ ỗ , ta ki m tra xem hàng có r ng không, n u hàng r ng thì cho c Front và Rear cùng tr v Node P m i t o ch a ầ ỏ ề ế ề ỏ ỗ 2.5 Thêm ph n t
ầ ử
ể
Đ thêm ph n t
phàn
ử
t x c n thêm. N u không r ng ta tr Rear>Next v P và Rear tr v P. Tăng count lên 1 code by nguyenvanquan7826 01 void Push(Queue &Q, item x) //them phan tu vao cuoi Queue 02 { Node *P = MakeNode(x); //Neu Q rong 03 if (Isempty(Q)) 04 05 { Q.Front = Q.Rear = P; //dau va cuoi deu tro den P 06 07 } 08 else //Khong rong 09 { 10 Q.Rear>Next = P; 11 Q.Rear = P; 12 } 13 Q.count ++ ; //tang so phan tu len 14 } ầ ử ầ đ u Queue
ỗ ể ế ể ơ ầ ử ế ầ ử ở ạ , n u có 1 ph n t thì ta kh i t o ề ế ế ả ố ơ 2.6 Xóa ph n t
ỗ
Ta ki m tra Queue có r ng không, N u không r ng ki m tra xem có 1 hay nhiêu h n 1 ph n t
ỏ ế
ạ
l i Queue, n u có nhi u h n ta cho Front tr đ n ti p theo. Gi m count xu ng 1. code by nguyenvanquan7826 int Pop(Queue &Q) //Loai bo phan tu khoi dau hang doi 01 { 02 if (Isempty(Q)) 03 { 04 printf("Hang doi rong !"); 05 return 0; 06 } 07 else 08 { 09 10 item x = Q.Front>Data; 11 if (Q.count == 1) //neu co 1 phan tu Init(Q); 12 else 13 Q.Front = Q.Front>Next; 14 Q.count ; 15 return x; //tra ve phan tu lay ra 16 17 } 18 } ng trình hoàn ch nh (full code) ươ ỉ ươ
2.7 Ch
ể
click đ xem ch ỉ
ng trình hoàn ch nh ẵ ượ ỉ ệ ự ố c xây d ng và ta ch vi c dùng mà thôi. ư Stack trong C++, Queue cũng đ ự
link d phòng
ử ụ
3. S d ng Quêu có s n trong C++
Gi ng nh
code by nguyenvanquan7826 #include #include 03 04 using namespace std; 05 06 int main() { 07 queue 08 for (int i = 0; i < 10; i++) { 09 Q.push(i * 78 + 26); // them phan tu vao queue 10 } 11 12 cout << "So luong phan tu trong queue: " << Q.size() << "\n"; 13 14 while (!Q.empty()) { // trong khi queue khong rong int x = Q.front(); // lay gia tri dau hang 15 Q.pop(); // xoa gia tri dau hang 16 cout << x << " "; 17 18 } 19 20 cout << "\n"; 21 22 return 0; 23 } ủ ụ
ượ ể ử ệ ổ ứ ư ế ề ộ ế ạ c dùng đ kh đ qui, t
ố ế
ả ch c l u v t các quá trình tìm ki m theo chi u r ng và quay lui, vét c n,
ổ ứ ộ ệ ệ ề Ứ
4. ng d ng c a queue
Queue đ
ổ ứ
t ch c qu n lý và phân ph i ti n trình trong các h đi u hành, t ch c b đ m bàn phím.o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o