If statements (câu lệnh if)

tutorial
basic
c++

(...) #1

####Rất vui khi gặp lại các bạn trong khóa học lập trình trực tuyến ngôn ngữ C++.

Trong bài học trước, mình đã giới thiệu đến các bạn một số cấu trúc điều khiển thường thấy trong chương trình C++, các cấu trúc điều khiển có khả năng quyết định phần code nào sẽ được thực thi tại thời điểm chương trình đang chạy. Và cấu trúc đầu tiên mình muốn giúp các bạn tìm hiểu là cấu trúc rẽ nhánh có điều kiện (conditional branch) với câu lệnh if (if statement).

###If statement

If statement cho phép chúng ta điều khiển chương trình thực hiện một đoạn lệnh nào đó dựa trên biểu thức điều kiện có giá trị true hoặc false. Quan trọng hơn là if statement cho phép chúng ta làm điều này dựa trên input của người dùng. Ví dụ: sử dụng if statement để kiểm tra username và password, và chương trình sẽ quyết định người dùng có được phép truy cập vào hệ thống hay không.

Về mặt ngữ nghĩa, if statement cũng giống như luật nhân - quả. Ví dụ: Nếu tôi hết tiền trong tài khoản thì tôi không thể rút tiền từ máy ATM. Vậy biểu thức điều kiện ở đây là số tiền trong tài khoản vẫn còn, nếu đúng thì máy ATM cho phép rút tiền và ngược lại.

#####Cấu trúc cơ bản của if statement

Dưới đây là cấu trúc cơ bản nhất của một if statement:

if (expression)
	execute the next statement;

Câu lệnh tiếp theo thuộc if statement chỉ được thực hiện nếu biểu thức điều kiện expression có giá trị true.

Biểu thức điều kiện được tạo ra từ một hoặc nhiều mệnh đề toán học.

Ví dụ:

int main()
{
	if (5 < 10)
		cout << "(5 < 10) is true" << endl;

	system("pause");
	return 0;
}

Trong đoạn chương trình trên, chúng ta đánh giá mệnh đề (5 < 10) để xem nó có đúng hay không. Điều này hiển nhiên đúng, do đó, câu lệnh đứng ngay sau if statement sẽ được thực hiện.

#####If with multiple statments

Để thực hiện nhiều hơn 1 câu lệnh khi biểu thức điều kiện trong if statement đúng, chúng ta đặt thêm cặp dấu ngoặc nhọn phía sau để tạo thành một khối lệnh. Ví dụ:

int main()
{
	if (5 < 10)
	{
		cout << "(5 < 10) is true" << endl;
		cout << "This line will be printed" << endl;
		cout << "Because they are inside the block of if statement" << endl;
	}

	system("pause");
	return 0;
}

Mình khuyến nghị các bạn nên có thói quen sử dụng cặp dấu ngoặc nhọn đứng sau if statement cho dù phía sau nó chỉ có 1 lệnh cần xử lý.

#####Else

Chúng ta thử lấy thêm 1 ví dụ về if statement cơ bản:

int value;
cout << "Enter an integer value: "; cin >> value;

if(value >= 0)
{
	cout << "Positive number" << endl;
}

Với đoạn code trên, điều gì sẽ xảy ra nếu chúng ta nhập giá trị -5 cho biến value?

Kết quả sau khi nhập giá trị xong thì chương trình không làm gì cả. Vì giá trị -5 làm sai biểu thức điều kiện (value >= 0), do đó, chương trình bỏ qua dòng lệnh cout bên dưới.

Trong một số trường hợp, chúng ta muốn thực thi một số lệnh khi biểu thức điều kiện sai, thay thế cho trường hợp biểu thức điều kiện đúng. Lúc này, từ khóa “else” sẽ giúp chúng ta làm điều đó.

int value;
cout << "Enter an integer value: "; cin >> value;

if (value >= 0)
{
	cout << "Positive number" << endl;
}
else
{
	cout << "Negative number" << endl;
}

Bây giờ khi nhập lại giá trị -5, chúng ta được kết quả như sau:

Từ khóa “else” có nghĩa là trường hợp ngược lại với biểu thức điều kiện trong if statement. Khi biểu thức điều kiện trong if statement có giá trị false, khối lệnh đứng sau else statement sẽ được thực thi.

#####Chaining if statements

Với cách dùng cấu trúc if … else như trên, chúng ta chỉ có thể kiểm tra 2 trường hợp phủ định của nhau. Một cách dùng khác của if statement là khi cần kiểm tra nhiều trường hợp khác nhau có thể xảy ra. Chúng ta có thể dùng “else if” statement để đưa vào những trường hợp cần kiểm tra khác.

Cấu trúc khi sử dụng “else if” statement:

if (expression)
{
	// do A
}
else if (another_expression)
{
	// do B
}
else if (one_more_expression)
{
	// do C
}
else
{
	// do D
}

Bằng cách nối chuỗi các if statement, chúng sẽ được lần lượt kiểm tra các điều kiện từ trên xuống dưới, nếu tìm thấy biểu thức điều kiện có kết quả true, khối lệnh tương ứng sẽ được thực thi, những khối lệnh còn lại sẽ bị bỏ qua.

Ví dụ:

int score;
cout << "Enter your average score: "; cin >> score;

if (score <= 5)
	cout << "You need to try more" << endl;
else if (score <= 7)
	cout << "Not bad" << endl;
else if (score <= 9)
	cout << "Good job" << endl;
else
	cout << "Incredible" << endl;

Với đoạn chương trình như trên, ban đầu biến score được nhập giá trị từ bàn phím và bắt đầu kiểm tra với mệnh đề (score <= 5), nếu sai, if statement sẽ đi đến mệnh đề tiếp theo và cứ thế cho đến khi nào tìm được mệnh đề có giá trị đúng. Nếu toàn bộ các mệnh đề đưa ra đều sai, chương trình không thực hiện if statement.

#####Nesting if statements

Ngôn ngữ C++ cho phép chúng ta viết những if statements lồng vào nhau, ví dụ:

float a, b;
cin >> a >> b;

if (b != 0) 
{
	if (a <= 0)
		cout << "a = 0 is not accepted" << endl;
	else
		cout << "a / b = " << a / b << endl;
}
else
{
	cout << "Divided by zero" << endl;
}

Đối với các trường hợp sử dụng if statements lồng vào nhau, chúng ta nên sử dụng thêm các cặp dấu ngoặc nhọn để giúp chương trình rõ ràng hơn.

Với đoạn chương trình trên, phép toán a / b chỉ được thực hiện khi cả điều kiện b != 0 đúng và a <= 0 sai.

#####Sử dụng các toán tử logic với if statement

Sử dụng các toán tử logic (AND, OR, NOT, …) có thể giúp chúng ta kiểm tra nhiều trường hợp khác nhau chỉ cần dùng 1 mệnh đề ghép. Lấy ví dụ trong phần Nesting if statements, chúng ta sẽ thực hiện phép toán a / b khi cùng lúc thỏa mãn cả 2 điều kiện (b != 0) AND (a > 0), chúng ta có thể sửa lại cấu trúc đoạn chương trình trên thành như sau:

if (b != 0 && a > 0)
{
	cout << "a / b = " << a / b << endl;
}
else
{
	if (b == 0)
		cout << "Divided by zero" << endl;
	if (a <= 0)
		cout << "a <= 0 is not accepted" << endl;
}

Các bạn cần dựa vào bảng chân trị của từng toán tử logic để sử dụng vào mệnh đề cho hợp lý.

#####Lệnh if ngắn gọn

Ta có thể sử dụng lệnh if ngắn gọn với cấu trúc như sau

expression ? do A : do B;

Lệnh này có thể hiểu như sau:

Điều kiện ? nếu đúng thực hiện A : nếu sai thực hiện B;

###Tổng kết

Trên đây mình vừa giới thiệu cho các bạn về một trong số các cấu trúc rẽ nhánh có điều kiện được sử dụng phổ biến, và một số cách sử dụng if statement khác nhau tùy vào tình huống cụ thể.

###Bài tập cơ bản

1/ Viết chương trình sinh ra một số ngẫu nhiên trong khoảng từ 0 đến 100 nhưng không in ra màn hình. Yêu cầu người dùng đoán xem số ngẫu nhiên vừa sinh ra lớn hơn 50 hay bé hơn 50, nếu chọn trường hợp bé hơn 50 nhập giá trị 0, ngược lại nhập giá trị 1. In kết quả thông báo người dùng đã đoán đúng hay sai ra màn hình.

Ví dụ:

A random number was generated
Guess: 1

Wrong! The random number is 26 (26 < 50)

2/ Viết chương trình giải phương trình bậc 2: ax2 + bx + c = 0 với a, b và c nhập từ bàn phím.

Hướng dẫn:

  • Nhập vào 3 biến a, b, c.
  • Tính delta = bb - 4a*c
  • Nếu delta < 0 thì kết luận phương trình vô nghiệm.
  • Ngược lại, nếu delta = 0 thì kết luận nghiệm x1 = x2 = -b/(2*a)
  • Ngược lại, nếu delta > 0 thì kết luận x1 = (-b + sqrt(delta)) / (2a) và x2 = (-b - sqrt(delta)) / (2a).

P/s: Hẹn gặp lại các bạn trong bài học tiếp theo trong khóa học lập trình C++ hướng thực hành.

Mọi ý kiến đóng góp hoặc thắc mắc có thể đặt câu hỏi trực tiếp tại diễn đàn

www.daynhauhoc.com


Link Videos khóa học


Tổng hợp: Khóa học lập trình C++ dành cho người mới bắt đầu
Cách dùng lệnh if ở đây sai chỗ nào
(Einstein Albert) #2

Viết chương trình sinh ra số ngẫu nhiên như nào vậy các bác ??


(Khoa Phùng) #3

http://www.stdio.vn/articles/read/67/random-so-trong-c hình như dùng hàm random ý bạn :3


(Hidan) #5

Bài 1:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{   int x;
    srand(time(NULL)); // hàm này cần dùng thêm thư viện <ctime>
    int a=rand() % (100-0+1)+0; // rand() % (b-a+1) + a trong khoảng (a,b)
    cout<<"Mot so ngau nhien a da duoc khoi tao\n"
        <<"Du doan so do lon hon hay nho hon 50;\nlon hon nhap: 1 be hon nhap: 0\n";
    cin>>x;
    if (a>50)
    {
    	if(x==1)
    	{	cout<<"Dm doan bua cung dung, cho ngap phai ruoi! "
                    <<"so ngau nhien la "<<a<<" (  a > 50 )\n";
        }
        if(x==0)
        {	cout<<"Sai nhe! oc cho ngu vl "
                    <<"so ngau nhien la "<<a<<" (  a > 50 )\n";
        }
    }
    if (a<50)
    {
    	if(x==1)
    	{
    		cout<<"Sai nhe! oc cho ngu vl "
                    <<"so ngau nhien la "<<a<<" ( a < 50 )\n";
    	}
    	if(x==0)
    	{
    		cout<<"Dm doan bua cung dung, cho ngap phai ruoi! "
                    <<"so ngau nhien la "<<a<<" (  a < 50 )\n";
    	}
    }
    if (a==50)
    	cout<<"a=50 khong tinh, de nghi nhap lai";
    if (x!=0 && x!=1)
    	cout<<"DM thang oc cho nay, may chi duoc nhap 1 hoac 0 thoi";
    system("pause");
}

mình viết ko dấu nhé nên đừng hiểu nhầm :blush:


(Hiệu) #6

Viết code hơi bậy nhé :smile:

Mình có code lại nè (ko có comment)

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()	{
	
	srand(time(NULL));
	int value_in = rand() % 100 + 1;
	int value_out;	

	cout << "This is a software of random.org, plese guess the number (1 or 0)" << endl;
	cout << "Guess: ";
	cin >> value_out;

	if (value_out == 0 && value_in < 50)
	{
		cout << "Right! The random number is " << value_in << endl;
	}

	else if (value_out == 0 && value_in > 50)
	{
		cout << "Wrong, the random number is " << value_in << endl;
	}

	else if (value_out == 1 && value_in > 50)
	{
		cout << "Right! The random number is " << value_in << endl;
	}

	else if (value_out == 1 && value_in < 50)
	{
		cout << "Wrong, the random number is " << value_in << endl;
	}
	
	system("pause");
	return 0;
}

(Hidan) #7

thế còn khi người nhập vào số khác 0 1 thì sao? nếu nhập vào ký tư khác nữa thì sao ?
code của mình chỉ thiếu cái thứ 2 thôi :blush:


(Hidan) #8

chỗ này có vấn đề:
nhập 0 hoặc 1: thì khi nhập chữ a chẳng hạn (đang trong kiểu int) nó sẽ hiểu là không có gì tương đương với số 0 đúng vào trường hợp đầu (nó không hiểu số 0 ở đây cũng như số 1, 2 ,3 … :smile:
nếu thay đề bài là nhập số 1 và 2 thì khi người nhập chữ a thì nó sẽ không bị rơi vào 2 trường hợp kia 1 hoặc 2 :smiley:


(ham hoc) #9

sao câu lệnh nào này khó hơn excel nhiều thế nhỉ. em chỉ quen làm trên excel, giờ vooc cái này thấy khoai quá


(Hiệu) #10

Ừ, mình quên việc này, nhưng ở câu trên có yêu cầu nhập 0 or 1 mà, dòng dưới dòng khai báo biến value_out ấy


(Thu Nguyen) #11

Giải bài tập 1 :slight_smile:

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    int num = rand();
    int val = num % 101;
	int so_user;
	cout << "nhap so can doan 0 hoac 1: "; 
	cin >> so_user;
	
	if ((val < 50) && (so_user == 0))
		{
			cout << "So ban nhap la :" << so_user;
			cout << "Ban da doan dung, so ngau nhien la " << val << endl;
		}
	else 
		if ((val > 50 ) && (so_user == 1))
			{
			cout << "So ban nhap la :" << so_user;
			cout << "Ban da doan dung, so ngau nhien la " << val << endl;
			}
	    else
		    cout << "Ban da doan sai, so ngau nhien la " << val << endl;
    return 0;   
}

P/s : mình chạy nó thì lúc nào số ngẫu nhiên cũng là 32, bạn nào xem code hướng dẫn lại mình với.
mình sợ sai chỗ khai báo

int num = rand();
int val = num % 101

Giải bài tập 2 :

// Giai phuong trinh bac hai ax2 + bx + c = 0

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int a, b, c;
    int delta = b*b - 4*a*c;
    cout << " Nhap vao a, b, c :";
    cin >> a >> b >> c;
    if (a == 0)
        cout << "Giai phuong trinh bac nhat ax + b = 0";
    else
        if (delta < 0) 
            cout << "Phuong trinh vo nghiem" << endl;
        else 
            if (delta == 0) 
            cout << "Phuong nghiem co nghiem kep x1 = x2 = " << -b/(2*a) << endl;
            else
            {
                cout << "Phuong trinh co nghiem x1 = " << (-b + sqrt(delta)) / (2*a) << endl;
                cout << "Phuong trinh co nghiem x2 = " << (-b - sqrt(delta)) / (2*a) << endl;
            }
    return 0;
    
}

P/s: chạy code này trong visual studio 2015 nó báo lỗi “uninitial local value a, b, c used”. Help me


(Lưu Thành Vương) #12

BT1: Thêm thư viện time.h và trước int num=rand(); thêm hàm srand(time(NULL));
BT2: delta chưa được khởi tạo và a,b,c chưa mang giá trị việc gán delta = b*b - 4*a*c; =>lỗi


(Thu Nguyen) #13

mình nhầm. mình sửa code lại rồi, đã khởi tạo biến delta (int delta = bb - 4a*c) nhưng vẫn lỗi như vậy.


(Lưu Thành Vương) #14

Mình nói là a,b,c chưa có giá trị nên không thể

    int a, b, c;
    int delta = b*b - 4*a*c;

Sửa lại

    int a, b, c;
    cout << " Nhap vao a, b, c :";
    cin >> a >> b >> c;
    int delta = b*b - 4*a*c;
    if (a == 0)
...

(Let's Go) #15
#include <iostream>
using namespace std;
int main()
{
	int a, b, c, delta;
	cout << "Enter value of a: ";
	cin >> a;
	cout << "Enter value of b: ";
	cin >> b;
	cout << "Enter value of c: ";
	cin >> c;
	cout << "We have a square function is: " << a << "x^2 + " << (b) << "x + " << (c);
	delta = b*b - 4 * a*c;
	cout << "Delta of the function is: " << delta << endl;
	if (delta < 0)
	{
		cout << "The function has no solution!!" << endl;

	}
	else if (delta = 0)
	{
		cout << "The function has only one solution which is: " << -b / 2 * a << endl;
	}
	else if (delta > 0)
	{
		cout << "The function has two solutions which are: " << (-b - sqrt(delta)) / 2 * a << " and " << (-b + sqrt(delta)) / 2 * a << endl;
	}
	return 0;
	system("pause");

}

Em test chương trình thì không có lỗi nhưng mà khi debug thì nó lại bị giữa chừng. Please help em fix lỗi này.Thanks.


(superuser10) #16
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    srand(time(NULL));
    int random=rand()%101;
    int guess;
    std::cout << "A random number was generated" << std::endl;
    std::cout << "Compare it with 50 and press 1 if you think it is bigger else press 0" << std::endl;
    do
    {
        std::cin >> guess;
    }
    while((guess!=0)&&(guess!=1));
    
    if(guess==1)
    {
        std::cout << "You guess BIGGER" << std::endl;
    }
    else
    {
        std::cout << "You guess LESS" << std::endl;
    }
    
    if(((random>50)&&(guess==1))||((random<50)&&(guess==0)))
    {
        std::cout << "TRUE!!! The number is " << random << std::endl;
    }
    else
    {
        std::cout << "WRONG!!! The number is " << random << std::endl;
    }
    return 0;
}

(Đào An) #17

[code]#include
#include
using namespace std;
int main()
{
cout << “Nhap lan luot vao 3 bien a,b,c cua pt: ax^2+bx+c=0” << endl;
double a, b, c;
cin >> a >> b >> c;
double delta = bb - 4 * ac;
if (delta < 0) {
cout << “Pt vo nghiem” << endl;
}
else if (delta = 0) {
cout << "Pt co 1 nghiem x = " << -b / (2 * a) << endl;
}
else {
cout << “Pt co 2 nghiem la:” << endl;
cout << "x1 = " << (-b + sqrt(delta)) / (2 * a) << endl;
cout << "x2 = " << (-b - sqrt(delta)) / (2 * a) << endl;
}

system("pause");
return 0;

}[/code]

Bài 2 e làm thế này sao nhập vào toàn báo x1=x2 , a,b,c=1,5,6


(Như Ý) #18
#include <iostream>
#include <ctime>
#include<cstdlib>

using namespace std;
int main()
{
	srand(time(NULL));//ham rand() se random so theo thoi gian
	int i = rand() % 101 + 1;//rand()%(b-a)+1 + a --> random tu a den b
	bool n = i <= 50;
	int k;
	cout << "the number <= 50? ";
	cin >>k;
	if (k==n)
		cout << "Congratulation to you! the number is " << i<<"<=50";
	else cout << "Wrong! the number is  " << i << ">50";
	system("pause");
	return 0;
}

(Như Ý) #19
else if(delta==0)
{
//...
}

(lê văn hòa) #23

/Viết chương trình sinh ra một số ngẫu nhiên trong khoảng từ 0 đến 100 nhưng không in ra màn hình.
Yêu cầu người dùng đoán xem số ngẫu nhiên vừa sinh ra lớn hơn 50 hay bé hơn 50, nếu chọn trường hợp bé hơn 50 nhập giá trị 0,
ngược lại nhập giá trị 1. In kết quả thông báo người dùng đã đoán đúng hay sai ra màn hình.
/

#include <iostream>
#include <ctime>
#include <cstdlib>
int main()
{
	//gia tri cac bien ngau nhien thay doi theo thoi gian
	srand(time(NULL));
	//khai bao bien ngau nhien 0-100
	int a = rand() % 100 + 0;
	//nhap gia tri 
	int dudoan;
	tieptuc:
		std::cout << "nhap vao du doan cua ban"<<std::endl;
		std::cin >> dudoan;
	if (dudoan > 1)
	{
		std::cout << "ban nhap sai ,nhap 1 de tiep tuc va 0 de ket thuc" << std::endl;
		int kt;
		std::cin >> kt;
		if (kt)
			goto tieptuc;
	}
	if (dudoan == 0)
	{
		if (a < 50)
		{
			std::cout << "du doan dung"<< std::endl;
			std::cout << a;
		}
		else
		{
			std::cout << "du doan sai"<< std::endl;
			std::cout << a;
		}
			
	}
	else if (dudoan == 1)
	{
		if (a > 50)
		{
			std::cout << "du doan dung" << std::endl;
			std::cout << a;
		}
		else
		{
			std::cout << "du doan sai"<<std::endl;
			std::cout << a;
		}
			
	}
	else
	{
		;
	}
	return 0;
}

(Knowledge) #24

Help!!!
Các bác ơi có ai biết lỗi này không cho em hỏi với:
Em viết code giải 2 bài tập trên, trong code tất nhiên có dòng lệnh “system (“pause”)”, compile and run thì vẫn chạy bình thường, màn hình sonsole vẫn dừng lại, tuy nhiên sau đó vào foder debug lấy file chương trình đuôi exe ra chạy thì màn hình console hiện lên rồi lập tức tắt đi, không thể dừng chương trình lại xem kết quả được. :frowning:
Các bác có biết thì chỉ giúp e cách sửa với! Em cảm tạ lắm ạ! :frowning:


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?