0
Tải bản đầy đủ (.pdf) (92 trang)

Các thao tác trên chuỗi ký tự

Một phần của tài liệu BÀI GIẢNG TIN HỌC ĐẠI CƯƠNG (Trang 57 -57 )

Các thao tác nhập/xuất (I/O) chuỗi trong C được thực hiện bằng cách gọi các hàm. Các hàm này là một phần của thư viện nhập/xuất chuẩn tên stdio.h. Một chương trình muốn sử dụng các hàm nhập/xuất chuỗi phải có câu lệnh khai báo sau ở đầu chương trình:

#include <stdio.h>;

Khi chương trình có chứa câu lệnh này được biên dịch, thì nội dung của tập tin stdio.h sẽ trở thành một phần của chương trình.

4.3.2.1. Thao tác nhập/xuất chuỗi

Các thao tác nhập/xuất chuỗi đơn giản

Sử dụng hàm gets() là cách đơn giản nhất để nhập một chuỗi thông qua thiết bị nhập chuẩn. Các ký tự sẽ được nhập vào cho đến khi nhấn phím Enter. Hàm gets() thay thế ký tự kết thúc trở về đầu dòng „\n‟ bằng ký tự „\0‟. Cú pháp hàm này như sau:

gets(str);

Trong đó str là một mảng ký tự đã được khai báo.

Tương tự, hàm puts() được sử dụng để hiển thị một chuỗi ra thiết bị xuất chuẩn. Ký tự xuống dòng sẽ kết thúc việc xuất chuỗi. Cú pháp hàm như sau:

puts(str);

Trong đó str là một mảng ký tự đã được khai báo và khởi tạo. Chương trình sau đây nhận vào một tên và hiển thị một thông báo.

Ví dụ 4.11: Chương trình nhập và hiển thị một tên #include <stdio.h> #include <conio.h> int main() { char name[20];

/* name is declared as a single dimensional character array */

clrscr(); /* Clears the screen */

puts("Enter your name:"); /* Displays a message */

gets(name); /* Accepts the input */

puts("Hi there: ");

puts(name); /* Displays the input */ getch();

return 0; }

Nếu tên Lisa được nhập vào, chương trình trên cho ra kết quả: Enter your name:

Lisa

Hi there: Lisa

Các thao tác nhập/xuất chuỗi có định dạng

Có thể sử đụng các hàm scanf() và printf() để nhập và hiển thị các giá trị chuỗi. Các hàm này được dùng để nhập và hiển thị các kiểu dữ liệu hỗn hợp trong một câu lệnh duy nhất. Cú pháp để nhập một chuỗi như sau:

scanf(“%s”, str);

Trong đó ký hiệu định dạng %s cho biết rằng một giá trị chuỗi sẽ được nhập

vào. str là một mảng ký tự đã được khai báo. Tương tự, để hiển thị chuỗi, cú pháp sẽ là:

printf(“%s”, str);

Trong đó ký hiệu định dạng %s cho biết rằng một giá trị chuỗi sẽ được hiển thị và str là một mảng ký tự đã được khai báo và khởi tạo. Hàm printf() có thể dùng để

hiển thị ra các thông báo mà không cần kí tự định dạng.

Có thể sửa đổi chương trình ở ví dụ 4.11 bên trên để nhập vào và hiển thị một tên, sử dụng hàm scanf() và printf().

Ví dụ 4.12

#include <stdio.h> #include <conio.h> int main()

char name[20]; clrscr();

printf("Enter your name: "); scanf(“%s”, name);

printf("Hi there: %s", name); getch();

return 0; }

Nếu nhập vào tên Brendan, chương trình trên cho ra kết quả: Enter your name: Brendan

Hi there: Brendan

Lƣu ý:

 Không cần sử dụng toán tử địa chỉ & trong name trong lệnh scanf("%s",

name), vì bản thân name đã là địa chỉ.

 Dùng hàm scanf để nhập chuỗi có hạn chế như sau: Khi thử lại chương trình trên với dữ liệu nhập vào là Mai Lan, nhưng khi in ra bạn chỉ nhận được Mai. Vì hàm scanf nhận vào dữ liệu đến khi gặp khoảng trắng thì kết thúc.  Đối với hàm puts kí tự kết thúc chuỗi null (\0) được thay thế bằng kí tự

newline (\n). Hàm gets và puts chỉ có 1 đối số và không sử dụng dạng thức trong nhập liệu cũng như xuất ra màn hình.

4.3.2.2. Các hàm về chuỗi

C hỗ trợ rất nhiều hàm về chuỗi. Các hàm này có thể tìm thấy trong tập tin string.h. Một số thao tác mà các hàm này thực hiện là:

 Nối chuỗi  So sánh chuỗi

 Định vị một ký tự trong chuỗi

 Sao chép một chuỗi sang chuỗi khác  Xác định chiều dài của chuỗi.

Hàm strcat()

Hàm strcat() được sử dụng để nối hai chuỗi vào nhau. Cú pháp hàm là:

strcat(str1, str2);

trong đó str1 và str2 là hai chuỗi đã được khai báo và khởi tạo. Hàm này sẽ thực hiện nối chuỗi str2 vào sau chuỗi str1

Chương trình sau đây nhận vào họ và tên, nối chúng với nhau và hiển thị ra họ tên đầy đủ.

Ví dụ 4.13: #include<stdio.h> #include<conio.h> #include<string.h> int main() { char firstname[15]; char lastname[15]; clrscr();

printf("Enter your first name: "); scanf("%s", firstname);

printf("Enter your last name:"); scanf("%s", lastname);

strcat(firstname, lastname);

/* Attaches the contents of lastname at the end of firstname */

printf("%s", firstname); getch();

return 0; }

Kết quả của chương trình trên được minh họa như sau: Một mẫu xuất ra màn hình của chương trình trên sẽ là:

Enter your first name: Carla Enter your last name: Johnson CarlaJohnson

Hàm strcmp()

Việc so sánh hai chuỗisố (bằng nhau hay không bằng nhau) có thể thực hiện bằng cách sử dụng các toán tử quan hệ. Tuy nhiên, để so sánh hai chuỗi kí tự, phải dùng một hàm. Hàm strcmp() so sánh hai chuỗi với nhau và trả về một số nguyên phụ thuộc vào kết quả so sánh. Cú pháp của hàm strcmp() như sau:

strcmp(str1, str2);

trong đó str1 và str2 là hai chuỗi đã được khai báo và khởi tạo.Hàm trả về giá trị:

 Nhỏ hơn 0 nếu str1<str2  0 nếu str1 = str2

Chương trình sau đây so sánh biến name1 với các biến name2, name3, name4 và hiển thị kết quả của phép so sánh:

Ví dụ 4.14: #include <stdio.h> #include <conio.h> #include<string.h> int main() {

char name1[15] = "Geena"; char name2[15] = "Dorothy"; char name3[15] = "Shania"; char name4[15] = "Geena"; int i;

clrscr();

i = strcmp(name1,name2);

printf("%s compared with %s returned %d\n", name1, name2, i);

i=strcmp(name1, name3);

printf("%s compared with %s returned %d\n", name1, name3, i);

i=strcmp(name1,name4);

printf("%s compared with %s returned %d\n", name1, name4, i);

getch(); }

Kết quả của chương trình trên được minh họa như sau:

Geena compared with Dorothy returned 3 Geena compared with Shania returned -12 Geena compared with Geena returned 0

Lưu ý: giá trị trả về trong mỗi phép so sánh ở ví dụ trên. Đó là sự khác nhau về mã

ASCII của hai kí tự khác nhau đầu tiên tìm thấy trong hai chuỗi.

Hàm strchr()

Hàm strchr() xác định vị trí xuất hiện của một ký tự trong một chuỗi. Cú pháp hàm là:

trong đó str là một mảng ký tự hay chuỗi. chr là một biến ký tự chứa giá trị cần tìm. Hàm trả về con trỏ trỏ đến giá trị tìm được đầu tiên trong chuỗi, hoặc NULL nếu không tìm thấy.

Chương trình sau đây xác định liệu ký tự „a‟ có xuất hiện trong tên hai thành phố hay không. Ví dụ 4.15: #include <stdio.h> #include <conio.h> #include<string.h> int main() {

char str1[15] = "New York"; char str2[15] = "Washington"; char chr = 'a', *loc;

clrscr();

loc = strchr(str1, chr);

/* Checks for the occurrence of the character value held by chr in the first city name */

if(loc != NULL)

printf("%c occurs in %s\n", chr, str1); else

printf("%c does not occur in %s\n", chr, str1); loc = strchr(str2, chr);

/* Checks for the occurrence of the character in the second city name */

if(loc != NULL)

printf("%c occurs in %s\n", chr, str2); else

printf("%c does not occur in %s\n", chr, str2); getch();

return 0; }

Kết quả của chương trình trên được minh họa như sau: a does not occur in New York

Hàm strcpy()

Trong C không có toán tử nào xử lý một chuỗi như là một đơn vị duy nhất. Vì vậy, phép gán một giá trị chuỗi này cho một chuỗi khác đòi hỏi phải sử dụng hàm strcpy(). Cú pháp hàm là:

strcpy(str1, str2);

trong đó str1 và str2 là hai mảng ký tự đã được khai báo và khởi tạo. Hàm sao chép giá trị str2 vào str1 và trả về chuỗi str1.

Chương trình sau đây minh họa việc sử dụng hàm strcpy(). Nó thay đổi tên của một khách sạn và hiển thị tên mới.

Ví dụ 4.16: #include <stdio.h> #include <conio.h> #include<string.h> int main() {

char hotelname1[15] = "Sea View"; char hotelname2[15] = "Sea Breeze"; clrscr();

printf("The old name is %s\n", hotelname1); strcpy(hotelname1, hotelname2);

/*Changes the hotel name*/

printf("The new name is %s\n", hotelname1); /*Displays the new name*/

getch(); return 0; }

Kết quả của chương trình trên được minh họa như sau: The old name is Sea View

The new name is Sea Breeze

Hàm strlen()

Hàm strlen() trả về chiều dài của chuỗi. Chiều dài của chuỗi rất hay được sử dụng trong các vòng lặp truy câp từng kí tự của chuỗi. Cú pháp của hàm là:

trong đó str là mảng ký tự đã được khai báo và khởi tạo. Hàm trả về chiều dài của chuỗi str.

Chương trình sau đây đưa ra ví dụ đơn giản sử dụng hàm strlen(). Nó tìm chiều dài của tên một công ty và hiển thị tên công ty đó với các ký tự được phân cách nhau bởi ký tự „*‟. Ví dụ 4.17: #include<stdio.h> #include<conio.h> #include<string.h> int main() {

char compname[20] = "Microsoft"; int len, ctr;

clrscr();

/* Determines the length of the string */ len = strlen(compname);

/* Accesses and displays each character of the string*/ for(ctr = 0; ctr < len; ctr++) printf("%c * ", compname[ctr]); getch(); return 0; }

BÀI TẬP CHƢƠNG 4

I. MẢNG MỘT CHIỀU

a. Nhập xuất mảng một chiều

1.Viết chương trình nhập xuất mảng một chiều các số thực.

2.Viết chương trình khởi tạo giá trị các phần tử là 0 cho mảng một chiều các số nguyên gồm n phần tử.

3.Viết chương trình phát sinh ngẫu nhiên mảng một chiều các số nguyên âm.

4.Viết chương trình phát sinh ngẫu nhiên mảng một chiều các số nguyên sao cho mảng có thứ tự tăng dần (Không sắp xếp).

5.Viết chương trình nhập mảng các số thực và xuất các phần tử âm trong mảng. 6.Viết chương trình nhập mảng các số nguyên và xuất các phần tử lẻ có trong mảng. 7. Viết chương trình nhập vào mảng một chiều các số nguyên và xuất ra các phần tử chẵn nhỏ hơn 20.

8. Viết chương trình nhập vào mảng một chiều các số nguyên và xuất ra màn hình các phần tử

là số nguyên tố.

9. Viết chương trình nhập vào số nguyên n và liệt kê các số nguyên tố nhỏ hơn n, nếu mảng không tồn tại số nguyên tố nào nhỏ hơn n thì phải xuất ra một câu thông báo. 10. Viết chương trình nhập vào mảng một chiều các số nguyên và xuất ra màn hình các phần tử là số chính phương nằm tại những vị trí lẻ trong mảng.

b. Tìm kiếm trên mảng một chiều

11.Viết hàm tìm vị trí phần tử có giá trị x xuất hiện cuối cùng trong mảng. 12.Viết hàm tìm vị trí của phần tử nhỏ nhất trong mảng các số nguyên. 13.Viết hàm tìm vị trí của phần tử lớn nhất trong mảng các số nguyên. 14.Viết hàm in vị trí các phần tử nguyên tố trong mảng các số nguyên. 15.Viết hàm in vị trí các phần tử nguyên tố lớn hơn 23.

16.Viết hàm tìm vị trí phần tử âm đầu tiên trong mảng. Nếu không có phần tử âm trả về –1.

17.Viết hàm tìm vị trí phần tử âm lớn nhất trong mảng.

18.Viết hàm tìm vị trí phần tử duong đầu tiên trong mảng. Nếu không có phần tử âm trả về –1.

19.Viết hàm tìm vị trí phần tử duong bé nhất trong mảng. 20.Viết hàm in các phần tử là bội của 3 và 5.

21.Viết hàm tìm số chẵn cuối cùng có trong mảng, nếu không tồn tại số chẵn hàm trả về -1 .

22.Viết hàm tìm số lẻ lớn nhất có trong mảng, nếu không tồn tại số lẻ hàm trả về -1. 23.Viết hàm tìm và dổi chỗ phần tử lớn nhất với phần tử nhỏ nhất trong mảng.

24.Nhập vào X. Viết hàm in ra màn hình những phần tử có giá trị từ 1 dến X có trong mảng.

25.Viết chương trình nhập vào một dãy số a gồm n số thực (n<=100), nhập vào dãy số b gồm m số thực (m<=100).

- In ra những phần tử chỉ xuất hiện trong dãy a mà không xuất hiện trong dãy b. - In ra những phần tử xuất hiện ở cả hai dãy.

c. Ðếm – Tần suất

26.Viết hàm đếm các phần tử âm, dương trong mảng. 27.Viết hàm đếm các phần tử chẵn, lẻ trong mảng.

28.Viết hàm đếm số lần xuất hiện của phần tử x trong mảng. 29.Viết hàm đếm các phần tử nhỏ hơn x trong mảng.

30.Viết hàm đếm các phần tử là số nguyên tố trong mảng. 31.Viết hàm đếm các phần tử là số hoàn thiện trong mảng.

32.Viết hàm đếm các phần tử là bội của 3 và 5 trong mảng các số nguyên.

d. Tính tổng – Trung bình có diều kiện

33.Viết hàm tính tổng các phần tử chẵn trong mảng.

34.Viết hàm tính tổng các phần tử lẻ trong mảng các số nguyên. 35.Viết hàm tính tổng các phần tử nguyên tố trong mảng.

36.Viết hàm tính tổng các phần tử nằm ở vị trí chẵn trong mảng các số nguyên. 37.Viết hàm tính tổng các phần tử nằm ở vị trí nguyên tố trong mảng.

38.Viết hàm tính tổng các phần tử chia hết cho 5 có trong mảng.

39.Viết hàm tính tổng các phần tử cực đại trong mảng các số nguyên (phần tử cực đại

là phần tử lớn hơn các phần tử xung quanh nó). Ví dụ : 1 5 2 6 3 5 1 8 6

40.Viết hàm tính tổng các phần tử cực tiểu trong mảng các số nguyên ( phần tử cực

tiểu là phần tử nhỏ hơn các phần tử xung quanh nó ).

Ví dụ : 6 4 2 9 5 3 7 1 5 8

41.Viết hàm tính tổng các phần tử là bội của 3 và 5 trong mảng các số nguyên. 42.Viết hàm tính tổng các phần tử là số hoàn thiện trong mảng các số nguyên. 43.Viết hàm tính giá trị trung bình của các số hoàn thiện trong mảng các số nguyên.

e. Sắp xếp

44.Viết hàm sắp xếp mảng theo thứ tự giảm dần.

45.Viết hàm sắp xếp mảng theo thứ tự tăng dần của các phần tử là số nguyên tố. 46.Viết hàm sắp xếp các phần tử lẻ tăng dần.

47.Viết hàm sắp xếp các phần tử chẵn giảm dần.

48.Viết hàm sắp xếp các phần tử chẵn nằm bên trái theo thứ tự tăng dần còn các phần tử lẻ bên phải theo thứ tự giảm dần.

49.Viết hàm sắp xếp các phần tử âm giảm dần từ trái sang phải, phần tử dương tăng dần từ phải sang trái.

f. Xoá

50.Viết hàm xoá phần tử tại vị trí lẻ trong mảng.

51.Viết hàm xoá phần tử có giá trị lớn nhất trong mảng.

52.Nhập vào giá trị X. Viết hàm xoá tất cả các phần tử có giá trị nhỏ hơn X. 53.Nhập vào giá trị X. Viết hàm xoá phần tử có giá trị gần X nhất.

g. Chèn

54.Viết hàm chèn phần tử có giá trị X vào vị trí đầu tiên của mảng.

55.Viết hàm chèn phần tử có giá trị X vào phía sau phần tử có giá trị lớn nhất trong mảng.

56.Viết hàm chèn phần tử có giá trị X vào truớc phần tử có giá trị là số nguyên tố đầu tiên trong mảng.

57.Viết hàm chèn phần tử có giá trị X vào phía sau tất cả các phần tử có giá trị chẵn trong mảng.

h. Tách / ghép mảng

58.Viết chương trình tách 1 mảng các số nguyên thành 2 mảng a và b, sao cho mảng a chứa toàn số lẻ và mảng b chứa toàn số chẵn.

Ví dụ: Mảng ban đầu: 1 3 8 2 7 5 9 0 10 Mảng a: 1 3 7 5 9

Mảng b: 8 2 10

59.Cho 2 mảng số nguyên a và b kích thuớc lần luợt là n và m. Viết chương trình nối 2 mảng trên thành mảng c theo nguyên tắc chẵn ở đầu mảng và lẻ ở cuối mảng.

Ví dụ:

Mảng a: 3 2 7 5 9

Mảng b: 1 8 10 4 12 6

Mảng c: 6 12 4 10 2 8 3 1 7 5 9

II. CHUỖI KÝ TỰ

1. Viết chương trình nhập vào một chuỗi ký tự, đếm số ký tự có trong chuỗi. 2. Viết chương trình đếm có bao nhiêu khoảng trắng trong chuỗi.

3. Viết chương trình nhập vào một chuỗi, hãy loại bỏ những khoảng trắng thừa trong chuỗi.

4. Viết chương trình nhập vào hai chuỗi s1 và s2, nối chuỗi s2 vào s1. Xuất chuỗi s1 ra màn hình.

5. Đổi tất cảcác ký tự có trong chuỗi thành chữ thường (không dùng hàm strlwr). 6. Đổi tất cả các ký tự trong chuỗi sang chữ in hoa (không dùng hàm struppr). 7. Viết chương trình đổi những ký tự đầu tiên của mỗi từ thành chữ in hoa. 8. Viết chương trình đổi chữ xen kẻ 1 chữ hoa và 1 chữ thường.

Một phần của tài liệu BÀI GIẢNG TIN HỌC ĐẠI CƯƠNG (Trang 57 -57 )

×