Ậ Ậ

ự ậ

Th c t p K  THU T L P TRÌNH

ươ

Xây d ng khung ch

ng trình và menu ch n

Tu n 1­3:

ươ

ng trình qu n lý sinh viên (

QLSV) v i các thông tin

Bài toán: Xây d ng ch ầ c n qu n lý c a m t sinh viên g m: Mã l p, Mã sinh viên, H  và tên, Ngày sinh,

ươ

Đi m trung bình tích lũy (ĐTBTL). Các ch c năng chính c a ch

ồ ơ

ồ   ng trình g m: ộ   Thêm, s a, xóa h  s  sinh viên; In danh sách sinh viên theo l p ho c toàn b ;

ế

S p x p danh sách sinh viên theo m t (ho c nhi u) các tiêu chí: H  tên, Ngày

ế

sinh, ĐTBTL b ng các thu t toán s p x p ch n, chèn, quicksort, mergesort,

ế

ầ ự

ế

ế

heapsort; Tìm ki m sinh viên theo m t (ho c nhi u) các tiêu chí: H  tên, Ngày   ự   ị , tìm ki m nh  phân; Th c

sinh, ĐTBTL b ng các thu t toán tìm ki m tu n t

ạ ọ ậ

ế hi n các báo cáo th ng kê ph n trăm x p lo i h c t p theo l p, t ng s  sinh

ữ ệ ượ ư

ữ ạ

ươ

ớ viên theo l p. D  li u đ

ị c l u tr  d ng file nh  phân có c u trúc. Ch

ng trình

ế

ượ đ

c vi

t trên C/C++.

I. Yêu c uầ

ươ

ệ ạ

ớ ộ

ư

Xây d ng khung ch

ng trình và giao di n d ng menu v i n i dung nh  sau:

o Giao di n chính g m các m c ch n:

ớ ồ ơ

1. Thêm m i h  s  (M1)

2. In danh sách (M2)

ắ ế

3. S p x p (M3)

ế 4. Tìm ki m (M4)

5. Th ng kê (M5)

6. Thoát (M5)

ươ

ồ ơ

ồ   ng trình cho phép nh p vào h  s  sinh viên g m

ọ o Khi ch n M1, ch

các thông tin:

 Mã l pớ

 Mã sinh viên

 H  và tên ọ

1

 Ngày sinh

 Đi m trung bình tích lũy

ươ

ng trình cho phép in ra danh sách sinh viên theo th

ọ o Khi ch n M2 ch

ắ ế

ế

ự t

đã s p x p (khi ch n M3) và tìm ki m (khi ch n M4)

ươ

ế

ọ   ng trình cho phép ch n thu t toán s p x p(ch n,

ọ o Khi ch n M3 ch

ể ắ

ế

chèn, quicksort, mergersort) và khóa đ  s p x p (mã sinh viên, h  và

ụ   tên, ngày sinh, đi m trung bình tích lũy). Có th  xây d ng các m c

ch n này d ng menu (c p 2).

ươ

ế

ầ   ng trình cho phép ch n thu t toán tìm ki m (tu n

ọ o Khi ch n M4 ch

ế

ự t

ị ủ

, nh  phân), khóa c n tìm ki m (mã l p, mã sinh viên, H  và tên,   ể

ngày sinh, đi m trung bình tích lũy) và giá tr  c a khóa c n tìm. Có th

xây d ng các m c ch n này d ng menu (c p 2).

ươ

ố ượ

ng trình cho phép ch n báo cáo s  l

ng SV theo

ọ o Khi ch n M5 ch

ặ ỷ ệ

ả ọ ậ

ạ ế

ấ ắ

ớ l p ho c t

l

phân lo i k t qu  h c t p (xu t s c, gi

i, khá, trung

ế

ự bình, y u) theo l p. Có th  xây d ng các m c ch n này d ng menu

(c p 2).

ươ

ế

ng trình k t thúc.

ọ o Khi ch n M6 ch

ế

ứ II. Ki n th c liên quan

ệ ệ

ự ệ ầ

ạ :

ệ 1. L nh if L nhệ   if  cho phép ch ệ   ươ ể ự ng trình có th  th c hi n công vi c này hay công vi c ộ ủ ữ ệ ề ệ   khác tùy thu c vào đi u ki n nào đó c a d  li u là đúng hay sai. Nói cách khác câu l nh  ệ ộ ọ ườ ậ if  cho phép ng   i l p trình l a ch n m t trong hai công vi c c n làm tùy ề ộ thu c vào đi u ki n logic nào đó. Cú pháp (d ng 1) ứ ể if (Bi u_th c_logic)   ệ ệ {Các l nh cho công vi c 1}

else

ệ {Các l nh cho công vi c 2}

ạ ể

ệ Ho cặ  (d ng 2) : ứ if (Bi u_th c_logic)   ệ ệ {Các l nh cho công  vi c 1}

ể ẽ ả ề ộ ứ ứ ể Trong đó: ứ Bi u_th c_logic : Bi u th c logic, bi u th c này s  tr  v  m t trong hai giá tr ị

ể là đúng (true) ho c (ặ false);

2

ệ ệ ự ứ ệ ệ ằ ấ Các l nh cho công vi c 1 ệ : Các l nh nh m th c hi n công vi c th  nh t khi

ứ Bi u_th c_logic tr  v  k t qu  là

đúng; ằ ệ Các l nh cho công vi c 2

ả ề ế ệ ả ề ế ả ệ ả ượ ế ể ệ ể ứ Bi u_th c_logic ệ : Các l nh nh m th c hi n công vi c th  hai khi if đ ứ ạ t theo d ng 1). ự ế ệ sai (n u l nh c vi tr  v  k t qu  là

ẽ ế ầ ị ủ   Bi u_th c_logic, ả   ế   n u k t qu  là ệ :  ự Cách th c hi n 1. Đ u tiên ch

đúng thì Các l nh cho công vi c 1

ứ ể ệ ; ự c th c hi n ệ ế ể 2. N u ế Bi u_th c_logic if vi ạ t theo d ng 1 thì

ẽ ượ ệ ươ ng trình s  tính giá tr  c a ệ  s  đ ẽ ượ ệ ả ả ề ế ứ  k t qu  tr  v  là sai và câu l nh  ự ệ  s  đ Các l nh cho công vi c 2 c th c hi n.

ế if.

ể ả ề ế ả ớ ứ Bi u_th c_logic tr  v  k t qu  là sai thì ch ươ   ng

ấ ỳ

ế ả ươ ậ ệ ệ trình cũng không th c hi n b t k  công vi c gì. ươ ng trình cho phép gi i ph ng trình b c nh t ấ a*x + b = 0. : Vi

ệ ệ 3. K t thúc l nh  ạ V i cú pháp d ng 2 thì khi  ự Ví d  1.6ụ t ch #include   #include  int main ()  {

int a, b; // bieu dien cac he so float x; // bieu dien nghiem cua phuong trinh printf("Nhap vao cac he so a,b:");  scanf("%d %d",&a,&b);  if (a==0) {        printf("Phuong trinh khong co nghiem");  } else {

x=(float)(­b)/a; printf("Phuong trinh co nghiem x = %0.5f",x);

} getch();  return 0;

ệ ể

if (a==0) cho phép ki m tra xem n u  "Phuong trinh khong co nghiem" và ng ế a = 0 thì ch c l

ệ ệ ngươ   ượ ạ (else) thì  i  printf("Phuong   trinh   co   nghiem   x   = ẽ x=(float)(­b)/a  tính   nghi m   và   l nh

ộ ố ươ ng trình cho phép Ví d  1.ụ nh p vào m t s  nguyên d

ủ , bi ậ   ng là tháng t ế r ngằ  tháng 1, 3, 5, 7, 8, 10, 12 có 31

ặ } ụ Trong ví d  trên, l nh  trình s  in ra dòng thông báo  ệ l nh   ả ế %0.5f",x) in ra k t qu  đó. ươ ế t ch  7  : Vi ố trong năm và in ra s  ngày c a tháng đó ngày; tháng 4, 6, 9, 10 có 30 ngày; và tháng 2 có 28 ho c 29 ngày.

#include  #include int main ()  {

3

int thg;

printf("Nhap vao thang trong nam !");  scanf("%d",&thg);  if(thg==1||thg==3||thg==5||thg==7||thg==8||thg==10||thg==12)  {

printf("\n Thang %d co 31 ngay",thg);

} else  {

if (thg==4||thg==6||thg==9||thg==11)

printf("\n Thang %d co 30 ngay",thg);

else

if (thg==2)

printf("\n Thang %d co 28 hoac 29 ngay",thg);

else

printf("Khong co thang %d",thg);

} getch();  return 0;

ệ ử ụ ụ ệ ọ if … else … , các l nh:ệ

}  Ví d  trên minh h a vi c s  d ng câu l nh  {

if (thg==4||thg==6||thg==9||thg==11)

printf("\n Thang %d co 30 ngay",thg);

else

if (thg==2)

printf("\n Thang %d co 28 hoac 29 ngay",thg);

else

printf("Khong co thang %d",thg);

ỉ ượ ế ả khóa

ị ự ệ

ự ệ ả ộ ị

ệ ộ ị

ị ằ ượ ự ệ ả ậ

} ộ   ậ ệ ứ ấ ừ else th  nh t ch  đ c th c hi n n u tháng nh p vào không ph i là m t sau t printf("\n Thang %d co 30 ngay",thg) chỉ  trong các giá tr  1, 3, 5, 7, 8, 10, 12. L nh  ậ ượ c th c hi n khi tháng nh p vào không ph i là m t trong các giá tr  1, 3, 5, 7, 8, đ   ộ printf("Khong co thang  10, 12 mà  thu c vào m t trong các giá tr  4, 6, 9, 11. L nh  ả   %d",thg) đ c th c hi n khi tháng nh p vào không ph i là giá tr  n m trong kho ng ừ t

ể ứ ớ ằ ễ Bi u_th c_logic ế  1 đ n 12. Chú ý: ể Khi bi u di n

ể ạ ệ ụ ỗ ằ , nên nh  r ng phép so sánh b ng trong C/C++ là   d u ấ ==, trong khi d u ấ = là phép gán. Thêm n a, khi ng ữ ử ụ   ườ ậ i l p trình s  d ng ứ ớ ằ  thì nói chung  Bi u_th c_logic nh m phép so sánh b ng v i phép gán trong  i. Ví d  trong đo n l nh sau: trình biên d ch không báo l

ị else if (thg==2)

printf("\n Thang %d co 28 hoac 29 ngay",thg);

else

4

printf("Khong co thang %d",thg);

ươ ề ng trình xét v  cú pháp là không l ỗ   i,

ặ ấ ấ ặ ầ (thg==2) b i ở (thg=2) thì ch ế n u thay  ề tuy nhiên v  ý nghĩa là hoàn toàn sai. ộ ố if, m t s  ng t l nh

ể ố ế ệ Khi vi ả

ư ấ   ể ơ ườ i do s  xu t ho c hi u nh m nên đ t d u ch m ế ộ ố ứ Bi u_th c_logic   t này , trong m t s  tình hu ng cách vi ụ ề   i cú pháp nh ng v  ý nghĩa cũng hoàn toàn sai. Ví d  xét

ỗ ng tình sau:

ph y (;) ngay sau   ả không x y ra l ươ ạ đo n ch … printf("nhap vao mot so nguyen: "); scanf("%d", &a); if (a%7==0);

printf("So %d chia het cho 7",a);

ươ ẽ ỗ getch(); … Đo nạ   ch

ượ i cú pháp, tuy nhiên ớ ấ ỳ  ự ệ c th c hi n v i b t k

ị ng trình trên khi biên d ch s  không báo sai l printf("So %d chia het cho 7",a); luôn đ ủ a. dòng l nh ệ ị giá tr  nào c a

ự ề ệ ấ

ươ ự ề ọ ể  ộ ộ   ng trình l a ch n m t trong nhi u công ọ switch  cho phép ch

ự ệ ể ự if  ch  cho phép l a ch n m t trong nhi u nh t là hai công vi c đ ệ ệ

ệ 2. L nh switch ỉ ế ệ N u l nh   ệ th c hi n thì l nh   vi c đ  th c hi n.  Cú pháp:

ể ề ệ ứ switch (Bi u_th c_đi u_ki n)

{

case  Giá_tr _1:

ị ệ Các l nh cho công vi c 1 [break;]

case  Giá_tr _2:

ị ệ Các l nh cho công vi c 2 [break;]

… case  Giá_tr _n:

ị ệ Các l nh cho công vi c n [break;]

[default:

ệ ệ Các l nh cho công vi c n+1]

}

ề ể ứ ề ệ ể ệ ầ ị

Trong đó: ứ Bi u_th c_đi u_ki n ứ ệ : Bi u th c đi u ki n  đ  xác đ nh công vi c c n làm, ả ả ề ự ặ ể bi u th c này ph i tr  v  giá tr  nguyên ho c ký t ;

ự ằ ặ ị ị : là các h ng nguyên ho c ký t ;

ự ứ ệ ệ ệ ị

ằ ị ứ ể ề ằ Giá_tr _1; ể ị ị Giá_tr _1, Giá_tr _2, .. , Giá_tr _n ệ ệ Các l nh cho công vi c 1 : Các l nh nh m th c hi n công vi c th  1 khi giá tr ệ ủ c a bi u th c đi u ki n b ng

5

ệ ệ ệ ệ ệ ằ … Các l nh cho công vi c n ự : Các l nh nh m th c hi n công vi c th ứ n khi giá trị

ể ệ ề ằ Giá_tr _nị ; ủ c a bi u th c đi u ki n b ng

ầ ượ ớ

ị ị

thì ch ế

3. N u quá trình so sánh không g p tr ươ ề ệ

ứ ể ề Tr

ứ ệ :  ự Cách th c hi n ứ Bi u_th c_đi u_ki n ể ệ ; ề ứ ị ủ 1. Tính giá tr  c a bi u th c  ị Giá_tr _1ị ệ  l n l ề ứ ể ả ủ bi u th c đi u ki n ế ,  t v i các giá tr   2. So sánh k t qu  c a  ằ ị ủ bi u th c đi u ki n ề ị  ệ   b ng giá tr ứ ể ế Giá_tr _2, … , Giá_tr _n , n u giá tr  c a   ắ ầ ừ  c a ủ nhánh (case) th  ứ i là Giá_tr _iị ệ ẽ ự ươ ng trình s  th c hi n b t đ u t ế break, ho c ặ n u khôn ặ ệ ệ ệ dãy Các l nh cho công vi c i  g  cho đ n khi g p l nh  ặ ệ ế ế ệ ẽ ự break nào thì s  th c hi n cho đ n h t l nh  switch.  g p l nh  ị  ớ ườ ằ ợ Giá_tr _iị ặ ế  nào b ng v i giá tr ng h p  ệ ự ệ  thì ch ứ c a ủ Bi u_th c_đi u_ki n ể   Các l nh cho ng trình th c hi n dãy các  ế ệ  trong nhánh default n u có.  công vi c n+1 ệ ợ ườ ng h p câu l nh   ớ ấ ứ ớ ự ệ ệ   switch  không có nhánh  default  và  Bi u_th c_đi u_ki n ấ ỳ switch đó không th c hi n b t k case nào thì l nh ệ

ủ ể

ầ ứ ỹ ạ ố ọ Anh văn, th  5 h c

, th  4 h c  ứ ế ng ng

ầ ộ ươ ọ   ứ ư ộ  s  th i khóa bi u tu n c a m t sinh viên nh  sau: th  2 h c ậ ậ   ọ K  thu t l p ứ ậ ủ ạ ươ   và ch  nh t là ọ ạ ươ , th  7 h c   ọ Hóa h c đ i c   ậ   ng trình cho phép nh p vào m t ngày trong tu n và in ra

không kh p v i b t c  nhánh  ệ công vi c nào.  ả ử ờ Ví d  1.ụ  8  : Gi   ọ Đ i s  tuy n tính ứ ả Gi i tích , th  3 h c  ậ ọ V t lý đ i c ứ trình, th  6 h c   ngày nghỉ. Hãy vi ế t ch ủ ệ ầ công vi c c n làm c a sinh viên trong ngày đó. #include  #include  int main()  {

6

int thu; printf("Nhap vao thu (2­8, 8 la CN):"); scanf("%d",&thu); switch(thu) {         case 2:printf("Giai tich");                 break;                        case 3:printf("Dai so tuyen tinh");                 break;                        case 4:printf("Anh van");                 break;                        case 5:printf("Ky thuat lap trinh");                 break;                        case 6:printf("Vat ly dai cuong");                 break;                        case 7:printf("Hoa hoc dai cuong");                 break;                        case 8:printf("Nghi hoc");                 break;                        default:printf("Nhap sai ngay!");  }

getch();  return 0;

ụ ệ ủ ệ ứ ể ề ị ằ switch và các giá tr  h ng trong

ự ể ậ ễ ế } ử ụ Ví d  này s  d ng bi u th c đi u ki n c a l nh  ố case là s  nguyên . ố  9  : Nh p vào 2 s  nguyên và 1 ký t m i nhánh  Ví d  1.ụ

ố ế ủ ủ ươ ể ng c a chúng, ng ượ ạ c l

bi u di n phép toán. N u phép toán ệ ế là ‘+’, ‘­‘, ‘*’ thì in ra k t qua là t ng, hi u, tích c a 2 s ; n u phép toán là ‘/’ thì ế ố ứ ki m tra xem n u s  th  2 khác không thì in ra th i thì in ra thông báo “khong chia cho 0”.

#include   #include  int main () {

int so1, so2;  float thuong;  char pheptoan;  printf("\n Nhap vao 2 so nguyen ");  scanf("%d%d",&so1,&so2);  fflush(stdin);//Xoa ky tu enter trong vung dem truoc khi nhap phep toan  printf("\n Nhap vao phep toan ");  scanf("%c",&pheptoan);  switch(pheptoan)  {

case '+':

printf("\n %d + %d =%d",so1, so2, so1+so2);  break;

case '­':

printf("\n %d ­ %d =%d",so1, so2, so1­so2);  break;

case '*':

printf("\n %d * %d =%d",so1, so2, so1*so2);  break;

case '/':

if (so2!=0)

{

thuong=float(so1)/float(so2);          printf("\n %d / %d =%f", so1, so2, thuong);

}

else  printf("Khong chia duoc cho 0");

break;  default :

printf("\n Chua ho tro phep toan %c", pheptoan);

7

break;

}  getch();  return 0;

ể ụ ệ ủ ệ ứ ề ị ằ } Ví d  này s  d ng bi u th c đi u ki n c a l nh switch và các giá tr  h ng trong

.ự ươ ộ ố ươ m i nhánh  Ví d  ụ 1.10 cho phép nh p vào m t s  nguyên d

, bi ng là tháng háng 1, 3, 5, 7, 8, 10, 12 có 31

ậ ế ằ t r ng t ặ ử ụ case là ký t t ế ch ng trình   : Vi ủ ố trong năm và in ra s  ngày c a tháng đó ngày; tháng 4, 6, 9, 10 có 30 ngày; tháng 2 có 28 ho c 29 ngày .

#include   #include  int main ()  {

int thang;  printf("\n Nhap vao thangs trong nam ");  scanf("%d",&thang);  switch(thang)  {

case 1:  case 3:  case 5:  case 7:  case 8:  case 10:  case 12:

printf("\n Thang %d co 31 ngay ",thang);  break;

case 4:  case 6:  case 9:  case 11:

printf("\n Thang %d co 30 ngay ",thang);  break;

case 2:

printf ("\ Thang 2 co 28 hoac 29 ngay");  break;

default :

printf("\n Khong co thang %d", thang);  break;

}  getch();  return 0;

8

ử ụ ụ ệ ọ ệ ế ể ề ể }   Ví d  trên minh h a cách s  d ng l nh ệ   break đ  đi u khi n vi c k t thúc l nh

t:ế

switch, cách vi case 1:  case 3:  case 5:  case 7:  case 8:  case 10:  case 12:

ế ớ ệ ấ ả

ả ố ậ ươ ườ ợ ự ư ậ ằ ộ t c  các nhánh này v i cùng m t dòng in ra k t qu  s  tháng break. T ng h p tháng nh p vào nh  v y cho các tr ng t

printf("\n Thang %d co 31 ngay ",thang);  break;  ự cho phép th c hi n t ế là 31 và k t thúc b ng  là 4, 6, 9 và 11. Các l nh:ệ

default :

printf("\n Khong co thang %d", thang);  break;  ệ ự ằ ượ ị ậ ừ ả đ ế  1 đ n 12.

ệ ệ ấ

c th c hi n khi giá tr  nh p vào không n m trong kho ng t Chú ý:  ể ệ Đ   l nh   ể ề ố ị ệ )   thì   cu i   dãy   l nh   th ứ i  (khi  ứ i  thêm   vào   l nhệ

ế

L nh ệ break trong ph n ầ default c a l nh

ủ ệ switch là không c n thi

t.

ươ

C u trúc ch

ể ặ ng trình, đi u khi n ch n, đi u khi n l p

switch  ch   th c   hi n   duy   nh t   các   l nh   cho   công   vi c   th   ứ ể ế ỉ ự ệ ệ ụ ệ switch, xem ví d  1.8 và 1.9; Bi u_th c_đi u_ki n=Giá_tr _i break đ  k t thúc l nh

ự ệ ệ ặ ặ ạ ộ ố ầ i m t s  l n.

ệ 3. L nh for Cho phép th c hi n công vi c nào đó l p đi l p l Cú pháp:

ế ổ

ể ở ạ for ( [Kh i_t o]; [Ki m_tra]; [Bi n_đ i])    {Các l nh}ệ

ặ ệ ể ộ ố ườ ầ Trong đó: Kh i_t o ng đ

ứ ị ộ ở ạ ể ể ơ ế ế ộ ượ   c ố

ứ ể ệ ầ ộ ơ

ề ệ ặ ằ ộ

ặ ế ặ ệ ầ ộ ơ Bi n_đ i ườ ng đ ứ ườ ng đ

ứ ị ế ế ể ổ ở ạ : Là m t bi u th c ho c m t s  câu l nh đ n. Ph n này th ầ ể dùng đ  kh i t o giá tr  ban đ u cho m t bi n đ m dùng đ  ki m soát s ướ ặ b c l p; ộ ố ể ượ   Ki m_tra : Là m t bi u th c ho c m t s  câu l nh đ n. Ph n này th c ủ ể ể ể dùng đ  ki m tra đi u ki n k t thúc c a vòng l p b ng m t bi u th c logic; ế ượ   ộ ố ổ : Là m t bi u th c ho c m t s  câu l nh đ n. Ph n này th ể c dùng đ  thay đ i giá tr  bi n đ m.

ệ :

ượ ở ạ ầ ằ ị c th c ự hi nệ  nh m kh i t o giá tr  ban đ u cho các

ế

ượ ệ ể ẽ ị ả ề   c tính toán, n u nó tr  v  giá tr  là đúng (1) ế   ặ for s  chuy n đ n i thì vòng l p ượ ạ c l

9

ự Cách th c hi n ở ạ  đ ướ Kh i_t o c tiên  4. Tr ề ế ặ ể ủ bi n đi u khi n c a vòng l p; ể ầ Ki m_tra ế ế  đ 5. Ti p đ n là ph n  thì {Các_l nh}ệ ự ẽ ượ  s  đ c th c hi n, ng ướ ướ ế b c k t thúc (b c 4);

ượ ệ ượ ộ ế Bi n_đ i 6. Sau khi th c hi n đ c m t vòng l p thi

ự ể ượ ự ổ ặ ể

ổ   đ ề ể ể c chuy n v ị ằ ế ị ủ ặ ẽ ế ụ Ki m_tra ằ   ệ c th c hi n nh m ề   có giá tr  b ng sai ế c 2; và vòng l p s  ti p t c mãi cho đ n khi

ố ừ ế ế ể ng trình đ  in các s  t : Vi 1 đ n 10 ra màn hình.

ề làm thay đ i giá tr  c a bi n đi u khi n, sau đó đi u khi n đ ướ b (0). ế ặ .  7. K t thúc vòng l p ươ ụ Ví d  1.11 t ch #include   #include  int main ()  {

printf("Day so tu 1 den 10 :\n");  for (int i=1; i<=10; i++)

{

printf("%d \n",i);

} getch();  return 0;

ế ở ạ   là khai báo bi n nguyên i và gán giá tr  0

ể ụ ể ị ặ ằ }    Kh i_t o Trong  ví d  trên ứ  là bi u th c logic đ  ki m tra cho  nó;  ỏ ơ i<=10 xem i có nh  h n ho c b ng 10 hay

ể ể ế ơ

ươ ổ ố ế i lên 1 đ n v   ậ ng trình cho phép nh p vào s ị i++. ố n, in ra t ng các s  nguyên

Ki m_tra ổ  là phép tăng bi n đ m  ế không và Bi n_đ i ế ụ : Vi Ví d  1.12 ổ ế n và t ng c a chúng.  1 đ n ừ t

t ch ủ #include   #include  int main ()  {

unsigned int n,i,tong;  printf("\n Nhap vao so nguyen duong n:"); scanf("%d",&n);  tong=0;  for (i=1; i<=n; i++)

{

printf("\n %d ",i); tong+=i;

}

printf("\n Tong tu 1 den %d =%d ",n,tong);  getch();  return 0;

ạ ầ ư

ớ ể ẽ

1 đ n  ữ

10

ỗ n }  ổ   ộ ớ ủ n, khi n l n thì t ng Trong chương trình trên, khi ch y c n l u ý đ n đ  l n c a  ế ế tong có th  s  không ể unsigned int c a bi n  ủ ố ừ ế n s  r t l n, khi đó ki u  ẽ ấ ớ các s  t   ặ for  là b tắ   ướ ặ ượ ợ ệ ụ tong=0  đ c đ t tr phù h p n a. Trong ví d  trên, l nh   c vòng l p   for  l nh ệ ằ ể ượ tong = tong + i. tong+=i có th  đ c thay b ng  bu c; trong vòng  ấ ớ ượ ả ử ề ử ế ệ ụ c tính v i lãi su t là   s  ti n g i ti : Gi Ví d  1.13 m% m i tháng, sau t ki m đ

ượ ộ ươ ế t ch ng trình cho phép tính và in ra màn hình

ớ ố ề ố ầ ố c c ng vào g c. Vi ử ế ệ K tháng g i ti t ki m v i s  ti n g c ban đ u là T. c sau

ề tháng thì ti n lãi đ ượ ố ề s  ti n có đ #include  #include  int main()  {

scanf("%f",&m);

scanf("%d",&n);

scanf("%f",&T); scanf("%d",&K);

float m,T,lai; int n, K; printf("Lai suat               : ");  m=m/100; printf("So thang de lai vao goc: ");  printf("So tien gui            : ");  printf("So thang gui           : ");  lai= 0; for (int i=1; i<=K; i++)     {          lai = lai+ m*T;          if (i%n==0)          {             T=T+lai;             lai =0;                     }     } printf("So tien: %0.5f",T+lai); getch(); return 0;

ề ả ả i, tuy nhiên cách gi

ươ ự ả ng trình nêu trên th  hi n m t cách t nhiên quá trình gi ư i nh  trong   ề   ế ấ i quy t v n đ .

} ụ Bài toán nêu trong ví d  trên có nhi u cách gi ể ệ ươ ụ ạ ch Trong ví d  trên, đo n ch ộ ng trình:

if (i%n==0) {

T=T+lai;       lai =0;             }

ế ầ ư

ượ ầ ế i chia h t cho  ờ ồ ấ n (% là phép l y ph n d ) thì ẽ ằ ề c công thêm ph n lãi lai, đ ng th i khi đó ti n lãi s  b ng 0.

ứ ỗ ệ ề ơ ệ ổ : có th  ch a nhi u câu l nh đ n, m i l nh cách nhau

ả ể cho phép ki m tra xem n u tháng đang tính  ố ề ố T đ s  ti n g c  Chú ý: ể ế ở ạ   và  Bi n_đ i Kh i_t o ụ ộ ấ ở b i m t d u ph y (,). Ví d :

11

#include  int main() {       int i, j;

for ( i = 5, j = 10 ; i + j < 20; i++, j++ )            printf("\n i + j = %d", (i + j) ); }

ệ ế ầ ổ Ph n kh i t o th c hi n hai l nh gán ự   i = 5  và  j = 10, và ph n bi n đ i th c

ệ ệ ự i++ và j++.

ở ạ ,  Ki m_tra

ở ạ ầ ệ hi n hai l nh  Các thành ph n  ầ Kh i_t o ặ ế   và  Bi n_đ i ị ỏ

ổ   trong l nh  ệ ể ầ Ki m_tra ệ ặ ị ể ể nghĩa là có th  có ho c không. Khi b  b  qua thì ph n  ụ ươ nh n giá tr  là đúng. Ví d  ch for  là tùy ch n,ọ   cượ    luôn đ ậ ẽ ự ng trình sau đây s  th c hi n l p vô t n:

ở ạ ể ậ #include  int main() {       int i, j;       for (  ;    ;   )            printf( "\n i + j = %d", (i + j) ); } M c dù các thành ph n ầ Kh i_t o, Ki m_tra for đ

ổ  trong l nh ệ ế  và Bi n_đ i ổ ế ế ề ể

cượ   ể ủ   t k  v i m c đích là: kh i t o, ki m tra và bi n đ i bi n đi u khi n c a ụ   i l p trình v n có th  s  d ng chúng vào các m c đích

ườ ậ ể ử ụ ụ ệ ể ầ Ki m_tra ụ ở ạ ế ế ớ ụ thi ẫ ặ vòng l p thì ng khác. Ví d  có th  s  d ng l nh ể ử ụ ở  ph n ư  nh  sau: printf

#include  int main() {        int i;        for( i = 0; i < 5; printf("%d\n", i), i++)    ;   } while 4. L nh ệ

ặ ạ ự ệ ệ ặ ộ ố ầ i m t s  l n.

Cho phép th c hi n công vi c nào đó l p đi l p l Cú pháp:

ề ệ ứ while (Bi u_th c_đi u_ki n)

ể {Các l nh}ệ

ể ể ề ứ ể ể ề ệ ặ ệ  là bi u th c đi u ki n dùng đ  đi u khi n vòng l p.

Trong đó:  ề ứ Bi u_th c_đi u_ki n ệ : ự Cách th c hi n

ể ề ế ậ ượ ệ , n u giá tr  nh n đ c khác không

ự c 3;

ứ ằ {Các l nh}ệ ị ế ướ ể c 2, n u b ng không thì chuy n đ n b ở ạ ướ i b c 1;  sau đó tr  l

ố ừ ế ế ể ng trình đ  in các s  t ử ụ    1 đ n 10 ra màn hình s  d ng

Tính giá tr  ị Bi u_th c_đi u_ki n 1. ệ ướ ế thì th c hi n b ự ệ ệ Th c hi n các l nh  2. ệ while. ế K t thúc l nh  3. ươ ụ t ch : Vi Ví d  1.14 vòng l p ặ while.

12

#include   #include  int main ()  {

int i;  printf("Day so tu 1 den 10 :\n");  i=1; while (i<=10)  {        printf("%d \n",i);        i++; } getch();  return 0;

ệ ự ệ ươ ự ư ụ

ế ả ế ề ệ , trong tr

ng t ặ while (i<=10) k t thúc khi  ứ ổ Bi u_th c_đi u_ki n ươ ắ ườ ở ạ ợ ủ ị nh  trong ví d  1.11 là in ra màn hình ư ằ ế i>10, l u ý r ng trong thân   ế i.  ng h p này là bi n  cướ ng trình thì giá tr  kh i t o c a bi n ế i tr

} ụ Ví d  này th c hi n công vi c t ố ừ 10 s  t  1 đ n 10. Vòng l p  ặ vòng l p ph i làm bi n đ i  ả ể ả Đ  đ m b o tính đúng đ n c a ch ệ ự khi th c hi n vòng l p ể ủ ấ ặ i=1 là r t quan tr ng.

ế ươ a và b, vi t ch ng trình tính và in ra ướ   c ố : Cho hai s  nguyên d

ươ ố ụ Ví d  1.15 ớ ố s  chung l n nh t ( ọ ng  ủ ấ USCLN) c a hai s  đó.

#include   #include  int main ()  {

int a, b, m, n, tg;  printf("Nhap vao cac he so a,b:");  scanf("%d %d",&a,&b);  m=a, n=b; while (n>0) {

tg = m % n; m = n; n = tg;

} printf("USCLN cua %d va %d la: %d",a,b,m); getch();  return 0;

ầ ủ ậ } Gi c xây d ng theo thu t toán

ự ơ ươ ơ

ị ị ầ ư ủ ụ m cho n. Trong ví d  trên, khi ng

ọ ự ạ Euler, ph n chính c a thu t toán     ng trình này, các ể ư ế a, b; sau đó dùng các bi n ế m, n đ  l u các   n<=0, v i ớ n  ế ị  ườ ử ụ ể  ể  tìm hi u và gi ậ i s  d ng nh p giá tr ả i thích đ ng trình còn đúng không? B n đ c t

13

ươ ượ iả  thu t trên đ ậ ậ ố nhỏ” h n còn l n h n không. Trong ch ớ ặ này là vòng l p khi s  “ ượ ư ậ giá tr  nh p vào đ c l u vào hai bi n  ặ ể giá tr  này và dùng đ  tính toán. Vòng l p trong ví d  trên k t thúc khi  là ph n d  c a phép chia  ươ cho b là 0 thì ch ơ ệ hi u h n l nh này. ế ụ : Vi Ví d  1.16 cho phép nh p ậ m t ộ kí t bàn phím và ghi mã ng trình ự ừ  t t ch

ươ ế ấ ủ ng trình k t thúc khi nh n phím Enter.

ASCII c a nó ra màn hình. Ch #include   #include  int main ()  {

char ch;   ch = ’~’ ; while (ch!=13) {

ch=getch(); printf("%c ­ %d \n",ch, ch);

} return 0;

ả ASCII (B ng 1­2)

ươ ệ

ng trình trên l nh  ể ướ ế ch. Trong ch ệ c khi th c hi n bi u th c

ế t, tuy nhiên tr ệ ướ ế

ử ụ ệ Enter có mã là 13. Hàm getch() cho phép đ cọ   ch=’~’; có  ứ ch!=13 thì ch ch aư   ố t. Đây là tình hu ng không hay khi   ẽ ơ do .. while ệ while và chúng ta s  vi ầ i đ p đ  h n khi s  d ng l nh ự c đó là c n thi ẽ ế ạ ẹ t l

} ả Theo b ng mã  ự ừ ộ  bàn phím và gán vào bi n   t m t ký t ầ ẻ v  là không c n thi ị ị xác đ nh giá tr  nên l nh gán tr ử ụ s  d ng l nh  sau đây. 5. L nh ệ do .. while

ệ ệ ự ặ ặ ạ ộ ố ầ i m t s  l n.

ể ệ ề Cho phép th c hi n công vi c nào đó l p đi l p l Cú pháp:  do {Các l nh}ệ   ứ while (Bi u_th c_đi u_ki n)

ể ề ứ ề ể ệ ể ặ ể ệ  là bi u th c đi u ki n dùng đ  đi u khi n vòng l p.

ệ Trong đó:  ề ứ Bi u_th c_đi u_ki n ệ : ự Cách th c hi n ự 8.

ứ ượ ệ , n u giá tr  nh n đ c khác không thì tr ở

ế ằ {Các l nh}ệ ệ Th c hi n các l nh  ; ế ị ề ể 9. Tính giá tr  ị Bi u_th c_đi u_ki n ế ướ ể c 1, n u b ng không thì chuy n đ n b ậ c 3;

ươ ố ừ ế t ch ể ng trình đ  in các s  t ử ụ    1 đ n 10 ra màn hình s  d ng : Vi

ạ ướ i b l ế 1. K t thúc. ế ụ Ví d  1.17 vòng l p ặ do .. while.

#include   #include  int main ()  {

14

int i;  printf("Day so tu 1 den 10 :\n");  i=1; do

{        printf("%d \n",i);        i++; } while (i<=10); getch();  return 0;

ụ ớ ế ả ố

ự ệ ặ ự i<=10, sau khi đã th c hi n l n đ u tiên c a vòng l p. Cũng nh

ụ ể ặ ề ủ ứ ổ Bi u_th c_đi u_ki n } ụ ặ   Ví d  này cho k t qu  gi ng v i ví d  1.11 và 1.14. Trong ví d  này vòng l p ệ ầ ư  ệ , và vi cệ   ế

ở ạ ủ ướ ự ặ

ố ử ụ ệ ươ ả ệ c khi th c hi n vòng l p. ủ ng trình tính USCLN c a hai s  s  d ng l nh do .. while.

ụ ầ còn th c hi n khi  ví d  1.14 trong thân vòng l p ph i làm bi n đ i   ế i tr kh i t o c a bi n  ế ụ Ví d  1.18 t ch : Vi #include   #include  int main ()  {

int a, b, m, n, tg;  printf("Nhap vao cac he so a,b:");  scanf("%d %d",&a,&b);  m=a, n=b; do  {

tg = m % n; m=n; n=tg;

} while (n>0); printf("USCLN cua %d va %d la: %d",a,b,m); getch();  return 0;

ớ ươ ụ ướ ấ ể ả ể   ụ ng trình trong ví d  1.15. Đi m ầ   ầ m%n l n đ u c đó là phép chia  USCLN c a 2ủ   i bài toán tìm

ố ng trình trên là gi ng v i ch ớ ng trình này so v i ví d  tr ụ n<>0. Ví d  này cho th y đ  gi ệ while s  thu n l i h n.

ẽ ụ ậ ợ ơ ử ụ ệ : Vi i ví d  1.16 s  d ng l nh do .. while.

}  ươ ề ơ ả V  c  b n ch ươ ủ không hay c a ch ả ằ ả không đ m b o r ng  ử ụ ố s  thì s  d ng l nh  ạ t ế l ụ Ví d  1.19 #include   #include  int main ()  {

char ch;   do {

ch=getch();

15

printf("%c ­ %d \n",ch, ch);

} while (ch!=13) return 0;

ươ

ươ

Ch

ng trình này rõ ràng là “

ơ đ pẹ ” h n ch

ng trình t

ng t

trong ví d  1.16.

} ươ

ặ ở ệ ề ấ ặ ệ Trong ph n trình bày v  các câu l nh l p

6. L nh break và continue ầ ề ế ố ệ ặ ễ ỏ

ấ ộ ố ế ữ ậ ặ ớ ượ ề ơ

ệ ỉ  ệ  trên ta th y vi c k t thúc l p ch ỏ   ề di n ra khi đi u ki n l p không còn th a mãn. V n đ  là n u mu n thoát ra kh i vòng l p s m h n thì có đ   c không?  Trong m t s  ngôn ng  l p trình đi u này là ượ đ

break:  Dùng đ  k t thúc s  th c hi n c a m t trong các l nh

ể ế ệ ủ do, for, c phép, và trong C/C++ đó là l nh  L nh  ệ

ứ ề ế ế ế ệ break ho c ặ continue.  ộ ệ ự ự ể ể ượ switch ho c ặ while ch a nó, sau đó đi u khi n đ c chuy n đ n câu l nh k  ti p.

Cú pháp: break;

ể ế L nh  ệ break  th

ườ ế ườ ệ ế ệ ẫ ủ   ử c dùng đ  k t thúc vi c x  lý m t nhánh nào đó c a ỗ   i ộ ệ break  trong   l nh   này   th ng   d n   đ n   l

ượ ng đ ế switch,   và   n u   thi u   các   l nh   ng trình. ệ l nh   ươ ch

ệ ặ ỉ ế ệ ấ ộ ệ Trong các l nh l p, l nh break ch  k t thúc duy nh t m t câu l nh do, for, ho cặ

ể ạ ầ

: L nh này dùng đ  quay l ạ ặ ể ừ ố ệ ự continue. các l nh trong kh i l nh l p (d ng for, do hay while) k  t ặ ệ   i đ u vòng l p mà không th c hi n ệ  sau l nh

ứ ự ế while tr c ti p ch a nó. ệ ệ L nh continue ệ Cú pháp:

continue; ế ặ ượ ư ị c xác đ nh nh  sau:

ượ ắ ầ ế ằ c b t đ u b ng cách tính l ạ   i

Vòng l p ti p theo đ Trong vòng l p ặ do và while, vòng l p ti p theo đ ể ủ bi u th c đi u khi n c a câu l nh.

ự ệ ớ

ế ả ặ ệ for(i; c; e)) thì l nh ệ ộ ẽ continue s  cho phép th c hi n công i ạ c và tùy thu c vào k t qu  đúng hay sai mà vòng

c ti p t c hay không. ươ

ỉ ầ ư ắ

ề ứ ể ặ for (d ng ạ V i vòng l p  ệ ủ e, sau đó tính l vi c c a  ế ụ ặ ượ l p đ ấ 7. C u trúc ch ng trình ươ ộ M t ch ứ ự ư theo th  t ỉ

ị ể ữ ệ

ế

ế

ươ

ạ ượ

ả K t qu :  Ch

ng trình

c theo các yêu c u đ t ra.

QLSV ch y đ

16

ộ   ng trình hoàn ch nh trong C/C++ có 6 ph n chính (nh ng không b t bu c)  nh  sau:  - Ch  th  ti n x  lý; ị ề ử - Đ nh nghĩa ki u d  li u; - Khái báo prototype; - Khai báo bi n ngoài ; - Ch ươ ng trình chính và  ặ - Cài đ t hàm.