“MỌI SỰ CỐ GẮNG CHƯA CHẮC ĐÃ GẶT GÁI ĐƯỢC KẾT QUẢ NHƯNG MỖI KẾT QUẢ ĐẠT ĐƯỢC CHẮC CHẮN LÀ CẢ MỘT QUÁ TRÌNH CỐ GẮNG”

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

Thứ hai - 21/03/2022 20:23
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 V1
  Mục lục
I. Hướng dẫn sử cài và dụng CodeBlocks để thực hành c++
II. Tài liệu C ++

1. Chủ đề 1. Làm quen với C++.
2. Chủ đề 2. Lệnh điều kiện, lệnh lặp.
3. Chủ đề 3. Mảng một chiều (số nguyên, số thực).
4. Chủ đề 4. Xâu kí tự.
5. Chủ đề 5. Đọc tệp, ghi tệp.
6. Chủ đề 6. Mảng 2 chiều (Ma trận)
7. Chủ đề 7. Luyện tập-Giải đề chuyên.


I. Hướng dẫn sử cài và dụng CodeBlocks để thực hành c++
1. Tải và cài CodeBlock.
http://www.codeblocks.org/downloads/26
- Đối với Windowsn 64bít: Chọn tệp có tên: codeblocks-20.03mingw-setup.exe
- Đối với Windowsn 32bít: Chọn tệp có tên: codeblocks-20.03mingw-32bit-setup.exe
+ Sửa lỗi khi cài bản codeblocks-20.03mingw-32bit-setup.exe báo "Không tìm thấy trình biên dịch GNU GCC" Click vào đây để xem hướng dẫn fix lỗi.
+ Sửa lỗi cài trên win 7 không update mới báo thiều "api-ms-win-crt-runtime-l1-1-0.dll ". Tải VC++ cài  bổ sung tại link bên dưới đây:
Bản CV++ cho win 64bit (13,69MB)
Bản VC++ cho win 32 bit (12,92MB)

- Đặt phím tắt để tự định dạng code.
B1. Như hình sau

B2. Như hình sau

2. Tạo project mới chạy thử chương trình đầu tiên.







- Chuột phải vào tên tệp main.cpp chọn Rename file rồi đổi tên thành Cau1.cpp.



Nhấn F9 để dịch và chạy.
Nhấn phím Enter để trở lại soạn thảo.
3. Khắc phục lối nếu tại mục 2 chạy thất bại.
Sửa lỗi codeblock chỉ được 1, 2 lần trên win7 và 8
B1: Nhấn tổ hợp phím Windows+R
B2: gõ: services.msc
B3: Tìm mục “Application Experiences”
B4: Chọn “Automatic (Delayed Start)”
B5: Apply và Ok sau đó khởi động lại máy tính
Hoặc vào Start/Control Panel/System anh Security/Administrative Tools rồi nháy đúp chuột vào Services rồi thực hiện như bước 3 và 4, 5 ở trên.
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).
- Hằng, biến và các lệnh nhập/xuất từ bàn phím/màn hình.
Kiến thức:
Các phép toán trong C++ (Toán tử số học)
TT Phép toán Kí hiệ Ví dụ Kết quả
1 Cộng + 9+4 13
2 Trừ - 9-4 5
3 Nhân * 9*4 36
4 Chia / 9/4 2
9.0/4 2.25
9/4.0 2.25
5 Chia lấy phần dư % 9%4 1
6 Tăng 1 đơn vị ++ a++ Giống a=a+
7 Giảm 1 đpn vị -- a-- Giống a=a-
Xuất ra kết quả gồm mặc định và có định dạng (số nguyên, số thực).
- 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/4 << endl; //Chi lay phan nguyen do ca hai so deu nguyen    cout << "9/4 = "<<9.0/4 << endl; //Lay ca phan thap phan neu mot trong hai so la so thap phan    cout << "9%4 = "<<9%4 << endl;    return 0;}
kết quả:

Xuất định dạng mọi kiểu dữ liệu
: 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
Số thực có đinh dạng và 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; //Chi lay phan nguyen do ca hai so deu nguyen    cout <<setw(10)<<left<< "9/4 = "<<9.0/4 << endl; //Lay ca phan thap phan neu mot trong hai so la so thap phan    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 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)
Các kiểu dữ liệu cơ bản của C++
(Dánh cho học sinh THCS lớp 8 thay thế ngôn ngữ lập trình Pascal từ sô 1 đến 7)
TT Kiểu dữ liệu Mô tả Ghi chú
1 int   Số nguyên
2 float   Số thực
3 char   Kí tự
4 string   Xâu kí tự
5 bool   Logic
6 long   Số nguyên
7 short   Số nguyên
8    double      Số thực
9       

Phép gán, hằng, biến và các lệnh nhập/xuất giá trị cho biến từ bàn phím/màn hình.
- Phép gán là dấu bằng =
Ví dụ: a = 90;
- 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.
- Biến (variable) là đại lượng có giá trị có thể thay đổi trong khi 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;
- 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;
Ví dụ 2:
#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;}
-Kết quả:

2. Chủ đề 2. Lệnh điều kiện, lệnh lặp.
Mục tiêu:
- 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.
Kiến thức:
Các phép so sánh (toán tử quan hệ)
Ví dụ: int a = 10, int b= 20;
Phép so sánh Kí hiệu
(toán tử so sánh)
Ví dụ  Kết qủa
Bằng == a==b false
Khác != a!= true
Lớn hơn > a>b false
Nhỏ hơn < a<b true
Lớn hơn hoặc bằng >= a>= false
Nhỏ hơn hoặc bằng <= a<=b true
Phép logic (toán tử logic)
Ví dụ: A = true; B = false
Phép Logic Kí kiệu
(
toán tử logic)
Ví dụ Kết quả
AND (Và) && A&&B false
OR (Hoặc) || A||B true
NOT (Phủ định) ! !A false
!B true
Ví dụ dùng phép logic &&, || !
#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;}
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;}
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â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ụ:
Giải thích:
#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 lệnh lặp.
Lệnh lặp 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;}
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â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);}

3. Chủ đề 3. 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 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ở>).
Ví dụ khai báo mảng.
Cách 1: Khởi tạo giá trị cho mọi phần tử của mảng:
int array[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 array[4] = { 5, 8 };
Cách 3: Khởi tạo giá trị 0 cho mọi phần tử của mảng
int array[4] = { };
Cách 4: Tự động xác định số lượng phần tử
int array[] = { 5, 8, 2, 7 };
Cách 5: Sử dụng khởi tạo đồng nhất trong C++11 (thực hành cách này)
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 dữ liệu cho mảng 1 chiều
tên biến mảng[chỉ số] = giá trị;
Xuất các 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;    //Nhap gia tri cho cac phan tu cuar mang    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];    /*Xuat gia tri cac phan tu cua mang ra man hinh */    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;    /*Nhap so phan tu thuc co cua mang*/    cout<<"Nhap so phan tu cua mang, n = ";    cin>>n;    //Nhap gia tri cho cac phan tu cuar mang    for(i=0; i<n; i++)    {        cout<<"a["<<i<<"] = ";        cin>>a[i];    }    /*Xuat gia tri cac phan tu cua mang ra man hinh */    for(i=0; i<n; i++)    {        cout<<a[i]<<endl;    }    return 0;}
Ví dụ về sử dụng mảng (nhập, xuất, xoa, thêm phần tử).
#include <iostream>using namespace std;const int soptmax=50;void nhap(int a[], int n){    int i;    for(i=0; i<n; i++)    {        cout<<"a["<<i<<"] = ";        cin>>a[i];    }}void xuat(int a[], int n){    int i;    for(i=0; i<n; i++)    {        cout<<"a["<<i<<"] = "<<a[i]<<endl;    }}bool xoa(int a[],int &n, int vitri){    bool daxoa=false;    if((vitri<0)||(vitri>n-1))    {        cout<<"Vi tri "<<vitri<<" khong ton tai"<<endl;        daxoa=false;    }    else    {        int i;        for(i=vitri; i<n; i++)        {            a[i]=a[i+1];        }        n--;        daxoa=true;    }    return daxoa;}bool them(int a[],int &n, int vitri, int giatri){    bool dathem=false;    if(n>=soptmax)    {        cout<<"Mang da day, khong them duoc nua "<<endl;        dathem=false;    }    else    {        if((vitri<0)||(vitri>n))        {            cout<<"Vi tri muon them phai nhap tu 0 den "<<n<<endl;            dathem=false;        }        else        {            int i;            for(i=n; i>vitri; i--)            {                a[i]=a[i-1];            }            a[vitri]=giatri;            n++;            dathem=true;        }    }    return dathem;}//Xoa cac phan tu trung lap dung whilevoid Xoatrung(int a[],int &N){    int i=0,j=0,k=0;    for (i=0; i<N-1; i++)    {        j=i+1;        while (j<N)        {            if (a[i]==a[j])            {                //xoamotphantu(j, a,N);                for (k=j; k<N-1; k++)                {                    a[k]=a[k+1];                }                N=N-1;            }            else            {                j=j+1;            }        }    }}//Xoa cac phan tu trung lap dung forvoid RemoveDuplicates(int arr[], 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++)                {                    arr[k]=arr[k+1];                }                n--;            }            else            {                j++;            }        }    }    for(int i=0; i<n; i++)    {        cout<<arr[i]<<" ";    }}int main(){    int a[soptmax];    int i,n;    cout << "Nhap so phan tu thuc co cua mang a la n = ";    cin>>n;    nhap(a,n);    xuat(a,n);    int vitri;    cout<<"Nhap vi tri can xoa vitri = ";    cin>>vitri;    if(xoa(a, n, vitri)==true)    {        xuat(a,n);    }    cout<<"Nhap vi tri can them vitri = ";    cin>>vitri;    int giatri;    cout<<"Nhap gia tri can them giatri = ";    cin>>giatri;    if(them(a,n, vitri,  giatri)==true)    {        xuat(a,n);    }    return 0;}

Sắp xếp mảng

* Dùng hàm có sẵn sort

#include <iostream>#include<algorithm>#include<functional> // std::greaterusing namespace std;long a[1000];long n;int main(){//Tự code nhập, xuất để xem kq sắp xếp    sort(a, a+n); // sắp xếp mảng a tăng dần từ phần tử 0 đến phần tử n-1    sort(a, a+n, greater<int>()); // sắp xếp mảng a giảm dần từ p.tử 0 đến p.tử n-1    sort(a+1, a+1+n); // sắp xếp mảng a tăng dần từ phần tử 1 đến phần tử n   }
* Tự code sắp xếp
#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 sapxeptangdan(int a[], int n){    int i = 0,j = 0, tam = 0;    for(i=0; i<n; i++)    {        for(j=0; j<n; j++)        {            if(a[i]<a[j])            {                tam=a[i];                a[i]=a[j];                a[j]=tam;            }        }    }}void sapxepgiamdan(int a[], int n){    int i = 0,j = 0, tam = 0;    for(i=0; i<n; i++)    {        for(j=0; j<n; j++)        {            if(a[i]>a[j])            {                tam=a[i];                a[i]=a[j];                a[j]=tam;            }        }    }}int main(){    //Sap xep tang dan    int a[100], n = 0;    cout<<"N =";    cin>>n;    nhap(a,n);    sapxeptangdan(a,n);    xuat(a,n);    cout<<endl;    sapxepgiamdan(a,n);    xuat(a,n);    return 0;}

4. Chủ đề 4. 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";
- 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); //Mac dinh ket thuc dong bang ki tu  duoc tao ra khi nhan phim Enter    cout<<"Xau S vua nhap la: "<<S<<endl;    cout<<"Nhap xau S1 = ";    /*Tuy nhien co the dung doi so thu 3 lam ki tu ket thuc nhap du lieu*/    getline(cin,S1,'.');    cout<<"Xau S1 vua nhap la: "<<S1<<endl;    return 0;}
- Độ 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); //a    cout << xaucon << endl;    xaucon=xaugoc.substr(2, 5); //cdef    cout << xaucon << endl;    xaucon=xaugoc.substr(0, 3); //abc    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;}
- 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
- 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); //chuyen kieu int sang string    int so=stoi(ssonguyen);//chuyen kieu string sang int    long so1=stol(ssonguyen); //chuyen kieu string sang long    float so2=stof(ssonguyen); //chuyen kieu string sang float    double so3=stod(ssonguyen); //chuyen kieu string sang double    cout<<songuyen<<endl;    cout<<so<<endl;    cout<<so1<<endl;    cout<<so2<<endl;    cout<<so3<<endl;    return 0;}
- Chuyển đổi chữ HOA - thường và ngược lại: islower(), isupper(), tolower(), toupper()
+ Chuyển chữ thường sang chữ HOA:
#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))        {            //Chuyen ki tu sang chu HOA            str[i] = toupper(c);        }    }    cout<<str;    return 0;}
+ Chuyển chữ HOA sang chữ thường:
#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))        {            //Chuyen ki tu sang chu thuong            str[i] = tolower(c);        }    }    cout<<str;    return 0;}
- Tách xâu (sử dụng: stringstream trong thư viện: #include <sstream>).
#include <iostream>#include <sstream>using namespace std;int main(){    string S = "xin chao tat ca cac ban";    stringstream ss(S);    string token = " "; //Cac phan tach nhau boi dau cach hoac xuong dong.    while (ss >> token)   //Doc lan luot cac phan cua xau.    {        cout << token << endl;    }    return 0;}

- Chuẩn hóa (xóa kí tự dấu cách thừa) string
#include <iostream>#include <sstream>using namespace std;int main(){    string kq;    string S = "xin     chao    tat     ca cac ban";    stringstream ss(S);    string token = " "; //Cac phan tach nhau boi dau cach hoac xuong dong.    while (ss >> token)   //Doc lan luot cac phan cua xau.    {        kq.append(token).append(" ");    }    kq.pop_back(); //Xoa ki tu cuoi cung cua xau. Hoac dung lenh:    //kq.replace(kq.length()-1,1,"");    S=kq;    kq.clear(); //Xoa sach xau kq    cout << S << endl;    return 0;}

- Chuẩn hóa (xóa kí tự dấu cách thừ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 = " "; //Cac phan tach nhau boi dau cach hoac xuong dong.    char ch;    int i =0, len =0;    while (ss >> token)   //Doc lan luot cac phan cua xau.    {        len=tach.length();        //Doi cac chu ve chu thuong        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(); //Xoa ki tu cuoi cung cua xau. Hoac dung lenh:    //kq.replace(kq.length()-1,1,"");    S=kq;    kq.clear(); //Xoa sach xau kq    cout << S << endl;    return 0;}

- 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;}
Kết quả: 0001100001010101000

5. Chủ đề 5. Đọc tệp, ghi tệp.
Mục tiêu:
- Đọc và ghi tệp.
Kiến thức:
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::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::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::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

- Sử dụng: #include <fstream>
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()
{
//Chương trình ghi vào tập tin
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);
for(int i=0;i<strlen(CH);i++)//Cách ghi từng ký tự hoặc từng byte dữ liệu vào tập tin
outFile.put(CH[i]);
outFile<<“ ”;//Ghi ký tự xuống dòng để phân biệt hàng họ tên và tuổi trong tập tin
cout<<“Nhap vao tuoi ban: “;
cin>>tuoi;
outFile<<tuoi;//Cách ghi dữ liệu bất kỳ bằng toán tử << vào tập tin
cout<<“Da ghi tap tin thanh cong ”;
outFile.close();
}
//Chương trình đọc tập tin
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); //Đọc chuỗi họ tên
inFile.get(age); //Đọc tuổi
cout<<“ Ten cua ban: “<<Ten<<endl; //Xuất dữ liệu lên màn hình
cout<<“Tuoi ban: “<<age;
inFile.close();
}
getch();
}
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
INPUT OUTPUT
6 6 la so chan
7 7 la so le
#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;}
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
INPUT OUTPUT
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;    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.INP Cau3.OUT
6
9
15
54
#include <iostream>#include <fstream>using namespace std;int main(){    ifstream fin;    ofstream fout;    int a, b, Tong = 0, Tich = 0;    fin.open("Cau3.INP",ios::in);    fout.open("Cau3.OUT",ios::out); //Tu dong tao file moi neu chua co    if(fin.fail())    {        fout<<"Khong mo duoc tep";    }    else    {        fin>>a;        fin>>b;        Tong=a+b;        Tich=a*b;    }    fin.close();    fout<<Tong<<endl;    fout<<Tich;    fout.close();    return 0;}
Câu 4. Đọc dãy số từ tệp vào mảng.

Câu 4. Cho tệp Cau4.INP dòng một chứa ba số nguyên a, b, n cách nhau ít nhất một dấu cách; dòng hai chứa một dãy số gồm n phần tử (n số) cách nhau ít nhất một dấu cách. Tính tích a và b; Tính tổng giá trị các phần tử của dãy số đã cho.

Dữ liệu vào (Cau4.INP)

Dữ liệu ra (Cau4.OUT)

Ghi chú

6 9 5

5 6 8 9 7

54

35

 

8 7 10

5 6 8 9 7 2 6 7 9 10

56

69

 

#include <iostream>#include <fstream>using namespace std;int main(){    int a,b, n;    int i=0;    int day[100];    int tong=0;    ifstream fin;    ofstream fout;    fin.open("Cau2.INP",ios::in);    fout.open("Cau2.OUT",ios::out);    if(fin.fail())    {        fout<<"Loi doc tep";    }    else    {        fin>>a;        fin>>b;        fin>>n;        for(i=0; i<n; i++)        {            fin>>day[i];        }    }    int tich= a*b;    fout<<tich<<endl;    for(i=0; i<n; i++)    {        tong=tong+day[i];    }    fout<<tong;    fin.close();    fout.close();    return 0;}

6. Chủ đề 6. Mảng 2 chiều (Ma trận)


7. Chủ đề 7. Luyện tập-Giải đề chuyên.
- Làm quen với đề các năm
 

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

Tổng số điểm của bài viết là: 1 trong 1 đánh giá

Xếp hạng: 1 - 1 phiếu bầu
Click để đánh giá bài viết
Thống kê
  • Đang truy cập19
  • Hôm nay3,788
  • Tháng hiện tại69,712
  • Tổng lượt truy cập1,895,457
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