So sánh hai biến kiểu cấu trúc cho trước c năm 2024

Phần này mình đã đề cập tới ở bài học đầu tiên, nhưng ở đây sẽ nhắc lại để bạn đọc dễ hình dung hơn về tác dụng của hai loại toán tử này trong biểu thức logic.

2.1. Toán tử quan hệ

Các loại toán tử quan hệ sẽ xác định quan hệ giữa các toán hạng, và trả ra kết quả là quan hệ đó đúng (

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

  1. hay không đúng (

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

8). Bảng dưới đây thể hiện các quan hệ giữa hai toán hạng a=5,b=10a=5, b=10:

<center>

So sánh hai biến kiểu cấu trúc cho trước c năm 2024
</center>

2.2. Toán tử logic

Các toán tử logic sẽ xác định quan hệ về mặt đúng/sai giữa các toán hạng logic. Giả sử ta có hai toán hạng logic A=trueA=\text{true} và B=falseB=\text{false}, bảng dưới đây thể hiện quan hệ logic giữa chúng:

<center>

So sánh hai biến kiểu cấu trúc cho trước c năm 2024
</center>

3. Biểu thức logic

Biểu thức logic là những biểu thức thể hiện quan hệ giữa các biểu thức với nhau. Chúng sử dụng các toán tử quan hệ hoặc logic để kết nối các biểu thức thành phần, và luôn luôn trả về một trong hai giá trị

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

7 hoặc

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

8. Để xây dựng một biểu thức quan hệ, ta viết theo cú pháp:

{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

Trong đó, {Biểu_thức_A}, {Biểu_thức_B} có thể là các biến, hằng, hàm trả về giá trị hay các biểu thức toán học. Còn {Phép_toán} là một trong những toán tử quan hệ hoặc toán tử logic thuộc tập sau: {\{

!({Biểu_thức_logic})

6}\}. Ví dụ dưới đây là một vài biểu thức logic:

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

Những biểu thức này sẽ được tính toán theo đúng thứ tự ưu tiên của toán tử (đã đề cập trong bài 22). Lấy ví dụ, trong biểu thức

!({Biểu_thức_logic})

7, do toán tử

!({Biểu_thức_logic})

8 có độ ưu tiên cao hơn toán tử

!({Biểu_thức_logic})

9 nên chương trình sẽ tính toán hai biểu thức

if ({Biểu_thức_logic})
    {Câu_lệnh};

0 và

if ({Biểu_thức_logic})
    {Câu_lệnh};

1 trước, rồi mới lấy kết quả của chúng để thực hiện phép toán

!({Biểu_thức_logic})

9.

3. Toán tử

if ({Biểu_thức_logic})
    {Câu_lệnh};

3 trong biểu thức logic

Trong C++, toán tử quan hệ

if ({Biểu_thức_logic})
    {Câu_lệnh};

3 là một toán tử khá đặc biệt. Khác với các toán tử

!({Biểu_thức_logic})

9 hay

if ({Biểu_thức_logic})
    {Câu_lệnh};

6, toán tử

if ({Biểu_thức_logic})
    {Câu_lệnh};

3 không dùng để kết nối các biểu thức logic, mà dùng để đảo ngược kết quả của một biểu thức logic. Cú pháp sử dụng toán tử này như sau:

!({Biểu_thức_logic})

Khi đó, nếu {Biểu_thức_logic} có giá trị là

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

7 thì cả biểu thức sẽ có kết quả ngược lại là

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

8, tương tự với trường hợp {Biểu_thức_logic} có giá trị

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

8. Chẳng hạn, biểu thức

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

1 có giá trị là

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

7, nhưng biểu thức

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

3 sẽ có giá trị là

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

8.

II. Giới thiệu chung

Trong cuộc sống nói chung và trong Tin học nói riêng, có rất nhiều tình huống mà một công việc chỉ được thực hiện nếu như có một hoặc một số điều kiện được thỏa mãn. Lấy ví dụ, mẹ bạn Sơn nói với bạn Sơn rằng: "Nếu cuối tuần mẹ rảnh thì cả nhà sẽ đi chơi". Điều kiện cụ thể trong câu nói này là "nếu mẹ rảnh", và nếu điều kiện này thỏa mãn thì công việc sẽ được thực hiện là "cả nhà sẽ đi chơi". Cách diễn đạt như vậy là cách diễn đạt ở dạng thiếu:

Nếu...thì...

Nếu như mẹ bạn Sơn thay đổi câu nói thành: "Nếu cuối tuần mẹ rảnh thì cả nhà sẽ đi chơi, còn nếu mẹ không rảnh thì chúng ta sẽ ở nhà", thì cách diễn đạt trở thành cách diễn đạt dạng đủ:

Nếu...thì..., Nếu không thì... (Ngược lại thì...)

Trong mọi ngôn ngữ lập trình đều cung cấp cấu trúc để diễn tả các mệnh đề có dạng như trên, gọi là Cấu trúc rẽ nhánh. Trong C++, có hai loại cấu trúc rẽ nhánh là

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

5 và

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

6 Đây là một trong những cấu trúc căn bản của mọi ngôn ngữ lập trình, có tác dụng điều khiển các khối lệnh trong chương trình và tạo lập nên các thuật toán.

III. Câu lệnh

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

7 và

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

5

C++ sử dụng câu lệnh

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

7 và

if ({Biểu_thức_logic})
{
    {Khối_lệnh_1};
}
else 
 {
     {Khối_lệnh_2};
 }

0 để diễn tả hai mệnh đề điều kiện thiếu và đủ. Cú pháp của hai dạng như sau:

  • Dạng thiếu: if ({Biểu_thức_logic})
    {Câu_lệnh};  
    
  • Dạng đủ: if ({Biểu_thức_logic})
    {Câu_lệnh_1};  
    
    else
    {Câu_lệnh_2};  
    

Vế điều kiện trong các mệnh đề Nếu...thì hoặc Nếu không...thì chính là các {Biểu_thức_điều_kiện} trong lập trình. Chẳng hạn, mệnh đề điều kiện a chia hết cho 5 có thể viết thành biểu thức điều kiện

if ({Biểu_thức_logic})
{
    {Khối_lệnh_1};
}
else 
 {
     {Khối_lệnh_2};
 }

1 trong C++.

Trong trường hợp có nhiều câu lệnh tạo thành một khối lệnh thì ta sẽ đặt tất cả các câu lệnh đó trong cặp dấu

if ({Biểu_thức_logic})
{
    {Khối_lệnh_1};
}
else 
 {
     {Khối_lệnh_2};
 }

2 theo cú pháp dưới đây:

if ({Biểu_thức_logic})
{
    {Khối_lệnh_1};
}
else 
 {
     {Khối_lệnh_2};
 }

Các bước thực thi:

  • Ở dạng thiếu, {Biểu_thức_logic} sẽ được kiểm tra, nếu như điều kiện đó đúng thì {Câu_lệnh} sẽ được thực hiện, ngược lại thì {Câu_lệnh} bị bỏ qua.
  • Ở dạng đủ, {Biểu_thức_logic} sẽ được kiểm tra, nếu như điều kiện đó đúng thì thực hiện {Câu_lệnh_1}, ngược lại thì thực hiện {Câu_lệnh_2}.

Ví dụ 1: Để thực hiện tìm giá trị nhỏ nhất trong hai số nguyên aa và bb, ta viết như sau:


# include <iostream>
using namespace std;
int main()
{
    int a, b;
    cin >> a >> b;
    int min_value = 0;
    if (a < b)
        min_value = a;
    else 
        min_value = b;
    return 0;
}

Ví dụ 2: Xác định một số nguyên aa có chia hết cho 33 hay không:


# include <iostream>
using namespace std;
int main()
{
    int a;
    cin >> a;
    if (a % 3 == 0)
        cout << "a chia hết cho 3";
    else 
        cout << "a không chia hết cho 3";
    return 0;
}

IV. Câu lệnh

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

7 lồng nhau và biểu thức logic gộp

1. Câu lệnh

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

7 lồng nhau

Trong quá trình lập trình, đôi khi chúng ta phải kiểm tra cùng một lúc nhiều biểu thức logic rồi mới quyết định thực hiện một công việc nào đó. Chẳng hạn, để kết luận một bộ ba (a,b,c)(a, b, c) có phải là ba cạnh của một tam giác hay không, chúng ta cần kiểm tra tới vài điều kiện khác nhau:

  • (a>0),(b>0)(a > 0), (b > 0) và (c>0)(c > 0).
  • (a+b>c),(a+c>b)(a + b > c), (a + c > b) và (b+c>a)(b + c > a).

Khi đó, ta có thể viết nhiều câu lệnh

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

7 gộp vào nhau để kiểm tra các điều kiện nhiều cùng lúc:

if (a > 0)
    if (b > 0)
        if (c > 0)
      if (a + b > c)
          if (a + c > b)
        if (b + c > a)
      ...

Cú pháp tổng quát của câu lệnh

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

7 lồng nhau sẽ là:

{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

0

Nếu như biểu thức ở dạng đầy đủ, tức là bao gồm cả

if ({Biểu_thức_logic})
{
    {Khối_lệnh_1};
}
else 
 {
     {Khối_lệnh_2};
 }

7, thì chúng ta cũng có thể gộp tương tự:

{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

1

Khi viết ở dạng đầy đủ, các câu lệnh thuộc câu lệnh

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

7 bên trong nên được đặt trong một cặp dấu

if ({Biểu_thức_logic})
{
    {Khối_lệnh_1};
}
else 
 {
     {Khối_lệnh_2};
 }

2 để phân tách với vế

if ({Biểu_thức_logic})
{
    {Khối_lệnh_1};
}
else 
 {
     {Khối_lệnh_2};
 }

7 của câu lệnh

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

7 bên ngoài. Chương trình sẽ tuần tự kiểm tra từng biểu thức logic từ ngoài vào trong, nếu tất cả các biểu thức đều có giá trị

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

7 cho tới biểu thức trong cùng thì câu lệnh trong cùng sẽ được thực hiện. Ngược lại thì chương trình sẽ thực hiện tới vế

if ({Biểu_thức_logic})
{
    {Khối_lệnh_1};
}
else 
 {
     {Khối_lệnh_2};
 }

7 của câu lệnh

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

7 đầu tiên có biểu thức logic của nó trả ra giá trị

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

8.

2. Biểu thức logic gộp

Dễ dàng nhận thấy, nếu như với mỗi điều kiện mà ta lại sử dụng một câu lệnh

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

7, thì chương trình sẽ rất dài và khó kiểm soát. Những trường hợp như vậy, thay vì viết nhiều câu lệnh

if ({Biểu_thức_logic})
    {Câu_lệnh_1};
else 
    {Câu_lệnh_2};

7, thì ta sử dụng tới biểu thức logic gộp. Hiểu một cách đơn giản, biểu thức logic gộp là nhiều biểu thức logic kết hợp lại với nhau bằng các toán tử logic

!({Biểu_thức_logic})

9 hoặc

if ({Biểu_thức_logic})
    {Câu_lệnh};

6. Khi kết hợp các biểu thức logic lại với nhau, nếu như bạn muốn biểu thức nào đó được ưu tiên tính toán trước thì phải đặt chúng trong cặp ngoặc


# include <iostream>
using namespace std;
int main()
{
    int a;
    cin >> a;
    if (a % 3 == 0)
        cout << "a chia hết cho 3";
    else 
        cout << "a không chia hết cho 3";
    return 0;
}

0. Cùng xem vài ví dụ:

{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

2

Nguyên tắc tính toán của các biểu thức logic sẽ được tính toán theo thứ tự ưu tiên của toán tử: Trong ngoặc trước, ngoài ngoặc sau, rồi tới các toán tử khác. Kết quả của cả biểu thức sẽ phụ thuộc vào sự kết hợp giữa các biểu thức logic thành phần là

!({Biểu_thức_logic})

9 hay

if ({Biểu_thức_logic})
    {Câu_lệnh};

6. Nếu quan hệ giữa chúng là

!({Biểu_thức_logic})

9 - đồng thời, thì tất cả các biểu thức thành phần đều phải có giá trị

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

7 mới khiến cho biểu thức ban đầu mang giá trị

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

7. Ngược lại, nếu quan hệ giữa chúng là

if ({Biểu_thức_logic})
    {Câu_lệnh};

6 - hoặc, thì chỉ cần một trong số các biểu thức thành phần mang giá trị

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

7, cả biểu thức sẽ mang giá trị

5 > 8
a != b && b != c
delta == 0
5 != 8 || 4 == 2

7. Chẳng hạn, với biểu thức


# include <iostream>
using namespace std;
int main()
{
    int a;
    cin >> a;
    if (a % 3 == 0)
        cout << "a chia hết cho 3";
    else 
        cout << "a không chia hết cho 3";
    return 0;
}

9, chương trình sẽ tính nó như sau:

  • Đầu tiên xét biểu thức trong ngoặc: if (a > 0)
    if (b > 0)  
        if (c > 0)  
      if (a + b > c)  
          if (a + c > b)  
        if (b + c > a)  
      ...  
    

    0. Biểu thức này có kết quả là

    5 > 8 a != b && b != c delta == 0 5 != 8 || 4 == 2

    7, do

    if (a > 0)
    if (b > 0)  
        if (c > 0)  
      if (a + b > c)  
          if (a + c > b)  
        if (b + c > a)  
      ...  
    

    2 là

    5 > 8 a != b && b != c delta == 0 5 != 8 || 4 == 2

    7 còn

    if (a > 0)
    if (b > 0)  
        if (c > 0)  
      if (a + b > c)  
          if (a + c > b)  
        if (b + c > a)  
      ...  
    

    4 là

    5 > 8 a != b && b != c delta == 0 5 != 8 || 4 == 2

    8, đồng thời quan hệ giữa chúng chỉ là

    if ({Biểu_thức_logic})
    {Câu_lệnh};  
    
    6 - hoặc.
  • Kế đến xét biểu thức if (a > 0)
    if (b > 0)  
        if (c > 0)  
      if (a + b > c)  
          if (a + c > b)  
        if (b + c > a)  
      ...  
    

    7. Biểu thức này tất nhiên có giá trị là

    5 > 8 a != b && b != c delta == 0 5 != 8 || 4 == 2

    7.
  • Cuối cùng gộp kết quả của if (a > 0)
    if (b > 0)  
        if (c > 0)  
      if (a + b > c)  
          if (a + c > b)  
        if (b + c > a)  
      ...  
    

    9 và

    `

include <iostream>

using namespace std; int main() {

int a;  
cin >> a;  
if (a % 3 == 0)  
    cout << "a chia hết cho 3";  
else  
    cout << "a không chia hết cho 3";  
return 0;  
}
9 bằng toán tử  
!({Biểu_thức_logic})
9\. Do cả hai biểu thức thành phần đều có giá trị  
5 > 8 a != b && b != c delta == 0 5 != 8 || 4 == 2
7 nên cả biểu thức ban đầu sẽ có giá trị  
5 > 8 a != b && b != c delta == 0 5 != 8 || 4 == 2
7.

Nói chung, để đặt được đúng các biểu thức logic theo thứ tự mong muốn, các bạn cần có kiến thức vững về độ ưu tiên toán tử, nghĩa là biết cái gì sẽ được tính trước, cái gì sẽ được tính sau để đặt các biểu thức vào trong ngoặc cho đúng. Các bạn có thể xem lại bài 22 để biết độ ưu tiên của các toán tử trong C++ như thế nào nhé!

## V. Sử dụng toán tử điều kiện thay cho câu lệnh if...else

Ở bài đầu tiên, các bạn đã được giới thiệu về một loại toán tử đặc biệt trong C++, đó là toán tử hỗn hợp. Trong số đó, có một loại với cú pháp như sau:
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

3

trong đó 
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

04 là một biểu thức logic, 
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

05 và 
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

06 là các biểu thức hoặc câu lệnh. Thực ra, đây chính là một cách viết khác của câu lệnh 
if ({Biểu_thức_logic}) {
{Khối_lệnh_1};
} else {
 {Khối_lệnh_2};
}

0\. Thay vì viết:
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

4

thì ta sẽ viết bằng toán tử hỗn hợp, cách viết đó sẽ ngắn gọn hơn rất nhiều. Chẳng hạn, muốn kiểm tra một số nguyên NN có chia hết cho 22 hay không, thay vì viết:
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

5

thì ta viết:
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

6

Ngoài ra, khi sử dụng toán tử này, nếu như cần thực hiện nhiều câu lệnh với một điều kiện, thì ta có thể phân tách chúng bằng dấu 
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

08 mà không cần phải tạo khối lệnh bằng cặp dấu 
if ({Biểu_thức_logic}) {
{Khối_lệnh_1};
} else {
 {Khối_lệnh_2};
}

2 như câu lệnh 
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

10 truyền thống. Cú pháp viết như sau:
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

7

Tuy nhiên, có một lưu ý rằng, bản chất của cặp toán tử 
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

11 thực ra là trả về giá trị 
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

05 nếu như biểu thức logic 
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

04 có giá trị 
5 > 8 a != b && b != c delta == 0 5 != 8 || 4 == 2

7, ngược lại thì trả về giá trị 
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

06\. Do đó, chúng ta không được sử dụng câu lệnh ở vế 
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

05 hoặc vế 
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

06 khác kiểu nhau. Chẳng hạn, câu lệnh sau sẽ là không hợp lệ:
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

8

bởi vì câu lệnh này có vế 
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

05 là một câu lệnh in ra, còn vế 
{Biểu_thức_A} {Phép_toán} {Biểu_thức_B}

06 lại là biểu thức số học. Hơi khó để phân biệt, nhưng nếu làm nhiều bài tập các bạn sẽ biết rằng những biểu thức nào có thể kết hợp với nhau. Tuy nhiên, cách viết này không được ưu tiên, bởi vì nó có thể rất rối mắt trong những trường hợp câu lệnh dài và nhiều. Chúng ta chỉ nên sử dụng toán tử này khi cần thực hiện những câu lệnh rất ngắn thôi!

## VI. Cấu trúc lựa chọn 
if ({Biểu_thức_logic})
{Câu_lệnh_1};
else
{Câu_lệnh_2};

6

## 1\. Lựa chọn nhiều trường hợp

Đôi khi, người ta cần kiểm tra rất nhiều trường hợp xảy ra của một đối tượng, và ứng với mỗi trường hợp ta sẽ có cách xử lý khác nhau. Ví dụ, một cửa hàng quần áo đặt biển quảng cáo như sau:

  • Nếu mua 11 chiếc áo, giá tiền là 50.00050.000 VNĐ/chiếc.
  • Nếu mua 22 chiếc áo, giá tiền là 45.00045.000 VNĐ/chiếc.
  • Nếu mua 33 chiếc áo, giá tiền là 40.00040.000 VNĐ/chiếc.
  • Nếu mua nhiều hơn 33 chiếc áo, giá tiền là 35.00035.000 VNĐ/chiếc và được tặng thêm một đôi tất.
Ở đây, đối tượng đang được xem xét là số lượng chiếc áo được mua, và ứng với mỗi giá trị 1,2,31, 2, 3 hoặc nhiều hơn 3,3, sẽ có một đơn giá khác nhau cho mỗi chiếc áo. Những cách diễn đạt như vậy được gọi là mệnh đề lựa chọn. C++ cung cấp một cấu trúc để biểu diễn các mệnh đề dạng lựa chọn là
if ({Biểu_thức_logic})
{Câu_lệnh_1};
else
{Câu_lệnh_2};

6.

## 2\. Cấu trúc lựa chọn 
if ({Biểu_thức_logic})
{Câu_lệnh_1};
else
{Câu_lệnh_2};

6

Cấu trúc 
if ({Biểu_thức_logic})
{Câu_lệnh_1};
else
{Câu_lệnh_2};
`

6 dùng để lựa chọn trường hợp giá trị cho một đối tượng xác định, và quyết định sẽ làm công việc gì tương ứng với mỗi trường hợp xảy ra.