i th c hành s 7:
K thu t x u ký t (chu i)
A. M c tiêu
N m v ngc ki ni m xâu ký t
N m v ng m t s k thu t x c b n trênu ký t ơ
Rèn luy n cách g i hàm, truy n tham s .
B. Ôn t p:
pháp đ nh nghĩa bi n xâu ký t , ki u xâu ký t ế
c thao tác c b n tn xâutơ
c k thu t x lý xâu ký t
1. 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 t :
typedef char Chuoi[KT];
Khi đó, Chuoi tr thành m t ki u d li u, 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, bc bi n xâu ký t , có không quá MAX ký tế
3. c thao tác c b n:ơ
V i khai o xâu ký t nh sau: ư
char a[MAX]; //MAX là gtr 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 kng ch a ký t tách (kho ng tr ng, tab, ...)
ho c:
gets(a); //a 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 tc b ng ký t NULL. ế
N u ta dùngch nh p nh m ng 1 chi u tng th ng (liên k t 1 vòng for): ế ư ườ ế
for (int i = 0; i < n; i++)
cin>>a[i];
Khi đó a ch m ng 1 chi u n ký t khác NULL, ch không ph i u
t . Đ a tr thành m t bi n xâu t ch a n 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
t đ u tiên c a xâu a bao gi cũng t ng ng v i ch s 0 (Kng thay đ i): ươ
a[0] : t đ u tiên c a a
N u a là xâu r ng t: a[0] == NULLế
N u xâu ký t a có chi u 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 tc xâu là NULL ế
ch ng h n:
for(int i = 0; a[i] != NULL; i++)
//x lý a[i]
5. M t s m thao tác trên xâu ký t
Tên hàm Ch c năngCá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 thao tác trên xâu 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 cp xâu ký t a sang xâu ký t b.
2. Chèn m t ký t 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âut . ế
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])