1.5. Một cỗ máy để tính toán

Trong bài học trước, tôi đã giới thiệu với các bạn về các biến cũng như một chút kiến thức về bộ nhớ. Một cái máy vi tính về cơ bản không khác một cái máy tính bỏ túi siêu cấp mà chúng ta có thể dùng để tính toán và lưu trữ dữ liệu. Hy vọng các bạn sẽ có hứng thú với việc này vì đây là thứ mà tôi sẽ trình bày với các bạn ngay dưới đây.

Chúng ta sẽ bắt đầu với công việc đơn giản nhất mà một cái máy tính bỏ túi có thể làm. Đoán thử xem! Đúng, chúng ta sẽ học cách cho phép yêu cầu người dùng nhập một số và lưu nó vào bộ nhớ máy tính. Để làm điều này, chúng ta cần đến các... "biến".

Sau đó, tôi sẽ chỉ cho các bạn cách thực hiện một số phép toán cơ bản và cuối cùng in kết quả nhận được ra màn hình. Các bạn sẽ được thực tập tất cả qua 1 bài tập nhỏ.

Yêu cầu nhập dữ liệu người dùng

 Chúng ta đã học cách hiện dữ liệu ra màn hình rồi. Bây giờ sẽ là theo chiều ngược lại, nghĩa là yêu cầu người dùng nhập dữ liệu của họ vào bộ nhớ.

Nhập dữ liệu từ console

C++ nói riêng và ngôn ngữ lập trình nói chung sử dụng rất nhiều từ khóa bắt nguồn từ tiếng Anh. cout là một ví dụ. Trong tiếng Anh, "out" có nghĩa là "ra" thế nên cout cho phép chúng ta đưa luống dữ liệu từ trong chương trình ra ngoài. Ngược lại với "out" là "in" nghĩa là "vào", vì thế, chúng ta cũng sẽ có cin cho phép nhập dữ liệu từ bên ngoài vào trong chương trình.

Nếu đi cùng với cout<< thì đi cùng cin sẽ là >>.

Dưới đây là một ví dụ minh họa.

#include <iostream>
using namespace std;

int main(){
    cout << "Ban bao nhieu tuoi ?" << endl;

    int soTuoi(0); //Chuan bi 1 o nho de luu 1 so nguyen

    cin >> soTuoi; //Luu so nguyen vào o nho o tren

    cout << "Ban da " << soTuoi << " tuoi !" <<  endl; //Hien thi so tuoi ra man hinh

    return 0;
}

Hãy chạy thử để xem kết quả ra sao nhé.

Kết quả

!Chuyện gì đã xảy ra bên trong máy tính?

Chương trình hiển thị thông điệp hỏi "Ban bao nhieu tuoi ?". Đến đây, tất cả mọi thứ vẫn bình thường. Ở dòng số 7, chương trình yêu cầu máy tính 1 ô nhớ và dán nhãn soTuoi lên đó.

Tiếp theo, mọi chuyện trở nên thú vị hơn khi máy tính hiện lên 1 con trỏ nhấp nháy chờ bạn nhập dữ liệu gì đó. Sau khi bạn đã nhập xong và ấn phím Enter, chương trình lưu số mà bạn vừa nhập vào trong ô soTuoi thay vì giá trị 0 mà bạn đưa ra lúc ban đầu.

Cuối cùng lại là một dòng lệnh thông thường dùng để hiển thị giá trị biến.

Mẹo vặt để nhớ chiều của phép toán

Nhiều người vẫn hay nhầm lẫn chiều của phép toán, sử dụng cout với >>cin với << và điều này không đúng. Mỗi người sẽ có cách ghi nhớ khác nhau, nhưng tôi sẽ cung cấp cho các bạn hình vẽ tôi hay liên tưởng đến để không nhầm lẫn.

Khi chúng ta muốn hiển thị dữ liệu ra màn hình, dữ liệu đi ra khỏi bộ nhớ nên dấu mũi tên hướng về phía cout. Còn khi chúng ta yêu cầu người dùng nhập dữ liệu thì ngược lại, thông tin đi vào bộ nhớ nên dấu mũi tên hướng ra xa cin. Hy vọng sẽ không có ai nhầm lẫn nữa wink.

Với các kiểu dữ liệu khác

Tất cả những thứ chúng ta nói trên đây đều có hiệu lực với những kiểu dữ liệu khác nữa.

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

int main(){
    cout << "Ten ban la gi ?" << endl;
    string ten("Vo danh"); //1 o nho chua chuoi ky tu
    cin >> ten; //Nhap ten that

    cout << "pi bang bao nhieu ?" << endl;
    double pi(-1.); //1 o nho chua so thuc
    cin >> pi; //Nhap gia tri cua pi
     
    cout << "Ban ten la " << ten << " va ban nghi pi = " << pi << "." << endl;

    return 0;
}

Chắc không cần giải thích thêm nữa. Tuy nhiên tôi vẫn luốn các bạn kiểm tra thử cho chắc chắn.

Vấn đề với dấu cách

Các bạn đã chạy thử đoạn mã bên trên chưa? Chắc hẳn sẽ có bạn thử nhập đầy đủ họ tên mình chứ? Cùng xem chuyện gì xảy ra nhé.

? À ha, 1 phần trong tên đã biến mất và máy tính thì không yêu cầu bạn nhập giá trị của pi! Chuyện gì đã xảy ra thế?

Vấn đề nằm ở dấu cách mà bạn đã đặt giữa họ và tên của mình. Khi bạn nhấn phím Enter, máy tính sẽ ghi dữ liệu mà bạn nhập vào trong ô nhớ. Nhưng mà dữ liệu sẽ được coi là kết thúc nếu chương trình bắt gặp dấu cách hoặc ký tự xuống dòng. Khi bạn cần nhập 1 số thì đây không phải là vấn đề vì trong 1 số thì không có dấu cách. Với kiểu string thì khác, trong chuỗi ký tự thì việc có dấu cách là rất bình thường. Thế là máy tính sẽ ngắt dòng dữ liệu không đúng chỗ, nghĩa là sau chữ đầu tiên. Và vì máy tính thì cũng không được thông minh lắm, nó sẽ coi chữ tiếp theo là giá trị của pi.

Chúng ta có 1 giải pháp cho vấn đề này, đó là thay vì chỉ lấy chữ đầu tiên, chúng ta sẽ coi dũ liệu cần nhập là cả dòng. Để làm việc này, chúng ta sẽ dùng hàm getline(). Chúng ta sẽ xem xét ký hơn thế nào là 1 hàm sau, giờ cứ thử dùng để giải quyết trường hợp này đã.

Chúng ta sẽ thay cin >> ten; bằng 1 hàm getline().

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

int main(){
    cout << "Ten ban la gi ?" << endl;
    string ten("Vo danh"); //1 o nho chua chuoi ky tu
    getline(cin, ten); //Nhap ten that

    cout << "pi bang bao nhieu ?" << endl;
    double pi(-1.); //1 o nho chua so thuc
    cin >> pi; //Nhap gia tri cua pi
     
    cout << "Ban ten la " << ten << " va ban nghi pi = " << pi << "." << endl;

    return 0;
}

Chúng ta vẫn thây có những thành phần quen thuộc như cin, tên biến chỉ khác là không có dấu >> và chúng nằm trong ngoắc, cách nhau 1 dấu phẩy (,).

!Thứ tự bên trong dấu ngoặc là rất quan trọng, nhất thiết phải đặt cin phía trước

Lần này thì máy tính không còn nhẫm lẫn gì nữa.

Vấn đề khi nhập giá trị của pi trước

Nếu chúng ta dung cin >> rồi mới đến getline() để yêu cầu nhập số pi trước tên người dùng, đoạn mã sẽ không chạy nữa. Máy tính sẽ không hỏi bạn tên nữa và hiển thị lung tung.

Để giải quyết vấn đề này, bạn phải thêm cin.ignore() sau khi sử dụng dấu >>.

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

int main(){
    cout << "pi bang bao nhieu ?" << endl;
    double pi(-1.); //1 o nho chua so thuc
    cin >> pi; //Nhap gia tri cua pi

    cin.ignore();

    cout << "Ten ban la gi ?" << endl;
    string ten("Vo danh"); //1 o nho chua chuoi ky tu
    getline(cin, ten); //Nhap ten that

    cout << "Ban ten la " << ten << " va ban nghi pi = " << pi << "." << endl;

    return 0;
}

Không còn vấn đề gì nữa rồi. Khi mà trong đoạn mã bạn sử dụng cả cin >>getline(), nhớ thêm vào cin.ignore() sau mỗi lần cin >>. Đây la 1 quy tắc cần nhớ.

Giờ hãy xem chúng ta có thể làm gì với các biến, hãy cộng chúng lại thử xem.

Thay đổi một biến
 Thay đổi giá trị biến

Tôi đã nói với các bạn là máy vi tính chỉ là 1 cái máu tính bỏ túi siêu cấp. Điều này có nghĩa là nó phải có khả năng cho phép chúng ta thực hiện những phép toán giống như 1 cái máy tính bỏ túi trên máy vi tính. Chúng ta sẽ sử dụng đến các biến.

Bắt đầu bằng việc làm sao để thay đổi giá trị của 1 biến. Chúng ta dùng phép toán để thực hiện việc thay đổi này. Nếu tôi có 1 biến kiểu int và tôi muốn thay đổi giá trị của nó, tôi sẽ viết tên biến theo sau là phép toán = và cuối cùng là giá trị mới của biến. Người ta gọi đó là phép gán (affectation).

int soNguyen(0); //Tao ra o nho "soNguyen" và để vào đó giá trị 0

soNguyen = 5; //Thay gia tri trong "soNguyen" thanh 5

Bạn cũng có thể gán cho 1 biến giá trị của 1 biến khác.

int a(4), b(5); //Khai bao 2 bien

a = b; // gan gia tri cua b cho a

?Chuyện gì đã diễn ra?

Ở dòng thứ 3, máy tính đã đọc giá trị 5 trong ô nhớ "b", sau đó thay giá trị 4 vốn nằm trong ô nhớ "a" bằng giá trị mới này. Mời xem hình.

Bộ nhớ

Hãy hiển thị giá trị của chúng để kiểm tra.

#include <iostream>
using namespace std;

int main(){
    int a(4), b(5); 

    cout << "a = " << a << " va b = " << b << endl;

    cout << "Phep gan !" << endl;
    a = b; 

    cout << "a = " << a << " va b = " << b << endl;

    return 0;
}

Tôi là người rất tốt bụng nên tôi sẽ đưa ra kết quả cho mọi người. Tuy nhiên, bạn cũng nên tự thử đoạn mã để có thể hiểu nó hơn. Việc này rất quan trọng.

Đúng như dự đoán.

!Giá trị của b không hề thay đổi. Hãy nhớ rằng khi thực hiện phép gán, chỉ có toán tử bên trái dấu = là bị thay đổi.

Khởi đầu tốt đẹp, tuy nhiên chúng ta vẫn còn thiếu rất nhiều thứ để biến thành 1 cái mày tính bỏ túi, đó là những phép toán !

Chiếc máy để tính toán cơ bản

Cùng bắt đầu với phép toán cơ bàn nhất :  phép cộng. Các bạn sẽ không quá ngạc nhiên nếu tôi dùng dấu + chứ?

Quá đơn giản !

int a(5), b(8), tong(0);

tong= a + b;

Ở đây, dòng thứ nhất, chúng ta đã khai báo 3 biến là a, btong với các giá trị ban đầu lần lượt là 5, 8 và 0. Quá dễ hiểu!

Ở dòng thứ 3, ta yêu cầu máy tính thay đổi giá trị của biến tong. Phía bên kia của dấu =, máy tính nhận thấy phải thực hiện cộng giá trị trong 2 ô nhớ a va b. Phép cộng được thực hiện và kết quả được ghi vào ô nhớ tong trong khi giá trị của ab không hề thay đổi. Tất cả chỉ trong chớp mắt là xong.

Kiểm tra lại nhé

#include <iostream>
using namespace std;

int main(){
  int tong(0), a(5), b(8);

  tong = a + b;

  cout << "5 + 8 = " << tong << endl;
  return 0;
}

Các bạn phải nhận đc :

Tôi sẽ cho các bạn 1 bảng tóm tắt những phép toán có thể thực hiện nhé

 Phép toán  Dấu  Ví dụ
 Cộng  +  ketQua = a + b;
 Trừ  -  ketQua = a - b;
 Nhân  *  ketQua = a * b;
 Chia  /  ketQua = a / b;
 Modulo  %  ketQua = a % b;

 

? Modulo là phép toán gì? Tôi chưa bao giờ được học cả !

Ồ, tôi chắc hẳn là bạn đã học nó rồi. Có thể là dưới 1 cái tên khác, ví dụ như "chia lấy dư", vv... Nếu các bạn vẫn không thể nhớ ra, tôi sẽ nhắc lại 1 tí. Lấy ví dụ phép toán 13 chia cho 4. Hãy coi như là bạn chưa học phân số hay số thực gì cả, vậy thì phép toán này sẽ có kết quả là thương là 3 và dư là 1 vì 13 = 4 x 3 + 1. Vậy thì phép toán modulo của chúng ta sẽ trả về kết quả là 1 vì đây là số dư trong phép chia này.

! Phép toán này chỉ tồn tại cho số nguyên

1 phép toán khác cũng cần các bạn chú ý, đó là phép chia. Phép chia sẽ cho kết quả khác nhau khi toán tử là số thực và khi toán tử là số nguyên. Ví dụ cụ thể là 5.0 / 3.0 = 1.6666 trong khi 5 / 3 = 1. Khi thực hiện chia số nguyên, kết quả bạn nhận được sẽ chỉ là phần nguyên của kết quả thực tế (trong ví dụ, phần nguyên của 1.6666 là 1). Đây là 1 cái bẫy rất dễ mác phải nên cần chú ý.

Từ những phép toán cơ bản, bạn có thể tạo ra những phép tính phức tạp hơn với nhiều biến hơn nhờ sự giúp đỡ của dấu ngoặc "()".

int a(2), b(4), c(5), d;
d = (( a + b ) * c ) - c; 

Tất cả các phép tính hợp lệ trong toán học thì cũng hợp lê trong C++.

Các hằng số

Chúng ta đã tiếp xúc với các biến và cách để thao tác với chúng. Hy vọng không quá khó hiểu với các bạn! Bây giờ thì chúng ta sẽ nói về những thứ trái ngược hẳn với biến số, đó là các hằng số (constant). Hơi nhiều thuật ngữ cần nhớ trong 1 bài học đúng không ? Đừng lo, càng về sau bạn sẽ càng ít khái niệm mới cần học :).

? Thế các hằng số thì có tác dụng gì?

Thế nào cũng có bạn sẽ hỏi tôi như thế. Vậy nên tôi đã nghĩ sẵn câu trả lời rồi tongue-out.

Hãy tưởng tượng sau khi học xong C++, các bạn sẽ tạo ra 1 trò chơi tuyệt vời mang tính cách mạng mà ai cũng thích. Với những cái đầu đầy ý tưởng như các bạn thì sẽ rất dễ dàng nghĩ ra 1 trò chơi với nhiều bàn và độ khó khác nhau, hãy giả sử có 10 bàn. Vậy là số 10 sẽ không thay đổi trong suốt quá trình mà trò chơi của bạn hoạt động, từ khi người chơi bắt đầu khởi động tới lúc kết thúc. Vậy thì trong mã C++ chúng ta có thể tạo ra 1 hằng số soBan mang giá trị là 10.

Đây không phải ví dụ duy nhất. Những hằng số trong toán học, vật lý, hóa học như số pi, gia tốc trọng trường, vv.. trong C++ đều được biểu diễn bằng các hằng. Hãy tự mình tìm ra 1 ví dụ và bạn sẽ thấy khái niệm này không quá khó hiểu như tưởng tượng.

Bây giờ hãy xem cách khai báo 1 hằng số nhé.

Khai báo hằng

Rất đơn giản !  Chúng ta sẽ khai báo như khai báo 1 biến bình thường với từ khóa const ở giữa kiểu dữ liệu và tên biến.

int const soBan(10);

Đương nhiên là điều này cũng đúng với các kiểu dữ liệu khác nữa.

string const matKhau("wAsTZsaswQ"); 
double const pi(3.14);
unsigned int const hpNguoiChoi(100);

Tôi nghĩ thế là quá đủ để hiểu rồi :).

! Hãy khai báo 1 biến là hằng mỗi khi có thể. Việc này không chỉ giúp bạn tránh 1 số lỗi không cần thiết như thay đổi 1 giá trị không nên thay đổi mà còn giúp trình biên dịch tạo ra mã chương trình 1 cách hiệu quả hơn.

Chúng ta sẽ quay lại với hằng số trong các bài học sau. Giờ thì hãy chuẩn bị cho bài tập nhỏ đầu tiên của bạn !

Bài tập nho nhỏ

Chúng ta giờ đã có đủ nguyên liệu để viết 1 chương trình nho nhỏ rồi. Các bạn có còn nhớ bên trên chúng ta đã yêu cầu máy tính tính tổng của 2 số chứ ? Sẽ hữu ích hơn nếu chúng ta cho phép người dùng lựa chọn 2 số mà họ muốn tính tổng, đúng không? Vậy thì đề bài của chúng ta là hãy yêu cầu người dùng nhập vào 2 số mà họ muốn tính tổng, sau đó in kết quả ra màn hình.

Tôi sẽ giúp các bạn nhưng trước khi đọc hướng dẫn cũng như kết quả bên dưới, hãy thử tự viết đoạn mã của bạn đã. Sau đó rồi hãy đem so sánh với hướng dẫn của tôi. Đây mới là cách học hiệu quả nhất.

Trước tiên, luôn xác định xem mình cần những biến nào trong chương trình?

? Chúng ta cần gì ở đây nhỉ ?

Chúng ta cần phải có 1 biến cho mỗi số mà người dùng nhập vào. Vậy là ít nhất cần 2 biến, hãy lấy tên là ab như trong ví dụ trên.

Việc xác định kiểu dữ liệu cũng cần thiết. Chúng ta có sự lựa chọn giữa kiểu int, unsigned intdouble. Tôi thì kiến nghị sử dụng double để có thể thực hiện phép toán với số thực.

Vậy là đã xác định được khung cho chương trình.

#include <iostream>
using namespace std;

int main(){
   double a(0), b(0); //Khai báo 2 so hang a va b

   //…
   return 0;
}

Bước tiếp theo là yêu cầu người dùng nhập 2 số hạng. Tôi nghĩ là các bạn vẫn chưa quên cin >> đâu nhỉ. Chúng ta sẽ thêm được 1 đoạn mã.

#include <iostream>
using namespace std;

int main(){
   double a(0), b(0); //Khai bao 2 so hang a va b

   cout << "Chao mung den voi chuong trinh tinh tong  a + b !" << endl;

   cout << "Moi nhap gia tri cua a : "; 
   cin >> a;

   cout << "Moi nhap gia tri cua b : ";
   cin >> b;

   //…

   return 0;
}

Cuối cùng còn cần phải thực hiện phép cộng và in ra màn hình chứ. Chúng ta cần 1 biến để lưu kết quả. Vì kết quả sẽ không thay đổi trong khi chương trình hoạt động, chúng ta sẽ khai báo nó là 1 hằng.

#include <iostream>
using namespace std;

int main(){
   double a(0), b(0); //Khai bao 2 so hang a va b

   cout << "Chao mung den voi chuong trinh tinh tong  a + b !" << endl;

   cout << "Moi nhap gia tri cua a : "; 
   cin >> a;

   cout << "Moi nhap gia tri cua b : ";
   cin >> b;

   double const ketQua(a + b); //Thuc hien phep cong

   cout << a << " + " << b << " = " << ketQua << endl; //In ket qua ra man hinh

   return 0;
}

Có vẻ là đầy đủ rồi nhỉ? Hay chạy thử để xem kết quả nhé.

Tuyệt vời, đúng như mong đợi !

Với tôi, vậy là đủ rồi. Giờ là lúc cho các bạn phát triển trí tưởng tượng của mình. Hãy thay đổi bài tập và thêm vào 1 số tính năng của riêng bạn. 1 Vài ý tưởng để cái tiến mà tôi nghĩ đến:

  • Tính tích của 2 số
  • Phép tính phức tạp hơn như a * b + c
  • Tìm thương và số dư của phép chia số nguyên

Chúc các bạn vui vẻ với bài tập này :)

Các phép toán rút gọn

Sau bài tập trên, các bạn đã biết thao tác với các phép toán cơ bản. Có thể bạn ngạc nhiên nhưng ngoài 5 loại trên, không còn tồn tại các phép toán khác ! Chỉ với 5 phép toán này cũng đủ để viết cả đống trò chơi rồi :).

Tuy nhiên, vẫn còn tồn tại 1 số biến thể của các phép toàn này

Phép tăng

1 trong các phép tính hay gặp nhất trong tin học là phép toán cộng thêm 1 vào gí trị 1 biến. Ví dụ khi :

  • Người chơi từ bàn 4 lên bàn 5
  • Nhân vật tăng 1hp
  • Thêm 1 người chơi

Phép toán này thông dụng đến nỗi nó nhận đc 1 cái tên riêng, đó là phép tăng (increment). Với những gì các bạn đã học tới giờ, phép toán này không khó.

int soNguoi(4); //Co 4 nguoi dang choi
soNguoi = soNguoi + 1; //Tang them 1 nguoi nua
//Tu day co 5 nguoi choi

Thế nhưng, các lập trình viên là lũ lười hạng nhất và đổi với họ, đôi khi 2 dòng mã cũng là quá dài. Vì thế họ nghĩ ra 1 cách viết trong C++ đặc biệt ngắn gọn hơn.

int soNguoi(4); //Co 4 nguoi dang choi
++soNguoi; //Tang them 1 nguoi nua
//Tu day co 5 nguoi choi

Người ta dùng dấu ++ viết ngay trước tên biến và kết thúc bằng dấu ; như bình thường. 2 đoạn mã ngay trên hoàn toàn tương đương nhau, chỉ có là đoạn thứ 2 cần viết ngắn hơn.

Chúng ta cũng có thể viết soNguoi++, nghĩa là dấu ++ ở sau tên biến. Cái này được gọi là phép tăng sau (post-increment), ngược với phép tăng trước (pre-increment) được dùng trong đoạn mã bên trên. Trước hay sau được quy định dựa vào vị trí của dấu ++ so với tên biến.

Có thể các bạn thấy buồn cười nhưng rất nhanh thôi, các bạn sẽ yêu mến những thay đổi kiểu này.

! Phép toán này được dùng nhiều đến nỗi nó xuất hiện trong tên của ngôn ngữ mà bạn đang học đây. Đúng thế, C++ mang ý nghĩa là "C increment" hay là bản cải tiến của C. Nghe có vẻ hơi điên nhỉ :D.

Phép giảm

 Trái ngược với phép tăng là phép giảm (decrement). Phép toán này sẽ bớt đi 1 trong giá trị của biến.

Phép toán gốc sẽ giống thế này.

int soNguoi(4); //Co 4 nguoi dang choi
soNguoi = soNguoi - 1; //Bot di 1 nguoi
//Tu day co 3 nguoi choi

Tôi cá là các bạn sẽ đoán được bản rút gọn rồi. Đúng vậy, để tăng lên 1 thì ta dùng ++, vậy bớt đi 1 sẽ cần đến --.

int soNguoi(4); //Co 4 nguoi dang choi
--soNguoi; //Bot di 1 nguoi
//Tu day co 3 nguoi choi

Dễ hơn ăn kẹo.

Các phép toán rut gọn khác

Thêm hay bớt 1 đôi khi cũng chưa đủ để làm nhiều thứ. Trong C++, tồn tại cách viết rút gọn của tất cả các phép toán cơ bản.

Ví dụ khi muốn giảm 3 lần giá trị 1 số, có 2 cách viết như sau:

double so(456); 
so = so / 3;
//gia tri moi cua so la 456/3 = 152
double so(456); 
so /=  3;
//gia tri moi cua so la 456/3 = 152

Như vậy, các phép toán rút gọn gồm có +=, -=, *=, /=, %=. Các bạn sẽ sớm không thể cưỡng lại việc dùng chúng :D.

1 ví dụ nhỏ cho tất cả

#include <iostream>
using namespace std;

int main()
{
   double so(5.3);
   so += 4.2;        //'so' = 9.5
   so *= 2.0;        //'so' = 19
   so -= 1.0;         //'so' = 18
   so /= 3.0;         //'so' = 6
   return 0;
}

Những phép toán này cho phép tăng giảm lớn hơn 1 đơn vi.

Thêm vào 1 ít toán học !

Bạn muốn thêm ? Đã hiểu, bạn không hài lòng với việc chỉ dùng các phép toán cơ bản. Dường như nó không xứng với cái tên siêu cấp máy tính. Tôi vẫn còn thứ hấp dẫn khác cho bạn xem.

Gói cmath

Để sử dụng các hàm phức tạp hơn trong toán học, bạn cần thêm 1 dòng vào phần đầu chương trình giống như khi bạn muốn thao tác với chuỗi ký tự vậy. Dòng cần thêm vào là :

#include <cmath>

Đến đây vẫn còn khá đơn giản. Trong chữ "cmath" có "math" nghĩa là toàn học, hẳn là đúng đường rồi.

! Tôi sẽ chỉ cho các bạn cách dùng các hàm toán học. Rất có thể các bạn chẳng biết thế nào là hàm trong toán. Không quan trọng, bạn sẽ biết nếu bạn học thêm 1 ít về toán.

Bắt đầu với hàm vô cùng quen thuộc : lấy căn bậc 2 của 1 số. Trong tiếng Anh, hàm này là square root cho nên trong C++, chúng ta có 1 hàm là sqrt (viết tắt của tên hàm trong tiếng Anh).

Để sử dụng 1 hàm, chúng ta viết tên hàm, theo sau đó là dấu ngoặc với thông số cần thao tác ở bên trong. Sau đó, chúng ta dùng phép gán để lưu kết quả vào trong 1 biến.

ketQua = tenHam(thongSo);

Rất giống trong toán khi bạn viết y = f(x). Nói chung, chỉ cần bạn nhớ được tên hàm là được. Với phép toán lấy căn, chúng ta có ketQua = sqrt(thongSo);.

!Đừng bỏ quên dấu ; ở cuối dòng lệnh !

1 ví dụ hoàn chỉnh cho phần này

#include <iostream>
#include <cmath>  //Dung quen dong nay
using namespace std;

int main()
{
    double const so(16); //Chung ta se tinh can bac 2 cua 16, vi no khong thay doi gia tri nen chung ta khai bao voi const
                             
    double ketQua;         //bien de chua ket qua

    ketQua= sqrt(so);  //On effectue le calcul !

    cout << "Can bac 2 cua " << so << " la " << ketQua << endl;

    return 0;
}

Và kết quả của chương trình.

Chắc các bạn sẽ không nghĩ là máy tính tính sai chứ hả.

Sau đây là 1 số hàm khác mà cmath cung cấp cho chúng ta.

Các hàm trong cmath
 Tên hàm  Hàm trong C++  Ví dụ
 Căn bậc 2  sqrt()  ketQua  = sqrt(thongSo);
 sin  sin()  ketQua  = sin(thongSo);
 cosin  cos()  ketQua  = cos(thongSo);
 tan  tan()  ketQua  = tan(thongSo);
 Lũy thừa cơ số e  exp()  ketQua  = exp(thongSo);
 Logarit cơ số e hay ln  log()  ketQua  = log(thongSo);
 Logarit cơ số 10  log10()  ketQua  = log10(thongSo);
 Trị tuyệt đối  fabs()  ketQua  = fabs(thongSo);
 Làm tròn đến phần nguyên dưới  floor()  ketQua  = floor(thongSo);
 Làm tròn đến phần nguyên trên  ceil()  ketQua  = ceil(thongSo);

Trên đây là các hàm trong cmath.

! Các hàm lượng giác như sin, cos, tan thì thông số sử dụng đơn vị là radian.

Vẫn còn rất nhiều hàm khác nhưng tôi chỉ ghi ra những hàm thông dụng để tránh việc các bạn học nhiều quá nên quên.

! Đây là các hàm toán học nên thông số chỉ có thể là các con số hay đúng hơn kiểu dữ liệu phải là kiểu dữ liệu số như int, unsigned int hay double chứ không thể là string hay bool.

 Hàm lũy thừa

Như mọi khi, cái gì cũng có ngoại lệ, trong trường hợp này là hàm lũy thừa. Làm sao để tính 4^5 ?

Sau đây là cách tính dùng hàm trong cmath

double const a(4);
double const b(5);
double const ketQua = pow(a, b);

Tôi khai báo 2 hằng ab để chứa 2 số mang giá trị 4 và 5 như bình thường. Cuối cùng là 1 hằng để chứa kết quả được tính nhờ vào hàm pow(). Ta có thể quay lại với bài tập nho nhỏ lúc nãy nhưng thay phép cộng bằng phép lũy thừa.

#include <iostream>
using namespace std;

int main(){
   double a(0), b(0); //Khai bao 2 so hang a va b

   cout << "Chao mung den voi chuong trinh tinh a^b !" << endl;

   cout << "Moi nhap gia tri cua a : "; 
   cin >> a;

   cout << "Moi nhap gia tri cua b : ";
   cin >> b;

   double const ketQua(pow(a, b)); //Thuc hien phep luy thua

   cout << a << "^" << b << " = " << ketQua << endl; //In ket qua ra man hinh

   return 0;
}

Các bạn cũng có chung kết quả chứ ?

Tôi hy vọng tất cả các bạn sẽ hài lòng với từng này phép toán.

Tóm tắt bài hoc :
  • Để yêu cầu người dùng nhập dữ liệu, sử dụng cin >> tenBien, giá trị được nhập sẽ nằm trong biến tenBien
  • Không nên nhầm lẫn giữa <<>>
  • Trong C++, ta có thể làm tất cả các phép toán cơ bản
  • Các hằng không thể thay đổi giá trị sau khi được tạo ra. Để khai báo hằng, dùng từ khóa const
  • Để tăng giá trị biến lên 1, chúng ta có phép tăng : tenBien++;. Ngược lại, chúng ta cũng có phép giảm
  • Nếu bạn muốn những phép toán phức tạp hơn, hãy thêm gói <cmath> vào đầu chương trình và gọi các hàm trong đó ví dụ như : ketQua = sqrt(100);