DATAONLINE.IO.VN

https://dataonline.io.vn

Tài liệu C++ và CodeBlocks V2

Điều chỉnh và bổ sung tài liệu của năm học 2020-2021 (V1)
Tài liệu C++ và CodeBlocks gồm tài liệu C++ căn bản, hướng dẫn cài và sử dụng CodeBlocks để thực hành C++. Dành cho học sinh THCS thay thế ngôn ngữ lập trình Pascal.
Tài liệu luôn được cập nhật, điều chỉnh và bổ sung phù hợp với những thay đổi của môi trường lập trình C++ CodeBlocks.
Là tài liệu cơ bản dành cho học sinh THCS
 

Tài liệu C++ và CodeBlocks V2

I. Hướng dẫn cài và sử dụng CodeBlocks để thực hành c++. 
Click vào đây để xem
II. Tài liệu C ++
1. Chủ đề 1. Làm quen với C++.
1.1. Các phép toán số học và một số hàm toán học.
1.2. Xuất dữ liệu mặc định và căn lề  ra màn hình.
1.2.1. Xuất mặc định.
1.2.2. Xuất căn lề.
1.2.3. Số chữ số thập phân.
1.2.4. Chương trình con-Hàm.
2. Chủ đề 2. Kiểu dữ liệu và hằng, biến.
2.1. Một số kiểu dữ liệu cơ bản thường dùng trong C++
2.2. Cách khai báo và sử dụng biến hằng, phép gán.
2.3. Nhập dữ liệu từ bàn phím, từ tệp (đọc tệp) , xuất tệp (ghi tệp).
2.4. Củng cố và luyện tập lại các phép toán số học. 
3. Chủ đề 3. Phép so sánh, phép toán logic và câu lệnh điều kiện, lệnh lặp.
3.1. Các phép so sánh và phép toán logic trong C++
3.2. Câu lệnh điều kiện if, switch case ...
3.3. Câu lệnh lặp for, while, do - while.
4. Chủ đề 4. Mảng một chiều (số nguyên, số thực).
4.1. Nhập, xuất mảng.
4.2. Sắp xếp tăng giảm (tự code sắp xếp, sử dụng hàm có sẵn - ưu tiên sử dụng hàm sort có sẵn).
4.3. Kiểm tra xem giá trị X có xuất hiện trong mảng hay không? Xuất hiện bao nhiêu lần và các vị trí xuất hiện (nếu có)?
4.4. Chèn thêm phần tử X vào mảng (tại vị trí nào đó hoặc mảng đã sắp xếp sao cho vẫn đảm bảo thứ tự sắp xếp).
4.5. Xóa phần tử của mảng (tại vị trí nào đó, xóa các phần tử trùng lặp - sau khi xóa, mỗi phần tử trong mảng là duy nhất).
4.6. Kiểm tra xem có phải là mảng đối xứng không?
4.7. Tìm ƯCLN của mọi phần tử trong mảng.
4.8. Tìm BCNN của mọi phần tử trong mảng.
5. Chủ đề 5. Xâu kí tự.
5.1. Nhập, xuất xâu.
5.2. Các thao tác cơ bản với xâu.
5.3. Chuyển đổi số kiểu số sang xâu và ngược lại.
5.4. Kiểm tra xem một kí tự trong xâu có phài là chữ số hay không?
5.5. Chuyển đổi chữ HOA - chữ thường.
5.6. Chuẩn hóa xâu.
5.6.1. Xóa kí tự dấu cách thừa trong xâu.
5.6.2. Chuẩn hóa danh từ riêng.
5.6.3. Sắp xếp các kí tự trong xâu tăng/giảm bằng hàm sort 
6. Vector.

NỘI DUNG TÀI LIỆU CHI TIẾT.

II. Tài liệu C ++
1. Chủ đề 1. Làm quen với C++.

Mục tiêu:
- Các phép toán với dữ liệu kiểu số cơ bản (Toán tử số học): Cộng, trừ, nhân, chia, chia lấy phần dư, chia lấy phần nguyên.
- Xuất ra kết quả gồm mặc định và có định dạng (số nguyên, số thực).
Kiến thức:
1.1. Các phép toán số học và một số hàm toán học trong C++ (Toán tử số học)
* Các phép toán số học.

TTPhép toánKí hiệVí dụKết quả
1Cộng+9+413
2Trừ-9-45
3Nhân*9*436
4Chia/9/42
9.0/42.25
9/4.02.25
5Chia lấy phần dư%9%41
6Tăng 1 đơn vị++a++Giống a=a+1
7Giảm 1 đpn vị--a--Giống a=a-1

* Một số hàm toán học

TTTên hàmÝ nghĩaThư viên
1max(a,b)Trả về giá trị lớn nhất trong hai số a, b 
2min(a,b)Trả về giá trị nhỏ nhất trong hai số a, b 
3pow(x,y)Trả về x mũ y.#include <math.h>
4sqrt(x)Trả về căn bậc 2 của x.#include <math.h>
5cbrt(x)Trả về căn bậc 3 của x.#include <math.h>
6abs(x) trị tuyệt đối của số nguyên x#include <math.h>
7fabs(x)trị tuyệt đối của số thực x#include <math.h>
8hypot(x,y)Trả về độ dài cạnh huyền của tam giác vông có 2 cạnh góc vuông là x và y.#include <math.h>
9 __gcd(a,b)Trả về UCLN của hai số a và b#include <algorithm>
10   


1.2. Xuất dữ liệu mặc định và căn lề ra màn hình.
1.2.1. Xuất mặc định.
cout<<Dữ liệu xuất;
cout<<Dữ liệu xuất<<endl;
Ví dụ 1:

#include <iostream>using namespace std;int main(){    cout << "9+4 = "<<9+4 << endl;    cout << "9-4 = "<<9-4 << endl;    cout << "9*4 = "<<9*4 << endl;    cout << "9/4 = "<<9.0/4 << endl;    cout << "9%4 = "<<9%4 << endl;    cout << "9/4 = "<<9/4 << endl;    return 0;}


Kết quả:

1.2.2. Xuất căn lề.
cout<<setw(n)<<căn lề <<dữ liệu xuất;
Ghi chú:
n>=0 là đô rộng danh cho dữ liệu xuất gí trị nguyên.
căn lề: Trái hoặc phải có giá trị left hoặc right
1.2.3. Số chữ số thập phân.
cout <<setprecision(n)<< fixed<<dữ liệu số thực;
n>=0: là số chữ số phần thập phân được xuất ra.
fixed: là in số thập phân làm tròn đến n.

#include <iostream>#include <iomanip>using namespace std;int main(){    cout <<setw(10)<<left<< "9+4 = "<<9+4 << endl;    cout <<setw(10)<<right<< "9-4 = "<<9-4 << endl;    cout <<setw(10)<<left<< "9*4 = "<<9*4 << endl;    cout <<setw(10)<<right<< "9/4 = "<<9/4 << endl;    cout <<setw(10)<<left<< "9/4 = "<<9.0/4 << endl;    cout <<setw(10)<<left<<setprecision(5)<< fixed<< "9/4 = "<<9.0/4 << endl;    cout <<setprecision(1)<< fixed<< "9/4 = "<<9.0/4 << endl;    cout <<setw(10)<<right<< "9%4 = "<<9%4 << endl;    return 0;}


Kết quả:

Giải thích: #include <iostream> để dùng hàm xuất nhập cout và cin
using namespace std; Nếu không khai báo thì phải viết các lệnh như: std::cout << "9+4 = "<<9+4 << std::endl;
#include <iomanip> setw(n), ::setfill(ch), left, setprecision(n)
1.2.4. 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_của_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ả

2. Chủ đề 2. Kiểu dữ liệu và hằng, biến.
2.1. Một số kiểu dữ liệu cơ bản thường dùng trong C++

TTKiểu dữ liệuMô tảGhi chú
1int, long-2147483648 tới 2147483647Số nguyên
unsigned int, long0 tới 4,294,967,295Số nguyên
2float Số thực
3char-127 tới 127Kí tự
unsigned char0 tới 255Kí tự
4string255 kí tự, chỉ số từ 0Xâu kí tự, #include <string>
5booltrue hoặc falseLogic
6long long-9,223,372,036,854,775,808 đến 9,223,372,036,854,775,807Số nguyên
unsigned long long0 đến 18,446,744,073,709,551,615Số nguyên
7short-32768 tới 32767Số nguyên
unsigned short0 tới 65,535Số nguyên
8double  Số thực
long double Số thực
9void   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 2^1 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 2^2 giá trị.
Như vậy, 1 byte = 8 bits sẽ biểu diễn được 2^8 giá trị khác nhau.

Số lượng giá trị mà n bit có thể biểu diễn được là 2^n
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.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: 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: 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;
2.3. Nhập dữ liệu từ bàn phím, từ tệp (đọc tệp) , xuất tệp (ghi tệp).
* 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;}



 
* 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ệuMiêu tả
ofstreamKiể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 đó
ifstreamKiể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
fstreamKiể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::app  Chế độ Append. Tất cả output tới file đó được phụ thêm vào cuối file đó
ios::ateMở một file cho output và di chuyển điều khiển read/write tới cuối của file
ios::inMở một file để đọc
ios::outMở một file để ghi (tạo file mới nếu chưa tồn tại)
ios::truncNế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
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();
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
        b. 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>#include<cstring>#include<stdio.h>#include<conio.h>using namespace std;int main(){    ofstream outFile("Data.txt",ios::out);    if(!outFile)        cout<<"Khong mo duoc tap tin";    else    {        char CH[100];        int tuoi;        cout<<"Nhap vao ten cua ban: ";        gets(CH);        outFile<<CH<<endl;        cout<<"Nhap vao tuoi ban: ";        cin>>tuoi;        outFile<<tuoi;        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:";        char Ten[100],age;        inFile.getline(Ten,100);        inFile.get(age);        cout<<"Ten cua ban: "<<Ten<<endl;        cout<<"Tuoi ban: "<<age;        inFile.close();    }}


2.4. Củng cố và luyện tập lại các phép toán số học.
Câu 1. Cho số nguyên N trong tệp Cau1.INP. Xuất ra màn hình kết quả của N*N

INPUTOUTPUT
636
864
#include <iostream>#include <fstream>using namespace std;int main(){    ifstream  fin;    fin.open("BAI1.INP",ios::in);    int N;    if(fin.fail())    {        cout<<"Loi mo tep";    }    else    {        fin>>N;        cout<<"N*N = "<<N*N;    }    fin.close();    return 0;}


Câu 2. Cho hai số nguyên a và b trong tệp Cau2.INP, mỗi số một dòng. Xuất ra màn hình kết quả tích a và b ra màn hình

INPUTOUTPUT
6
9		54
#include <iostream>#include <fstream>using namespace std;int main(){    int a,b;    ifstream docvao;    docvao.open("Cau2.INP",ios::in);    if(docvao.fail())    {        cout<<" loi tep ";    }    else    {        docvao>>a;        docvao>>b;        int tich= a*b;        cout<<tich;    }    docvao.close();    return 0;}


Câu 3. Cho hai số nguyên a và b trong tệp Cau3.INP, mỗi số một dòng. Ghi kết quả tính tổng và tích a và b ra tệp Cau3.OUT, mỗi kết quả ghi một dòng.

Cau3.INPCau3.OUT
6
9		15
54
#include <iostream>#include <fstream>using namespace std;int main(){    ifstream fin;    ofstream fout;    fin.open("Cau3.INP",ios::in);    fout.open("Cau3.OUT",ios::out);    if(fin.fail())    {        fout<<"Khong mo duoc tep";    }    else    {        int a, b, Tong = 0, Tich = 0;        fin>>a;        fin>>b;        Tong=a+b;        Tich=a*b;        fout<<Tong<<endl;        fout<<Tich;    }    fin.close();    fout.close();    return 0;}


3. Chủ đề 3. Phép so sánh, phép toán logic và câu lệnh điều kiện, lệnh lặp.
3.1. Các phép so sánh và phép toán logic trong C++
 - Các phép so sánh (toán tử quan hệ), phép logic (toán tử logic).
- Câu lệnh điều kiện, lặp.
Các phép so sánh (toán tử quan hệ)
Ví dụ: int a = 10, int b= 20;

Phép so sánhKí hiệu
(toán tử so sánh)		Ví dụ Kết qủa
Bằng==a==bfalse
Khác!=a!=true
Lớn hơn>a>bfalse
Nhỏ hơn<a<btrue
Lớn hơn hoặc bằng>=a>=false
Nhỏ hơn hoặc bằng<=a<=btrue

Phép logic (toán tử logic)
Ví dụ: A = true; B = false

Phép LogicKí kiệu
(toán tử logic)		Ví dụKết quả
AND (Và)&&A&&Bfalse
OR (Hoặc)||A||Btrue
NOT (Phủ định)!!Afalse
!Btrue

Ví dụ:

#include <iostream>using namespace std;int main(){    int a=0;    int b=0;    cout<<"Nhap a = ";    cin>>a;    cout<<"Nhap b = ";    cin>>b;    if((a>0)&&(b>0))    {        cout<<"a va b deu lon hon 0"<<endl;    }    if((a>0)||(b>0))    {        cout<<"a hoac b lon hon 0"<<endl;    }    if(!(a>0))    {        cout<<"Xuat ra man hinh khi a nho hon 0"<<endl;    }    return 0;}


3.2. Câu lệnh điều kiện if, switch case ...
a) Câu lệnh điều kiện if
Dạng thiếu:
if (điều kiện)
{
    nội dung khi đk đúng;
}
Ví dụ:

#include <iostream>using namespace std;int main(){    int a=0, b=0, S=0;    cout << "a = ";    cin>>a;    cout << "b = ";    cin>>b;    if(a>b)    {        cout<<"So a lon hon so b";    }    return 0;}


Dạng đủ:
if (điều kiện)
{
    nội dung khi đk đúng;
}
else
{
   nội dung khi đk sai;
}
Ví dụ:

#include <iostream>using namespace std;int main(){    int a=0, b=0, S=0;    cout << "a = ";    cin>>a;    cout << "b = ";    cin>>b;    if(a>b)    {        cout<<"So a lon hon so b";    }    else    {        cout<<"So a nho hon so b";    }    return 0;}


b) Câu lệnh điều kiện switch ... case
switch (biến hoặc biểu thức kiểm tra)
    {
        case giá trị 1:
             Lệnh thứ 1;
            break;
        case giá trị 2:
            Lệnh thứ 2;
            break;
       case giá trị 3:
             Lệnh thứ 3;
            break;
         case giá trị thứ n:
            Lệnh thứ n;
           break;
        default:
            Lệnh thực hiện khi  các lựa chọn trên đều sai; //phần default là không bắt buộc
    }
Ví dụ:

#include <iostream>using namespace std;int main(){    char dau;    int a=0, b=0, S=0;    cout << "a = ";    cin>>a;    cout << "b = ";    cin>>b;    cout<<"Nhap dau phep toan la: ";    cin>>dau;    switch (dau)    {    case '+':        S= a + b;        break;    case '-':        S=  a - b;        break;    case '*':        S=  a * b;        break;    case '/':        if (b == 0)        {            cout << "Phep chia cho 0!";        }        if (b != 0)        {            S=  a / b;        }    default:        cout << "Phep tinh khong hop le!";    }    cout<<"Ket qua phep tinh la: "<<S;    return 0;}


c) Câu lệnh điều kiện thay thế cặp if ..else
c = (a>b? giá trị khi đúng : giá trị khi sai);
Ví dụ:

#include <iostream>using namespace std;int main(){    int a=0, b=0, S=0;    cout << "a = ";    cin>>a;    cout << "b = ";    cin>>b;    S=(a>b?a-b:a+b);    cout<<S<<endl;    return 0;}


thay thê cặp lệnh if ...else sau:

#include <iostream>using namespace std;int main(){    int a=0, b=0, S=0;    cout << "a = ";    cin>>a;    cout << "b = ";    cin>>b;    if(a>b)    {        S=a-b;    }    else    {        S=a+b;    }    cout<<S<<endl;    return 0;}

 
Câu 1. Cho số nguyên N trong tệp Cau1.INP. Xuất ra màn hình kết quả kiểm tra xem N là số chẵn hay số ra màn hình

INPUTOUTPUT
66 la so chan
77 la s
#include <iostream>#include <fstream>using namespace std;int main(){    ifstream  fin;    fin.open("BAI1.INP",ios::in);    int N;    if(fin.fail())    {        cout<<"Loi mo tep";        fin.close();    }    else    {        fin>>N;        fin.close();    }    if(N%2==0)    {        cout<<N<<" la so chan";    }    else    {        cout<<N<<" la so le";    }    return 0;}


3.3. Câu lệnh lặp for, while, do - while.
a) Câu lệnh for
for (bien=giá trị; dieu_kien; tang_giam) 
 { 
   cac_lenh; 
 }
Ví dụ xuất ra màn hình các số từ 1 đến 15

#include <iostream>using namespace std;int main(){    int a=0;    for(a = 1; a <= 15; a++)    {        cout << "Gia tri cua a la: " << a << endl;    }    return 0;}


b) Câu lệnh lặp while
while(dieu_kien) 
 { 
   cac_lenh; 
 }
Ví dụ xuất ra màn hình các số từ 1 đến 15

#include <iostream>using namespace std;int main(){    int a=0;    while(a < 15)    {        a++;        cout << "Gia tri cua a la: " << a << endl;    }    return 0;}


c) Câu lệnh lặp do while
- Câu lệnh này được thực hiện ít nhất 01 lần
do
    {
        cac_lenh;
    }
    while(dieu_kien);
Ví dụ xuất ra màn hình các số từ 1 đến 15

#include <iostream>using namespace std;int main(){    int a=0;    do    {        a++;        cout << "Gia tri cua a la: " << a << endl;    }    while(a<15);}


4. Chủ đề 4. Mảng một chiều (số nguyên, số thực).
Mảng là:
Một kiểu dữ liệu có cấu trúc do người lập trình định nghĩa.
Biểu diễn một dãy các biến có cùng kiểu. Ví dụ: dãy các số nguyên, dãy số thực, dãy các ký tự…
Kích thước được xác định ngay khi khai báo và không bao giờ thay đổi (mảng tĩnh).
Mục tiêu:
- Cách khai báo và sử dụng mảng, chèn thêm, xóa phần tử ở vị trí xác định, tìm kiếm trong mảng ...
Kiến thức:
- Cú pháp khai báo mảng: kiểu dữ liệu tên biến mảng[số phần tử];
Một mảng liên tục có chỉ số từ 0 đến <tổng số phần tử> - 1.
Bộ nhớ sử dụng = <tổng số phần tử> * sizeof(<kiểu cơ sở>).
4.1. Khai báo, nhập, xuất mảng.
Cách 1: Khởi tạo giá trị cho mọi phần tử của mảng:

int array1[4];int array2[4] = { 5, 8, 2, 7 };

Cách 2: Khởi tạo giá trị cho một số phần tử đầu mảng:

int array1[4] = { 5, 8 };

Cách 3: Khởi tạo giá trị 0 cho mọi phần tử của mảng

int array1[4] = { };

Cách 4: Tự động xác định số lượng phần tử

int array1[] = { 5, 8, 2, 7 };

Cách 5: Sử dụng khởi tạo đồng nhất trong C++11.

int array1[4] { 5, 8, 2, 7 }; // 5 8 2 7int array2[4] { 5, 8 }; // 5 8 0 0int array3[4] { }; // 0 0 0 0int array4[] { 5, 8, 2, 7 }; // 5 8 2 7

Nhập (gán) dữ liệu cho mảng 1 chiều
tên biến mảng[chỉ số] = giá trị;
Truy cập phần tử mảng 1 chiều
tên biến mảng[chỉ số];
Ví dụ về khai báo, nhập, xuất giá trị cho phần tử có trong mảng.

#include <iostream>using namespace std;const int sopt=200;int main(){    int a[sopt];    int n=0, i=0;    n = 5;    cout<<"a[0] = ";    cin>>a[0];    cout<<"a[1] = ";    cin>>a[1];    cout<<"a[2] = ";    cin>>a[2];    cout<<"a[3] = ";    cin>>a[3];    cout<<"a[4] = ";    cin>>a[4];    cout<<a[0]<<endl;    cout<<a[3]<<endl;    return 0;}


Ví dụ về khai báo, nhập, xuất giá trị các phần tử có trong mảng dùng vòng lặp.

#include <iostream>using namespace std;const int sopt=200;int main(){    int a[sopt];    int n=0, i=0;    cout<<"Nhap so phan tu cua mang, n = ";    cin>>n;    for(i=0; i<n; i++)    {        cout<<"a["<<i<<"] = ";        cin>>a[i];    }    for(i=0; i<n; i++)    {        cout<<a[i]<<endl;    }    return 0;}

#include <iostream>using namespace std;void Nhap(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<"a["<<i<<"] = ";        cin>>a[i];    }}void Xuat(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<a[i]<<" ";    }}int main(){    const int sophantu = 100;    int a[sophantu], n;    cout << "Nhap so phan tu thuc co, n = ";    cin>>n;    Nhap(a,n);    Xuat(a,n);    return 0;}


4.2. Sắp xếp tăng giảm (tự code sắp xếp, sử dụng hàm có sẵn - ưu tiên sử dụng hàm sort có sẵn).
* Sắp xếp mảng tự code (chưa được tốt, dễ hiểu dành cho mọi đối tượng học sinh mới làm quen)

#include <iostream>using namespace std;void Nhap(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<"a["<<i<<"] = ";        cin>>a[i];    }}void Xuat(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<a[i]<<" ";    }}void Sapxeptang(int a[], int n){    int i = 0,j = 0, temp = 0;    for(i=0; i<n-1; i++)    {        for(j=i+1; j<n; j++)        {            if(a[i]>a[j])            {                temp=a[i];                a[i]=a[j];                a[j]=temp;            }        }    }}void Sapxepgiam(int a[], int n){    int i = 0,j = 0, temp = 0;    for(i=0; i<n-1; i++)    {        for(j=i+1; j<n; j++)        {            if(a[i]<a[j])            {                temp=a[i];                a[i]=a[j];                a[j]=temp;            }        }    }}int main(){    const int sophantu = 100;    int a[sophantu], n;    cout << "Nhap so phan tu thuc co, n = ";    cin>>n;    Nhap(a,n);    Sapxeptang(a,n);    Xuat(a,n);    cout <<endl;    Sapxepgiam(a,n);    Xuat(a,n);    return 0;}




* Sắp xếp mảng tự code (điều chỉnh, bổ sung cách trên để chương trình chạy tốt hơn, sắp xếp nhanh hơn).

#include <iostream>using namespace std;void Nhap(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<"a["<<i<<"] = ";        cin>>a[i];    }}void Xuat(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<a[i]<<" ";    }}void Sapxeptang(int a[], int n){    int i = 0,j = 0, temp = 0, minindex=0;    for(i=0; i<n-1; i++)    {        minindex = i;        for(j=i+1; j<n; j++)        {            if(a[minindex]>a[j])            {                minindex=j;            }        }        if(minindex>i)        {            temp=a[minindex];            a[minindex]=a[i];            a[i]=temp;        }    }}void Sapxepgiam(int a[], int n){    int i = 0,j = 0, temp = 0, minindex= 0;    for(i=0; i<n-1; i++)    {        minindex= i;        for(j=i+1; j<n; j++)        {            if(a[minindex]<a[j])            {                minindex=j;            }        }        if(minindex>i)        {            temp=a[minindex];            a[minindex]=a[i];            a[i]=temp;        }    }}int main(){    const int sophantu = 100;    int a[sophantu], n;    cout << "Nhap so phan tu thuc co, n = ";    cin>>n;    Nhap(a,n);    Sapxeptang(a,n);    Xuat(a,n);    cout <<endl;    Sapxepgiam(a,n);    Xuat(a,n);    return 0;}



Dùng hàm có sẵn sort phải nhập 02 thư viện sau:
#include<algorithm>
#include<functional> // std::greater

#include <iostream>#include<algorithm>#include<functional>using namespace std;void Nhap(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<"a["<<i<<"] = ";        cin>>a[i];    }}void Xuat(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<a[i]<<" ";    }}void SapxeptangSort(int a[], int n){    sort(a, a+n);}void SapxepgiamSort(int a[], int n){    sort(a, a+n, greater<int>());}int main(){    const int sophantu = 100;    int a[sophantu], n;    cout << "Nhap so phan tu thuc co, n = ";    cin>>n;    Nhap(a,n);    SapxeptangSort(a,n);    Xuat(a,n);    cout <<endl;    SapxepgiamSort(a,n);    Xuat(a,n);    return 0;}


4.3.Kiểm tra xem giá trị X có xuất hiện trong mảng hay không? Xuất hiện bao nhiêu lần và các vị trị xuất hiện (nếu có)?

#include <iostream>using namespace std;void Nhap(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<"a["<<i<<"] = ";        cin>>a[i];    }}void Tim(int a[], int n, int X){    int i =0, solan = 0, vitri[n], vt =0;    for(i=0; i<n; i++)    {        if(X==a[i])        {            vitri[vt]=i;            vt++;            solan++;        }    }    if(solan>0)    {        cout<<"Gia tri "<<X<<" xuat hien trong mang "<<solan<<" lan. Tai cac vi tri: ";        for(i=0; i<solan; i++)        {            cout<<vitri[i]<<" ";        }    }    else    {        cout<<"Gia tri "<<X<<" khong xuat hien trong mang";    }}int main(){    const int sophantu = 100;    int a[sophantu], n, X;    cout << "Nhap so phan tu thuc co, n = ";    cin>>n;    Nhap(a,n);    cout << "Nhap gia tri muon tim, X = ";    cin>>X;    Tim(a,n,X);    cout <<endl;    return 0;}


4.4. Chèn thêm phần tử X vào mảng (tại vị trí nào đó hoặc mảng đã sắp xếp sao cho vẫn đảm bảo thứ tự sắp xếp).
*  Chèn thêm phần tử X vào mảng (tại một vị trí chỉ định nào đó) 

#include <iostream>using namespace std;void Nhap(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<"a["<<i<<"] = ";        cin>>a[i];    }}void Xuat(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<a[i]<<" ";    }}void Chentaivitri(int a[],int &n, int vitri, int giatri){    int i;    for(i=n; i>vitri; i--)    {        a[i]=a[i-1];    }    a[vitri]=giatri;    n++;}int main(){    const int sophantu = 100;    int a[sophantu], n, vitri, giatri;    cout << "Nhap so phan tu thuc co, n = ";    cin>>n;    Nhap(a,n);    cout << "Nhap vi tri muon chen, vitri = ";    cin>>vitri;    cout << "Nhap gia tri muon chen, giatri = ";    cin>>giatri;    Chentaivitri(a,n,vitri, giatri);    Xuat(a,n);    return 0;}


* Chèn thêm phần tử X vào mảng (đã sắp xếp sao cho vẫn đảm bảo thứ tự sắp xếp).

#include <iostream>#include<algorithm>#include<functional>using namespace std;void Nhap(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<"a["<<i<<"] = ";        cin>>a[i];    }}void Xuat(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<a[i]<<" ";    }}void Chentaivitri(int a[],int &n, int vitri, int giatri){    int i;    for(i=n; i>vitri; i--)    {        a[i]=a[i-1];    }    a[vitri]=giatri;    n++;}void Sapxep(int a[], int n, bool tangdan){    if(tangdan)    {        sort(a, a+n);    }    else    {        sort(a, a+n, greater<int>());    }    Xuat(a,n);    cout <<endl;}void Chendasapxep(int a[], int &n, int giatri, bool tangdan){    int i;    int vitri;    if(tangdan)    {        for(i=0; i<n; i++)        {            if(a[i] > giatri)            {                vitri =i;                break;            }        }    }    else    {        for(i=0; i<n; i++)        {            if(a[i] < giatri)            {                vitri =i;                break;            }        }    }    Chentaivitri(a,n,vitri,giatri);    Xuat(a,n);    cout <<endl;}int main(){    bool tangdan =false;    const int sophantu = 100;    int a[sophantu], n, vitri, giatri;    cout << "Nhap so phan tu thuc co, n = ";    cin>>n;    Nhap(a,n);    char tang;    cout << "Sap xep tang dan (C/K)?";    cin>>tang;    if((tang == 'C')||(tang == 'c'))    {        tangdan =true;    }    Sapxep(a, n, tangdan);    cout << "Nhap gia tri, giatri = ";    cin>>giatri;    Chendasapxep(a, n,giatri, tangdan);    return 0;}



4.5. Xóa phần tử của mảng (tại vị trí nào đó, xóa các phần tử trùng lặp - sau khi xóa, mỗi phần tử trong mảng là duy nhất).
* Xóa tại vị trí được chỉ định nào đó.

#include <iostream>using namespace std;void Nhap(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<"a["<<i<<"] = ";        cin>>a[i];    }}void Xuat(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<a[i]<<" ";    }}void Xoataivitri(int a[], int &n, int vitri){    int i =0;    for(i=vitri; i<n; i++)    {        a[i]=a[i+1];    }    n--;    Xuat(a,n);}int main(){    const int sophantu = 100;    int a[sophantu], n, vitri;    cout << "Nhap so phan tu thuc co, n = ";    cin>>n;    Nhap(a,n);    do    {        cout << "Nhap vi tri muon xoa, vitri = ";        cin>>vitri;    }    while ((vitri<0)||(vitri>n-1));    Xoataivitri(a,n,vitri);    return 0;}


* Xóa các phần tử trùng lặp - sau khi xóa, mỗi phần tử trong mảng là duy nhất.

#include <iostream>using namespace std;void Nhap(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<"a["<<i<<"] = ";        cin>>a[i];    }}void Xuat(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<a[i]<<" ";    }}void Xoataivitri(int a[], int &n, int vitri){    int i =0;    for(i=vitri; i<n; i++)    {        a[i]=a[i+1];    }    n--;    Xuat(a,n);}void Xoatrunglap(int a[], int &n){    for(int i=0; i<n; i++)    {        for(int j=i+1; j<n;)        {            if(a[i]==a[j])            {                for(int k=j; k<n; k++)                {                    a[k]=a[k+1];                }                n--;            }            else            {                j++;            }        }    }    Xuat(a,n);}int main(){    const int sophantu = 100;    int a[sophantu], n, vitri;    cout << "Nhap so phan tu thuc co, n = ";    cin>>n;    Nhap(a,n);    do    {        cout << "Nhap vi tri muon xoa, vitri = ";        cin>>vitri;    }    while ((vitri<0)||(vitri>n-1));    Xoataivitri(a,n,vitri);    cout <<endl;    char OK;    cout << "Co xoa cac pah tu trung lap khong (C/K)?";    cin>>OK;    if((OK=='c')||(OK=='C'))    {        Xoatrunglap(a,n);    }    return 0;}



4.6. Kiểm tra xem có phải là mảng đối xứng không?

#include <iostream>using namespace std;void Nhap(int a[], int n){    int i =0;    for(i=0; i<n; i++)    {        cout<<"a["<<i<<"] = ";        cin>>a[i];    }}bool Checkdoixung(int a[], int n){    bool ladx=true;    int den =n/2, i;    for(i=0; i<den; i++)    {        if(a[i] != a[n - i - 1])        {            ladx=false;            break;        }    }    return ladx;}int main(){    const int sophantu = 100;    int a[sophantu], n, vitri, giatri;    cout << "Nhap so phan tu thuc co, n = ";    cin>>n;    Nhap(a,n);    if(Checkdoixung(a, n))    {        cout <<"La mang doi xung"<<endl;    }    else    {        cout <<"Khong phai mang doi xung"<<endl;    }    return 0;}



4.7. Tìm ƯCLN của mọi phần tử trong mảng.

4.8. Tìm BCNN của mọi phần tử trong mảng.


5. Chủ đề 5. Xâu kí tự.
Mục tiêu:
- Cách khai báo và sử dụng string.
Kiến thức:
- Khai báo xâu string:
string tên_xâu;
string tên_xâu = "";
string tên_xâu = "xau ki tu";
5.1. Nhập, xuất xâu.
Nhập xâu từ bàn phím: dùng hàm getline() như sau

#include <iostream>using namespace std;int main(){    string S, S1;    cout<<"Nhap xau S = ";    getline(cin,S);    cout<<"Xau S vua nhap la: "<<S<<endl;    cout<<"Nhap xau S1 = ";    getline(cin,S1,'.');    cout<<"Xau S1 vua nhap la: "<<S1<<endl;    return 0;}


Nhập xuất xâu từ tệp: dùng hàm getline() như sau.

#include <iostream>#include <fstream>using namespace std;int main(){    ifstream fin;    ofstream fout;    fin.open("XAU.INP",ios::in);    fout.open("XAU.OUT",ios::out);    if(fin.fail())    {        fout<<"Loi doc tep";    }    else    {        string hoten, diachi;        getline(fin,hoten);        getline(fin,diachi);        fout<<hoten<<endl;        fout<<diachi;    }    fin.close();    fout.close();    return 0;}




5.2. Các thao tác cơ bản với xâu.
- Độ dài xâu dùng hàm (phương thức): length() hoặc size()

#include <iostream>using namespace std;int main(){    string S = "Xin    chao   tat ca    cac ban   ";    int do_dai_xau = S.length();    cout<<"Do dai xau S = "<<do_dai_xau<<endl;    int do_dai_xau2 = S.size();    cout<<"Do dai xau S = "<<do_dai_xau2<<endl;    return 0;}


- Xâu rỗng có độ dài bằng 0. Để kiểm tra xâu rông dùng phương thức empty() trả về giá trị true khi string rỗng, ngược lại, trả về giá trị false.

#include <iostream>using namespace std;int main(){    string S="";    cout<<"Xau S co rong hay khong?: "<<S.empty()<<endl;    return 0;}


Chuỗi con (Substring)
+ xaucon = xaugoc.substr(Vị trí bắt đầu, Độ dài xâu con);
Vị trí bắt đầu >= 0
Độ dài xâu con <= Độ dại xâu gốc -1

#include <iostream>using namespace std;int main(){    string  xaugoc = "abcdef";    string xaucon;    xaucon=xaugoc.substr(0, 1);    cout << xaucon << endl;    xaucon=xaugoc.substr(2, 5);    cout << xaucon << endl;    xaucon=xaugoc.substr(0, 3);    cout << xaucon << endl;    return 0;}


Xóa sạch xâu - làm rỗng xâu: clear()

#include <iostream>using namespace std;int main(){    string S="Quyn";    cout<<"Xau S co rong hay khong?: "<<S.empty()<<endl;    S.clear();    cout<<"Xau S co rong hay khong?: "<<S.empty()<<endl;    return 0;}


Truy cập phần tử trong string S: S[chỉ số] hoặc S.at(chỉ số); 0<= chỉ số <S.length()

#include <iostream>using namespace std;int main(){    string S="Vang Van Quyn";    int len = S.length();    int i=0;    for(i=0; i<len; i++)    {        cout<<"Ky tu: "<<S[i]<<endl;    }    for(i=0; i<len; i++)    {        cout<<"Ky tu: "<<S.at(i)<<endl;    }    return 0;}


- Xóa kí tự cuối cùng nếu xâu không rỗng: pop_back()

#include <iostream>using namespace std;int main(){    string S="Vang Van Quyn";    int len = S.length();    cout<<"Do dai S "<<len<<endl;    S.pop_back();    cout<<"Do dai S "<<S.length()<<endl;    return 0;}


– Xóa một kí tự ở vị trí nào đó trong xâu S:  S.erase(S.begin() + vị trí kí tự muốn xóa); 0<= vị trí kí tự muốn xóa < S.length()

#include <iostream>using namespace std;int main(){    string S="Vang Van Quyn";    int len = S.length();    cout<<S<<endl;    S.erase(S.begin() + 2);    cout<<S<<endl;    return 0;}


Input: Vang Van Quyn
Output: Vag Van Quyn
– Xóa các kí tự trong một phạm vi chỉ định trong xâu S tính từ vị trí đầu: S.erase(S.begin() + start, S.begin() + end); 0<= start < end <  S.length(). Các kí tự bị xóa bắt đầu từ kí tự tại vị trí start đến trước vị trí end. Vậy số lượng kí tự bị xóa = end – start.

#include <iostream>using namespace std;int main(){    string S="Vang Van Quyn";    int len = S.length();    cout<<S<<endl;    S.erase(S.begin() + 0, S.begin() + 3 );    cout<<S<<endl;    return 0;}


Input: Vang Van Quyn
Output: g Van Quyn
– Xóa các kí tự trong một phạm vi chỉ định trong xâu S: S.erase(index, lengt); 0 <= index – là vị trí của kí tự bắt đầu xóa;lengt – là số lượng các kí tự sẽ xóa. Nếu lengt >= độ dài xâu thì xóa từ vị trí index đến hết.

#include <iostream>using namespace std;int main(){    string S="Vang        Van Quyn";    int len = S.length();    cout<<S<<endl;    S.erase(4,7);    cout<<S<<endl;    return 0;}


Input: Vang        Van Quyn
Output: Vang Van Quyn
– Xóa các kí tự từ vị trí chỉ định trong xâu S: S.erase(index); 0 <= index – là vị trí của kí tự bắt đầu xóa đến cuối xâu.

#include <iostream>using namespace std;int main(){    string S="Vang        Van Quyn";    int len = S.length();    cout<<S<<endl;    S.erase(4);    cout<<S<<endl;    return 0;}


Input: Vang        Van Quyn
Output: Vang
- Nối xâu S: push_back('kí tự') nối kí tự vào cuối xâu, append("xâu kí tự"), phép +

#include <iostream>using namespace std;int main(){    string S="Quy";    S.push_back('n');    cout<<"S la: "<<S<<endl;    S.clear();    S.append("Vang ");    S.append("Van ");    S.append("Quyn");    cout<<"S la: "<<S<<endl;    S.clear();    S=S+"Vang ";    S=S+"Van ";    S=S+"Quyn";    cout<<"S la: "<<S<<endl;    return 0;}


- Chèn một xâu vào vị trí bất kì trong xâu khác: insert (vị trí chèn, xâu chèn vào); 0<= vị trí chèn<= độ dài xâu

#include <iostream>using namespace std;int main(){    string S="Quyn";    S.insert(1,"C++");    cout<<"S la: "<<S<<endl;    return 0;}


- Thay thế một phần của xâu: replace (vị trí thay thế, số lượng kí tự thay thế,  xâu sẽ thay vào);
0<= Vị trí thay thế <= S.length()

#include <iostream>using namespace std;int main(){    string S="Hoc lap trinh Pascal";    S.replace(14, 6, "C++");    cout<<"S la: "<<S<<endl;    return 0;}


- Tìm vị trí xuất hiện của S1 trong S2; S2.find(S1); Nếu thấy thì trả về vị trí xuất hiện của S1 trong S2, ngược lại trả về -1.

#include <iostream>using namespace std;int main(){    string S="Hoc lap trinh Pascal";    string S1="Pascal";    int vts1=S.find(S1);    cout<<"S la: "<<vts1<<endl;    return 0;}


- So sanh hai xâu S1 và S2: S1.compare(S2)
S1.compare(S2) == 0       nếu  S1== S2
S1.compare(S2) > 0         nếu  S1> S2
S1.compare(S2) < 0         nếu S1< S2

5.3. Chuyển đổi số kiểu số sang xâu và ngược lại.
 - Chuyển đổi số sang xâu và ngược lại

#include <iostream>using namespace std;int main(){    int songuyen=45.786;    string ssonguyen=to_string(songuyen);    int so=stoi(ssonguyen);    long so1=stol(ssonguyen);    float so2=stof(ssonguyen);    double so3=stod(ssonguyen);    cout<<songuyen<<endl;    cout<<so<<endl;    cout<<so1<<endl;    cout<<so2<<endl;    cout<<so3<<endl;    return 0;}


- Chuyển đổi chữ số sang con số và ngược lại.

#include <iostream>using namespace std;int main(){    char ch ='4';    int so =ch-'0';    cout<<so<<endl;    so =ch-48;    cout<<so<<endl;    cout<<so+5;    return 0;}




5.4. Kiểm tra xem một kí tự trong xâu có phài là chữ số hay không?
 - Hàm isdigit kiểm tra xem một kí tự có phải là chữ số hay không?

#include <iostream>using namespace std;int main(){    string S = "abh45gghu6f8j7k9lpn";    int i =0, len=S.length();    for(i=0; i<len; i++)    {        cout<<isdigit(S.at(i));    }    return 0;}

#include <iostream>using namespace std;int main(){    int so =4;    char ch =so+'0';    cout<<ch<<endl;    ch =so+48;    cout<<ch<<endl;    cout<<ch+5<<endl;    cout<<(ch+5)-'0';    return 0;}


- Bài tập áp dụng, cho xâu S= "abh45gghu6f82j7k9lpn”. Chuyển các kí tự là chữ số sang kiểu số và tính tổng các số đó (tức là tính 4+5+6+8+2+7+9)

#include <iostream>using namespace std;int main(){    string S = "abh45gghu6f82j7k9lpn";    int i =0, len=S.length();    int T=0;    for(i=0; i<len; i++)    {        if(isdigit(S.at(i)))        {            int so =(int)(S.at(i)-'0');            cout<<so<<endl;            T=T+so;        }    }    cout<<"Tong = "<<T;    return 0;}




Bài tập vận dụng, cho xâu S= "abh45gghu6f82j7k9lpn”. Tính tổng các số đó là các chữ số liên tiếp nhau trong xâu S được chuyển sang kiểu số (tức là tính 45+6+82+7+9)

#include <iostream>using namespace std;int main(){    string S = "abh45gghu6f82j7k9lpn";    int i =0, len=S.length();    int T=0;    int so =0;    string chuso="";    for(i=0; i<len; i++)    {        if(isdigit(S.at(i)))        {            so=so*10+S.at(i)-'0';        }        else        {            if(so!=0)            {                cout<<so<<endl;                T=T+so;            }            so=0;        }    }    cout<<"Tong = "<<T;    return 0;}


5.5. Chuyển đổi chữ HOA - chữ thường.
* Chuyển chữ HOA sang chữ thường: tolower(kí tự); Kiểm tra xem có phải chữ HOA hay không: isupper(kí tự)

#include <iostream>using namespace std;int main(){    string str="VAnG vAN qUyN";    int len = str.length();    int i=0, c;    for (i = 0; i < len; i++)    {        c = str[i];        if (isupper(c))        {            str[i] = tolower(c);        }    }    cout<<str;    return 0;}


* Chuyển chữ thường sang chữ HOA: toupper(kí tự); Kiểm tra xem có phải chữ thường hay không: islower(kí tự);

#include <iostream>using namespace std;int main(){    string str="VAnG vAN qUyN";    int len = str.length();    int i=0, c;    for (i = 0; i < len; i++)    {        c = str[i];        if (islower(c))        {            str[i] = toupper(c);        }    }    cout<<str;    return 0;}


5.6. Chuẩn hóa xâu.
5.6.1. Xóa kí tự dấu cách thừa trong xâu.
* Xóa kí tự dấu cách thừa gồm: Xóa dấu cách ở đầu xâu, cuối xâu, dấu cách thừa giữa hai từ có từ hai dấu cách trở lên.
Ví dụ 1 dùng phương thức find xóa dấu cách thừa giữa hai từ tương tự như hàm POS trong Pascal.

#include <iostream>using namespace std;int main(){    string S="      chao    cac     ban      ";    cout << S << endl;    while(S[0]==' ')    {        S.erase(0,1);    }    cout << S << endl;    while(S[S.length()]==' ')    {        S.erase(S.length()-1,1);    }    cout << S << endl;    while(S.find("  ") != -1)    {        S.erase(S.find("  "),1);    }    cout << S << endl;    return 0;}


Ví dụ 2 dùng phương thức find xóa dấu cách thừa giữa hai từ (nếu kí tự thứ i và i+1 đều là dấu cách thì xóa một kí tự).

#include <iostream>using namespace std;int main(){    string S="      chao    cac     ban      ";    cout << S << endl;    while(S[0]==' ')    {        S.erase(0,1);    }    cout << S << endl;    while(S[S.length()]==' ')    {        S.erase(S.length()-1,1);    }    cout << S << endl;    int dodai = S.length(), i = 0;    for(i = 0; i < dodai; i++)    {        if((S[i]==' ')&&(S[i+1]==' '))        {            S.erase(i,1);            dodai--;            i--;        }    }    cout << S << endl;    return 0;}


Ví dụ 3 dùng stringstream trong C++

#include <iostream>#include <sstream>using namespace std;int main(){    string kq;    string S = "xin     chao    tat     ca cac ban";    stringstream ss(S);    string token = " ";    while (ss >> token)    {        kq.append(token).append(" ");    }    kq.pop_back();   // kq.replace(kq.length()-1,1,"");    S=kq;    kq.clear();    cout << S << endl;    return 0;}


5.6.2. Chuẩn hóa danh từ riêng.

#include <iostream>#include <sstream>using namespace std;int main(){    string kq;    string S = "xin     chao    tat     ca cac ban";    stringstream ss(S);    string token = " ";    char ch;    int i =0, len =0;    while (ss >> token)    {        len=tach.length();        for(i=1; i<len; i++)        {            ch = tach.at(i);            tach.at(i)=tolower(ch);        }        ch = token.at(0);        token.at(0) = toupper(ch);        kq.append(token).append(" ");    }    kq.pop_back();    //kq.replace(kq.length()-1,1,"");    S=kq;    kq.clear();    cout << S << endl;    return 0;}


5.6.3. Sắp xếp các kí tự trong xâu tăng/giảm bằng hàm sort (thư viện: #include<algorithm>)
code:

#include <iostream>
#include<algorithm>

using namespace std;

int main()
{
    string s1="5450";//"Abc0gh05hh45k0*";
    string s2="708";//*/def0hh070b8k’";

    sort(s1.begin(), s1.end());
    cout <<"Sap xep tang dan: "<<s1<< endl;

    sort(s1.begin(), s1.end(),greater<char>());
    cout <<"Sap xep giam dan: "<< s1<< endl;

    sort(s2.begin(), s2.end(),greater<char>());
    cout <<"Sap xep giam dan: "<< s2<< endl;

    string s3=s1+s2;
    cout <<"Noi s2 vao s1 thanh s3: "<< s3<< endl;

    sort(s3.begin(), s3.end(),greater<char>());
    cout <<"Sap xep s3 giam dan de tao duoc so lon nhat: "<< s3<< endl;

    return 0;
}

Minh họa:


 6. Vector.
6.1. Khái niệm: Là một mảng động có các phần tử nằm liên tiếp nhau trong bộ nhớ nhưng có thể thay đổi kích thước bất kì.
6.2. Khai báo.
Dùng thư viện chuẩn:  #include <vector>
Có 2 cách khởi tạo vector là: 
vector<"kiểu dữ liệu"> "tên vector";
vector<"kiểu dữ liệu"> "tên vector"(số lượng phần tử);
6.3. Nhập xuất.
Nhập xuất vector giống với nhập xuất mảng nhưng ta có thêm hàm/phương thức bổ trợ để thêm giá trị vào cuối vector trong trường hợp chưa biết rõ vector có bao nhiêu phần tử hoặc trong lúc thực thi ta muốn thêm giá trị vào là: "tên vector".push_back(giá trị); Xem trong phần ví dụ.
6.4. Các hàm/phương thức.
myvector.push_back(x); Để thêm một phần tử x vào vị trí sau cùng của vector:
myvector.insert(pos, x); thêm x vào vector tại vị trí pos
myvector.insert(pos, k, x); thêm k phần tử x vào vector từ vị trí pos
myvector.insert(pos, x.begin(), x.end()); thêm vector x vào vector myvector từ vị trí pos
myvector.insert(pos, array, array + k); thêm k phần tử trong mảng array vào vector từ vị trí pos
Ở đây ta lưu ý phương thức begin() là trả về vị trí đầu của vector và end() là trả về  vị trí cuối của vector
myvector.erase(myvector.begin()+pos); xóa phần tử tại vị trí pos trong vector;
myvector.erase(myvector.begin()+i; myvector.begin()+k); xóa các phần tử từ vị trí i cho tới vị trí k
myvector.erase(i, k); //xóa các phần tử từ vị trí i cho tới vị trí k
myvector.pop_back(); xóa phần tử cuối cùng của vector
sort(v.begin(), v.end()); Sắp xếp tăng dần toàn bộ
sort(v.begin(), v.end(), greater<int>()); Sắp xếp giảm dần toàn bộ
sort(first, last); // sắp xếp từ vị trí first tới last tăng dần
sort(first, last, greater<int>()); // sắp xếp từ vị trí first tới last giảm dần thêm #include <algorithm> 
Lấy số lượng phần tử: myvector.size();
myvector.clear(); //xóa tất cả phần tử trong vector
Vị trí đầu: myvector.begin() hoặc myvector.fornt();
Vị trí cuối: myvector.end() // hoặc myvector.begin() + myvector.size() hoặc myvector.back();
myvector[pos]  hoặc myvector.at(pos); // truy cập trực tiếp/lấy  phần tử ở vị trí pos (tính từ 0)
Kiểm tra vector giỗng: myvector.empty();
reverse(myvector.begin(), myvector.end());  //đảo ngược cả vector 
reverse(myvector.begin(), myvector.begin()+2); //đảo ngược từ vị trí đầu tới vị trí đầu +2;
Đổi 2 vector: swap(vta, vtb); //tất cả các phần tử của vta được gán cho vtb và ngược lại
ten-vector.rbegin();  Đảo ngược các phần tử từ cuối trở về đầu
ten-vector.rend();  Đảo ngược các phần tử từ đầu trở về cuối
vector.max_size(); hàm trả về số phần tử tối đa mà vector có thể chứa
vector.capacity(); hàm trả về số phần tử được cấp phát cho vector nằm trong bộ nhớ
vector.reserve(n); hàm cấp cho vector số dung lượng vừa đủ để chứa n phần tử
6.5. Ví dụ..
6.5.1. Ví dụ nhập giá trị cho vector từ bàn phím dùng phương thức push_back khi không biết vector có bao nhiêu phần tử.


#include <iostream>#include <vector>using namespace std;int main(){    vector<int> v;    int i, giatri;    for (i=0; i<10; i++)    {        cout<<"Nhap phan tu thu "<<i<<": ";        cin>>giatri;        v.push_back(giatri);    }    cout<<v.size()<<endl;    v.push_back(58);    int soluong=v.size();    cout<<soluong<<endl;    for (i=0; i<soluong; i++)    {        cout<<        v[i]<<" ";    }    return 0;}


6.5.2. Ví dụ nhập giá trị cho vector từ bàn phím khi biết vector có bao nhiêu phần tử, dùng tương tự như mảng.

#include <iostream>#include <vector>using namespace std;int main(){    int i, n;    cout<<"Nhap so phan cua day, n= ";    cin>>n;    vector<int> v(n);    for (i=0; i<n; i++)    {        cout<<"Nhap phan tu thu "<<i<<": ";        cin>>v[i];    }    cout<<v.size()<<endl;    v.push_back(58);    int soluong=v.size();    cout<<soluong<<endl;    for (i=0; i<soluong; i++)    {        cout<<v[i]<<" ";    }    return 0;}


6.5.1. Ví dụ nhập giá trị cho vector đọc từ tệp dùng phương thức push_back khi không biết vector có bao nhiêu phần tử.

#include <iostream>#include <vector>#include <fstream>using namespace std;int main(){    ifstream fin;    ofstream fout;    fin.open("DEMO.INP",ios::in);    fout.open("DEMO.OUT",ios::out);    if(fin.fail())    {        fout<<"Loi doc tep";    }    else    {        vector<long long> v;        long long i, n, giatri;        fin>>n;        for (i=0; i<n; i++)        {            fin>>giatri;            v.push_back(giatri);        }        long long soluong=v.size();        for (i=0; i<soluong; i++)        {            fout<<v[i]<<" ";        }    }    fin.close();    fout.close();    return 0;}


* Ví dụ.

#include <iostream>#include <vector>#include <fstream>using namespace std;int main(){    ifstream fin;    ofstream fout;    fin.open("DEMO.INP",ios::in);    fout.open("DEMO.OUT",ios::out);    if(fin.fail())    {        fout<<"Loi doc tep";    }    else    {        vector<long long> v;        long long i,giatri;        while(!fin.eof())        {            fin>>giatri;            v.push_back(giatri);        }        long long soluong=v.size();        for (i=0; i<soluong; i++)        {            fout<<v[i]<<" ";        }    }    fin.close();    fout.close();    return 0;}


6.5.2. Ví dụ nhập giá trị cho vector đọc từ tệ  khi biết vector có bao nhiêu phần tử, dùng tương tự như mảng.

#include <iostream>#include <vector>#include <fstream>using namespace std;int main(){    ifstream fin;    ofstream fout;    fin.open("DEMO.INP",ios::in);    fout.open("DEMO.OUT",ios::out);    if(fin.fail())    {        fout<<"Loi doc tep";    }    else    {        long long i, n;        fin>>n;        vector<long long> v(n);        for (i=0; i<n; i++)        {            fin>>v[i];        }        long long soluong=v.size();        for (i=0; i<soluong; i++)        {            fout<<v[i]<<" ";        }    }    fin.close();    fout.close();    return 0;}


 

Tác giả: Vàng Văn Quyn

Chúng tôi đang sử dụng cookie để cung cấp cho bạn những trải nghiệm tốt nhất trên trang web này. Bằng cách tiếp tục truy cập, bạn đồng ý với Chính sách thu thập và sử dụng cookie của chúng tôi.
Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây