Bài tập C++ có lời giải – 500 bài tập c++ có lời giải – phptravels.vn

Danh sách các dạng bài tập C++ có lời giải. Bài tập C++ cơ bản, bài tập vòng lặp C++, bài tập mảng trong C++, bài tập Chuỗi trong C++, …

Bạn đang xem: 500 bài tập c++ có lời giải

Các cấp độ bài tập C++

Bài này cung cấp cho bạn danh sách các bài tập C++ có lời giải ở các cấp độ như sau:

  1. Bài tập C++ kinh điển.
  2. Bài tập C++ cơ bản.
  3. Bài tập C++ nâng cao.

1. Bài tập C++ kinh điển

Bài 01: Viết một chương trình C++ in ra dãy số Fibonacci

Gợi ý:

  • Sử dụng đệ quy
  • Không sử dụng đệ quy

Code mẫu: In dãy số Fibonacci trong C++ không sử dụng đệ quy.

/**
 * Tinh day so Fibonacci KHONG dung phuong phap de quy
 *  
 * @author viettuts.vn
 */

#include <iostream>
 
using namespace std;

/**
 * Tinh so Fibonacci thu n
 * 
 * @param n: chi so cua so Fibonacci tinh tu 0 
 *           vd: F0 = 0, F1 = 1, F2 = 1, F3 = 2
 * @return So Fibonacci thu n
 */
int fibonacci(int n) {
    int f0 = 0;
    int f1 = 1;
    int fn = 1;
    int i;

    if (n < 0) {
        return -1;
    } else if (n == 0 || n == 1) {
        return n;
    } else {
        for (i = 2; i < n; i++) {
            f0 = f1;
            f1 = fn;
            fn = f0 + f1;
        }
    }
    return fn;
}

/**
 * Ham main
 */
int main() {
 int i;
    cout << "10 so dau tien cua day so Fibonacci: n";
    for (i = 0; i < 10; i++) {
        cout << fibonacci(i) << " ";
    }
}

Kết quả:

10 so dau tien cua day so Fibonacci: 
0 1 1 2 3 5 8 13 21 34 

Bài 02: Viết một chương tình C++ kiểm tra số nguyên tố.

Code mẫu:

#include <iostream>
#include <cmath>

using namespace std;
 
/**
 * check so nguyen to trong C++
 * 
 * @author viettuts.vn
 * @param n: so nguyen duong
 * @return 1 la so nguyen so, 
 *         0 khong la so nguyen to
 */
int isPrimeNumber(int n) {
    // so nguyen n < 2 khong phai la so nguyen to
    if (n < 2) {
        return 0;
    }
    // check so nguyen to khi n >= 2
    int squareRoot = (int) sqrt(n);
    int i;
    for (i = 2; i <= squareRoot; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

/**
 * Ham main
 */
int main() {
 int i;
    cout << "Cac so nguyen to nho hon 100 la: n";
    for (i = 0; i < 100; i++) {
        if (isPrimeNumber(i)) {
            cout << i << " ";
        }
    }
}

Kết quả:

Cac so nguyen to nho hon 100 la: 
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

Bài 03: Viết một chương trình C++ tính giai thừa của một số bằng cách không sử dụng đệ quy và có sử dụng đệ quy.

Gợi ý:

  • Sử dụng đệ quy
  • Không sử dụng đệ quy

Code mẫu: Tính giai thừa trong C++ không sử dụng đệ quy.

/**
 * Tinh giai thua KHONG dung phuong phap de quy
 *  
 * @author viettuts.vn
 */

#include <iostream>
 
using namespace std;

/**
 * tinh giai thua
 * 
 * @author viettuts.vn
 * @param n: so nguyen duong
 * @return giai thua cua so n
 */
long tinhGiaithua(int n) {
 int i;
    long giai_thua = 1;
    if (n == 0 || n == 1) {
        return giai_thua;
    } else {
        for (i = 2; i <= n; i++) {
            giai_thua *= i;
        }
        return giai_thua;
    }
}

/**
 * Ham main
 */
int main() {
    int a = 5;
    int b = 0;
    int c = 10;
    cout << "Giai thua cua " <<  a << "la: " << tinhGiaithua(a) << endl;
    cout << "Giai thua cua " <<  b << "la: " << tinhGiaithua(b) << endl;
    cout << "Giai thua cua " <<  c << "la: " << tinhGiaithua(c) << endl;
}

Kết quả:

Giai thua cua 5  la: 120
Giai thua cua 0  la: 1
Giai thua cua 10  la: 3628800

Bài 04: Viết một chương trình C++ để chuyển đổi số nguyên N sang hệ cơ số B (2 <= B <= 32) bất kỳ.

Code mẫu: Chuyển đối hệ cơ số 10 sang hệ cơ số B

/**
 * Chuong trinh chuyen doi he co so trong C
 * Bai tap nay su dung bang ASCII de chuyen doi so nguyen thanh kieu ky tu
 * Link tham khao: https://vi.wikipedia.org/wiki/ASCII
 *  
 * @author viettuts.vn
 */

#include <iostream>
 
using namespace std;

const char CHAR_55 = 55;
const char CHAR_48 = 48;

/**
 * chuyen doi so nguyen n sang he co so b
 * 
 * @author viettuts.vn
 * @param n: so nguyen
 * @param b: he co so
 */
int convertNumber(int n, int b) {
    if (n < 0 || b < 2 || b > 16 ) {
        printf("He co so hoac gia tri chuyen doi khong hop le!");
        return 0;
    }
    int i;
    char arr[20];
    int count = 0;
    int m;
    int remainder = n;
    while (remainder > 0) {
        if (b > 10) {
            m = remainder % b;
            if (m >= 10) {
                arr[count] = (char) (m + CHAR_55);
                count++;
            } else {
                arr[count] = (char) (m + CHAR_48);
                count++;
            }
        } else {
            arr[count] = (char) ((remainder % b) + CHAR_48);
            count++;
        }
        remainder = remainder / b;
    }
    // hien thi he co so
    for (i = count - 1; i >= 0; i--) {
        printf("%c", arr[i]);
    }
    return 1;
}

/**
 * Ham main
 */
int main() {
    int n = 12;
    printf("So %d trong he co so 2 = ", n);
    convertNumber(n, 2);
    printf("nSo %d trong he co so 16 = ", n);
 convertNumber(n, 16);
    return 1;
}

Kết quả:

So 12 trong he co so 2 = 1100
So 12 trong he co so 16 = C

2. Bài tập C++ cơ bản

Danh sách bài tập:

  1. Viết chương trình C++ giải phương trình bậc 2: ax2 + bx + c = 0.
  2. Viết chương trình C++ tìm ước số chung lớn nhất (UCLN) và bội số chung nhỏ nhất (BCNN) của hai số a và b.
  3. Viết chương trình C++ liệt kê tất cả các số nguyên tố nhỏ hơn n.
  4. Viết chương trình C++ liệt kê n số nguyên tố đầu tiên.
  5. Viết chương trình C++ liệt kê tất cả các số nguyên tố có 5 chữ số.
  6. Viết chương trình C++ phân tích số nguyên n thành các thừa số nguyên tố. Ví dụ: 12 = 2 x 2 x 3.
  7. Viết chương trình C++ tính tổng các chữ số của một số nguyên n. Ví dụ: 1234 = 1 + 2 + 3 + 4 = 10.
  8. Viết chương trình C++ tìm các số thuận nghịch có 6 chữ số. Một số được gọi là số thuận nghịch nếu ta đọc từ trái sang phải hay từ phải sang trái số đó ta vẫn nhận được một số giống nhau. Ví dụ 123321 là một số thuận nghịch.
  9. Nhập số tự nhiên n. Hãy liệt kê các số Fibonacci nhỏ hơn n là số nguyên tố.
  10. Dãy số Fibonacci được định nghĩa như sau: F0 = 0, F1 = 1, F2 = 1, Fn = F(n-1) + F(n-2) với n >= 2. Ví dụ: 0, 1, 1, 2, 3, 5, 8, … Hãy viết chương trình tìm số Fibonacci thứ n.

Bài 01: Viết chương trình C++ giải phương trình bậc 2: ax2 + bx + c = 0.

Code mẫu:

#include <iostream>
#include <cmath>
 
using namespace std;
 
/**
 * giai phuong trinh bac 2: ax2 + bx + c = 0
 * 
 * @param a: he so bac 2
 * @param b: he so bac 1
 * @param c: so hang tu do
 */
void giaiPTBac2(float a, float b, float c) {
    // kiem tra cac he so
    if (a == 0) {
        if (b == 0) {
            printf("Phuong trinh vo nghiem!");
        } else {
            printf("Phuong trinh co mot nghiem: x = %f", (-c / b));
        }
        return;
    }
    // tinh delta
    float delta = b*b - 4*a*c;
    float x1;
    float x2;
    // tinh nghiem
    if (delta > 0) {
        x1 = (float) ((-b + sqrt(delta)) / (2*a));
        x2 = (float) ((-b - sqrt(delta)) / (2*a));
        printf("Phuong trinh co 2 nghiem la: x1 = %f va x2 = %f", x1, x2);
    } else if (delta == 0) {
        x1 = (-b / (2 * a));
        printf("Phong trinh co nghiem kep: x1 = x2 = %f", x1);
    } else {
        printf("Phuong trinh vo nghiem!");
    }
}

/**
 * ham main
 */
int main() {
 float a, b, c;
    cout << "Nhap he so bac 2, a = ";
    cin >> a;
    cout << "Nhap he so bac 1, b = ";
    cin >> b;
    cout << "Nhap so hang tu do, c = ";
    cin >> c;
    giaiPTBac2(a, b, c);
    return 1;
}

Kết quả:

Nhap he so bac 2, a = 2
Nhap he so bac 1, b = 3
Nhap so hang tu do, c = 1
Phuong trinh co 2 nghiem la: x1 = -0.500000 va x2 = -1.000000

Bài 02: Viết chương trình C++ tìm ước số chung lớn nhất (USCLN) và bội số chung nhỏ nhất (BCSNN) của hai số a và b.

Gợi ý:

  • Sử dụng giải thuật Euclid

Code mẫu:

/**
 * Chuong trinh tim uoc chung lon nhat (USCLN)
 * va boi so chung nho nhat (BSCNN) cua 2 so a và b
 * 
 * @author viettuts.vn
 */
 
#include <iostream>
 
using namespace std;

/**
 * Tim uoc so chung lon nhat (USCLN)
 */
int USCLN(int a, int b) {
    if (b == 0) return a;
    return USCLN(b, a % b);
}

/**
 * Tim boi so chung nho nhat (BSCNN)
 */
int BSCNN(int a, int b) {
    return (a * b) / USCLN(a, b);
}

/**
 * Ham main
 */
int main() {
 int a, b;
    cout << "Nhap so nguyen duong a = ";
    cin >> a;
    cout << "Nhap so nguyen duong b = ";
    cin >> b;
    // tinh USCLN cua a và b
    printf("USCLN cua %d va %d la: %d, ", a, b, USCLN(a, b));
    // tinh BSCNN cua a và b
    printf("BSCNN cua %d va %d la: %d", a, b, BSCNN(a, b));
}

Kết quả:

Nhap so nguyen duong a = 4
Nhap so nguyen duong b = 6
USCLN cua 4 va 6 la: 2, BSCNN cua 4 va 6 la: 12

Bài 03: Viết chương trình C++ liệt kê tất cả các số nguyên tố nhỏ hơn n.

Code mẫu:

/**
 * Chuong liet ke cac so nguyen to nho hon n.
 * 
 * @author viettuts.vn
 */
 
#include <iostream>
#include <cmath>
 
using namespace std;

/**
 * check so nguyen to
 * 
 * @author viettuts.vn
 * @param n: so nguyen duong
 * @return 1: la so nguyen so, 
 *         0: khong la so nguyen to
 */
int isPrimeNumber(int n) {
    // so nguyen n < 2 khong phai la so nguyen to
    if (n < 2) {
        return 0;
    }
    // check so nguyen to khi n >= 2
    int i;
    int squareRoot = (int) sqrt(n);
    for (i = 2; i <= squareRoot; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

/**
 * Ham main
 */
int main() {
 int i, n;
    cout << "Nhap n = ";
    cin >> n;
    printf("Tat ca cac so nguyen to nho hon %d la: n", n);
    if (n >= 2) {
        printf("%d ", 2);
    }
    for (i = 3; i < n; i+=2) {
        if (isPrimeNumber(i) == 1) {
            printf("%d ", i);
        }
    }
}

Kết quả:

Nhập n = 100
Tat ca cac so nguyen to nho hon 100 la: 
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

Bài 04: Viết chương trình C++ liệt kê n số nguyên tố đầu tiên.

Code mẫu:

/**
 * Chuong trinh liet ke n so nguyen to dau tien.
 * 
 * @author viettuts.vn
 */
 
#include <iostream>
#include <cmath>

using namespace std;

/**
 * check so nguyen to
 * 
 * @author viettuts.vn
 * @param n: so nguyen duong
 * @return 1: la so nguyen so, 
 *         0: khong la so nguyen to
 */
int isPrimeNumber(int n) {
    // so nguyen n < 2 khong phai la so nguyen to
    if (n < 2) {
        return 0;
    }
    // check so nguyen to khi n >= 2
    int i;
    int squareRoot = sqrt(n);
    for (i = 2; i <= squareRoot; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

/**
 * Ham main
 */
int main() {
 int n;
    cout << "Nhap n = ";
    cin >> n;
    printf("%d so nguyen to dau tien la: n", n);
    int dem = 0; // dem tong so nguyen to
    int i = 2;   // tim so nguyen to bat dau tu so 2
    while (dem < n) {
        if (isPrimeNumber(i)) {
            printf("%d ", i);
            dem++;
        }
        i++;
    }
}

Kết quả:

Nhập n = 10
10 so nguyen to dau tien la: 
2 3 5 7 11 13 17 19 23 29 

Bài 05: Viết chương trình C++ liệt kê tất cả các số nguyên tố có 5 chữ số.

Code mẫu:

/**
 * Chuong trinh liet ke tat ca so nguyen to co 5 chu so.
 * 
 * @author viettuts.vn
 */
 
#include <iostream>
#include <cmath>

using namespace std;

/**
 * check so nguyen to
 * 
 * @author viettuts.vn
 * @param n: so nguyen duong
 * @return 1: la so nguyen so, 
 *         0: khong la so nguyen to
 */
int isPrimeNumber(int n) {
    // so nguyen n < 2 khong phai la so nguyen to
    if (n < 2) {
        return 0;
    }
    // check so nguyen to khi n >= 2
    int i;
    int squareRoot = (int) sqrt(n);
    for (i = 2; i <= squareRoot; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

/**
 * Ham main
 */
int main() {
    int count = 0;
    int i;
    cout << "Liet ke tat ca cac so co 5 chu so:";
    for (i = 10001; i < 99999; i+=2) {
        if (isPrimeNumber(i)) {
            printf("%dn", i);
            count++;
        }
    }
    printf("Tong cac so nguyen to co 5 chu so la: %d", count);
}

Kết quả:

Liet ke tat ca cac so co 5 chu so:
10007
10009
10037
...
99971
99989
99991
Tong cac so nguyen to co 5 chu so la: 8363

Bài 06: Viết chương trình C++ phân tích số nguyên n thành các thừa số nguyên tố. Ví dụ: 12 = 2 x 2 x 3.

Code mẫu:

/**
 * Chuong trinh phan tich so nguyen n thanh tich cac thua so nguyen to
 * Vi du: 12 = 2 x 2 x 3.
 * 
 * @author viettuts.vn
 */
#include <iostream>
#include <cmath>

using namespace std;

/**
 * Phan tich so nguyen n thanh tich cac thua so nguyen to
 */
void phanTichSoNguyen(int n) {
    int i = 2;
    int dem = 0;
    int a[100];
    // phan tich
    while (n > 1) {
        if (n % i == 0) {
            n = n / i;
            a[dem++] = i;
        } else {
            i++;
        }
    }
    // neu dem = 0 thi n la nguyen to
    if (dem == 0) {
        a[dem++] = n;
    }
    // in ket qua ra man hinh
    for (i = 0; i < dem - 1; i++) {
        printf("%d x ", a[i]);
    }
    printf("%d", a[dem - 1]);
}

/**
 * Ham main
 */
int main() {
 int n;
    cout << "Nhap so nguyen duong n = ";
    cin >> n;
    // phan tich so nguyen duong n
    phanTichSoNguyen(n);
}

Kết quả:

Nhap so nguyen duong n = 120
2 x 2 x 2 x 3 x 5

Bài 07: Viết chương trình C++ tính tổng các chữ số của một số nguyên n. Ví dụ: 1234 = 1 + 2 + 3 + 4 = 10.

Code mẫu:

#include <iostream>

using namespace std;
 
const int DEC_10 = 10;

/**
 * Tinh tong cac chu so cua mot so nguyen duong
 */
int totalDigitsOfNumber(int n) {
    int total = 0;
    do {
        total = total + n % DEC_10;
        n = n / DEC_10;
    } while (n > 0);
    return total;
}

/**
 * Ham main
 */
int main() {
 int n;
    cout << "Nhap so nguyen duong n = ";
    cin >> n;
    printf("Tong cac chu so cua %d la: %d", n, totalDigitsOfNumber(n));
}

Kết quả:

Nhap so nguyen duong n = 1234
Tong cac chu so cua 1234 la: 10

Bài 08: Viết chương trình C++ tìm các số thuận nghịch có 6 chữ số. Một số được gọi là số thuận nghịch nếu ta đọc từ trái sang phải hay từ phải sang trái số đó ta vẫn nhận được một số giống nhau. Ví dụ 123321 là một số thuận nghịch.

Code mẫu:

/**
 * Chuong trình liet ke tat ca cac so thuan nghich co 6 chu so
 * 
 * @author viettuts.vn
 */
#include <iostream>

using namespace std;
    
const int DEC_10 = 10;

/**
 * kiem tra so thuan nghich
 * 
 * @param n: so nguyen duong
 * @return 1: la so thuan nghich
 *         0: khong la so thuan nghich
 */
int isThuanNghich(int n) {
    int a[20];
    int dem = 0, i;
    // phan tich n thanh mang cac chu so
    do {
        a[dem++] = (n % DEC_10);
        n = n / DEC_10;
    } while (n > 0);
    // kiem tra tinh thuan nghich
    for (i = 0; i < (dem/2); i++) {
        if (a[i] != a[(dem - i - 1)]) {
            return 0;
        }
    }
    return 1;
}

/**
 * main
 * 
 * @param args
 */
int main() {
    int count = 0, i;
    // in ra man hinh cac so thuan nghich co 6 chu so
    for (i = 100000; i < 1000000; i++) {
        if (isThuanNghich(i)) {
            printf("%dn", i);
            count++;
        }
    }
    printf("Tong cac so thuan nghich co 6 chu so la: %d", count);
}

Kết quả:

100001
101101
102201
...
997799
998899
999999
Tong cac so thuan nghich co 6 chu so la: 900

Bài 09: Nhập số tự nhiên n. Hãy liệt kê các số Fibonacci nhỏ hơn n là số nguyên tố.

Code mẫu:

/**
 *  Chuong trinh liet ke cac so Fibonacci nho hon n la so nguyen to.
 *  
 * @author viettuts.vn
 */
#include <iostream>
#include <cmath>

using namespace std;
/**
 * Tinh so fibonacci thu n
 * 
 * @param n: chi so cua day fibonacci tinh tu 0
 *           vd: F0 = 0, F1 = 1, F2 = 1, F3 = 2
 * @return so fibonacci thu n
 */
int fibonacci(int n) {
    if (n < 0) {
        return -1;
    } else if (n == 0 || n == 1) {
        return n;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

/**
 * check so nguyen to
 * 
 * @author viettuts.vn
 * @param n: so nguyen duong
 * @return 1: la so nguyen so, 
 *         0: khong la so nguyen to
 */
int isPrimeNumber(int n) {
    // so nguyen n < 2 khong phai la so nguyen to
    if (n < 2) {
        return 0;
    }
    // check so nguyen to khi n >= 2
    int i;
    int squareRoot = sqrt(n);
    for (i = 2; i <= squareRoot; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

/**
 * Ham main
 */
int main() {
 int n;
    cout << "Nhap so nguyen duong = ";
    cin >> n;
    printf("Cac so fibonacci nho hon %d va la so nguyen to: ", n);
    int i = 0;
    while (fibonacci(i) < n) {
        int fi = fibonacci(i);
        if (isPrimeNumber(fi)) {
            printf("%d ", fi);
        }
        i++;
    }
}

Kết quả:

Nhap so nguyen duong = 100
Cac so fibonacci nho hon 100 va la so nguyen to: 2 3 5 13 89

3. Bài tập vòng lặp trong C++

Bài này tổng hợp các bài tập vòng lặp trong C++ giúp bạn làm quen cú pháp và cách sử dụng của các vòng lặp C++ cơ bản: vòng lặp for , vòng lặp while, vòng lặp do-while và vòng lặp lồng nhau.

4. Bài tập mảng trong C++

Mảng là một tập hợp dữ liệu có cùng kiểu. Mảng trong C++ là một cấu trúc dữ liệu cơ bản và quan trọng.

Trong chương này, chúng ta sẽ tìm hiểu các bài tập và các chương trình C++ liên quan tới mảng, từ chương trình đơn giản nhất để in mảng, tính tổng giá trị các phần tử trong mảng, v,v. cho đến các bài tập liên quan đến nhiều mảng trong C++.

Sau đây là danh sách bài tập mảng 1 chiều trong C++:

Dưới đây là các bài tập C giúp bạn hiểu kiến thức cơ bản về Mảng 2 chiều trong C++

5. Bài tập chuỗi trong C++

Chuỗi (String) trong C/C++ là một mảng ký tự được kết thúc bởi (ký tự null).

Dưới đây là các bài tập C sử dụng hàm và không sử dụng hàm giúp bạn hiểu kiến thức cơ bản nhất về chuỗi. Các chương trình này xử lý các chuỗi dưới dạng như là một mảng các ký tự.

6. Bài tập quản lý sinh viên trong C/C++

Đề bài: Viết chương trình quản lý sinh viên trong C/C++. Mỗi đối tượng sinh viên có các thuộc tính sau: id, tên, giới tính, tuổi, điểm toán, điểm lý, điểm hóa, điểm trung bình và học lực.

Id là mã sinh viên tự động tăng.

Khi khởi tạo, chương trình sẽ đọc file “student.txt” để lấy ra danh sách sinh viên đã được lưu trước đó.

Điểm trung bình là giá trị trung bình của 3 môn toán, lý và hóa.

Học lực được tính như sau:

  • Giỏi: nếu điểm trung bình lớn hơn hoặc bằng 8.
  • Khá: nếu điểm trung bình nhỏ hơn 8 và lớn hơn hoặc bằng 6.5.
  • Trung Bình: nếu điểm trung bình nhỏ hơn 6.5 và lớn hơn hoặc bằng 5.
  • Yếu: nếu điểm trung bình nhỏ hơn 5.

Yêu cầu: tạo ra một menu với các chức năng sau:

  • 1. Thêm sinh viên.
  • 2. Cập nhật thông tin sinh viên bởi ID.
  • 3. Xóa sinh viên bởi ID.
  • 4. Tìm kiếm sinh viên theo tên.
  • 5. Sắp xếp sinh viên theo điểm trung bình (GPA).
  • 6. Sắp xếp sinh viên theo tên.
  • 7. Hiển thị danh sách sinh vien.
  • 8. Ghi danh sách sinh viên vào file “student.txt” .

Sau đây là lời giải bài tập quản lý sinh viên trong C/C++: