Ậ Ậ
ự ậ
Ỹ
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 13:
ươ
ự
ả
ớ
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
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
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
6
int thu; printf("Nhap vao thu (28, 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
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, so1so2); 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
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
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
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
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
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
ổ 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
ặ ạ ự ệ ệ ặ ộ ố ầ 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
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
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
char ch; ch = ’~’ ; while (ch!=13) {
ch=getch(); printf("%c %d \n",ch, ch);
} return 0;
ả ASCII (B ng 12)
ươ ệ
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
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
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
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.

