1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Kỹ thuật lập trình: Bài 4 - TS. Ngô Hữu Dũng

30 6 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

Bài giảng Kỹ thuật lập trình: Bài 4 do TS. Ngô Hữu Dũng biên soạn cung cấp cho người học các kiến thức: Khái niệm chuỗi ký tự, khởi tạo giá trị, các phép gán trực tiếp cho chuỗi bị hạn chế, nhập chuỗi từ bàn phím, phần tử của chuỗi, thư viện string.h,...

Kỹ thuật lập trình Bài – Chuỗi ký tự Ngơ Hữu Dũng 91 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Khái niệm  Mảng kiểu ký tự   Chuỗi ký tự      char word [] = {'H','e','l','l','o','!','\0'}; char word [] = "Hello!"; Chuỗi ký tự bao gồm ký tự đặc biệt nằm cuối chuỗi   char word [] = {'H','e','l','l','o','!'}; Báo hiệu kết thúc chuỗi Được hiểu ký tự NULL, viết '\0' Một chuỗi, ví dụ "Hello!", bao hàm ký tự kết thúc, tức char[7] Kiểu liệt kê, ví dụ {'H','e','l','l','o','!','\0'}, tức char[7] 92 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Khai báo   Cú pháp char [] = ; Cần xác định kích cỡ chuỗi    cần đủ lớn để chứa    lớn chiều dài bao gồm ký tự ký tự NULL (\0) Nếu không khai báo (để trống)    Khai báo Khởi tạo giá trị cho biến Cần khởi tạo chuỗi ban đầu cho biến Kích cỡ biến chiều dài chuỗi (gồm ký tự NULL) khởi tạo hợp lệ?   93 nằm dấu hai nháy “” liệt kê {} ký tự bao gồm ký tự NULL, ‘\0’, cuối Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngơ Hữu Dũng Ví dụ khai báo 10 11 12 94 char char char char char char char char char char char char hello[] = "Hello!"; // char[7] hi[] = {'H','i','!','\0'}; // char[4] name[10]; classname[20] = " Lop tin hoc "; city[20] = "TP HCM"; empty[] = ""; empty1[10] = ""; country[] = {'V','N'};// Array, not string! gender[2] = "male"; // Error!? Overflow classroom = "V10.4"; // Error!? Char vs string university[] = 'IUH'; // Error!? Char vs string a[]; // Error!? unknown size Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Khởi tạo giá trị  Một khởi tạo giá trị: char hello[] = "Hello!";   Tương đương với  char hello[] = {'H','e','l','l','o','!','\0'};  char hello[7] = {'H','e','l','l','o','!','\0'};  char hello[7] = "Hello!"; Một khởi tạo giá trị: char empty[] = "";  95 Tương đương với  char empty[] = {'\0'};  char empty[1] = {'\0'};  char empty[1] = ""; Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngơ Hữu Dũng Khởi tạo giá trị (2)  Một khởi tạo giá trị:    'H' char hi[7] = "Hi!"; char hi[7] = {'H','i','!','\0'}; 'i' '!' '\0' Khởi tạo chuỗi dài, dùng dấu \ để xuống dòng       96 char longstring[] = "Toi la sinh vien Cong nghe Thong \ tin\nTruong Dai hoc Cong Nghiep TP HCM.\n\ Than chao cac ban!"; char longstring[] = "Toi la sinh vien Cong nghe Thong " "tin\nTruong Dai hoc Cong Nghiep TP HCM.\n" "Than chao cac ban!"; Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngơ Hữu Dũng Phép gán  Các phép gán trực tiếp cho chuỗi bị hạn chế   Bởi trình biên dịch xử lý với chuỗi mảng Một khởi tạo giá trị: char hello[] = "Hello!";   Các phép gán trực tiếp sau bị trình biên dịch báo lỗi hello = "Good morning!"; // Error!   hello = "Hi!";   // Error! const char[4] gán cho char[7] hello = hi;  97 “Good morning!” const char[14] không gán cho char[7] // Error! char[4] khơng thể gán cho char[7] Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Phép gán (2)  Một khai báo char name[10];  name = "Quang";    const char[6] không gán cho char[10] name = hello;  // Error! // Error! char[7] không gán cho char[10] Làm để thay đổi giá trị chuỗi?     98 Dùng hàm xử lý chuỗi scanf Thay đổi phần tử Các hàm thư viện string.h Tự viết hàm xử lý chuỗi ký tự Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngơ Hữu Dũng Nhập chuỗi từ bàn phím  Dùng hàm scanf thư viện stdio.h  scanf("%s",name);   scanf("%[^\n]s",name);   99 Nhập "My_name_is_C", name = "My_name_is" scanf("%s %s",name1, name2);   Nhập "My name is C", name = "My nam" scanf("%10s",name);   Nhập "My name is C", name = "My name is C" scanf("%[^e]s",name);   Nhập "My name is C", name = "My" Nhập "My name is C", name1 = "My", name2 = "name" scanf tự động thêm ký tự NULL vào sau chuỗi nhận từ bàn phím Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Phần tử chuỗi  Phép khởi tạo char hello[] = "Hello!";   Phép gán sau hello = "Hi!"; bị báo lỗi!       Có thể thay phép gán lệnh: hello[0] = 'H'; hello[0] hello[1] hello[2] hello[1] = 'i'; 'H' 'e' 'l' hello[2] = '!'; hello[3] = '\0'; hello[3] hello[4] hello[5] hello[6] 'l' 'o' '!' '\0' Xuất chuỗi: printf("%s", hello);   hello[0] = 'H', hello[1] = 'e', hello[2] = 'l',… hello[6] = '\0' printf("%s", "e"); // "e"= {'e', '\0'} Xuất ký tự: printf("%c", hello[1]);  100 printf("%c", 'e'); Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Thư viện string.h (6)  char * strtok( char * str, const char * delimiters): Chia chuỗi thành chuỗi      // “Lop” // “Tin” // “11” void * memset( void * ptr, int value, size_t num): Điền giá trị value vào num bytes ô nhớ biến ptr   Char classname[20] = “ Lop tin:11”; printf("%s\n",strtok(classname," :")); printf("%s\n",strtok(NULL," :")); printf("%s\n",strtok(NULL," :")); memset(hello,'2',2); // hello = “22llo!” void * memcpy( void * destination, const void * source, size_t num ): Chép num ô nhớ biến source vào biến destination  106 memcpy(hello,hi,3); // hello = “Hi!lo!” Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Thư viện string.h (7)  void * memmove( void * destination, const void * source, size_t num): Giống memcpy cho phép chồng lấn       memmove(hello,hi,3); // hello = “Hi!lo!” memcpy(hello,hello+3,3); // hello = “lo!lo!” trường hợp chồng lấn int memcmp( const void * ptr1, const void * ptr2, size_t num): So sánh ô nhớ const void * memchr( const void * ptr, int value, size_t num ): Tìm kiếm Ghi chú: Các lệnh memory (mem) không phân biệt kiểu liệu, thao tác với liệu binary ô nhớ void * memset( void * ptr, int value, size_t num): Điền giá trị value vào num bytes ô nhớ biến ptr  107 memset(hello,'2',2); // hello = “22llo!” Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngơ Hữu Dũng Thư viện string.h (8)  void * memcpy( void * destination, const void * source, size_t num )    void * memmove( void * destination, const void * source, size_t num)     trường hợp chồng lấn So sánh num ô nhớ const void * memchr( const void * ptr, int value, size_t num )   Giống memcpy cho phép chồng lấn memmove(hello,hi,3); // hello = “Hi!lo!” memcpy(hello,hello+3,3); // hello = “lo!lo!” int memcmp( const void * ptr1, const void * ptr2, size_t num)   Chép num ô nhớ biến source vào biến destination memcpy(hello,hi,3); // hello = “Hi!lo!” Tìm kiếm giá trị value Ghi chú: Các lệnh memory (mem) không phân biệt kiểu liệu, thao tác với liệu binary ô nhớ 108 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Chuyển đổi chuỗi số   Thư viện chứa hàm chuyển đổi chuỗi số int atoi (const char * str)    double atof (const char* str)    Chuyển đổi chuỗi sang kiểu số thực trả số thực atof("34.5 53") = 34.5 long int atol ( const char * str )   Chuyển chuỗi str sang số nguyên trả giá trị số nguyên atoi("34.5 53") = 34 Chuyển đổi chuỗi sang kiểu long int (4 bytes) long long int atoll ( const char * str )  109 Chuyển đổi chuỗi sang kiểu long long int (8 bytes) Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Chiều dài chuỗi  Chiều dài chuỗi 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 chuỗi    Hàm có kiểu nguyên, trả chiều dài chuỗi (output) Đối số hàm chuỗi (input) Mã giả:      110 Khai báo biến đếm khởi tạo giá trị Duyệt đếm phần tử chuỗi Dừng đếm gặp ký tự ‘\0’ Trả chiều dài chuỗi dựa vào giá trị biến đếm Tương tự hàm strlen thư viện string.h Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngơ Hữu Dũng Ví dụ tham khảo hàm tính chiều dài chuỗi int stringLength(const char str[]) { int count = 0; while (str[count] != '\0') count++; return count; } 10 11 12 111 int main() { char hello[] = "Hello!"; printf("%d",stringLength(hello)); } Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngô Hữu Dũng Chép chuỗi  Viết hàm chép nội dung chuỗi nguồn vào chuỗi đích    Chuỗi đích mang giá trị chuỗi nguồn (output) Đối số hàm hai chuỗi, nguồn đích (input) Mã giả        Tương tự lệnh strcpy thư viện string.h Hàm có kiểu trả void  112 Khai báo biến chạy khởi gán giá trị ban đầu Duyệt phần tử chuỗi nguồn Gán giá trị phần tử chuỗi nguồn sang chuỗi đích Dừng chép gặp ký tự ‘\0’ Gán ký tự ‘\0’ vào cuối chuỗi đích Bạn trả chuỗi đích cho hàm biết dùng trỏ, pointer (sẽ học sau) Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngơ Hữu Dũng Ví dụ tham khảo hàm chép chuỗi 10 11 12 13 14 113 void stringCopy(char str1[], const char str2[]) { int i=-1; do{ i++; str1[i]=str2[i]; }while (str2[i]!='\0'); } int main() { char hello[10]; stringCopy(hello,"Hello!"); printf("%s",hello); } Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngơ Hữu Dũng Nối chuỗi  Viết hàm nối chuỗi nguồn vào cuối chuỗi đích    Chuỗi đích mang giá trị kết việc nối hai chuỗi Đối số hàm gồm hai chuỗi Mã giả  Khai báo hai biến chạy khởi gán giá trị ban đầu        114 Biến chạy cho chuỗi nguồn, đầu chuỗi nguồn Biến chạy cho chuỗi đích, cuối chuỗi đích Duyệt phần tử chuỗi nguồn Gán giá trị phần tử chuỗi nguồn vào chuỗi đích Dừng chép gặp ký tự NULL chuỗi nguồn Gán ký tự NULL vào chuỗi đích Hàm tương tự hàm strcpy thư viện string.h Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngơ Hữu Dũng Ví dụ tham khảo hàm nối chuỗi 10 11 12 13 14 115 void stringAppend(char dest[], const char src[]) { int i = stringLength(dest)-1, j = -1; do{ i++;j++; dest[i]=src[j]; }while(src[j]!='\0'); } int main() { char thanks[20] = "Thank"; stringAppend(thanks, " you!"); printf("%s",thanks); } Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngơ Hữu Dũng So sánh chuỗi  Viết hàm so sánh hai chuỗi ký tự str1 str2  Hàm trả giá trị      < str1 < str2 = str1 = str2 > str1 > str2 Hàm có đối số hai chuỗi cần so sánh Mã giả   Khai báo khởi tạo cho biến chạy Duyệt phần tử    116 Gặp phần tử khác Hoặc kết thúc hai chuỗi So sánh phần tử cuối trả giá trị so sánh tương ứng Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ngơ Hữu Dũng Ví dụ tham khảo hàm so sánh chuỗi int stringCompare(const char str1[], const char str2[]) { int i = 0; while(str1[i]==str2[i]&&str1[i]!='\0'&&str2[i]!='\0') i++; if(str1[i]>str2[i]) return 1; else if (str1[i]

Ngày đăng: 08/05/2021, 19:19