Đặt vấn đề
Cần lưu trữ 10, 100, 1000 số cùng kiểu dữ liệu?
Giải pháp
Kiểu dữ liệu mảng cho phép lưu trữ một dãy các số đồng dạng.
Ví dụ
int a[10];
Tạo ra một dãy số nguyên gồm 10 phần tử
72 trang |
Chia sẻ: phuongt97 | Lượt xem: 455 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Bài giảng Nhập môn lập trình - Chương 6: Mảng một chiều, chuỗi - Ngô Hữu Dũng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ể thay đổi giá trị của chuỗi?
Dùng các hàm xử lý chuỗi như scanf, gets
Thay đổi từng phần tử
Các hàm trong thư viện string.h
Tự viết hàm xử lý chuỗi ký tự
56
Nhập chuỗi từ bàn phím
Nhập môn lập trình - Mảng, chuỗi
Dùng hàm scanf trong thư viện stdio.h
scanf("%s",name);
Nhập "My name is C", name = "My"
scanf("%[^\n]s",name);
Nhập "My name is C", name = "My name is C"
scanf tự động thêm ký tự NULL vào sau chuỗi nhận được từ
bàn phím
Dùng hàm gets trong thư viện stdio.h
gets(name);
Hàm gets tự động chấp nhận chuỗi có khoảng trắng
57
Phần tử của chuỗi
Nhập môn lập trình - Mảng, chuỗi
Phép khởi tạo char hello[] = "Hello!";
hello[0] = 'H', hello[1] = 'e', hello[2] = 'l', hello[6] = '\0'
Phép gán sau đó hello = "Hi!"; sẽ bị báo lỗi!
Có thể thay thế phép gán trên bằng các lệnh:
hello[0] = 'H';
hello[1] = 'i';
hello[2] = '!';
hello[3] = '\0';
Xuất chuỗi: printf("%s", hello);
printf("%s", "e"); // "e"= {'e', '\0'}
Xuất ký tự: printf("%c", hello[1]);
printf("%c", 'e');
hello[0] hello[1] hello[2] hello[3] hello[4] hello[5] hello[6]
'H' 'e' 'l' 'l' 'o' '!' '\0'
58
Thư viện string.h
Nhập môn lập trình - Mảng, chuỗi
size_t strlen(const char * str)
Trả về chiều dài của chuỗi ký tự str
strlen(“hello”) = 5, strlen(hello) = 6
size_t: Unsigned integral type
const char: Bởi hàm không thay đổi giá trị của str
char * strcpy(char * destination, const char * source)
Chép nội dung chuỗi source sang chuỗi destination bao gồm ký tự
NULL
Chuỗi destination phải đủ chứa chuỗi source (bao gồm ký tự NULL)
Bản thân hàm trả về destination
strcpy(hello, “Hi!”) trả về chuỗi “Hi!” và hello = “Hi!”
char * destination: Hàm thay đổi giá trị của destination
const char * source: Hàm không thay đổi giá trị của source
59
Thư viện string.h (2)
Nhập môn lập trình - Mảng, chuỗi
int strcmp( const char * str1, const char * str2 )
So sánh chuỗi str1 với chuỗi str2, so sánh từng ký tự từ đầu đến
khi phát hiện điểm khác nhau hoặc đến cuối chuỗi (‘\0’)
Giá trị trả về >0: str1 > str2
Giá trị trả về =0: str1 = str2
Giá trị trả về <0: str1 < str2
char * strcat( char * destination, const char * source )
Nối chuỗi source vào cuối chuỗi destination
destination phải đủ chứa chuỗi kết quả (bao gồm ký tự NULL)
char name[10]; strcpy(name, hello); strcat(name, hi); // name =
“Hello!Hi!”
60
Chuyển đổi giữa chuỗi và số
Nhập môn lập trình - Mảng, chuỗi
Thư viện chứa các hàm chuyển đổi giữa chuỗi và số
int atoi (const char * str)
Chuyển chuỗi str sang số nguyên và trả về giá trị số nguyên
atoi("34.5 53") = 34
double atof (const char* str)
Chuyển đổi một chuỗi sang kiểu số thực và trả về số thực
atof("34.5 53") = 34.5
long int atol ( const char * str )
Chuyển đổi chuỗi sang kiểu long int (4 bytes)
long long int atoll ( const char * str )
Chuyển đổi chuỗi sang kiểu long long int (8 bytes)
61
Chiều dài của chuỗi
Nhập môn lập trình - Mảng, chuỗi
Chiều dài của chuỗi được xác định dựa vào ký tự NULL, kết
thúc chuỗi
Viết hàm tính chiều dài của chuỗi
Hàm có kiểu nguyên, trả về chiều dài của chuỗi (output)
Đối số của hàm là một chuỗi (input)
Mã giả:
Khai báo một biến đếm và khởi tạo giá trị 0
Duyệt và đếm các phần tử của chuỗi
Dừng đếm khi gặp ký tự ‘\0’
Trả về chiều dài của chuỗi dựa vào giá trị của biến đếm
Tương tự hàm strlen của thư viện string.h
62
Ví dụ tham khảo hàm tính chiều dài của chuỗi
Nhập môn lập trình - Mảng, chuỗi
1. int stringLength(const char str[])
2. {
3. int count = 0;
4. while (str[count] != '\0')
5. count++;
6. return count;
7. }
8.
9. int main()
10.{
11. char hello[] = "Hello!";
printf("%d",stringLength(hello));
12.}
63
Chép chuỗi
Nhập môn lập trình - Mảng, chuỗi
Viết hàm chép nội dung của một chuỗi nguồn vào một chuỗi
đích
Chuỗi đích sẽ mang giá trị của chuỗi nguồn (output)
Đối số của hàm là hai chuỗi, nguồn và đích (input)
Mã giả
Khai báo một biến chạy và khởi gán giá trị ban đầu
Duyệt từng phần tử của chuỗi nguồn
Gán giá trị của từng phần tử ở chuỗi nguồn sang chuỗi đích
Dừng sao chép khi gặp ký tự ‘\0’
Gán ký tự ‘\0’ vào cuối chuỗi đích
Tương tự lệnh strcpy của thư viện string.h
Hàm có kiểu trả về là void
Bạn có thể trả về chuỗi đích cho hàm nếu biết dùng con trỏ, pointer (sẽ
học sau)
64
Ví dụ tham khảo hàm chép chuỗi
Nhập môn lập trình - Mảng, chuỗi
1. void stringCopy(char str1[], const char str2[])
2. {
3. int i=-1;
4. do{
5. i++;
6. str1[i]=str2[i];
7. }while (str2[i]!='\0');
8. }
9. int main()
10.{
11. char hello[10];
12. stringCopy(hello,"Hello!");
13. printf("%s",hello);
14.}
65
Nối chuỗi
Nhập môn lập trình - Mảng, chuỗi
Viết hàm nối một chuỗi nguồn vào cuối một chuỗi đích
Chuỗi đích sẽ mang giá trị là kết quả của việc nối hai chuỗi
Đối số của hàm gồm hai chuỗi
Mã giả
Khai báo hai biến chạy và khởi gán giá trị ban đầu
Biến chạy cho chuỗi nguồn, bắt đầu từ đầu chuỗi nguồn
Biến chạy cho chuỗi đích, bắt đầu từ cuối chuỗi đích
Duyệt từng phần tử của chuỗi nguồn
Gán giá trị của các phần tử của chuỗi nguồn vào chuỗi đích
Dừng sao chép khi gặp ký tự NULL của chuỗi nguồn
Gán ký tự NULL vào chuỗi đích
Hàm tương tự như hàm strcpy trong thư viện string.h
66
Ví dụ tham khảo hàm nối chuỗi
Nhập môn lập trình - Mảng, chuỗi
1. void stringAppend(char dest[], const char src[])
2. {
3. int i = stringLength(dest)-1, j = -1;
4. do{
5. i++;j++;
6. dest[i]=src[j];
7. }while(src[j]!='\0');
8. }
9. int main()
10.{
11. char thanks[20] = "Thank";
12. stringAppend(thanks, " you!");
13. printf("%s",thanks);
14.}
67
So sánh chuỗi
Nhập môn lập trình - Mảng, chuỗi
Viết hàm so sánh hai chuỗi ký tự str1 và str2
Hàm trả về giá trị
< 0 nếu str1 < str2
= 0 nếu str1 = str2
> 0 nếu str1 > str2
Hàm có 2 đối số là hai chuỗi cần so sánh
Mã giả
Khai báo và khởi tạo cho một biến chạy
Duyệt các phần tử cho đến khi
Gặp phần tử khác nhau
Hoặc kết thúc một trong hai chuỗi
So sánh phần tử cuối cùng và trả về giá trị so sánh tương ứng
68
Ví dụ tham khảo về hàm so sánh chuỗi
Nhập môn lập trình - Mảng, chuỗi
1. int stringCompare(const char str1[], const char str2[])
2. {
3. int i = 0;
4. while(str1[i]==str2[i]&&str1[i]!='\0'&&str2[i]!='\0')
5. i++;
6. if(str1[i]>str2[i])
7. return 1;
8. else if (str1[i]<str2[i])
9. return -1;
10. else
11. return 0;
12. };
69
Tìm kiếm
Nhập môn lập trình - Mảng, chuỗi
Viết hàm tìm kiếm vị trí của một chuỗi nguồn trong chuỗi
đích
Hàm trả về số nguyên là vị trí đầu tiên tìm thấy
Hàm trả về số âm nếu không tìm thấy
Đối số của hàm là hai chuỗi
Mã giả?
?
?
?
?
70
Ví dụ tham khảo về tìm kiếm chuỗi
Nhập môn lập trình - Mảng, chuỗi
Hoạt
động??
1. int stringSearch(const char str1[], const char str2[])
2. {
3. int i=0, j=0;
4. while(str1[i]!='\0' && str2[j]!='\0')
5. {
6. if(str1[i+j]!=str2[j])
7. {
8. i++; j=0;
9. }
10. else
11. j++;
12. if (str2[j]=='\0')
13. return i;
14. }
15. return -1;
16. }
71
Hết
Nhập môn lập trình - Mảng, chuỗi
Khái niệm chuỗi
Khai báo, khởi tạo
Phần tử của chuỗi
Thư viện string.h
Thư viện stdlib.h
Một vài bài toán về
chuỗi
Bài tập về nhà
Nhập vào họ và tên, đếm số ký tự alphabet
Ví dụ: Nhập “Tran Van An ”, xuất ra có 9 ký
tự
Nhập vào một chuỗi, đếm số chữ
Ví dụ: Nhập “Day la mot chuoi ky tu”, xuất
ra có 6 chữ
Nhập vào họ và tên, xuất ra họ, chữ đệm và
tên
Ví dụ: Nhập “Tran Van An”, xuất ra họ Tran,
chữ đệm Van, tên An
Nhập vào một số, xuất ra chữ viết của số đó
Ví dụ: Nhập 456, xuất ra: Bon tram nam
muoi sau
72
Các file đính kèm theo tài liệu này:
- bai_giang_nhap_mon_lap_trinh_chuong_6_mang_mot_chieu_chuoi_n.pdf