Bài thực hành số 7: Kỹ thuật xử lý xâu ký tự (chuỗi) A. Mục tiêu Nắm vững các khái niệm xâu ký tự Nắm vững một số kỹ thuật xử lý cơ bản trên xâu ký tự Rèn luyện cách gọi hàm, truyền tham số. B. Ôn tập: Cú pháp định nghĩa biến xâu ký tự, kiểu xâu ký tự Các thao tác cơ bản trên xâu ký tự Các kỹ thuật xử lý xâu ký tự 1. Cú pháp khai báo (định nghĩa) biến mảng 1 chiều char Ten_Chuoi[KT]; hoặc: wchar Ten_Chuoi[KT]; 2. Kiểu xâu ký tự : typedef char Chuoi[KT]; Khi đó, Chuoi trở thành một kiểu dữ liệu, là kiểu xâu ký tự, ta có thể khai báo các biến thuộc kiểu này. Chuoi a, b; // a, b là các biến xâu ký tự, có không quá MAX ký tự 3. Các thao tác cơ bản: Với khai báo xâu ký tự như sau: char a[MAX]; //MAX là giá trị hằng đã định nghĩa trước a. Nhậpdữ liệu cho a: Sử dụng các cách sau: cin>>a; //Khi đó a không chứa ký tự tách (khoảng trắng, tab, ) hoặc: gets(a); //a có thể chứa khoảng trắng Lưu ý: • Đối với các cách trên, khi kết thúc việc nhập (nhấn Enter), trình biên dịch sẽ tự động thêm ký tự NULL vao cuối xâu. • Một xâu ký tự bao giờ cũng kết thúc bằng ký tự NULL. Nếu ta dùng cách nhập như mảng 1 chiều thông thường (liên kết 1 vòng for): for (int i = 0; i < n; i++) cin>>a[i]; Khi đó a chỉ là mảng 1 chiều có n ký tự khác NULL, chứ không phải là xâu ký tự. Để a trở thành một biến xâu ký tự chứa n ký tự khác NULL, ta cần thêm NULL vào ký tự cuối cùng, tức là : a[n] = NULL; //’\0’ • Ký tự đầu tiên của xâu a bao giờ cũng tương ứng với chỉ số 0 (Không thay đổi): a[0] : Ký tự đầu tiên của a Nếu a là xâu rổng thì: a[0] == NULL • Nếu xâu ký tự a có chiều dài l (số lượng ký tự khác NULL trong a là l), thì: a[l] == NULL b. Xuất dữ liệu của a: cout<<a; 4. Duyệt xâu ký tự: Tín hiệu kết thúc xâu là NULL chẳng hạn: for(int i = 0; a[i] != NULL; i++) //xử lý a[i] 5. Một số hàm thao tác trên xâu ký tự Tên hàm Chức năng Cách sử dụng Thư viện gets Nhập dữ liệu xâu a gets(a) stdio.h _getch Nhận trực tiếp 1 ký tự từ bàn phím (không hiển thị ra màn hình), trả về ký tự đó _getch(); char Kt = _getch(); conio.h _flushall làm rổng vùng đệm _flushall(); int t = _flushall; stdio.h Một số hàm khác (xem lab 9) . . . C. Luyện tập: Ví dụ1: Viết chương trình thực hiện các thao tác trên xâu ký tự. Yêu cầu của chương trình là: - In ra màn hình menu có các chức năng sau : 1. Xác định chiều dài của xâu. 2. Sao chép xâu ký tự a sang xâu ký tự b. 2. Chèn một ký tự vào một xâu tại vị trí k (đếm từ 0). 4. Đếm số lần xuất hiện của một ký tự cho trước trong 1 xâu ký tự. 5. Hủy ký tự tại vị trí k (đếm từ 0) của một xâu ký tự. 6. Chuyển một xâu ký tự thành xâu ký tự chỉ gồm các ký tự thường. 7. Thóat. - Muốn thực hiện thao tác nào thì chọn chức năng tương ứng của menu. Thực hiện: Bước 1: Tạo Project với tên “Lab7_Vd1”. Bước 2: Tạo tập tin chương trình vd1.cpp Bước 3: Trong tập tin vd1.cpp, soạn code theo cấu trúc: #include <iostream> #include <conio.h> #include <stdio.h> #define MAX 100 using namespace std; //Cac ham menu void Menu(); int ChonMenu(); void XL_Menu(char a[MAX], int Chon); //Cac ham chuc nang int Cd(char a[MAX]); void Copy(char b[MAX], char a[MAX]); void ChenKT(char a[MAX], char Kt, int k); int DemKT(char a[MAX], char Kt); void HuyKT(char a[MAX], int k); void Thuong_Hoa(char a[MAX]); void main() { int Chon; char a[MAX]; cout<<"\nNhap xau a:"; gets(a); do { Chon = ChonMenu(); XL_Menu(a, Chon); } while(1); } void Menu() { cout<<"\n BANG MENU "; cout<<"\n1. Chieu dai xau"; cout<<"\n2. Copy xau"; cout<<"\n3. Chen KT vao vi tri k"; cout<<"\n4. Dem so lan xuat hien KT"; cout<<"\n5. Huy Kt tai vi tri k cua xau: "; cout<<"\n6. Chuyen Xau thuong thanh Hoa"; cout<<"\n7. Thoat khoi chuong trinh!!!"; } int ChonMenu() { int Chon; for(;;) { Menu(); cout<<"\nNhap Chon tu 1 -> 7: "; cin>>Chon; if (1 <= Chon && Chon <= 7) break; } return Chon; } void XL_Menu(char a[MAX], int Chon) { char b[MAX], Kt; int k; switch(Chon) { case 1: _flushall(); cout<<"\n1. Chieu dai xau"; cout<<"\nXau a:\t"<<a; cout<<"\nChieu dai xau a: "<<Cd(a); _getch(); break; case 2: _flushall(); cout<<"\n2. Copy xau: "; cout<<"\nXau a:\t"<<a; Copy(b,a); cout<<"\nXau b:\t"<<b; _getch(); break; case 3: _flushall(); cout<<"\n3. Chen vi tri k cua xau: "; cout<<"\nXau a:\t"<<a; cout<<"\nNhap ky tu can chen: Kt = "; cin>>Kt; cout<<"\nNhap vi tri can chen: k = "; cin>>k; ChenKT(a,Kt,k); cout<<"\nXau ket qua:\t"<<a; _getch(); break; case 4: _flushall(); cout<<"\n4. Dem so lan xuat hien KT"; cout<<"\nXau a:\t"<<a; cout<<"\nNhap ky tu: Kt = "; cin>>Kt; cout<<"\nSo lan ky tu "<<Kt<<" xuat hien trong a: "<<DemKT(a, Kt); _getch(); break; case 5: _flushall(); cout<<"\n5. Huy Kt tai vi tri k cua xau: "; cout<<"\nXau a:\t"<<a; cout<<"\nNhap vi tri can huy: k = "; cin>>k; HuyKT(a,k); cout<<"\nXau ket qua:\t"<<a; _getch(); break; case 6: _flushall(); cout<<"\n6. Chuyen Xau thuong thanh Hoa"; cout<<"\nXau a:\t"<<a; Thuong_Hoa(a); cout<<"\nXau Ket qua:\t"<<a; _getch(); break; case 7: cout<<"\n7. Thoat khoi CT!\n"; exit(1); } } int Cd(char a[MAX]) { int i = 0; while (a[i] != NULL) i++; return i; } void Copy(char b[MAX], char a[MAX]) { int i; for(i = 0; a[i] != NULL; i++) b[i] = a[i]; b[i] = NULL; } void ChenKT(char a[MAX], char Kt, int k) { int i, l; l = Cd(a); if ( k > l || k < 0) { cout<<"\nVi tri chen khong hop le!"; _getch(); return; } else { for(i = l; i >= k; i ) a[i+1] = a[i]; a[k] = Kt; } } int DemKT(char a[MAX], char Kt) { int i, Dem = 0; for(i = 0; a[i] != NULL; i++) if( a[i] == Kt ) Dem++; return Dem; } void HuyKT(char a[MAX], int k) { int i, l; l = Cd(a); if ( k > l || k < 0) { cout<<"\nVi tri huy khong hop le!"; _getch(); return; } else { for(i = k+1; i <= l; i++) a[i-1] = a[i]; } } void Thuong_Hoa(char a[MAX]) { int i; for(i = 0; a[i] != NULL; i++) if ( 'a' <= a[i] && a[i] <= 'z' ) a[i] = a[i] - 32; } Ví dụ 2: Viết chương trình chuyển một xâu ký số thành giá trị số tương ứng i 0 1 2 3 4 l-1 l a[i] ‘\0 Chuoi_So(a) ≡So(a[0]).10 l-1 + So(a[1]).10 l-2 + + So(a[k]).10 l-k-1 + + So(a[l-1]).10 0 Thực hiện: Bước 1: Tạo Project với tên “Lab7_Vd2”. Bước 2: Tạo tập tin chương trình vd2.cpp Bước 3: Trong tập tin vd2.cpp, soạn code theo cấu trúc: #include <iostream> #include <conio.h> #include <stdio.h> #define MAX 100 using namespace std; //Cac ham chuc nang int Cd(char a[MAX]); int Nhap(char a[MAX]); int So(char x); int _10n(int n); int Chuoi_So(char a[MAX]); int main() { char a[MAX]; do Cd(a) _10Mu(n) So(x) Nhap(a) Chuoi_So(a) main() Xuat(a) { if (!Nhap(a)) cout<<"\nNhap ky so khong hop le! Nhap lai"; else break; } while(1); cout<<"\nXau a:\t"<<a; cout<<"\nGia tri so tuong ung: "<<Chuoi_So(a); cout<<'\n'; _getch(); return 0; } int Nhap(char a[MAX]) { int i = 0; cout<<"\nNhap xau cac ky so: "; gets(a); while (a[i]) { if(a[i] < 48 || a[i] > 57) return 0; i++; } return 1; } int Cd(char a[MAX]) { int i = 0; while (a[i] != NULL) i++; return i; } int So(char x) { return x - 48; } int _10n(int n) { int i, T = 1; for(i = 1; i <= n; i++) T *= 10; return T; } int Chuoi_So(char a[MAX]) { int S = 0, i, l; l = Cd(a); for(i = 0; i < l; i++) S += So(a[i])*_10n(l-1-i); return S; } D. Luyện tập: Bài 1: Viết chương trình thực hiện các thao tác trên xâu ký tự. Yêu cầu của chương trình là: - In ra màn hình menu có các chức năng sau : 1. Hủy ký tự cho trước ra khỏi xâu ký tự 2. Nối xâu b vào sau xâu a. 3. Đảo ngược một xâu ký tự. 4. Kiểm tra một xâu ký tự có phải là đối xứng 5. Cắt ký tự đầu của xâu rồi ghép vào cuối xâu đó. 6. So sánh 2 xâu ký tự theo thứ tự từ điển. 7. Thóat. - Muốn thực hiện thao tác nào thì chọn chức năng tương ứng của menu. Bài 2: Ta xem tên là một xâu ký tự bao gồm nhiều từ tách biệt bằng các ký tự trắng. Từ là một dãy liên tiếp các ký tự khác ký tự trắng. Viết chương trình nắn các tên nhập từ bàn phím theo qui cách: • Khử các ký tự trắng ở đầu và cuối của tên. • Khử bớt các dấu cách ở giữa các từ, chỉ để lại một ký tự trắng. • Các chữ cái đầu từ được viết hoa, ngoài ra mọi chữ cái còn lại được viết thường. . Bài thực hành số 7: Kỹ thuật xử lý xâu ký tự (chuỗi) A. Mục tiêu Nắm vững các khái niệm xâu ký tự Nắm vững một số kỹ thuật xử lý cơ bản trên xâu ký tự Rèn luyện cách. dài của xâu. 2. Sao chép xâu ký tự a sang xâu ký tự b. 2. Chèn một ký tự vào một xâu tại vị trí k (đếm từ 0). 4. Đếm số lần xuất hiện của một ký tự cho trước trong 1 xâu ký tự. 5. Hủy ký tự tại. luyện cách gọi hàm, truyền tham số. B. Ôn tập: Cú pháp định nghĩa biến xâu ký tự, kiểu xâu ký tự Các thao tác cơ bản trên xâu ký tự Các kỹ thuật xử lý xâu ký tự 1. Cú pháp khai báo (định nghĩa)