
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])

