Nguyen Dinh Phuong
Bài 7 Đi u ki n
M c tiêu:
K t thúc bài h c này, b n có th :ế
Gi i thích v C u trúc l a ch n
Câu l nh if
Câu l nh if – else
Câu l nh v i nhi u l nh if
Câu l nh if l ng nhau
Câu l nh switch.
Gi i thi u
Các v n đ đ c đ c p t đ u đ n nay cho phép chúng ta vi t nhi u ch ng trình. Tuy ượ ế ế ươ
nhiên các ch ng trình đó có nh c đi m là b t c khi nào đ c ch y, chúng luôn th cươ ượ ượ
hi n m t chu I các thao tác gi ng nhau, theo cách th c gi ng nhau. Trong khi đó, chúng ta
th ng xuyên ch cho phép th c hi n các thao tác nh t đ nh n u ườ ế nó th a mãn đi u ki n đ t
ra.
Các y u t l p trình C đ c th o lu n nh ng ch ng tr c đã có th giúp b n vi t h u h t cácế ượ ươ ướ ế ế
ch ng trình. Tuy nhiên, v n đ là khi đ c th c thi, các ch ng trình d ng này luôn th c hi nươ ượ ươ
m t chu i các hành đ ng gi ng nhau, theo cùng m t cách th c, đúng m t l n. Trong khi l p trình,
chúng ta th ng xuyên c n th c hi n m t s hành đ ng ch khi m t đi u ki n nào đó đ c th aườ ượ
mãn.
7.1. Câu l nh đi u ki n là gì ?
Các câu l nh đi u ki n cho phép chúng ta thay đ I lu ng ch ng trình. D a trên m t đi u ươ
ki n nào đó, m t câu l nh hay m t chu I các câu l nh có th đ c th c hi n ho c không. ượ
H u h t các ngôn ng l p trình đ u s d ng l nh if đ đ a ra đi u ki n. Nguyên t c th c ế ư
hi n nh sau n u đi u ki n đ a ra ư ế ư đúng (true), ch ng trình s th c hi n m t côngươ
vi c nào đó, n u đi u ki n đ a ra là ế ư sai (false), ch ng trình s th c hi n m t công vi cươ
khác.
Các câu l nh đi u ki n cho phép chúng ta thay đ i h ng th c hi n c a ch ng trình. D a vào ướ ươ
m t đi u ki n, m t l nh ho c m t chu i các câu l nh s th c hi n các hành đ ng l a ch n.
H u h t các ngôn ng l p trình s d ng câu l nh ế if đ t o ra các quy t đ nh. M t trong nh ng khái ế
ni m c b n c a ngành khoa h c máy tính ơ n uế đi u ki n xác đ nh là đúng (true), máy tính đ cượ
đ nh h ng đ nh n m t hành đ ng, ướ n u ếđi u ki n sai (false), đ c đ nh h ng đ th cượ ướ
hi n m t hành đ ng khác.
Ví d 7.1:
Đ xác đ nh m t s là s ch n hay s l , ta th c hi n nh sau: ư
1. Nh p vào m t s .
2. Chia s đó cho 2 đ xác đ nh s d . ư
3. N u s d c a phép chia là 0, đó là s “Ch n”.ế ư
HO C
Ma$ter.P - Đi u ki n Smith.N Studio E-book - 1
King.P
N u s d c a phép chia khác 0, đó là s “L ”.ế ư
B c 2 trong gi I thu t trên ki m tra ph n d c a s đó khi chia cho 2 có b ng 0 không?ướ ư
N u đúng, ta th c hi n vi c hi n th thông báo đó là s ch n. N u s d đó khác 0, ta th cế ế ư
hi n vi c hi n th thông báo đó là s l .
B c 2 trong gi i thu t ki m tra xem k t qu s d c a phép chia 2 0 không ? Trong tr ngướ ế ư ườ
h p này, chúng ta nh n m t hành đ ng xác đ nh đó là hi n th s đã đ c nh p vào là m t s ch n. ượ
N u k t qu c a phép chia l y s d khác 0, m t h ng hành đ ng khác đ c th c hi n, hi n thế ế ư ướ ượ
đó là m t s l .
Trong C m t đi u ki n đ c coi là đúng (true) khi nó có giá tr khác 0, là sai (false) khi nó có giá tr ượ
b ng 0. M t đi m c n chú ý. Trong ngôn ng C m t câu l nh đi u ki n đ c đánh giá ượ true
(đúng) t ng đ ng giá tr khác 0 và ươ ươ false (sai) t ng đ ng giá tr là 0.ươ ươ
2G-Unit L p trình c b n C ơ
Nguyen Dinh Phuong
7.2. Các câu l nh l a ch n:
C cung c p hai d ng câu l nh l a ch n:
Câu l nh if
Câu l nh switch
Chúng ta hãy tìm hi u hai câu l nh l a ch n này.
7.2.1 Câu l nh ‘if’:
Câu l nh if cho phép ta đ a ra các quy t đ nh d a trên vi c ki m tra m t đi u ki n nào đó là ư ế đúng
(true) hay sai (false).
Câu l nh if cho phép các quy t đ nh đ c th c hi n b i vi c ki m tra đi u ki n đ c đ a ra ế ượ ượ ư
đúng (true) hay sai (false).
Các đi u ki n g m các toán t so sánh và logic mà chúng ta đã th o lu n bài 4.
D ng t ng quát c a câu l nh if:
if (bi u th c)
Các câu l nh;
Bi u th c ph i luôn đ c đ t trong c p d u ngo c (). M nh đ theo sau t khoá ư if m t đi u
ki n (ho c m t bi u th c đi u ki n) c n đ c ki m tra. Ti p đ n m t l nh hay m t t p các ượ ế ế
l nh s đ c th c thi khi đi u ki n (ho c bi u th c đi u ki n) có k t qu ượ ế true.
Ví d 7.2:
#include <stdio.h>
void main()
{
int x, y;
char a = ‘y’;
x = y = 0;
if (a == ‘y’)
{
x += 5;
printf(“The numbers are %d and \t%d”, x, y);
}
}
K t qu c a ch ng trình nh sau:ế ươ ư
The numbers are 5 and 0
Có k t qu này là do bi n ế ế a đã đ c gán giá tr 'ượ y'.
Chú ý r ng, kh i l nh sau l nh if đ c đ t trong c p ngo c nh n {}. Khi có nhi u l nh c n đ cượ ượ
th c hi n, các câu l nh đó đ c coi nh m t block (kh I l nh) và ph I đ c đ t trong c p d u {}. ượ ư ượ
N u trong ví d trên ta không đ a vào d u ngo c nh n câu l nh if, ch có câu l nh đ u tiên (x +=ế ư
5) đ c th c hi n khi đi u ki n trong câu l nh if là đúng.ượ
Chú ý r ng, kh i các câu l nh theo sau l nh if đ c đ t trong c p ngo c xo n ượ { }. Hãy nh r ng,
n u các c u trúc có nhi u h n m t câu l nh theo sau nó, các câu l nh ph i đ c xem nh m t kh iế ơ ượ ư
và ph i đ c đ t gi a c p ngo c xo n. N u trong ví d trên không t n t i c p ngo c xo n thì ch ư ế
có câu l nh đ u tiên (x += 5) đ c th c thi khi l nh ượ if có giá tr true.
Ma$ter.P - Đi u ki n Smith.N Studio E-book - 3
King.P
Ví d d i đây s ki m tra m t năm ph i năm nhu n hay không. Năm nhu n năm chia h t ướ ế
cho 4 ho c 400 nh ng không chia h t cho 100. Chúng ta s d ng l nh ư ế if đ ki m tra đi u ki n.
Ví d 7.3:
/* To test for a leap year */
#include <stdio.h>
void main()
{
int year;
printf(“\nPlease enter a year:”);
scanf(“%d”, &year);
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
printf(“\n%d is a leap year!”, year);
}
Ch ng trình trên cho ra k t qu nh sau:ươ ế ư
Please enter a year: 1988
1988 is a leap year!
Đi u ki n year % 4 == 0 && year % 100 != 0 || year % 400 == 0 tr v giá tr 1 n u năm đó ế
năm nhu n. Khi đó, ch ng trình hi n th thông báo g m bi n year dòng ch ươ ế “is a leap year”.
N u đi u ki n trên không th a mãn, ch ng trình không hi n th thông báo nào.ế ươ Đi u ki n year % 4
== 0 && year % 100 != 0 || year % 400 == 0 cho k t qu mang giá tr 1 n u bi n ế ế ế year đ c nh pượ
vào là m t năm nhu n. Trong tr ng h p này, giá tr bi n ườ ế year theo sau b i dòng “is a leap year”
đ c xu t ra màn hình. N u đi u ki n không đ t, không dòng thông tin nào đ c xu t ra mànượ ế ượ
hình.
7.2.2 Câu l nh ‘if … else’:
trên chúng ta đã bi t d ng đ n gi n nh t c a câu l nh ế ơ if, cho phép ta l a ch n đ th c hi n hay
không m t câu l nh ho c m t chu I các l nh. C cũng cho phép ta l a ch n trong hai kh I l nh đ
th c hi n b ng cách dùng c u trúc if – else. Cú pháp nh sau:ư
trên chúng ta đã bi t đ n d ng đ n gi n nh t c a m t l nh ế ế ơ if, đ a ra cho chúng ta m t s l aư
ch n đ th c thi m t l nh, m t kh i các l nh ho c b qua chúng. C cũng cho phép chúng ta l a
ch n gi a hai l nh b ng cách s d ng c u trúc if – else. Cú pháp nh sau:ư
if (bi u th c)
câu_l nh – 1;
else
câu_l nh – 2;
N u bi u th c đi u ki n trên là ế đúng (khác 0), câu l nh 1 đ c th c hi n. N u nó ượ ế sai (khác 0) câu
l nh 2 đ c th c hi n. Câu l nh sau ượ if else th l nh đ n ho c l nh ph c. Các câu l nh đó ơ
nên đ c lùi vào trong dòng m c không b t bu c. Cách vi t đó giúp ta nhìn th y ngay nh ngượ ế
l nh nào s đ c th c hi n tùy theo k t qu c a bi u th c đi u ki n. ượ ế Bi u th c đ c xác đ nh giá ượ
tr , n u nó mang giá tr ế true (khác 0), câu_l nh – 1 đ c th c thi. N u bi u th c mang giá tr ượ ế false
(0) thì câu_l nh 2 đ c th c thi. Nh ng câu l nh theo sau ượ if else th l nh đ n ho c l nh ơ
4G-Unit L p trình c b n C ơ
Nguyen Dinh Phuong
ghép. S canh l các dòng l nh không đòi h i, tuy nhiên đó m t phong cách vi t ch ng trình ế ươ
t t. Nó cho bi t nh ng câu l nh th c thi thu c vào s ki m soát nào. ế
Bây gi chúng ta vi t m t ch ng trình ki m tra m t s là s ch n hay s l . N u ế ươ ế sau khi đem chia
s đó cho 2 s đ c ượ d là 0 ch ng trình s hi n th dòngư ươ ch “The number is Even”, ng c l i sượ
hi n th dòng ch “The number is Odd”.
Ví d 7.4:
#include <stdio.h>
void main()
{
int num, res;
printf(“Enter a number: ”);
scanf(“%d”, &num);
res = num % 2;
if (res == 0)
printf(“The number is Even”);
else
printf(“The number is Odd”);
}
Xem m t d khác, ví d s đ i m t ký t hoa thànht th ng. N u ký t không ph i m t ườ ế
ký t hoa, s đ c in ra không c n thay đ i. Ch ng trình s d ng c u trúc ượ ươ if-else đ ki m
tra xem m t ký t ph i là ký t hoa không, và sau đó s l a ch n gi a hai h ng s n có ướ r I th c
hi n các thao tác t ng ng ươ .
Ví d 7.5:
/* Doi mot ky tu hoa thanh ky tu thuong */
#include <stdio.h>
void main()
{
char c;
printf(“Please enter a character: ”);
scanf(“%c”, &c);
if (c >= ‘A’ && c <= ‘Z’)
printf(“Lowercase character = %c”, c + ‘a’ – ‘A’);
else
printf(“Character Entered is = %c”, c);
}
Bi u th c c >= ‘A’ && c <= ‘Z’ ki m tra ký t nh p vào là ký t hoa không. N u bi u th c ế
k t quế tr v true, ký t xu t đó s đ c đ i thành ký t th ng b ng cách s d ng bi u th c ượ ườ c
+a’ ‘A’, đ c in ra màn hình qua ượ s d n g hàm printf() đ xu t ra màn hình. N u giá tr c aế
bi u th c false, câu l nh sau else đ c ượ ch y ch ng trình hi n th t đó ra màn hình ươ
không c n th c hi n b t c s thay đ I nào. l nh theo sau else đ c th c thi t đ c hi nượ ượ
th ra màn hình mà không c n b t c s thay đ i nào c .
7.2.3 Nhi u l a ch n – Cácu l nh if … else’:
Ma$ter.P - Đi u ki n Smith.N Studio E-book - 5