Câc hăm xử lý chuỗi nằm trong thư viện “string.h”. Câc ký tự s viít tắt trong hăm lă chuỗi
1. strcpy(s,t);
Gân nội dung của xđu t cho xđu s (thay cho phĩp gân = không được dùng). Hăm sẽ sao chĩp toăn bộ nội dung của xđu t (kể cả kí tự kết thúc xđu) văo cho
xđu s. Để sử dụng hăm năy cần đảm bảo độ dăi của mảng s ít nhất cũng bằng độ dăi của mảng t. Trong trường hợp ngược lại kí tự kết thúc xđu sẽ khơng được ghi văo s vă điều năy có thể gđy treo mây khi chạy chương trình.
Ví dụ:
char s[10], t[10] ;
t = "Face" ; // không được dùng
s = t; // không được dùng
strcpy(t, "Face"); // được, gân "Face" cho t
strcpy(s, t); // được, sao chĩp t sang s
cout« s « " to " «t; // in ra: Face to Face
2. strcat(s, t);
Nối một bản sao của t văo sau s (thay cho phĩp +). Hiển nhiín hăm sẽ loại bỏ kí tự kết thúc xđu s trước khi nối thím t. Việc nối sẽ đảm bảo lấy cả kí tự kết thúc của xđu t văo cho s (nếu s đủ chỗ) vì vậy ta khơng cần thím kí tự năy văo cuối xđu. Tuy nhiín, hăm khơng kiểm tra xem liệu độ dăi của s có đủ chỗ đế nối thím nội dung, việc kiểm tra năy phải do người dùng đảm nhiệm. Ví dụ: char a[ 100] = "Man", b[4] = "toi";
strcat(a, “ va ”); strcat(a, b);
cout« a // Man vă toi
char s[ 100], t[ 100] = "Steve" ;
stmcpy(s, t, 3); s[3] = '\0'; // s = "Ste" strcat(s, "p"); // s = "Step"
cout«t« " goes "« s « " by " «s // Steve goes Step by Step
3. strcmp(s, t);
Hăm so sânh 2 xđu s vă t (thay cho câc phĩp toân so sânh). Giâ trị trả lại lă hiệu 2 kí tự khâc nhau đầu tiín của s vă t:
nếu sl < s2 : hăm trả lại giâ trị đm, nếu sl=s2 :hăm trả về giâ trọ 0
t
nếu sl > s2:hăm trả về giâ trị dương.
Trong trường hợp chỉ quan tđm đến so sânh bằng, nếu hăm trả lại giâ trị 0 lă 2 xđu bằng nhau vă nếu giâ trị trả lại khâc 0 lă 2 xđu khâc nhau.
Ví dụ:
if (strcmp(s,t)) cout « "s khâc t"; else cout« "s bằng t" ;
4. strcmpi(s, t) ;
Như strcmp(s, t) nhưng khơng phđn biệt chữ hoa, thường. Ví dụ:
char s[] = "Hă Nội", t[] = "hă nội";
cout « strcmpi(s, t); //0 (vì s = t)
5. strupr(s);
Hăm đổi xđu s thănh in hoa, vă cũng trả lại xđu in hoa đó. Ví dụ:
char s[10] = "Ha noi" ; cout« strupr(s); cout« s;
// HA NOI // HA NOI
6. strlwr(s);
Hăm đổi xđu s thănh in thuờng, kết quả trả lại lă xđu s. Ví dụ:
char s[10] = "Ha Nói" ; cout« strlwr(s); cout« s ;
// ha noi // ha noi
7. strlen(s) ;
Hăm trả giâ trị lă độ dăi của xđu s. Ví dụ:
char s[ 10] = "Ha Noi";
cout« strlen(s); //5
Sau đđy lă một số ví dụ sử dụng tổng hợp câc hăm trín.
Vi dụ 1 : Thống kí sổ chữ 'a' xuất hiện trong xđu s.
#include <iostream> using namespace std; int main()
{
const int MAX = 100; char s[MAX+l]; int count = 0; //Nhap chuoi ky tu
cout «"Nhap vao chuoi ky tu: ein.getline(s, MAX+1);
//Dem so ky tu
for (int i=0; i < strlen(s); Ĩ+.+) {
if(s[i] == 'a') count++; //In so ky tu
cout«"So ky tu trong chuoi la:"«count«endl; system("pause");
return 0;
Ket quả:
C:\Windows1
- ;_____________ ____’■ . ',TC„- - ——-
<hap uao chuox ky tu: Cao Dang Cong Nghe Thu Duc
So ktf tu trong chuox la:2
Press any key to continue ...
Ví dụ 2 : Tính độ dăi xđu băng câch đếm từng kí tự (tương đương với hăm
strlenQ) _________________________________________________
#include <iostream> using namespace std; int main()
{ , ........ _
char s[ 100]; // độ dăi tối đa lă 99 kí tự
int i=0;
cin.getline(s, 100); /7 nhập xđu s
for (i=0 ; s[i] != '\0'; i++); // chạy từ đầu đến cuối xđu cout « "Do dai xau = " « i «endl;
system("pause"); return 0;
L7 du 3 : Sao chĩp xđu s sang xđu t (tương đương với hăm strcpy(t,s))
#include <iostream> using namespace std; int main() char s[ 100], t[ 100]; cin.getline(s, 100); // nhập xđu s int i=0;
while <(t[i] = s[i]) != '\0')
i++; // copy cả dấu kết thúc xđu '\0'
cout«t« endl; return 0;
}_______________________________________________________________
Vi dụ 4 : cẳt dấu câch 2 đầu của xđu s.
Chương trình sử dụng biến i chạy từ đầu xđu đến vị trí đầu tiín có kí tự khâc dấu trắng. Từ vị trí năy sao chĩp từng kí tự cịn lại của xđu về đầu xđu bằng câch sử dụng thím biến j để lăm chỉ số cho xđu mới. Kết thúc sao chĩp j sẽ ở vị trí cuối xđu (mới). Cho j chạy ngược về đầu xđu cho đến khi gặp kí tự đầu tiín khâc dấu trắng. Đặt dấu kết thúc xđu tại đđy.
#include <iostream> using namespace std; int main() char s[100]; cin.getline(s, 100); // nhập xđu s int i,j ; i=j=0;
while (s[i++] — ''); i— ; // bỏ qua câc dấu câch đđu tiín while (s[i] != '\0') s[j++í = s[i++] ; // sao chĩp phần còn lại văo s while (s[-j] = ") ; // bỏ qua câc dấu câch cuối
s[j+l] ='\0'; //đặt dấu kết thúc xđu
cout« s ; system("pause"); return 0;
}
Kết quả
V. Con trỏ vă chuỗi
Một con trỏ kí tự có thể xem như một biến xđu kí tự, trong đó xđu chính lă tất cả câc kí tự kể từ byte con trỏ trỏ đến cho đến byte '\0' gặp đầu tiín. Vì vậy ta có thể khai bâo câc xđu dưới dạng con trỏ kí tự như sau.
char *s ;
char *s = "Hello" ;
Câc hăm trín xđu vẫn được sử dụng như khi ta khai bâo nó dưới dạng mảng kí tự. Ngoăi ra khâc với mảng kí tự, ta được phĩp sử dụng phĩp gân cho 2 xđu dưới dạ’ng con trỏ, ví dụ:
char *s, *t = "Tin học"; s = t; // thay cho hăm strcpy(s, t);
Thực chất phĩp gân trín chỉ lă gân 2 con trỏ với nhau, nó cho phĩp s bđy giờ cũng được trỏ đến nơi mă t trỏ (tức dêy kí tự "Tin học" đê bơ trí sẵn trong bộ nhớ)
Khi khai bâo xđu dạng con trỏ nó vẫn chưa có bộ nhớ cụ thể, vì vậy thơng thường kỉm theo khai bâo ta cần phải xin cấp phât bộ nhớ cho xđu với độ dăi cần thiết. Ví dụ:
char *s = new char[30], *t ;
strcpy(s, "Hello") ; // trong trường hợp năy không cần cấp phât bộ
t = s ; // nhớ cho t vì t vă s cùng sử dụng chung vùng nhớ
nhưng:
char *s = new char[30], *t ; strcpy(s, "Hello");
t = new char[30]; // trong trường hợp năy phải cấp bộ nhớ cho t vì strcpy(t, s); // có chỗ để strcpy sao chĩp sang nội dung của s.
Ví dụ : Nhập văo n dịng ký tự vă in ra măn hình.
//Chương trình nhập văo n dịng ký tự vă in ra măn hình #include <iostream>
using namespace std; int mainO
char *dong[100]; int i, n;
cout « "so dong = cin » n ;
cin.ignoreO;
// khai bâo 100 con trỏ kí tự (100 dịng)
// nhập số dịng thực sự
// loại phím Enter trong lệnh cin ở trín for (i=0; i<n; i++)
dong[i] = new char[80]; // cấp bộ nhớ cho dòng i cin.getline(dong[i],80); // nhập dòng i
}
//In câc dịng vừa nhập ■
cout «"Ban vua nhap " « n «"dong sau:"« endl;
for (i=0; i<n; i++) cout « dong[i] « endl; // in kết quả system("pause");
return 0;
Kết quả:
5*^57
■jSO dong = 2
Truong Cao Dang Cong Nghe Thu S3. Uo Uan Ngan.p Linh Chieu. Ban oua nhap 2 do ng sầu:
[Truong Cao Dang Cong Hghe Thu 53. Uo Uan Ngan.p Linh Chieu. (Press ansi key to continue . .
Duc Q Thu Duc Duc Q Thu Duc ► / * c ❖ Tóm tắt chương
J Khai bâo chuỗi lă một mảng câc ký tự J “X' lă chuỗi còn ‘ A’ lă ký tự
J Nhập giâ trị chuỗi văo biến ta dùng câc hăm:
o gets(tín_biến_chuỗi)
o cin.get(tín_biển_chuỗi,chiềudăi)
o cin.getline(tín_biến_chuỗi, chiều dăi) đễ có thể lưu ký tự ENTER trong chui.
ãS Xut chui bng lnh coutô hoc puts()
J Cõc hm xử lý chuỗi : strcpy(s,t), strcat(s,t), strcmp(s,t), strcmpi(s,t),
strupr(s), strlwr(s), strlen(s),...
Khơng thể dùng tôn tử = để gân chuỗi mă nín dùng lệnh sao chĩp chuỗi.
❖ Cđu hỏi củng cố
1. Hêy phđn biệt hằng chuỗi vă biến chuỗi?
2. Mảng chuỗi lă gì? Phđn biệt mảng chuỗi so với câc mảng khâc? 3. Có những câch năo để gân giâ trị cho biến chuỗi?
4. Hêy trình băy một số hăm chuẩn xử lý chuỗi?
❖ Băi tập
1. Viết chương trình nhập văo một chuỗi ký tự. In ra măn hìhh chuỗi đảo
ngược của xđu đó. • •
2. Viết chương trình cho phĩp nhập văo một chuỗi vă đếm số ký tự số có trong chuỗi vừa nhập.
3. Viết chương trình cho phĩp nhập văo một chuỗi ký tự. In ra tất câc câc vị trí của chữ 'a' trong chuỗi vă tổng số lăn xuđt hiện của nó.
4. Viết chương trình đếm số từ có trong chuỗi. In ra măn hình mỗi dịng một từ.
5. Viết chương trình cho phĩp nhập chuồi họ tín, in ra họ, tín dưới dạng viết hoa.
6. Viết chương trình cắt bỏ câc khoảng trắng thừa đầu vă cuối trong chuỗi. 7. Viết chương trình thay kí tự X trong chuỗi s bởi kí tự y (s, X, y được đọc
văo từ băn phím)
8. Viết chương trình xơ mọi kí tự X có trong xđu s (s, X được đọc văo từ băn phím). (Gợi ý: nín xơ ngược từ cuối xđu về đầu xđu).
9. Viết chương trinh cho phĩp nhập văo một chuỗi không phđn biệt viết hoa hay viết thường. In ra câc kí tự có mặt trong xđu vă số lần xuất hiện của nó . Ví dụ xđu “Trach - Van - Doanh” có chữ a xuất hiện 3 lần, c(l), d(l), h(2), n(2), 0(1), r,(l), t(l), -(2), space(4)).
Chương 5: KIỀU DỮ LIỆU CÂU TRÚC
Mục tiíu:
Sau khi học xong chương năy Sình viín có khả năng:
- Trình băy khâi niệm về kiểu dữ liệu cấu trúc - Khai bâo, khởi tạo biến cấu trúc
- Nhập dữ liệu vă câc thao tâc truy xuất trín cấu trúc. - Truyền biến kiểu cấu trúc cho hăm
- Cấp phât động cho biến cấu trúc
1. Khâi niệm cấu trúc2. Khai bâo biến cấu trúc 2. Khai bâo biến cấu trúc
3. Truy cập câc phần tử trong cấu trúc 4. Con trỏ vă cấu trúc
I. Khâi niệm cấu trúc
Cấu trúc lă kiểu dữ liệu bao gồm nhiều phần tử. Câc phần tử của cấu trúc lă câc dữ liệu thuộc về câc kiểu khâc nhau vă có tín khâc nhau. Kiểu cấu trúc được định nghĩa bởi từ khóa struct. Mỗi phần tử của kiểu dữ liệu cấu trúc được gọi lă một trường.
Dữ liệu kiểu cấu trúc được dùng để mô tả câc đối tượng bao gồm câc kiểu dữ liệu khâc nhau, như hóa đon mua hăng, phiếu xuất vật tư, lý lịch nhđn viín, phiếu thu tiền, . . .Câc dữ liệu năy rất thường gặp trong câc băi tôn thơng tin kinh tế, quản lý.
Cấu trúc lă công cụ để tạo ra kiểu dữ liệu mới. Sau năy kiểu cấu trúc mở rộng thănh kiểu lớp.
II. Khai bâo biến cấu trúc 1. Định nghĩa
Muốn sử dụng kiểu dữ liệu cấu trúc ta phải định nghĩa nó để xâc định tín cùng với câc thănh phần dữ liệu có trong kiểu cấu trúc năy. Một kiểu cấu trúc được khai bâo theo mẫu sau:
struct <tín kiểu>
câc thănh phần ; } <danh sâch biến>;
Mỗi thănh phần giống như một biến riíng của kiểu, nó gồm kiểu vă tín thănh phần. Một thănh phần cũng cịn được gọi lă trường.
Phần tín của kiểu cấu trúc vă phần danh sâch biển có thể có hoặc khơng. Tuy nhiín trong khai bâo kí tự kết thúc cuối cùng phải lă dấu chấm phẩy (;).
Câc kiểu cấu trúc được phĩp khai bâo lồng nhau, nghĩa lă một thănh phần của kiểu cấu trúc có thể lại lă một trường có kiểu cấu trúc.
2. Khai bâo kiểu cấu trúc
Một biến có kiểu cấu trúc sẽ được phđn bố bộ nhớ sao cho câc thực hiện của nó được sắp liín tục theo thứ tự xuất hiện trong khai bâo.
Khai bâo biến kiểu cấu trúc cũng giống như khai bâo câc biến kiểu cơ sở dưới dạng:
»
struct <tín cấu trúc> <danh sâch biến> ; // kiểu cũ trong c hoặc
<tín cấu trúc> <danh sâch biến> ; // trong C++ Câc biến được khai bâo cũng có thể đi kỉm khởi tạo:
<tín cấu trúc> biến = { giâ trị khỏi tạo }; 3. Ví dụ:
Khai bâo kiểu cẩu trúc chứa phđn sổ gồm 2 thănh phần nguyín chứa tử số vă mẫu số. struct Phanso { int tu ; int mau; hoặc:
struct Phanso { int tu, niau ; }
Kiểu ngăy thâng gồm 3 thănh phần nguyín chứa ngăy, thâng, năm. struct Ngaythang {
int ng ; int th; int nam ;
} holiday = { 1,5,2000 } ;
Một biển holiday cũng được khai bâo kỉm cùng kiểu năy vă được khởi tạo bởi bộ số 1. 5. 2000. Câc giâ trị khởi tạo năy lần lượt gân cho câc thănh phần theo đúng thứ tự trong khai bâo, tức ng = 1, th = 5 vă nam = 2000.
Kiểu Lop dùng chứa thơng tin về một lớp học gồm tín lớp vă sĩ số sinh viín. Câc biến kiểu Lop được khai bâo lă daihoc vă caodang, trong đó daihoc được khởi tạo bởi bộ giâ trị {"K41T", 60} với ý nghĩa tín lóp đại học lă K41T vă sĩ số lă 60 sinh viín.
struct Lop {
char tenlop[10], int soluong; };
struct Lop daihoc = {"K41T", 60}, caodang ; hoặc:
Lop daihoc = {"K41T", 60}, caodang ;
Kiểu Sinhvien gồm có câc trường hotel! để lưu trữ họ vă tín sinh viín, ns lưu trữ ngăy sinh, gt lưu trữ giới tính dưới dạng số (qui ước 1: nam, 2: nữ) vă cuối cùng trường diem lưu trữ điểm thi của sinh viín. Câc trường trín đều có kiểu khâc nhau. struct Sinhvien { char hoten[25] ; Ngaythang ns; int gt; //1 :Nam, 0: Nu float diem; } X, *p, K41T[60]; ' Sinhvien y = {"NVA", {1,1,1980}, 1} ;
khai bâo cùng với cấu trúc Sinhvien có câc biến X, con trỏ p vă mảng K41T với 60 phần tử kiểu Sinhvien.
Biến y được khai bâo thím vă kỉm theo khởi tạo giâ trị {"NVA", {1,1,1980}, 1}, tức họ tín của sinh viín y lă "NVA", ngăy sinh lă 1/1/1980, giới tính nam vă điểm thi để trống. Đđy lă kiểu khởi tạo thiếu giâ trị, giống như khởi tạo mảng, câc giâ trị để trống phải nằm ở cuối bộ giâ trị khởi tạo (tức câc thănh phần bỏ khởi tạo không được nằm xen kẽ giữa những thănh phần được khởi tạo).Ví dụ năy cịn minh hoạ cho câc cấu trúc lồng nhau, cụ thể trong kiểu cấu trúc Sinhvien có một thănh phần cũng kiểu cấu trúc lă thănh phần ns.
III. Truy nhập câc thănh phần kiểu cấu trúc1. Đối vói biến thường 1. Đối vói biến thường
Để truy nhập văo câc thănh phần kiểu cấu trúc đối với biến thường ta sử dụng cú phâp:
tín biến.tín thănh phần
hoặc
tín biển tín thănh phăn đối với biến con trỏ cấu trúc. Cụ thể: Đối với biến thường: tín biến.tín thănh phần
Ví dụ:
struct Lop {
char tenlop[10]; int siso;
};
Lop daihoc = "K41T", caodang ;
caodang.tenlop = daihoc.tenlop ; // gân tín lớp cđẳng bởi tín lớp đhọc
caodang.siso++; // tăng sĩ số lớp caodang lín 1
»
2. Đối vói biến con trỏ:
Để truy nhập văo câc thănh phần kiểu cấu trúc đối với biến thường ta sử dụng cú phâp: tín biến tín thănh phần Ví dụ: struct Sinhvien { char hoten[25] ; Ngaythang ns; int gt; float diem; } X, *p, K41T[60]; Sinhvien y = {"NVA", {1,1,1980}, 1} ;
y.diem = 5.5 ; // gân điểm thi cho sinh viín y
♦
p = new Sinhvien ; // cấp bộ nhớ chứa 1 sinh viín
strcpy(p”>hoten, y.hoten) ; // gân họ tín của y cho sv trỏ bởi p
cout« p-^ ho ten « y.hoten; // in hoten của y vă con trỏ p