You are on page 1of 26

Tuần 2

Cấu trúc rẽ nhánh


CT101 – Lập trình căn bản

Khoa CNTT&TT – ĐHCT


Mục đích
• Giới thiệu cấu trúc lệnh rẽ nhánh và cách sử dụng

CT101 - Lập trình căn bản 2 Khoa CNTT&TT


Yêu cầu

• Hiểu lệnh rẽ nhánh


• Viết được những chương trình đơn giản có lưu
trữ dữ liệu, tính toán, hiển thị kết quả tùy theo
điều kiện của vấn đề đặt ra

CT101 - Lập trình căn bản 3 Khoa CNTT&TT


Nội dung
• Cấu trúc lệnh rẽ nhánh
 if
 if – else
 switch case

CT101 - Lập trình căn bản 4 Khoa CNTT&TT


Lệnh rẽ nhánh
Điều kiện phải
để trong cặp
dấu ( và )
if ( điều kiện )
công việc
Nếu điều kiện đúng
(khác 0), thực hiện
công việc. Ngược lại
bỏ qua công việc.
điều kiện
no
yes

công việc

CT101 - Lập trình căn bản 5 Khoa CNTT&TT


Lệnh rẽ nhánh
// Viết chương trình tính giá trị tuyệt đối của một số nguyên
// nhập từ bàn phím và in giá trị đó ra màn hình
#include<stdio.h>
int main ()
{
int number;
printf ("Nhap so nguyen: ");
scanf ("%i", &number);
if ( number < 0 ) Điều kiện
Lệnh rẽ
nhánh if number = -number; Công việc
printf ("Gia tri tuyet doi la %i\n", number);
return 0;
}

CT101 - Lập trình căn bản 6 Khoa CNTT&TT


Lệnh rẽ nhánh
Câu lệnh if-else cho
if ( điều kiện ) phép chọn lựa giữa 2
công việc 1 công việc: nếu điều
else kiện đúng thì thực hiện
công việc 2 công việc 1, nếu điều
kiện sai thì thực hiện
công việc 2

yes
điều kiện
no

công việc 1 công việc 2

CT101 - Lập trình căn bản 7 Khoa CNTT&TT


Lệnh rẽ nhánh
// Viết chương trình nhập vào một số nguyên và
// in ra màn hình cho biết số đó là số lẻ hay số chẵn
#include <stdio.h>
int main ()
{
int number_to_test, remainder;
printf ("Nhap so can kiem tra: ");
scanf ("%i", &number_to_test);
// Tinh phan du cua number_to_test voi 2 va
// luu vao bien remainder
remainder = number_to_test % 2;
if ( remainder == 0 ) Điều kiện
Lệnh
rẽ printf ("So la so chan.\n"); Công việc 1
nhánh else
if-else printf ("So la so le.\n"); Công việc 2
return 0;
}
CT101 - Lập trình căn bản 8 Khoa CNTT&TT
Lệnh rẽ nhánh
if ( điều kiện )
công việc 1 Trong C, dấu ; là
else phần kết thúc của
công việc 2 câu lệnh, được đặt
trước ngay cả
else !
if ( remainder == 0 )
printf ("So la so chan.\n");
else
printf ("So la so le.\n");
Không sai về
cú pháp nhưng
có thể sai về
if ( x == 0 );
ngữ nghĩa!
printf ("So la so 0.\n");
if ( x == 0 );
x bằng 0 hay không bằng 0 vẫn
printf ("So la so 0.\n");
in ra câu lệnh So la so 0.

CT101 - Lập trình căn bản 9 Khoa CNTT&TT


Lệnh rẽ nhánh
// Viết chương trình nhập một năm từ bàn phím;
// kiểm tra xem năm đó có phải là năm nhuận hay không
// và in kết quả ra màn hình
#include <stdio.h>
int main (void)
{
int year, rem_4, rem_100, rem_400; Biểu thức
printf ("Nhap vao nam can kiem tra: "); điều kiện có
scanf ("%i", &year); thể ở dạng
rem_4 = year % 4; phức
rem_100 = year % 100;
rem_400 = year % 400;
if ( (rem_4 == 0 && rem_100 != 0) || rem_400 == 0 )
printf ("Nam vua nhap la nam nhuan.\n");
else
printf ("Nam vua nhap khong la nam nhuan.\n");
return 0;
}

CT101 - Lập trình căn bản 10 Khoa CNTT&TT


Lệnh rẽ nhánh
• Các toán tử logic trong biểu thức điều kiện
Toán tử Ký hiệu Ý nghĩa
AND && x && y đúng khi cả x và y cùng đúng
OR || x || y đúng khi có ít nhất x đúng hoặc y đúng
NOT ! !x đúng nếu x sai

• Các toán tử quan hệ trong biểu thức điều kiện


Toán tử Miền giá trị của toán hạng Miền giá trị của kết quả Ý nghĩa
> Số, ký tự 0, 1 Lớn hơn
>= Số, ký tự 0, 1 Lớn hơn hoặc bằng
< Số, ký tự 0, 1 Nhỏ hơn
<= Số, ký tự 0, 1 Nhỏ hơn hoặc bằng
== Số, ký tự 0, 1 Bằng
!= Số, ký tự 0, 1 Khác

CT101 - Lập trình căn bản 11 Khoa CNTT&TT


Lệnh rẽ nhánh
• Độ ưu tiên của các toán tử trong biểu thức điều kiện

!, ++, --, (type)


*, /, %
Độ ưu tiên +, -
<, <=, >, >=, ==, !=
&&
||
=
Ví dụ về độ ưu tiên của các toán tử:
a > b && b > c || b > d
Tương đương với:
((a > b) && (b > c)) || (b > d)

CT101 - Lập trình căn bản 12 Khoa CNTT&TT


Lệnh rẽ nhánh

if (x >= 5 && x <= 10)


printf(“in range");

if (5 <= x <= 10)


printf(“in range");

CT101 - Lập trình căn bản 13 Khoa CNTT&TT


Lệnh rẽ nhánh

if ((x >= 5) && (x <= 10))


printf(“in range");

if (5 <= x <= 10)


printf(“in range");

Đúng cú pháp nhưng sai ý nghĩa !!!

Bởi vì trong biểu thức này 2 toán tử <= có độ ưu tiên như nhau, quy
tắc kết hợp từ trái sang phải sẽ được áp dụng như sau:
(5<= x) <= 10
Biểu thức 5 <= x có giá trị 1 (nếu đúng) hoặc 0 (nếu sai). Trong cả
hai trường hợp thì đều nhỏ hơn 10, vì thế toàn bộ biểu thức luôn luôn
đúng, không phụ thuộc giá trị của x !

CT101 - Lập trình căn bản 14 Khoa CNTT&TT


Lệnh rẽ nhánh

if (number > 5)
if (number < 10)
printf("1111\n");
else printf("2222\n");

Quy tắc: else sẽ


được kết hợp với
if gần nhất nếu
if (number > 5) { không có dấu
if (number < 10) ngoặc móc { … }
printf("1111\n");
}
else printf("2222\n");

CT101 - Lập trình căn bản 15 Khoa CNTT&TT


Lệnh rẽ nhánh
// Viết chương trình giải và biện luận phương trình bậc nhất
// ax+b=0 với các hệ số a, b là các số thực nhập từ bàn phím
#include <stdio.h>
int main(){
float a,b,x;
printf("Chuong trinh giai phuong trinh bac nhat ax+b=0\n");
printf("Nhap he so a = ");
scanf("%f",&a); Có thể sử dụng các câu lệnh
printf("Nhap he so b = "); if – else lồng nhau
scanf("%f",&b);
if (a==0)
if (b==0) printf("Phuong trinh vo so nghiem");
else printf("Phuong trinh vo nghiem");
else {
x = -b/a;
printf("Phuong trinh co nghiem x = %.2f", x);
}
return 0;
}
CT101 - Lập trình căn bản 16 Khoa CNTT&TT
Lệnh rẽ nhánh
// Viết chương trình nhập một số nguyên từ bàn phím
// Xác định dấu của số đó (1 nếu là số nguyên dương,
// 0 nếu số có giá trị bằng 0 và -1 nếu là số nguyên âm)
// Sau đó in dấu ra màn hình
#include <stdio.h>
int main ( )
{
int number, sign;
printf ("Nhap vao mot so nguyen: ");
scanf ("%i", &number);
if ( number < 0 )
sign = -1;
else if ( number == 0 ) Có thể sử dụng cấu trúc
sign = 0; if – else liên tục
else // Phai la duong
sign = 1;
printf ("Dau = %i\n", sign);
return 0;
}
CT101 - Lập trình căn bản 17 Khoa CNTT&TT
Lệnh rẽ nhánh
int number;
if ( expression 1)
if program statement 1
negative else if ( expression 2)
else program statement 2
else
program statement 3
if zero

else

positive Cấu trúc if-else liên


tục với nhiều nhánh
rẽ gây khó khăn khi
đọc hiểu chương
trình

CT101 - Lập trình căn bản 18 Khoa CNTT&TT


Lệnh rẽ nhánh
/* Viết chương trình tính các biểu thức đơn giản có dạng:
giátrị toántử giátrị dùng cấu trúc if - else */
#include <stdio.h>
int main ( ) {
float value1, value2;
char operator;
printf ("Nhap vao bieu thuc.\n");
scanf ("%f %c %f", &value1, &operator, &value2);
if ( operator == '+' )
printf ("%.2f\n", value1 + value2);
else if ( operator == '-' )
printf ("%.2f\n", value1 - value2);
else if ( operator == '*' )
printf ("%.2f\n", value1 * value2);
else if ( operator == '/' )
printf ("%.2f\n", value1 / value2);
else printf ("Khong biet toan tu operator.\n");
return 0;
}
CT101 - Lập trình căn bản 19 Khoa CNTT&TT
Lệnh rẽ nhánh
switch ( expression )
{
case value1:
program statement Giá trị biểu thức expression
program statement được so sánh với các giá trị
...
break; value1, value2, ..., valuen.
case value2: Khi một giá trị valuei bằng
program statement với expression, nhóm lệnh
program statement trong case tương ứng sẽ
...
break; được thực hiện
...
case valuen:
program statement
program statement Giá trị của expression phải là một
... số nguyên (bao gồm kiểu char).
break;
default: Sau case phải là một hằng hay
program statement biểu thức hằng kiểu số nguyên,
program statement không được sử dụng biến ở đây
...
break;
}
CT101 - Lập trình căn bản 20 Khoa CNTT&TT
Lệnh rẽ nhánh
/* Viết chương trình tính các biểu thức đơn giản có dạng:
giátrị toántử giátrị dùng cấu trúc switch – case */
#include <stdio.h>
int main ( ) { Biểu thức điều
float value1, value2; kiện expression
char operator;
printf ("Nhap vao bieu thuc.\n");
scanf ("%f %c %f", &value1, &operator, &value2); Câu lệnh
switch (operator) {
case '+': printf ("%.2f\n", value1 + value2); break;
case '-': printf ("%.2f\n", value1 - value2); break;
case '*': printf ("%.2f\n", value1 * value2); break;
case '/':
if ( value2 == 0 ) printf ("Chia cho 0.\n");
Giá trị else printf ("%.2f\n", value1 / value2);
value break;
default: printf ("Khong biet operator.\n"); break;
}
return 0;
}
CT101 - Lập trình căn bản 21 Khoa CNTT&TT
Lệnh rẽ nhánh
Trường hợp
không có lệnh
break !
Sau case có thể
switch (operator) không có câu
{ lệnh nào
...
case '*':
case 'x':
printf ("%.2f\n", value1 * value2);
break;
...
} Nếu không có lệnh break ở cuối mỗi case; khi operator
trong phần switch bằng với 1 giá trị nào đó, phần công việc
sau case tương ứng được thực hiện, sau đó các phần công
việc sau case kế tiếp cũng được thực hiện.

Tham khảo thêm tại:


https://www.tutorialspoint.com/cprogramming/c_decision_making.htm
CT101 - Lập trình căn bản 22 Khoa CNTT&TT
Tổng kết

• Sử dụng cấu trúc rẽ nhánh để điều khiển hoạt động của


chương trình tùy theo giá trị của biểu thức điều kiện

CT101 - Lập trình căn bản 23 Khoa CNTT&TT


Bài tập tổng kết
1. Viết chương trình tính chu vi, diện tích của tam giác với
yêu cầu sau khi nhập 3 số a, b, c phải kiểm tra lại xem a, b,
c có tạo thành một tam giác không? Nếu có thì tính chu vi
và diện tích. Nếu không thì in ra câu " Không tạo thành tam
giác".
2. Viết chương trình giải phương trình bậc nhất ax+b=0 với
a, b nhập từ bàn phím.
3. Viết chương trình giải phương trình bậc hai ax2+bx+c=0
với a, b, c nhập từ bàn phím.
4. Viết chương trình nhập vào ngày tháng năm của ngày
hôm nay, in ra ngày tháng năm của ngày mai.

CT101 - Lập trình căn bản 24 Khoa CNTT&TT


Bài tập tổng kết
5. Viết chương trình nhập từ bàn phím 2 số a, b và một ký
tự ch. Nếu:
ch là “+“ thì thực hiện phép tính a + b và in kết quả
lên màn hình.
ch là “–“ thì thực hiện phép tính a - b và in kết quả
lên màn hình.
ch là “*” thì thực hiện phép tính a * b và in kết quả
lên màn hình.
ch là “/” thì thực hiện phép tính a / b và in kết quả
lên màn hình.

CT101 - Lập trình căn bản 25 Khoa CNTT&TT


CT101 – Lập trình căn bản

Khoa CNTT&TT – ĐHCT

You might also like