Bài 4. Biến, kiểu dữ liệu và ép kiểu trong C++.
Chào mừng các bạn đã quay trở lại với TUT hướng dẫn lập trình C++ cơ bản. Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu một khái niệm hoàn toàn mới. Không mất thời gian nữa, bắt đầu ngày nào.
4.1. Đặt vấn đề.
Chúng ta sẽ quay trở lại quá khứ một chút. Các bạn còn nhớ phương trình bậc nhất không ạ. Dạng tổng quát là……..đúng rồi : ax+b = 0. Bây giờ bài tập là giải phương trình bậc nhất sau: 5x – 30 = 0. Các bạn sẽ làm gì, tất nhiên là chuyển vế đổi dấu rồi chia phải không. Chúng ta cùng viết chương trình để giải bài toán này nhé.
#include <iostream> using namespace std; int main() { cout << "5x - 30 = 0" << endl; cout << "x = " << 30 / 5; }
Biên dịch và chạy chương trình. Kết quả (hình):
Bài tập đã được hoàn thành. Nhưng các bạn hãy thử nghĩ xem nếu chúng ta lại có một phương trình khác, hệ số a và b thay đổi khi đó chúng ta sẽ lại phải viết lại chương trình sau đó biên dịch và chạy để nhận được kết quả. Đó không phải việc nên làm. Là một lập trình viên các bạn phải đảm bảo chương trình sau khi viết ra phải có tính tổng quát, nghĩa là chương trình đó phải giải được một bài toán nào đó với nhiều dữ liệu đầu vào khác nhau mà không phải thay đổi bất kỳ bất kì 1 dòng lệnh nào trong chương trình. Rất may mắn, để khắc phục C++ đã cho ra đời biến, chúng ta sẽ cùng tìm hiểu về biến ngay bây giờ.
4.2.Biến trong C++.
4.2.1. Định nghĩa biến.
Xét chương trình sau. Các bạn code theo mình nhé:
#include <iostream> using namespace std; int main() { int bien1 = 5; int bien2 = 30; cout << "bien2 / bien1 = " << bien2/bien1; }
- Ở dòng 6, mình đã khai báo một biến có tên là “bien1” đồng thời gán giá trị bằng 5. Tương tự với dòng 7, khai báo “bien2” gán giá trị bằng 30.
- Dòng 7 là câu lệnh in ra màn hình kết quả của phép chia “bien2” và “bien1”.
Chạy chương trình kết quả. (hình):
Đến đây có lẽ các bạn vẫn chưa hiểu biến là gì đúng không. Nói dễ hiểu thôi này. Biến là một ô nhớ đơn lẻ hoặc một vùng nhớ được hệ điều hành cấp phát cho chương trình C++. Biến có tác dụng lưu trữ dữ liệu. Như ở chương trình chúng ta vừa xét “bien1” đang lưu giá trị là 5 còn “bien2” là 30. Biến có thể lưu được số, kí tự hay thậm chí là chuỗi kí tự
4.2.2. Khai báo biến trong C++.
Công thức chung:
Kiểu dữ liệu tên biến;
Ví dụ:
int bien1; float bien2 = 9.6; double bien4 = 6.996; char bien3 = 65; bool bien5;
Chúng ta có hai cách khai báo biến
- Chỉ khai báo tên biến mà không gán giá trị cho biến (dòng 1 và dòng 5).
- Khai báo biến kèm theo giá trị cho biến bằng toán tử gán “=” (dòng 2, 3, 4).
Nếu bạn cần khai nhiều biến có cùng kiểu dữ liệu chúng ta có cách sau:
int bien1, bien2 = 5, bien3;
Các bạn đang thắc mắc kiểu dữ liệu là gì mà sao thấy mình nhắc tới nhiều quá đúng không, phần này mình sẽ nói sau nhé.
4.2.3. Sử dụng biến.
Biến có nhiệm vụ chủ yếu là lưu trữ dữ liệu. Khi chúng ta khai báo biến các bạn có thể gán giá trị trực tiếp cho biến hoặc không gán giá trị cho biến. Dữ liệu trong biến có thể thay đổi trong quá trình chạy chương trình. Xét ví dụ sau:
#include <iostream> using namespace std; int main() { int bien1 = 5; cout<< "bien1 = "<< bien1 <<; endl; bien1 = 3; cout<< "bien1 = "<< bien1; }
- dòng 5, 6: Mình khai báo biến mang giá trị là 5 và hiển thị giá trị của biến lên màn hình.
- dòng 7: Mình đã thay đổi lại giá trị của “bien1”, lúc này “bien1” mang giá trị bằng 3.
- dòng 8: Đơn giản là in giá trị của “bien1” ra màn hình.
Kết quả này:
Bây giờ chúng ta sẽ cùng nhau tìm hiểu về kiểu dữ liệu.
4.3. Kiểu dữ liệu
Trong C++ chúng ta có khá nhiều kiểu dữ liệu nhưng quan trọng và hay dùng nhất chúng ta có:
4.3.1. Kiểu dữ liệu số nguyên: int
Đây là một kiểu dữ liệu chúng ta thường gặp nhất. Các bạn học toán chắc cũng không lạ lầm gì với số nguyên rồi đúng không. Nhưng ở đây mình sẽ nói hai điều thú vị sau:
- Thứ nhất, các bạn đừng bao giờ gán giá trị theo kiểu “râu ông nọ cắm cằm bà kia” như thế này nhé:
#include <iostream> using namespace std; int main() { int x = 3.2; cout<< x; }
Kết quả của việc làm trên: (hình)
Biến x sẽ chỉ nhận giá trị là số nguyên vì kiểu dữ liệu của biến x khi khai báo là int. Vậy nên các bạn hãy chú ý cẩn thận để không nhầm lẫn. Mà không chỉ riêng kiểu số nguyên đâu các kiểu khác cũng vậy nhé.
- Thứ hai: Khi làm việc với dữ liệu ở kiểu số chúng ta vẫn sẽ có những phép tính như khi các bạn học toán ở trên lớp vậy. Trong C++ phép chia được chia làm 2 loại đó là chia lấy phần nguyên “/” và chia lấy phần dư “%”, đặc biệt hơn nữa phép chia lấy phần dư chỉ được áp dụng cho kiểu số nguyên int. Các bạn xem code sau của mình:
#include <iostream> using namespace std; int main() { int x = 11; int y = 3; cout<< "x/y = "<<x/y<<endl; cout<< "x%y = "<<x%y; }
- Dòng 5, 6: Mình khai báo 2 biến mang giá trị lần lượt là 11 và 3.
- Dòng 7, 8: Hiển thị kết quả của phép chia lấy phần nguyên và phép chia lấy phần dư.
Kết quả sau khi chạy chương trình: (hình)
Đến đâu lại có câu hỏi, vậy thì làm thế nào để nhận được kết quả chính xác của phép chia 2 số nguyên. Đừng lo lắng mình sẽ nói ở phần sau nhé.
4.3.2. Kiểu số thực: float và double.
Với C++ chúng ta có 2 kiểu số thực là float và double. Điểm khác nhau thì các bạn cũng đã thấy ở hình phía trên. Kiểu dữ liệu double có tới tận 15 chữ số sau dấu chấm nên chắc chắn nó sẽ mang độ chính xác cao hơn kiểu float nhưng lại tốn tới tận 8 byte lưu trữ trong khi đó float chỉ là 4 byte. Việc nên dùng kiểu dữ liệu nào là tuỳ thuộc vào chương trình của các bạn.
4.3.3. Kiểu kí tự: char
Kiểu kí tự gồm các chữ cái, số và một vài kí tự đặc biệt. Bạn đang thắc mắc tại sao trong hình phía trên dãy giá trị của char lại là số nguyên phải không. Mình sẽ cho các bạn thấy. Code theo mình nè:
#include <iostream> using namespace std; int main() { char bien1 = 65; char bien2 = 97; char bien3 = 41; cout<<bien1<<endl; cout<<bien2<<endl; cout<<bien3<<endl; }
- Dòng 5, 6, 7: Mình khai báo ba biến mang các giá trị lần lượt là 65, 97, 41. Các giá trị đều nằm trong dãy giá trị của kiểu dữ liệu char.
- Dòng 8, 9, 10: Mình in ra màn hình giá trị của các biến. Mỗi giá trị được in ra trên 1 dòng nhờ toán tử endl.
Kết quả sau khi chạy chương trình: (hình)
Các bạn thấy không ạ. Với giá trị 65 của “bien1”, chúng ta in được chữ “A”, lần lượt với các biến còn lại dữ liệu được in lên màn hình. Hẳn là các bạn đang lo lắng làm sao để nhớ hết các giá trị của từng kí tự đúng không, đừng làm thế nhé. Chúng ta có thể gán trực tiếp kí tự cho biến kiểu char:
#include <iostream> using namespace std; int main() { char bien1 = 'A'; char bien2 = 'a'; char bien3 = ')'; cout<<bien1<<endl; cout<<bien2<<endl; cout<<bien3<<endl; }
Một cách viết “Hello World” theo kiểu phức tạp hoá vấn đề 😀
#include <iostream> using namespace std; int main() { char bien1 = 'H',bien2 = 'e',bien3 = 'l', bien4 = 'l', bien5 = 'o', bien6 = ' ', bien7 = 'W', bien8 = 'r',bien9 = 'd'; cout <<bien1<<bien2<<bien3<<bien4<<bien5<<bien6<<bien7<<bien5<<bien8<<bien4<<bien9; }
Vui thôi. Đừng làm cách này nhé. 😀
4.3.4. Kiểu logic: bool
Đây là kiểu dữ liệu đơn giản nhất vì dãy giá trị chỉ có “True” và “False”. Các bạn đừng coi thường nó nhé, sau này làm bài tập chúng ta sẽ sử dụng rất nhiều đó.
Đó là những kiểu dữ liệu cơ bản mà chúng ta hay “đụng độ nhất” các bạn cũng không cần nhớ chính xác dãy giá trị của chúng đâu. Ước lượng sao cho phù hợp để khai báo biến là được.
4.4. Ép kiểu dữ liệu.
Làm sao để nhận được kết quả chính xác khi chia 2 số nguyên nhỉ??? Câu hỏi sẽ có lời giải đáp ở phần này.
Để nhận được kết quả chính xác, chúng ta sẽ thực hiện ép kiểu dữ liệu.
Cú pháp:
(kiểu dữ liệu) biểuthức;
(kiểu dữ liệu) biến;
Ví dụ:
#include <iostream>; using namespace std; int main() { int bien1 = 11; int bien2 = 3; cout<<"bien1 / bien2 = "<<(float) bien1/bien2; }
Chạy chương trình đi các bạn. Kết quả như ý lun: (hình)
Các bạn hãy thử ép kiểu char về kiểu int. Mình làm thử nhé:
#include <iostream> using namespace std; int main() { char bien1 = 'A'; cout<<(int) bien1; }
OK! vậy là mình đã nói hết những gì có trong bài học. Hẹn gặp lại các bạn ở những bài tiếp theo. Good bye! See you again.