Tải bản đầy đủ (.doc) (8 trang)

Bài thực hành số 7: Kỹ thuật xử lý xâu ký tự (chuỗi) pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (105.8 KB, 8 trang )

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.

×