Sử dụng lớp string của C++

Một phần của tài liệu Giáo trình lập trình cc++ cơ bản (Trang 98 - 112)

6.8.1. Khai báo

Sử dụng lớp string của thư viện <string.h>.

Ví dụ 6.18: string st;

string MyName = “Pham Anh Phuong”;

6.8.2. Phép gán chuỗi

string Name = “Pham”;

Name = Name + “ Anh Phuong”; “Pham Anh Phuong”

Name = ‘1’ + Name;  “1Pham Anh Phuong”

6.8.3. Nhập và xuất chuỗi

- Nhập chuỗi: getline(cin/fi,st);

- Xuất chuỗi: cout<<st;

Ví dụ 6.19:

1. #include <iostream>

2. #include <string>

3. using namespace std;

4. int main () 5. {

6. string name;

7. cout <<"Enter your full name: ";

8. getline (cin,name);

9. cout <<endl<<"Hello, " << name << "!";

10. return 0;

11. }

6.8.4. So sánh chuỗi

Theo thứ tự từ điển: ==, >, >=, <, <=, !=

6.8.5. Một số phương thức của lớp string string st;

st.length()/st.size() Trả về độ dài của chuỗi st.

Ví dụ 6.20: Tìm xâu đảo ngược của xâu st.

1. #include <iostream>

2. #include <string>

3. using namespace std;

4. int main () 5. {

6. string st,convst;

7. getline (cin,st);

8. for(int i=0;i<st.size();i++)

9. convst = st[i] + convst;

10. cout <<convst;

11. return 0;

12. }

st.empty()

Kiểm tra chuỗi st rỗng hay không.

st.erase(pos,num)

Xóa num ký tự trong xâu st từ vị trí pos.

Ví dụ 6.21:

1. #include <iostream>

2. #include <string>

3. using namespace std;

4. int main() 5. {

6. string st="This is an example sentence.";

7. st.erase(10,8);

8. cout<<st<< endl; // "This is an sentence."

9.

10. st.erase(st.begin()+9);

11. cout<<st<<endl; // "This is a sentence."

12.

13. st.erase(st.begin()+5,st.end()-9);

14. cout << st; // "This sentence."

15. return 0;

16. }

pos = st.find(subst)

Tìm vị trí xuất hiện đầu tiên của subst trong st. Nếu không tìm thấy, trả về -1.

pos = st.replace(pos,num,subst)

Thay thế num ký tự trong xâu trong st bắt đầu từ vị trí pos bằng xâu subst.

Ví dụ 6.22:

1. #include <iostream>

2. #include <string>

3. using namespace std;

4. int main() 5. {

6. string st ("Truong Dai hoc Su pham Da Nang.");

7. string st2 ("Su pham");

8.

9. int found = st.find(st2);

10. if (found)

11. cout << "'Su pham' found at: " << found << endl;

12.

13. found=st.find('.');

14. cout << "Period found at: " << found << endl;

15.

16. // Thay thế “Su pham” thành “Bach khoa”

17. st.replace(st.find(st2),st2.length(),"Bach khoa");

18. cout << st << endl;

19. return 0;

20. }

st.substr(pos,num)

Lấy ra num ký tự trong xâu st từ vị trí pos.

Ví dụ 6.23:

1. #include <iostream>

2. #include <string>

3. using namespace std;

4. int main() 5. {

6. string st="Truong Dai hoc Su pham Da Nang.";

7. string subst = st.substr (0,6); // "Truong"

8.

9. //vị trí của "Su pham" trong st 10. int pos = st.find("Su pham");

11. //lấy từ vị trí "Su pham" đến hết xâu 12. string s = st.substr(pos);

13.

14. //"Truong Su pham Da Nang."

15. cout << subst << ' ' << s;

16. return 0;

17. }

st.insert( )

Chèn một chuỗi hoặc ký tự vào xâu st từ vị trí pos.

st.insert(int pos, char* s): chèn (mảng s kết thúc ‘\0’) vào vị trí pos của st;

st.insert(int pos, string s): chèn chuỗi s (kiểu string) vào vị trí pos của chuỗi st;

st.insert(int pos, int n, int ch): chèn n lần ký tự ch vào vị trí pos của chuỗi st;

Ví dụ 6.24:

1. #include <iostream>

2. #include <string>

3. using namespace std;

4. int main() 5. {

6. string st="Su pham Da Nang.";

7. string st1="Truong ";

8. string st2="Bo Dai hoc ";

9. st.insert(0,st1);

10. cout<<st<<endl;//"Truong Su pham Da Nang."

11.

12. st.insert(7,st2,3,8);

13. cout<<st; //"Truong Dai hoc Su pham Da Nang."

14. return 0;

15. }

BÀI TẬP

Bài tập 6.1: (CHARNUM) Đếm số lượng ký tự chữ số trong một xâu ký tự.

Input: Chuỗi ký tự st

Output: D là số lượng ký tự chữ số Ví dụ:

INPUT OUTPUT

HCJ5HJF4BJ2J 3

Bài tập 6.2: (SPACEDEL) Xóa hết các ký tự trắng thừa trong xâu.

(Ký tự trắng thừa là các ký tự trắng đầu xâu, cuối xâu và nếu ở giữa xâu có 2 ký tự trắng liên tiếp nhau thì có 1 ký tự trắng thừa).

Input: Chuỗi ký tự st

Output: Chuỗi st sau khi xóa hết ký tự trắng thừa Ví dụ:

INPUT OUTPUT

“ Olympic Tin hoc “ “Olympic Tin hoc”

Bài tập 6.3: (WORDLIST) Viết chương trình liệt kê các từ của một xâu ký tự, mỗi từ phải được viết trên một dòng.

Input: Chuỗi ký tự st

Output: Các từ, mỗi từ trên một dòng Ví dụ:

INPUT OUTPUT

“ Olympic Tin học “ Olympic Tin học

Bài tập 6.4: (REVSTR) Tìm xâu đảo ngược của xâu cho trước.

Input: Chuỗi ký tự st

Output: Chuỗi đảo ngược của st Ví dụ:

INPUT OUTPUT

ABCD DCBA

Bài tập 6.5: (THONGKE) Viết chương trình thống kê các chữ cái có trong xâu theo thứ tự alphabet và số lượng của chúng (Không phân biệt chữ hoa hay chữ thường).

Input: Chuỗi ký tự st

Output: Gồm nhiều dòng, mỗi dòng gồm 2 phần tử cách nhau một ký tự trắng: Ký tự đại diện (in hoa) và số lượng của nó trong xâu.

Ví dụ:

INPUT OUTPUT

Truong Duong Phong D 1 G 3 H 1 N 3 O 3 P 1 R 1 T 1 U 2 Ý tưởng:

- Dùng một mảng dem[] với chỉ số là các chữ cái để lưu trữ số lượng của các chữ cái trong xâu.

- Duyệt qua tất cả các ký tự của xâu St: Nếu ký tự đó là chữ cái thì tăng ô biến mảng dem[St[i]] lên 1 đơn vị.

Bài tập 6.6: (NUMDEL) Viết chương trình xóa các ký tự chữ số trong một xâu ký tự.

Input: Chuỗi ký tự st

Output: Chuỗi st sau khi xóa hết các các ký tự chữ số

Ví dụ:

INPUT OUTPUT

AB123CD456 ABCD

Bài tập 6.7: (MAXWORD) Tìm độ dài của từ dài nhất trong xâu.

Input: Chuỗi ký tự st

Output: N là độ dài từ dài nhất trong chuỗi st.

Ví dụ:

INPUT OUTPUT

Pham Nguyen Vu 6

Bài tập 6.8: (WORDREV) Viết chương trình đảo ngược thứ tự các từ trong một xâu.

Input: Chuỗi ký tự st

Output: Chuỗi sau khi đảo ngược các từ.

Ví dụ:

INPUT OUTPUT

Pham Nguyen Vu Vu Nguyen Pham

Bài tập 6.9: (CODE) Viết chương trình để nén một xâu ký tự theo cách đếm số ký tự giống nhau liên tiếp, nếu 1 ký tự đứng độc lập thì không ghi số 1 ở trước ký tự đó.

Input: Chuỗi ký tự st cần nén Output: Chuỗi sau khi nén.

Ví dụ:

INPUT OUTPUT

AAAABBBCDDDDDDDEEF 4A3BC7D2EF

Bài tập 6.10: (DECODE) Viết chương trình để giải nén một xâu ký đã được nén.

Input: Chuỗi ký tự cần giải nén st Output: Chuỗi sau khi đã giải nén.

Ví dụ:

INPUT OUTPUT

4A3BC7D2EF AAAABBBCDDDDDDDEEF

Bài tập 6.11: (LONGSUM) Viết chương trình để cộng hai số lớn bất kỳ (có tối đa 1000 chữ số).

Input: Hai số nguyên dương M, N có tối đa 1000 chữ số.

Output: M+N Ví dụ:

INPUT OUTPUT

999999 1

1000000

Bài tập 6.12: (XAUNGOAC) Cho xâu ngoặc S có độ dài không quá 100. Hãy xác định xâu S là xâu ngoặc đúng hay sai.

Input: gồm một dòng chứa xâu S.

Output: TRUE ứng với xâu S đúng, FALSE nếu S sai.

Vi dụ:

INPUT OUTPUT INPUT OUTPUT

(())()(()) TRUE ())() FALSE

Bài tập 6.13: (LETTER) (Olympic Tin học 2008, khối Cao đẳng) Một xâu văn bản được chia thành hai đoạn liên tiếp Sb và Se để mã hóa. Lần lượt viết hai xâu Sb và Se nhưng theo thứ tự đảo ngược ta nhận được xâu mã hóa Q. Cho xâu đã được mã hóa Q và khóa để giải mã k ≥ 0 là độ dài của xâu Sb, hãy xác định xâu gốc S.

Ví dụ: S = ’programming’ được chia thành 2 đoạn: Sb = ’program’, Se = ’ming’, sẽ nhận được xâu mã hóa Q = ’margorpgnim’ với khóa k = 7.

Input: xâu mã hóa Q có độ dài không quá 250 và khóa k.

Output: xâu S tìm được sau khi mã hóa.

Ví dụ:

INPUT OUTPUT

margorpgnim 7

programming

Bài tập 6.14: (WLOOP) (Olympic Tin học 2007, khối Cao đẳng) Xâu lặp là xâu được tạo thành bằng cách ghép k lần một xâu con (k > 1). Ví dụ, “ABABAB” là một xâu lặp, được lặp lại 3 lần xâu con

“AB”.

Yêu cầu: Hãy đếm số các xâu lặp trong số N xâu đã cho, biết rằng các xâu này khác rỗng, đôi một khác nhau và độ dài của mỗi xâu không quá 255.

Input:

- Dòng đầu tiên chứa số nguyên dương N, với N ≤ 1000;

- N dòng tiếp theo, mỗi dòng chứa một xâu ký tự.

Output: Gồm một dòng chứa một số nguyên dương là số lượng xâu lặp tìm được.

Ví dụ:

INPUT OUTPUT

4

Welcom!welcom!

Welcom!Welcom!

VOI2007&ACM/ICPC DANANG, 9-11/2007

1

Bài tập 6.15: (HCODE) (Olympic Tin học 2006, khối Cao đẳng) Siêu mã là một loại mã có nhiều ứng dụng quan trọng trong lĩnh vực mã hóa và truyền tin. Trong bài này, ta xét bài toán đơn giản sau đây về siêu mã. Cho uv là hai xâu kí tự khác rỗng có độ dài hữu hạn. Xâu u được gọi là xâu con của xâu v nếu u có thể nhận được từ v bằng cách xóa bớt ít nhất một kí tự trong v. Một tập X các xâu khác rỗng có độ dài hữu hạn được gọi là siêu mã nếu mọi cặp u, v bất kỳ thuộc X, u không là xâu con của vv không là xâu con của u.

Cho trước một tập X = {x1, x2, ..., xN} gồm N xâu khác rỗng, mỗi kí tự trong xâu là 0 hoặc 1. Hãy kiểm tra xem X có là một siêu mã hay không?

Input: có định dạng như sau:

 Dòng đầu tiên chứa số nguyên dương N (N ≤ 500);

 Dòng thứ i trong N dòng tiếp theo ghi xâu xi của tập X, độ dài của xâu xi không quá 15, với i = 1, 2, ..., N.

Output: ghi ra theo định dạng như sau:

 Nếu X là siêu mã thì ghi số 1;

 Nếu X không là siêu mã thì dòng đầu tiên ghi số 0, dòng thứ hai ghi chỉ số i nhỏ nhất mà hoặc xi là xâu con của xj hoặc xj là xâu con của xi, với xi,xj thuộc X, 1 ≤ i < jN.

Ví dụ:

INPUT OUTPUT INPUT OUTPUT

5 1111 100101 01011 000 0001000

0 2

3 010 1000 11

1

Bài tập 6.16: (DAYSO) Cho n xâu ký tự, mỗi xâu đội dài không quá 100. Hãy đưa ra dãy số nhận được đã sắp xếp theo thứ tự không giảm và mỗi số viết trên một dòng.

Input:

- Dòng đầu chứa số nguyên dương n (n < 103).

- n dòng tiếp theo, mỗi dòng chứa một xâu ký tự gồm các ký tự La tinh thường và chữ số.

Output: Dãy số nhận được đã được sắp theo thứ tự không giảm.

Ví dụ:

INPUT OUTPUT

4 zita002 le2sin a231233xy 43ablib0

0 2 2 43 231233

Bài tập 6.17: (LASTZERO) Cho xâu ký tự S có N ký tự chứa các chữ cái hoa từ ‘A’ đến ‘Z’ (N ≤ 10000). Nếu hoán vị xâu này thì ta sẽ được các xâu khác nhau.

Ví dụ: S = “BABB” ta sẽ có 4 xâu khác nhau ABBB, BABB, BBAB và BBBA.

Tuy nhiên, số các xâu được tạo ra này là rất lớn. Hãy đếm số lượng chữ số 0 tận cùng của số lượng các xâu được tạo ra từ xâu đã cho.

Input:

 Dòng đầu ghi số nguyên dương 𝑁 (𝑁 ≤ 1000);

 𝑁 dòng tiếp theo, mỗi dòng ghi một xâu kí tự chữ cái hoa.

Output: Mỗi dòng chứa một số nguyên là số lượng chữ số 0 tìm được tương ứng.

Ví dụ:

INPUT OUTPUT

2 BABB ABBCD

0 1

Bài tập 6.18: (PALINCHECK) Một xâu được gọi là palindrome nếu nó là xâu đối xứng.

Ví dụ, “radar” và “level” là palindrome, trong khi “foot” thì không phải.

Cho xâu ký tự chỉ chứa các chữ cái hoa. Hãy cho biết xâu đó có phải là palindrome?

Input:

 Dòng đầu ghi số nguyên dương 𝑁 (𝑁 ≤ 1000);

 𝑁 dòng tiếp theo, mỗi dòng ghi một xâu kí tự chữ cái hoa.

Output: Mỗi dòng chứa một giá trị TRUE/FALSE tương ứng với xâu có phải là palindrome?

Ví dụ:

INPUT OUTPUT 4

RADAR LEVEL FOOT ALABAMA

TRUE TRUE FALSE FALSE

Bài tập 6.19: (NECKLACE) (Olympic Tin học 2009, khối Cao đẳng) Một hãng đồ trang sức nổi tiếng vừa giới thiệu một mẫu lắc (vòng đeo tay) được tạo thành bằng cách xâu n viên đá quí thành vòng tròn.

Đá quí được chọn từ 26 loại khác nhau, mỗi loại được ghi nhãn là một kí tự trong số các kí tự từ ‘A’ đến ‘Z’. Lắc được đặt cố định trên giá trong gian trưng bày. Từ viên đá, bằng cách liệt kê các nhãn của các viên đá theo chiều kim đồng hồ ta nhận được xâu kí tự S có độ dài n.

Xâu S được gọi là một biểu diễn lắc. Như vậy, ta có thể nhận được n xâu biểu diễn lắc từ n cách chọn vị trí bắt đầu khác nhau.

Yêu cầu: Cho xâu S là một biểu diễn lắc. Hãy xác định xâu Y là xâu biểu diễn lắc nhỏ nhất.

Input: Gồm 1 dòng chứa xâu S có độ dài không quá 100.

Output: Gồm 1 dòng chứa xâu Y tìm được.

Ví dụ:

INPUT OUTPUT

ZACAB ABZAC

Bài tập 6.20: (PALIN) Cho số nguyên dương N có độ dài tối đa 10000 chữ số. Tìm số đối xứng nhỏ nhất lớn hơn N.

Input: Số nguyên dương N

Output: M là số đối xứng nhỏ nhất lớn hơn N Ví dụ:

INPUT OUTPUT

123 131

Một phần của tài liệu Giáo trình lập trình cc++ cơ bản (Trang 98 - 112)

Tải bản đầy đủ (PDF)

(176 trang)