Bước tới nội dung

Tin học 10: C++/Bài 21

Tủ sách mở Wikibooks
Bảng bài tập về chuỗi kí tự
Thứ tự bài Nội dung bài
Bài tập 1 Kiểm tra chuỗi đối xứng
Bài tập 2 Chuẩn hóa tên riêng
Bài tập 3 Loại bỏ dấu cách có trong chuỗi kí tự
Bài tập 4 Đếm số lượng kí tự viết hoa và viết thường trong chuỗi
Bài tập 5 Tính tổng các chữ số của một số

Bài tập 1

[sửa]

Mô tả bài toán: Một chuỗi được gọi là chuỗi đối xứng nếu viết xuôi từ trái sang phải hay viết ngược từ phải sang trái đều giống nhau. Ví dụ, chuỗi "abcba" là chuỗi xứng, còn "abcd" thì không. Hãy viết chương trình kiểm tra xem một chuỗi có phải là chuỗi đối xứng hay không.

Cách 1

[sửa]

Cách làm: Duyệt ngược chuỗi ban đầu để tạo ra chuỗi mới. Sau đó so sánh chuỗi mới và chuỗi ban đầu. Nếu giống nhau thì là nó chuỗi đối xứng, ngược lại là không.

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s1, s2;
    cout << "Nhap chuoi: ";
    getline(cin, s1);
    
    for (int i = s1.size() - 1; i >= 0; i--) 
        s2 += s1[i];
    
    if (s1 == s2) cout << "Doi xung";
    else cout << "Khong doi xung";
    
    return 0;
}

Cách 2

[sửa]

Duyệt từng kí trong chuỗi ban đầu và so sánh nó với kí tự đối xứng. Nếu có 1 cặp kí tự không giống nhau thì kết luận là không đối xứng, ngược lại là có. Đây là cách thường dùng nhất khi kiểm tra chuỗi đối xứng.

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s; bool check = true;
    cout << "Nhap chuoi: ";
    getline(cin, s);
    
    int len = s.size() // Lưu trữ độ dài chuỗi
    for (int i = 0; i < len; i++)
        if (s[i] != s[len-1 - i]) {
            check = false; break;
        }
    
    if (check) cout << "Doi xung";
    else cout << "Khong doi xung";
    
    return 0;
}

Bài tập 2

[sửa]

Mô tả bài toán: Quy tắc khi viết một tên riêng (tên người, địa danh) thì phải viết hoa tất cả chữ cái đầu. Cho một tên riêng chưa được chuẩn hóa, hãy viết chương trình chuẩn hóa tên riêng đó theo quy tắc trên. Ví dụ:

  • "nGUYEN vAN aN" chuẩn hóa thành "Nguyen Van An"
  • "BA RiA vUng tau" chuẩn hóa thành "Ba Ria Vung Tau"
  • "ly thai to" chuẩn hóa thành "Ly Thai To"

Cách 1

[sửa]
Về mặt thuật toán: Duyệt tất cả kí tự của chuỗi. Với kí tự đầu tiên và kí tự đứng sau dấu cách thì viết hoa, ngược lại thì viết thường.
Về mặt kĩ thuật: Sử dụng hàm toupper và tolower được xây dựng sẵn trong thư viện cctype để có thể chuyển kí tự thành in hoa hoặc thường.
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main() {
    string s; getline(cin, s);
    s[0] = toupper(s[0]);
    for (int i = 1; i < s.size(); i++) {
        if (s[i-1] == ' ') s[i] = toupper(s[i]);
        else s[i] = tolower(s[i]);
    }
    cout << s;
    
    return 0
}

Cách 2

[sửa]
Về mặt thuật toán: Duyệt tất cả kí tự của chuỗi. Với kí tự đầu tiên và kí tự đứng sau dấu cách, nếu viết chưa viết hoa thì chuyển thành viết hoa. Với các kí tự ở vị trí còn lại, nếu viết hoa thì chuyển thành viết thường.
Về mặt kĩ thuật: Không sử dụng thư viện cctype.
#include <iostream>
#include <string>
using namespace std;
int main() {
    string s; getline(cin, s);
    int d = 'a' - 'A'; // Khoảng cách giữa hai kí tự hoa và thường
    if (s[0] >= 'a') s[0] -= d;
    for (int i = 1; i < s.size(); i++) {
        if (s[i] == ' ') continue;
        if (s[i-1] == ' ') { if (s[i] >= 'a') s[i] -= d; }
        else { if (s[i] < 'a') s[i] += d; }
    }
    cout << s;

    return 0;
}

Bài tập 3

[sửa]

Mô tả bài toán: Cho một chuỗi ban đầu. In ra chuỗi mới là chuỗi ban đầu sau khi loại bỏ hết kí tự cách. Ví dụ: chuỗi "Ngon ngu lap trinh" sau khi loại bỏ hết dấu cách sẽ là "Ngonngulaptrinh".

Bài tập 4

[sửa]

Bài tập 5

[sửa]