bài viết trình bày các kiến thức như Trình bày được chuỗi là gì ,Trình bày được nguyên tắc kết thúc của chuỗi ,Áp dụng được các bài toán thường gặp trong xử lý chuỗi ,Đếm số ký tự trong chuỗi ,So sánh hai chuỗi Copy chuỗi ,Loại bỏ ký tự trong chuỗi,Phân rã chuỗi,hi vọng những kiến thức này sẽ trợ giúp bạn tốt cho học tập
Trang 1Chuỗi (string) và các bài toán xử lý chuỗi
Trang 2Người học sẽ đạt được
Trình bày được chuỗi là gì
Trình bày được nguyên tắc kết thúc của chuỗi
Áp dụng được các bài toán thường gặp trong xử lý chuỗi:
Trang 3Khái niệm về Chuỗi
Là mảng một chiều của các ký tự (loại char)
Ví dụ:
char hoten[20] = “Nguyen Thi A”;
char ngaysinh[20] = “20/03/1992”;
Ký tự trong chuỗi được truy cập như là phần tử của mảng
Hoten[0] = ‘N’; Hoten[1] = ‘g’; Hoten[11] = ‘A’;
ngaysinh[0] = ‘2’; ngaysinh[2] = ‘/’;
Trang 4 ký tự ‘\0’ thường được dùng để phát hiện sự kết thúc của chuỗi
Lưu ý: ‘a’ và “a” hoàn toàn khác nhau
‘a’ là 1 ký tự
“a” là 1 chuỗi có 2 ký tự ‘a’ và ‘\0’
Trang 5Giả sử khai báo: char S[80];
• Hàm scanf không nhập chuỗi có khoảng trắng được
• Để nhập chuỗi có khoảng trắng ta dùng hàm gets
• Nếu vùng đệm keyboard có dữ liệu thì dữ liệu sẽ chuyển vào biến
• Để nhập một chuỗi mới chúng ta phải xoá bộ đệm keyboard bằng hàm fflush(stdin)
Nhập/xuất chuỗi
Trang 6printf("\nChuoi vua nhap: %s", S);
printf("\nNhap chuoi bang ham gets");
Trang 7 Chuỗi là một mảng các ký tự Vì thế chúng ta có thể truy xuất vào phần tử ký tự của nó bằng chỉ số.
i++;
} printf("Chuoi vua nhap duoc viet hoa:");
puts(S);
getch();
Nhập 1 chuỗi rồi đổi chuỗi
đó ra chữ hoa
Truy xuất từng ký tự của chuỗi
Trang 8Nếu n < 0 thì s1 < s2
(So sánh dựa vào bảng mã ASCII)
Một số hàm về chuỗi
Trang 9 strcpy(đích, nguồn)
Chép chuỗi nguồn vào chuỗi đích (gán chuỗi)
Ví dụ : strcpy(ten, “Nguyen Van A”); ten = Nguyen Van A
Trang 11VD 1: truy cập ký tự trong chuỗi
Bài toán: nhập tên và xuất tên in ngược
BEGIN
Input: chuỗi tên
Output: chuỗi tên in ngược
Trang 12VD 1: truy cập ký tự trong chuỗi
#include <stdio.h> /* khai báo thư viện cần thiết */
// 2 xử lý chuỗi: copy ngược các ký tự
for(j=0, i=strlen(name)-1; i>=0; i , j++ ) opname[j] = name[i];
Trang 13VD 1: truy cập ký tự trong chuỗi
// 3 Xuất chuỗi
printf("Hello, %s Nice to meet you!\n", name);
printf("Your name in backward: %s\n",opname);
getch();
return 0;
}
Trang 14VD 2: So sánh chuỗi
Bài toán: tương tự chức năng C43 course work
Yêu cầu: Liệt kê tất cả thông tin của khách hàng có tên trong file input.txt.
Input : khachhang.txt, input.txt.
input.txt chứa các chuỗi ký tự là HoTenKH.
Output: output.txt.
Trang 15VD 2: So sánh chuỗi
Giải thuật:
1 Đọc dữ liệu từ file và nhập vào mảng
1.1 Mở file input.txt, khachhang.txt, output.txt
1.2 Đọc dữ liệu từ file input.txt, khachhang.txt và nhập dữ liệu vào mảng
1.3 Loại bỏ các khoảng trắng của tên
1.3.1 xóa khoảng trắng khúc đầu của chuỗi
1.3.2 xóa khoảng trắng khúc cuối của chuỗi
1.3.3 thay khoảng trắng giữa các từ bằng 1 ' '
– So sánh tên
Cho mỗi tên IP trong input.txt
Cho mỗi tên KH trong khachhang.txt
So sánh tên IP và tên KH
» Nếu giống nhau thì xuất tất cả thông tin KH
» Còn không xử lý tiếp
Trang 17FILE *fin = fopen("input.txt","rt");
FILE *fout = fopen("output.txt","wt");
if(!fkh || !fin || !fout) /* kiểm tra các file được mở OK */
trình */
// fcloseall();
return -1;
}
Trang 19} getch();
return 0;
}
Trang 20VD 2: So sánh chuỗi
void XuLyTen(char s[])
{
int len=strlen(s);
int i=0, cuoitu;
// 1.3.1 xoa khoang trang khuc dau cua chuoi
while( i < len && (s[i] == '\t’ || s[i] == '\n’ || s[i] == ' ') ) i++;
Trang 21VD 2: So sánh chuỗi
// 1.3.3 thay khoang trang giua cac tu bang 1 ' '
for( i=0; i<len; i++)
Trang 22VD 3: phân rã chuỗi
Bài toán: tương tự chức năng C32 course work
Yêu cầu: so sánh tuổi của 2 ngày sinh lưu dạng chuỗi Input : hai ngày sinh
Output: xuất theo tuổi tăng dần.
Trang 26VD 3: phân rã chuỗi
// 4 so sánh 2 tuổi và xuất theo tuổi tăng dần
diff = 365*(ns_s1.nam - ns_s2.nam) + 31*(ns_s1.thang -
ns_s2.thang) + ns_s1.ngay - ns_s2.ngay;
Trang 27int top, seek;
for (top = 0; top < num-1; top++)
for (seek = top + 1; seek < num; seek++)
Trang 28Kết luận
Chuỗi là mảng một chiều của các ký tự (loại char)
Xử lý chuỗi giống như xử lý mảng dữ liệu 1 chiều Chỉ 1 điều khác biệt:
Chuỗi kết thúc với ‘\0’ hay NULL
Quy các bài toán xử lý chuổi về các bài toán nhỏ nêu ra trong các ví dụ
Trang 291 Viết chương trình nhập họ tên của một người rồi in ra màn
hình
2 Viết chương trình nhập vào một chuỗi, rồi in các ký tự của
chuỗi ra màn hình (mỗi ký tự là 1 hàng)
3 Viết chương trình nhập một chuỗi, hãy cho biết chuỗi đó có
tất cả bao nhiêu ký tự, số ký tự khoảng trắng
4 Nhập vào một chuỗi, hãy in ngược chuỗi đã nhập
5 Nhập họ tên sinh viên rồi in ra tên viết tắt của sinh viên đó
Ví dụ nhập : Nguyen Thi Lan Anh NTLA
6 Nhập họ tên của giáo viên rồi in ra địa chỉ email của giáo
viên đó Ví dụ nhập : Nguyen Van Hung
hung.nguyenvan@hoasen.edu.vn
7 Viết chương trình nhập họ tên, mã SV In ra địa chỉ email
của mình như trường Đại học Hoa sen đã cấp cho mình.
Bài tập điểm cộng về nhà