[Lập trình C] Điều kiện rẽ nhánh

Posted on December 29th, 2020

Bài viết này giới thiệu với bạn lý thuyết cơ bản về điều kiện rẽ nhánh trong lập trình C. Cụ thể là về if, if-elseswitch.

Lý thuyết cơ bản về rẽ nhánh trong lập trình C

Cơ bản về mệnh đề điều kiện

  • Giúp thay đổi flow chương trình
  • Giá trị của mệnh đề điều kiện sẽ luôn là đúng (1) hoặc sai (0)

Ví dụ để kiểm tra xem 1 số là chẵn hay lẻ, bạn có thể làm theo các bước sau:

  • Nhập vào số
  • Tính số dư của nó với 2
  • Nếu số dư bằng 0 thì số nhập vào là chẵn
  • Nếu số dư bằng 1 thì số nhập vào là lẻ

Ngôn ngữ lập trình C hỗ trợ 2 loại mệnh đề điều kiện:

  • Sử dụng if
  • Sử dụng switch

Mệnh đề điều kiện sử dụng if

Cú pháp cơ bản:

if (expression)
  statement;

Nghĩa là khi biểu thức expression có giá trị TRUE thì câu lệnh theo sau mệnh đề if sẽ được thực hiện.

Ví dụ:

#include <stdio.h>

int 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);
	}
	return 0;
}

Mệnh đề điều kiện sử dụng if-else

Cú pháp cơ bản:

if (expression)
  statement1;
else
  statement2;

Nghĩa là khi biểu thức expression có giá trị TRUE thì câu lệnh statement1 sẽ được thực hiện. Ngược lại thì câu lệnh statement2 sẽ được thực hiện.

Ví dụ:

#include <stdio.h>

int main()
{
	int num, res;
	
	printf("Enter a number: ");
	scanf("%d", &num);
	
	res = num % 2;
	if (res == 0)
		printf("Then number is Even");
	else
		printf("The number is Odd");
	
	return 0;
}

Mệnh đề điều kiện if-else-if

Cú pháp cơ bản:

if (expression1)
  statement1;
else if (expression2)
  statement2;
  .
  .
  .
else 
  statement;

Nghĩa là nếu biểu thức expression1 TRUE thì câu lệnh statement1 sẽ được thực hiện. Ngược lại, ta tiếp tục kiểm tra biểu thức expression2. Nếu expression2 TRUE thì câu lệnh statement2 sẽ được thực hiện,...

Ví dụ:

#include <stdio.h>

int main() {
	int x = 0;
	
	printf("Enter Choice (1 - 3): ");
	scanf("%d", &x);
	
	if (x == 1)
		printf ("Choice is 1\n");
	else if ( x == 2)
		printf ("Choice is 2\n");
	else if ( x == 3)
		printf ("Choice is 3\n");
	else
		printf ("Invalid Choice\n");
		
	return 0;
}

Mệnh đề if lồng nhau

Một mệnh đề if có thể được đặt trong một mệnh đề if khác.

Cú pháp cơ bản:

if (exp1) {
  if (exp2) 
    statement1;

  if (exp3) statement2;
  else statement3; // with if (exp3)
}
else statement4;  // with if (exp1)

Theo chuẩn ANSI, trình biên dịch nên hỗ trợ ít nhất là 15 mệnh đề if lồng nhau

Ví dụ:

#include <stdio.h>

int main () {
	int x = 0, y = 0;

	printf ("Enter Choice (1 - 3) : ");
	scanf ("%d", &x);
	
	if (x == 1) {
		printf("\nEnter value for y (1 - 5) : ");
		scanf ("%d", &y);
		if (y <= 5)
			printf("\nThe value for y is : %d", y);
		else
			printf("\nThe value of y exceeds 5 ");
	} else
		printf ("\nChoice entered was not 1");

	return 0;
}

Mệnh đề điều kiện sử dụng switch

Mệnh đề switch là một cách để kiểm tra điều kiện rẽ nhánh.

Mệnh đề swith kiểm tra điều kiện của giá trị biểu thức dựa trên số một danh sách các hằng số nguyên hoặc hằng kí tự.

Cú pháp cơ bản:

switch(expression) {
  case constant1:
    statement1;
    break;
  case constant2:
    statement2;
    break;
  case constant3:
    statement3;
    break;
  default:
    statement4;
}

Chú ý:

  • Giá trị của expression phải là một số hoặc một kí tự
  • Trong mỗi trường hợp case, cần phải kết thúc bằng từ khóa break. Nếu không case tiếp theo sẽ được thực hiện.

Ví dụ:

#include <stdio.h>

int main () {
	char ch;

	printf ("\nEnter a lower cased alphabet (a - z) : ");
	scanf("%c", &ch);

	if (ch < 'a' || ch > 'z')
		printf('\nCharacter not a lower cased alphabet');
	else
		switch (ch) {
			case 'u' :
			case 'e' :
			case 'o' :
			case 'a' :
			case 'i' :
				printf("\nCharacter is a vowel");
				break;
			case 'z' :
				printf("\nLast Alphabet <z> was entered");
				break;
			default :
				printf("\nCharacter is a consonant");
				break;
		}
		
	return 0;
}

Bài tập thực hành về rẽ nhánh trong lập trình C

Bài 1

Nhập vào 4 số nguyên. Tính tổng các số chẵn và tổng các số lẻ rồi in ra màn hình.

Phân tích bài toán

  • Nhập vào 4 số nguyên => chọn kiểu dữ liệu int
  • Điều kiện là số chẵn khi số đó chia cho 2 dư 0
  • Điều kiện là số lẻ khi số đó chia cho 2 dư 1

Code

Cách 1: sử dụng if-else
#include <stdio.h>

int main () {
	int x, y, z, t;
	int tongChan = 0, tongLe = 0;

	printf("Nhap vao 4 so: ");
	scanf("%d %d %d %d", &x, &y, &z, &t);

	// Kiem tra x la chan hay le
	if (x % 2 == 0)
		tongChan += x;
	else
		tongLe += x;

	// Kiem tra y la chan hay le
	if (y % 2 == 0)
		tongChan += y;
	else
		tongLe += y;

	// Kiem tra z la chan hay le
	if (z % 2 == 0)
		tongChan += z;
	else
		tongLe += z;

	// Kiem tra t la chan hay le
	if (t % 2 == 0)
		tongChan += t;
	else
		tongLe += t;
		
	// In ra ket qua
	printf("Tong cac so chan la: %d\n", tongChan);
	printf("Tong cac so le la: %d\n", tongLe);

	return 0;
}
Cách 2: sử dụng toán tử so sánh
#include <stdio.h>

int main () {
	int x, y, z, t;
	int tongChan = 0, tongLe = 0;

	printf("Nhap vao 4 so:\n");
	scanf("%d %d %d %d", &x, &y, &z, &t);

	// Kiem tra x la chan hay le
	tongChan += (x % 2 == 0) * x;
	tongLe += (x % 2 != 0) * x;
	
	// Kiem tra y la chan hay le
	tongChan += (y % 2 == 0) * y;
	tongLe += (y % 2 != 0) * y;
	
	// Kiem tra z la chan hay le
	tongChan += (z % 2 == 0) * z;
	tongLe += (z % 2 != 0) * z;
	
	// Kiem tra t la chan hay le
	tongChan += (t % 2 == 0) * t;
	tongLe += (t % 2 != 0) * t;

	// In ra ket qua
	printf("Tong cac so chan la: %d\n", tongChan);
	printf("Tong cac so le la: %d\n", tongLe);

	return 0;
}

Bài 2

Nhập vào 1 kí tự dạng viết thường (a-z). Hãy kiểm tra xem:

  • Nếu nhập sai thì in ra màn hình "Ban da nhap sai" rồi kết thúc chương trình.
  • Nếu nhập đúng thì in ra kí tự tương ứng dạng viết hoa, ví dụ nhập vào 'a' thì in ra là 'A'

Phân tích bài toán

  • Nhập vào 1 kí tự -> chọn kiểu dữ liệu char (c)
  • Trong bảng mã ASCII thì 'a' < 'z'
  • Nếu c < 'a' hoặc c > 'z' thì nhập sai
  • Nếu c >= 'a' và c <= 'z' thì nhập đúng
  • Để in ra chữ hoa ta trừ kí tự ban đầu 1 giá trị bằng hiệu ('a' - 'A')

Code

#include <stdio.h>

int main () {
	char c;
	int step;
	
	printf("Nhap vao ki tu c: ");
	scanf("%c", &c);
	
	if (c < 'a' || c > 'z') {
		printf("Ban da nhap sai");
	}
	else {
		step = 'a' - 'A';
		printf("Ki tu nhap vao dang viet hoa la: %c", c - step);
	}

	return 0;
}

Bài 3

Nhập vào 3 số nguyên. Hãy tìm giá trị lớn nhất và giá trị nhỏ nhất trong 3 số đó và in ra màn hình giá trị lớn nhất, giá trị nhỏ nhất tìm được.

Phân tích bài toán

  • Nhập vào 3 số nguyên -> kiểu dữ liệu int
  • Để tìm giá trị lớn nhất, nhỏ nhất thì cần phải dùng toán tử so sánh để kiểm tra giá trị của các số với nhau.

Code

#include <stdio.h>

int main () {
	int x, y, z;
	int minValue, maxValue;
	
	printf("Nhap vao 3 so: ");
	scanf("%d %d %d", &x, &y, &z);
	
	// Tim gia tri nho nhat
	minValue = x;
	if (y < minValue) 
		minValue = y;
	if (z < minValue)
		minValue = z;
		
	// Tim gia tri lon nhat
	maxValue = x;
	if (y > maxValue) 
		maxValue = y;
	if (z > maxValue)
		maxValue = z;
		
	// In ra ket qua
	printf("Gia tri nho nhat trong 3 so la: %d\n", minValue);
	printf("Gia tri lon nhat trong 3 so la: %d\n", maxValue);

	return 0;
}

Bài 4

Nhập vào số nguyên s là số lượng giây (thời gian) thỏa mãn điều kiện (0 < x < 3600). Hãy kiểm tra xem:

  • Nếu nhập sai thì in ra màn hình "Ban da nhap sai" rồi kết thúc chương trình.
  • Nếu nhập đúng thì hãy chuyển đổi số đó sang dạng rút gọn theo phút và giây tương ứng. Chú ý, sau khi quy đổi chỉ in thành phần nào mà giá trị của nó lớn hơn 0.

Ví dụ:

  • Nhập vào 10000 thì in ra "Ban da nhap sai".
  • Nhập vào 1000 thì in ra "16 phut 40 giay".

Phân tích bài toán

  • Nhập vào số nguyên s -> kiểu int
  • Nếu x <= 0 hoặc x >= 3600 thì nhập sai
  • Trường hợp nhập đúng, bắt đầu tính toán
  • Quy đổi: 1 phút tương ứng với 60 giây

Code

#include <stdio.h>

int main () {
	int s;
	int giay, phut;
	
	printf("Nhap vao so luong giay s: ");
	scanf("%d", &s);
	
	if (s <= 0 || s >= 3600) {
		printf("Ban da nhap sai");
	}
	else {
		phut = s / 60;
		giay = s % 60;
		
		if (phut == 0) 
			printf("Ket qua la: %d giay", giay);
		else if (giay == 0)
			printf("Ket qua: %d phut", phut);
		else
			printf("Ket qua: %d phut %d giay", phut, giay);
	}

	return 0;
}