Bài 9 Vòng l p
M c tiêu:
K t thúc bài h c này, b n có th :ế
Hi u đ c vòng l p ‘for’ trong C ượ
Làm vi c v i toán t ‘ph y’
Hi u các vòng l p l ng nhau
Hi u vòng l p ‘while’ và vòng l p ‘do-while’
Làm vi c v i l nh ‘break’ và l nh ‘continue’
Hi u hàm ‘exit()’.
Gi i thi u:
M t trong nh ng đi m m nh l n nh t c a máy tính là kh năng th c hi n m t chu i các l nh l p
đi l p l i. Đi u đó có đ c là do s d ng các c u trúc l p trong ngôn ng l p trình. Trong bài này ượ
b n s tìm hi u các lo i vòng l p khác nhau trong C.
M t trong nh ng u đi m l n nh t c a máy tính kh năng th c thi m t chu i các ch th l p di ư
l p l i. Đi u này có đ c là nh vào các c u trúc l p trong ngôn ng l p trình. Trong bài này chúng ượ
ta s tìm hi u các c u trúc vòng l p khác nhau trong C.
9.1 C u trúc l p Vòng l p:
Vòng l p là m t đo n mã l nh trong ch ng trình đ c th c hi n l p đi l p l i cho đ n khi th a ươ ư ế
mãn m t đi u ki n nào đó. Vòng l p là m t khái ni m c b n trong l p trình c u trúc. ơ
M t vòng l p ph n mã l nh trong m t ch ng trình đ c th c hi n l p đi l p l i mãi cho đ n ươ ượ ế
khi m t đi u ki n xác đ nh đ c th a. Khái ni m vòng l p là n n t n c a l p trình c u trúc. ượ
Trong C có các lo i vòng l p sau:
Vòng l p for
Vòng l p while
Vòng l p do…while
Ta s d ng các toán t quan h toán t logic trong các bi u th c đi u ki n đ đi u khi n s
th c hi n c a vòng l p.
Các c u trúc l p s n có trong C là:
L p for.
L p while.
L p do …while
Trong C, đi u ki n đi u khi n s th c thi c a vòng l p đ c t o ra b ng vi c s d ng các toán t ượ
Quan h Logic.
9.2 Vòng l p ‘for’:
Cú pháp t ng quát c a vòng l p for nh sau:ư
for(kh i t o giá tr cho bi n đi u khi n; bi u th c đi u ki n;bi u ế
th c thay đ i giá tr c a bi n đi u khi n) ế
{
u l nh (c u l nh);
Vòng l p1
}
Kh i t o giá tr cho bi n đi u khi n ế là m t câu l nh gán giá tr ban đ u cho bi n đi u khi n tr c ế ướ
khi th c hi n vòng l p. L nh này ch đ c th c hi n duy nh t m t l n. ượ Bi u th c đi u ki n là m t
bi u th c quan h , xác đ nh đi u ki n thoát cho vòng l p. Bi u th c thay đ i giá tr c a bi n đi u ế
khi n xác đ nh bi n đi u khi n s b thay đ i nh th nào sau m i l n vòng l p đ c l p l i ế ư ế ượ
(th ng là tăng ho c gi m giá tr c a bi n đi u khi n). Ba ph n trên đ c phân cách b i d uườ ế ượ
ch m ph y. Câu l nh trong thân vòng l p có th là m t l nh duy nh t (l nh đ n) ho c l nh ph c ơ
(nhi u l nh).
Vòng l p for s ti p t c đ c th c hi n ch ng nào mà bi u th c đi u ki n còn ế ư đúng (true). Khi
bi u th c đi u ki n là sai (false), ch ng trình s thoát ra kh i vòng l p ươ for.
Cú pháp t ng quát c a vòng l p for nh sau:ư
for(kh i t o b đ m;đi u ki n ki m tra;đ nh l i gtr tham s ) ế
{
c u l nh;
}
kh i t o b đ m ế m t l nh gán đ thi t l p bi n đi u khi n c a vòng l p tr c khi b t đ u ế ế ướ
vòng l p. Câu l nh này ch đ c th c thi m t l n. ượ
Đi u ki n ki m traềệể là m t bi u th c quan h , xác đ nh khi nào vòng l p s k t thúc . ế
Đ nh l i giá tr tham s đ nh nghĩa cách thay đ i giá tr c a bi n đi u khi n vòng l p (thông ế
th ng, bi n này s tăng ho c gi m giá tr thi t l p t i th i đi m b t đ u) m i khi vòng l p đ cườ ế ế ượ
l p l i.
Ba ph n này c a vòng l p for đ c phân cách b i d u ch m ph y (ượ ;). Các câu l nh, ph n thân c a
vòng l p, có th là m t câu l nh đ n ho c m t l nh ghép (nhi u câu l nh). ơ
Vòng l p for ti p t c đ c th c thi khi đi u ki n ki m tra k t qu ế ượ ế true. Ng c l i, khi đi uượ
ki n có k t qu ế false, ch ng trình ti p t c câu l nh sau vòng l p ươ ế for.
Xem ví d sau:
/* Đây ch ng tnh minh h a vòng l p for trong ch ng tnh C*/ươ ươ
#include <stdio.h>
main()
{
int count;
printf(“\t This is a \n”);
for (count = 1; count <= 6; count++)
printf(“\n \t \t nice”);
printf(“\n\t\t world. \n”);
}
K t qu c a ch ng trình trên đ c minh h a nh sau:ế ươ ượ ư
K t qu c a ch ng trình hi n th nh sau:ế ươ ư
This is a
nice
nice
nice
nice
nice
nice
world.
2 L p trình c b n C ơ
Chúng ta s xem xét kĩ đo n vòng l p for trong ch ng trình trên:ươ
1. Kh i t o giá tr cho bi n đi u khi n: c ế ount = 1.
L nh này đ c th c hi n duy nh t m t l n khi vòng l p b t đ u đ c th c hi n, bi n count ượ ượ ế
đ c đ t giá tr là 1.ượ
2. Bi u th c đi u ki n: count < = 6.
Ch ng trình ki m tra xem giá tr hi n t i c a bi n count nh h n hay b ng 6 hay không. N uươ ế ơ ế
đúng, các câu l nh trong thân vòng l p s đ c th c hi n. ượ
3. Thân c a vòng l p có duy nh t m t l nh
printf(“\n \t \t nice”);
Câu l nh này có th đ t trong c p d u ngo c nh n {} cho d nhìn.
4. Bi u th c thay đ i giá tr c a bi n đi u khi n ế count++ , tăng giá tr c a bi n ế count lên 1 cho
l n l p k ti p. ế ế
Các b c 2, 3, 4 đ c l p l i cho đ n khi bi u th c đi u ki n ướ ượ ế sai. Vòng l p trên s đ c th c ượ
hi n 6 l n v i giá tr c a count thay đ i t 1 đ n 6. v y, t ế nice xu t hi n 6 l n trên màn hình.
Sau đó, count tăng lên 7. Do giá tr này l n h n 6, vòng l p k t thúc câu l nh sau vòng l p đ c ơ ế ượ
th c hi n.
Quan sát vòng l p for trong ch ng trình:ươ
1. Kh i t o b đ m ế count = 1.
Đ c th c thi ch m t l n khi b t đ u vòng l p, và bi n ượ ế count đ c thi t l p giá tr là 1.ượ ế
2. Đi u ki n ki m tra là ềệể count < = 6.
M t s ki m tra đ c th c hi n đ xác đ nh giá tr hi n hành c a bi n ượ ế countnh h n hay b ng ơ
6 không. N u k t qu ế ế true, thì thân c a vòng l p đ c th c thi. ượ
3. Ph n thân c a vòng l p ch a m t câu l nh đ n. ơ
printf(“\n \t \t nice”);
Câu l nh này có th đ t trong c p d u ngo c {} đ giúp d nhìn h n. ơ
4. Ph n đ nh l i giá tr tham s count++, tăng giá tr c a bi n ế count lên 1 cho l n l p k ti p. ế ế
Các b c 2, 3, 4 đ c l p l i cho đ n khi đi u ki n ki m tra tr thành ướ ượ ế false. Vòng l p s đ c ượ
th c hi n 6 l n v i giá tr c a count ch y t 1 đ n 6. Vì v y, t ế nice xu t hi n 6 l n trên màn hình.
l n l p k ti p, ế ế count tăng lên 7. Do giá tr này l n h n 6, vòng l p k t thúc câu l nh sau ơ ế
vòng l p đ c th c thi. ượ
Ch ng trình sau in ra các s ch n t 1 đ n 25.ươ ế
Ví d 9.2:
#include <stdio.h>
main()
{
int num;
printf(“The even numbers from 1 to 25 are: \n\n”);
for (num2; num <= 25; num+=2)
printf(“%d\n”, num);
}
Vòng l p3
K t qu c a ch ng trình trên nh sau:ế ươ ư
The even numbers from 1 to 25 are:
2
4
6
8
10
12
14
16
18
20
22
24
Vòng l p for trên kh i t o giá tr c a bi n nguyên ế num là 2 (đ l y m t s ch n) và tăng giá tr
c a nó lên 2 m i l n vòng l p đ c l p l i. ượ
Vòng l p for trên kh i t o bi n s nguyên ế num 2 l y m t s ch n) m i khi vòng l p đ c th c thi ượ
giá tr c a nó s đ c tăng 2. ượ
Trong các vòng l p for, bi u th c đi u ki n luôn đ c ki m tra ngay khi b t đ u vòng l p. Do đó ượ
các l nh trong thân vòng l p s không đ c th c hi n n u ngay t ban đ u đi u ki n đó là ượ ế sai.
Trong các vòng l p for, đi u ki n ki m tra luôn luôn đ c th c hi n t i đ u vòng l p. Đi u này có ượ
nghĩa r ng, đo n mã l nh bên trong vòng l p không đ c th c thi n u đi u ki n là ượ ế false khi b t
đ u l n l p đó.
Toán t ‘ph y (comma)’ :
Ph n bi u th c trong toán t for có th đ c m r ng đ thêm vào các l nh kh i t o hay các l nh ượ
thay đ i giá tr c a bi n. Cú pháp nh sau: ế ư
Ph m vi c a vòng l p for th đ c m r ng b ng s thêm vào nhi u h n m t bi u th c kh i ượ ơ
t o ho c bi u th c tăng tr trong ph n đ c t c a vòng l p for. Đ nh d ng nh sau: ư
bi u_th c1 , bi u_th c2
Các bi u th c trên đ c phân cách b i toán t ượ ‘ph y’ ( , ), và đ c th c hi n t trái sang ph i.ư
Th t c a các bi u th c là quan tr ng trong tr ng h p giá tr c a bi u th c th hai ph thu c ư
vào giá tr c a bi u th c th nh t . Toán t này có đ u tiên th p nh t trong các toán t c a C. ư
Các bi u th c đ c phân cách b i toán t ượ ph y’ và đ c đ nh tr t trái sang ph i. Th t đ nh trượ
bi u th c quan tr ng n u giá tr c a ế bi u_th c2 l thu c vào giá tr m i đ c tính toán c a ượ
bi u_th c1 . Toán t này có đ u tiên th p nh t trong các toán t c a C. ư
Ví d d i đây in ra m t b ng các phép c ng v i k t qu không đ i đ minh h a khái ni m v ướ ế
toán t ph y rõ ràng h n. ơ
Ví d sau đây s in ra m t b ng phép c ng v i k t qu là m t h ng s , nh m minh h a khái ni m ế
v toán t ‘ph y’ rõ ràng h n: ơ
Ví d 9.3:
#include <stdio.h>
main()
{
int i, j, max;
4 L p trình c b n C ơ
printf(“Please enter the maxinum value \n”);
printf(“for which a table can be printed: “);
scanf(“%d”, &max);
for (i = 0, j = max; i < = max; i++, j--)
printf(“\n%d + %d = %d”, i, j, i + j);
}
K t qu c a ch ng trình trên đ c minh h a nh sau:ế ươ ượ ư
M t ví d th c thi ch ng trình trên nh sau: ươ ư
Please enter the maxinum value
for which a table can be printed: 5
0 + 5 = 5
1 + 4 = 5
2 + 3 = 5
3 + 2 = 5
4 + 1 = 5
5 + 0 = 5
Chú ý trong vòng l p for, ph n kh i t o giá tr là:
i = 0, j = max
Khi vòng l p b t đ u ch y, i đ c gán giá tr 0 và ượ j đ c gán giá tr c a ượ max.
Ph n thay đ i giá tr c a bi n đi u khi n g m hai bi u th c: ế
i++, j—
sau m i l n th c hi n thân vòng l p, i đ c tăng lên 1 và ượ j gi m đi 1. T ng c a hai bi n đó luôn ế
b ng max và đ c in ra màn hình:ượ
Chú ý, trong vòng l p for, kh i t o tham s là:
i = 0 , j = max
Khi đ c th c thi, ượ i đ c gán giá tr 0 và ượ j đ c ượ gán giá tr c a max..
Bi u th c đ nh l i tr tham s (tăng tr ) cũng ch a hai bi u th c:
i ++ , j--
sau m i l n l p, i đ c tăng lên 1 ượ j đ c gi m xu ng 1. T ng c a hai bi n luôn luôn b ng giáượ ế
tr max đ c in ra màn hình.ượ
Vòng l p ‘ for l ng nhau’ :
M t vòng l p for đ c g i l ngượ nhau vào khi nó n m bên trong m t vòng l p for khác. l nh
s có d ng t ng t nh sau: ươ ư Nó s có d ng t ng t nh sau: ươ ư
for (i = 1; i < max1; i++)
{ ….
….
for (j = 0; j < max2 ; j++)
{
…..
}
….
}
Xem ví d sau:
Vòng l p5