ầ ề

ể ử ụ ụ ư ướ ụ ổ ế ệ   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 #include  int main() {     printf ("Chuong trinh C dau tien cua toi !\n");     system("pause");     return 0; }

ậ ấ ề ở ụ ể ạ ị ươ 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  và #include. Vì trong  ng trình này ta s  d ng hàm th  vi n c a C là printf và system, do đó b n c n ph i có  ươ ng ả t. N u không khai báo ch ỗ ề ứ ể ủ ừ ầ t

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  01

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 dev­C

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 ); num­odd (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  01

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 dev­C

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 dev­C 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  01

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 dev­C

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  01

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 dev­C

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  01

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 dev­C 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  01

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 dev­C

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  01

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 dev­C

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  01

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 dev­C

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ừ 4­2.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    int main(){     int a = 5, b = 7;     double c = 4.5, d = 6;       printf("%d + %f = %f \n", a, c, a + c);     printf("%d ­ %d = %d \n", a, b, a ­ b);     printf("%d * %f = %f \n", b, d, b * d);       /* Luu y phep chia nhe*/       printf("%d / %d = %d \n", b, a, b / a);     printf("%f / %d = %f \n", c, a, c / a);     printf("%f / %f = %f \n", c, d, c / d);       printf("%d %% %d = %d \n", b, a, b % a);       return 0; }

ả 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    int main(){     int a = 5, b = 7;     double c;       printf("%d / %d = %d \n", b, a, b / a);       /* Chuyen gia tri tuc thoi cua b sang kieu so thuc*/     printf("%d / %d = %f \n", b, a, (double)b / a);       /* Chuyen gia tri tuc thoi cua a sang kieu so thuc*/     printf("%d / %d = %f \n", b, a, b / (double)a);       /* Neu lam the nay thi van khong dung, vi b/a duoc so nguyen      * sau do chung ta moi ep kieu so nguyen do sang so thuc      */     printf("%d / %d = %f \n", b, a, (double)(b / a));       return 0; }

ế ả 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  01   02 int main(){ 03     int a = 5, b = 7, c = 8, d = 11, min; 04     min = (a < b ? (c++, a) : (d­­, b)); 05       06     printf("min = %d\nc = %d\nd = %d\n", min, c, d); 07       08     return 0; 09 } 10

ế ả 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  01   02 int main(){ 03       04     printf("char size = %d byte\n", sizeof(char)); 05     printf("short size = %d byte\n", sizeof(short)); 06     printf("int size = %d byte\n", sizeof(int)); 07     printf("long size = %d byte\n", sizeof(long)); 08     printf("float size = %d byte\n", sizeof(float)); 09     printf("double size = %d byte\n", sizeof(double)); 10     printf("1.55 size = %d byte\n", sizeof(1.55)); 11     printf("\"Hello\" size = %d byte\n", sizeof("Hello")); 12     return 0; 13 } 14

ế ả 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 switch­case 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 đ  if­else 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 switch­case

ư ồ

ố ừ ậ ọ ươ ứ 1­>5 và in ra cách đ c t ng  ng:

L u đ  switch­case 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 ố  1­5 thì in ra s

L u đ  switch­case­default 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  01

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  01

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  01

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  01

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  01

#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 do­while ể ể 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  01

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  01

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  01

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  01

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  01

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  01

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  01

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(n­1) * 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 ố ầ ử ố ả   <[s  ph n t ồ VD: int a[10]; m ng 1 chi u a g m 10 ph n t ạ m ng có d ng nh  sau:

ả ầ ử

ầ ử ỗ ề ả 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 n­1 (v i n là kích th ế ỉ ố ắ ầ ừ ử  0 đ n 9.  thì ch  s  b t đ u t t ấ  <[ch  s ]> Và ta truy xu t qua cú pháp:

ấ ầ ử ủ ả

ệ ớ ừ ầ ử ầ 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:   <[s  hàng][s  c t]>; ả VD khai báo: int a[5][10]; //M ng a g m 5 hàng và 10 c t (m i hàng có 10 ph n t ).

ề M ng 2 chi u trong C code by nguyenvanquan7826

#include  01

#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  01   02 int main() { 03     char hoten[50]; // khai bao chuoi co toi da 50 ky tu 04     printf("Xin chao, ten ban la gi?\nMinh la: "); 05     scanf("%s", hoten); 06     printf("Chao mung ban %s den voi TUT lap trinh C cua nguyenvanquan7826", hoten); 07       08     return 0; 09 } 10

ế ả 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  01

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  01

#include  02

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  01

#include  02

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  01

#include  02

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  01

#include  02

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  01

#include  02

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[i­1];

(*L).Elems[k­1]=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[k­1]; //luu lai gia tri cua phan tu can xoa

int i;

for (i=k­1; i<(*L).size­1; 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[i­1];

(*L).Elems[k­1]=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[k­1]; //luu lai gia tri cua phan tu can xoa

int i;

for (i=k­1; i<(*L).size­1; 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í k­1 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 != k­1) //duyet den vi tri k­1             {                 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í k­1 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 != k­1) //duyet den vi tri k­1             {

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 001 #include 002 typedef int item; //kieu cac phan tu dinh nghia la item 003 typedef struct Node //Xay dung mot Node trong danh sach 004 { 005     item Data; //Du lieu co kieu item 006     Node *next; //Truong next la con tro, tro den 1 Node tiep theo 007 }; 008 typedef Node *List; //List la mot danh sach cac Node 009   010 void Init (List &L); //khoi tao danh sach rong 011 int len (List L); // Do dai danh sach 012 Node *Make_Node (Node *P, item x); //Tao 1 Node P voi thong tin chu trong no 013 void Insert_first (List &L, item x); //Chen phan tu vao dau danh sach 014 void Insert_k (List &L, item x, int k); //Chen phan tu vao vi tri k trong danh sach 015 void Input (List &L);//Nhap danh sach 016 void Output (List L);//Xuat danh sach 017 int Search (List L, item x); //Tim phan tu x trong danh sach, ham tre ve vi tri cua phan tu tim duoc 018 void Del_frist (List &L, item &x); //Xoa phan tu dau danh sach 019 void Del_k (List &L, item &x, int k); //Xoa phan tu vi tri k trong danh sach 020 void Del_x (List &L, item x);//Xoa phan tu co gia tri x trong danh sach 021   022 void Init (List &L) // &L lay dia chi cua danh sach ngay khi truyen vao ham 023 { 024

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 != k­1) //duyet den vi tri k­1             {                 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 != k­1) //duyet den vi tri k­1

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 1Right;                 }                 PT = PH­>Right; //xac dinh vi tri k                 R­>Right = PT;   //(1)                 R­>Left = PH;    //(2)                 PH­>Right = R;   //(3)

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 != k­1) //duyet den vi tri k­1                 {                     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  #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 1Right;                 }                 PT = PH­>Right; //xac dinh vi tri k                 R­>Right = PT;                 R­>Left = PH;                 PH­>Right = R;                 PT­>Left = R;             }     } }   void Del_first (DList &L, item &x) //Xoa phan tu dau tien {

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 1Right;                 }                 x = PH­>Right­>Data;                 PT = PH­>Right­>Right; //xac dinh vi tri k+1                 PH­>Right = PT;                 PT­>Left = PH;             }     } }   int Search (DList L, item x) //tim x trong danh sach {

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)

o o o o o

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)   ỉ ươ

o o o o o o o

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.Top­1]; //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  // io 01

#include  // use stack 02

03

using namespace std; 04

05

int main() { 06

stack  S; // khai bao Stack voi kieu du lieu la int 07

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 ợ

o o o o o o

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)

o

ng trình hoàn ch nh (full code) 1.7 Ch (cid:0)

ỗ ạ ố    vào cu i Queue đ u Queue ỉ

o o o o o o o

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 (Max­1). Đ  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 Max­1 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 Max­1 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  01

#include  // su dung queue 02

03

04 using namespace std;

05

06 int main() {

07 queue  Q; // khai bao queue co kieu nguyen

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.