Thứ Bảy, 27 tháng 4, 2024

12. Toán Tử - Operator phần 3

Để hiểu về Toán tử, hành động "chuẩn" nhất là chúng ta phải tiếp tục thêm mắm thêm muối chương trình tào lao phiên bản C++ của chúng ta.


Đây là chương trình của chúng ta trong phần trước


#include <iostream>
#include <iomanip>

using namespace std;

int main(){
    int a = 123;
    int soTien;
    int soNam;
    int  tongSoTien;
    long long b = 1234567890;
    float c = 2.3456;
    double d = 2.3456789;
    char kitu= 'A';
    char Ten;
    bool check = true;
    cout << "Gia tri cua a : " << a << endl;
    cout << "Gia tri cua b : " << b << endl;
    cout << "Gia tri cua c : " << c << endl;
    cout << "Gia tri cua d : " << d << endl;
    cout << "Gia tri cua kitu : " << kitu << endl;
    cout << "Gia tri cua check : " << check << endl;
    cout << "Gia tri cua check : " << boolalpha << check << endl;
    cout << "Gia tri cua c : " << fixed << setprecision(2) << c << endl;
    cout << "Gia tri cua d : " << fixed << setprecision(4) << d << endl;
    cout << setw(12) << setfill('0') << a << endl;
    cout << setw(12) << setfill(' ') << "Dat Viet" << endl;
    cout << "Nhap tên của bạn, chỉ một chữ A,B,C :  "<< endl;
    cin >> Ten;
    cout << "Ten ban la : " << Ten << endl;
    cout << "Nhap so tien gui hang thang :  "<< endl;
    cin >> soTien;
    cout << "Nhap so nam tiet kiem :  "<< endl;
    cin >> soNam;
    tongSoTien = (soTien * 12) * soNam;
    cout << "Xin chao, " << Ten << ". Sau " << soNam << " nam tich luy. Ban da tiet kiem dươc tong so tien là: " << tongSoTien << endl;

    

}



Chúng ta sẽ áp dụng một số toán tử đã bàn để hiểu rõ hơn về cách thức các toán tử hoạt động trong chương trình C++.

Các toán tử số học không quá khó hiểu với đa số chúng ta, vì vậy ta tạm không bàn tới trong phần này. Có một số vấn đề chúng ta sẽ bàn cuối phần này.


Chúng ta sẽ bàn và phân tích Toán Tử Điều Kiện (3 Ngôi) đầu tiên.

Bạn thêm một biến x (luôn lưu ý tên biến không được trùng với các biến khác) kiểu int sau vào chương trình tào lao:

int x = 15 < 25 ? 100 : 200;

Có thể tạm "dịch ra tiếng Việt" câu lệnh trên như sau:

Khai báo một biến số nguyên tên là x. Gán giá trị cho biến x với nguyên tắc sau: nếu biểu thức bên trái dấu hỏi (?) số 15 nhỏ hơn số 25 đúng thì giá trị gán sẽ là bên trái dấu hai chấm (:), ngược lại nếu biểu thức bên trái dấu hỏi (?) số 15 nhỏ hơn số 25 sai thì giá trị gán sẽ là bên phải dấu hai chấm (:)

Đây là chương trình của chúng ta

 

#include <iostream>
#include <iomanip>

using namespace std;

int main(){
    int a = 123;
    int soTien;
    int soNam;
    int  tongSoTien;
    int x = 15 < 25 ? 100 : 200;
    long long b = 1234567890;
    float c = 2.3456;
    double d = 2.3456789;
    char kitu= 'A';
    char Ten;
    bool check = true;
    cout << "Gia tri cua a : " << a << endl;
    cout << "Gia tri cua b : " << b << endl;
    cout << "Gia tri cua c : " << c << endl;
    cout << "Gia tri cua d : " << d << endl;
    cout << "Gia tri cua kitu : " << kitu << endl;
    cout << "Gia tri cua check : " << check << endl;
    cout << "Gia tri cua check : " << boolalpha << check << endl;
    cout << "Gia tri cua c : " << fixed << setprecision(2) << c << endl;
    cout << "Gia tri cua d : " << fixed << setprecision(4) << d << endl;
    cout << setw(12) << setfill('0') << a << endl;
    cout << setw(12) << setfill(' ') << "Dat Viet" << endl;
    cout << "Nhap tên của bạn, chỉ một chữ A,B,C :  "<< endl;
    cin >> Ten;
    cout << "Ten ban la : " << Ten << endl;
    cout << "Nhap so tien gui hang thang :  "<< endl;
    cin >> soTien;
    cout << "Nhap so nam tiet kiem :  "<< endl;
    cin >> soNam;
    tongSoTien = (soTien * 12) * soNam;
    cout << "Xin chao, " << Ten << ". Sau " << soNam << " nam tich luy. Ban da tiet kiem dươc tong so tien là: " << tongSoTien << endl;

    

}

 

Bấm Run chạy chương trình

 


Bạn đoán xem giá trị gán cho biến x sẽ là bao nhiêu?

Chúng ta sẽ  dùng lệnh cout để xem thử biến x có giá trị bao nhiêu

cout << "Gia tri cua x : " << x << endl;

Chương trình của chúng ta sẽ như thế này:

#include <iostream>
#include <iomanip>

using namespace std;

int main(){
    int a = 123;
    int soTien;
    int soNam;
    int  tongSoTien;
    int x = 15 < 25 ? 100 : 200;
    long long b = 1234567890;
    float c = 2.3456;
    double d = 2.3456789;
    char kitu= 'A';
    char Ten;
    bool check = true;
    cout << "Gia tri cua a : " << a << endl;
    cout << "Gia tri cua b : " << b << endl;
    cout << "Gia tri cua c : " << c << endl;
    cout << "Gia tri cua d : " << d << endl;
    cout << "Gia tri cua kitu : " << kitu << endl;
    cout << "Gia tri cua check : " << check << endl;
    cout << "Gia tri cua check : " << boolalpha << check << endl;
    cout << "Gia tri cua c : " << fixed << setprecision(2) << c << endl;
    cout << "Gia tri cua d : " << fixed << setprecision(4) << d << endl;
    cout << setw(12) << setfill('0') << a << endl;
    cout << setw(12) << setfill(' ') << "Dat Viet" << endl;
    cout << "Nhap tên của bạn, chỉ một chữ A,B,C :  "<< endl;
    cin >> Ten;
    cout << "Ten ban la : " << Ten << endl;
    cout << "Nhap so tien gui hang thang :  "<< endl;
    cin >> soTien;
    cout << "Nhap so nam tiet kiem :  "<< endl;
    cin >> soNam;
    tongSoTien = (soTien * 12) * soNam;
    cout << "Xin chao, " << Ten << ". Sau " << soNam << " nam tich luy. Ban da tiet kiem dươc tong so tien là: " << tongSoTien << endl;
    cout << "Gia tri cua x : " << x << endl;

    

}



Bấm Run để chạy thử, kết quả vì câu hỏi "15 có nhỏ hơn 25 không" đúng nên biến x nhận giá trị là 100. Nếu thay đổi vị trí của 15 và 25 thành biểu thức 25<15 thì khi chạy chương trình, ta sẽ thấy giá trị của x là 200.



Tiếp theo là toán tử Logic. Có ba toán tử logic là AND (&&) , OR (||) , NOT (!), các toán tử logic này được sử dụng để kết hợp nhiều biểu thức so sánh và sẽ trả về đúng hoặc sai.


Cần lưu ý rằng trong C++ tất cả các giá trị khác 0 được coi là giá trị đúng. Để tiện, chúng ta sẽ tạm coi khi in ra màn hình số 1 có nghĩa là ĐÚNG (TRUE) nếu in ra sô 0 có ngĩa là SAI (FALSE). Trong phần trước, chúng ta đã biết rằng nếu muốn hiển thị giá trị true, false chúng ta chỉ cần thêm cụm boolalpha trước biến bool, tuy nhiên trong phần này chúng ta sử dụng biến int nên với code bên dưới, nếu thử dùng boolalpha chúng ta vẫn nhận kết quả 1 và 0.

Lấy lại ví dụ trong phần trước. Giả sử quy tắc cá nhân của bạn thay đổi là chỉ cần nếu bên ngoài trời nắng HOẶC bạn không có lớp học thì bạn sẽ đi biển. Tức là bây giờ không cần cả hai điều kiện, chỉ cần một trong hai điều kiện đáp ứng thì bạn sẽ đi biển. Chúng ta đang sử dụng toán tử OR (||) để quyết định có đi biển không.
 

Vì chúng ta chưa thảo vận về chuỗi-String nên tạm thời ta sẽ chỉ ví dụ tương đối.
Bạn thêm hai biến sau vào chương trình:

    int diBien1= (10 < 20) && (20 >= 20);
    int diBien2= (10 > 20) || (20 < 10);


Tạm hình dung trong biến diBien1, 2 biểu thức 10<2020>=20 tương đương với trời nắng VÀ bạn không có lớp học và đều ĐÚNG, vì vậy kết quả sẽ là ĐÚNG
Còn biến diBien2, 2 biểu thức 10>20 và 20<10 tương đương với trời nắng HOẶC bạn không có lớp học và đều SAI, vì vậy kết quả sẽ là SAI

Dùng lệnh in hai biến ra ta sẽ có kết quả 1 0, tương đương với ĐÚNG SAI.

   cout << "Gia tri cua diBien1 : " << diBien1 << ". Gia tri cua diBien2 : " << diBien2 << endl;

Đây là chương trình sau khi thêm hai biến và lệnh cout.

 

#include <iostream>
#include <iomanip>

using namespace std;

int main(){
    int a = 123;
    int soTien;
    int soNam;
    int  tongSoTien;
    int x = 15 < 25 ? 100 : 200;
    int diBien1= (10 < 20) && (20 >= 20);
    int diBien2= (10 > 20) || (20 < 10);

    long long b = 1234567890;
    float c = 2.3456;
    double d = 2.3456789;
    char kitu= 'A';
    char Ten;
    bool check = true;
    cout << "Gia tri cua a : " << a << endl;
    cout << "Gia tri cua b : " << b << endl;
    cout << "Gia tri cua c : " << c << endl;
    cout << "Gia tri cua d : " << d << endl;
    cout << "Gia tri cua kitu : " << kitu << endl;
    cout << "Gia tri cua check : " << check << endl;
    cout << "Gia tri cua check : " << boolalpha << check << endl;
    cout << "Gia tri cua c : " << fixed << setprecision(2) << c << endl;
    cout << "Gia tri cua d : " << fixed << setprecision(4) << d << endl;
    cout << setw(12) << setfill('0') << a << endl;
    cout << setw(12) << setfill(' ') << "Dat Viet" << endl;
    cout << "Nhap tên của bạn, chỉ một chữ A,B,C :  "<< endl;
    cin >> Ten;
    cout << "Ten ban la : " << Ten << endl;
    cout << "Nhap so tien gui hang thang :  "<< endl;
    cin >> soTien;
    cout << "Nhap so nam tiet kiem :  "<< endl;
    cin >> soNam;
    tongSoTien = (soTien * 12) * soNam;
    cout << "Xin chao, " << Ten << ". Sau " << soNam << " nam tich luy. Ban da tiet kiem dươc tong so tien là: " << tongSoTien << endl;
    cout << "Gia tri cua x : " << x << endl;
    cout << "Gia tri cua diBien1 : " << diBien1 << ". Gia tri cua diBien2 : " << diBien2 << endl;

    

}

 

Bấm Run để chạy chương trình

 


 

 

Dù biết trước kết quả không thay đổi, nhưng chúng ta vẫn thử thêm dòng lệnh sau vào chương trình và chạy thử, kết quả không có gì thay đổi, vẫn chỉ là 1 và 0

 cout << "Gia tri cua diBien1 : " << boolalpha << diBien1 << ". Gia tri cua diBien2 : " << boolalpha << diBien2 << endl;

Kết quả

 

 


 

Chương trình cho đến lúc này có diện mạo như sau:

 #include <iostream>
#include <iomanip>

using namespace std;

int main(){
    int a = 123;
    int soTien;
    int soNam;
    int  tongSoTien;
    int x = 15 < 25 ? 100 : 200;
    int diBien1= (10 < 20) && (20 >= 20);
    int diBien2= (10 > 20) || (20 < 10);
    long long b = 1234567890;
    float c = 2.3456;
    double d = 2.3456789;
    char kitu= 'A';
    char Ten;
    bool check = true;
    cout << "Gia tri cua a : " << a << endl;
    cout << "Gia tri cua b : " << b << endl;
    cout << "Gia tri cua c : " << c << endl;
    cout << "Gia tri cua d : " << d << endl;
    cout << "Gia tri cua kitu : " << kitu << endl;
    cout << "Gia tri cua check : " << check << endl;
    cout << "Gia tri cua check : " << boolalpha << check << endl;
    cout << "Gia tri cua c : " << fixed << setprecision(2) << c << endl;
    cout << "Gia tri cua d : " << fixed << setprecision(4) << d << endl;
    cout << setw(12) << setfill('0') << a << endl;
    cout << setw(12) << setfill(' ') << "Dat Viet" << endl;
    cout << "Nhap tên của bạn, chỉ một chữ A,B,C :  "<< endl;
    cin >> Ten;
    cout << "Ten ban la : " << Ten << endl;
    cout << "Nhap so tien gui hang thang :  "<< endl;
    cin >> soTien;
    cout << "Nhap so nam tiet kiem :  "<< endl;
    cin >> soNam;
    tongSoTien = (soTien * 12) * soNam;
    cout << "Xin chao, " << Ten << ". Sau " << soNam << " nam tich luy. Ban da tiet kiem dươc tong so tien là: " << tongSoTien << endl;
    cout << "Gia tri cua x : " << x << endl;
    cout << "Gia tri cua diBien1 : " << diBien1 << ". Gia tri cua diBien2 : " << diBien2 << endl;
    cout << "Gia tri cua diBien1 : " << boolalpha << diBien1 << ". Gia tri cua diBien2 : " << boolalpha << diBien2 << endl;
    

}

 

Các toán tử so sánh cũng sẽ trả về một trong hai giá trị TRUE hay FALSE nên ta hoàn toàn có thể dễ dàng thử chỉ với lệnh prinft.

Bạn có thể thử vài toán tử như sau, thêm các lệnh printf vào chương trình tào lao của chúng ta. 

    cout << (100 > 50) << endl;
    cout << (20 <= 30) << endl;
    cout << (80 >= 100) << endl;

Bấm Run để chạy thử ta sẽ thấy kết quả như sau

 


 

Đây là chương trình cho đến lúc này:

#include <iostream>
#include <iomanip>

using namespace std;

int main(){
    int a = 123;
    int soTien;
    int soNam;
    int  tongSoTien;
    int x = 15 < 25 ? 100 : 200;
    int diBien1= (10 < 20) && (20 >= 20);
    int diBien2= (10 > 20) || (20 < 10);
    long long b = 1234567890;
    float c = 2.3456;
    double d = 2.3456789;
    char kitu= 'A';
    char Ten;
    bool check = true;
    cout << "Gia tri cua a : " << a << endl;
    cout << "Gia tri cua b : " << b << endl;
    cout << "Gia tri cua c : " << c << endl;
    cout << "Gia tri cua d : " << d << endl;
    cout << "Gia tri cua kitu : " << kitu << endl;
    cout << "Gia tri cua check : " << check << endl;
    cout << "Gia tri cua check : " << boolalpha << check << endl;
    cout << "Gia tri cua c : " << fixed << setprecision(2) << c << endl;
    cout << "Gia tri cua d : " << fixed << setprecision(4) << d << endl;
    cout << setw(12) << setfill('0') << a << endl;
    cout << setw(12) << setfill(' ') << "Dat Viet" << endl;
    cout << "Nhap tên của bạn, chỉ một chữ A,B,C :  "<< endl;
    cin >> Ten;
    cout << "Ten ban la : " << Ten << endl;
    cout << "Nhap so tien gui hang thang :  "<< endl;
    cin >> soTien;
    cout << "Nhap so nam tiet kiem :  "<< endl;
    cin >> soNam;
    tongSoTien = (soTien * 12) * soNam;
    cout << "Xin chao, " << Ten << ". Sau " << soNam << " nam tich luy. Ban da tiet kiem dươc tong so tien là: " << tongSoTien << endl;
    cout << "Gia tri cua x : " << x << endl;
    cout << "Gia tri cua diBien1 : " << diBien1 << ". Gia tri cua diBien2 : " << diBien2 << endl;
    cout << "Gia tri cua diBien1 : " << boolalpha << diBien1 << ". Gia tri cua diBien2 : " << boolalpha << diBien2 << endl;
    cout << (100 > 50) << endl;
    cout << (20 <= 30) << endl;
    cout << (80 >= 100) << endl;

}

 

Toán tử gán

Chúng ta đã sử dụng toán tử gán đơn giản chúng ta dùng trong chương trình tào lao ngay từ khởi đầu với biến int a= 123;

Chúng ta đã gán giá trị 123 cho biến a.

Chúng ta thử với một toán tử gán khác. Thêm code sau vào chương trình:

a +=10;

Bấm Run để chạy chương trình, ta sẽ thấy dòng chữ Gia tri cua a: 133!


 

 

Đó là vì a+=10; tương đương với a= a + 10; Bạn viết code kiểu nào cũng được.

Cuối cùng, ta quay lại với toán tử số học. Có mấy lưu ý sau.

Lưu ý 1: Chia nguyên và chia lấy phần thập phân

  • Nếu bạn lấy 2 số nguyên (int, long long) và chia cho nhau thì phép chia đó là phép chia nguyên, phần thập phân sẽ tự bị loại bỏ
  • Nếu bạn chia 2 số thực cho nhau hoặc 1 số nguyên với 1 số thực thì phép chia mới giữ lại phần thập phân.


Lưu ý 2: Nhân 2 số nguyên bị tràn dữ liệu

Như trong ví dụ trước, khi chúng ta gán cho biến int so một giá trị hơn 20 tỷ, chương trình sẽ cảnh báo tràn dữ liệu.


Tương tự, khi ta dùng 2 số int và nhân với nhau thì tích của 2 số này có thể vượt giới hạn của số int, ví dụ a = 10^6 và b = 10^6 thì tích của 2 số là 10^12 vượt giới hạn của số int và sẽ bị tràn. Như bài trước đã bàn, để xử lý tình huống này ta có thể lưu 2 số này ở kiểu long long, hoặc ít nhất 1 trong 2 số ở kiểu long long. Cách thứ 2 bạn có thể ép kiểu khi nhân 2 số.

 

Phần tiếp theo

Phần trước

Không có nhận xét nào:

Đăng nhận xét