Bài 4_Phần 1_Kiểu dữ liệu và hằng, biến. Chương trình con trong C++
1. Một số kiểu dữ liệu cơ bản thường dùng trong C++.
TT |
Kiểu dữ liệu |
Mô tả |
Ghi chú |
---|---|---|---|
1 | int, long | -2147483648 tới 2147483647 | Số nguyên |
2 | unsigned int, long | 0 tới 4,294,967,295 | Số nguyên |
3 | short | -32768 tới 32767 | Số nguyên |
4 | unsigned short | 0 tới 65,535 | Số nguyên |
5 | long long | -9,223,372,036,854,775,808 đến 9,223,372,036,854,775,807 | Số nguyên |
6 | unsigned long long | 0 đến 18,446,744,073,709,551,615 | Số nguyên |
7 | float | Số thực | |
8 | double | Số thực | |
9 | long double | Số thực | |
10 | char | -127 tới 127 | Kí tự |
11 | unsigned char | 0 tới 255 | Kí tự |
12 | string | 255 kí tự, chỉ số từ 0 | Xâu kí tự |
13 | bool | true hoặc false | Logic |
14 | void | Kiểu không có giá trị |
Giải thích phạm vi của kiểu dữ liệu. 1 bit trong lập trình sẽ biểu diễn được 2 giá trị: 0 hoặc 1. Tức là biểu diễn được 21 giá trị. Vậy 2 bits sẽ biểu diễn được 4 giá trị: 00, 01, 10 và 11. Tức là biểu diễn được 22 giá trị. Như vậy, 1 byte = 8 bits sẽ biểu diễn được 28 giá trị khác nhau. Mà máy tính lưu giá trị mã bit 0 và 1. Tức dạng nhị phân. Do đó 00 = 0, 01 = 1, 10 = 2, 11 = 3 trong cơ số 10. Như vậy, giá trị lớn nhất mà 1 byte có thể biểu diễn là 11111111 = 2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 = 255. Đó là lý do kiểu unsigned char có phạm vi giá trị từ 0 đến 255. Còn kiểu char do có cả miền âm nên sẽ bị chia đôi(-128 đến 127). Phần dương bị hụt 1 giá trị do cần biểu diễn cả số 0.
2. Cách khai báo và sử dụng biến hằng, phép gán.
- Phép gán là dấu =
- Hằng (constant) là đại lượng có giá trị không thay đổi trong suốt quá trình thực hiện chương trình. Từ khóa khai báo hằng: const.
- Cú pháp khai báo hằng:
- const kiểu dữ liệu tên_hằng = giá trị;
- Ví dụ: const double PI = 3.14159;
- const int diem_thuong = 5;
- hoặc kiểu dữ liệu const tên_hằng = giá trị;
- Ví dụ: double const PI = 3.14159;
- int const diem_thuong = 5;
- Biến (variable) là đại lượng có giá trị có thể thay đổi trong khi thực hiện chương trình.
- Cú pháp khai báo biến:
- kiểu dữ liệu tên_biến = giá trị;
- kiểu dữ liệu tên_biến;
- hoặc kiểu dữ liệu danh_sách_tên_biến = giá trị;
- kiểu dữ liệu danh_sách_tên_biến;
- Lưu ý: Danh sách tên biến cách nhau bởi dấu phẩy (,); giá trị có thể gán giá trị ban đầu hoặc không gán.
- Ví dụ:
int a = 0, b = 20; // Khai báo 2 biến kiểu số nguyên
float = 20.8;
char c = 'A';
string s = "Thong bao";
hoặc
int a, b; // Khai báo 2 biến kiểu số nguyên
float c;
char c;
string s;
3. Ép kiểu.
- Ép kiểu trong C++ là việc gán giá trị của một biến có kiểu dữ liệu này tới biến khác có kiểu dữ liệu khác.
- Chẳng hạn: Ép từ kiểu nguyên sang kiểu thực.
- Ví dụ khi tính kết quả phép chia 9/4 để có được kết quả phép chia là số thập phân thì phải ép kiểu số bị chia hoặc số chia sang kiểu số thực, chẳng hạn: (float) 9/4 hoặc 9/(float)4.
4. Nhập, xuất dữ liệu.
4.1. Nhập từ bàn phím và xuất ra màn hình.
- Nhập dữ liệu từ bàn phím, lệnh: cin>>
- Ví dụ: cin>>a;
#include <iostream>
#include <iomanip>
using namespace std;
const float pi = 3.14;
int main()
{
float ban_kinh = 0, dien_tich,chu_vi=0;;
string tb_dien_tich = "Dien tich hinh tron la: ";
string tb_chu_vi = "Chu vi hinh tron la: ";
cout << "Nhap ban kinh = ";
cin>>ban_kinh;
dien_tich = pi*ban_kinh*ban_kinh;
chu_vi = 2*pi*ban_kinh;
cout << tb_dien_tich<<dien_tich<<endl;
cout << tb_chu_vi<<chu_vi<<endl;
cout <<setw(30)<<right<<setprecision(5)<<fixed<< tb_dien_tich<<dien_tich<<endl;
cout <<setprecision(5)<<fixed<< tb_chu_vi<<chu_vi<<endl;
return 0;
}
4.2. Đọc, ghi tệp.
- Nhập dữ liệu từ tệp (đọc tệp), xuất dữ liệu ra tệp (xuất tệp, ghi tệp)
- Sử dụng thư viện: #include <fstream>
Kiểu dữ liệu |
Miêu tả |
---|---|
ofstream | Kiểu dữ liệu này biểu diễn Output File Stream và được sử dụng để tạo các file và để ghi thông tin tới các file đó |
ifstream | Kiểu dữ liệu này biểu diễn Input File Stream và được sử dụng để đọc thông tin từ các file |
fstream | Kiểu dữ liệu này nói chung biểu diễn File Stream, và có các khả năng của cả ofstream và ifstream, nghĩa là nó có thể tạo file, ghi thông tin tới file và đọc thông tin từ file |
Chế độ |
Miêu tả |
---|---|
ios::in | Mở một file để đọc |
ios::out | Mở một file để ghi (tạo file mới nếu chưa tồn tại) |
ios::app | Chế độ Append. Tất cả output tới file đó được phụ thêm vào cuối file đó |
ios::ate | Mở một file cho output và di chuyển điều khiển read/write tới cuối của file |
ios::trunc | Nếu file này đã tồn tại, nội dung của nó sẽ được cắt (truncate) trước khi mở file |
- Bước 1: Mở tập tin lên theo chức năng mong muốn (ghi hay đọc)
- Bước 2: Thực hiện các lệnh ghi hoặc đọc
- Bước 3: Đóng tập tin
4.2.1.Cách đọc tệp C++
- B1. Mở tệp đọc
- ifstream inFile(“Data.txt”,ios::in); // Mở tập tin có tên Data.txt, tập tin này nằm trong cùng thư mục tập tin code .cpp
- hoặc ifstream inFile(“D:Data.txt”,ios::in);//Mở tập tin có tên Data.txt trong ổ đĩa D
- hoặc ifstream inFile;
- inFile.open(“Data.txt”,ios::in);
- B2. Việc đọc nội dung tập tin được chia làm 2 cách, bạn có thể đọc từng ký tự, từng byte trong tập tin cho đến hết tập tin. Hoặc bạn có thể đọc từng hàng của tập tin cho đến hết tập tin.
- Sử dụng phương thức >>.
- Việc đọc nội dung tập tin được chia làm 2 cách, bạn có thể đọc từng ký tự, từng byte trong tập tin cho đến hết tập tin. Hoặc bạn có thể đọc từng hàng của tập tin cho đến hết tập tin.
- int songuyen;
- inFile>>songuyen;
- Sử dụng phương thức get(char KT)
- ifstream inFile(“Data.txt”,ios::in);
- char kt;
- inFile.get(kt);// Đọc ký tự từ tập tin và lưu vào biến kt
- cout<<kt;// In dữ liệu đọc được lên màn hình
- Sử dụng phương thức getline(char CH[], int N)
- ifstream inFile(“Data.txt”,ios::in);
- char CHUOI[100];
- inFile.getline(CHUOI,100);//Đọc dữ liệu từ tập tin theo dòng vào chuỗi với độ dài chuỗi là 100 ký tự
- cout<<CHUOI<<endl; //In dữ liệu đọc được lên màn hình
- B3: Đóng tập tin
- inFile.close();
4.2.2.Cách ghi tập tin trong C++
- B1. Mở tệp
- ofstream outFile(“Data.txt”, ios::out);//Mở tập tin để ghi nội dung vào
- B2. Ghi nội dung
- Sử dụng phương thức operator <<
- ofstream outFile(“Data.txt”,ios::out);
- char KT[]=“Trung tam tin hoc Tay Viet”;
- outFile << KT;//Ghi toàn bộ nội dung trong chuỗi KT vào tập tin
- Sử dụng phương thức put(char KT)
- ofstream outFile(“Data.txt”,ios::out);
- char kt;
- get(kt); //Nhập ký tự cần ghi vào tập tin
- outFile.put(kt);
- B3: Đóng tập tin
- outFile.close();
- Hàm eof()
- Cấu trúc hàm: bool eof() const;
- Hàm eof() là hàm kiểm tra đã hết tập tin chưa. Nếu đã hết tập tin thì hàm trả về true ( tương đương với giá trị khác 0), ngược lại nếu chưa hết tập tin thì kết quả sẽ trả về false ( tương đương với giá trị là 0).
- Hàm fail()
- Cấu trúc hàm: bool fail() const;
- Hàm fail() là hàm phát hiện có xảy ra lỗi không trầm trọng trong quá trình đọc tập tin. Nếu phát hiện ra lỗi trong quá trình đọc tập tin thì hàm trả về true ( tương đương với giá trị khác 0), ngược lại nếu không thì kết quả sẽ trả về false ( tương đương với giá trị là 0). Ví dụ trong chương trình, chúng ta đọc tập tin sau khi đã đóng thì sẽ xuất hiện lỗi và hàm này sẽ cho giá trị true
- Hàm bad()
- Cấu trúc hàm: bool bad() const;
- Hàm bad() là hàm phát hiện có xảy ra lỗi trầm trọng trong quá trình ghi tập tin. Nếu phát hiện ra lỗi trong quá trình ghi tập tin thì hàm trả về true ( tương đương với giá trị khác 0), ngược lại nếu không thì kết quả sẽ trả về false ( tương đương với giá trị là 0). Ví dụ trong chương trình, chúng ta ghi nội dung vào tập tin đã đóng thì sẽ xuất hiện lỗi và hàm này sẽ cho giá trị true.
- Hàm good()
- Cấu trúc hàm: bool good() const;
- Hàm good() là hàm kiểm tra hoàn thiện việc ghi và đọc tập tin. Hàm trả về true ( tương đương với giá trị khác 0) khi tất cả các hàm eof(), fail() và bad() đều trả về giá trị 0, ngược lại chỉ cần 1 trong các hàm eof(), fail() và bad() trả về 1 thì kết quả của hàm good sẽ trả về false ( tương đương với giá trị là 0).
- Con trỏ trong tập tin
- Trong quá trình đọc và ghi File trong lập trình C++ thì chúng ta cần phải biết con trỏ tập tin hiện đang ở vị trí nào, điều này sẽ giúp ta rất nhiều trong việc tương tác với tập tin. Chẳng hạn bạn muốn thêm, thay đổi hoặc xóa một nội dung nào đó thì chúng ta cần phải biết chính xác vị trí cần thao tác để tránh việc làm sai dữ liệu.
- a. Hàm trong class ifstream
- a.1 Hàm tellg()
- Hàm này được sử dụng để tìm vị trí hiện tại của con trỏ tập tin. Vị trí hiện tại của con trỏ trong tập tin chính là tổng số byte tính từ đầu tập tin đến vị trị của con trỏ.
- a.2 Hàm seekg()
- Hàm seekg() là hàm được sử dụng để dịch chuyên con trỏ đến vị trí nào đó. Việc di chuyển con trỏ trong tập tin cần phải có vị trí làm mốc, vị trí này có thể là đầu tập tin, cuối tập tin hoặc là vị trí hiện tại của con trỏ, điều này phụ thuộc vào tham số trong hàm. Hàm seekg có 2 cú pháp như sau:
- Cú pháp 1: seekg(<số byte cần dịch chuyển>);
- Với cú pháp 1 này thực hiện chức năng dịch chuyển con trỏ sang phải với số byte đúng bằng giá trị truyền vào. Mốc dịch chuyển là vị trí đầu của tập tin.
- Cú pháp 2: seekg(<số byte cần dịch chuyển>,<mốc dịch chuyển>);
- Mốc dịch chuyển là 1 trong các tham số sau:
- ios::beg : Mốc là vị trí đầu tập tin
- ios::cur : Mốc là vị trí hiện tại của con trỏ
- ios::end : Mốc là vị trí cuối của tập tin
- Hàm trong class ofstream
- b.1 Hàm tellp()
- Tương tự như Hàm này được sử dụng để tìm vị trí hiện tại của con trỏ tập tin. Vị trí hiện tại của con trỏ trong tập tin chính là tổng số byte tính từ đầu tập tin đến vị trị của con trỏ.
- b.2 Hàm seekp()
- Cũng giống như hàm seekg(), hàm seekp() cũng được sử dụng để dịch chuyên con trỏ đến vị trí nào đó trong tập tin. Và trong trường hợp này cũng sử dụng 2 cú pháp như trên
- Cú pháp 1: seekp(<số byte cần dịch chuyển>);
- Với cú pháp 1 này thực hiện chức năng dịch chuyển con trỏ sang phải với số byte đúng bằng giá trị truyền vào. Mốc dịch chuyển là vị trí đầu của tập tin.
- Cú pháp 2: seekp(<số byte cần dịch chuyển>,<mốc dịch chuyển>);
- Mốc dịch chuyển là 1 trong các tham số sau:
- ios::beg : Mốc là vị trí đầu tập tin
- ios::cur : Mốc là vị trí hiện tại của con trỏ
- ios::end : Mốc là vị trí cuối của tập tin
- Ví dụ hoàn chỉnh:
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
ofstream outFile("Data.txt",ios::out);
if(!outFile)
{
cout<<"Khong mo duoc tap tin";
}
else
{
string Ten;
int age;
cout<<"Nhap vao ten cua ban: ";
getline(cin,Ten);
outFile<<Ten<<endl;
cout<<"Nhap vao age ban: ";
cin>>age;
outFile<<age;
cout<<"Da ghi tap tin thanh cong"<<endl;
outFile.close();
}
ifstream inFile("Data.txt",ios::in);
if(!inFile)
{
cout<<"Khong mo duoc tap tin"<<endl;
}
else
{
cout<<"Noi dung doc duoc la:";
string Ten;
int age;
getline(inFile,Ten);
inFile>>age;
cout<<"Ten cua ban: "<<Ten<<endl;
cout<<"age ban: "<<age;
inFile.close();
}
}
5. Chương trình con-Hàm.
Chương trình con-Hàm là một nhóm lệnh, yêu cầu chương trình phải hoàn thành một công việc nào đó gồm hai loại:
- Hàm có kiểu trả lại (trả blại dữ liệu thuộc kiểu dữ liệu của hàm)
- Hàm không có kiểu trả lại (còn gọi là hàm trả lại kiểu void)
- Định nghĩa hàm:
kiểu_dữ_liệu_trả_lại Tên_hàm(các_tham_số_của_hàm)
{
nội_dung_của_hàm;
return kiểu_dữ_liệu_trả_lại; //nếu Hàm không có kiểu trả lại thì không có lệnh này
}
- Ví dụ Hàm có kiểu trả lại. Ví dụ tính tổng hai nguyên int số a và b. Kiểu trả lại là int
int Tong(int a, int b)
{
int S = 0;
S = a+b;
return S;
}
- Ví dụ Hàm không có kiểu trả lại. Ví dụ xuất tổng hai nguyên số a và b ra màn hình. Kiểu trả lại là void
void Xuat(int a, int b)
{
int T = Tong(a,b);
cout<<"Tong cua hai so nguyen "<<a<<" va "<<b<<" la: "<<T;
}
- Chương trình hoàn chỉnh:
#include <iostream>
using namespace std;
int Tong(int a, int b)
{
int S = 0;
S = a+b;
}
void Xuat(int a, int b)
{
int T = Tong(a,b);
cout<<"Tong cua hai so nguyen "<<a<<" va "<<b<<" la: "<<T;
}
int main()
{
Xuat(8, 9);
return 0;
}
Kết quả:
Không có quyền nào được bảo lưu - Phạm vi công cộng