Bài giảng Phương pháp lập trình - Chương VII: Chuỗi - Nguyễn Văn Thắng

ppt 34 trang hapham 991
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Phương pháp lập trình - Chương VII: Chuỗi - Nguyễn Văn Thắng", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptbai_giang_phuong_phap_lap_trinh_chuong_vii_chuoi_nguyen_van.ppt

Nội dung text: Bài giảng Phương pháp lập trình - Chương VII: Chuỗi - Nguyễn Văn Thắng

  1. CHƯƠNG VII:CHUỔI
  2. KHÁI NIỆM • Chuỗi ký tự là một dãy gồm các ký tự hoặc một mảng các ký tự được kết thúc bằng ký tự ‘\0’ (còn được gọi là ký tự NULL trong bảng mã Ascii). • Các hằng ký tự được đặt trong cặp dấu nháy kép Ví dụ : char jenny [20];
  3. KHAI BÁO • Khai báo theo mảng char [Chiều dài tối đa] • Ví dụ: char Ten[12]; Trong khai báo này, bộ nhớ sẽ cung cấp 12+1 bytes để lưu trữ nội dung của chuỗi ký tự Ten; byte cuối cùng lưu trữ ký tự ‘\0’ để chấm dứt chuỗi.
  4. KHAI BÁO •Khai báo theo con trỏ •Cú pháp: char * •Ví dụ: char *Ten; Trong khai báo này, bộ nhớ sẽ dành 2 byte để lưu trữ địa chỉ của biến con trỏ Ten đang chỉ đến, chưa cung cấp nơi để lưu trữ dữ liệu.
  5. Vừa khai báo vừa gán giá trị • Chuổi ký tự giống như mảng bình thường do đó để khởi tạo một chuổi ký tự với những giá trị xác định ta có thể thực hiện tương tự như với mảng. • Ví dụ: char mystring[] = { 'H’, 'e', 'l', 'l', 'o', '\0' }; Hoặc char mystring [] = "Hello";
  6. Vừa khai báo vừa gán giá trị Cú pháp: char [ ]= Ví dụ: #include #include void main() { char Chuoi[]= “Truong Dai Hoc Cong Nghiep TP.HCM” ; cout<<Chuoi ; getch(); }
  7. CÁC THAO TÁC TRÊN CHUỖI KÝ TỰ Nhập xuất Để nhập dữ liệu kiểu ký tự hoặc chuỗi từ bàn phím ta dùng hàm get() Cú pháp: cin.gets( , Số KTự) Hoặc cin.get()
  8. CÁC THAO TÁC TRÊN CHUỖI KÝ TỰ • Nhập một chuỗi ký tự tối đa n-1 ký tự từ bàn phím dùng hàm getline() • Cú pháp: cin.getline(st,n) Hàm cho phép nhập vào biến st (st là một mảng char) n-1 ký tự, nếu nhập hơn thì phần ký tự còn lại sẽ để trên vùng đệm
  9. Lưu ý Ta cũng có thể dùng cin để nhập ký tự hoặc chuỗi nhưng trong trường hợp này nó không cho phép nhập ký tự trắng hoặc chuỗi có ký tự trắng
  10. Ví dụ : #include #include void main() { const int MAX=10; char st[MAX]; cout <<"Nhap mot chuoi toi da “<<(MAX-1)<<” ky tu "; cin.getline(st,MAX); cout <<”Chuoi vua nhap la :” <<st; getch(); return; }
  11. Lưu ý: • Khi nhập dữ liệu nếu chúng ta nhập quá số ký tự qui định (MAX-1) thì có thể ảnh hưởng đến những lệnh nhập sau hoặc có thể làm ảnh hưởng đến hoạt động của máy tính. • Để tránh tình trạng này thường sau khi nhập dữ liệu bằng cin, cin.get, cin.getline ta sử dụng hàm cin.ignore
  12. Lưu ý: • Cú pháp cin.ignore(int n, ‘\n’) • Công dụng của hàm là bỏ qua tối đa n trong vùng đệm hoặc khi gặp phím enter (\n)thì kết thúc lệnh cin.
  13. Ví dụ #include #include #include #include void main() { const int MAX=5; char a[MAX],b[MAX],i; clrscr(); cout <<"nhap mot chuoi"; cin.getline(a,5); //(1) cin.ignore(100,'\n'); cout <<"nhap mot chuoi"; in.getline(b,5); //(2) cout<<a<<” “<<b; getch(); }
  14. Truy xuất từng ký tự trong chuỗi: • Do chuỗi là một mảng ký tự vì vậy ta có thể truy xuất chuỗi bằng chỉ số giống như truy xuất mảng. • Ví dụ: Xây dựng hàm có hai tham số để nhận hai chuổi sau đó copy nội dung chuỗi thứ hai sang chuỗi thứ nhất.
  15. void strcopy(char st1[], char st2[]) { int i=0; while (st2[i] != ‘\0’) { st1[i]=st2[i]; i++; } st1[i]=’\0’; }
  16. void main() { const int max=30; char st1[max], st2[max]; int i; cout<<"nhap chuoi thu nhat:"; cin.getline(st2, max); cin.ingore(100,'\n'); strcopy(st1,st2); cout<<"chuoi thu hai la:"<<st2; getch(); }
  17. CON TRỎ và CÁC HÀM TRÊN CHUỖI
  18. Con trỏ và chuỗi • Con trỏ rất hữu ích trong việc xây dựng các hàm xử lý chuỗi. • Khi sử dụng con trỏ để truy xuất chuỗi thay cho chỉ số thì chương trình sẽ cô đọng và hiệu quả hơn. Ví dụ: Hàm strcopy sử dụng con trỏ. void strcopy(char st1[], char st2[]) { while (*st1++ = *st2++); }
  19. Ví dụ: #include #include #include void strcopy(char st1[], char st2[]); void main() { const int MAX=80; char str2[MAX],c,str1[MAX]; int i=0; clrscr(); cout <<"nhap mot chuoi \n"; cin.getline(str2,MAX); cin.ignore(100,'\n'); strcopy(str1,str2); cout<<"\n"<<str1; getch(); } void strcopy(char st1[ ], char st2[ ]) { while (*st1++=*st2++); }
  20. Các hàm thao tác với chuỗi thông dụng Tên hàm Công dụng Ví dụ Strcpy(string_var, Copy nội dung của chuỗi strcpy(st,”abcd”) string_exp) string_exp (biểu thức chuỗi) sang chuỗi string_var (biến chuỗi) strcat(string_var, Ghép nội dung của chuỗi strcat(test,”abcd”) string_exp) str_exp vào cuối chuỗi string_var strlen(str_exp) Trả về chiều dài thực của strlen(“Hello”) chuỗi, không tính ký tự ‘\0’
  21. Các hàm thao tác với chuỗi thông dụng strcmp(str_exp1, So sánh chuỗi str_exp1 và strcmp(“An str_exp2) str_exp2, kết quả của h”,”Lan”) hàm là: - số 0 str_exp1>str_exp2
  22. Các hàm thao tác với chuỗi thông dụng strncpy(str_var,s Copy n ký tự của strncpy(str1 tr_exp,n) string_exp sang str_var. ,str2,5) Nếu str_exp vượt quá n ký tự thì ký tự ‘\0’ sẽ không được chèn vào cuối chuỗi str_var
  23. Các hàm thao tác với chuỗi thông dụng strncmp(str_exp1,str_ so sánh n ký tự đầu của hai strncmp(“He exp2,n) chuỗi str_exp1 và str_exp2. y”,”Head”, Kết quả trả về của hàm giống 2) như hàm strcmp strchr(str_exp,char_e Trả về địa chỉ của ký tự đầu strchr(“Hello xp) tiên trong chuỗi str_exp ”,’e’) giống với char_exp, hàm có kết quả NULL nếu char_exp không có trong str_exp
  24. #include #include #include #include void main() { const int MAX=80; char str2[MAX],c,str1[MAX]; int n; clrscr(); cout =MAX-1) cin.ignore(100,'\n'); cout <<"Nhap chuoi thu 2: "; cin.getline(str2,MAX); n= strcmp(str1,str2);
  25. if (n<0) cout <<str1 <<" nho hon " <<str2<<endl; else if (n= =0) cout <<str1 <<" == " <<str2<<endl; else cout <<str1 <<" lon hon " <<str2<<endl; cout <<"Chieu dai chuoi thu 1 la: "<<strlen(str1)<<endl ; cout<<"Chieu dai chuoi thu 2 la: "<<strlen(str2)<<endl; strcat(str1,str2); //Sau khi noi chieu dai k0 duoc vuot qua pham vi cout<<"Sau khi noi str2 vao str1 \n"<<"chuoi 1 la: "<<str1<<endl; strcpy(str1,str2); cout <<"Sau khi copy noi dung str2 vao str1 \n" cout<<"chuoi 1 la: "<<str1<<endl; getch(); }
  26. Các hàm thao tác trên ký tự trong thư viện ctype.h Tên hàm Công dụng Ví dụ kết quả của hàm có giá isalpha(‘x’) int isalpha(char_exp) trị khác 0 khi char_exp là một chữ cái kết quả của hàm có giá isupper(‘a’) int isupper(char_exp) trị khác 0 khi char_exp là một chữ cái hoa kết quả của hàm có giá islower(‘a’) int islower(char_exp) trị khác 0 khi char_exp là một chữ cái thường
  27. Các hàm thao tác trên ký tự trong thư viện ctype.h kết quả của hàm có giá isdigit(‘a’) int isdigit(char_exp) trị khác 0 khi char_exp là một ký số kết quả của hàm có giá isascii(‘a’) trị khác 0 nếu char_exp int isascii(char_exp) là một ký tự có mã ascii <128 kết quả của hàm có giá isspace(‘ ’) int isspace(char_exp) trị khác 0 khi char_exp là một khoảng trắng
  28. Các hàm thao tác trên ký tự trong thư viện ctype.h kết quả của hàm có giá isprint(‘a’) trị khác 0 khi char_exp int isprint(char_exp) là một ký tự có thể in được kết quả của hàm có giá iscntrl(‘a’) int iscntrl(char_exp) trị khác 0 khi char_exp là một ký tự điều khiển kết quả của hàm có giá ispunct(‘!’) int ispunCt(char_exp) trị khác 0 khi char_exp là một ký tự dấu
  29. Các hàm thao tác trên ký tự trong thư viện ctype.h Kết quả của hàm là toupper(‘a’) ký tự hoa tương ứng int toupper(char_exp) với char_exp Kết quả của hàm là tolower(‘a’) ký tự thường tương int tolower(char_exp) ứng với char_exp
  30. Ví dụ #include #include #include #include void main() { const int MAX=80; int i; clrscr(); for (i=0;i<=255;i++) { if (i%22==0) { getch(); clrscr(); cout <<setw(3)<<"MaKT"<<setw(8)<<"KT ASCII"<<setw(8) <<"KT DK"<<setw(8)<<"KT IN"<<setw(8) <<"KT DAU"<<setw(8)<<"KY TU"<<endl; } cout <<setw(3)<<i<<setw(8)<<isascii(char(i))<<setw(10) <<iscntrl(char(i))<<setw(7)<<isprint(char(i))<<setw(8)<<ispunct(char(i)); if (isprint(char(i))) cout<<setw(7)<<char(i); cout <<endl; } getch(); }
  31. Các hàm chuyển đổi chuỗi trong thư viện stdlib.h: Chuyển một chuỗi sang số atoi(‘123 nguyên. Việc chuyển đổi sẽ a45’) int atoi(str_exp) dừng khi gặp ký tự không phải là ký số Chuyển một chuỗi sang số double double. Việc chuyển đổi sẽ atof(char_exp) dừng khi gặp ký tự không thể chuyển sang dạng double được
  32. Các hàm chuyển đổi chuỗi trong thư viện stdlib.h: Chuyển giá trị số nguyên char* itoa(int sang dạng chuỗi và gán vào value, char *st, int vùng nhớ mà con trỏ st radix) đang trỏ đến. st là một con trỏ kiểu ký tự Ví dụ: #include #include #include #include int test_int(char*); int test_float(char *st);
  33. void main() { const int MAX=10;char str2[MAX]; int n; double x; cout =MAX-1) cin.ignore(100,'\n'); if (test_int(str2)) { n=atoi(str2); cout<<'\n'<<n<<endl; } else cout <<"Nhap sai"; cout <<"nhap mot so double \n"; cin.getline(str2,MAX); if (test_float (str2)) { x=atof(str2); cout<<'\n'<<x<<endl; }else cout <<"Nhap sai";
  34. int test_int(char *st) { //12b3\0 while (isdigit(*(st))) st++; return ! int(*(st)); } int test_float(char *st) { while (isdigit(*(st))|| *(st)=='.' ) st++; return !int(*(st)); }