Slide bài giảng Lập trình C++ - Lương Trần Hy Hiến - Mảng và xâu kí tự
Nội dung
Mảng
khai báo
cấu trúc, thao tác
2
Xâu ký tự
tạo xâu, nhập, xuất
một sốhàm xâu
Một sốthuật toán sắp xếp và tìm kiếm
Tóm tắt nội dung Slide bài giảng Lập trình C++ - Lương Trần Hy Hiến - Mảng và xâu kí tự, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
có 100 phần tử kiểu thực •const int MAX = 100; double mangthuc[MAX]; Ví dụ void main() { int c[12]; 6 for (int i=0; i<12; i++) { cin >> c[i]; } } 7 Khai báo mảng void main() { int a[12]; int b[] = {2, 3, 5, 7}; 8 int c[5] = {2, 4, 8, 16}; int d[2] = {1, 2, 3}; // compile error int m[5], i; … } Kích thước mảng không cần biết trước void main() { int n, max = 0; cin >> n; int a[n]; 9 for (int i=0; i<n; i++) { cin >> a[i]; if (a[max] < a[i]) max = i; } if (n > 0) cout << "max number = " << a[max]; } Mảng là tham số Có thể truyền mảng là tham số cho một hàm Như là tham chiếu (nhận sự thay đổi) Hàm cần phải biết kích thước của mảng 10 thông qua một tham số phụ thông qua giá trị kết thúc mảng Ví dụ: copy mảng void arrayCopy(int a[], int b[], int size) { for (int i=0; i<size; i++) b[i] [i] 11 = a ; } Mảng 1 chiều Các thao tác thường gặp trên mảng một chiều: Qui ước mảng: int A[100]; // mảng có thể chứa tối đa 100 phần tử int n; // số phần tử thật sự sẽ sử dụng Các thao tác trên mảng một chiều th ờng đi kèm với một vòng 12 ư for Nhập một dãy (giả sử đã nhập n) for (int i = 0 ; i < n ; i++) { cout << “Nhập vào phần tử thứ “ << i << “ của mảng: “; cin >> A[i]; } Mảng 1 chiều Bài toán: Tìm vị trí X trên mảng a đang có N thành phần. Giải pháp: Tìm tuần tự 13 int linearSearch(int, int [], int); void main() { int a[100], key; … cin >> key; cout << linearSearch(key a 100); 14 , , } int linearSearch(int k, int m[], int size) { for (int i=0; i< size; i++) { if (k == m[i]) return i; } return -1; } Mảng 1 chiều Xuất dãy // định dạng độ rộng để xuất #include for (int i = 0 ; i < n ; i++) cout << setw(6)<<A[i]; 15 Thêm một phần tử v vào cuối dãy A[n++] = v; Thêm một phần tử v vào đầu dãy for (int i = n ; i > 0 ; i--) A[i] = A[i-1]; A[0] = v; n++; Mảng – Thêm X vào cuối dãy 1 2 3 4 5 6 70 Thêm 15 vào (a, 7) 16 2 8 5 1 6 4 15 12 N = 78 a[N] = X; N ++;X Mảng 1 chiều Thêm một phần tử v vào vị trí thứ k của dãy for (int i = n ; i > k ; i--) A[i] = A[i-1]; 17 A[k] = v; n++; Xóa phần tử nằm tại vị trí thứ k của dãy n--; for (int i = k ; i < n ; i++) A[i] = A[i+1]; Sắp xếp dãy theo thứ tự tăng dần: Interchange Sort for (int i = 0 ; i < (n – 1) ; i++) { 23 for (int j = i + 1 ; j < n ; j++) if (A[j] < A[i]) { int temp = A[j]; A[j] = A[i]; A[i] = temp; } } Tìm Min int min = A[0]; for (int i = 1 ; i < n ; i++) if (A[i] < min) min = A[i]; 24 cout << “Phần tử nhỏ nhất là: “ << min; Tìm Max int max = A[0]; for (int i = 1 ; i < n ; i++) if (A[i] > max) max = A[i]; cout << “Phần tử lớn nhất là: “ << max; Tính tổng int tong = 0; for (int i = 0 ; i < n ; i++) 25 tong += A[i]; Tính trung bình cộng int tong = 0; for (int i = 0 ; i < n ; i++) tong += A[i]; double TBC = tong * 1.0 / n; Đảo ngược dãy for (int i = 0 ; i < n / 2; i++) { 26 int temp = A[i]; A[i] = A[n – i – 1]; A[n – i – 1] = temp; } Bài tập Viết các hàm tính giá trị lớn nhất, giá trị nhỏ nhất, giá trị trung bình của một mảng số nguyên. 27 Mảng 2 chiều Khai báo mảng: Mảng 2 chiều: Kiểu Tên-mảng[số dòng][số cột]; Ý nghĩa: là một ma trận có dòng và <số 0 1 … SC-1 0 1 … SD-1 28 cột> cột. Phần tử đầu tiên nằm ở vị trí dòng thứ 0, cột thứ 0. Phần tử cuối cùng nằm ở vị trí dòng - 1 và cột - 1. Lưu ý: số dòng, số cột phải là một hằng số hoặc một biểu thức của các hằng số. •Ví dụ: int A[10][5]; // ma trận 10 dòng, 5 cột const int MAXX = 10; const int MAXY = 5; int A[MAXX][MAXY]; Mảng 2 chiều int a[7][7]; int b[2][3] = { {2, 4, 6}, {3, 5, 7} }; for (int i=0; i<2; i++){ 29 for (int j=0; j<3; j++) cout << b[i][j]<<“\t”; cout << endl; } Bản chất là mảng một chiều Mảng 2 chiều Các thao tác thường gặp trên mảng hai chiều: Qui ước mảng: int A[100][100]; // mảng có thể chứa tối đa 100x100 phần tử int m, n; // số dòng và số cột thật sự sẽ sử dụng Các thao tác trên mảng hai chiều thường đi kèm với hai vòng for Nhập một dãy (giả sử đã nhập m, n) 30 for (int i = 0 ; i < m ; i++) { for (int j = 0 ; j < n ; j++) { cout << “Nhập phần tử tại dòng “ << i << “ cột “ << j << “ của mảng: “; cin >> A[i][j]; } } Xuất ma trận //setw(6); // định dạng độ rộng để xuất for (int i = 0 ; i < m ; i++) 31 { for (int j = 0 ; j < n ; j++) cout << setw(6)<< A[i][j]; cout << endl; } Thêm một dòng v vào cuối ma trận for (int j = 0 ; j < n ; j++) A[m][j] = v[j]; m++; 32 Thêm một dòng v vào vị trí dòng thứ k for (int i = m ; i > k ; i++) { for (int j = 0 ; j < n ; j++) A[i][j] = A[i-1][j]; } for (int j = 0 ; j < n ; j++) A[k][j] = v[j]; m++; Xóa dòng thứ k m--; for (int i = k ; i < m ; i++) 33 { for (int j = 0 ; j < n ; j++) A[i][j] = A[i+1][j]; } Tìm kiếm vị trí phần tử mang giá trị x int dem = 0; for (int i = 0 ; i < m ; i++) { 34 for (int j = 0 ; j < n ; j++) if (A[i][j] == x) { cout << “Vị trí dòng “ << i << “ cột “ << j << endl; dem++; } } if (dem == 0) cout << “Phần tử ” << x << “ không có trong ma trận.”; Chuỗi - Xâu ký tự Mảng các ký tự char name[30]; char str[] = ”hello”; 35 Trong C/C++ xâu kết thúc bằng ký tự \0. kích thước bộ nhớ và độ dài có nghĩa là khác nhau. h e l l o \0str char first_name[5] = { 'J', 'o', 'h', 'n', '\0' }; char last_name[6] = "Minor"; char other[] = "Tony Blurt"; Chuỗi ký tự - Ví dụ 36 char characters[7] = "No null"; first_name last_name other characters 'J' 'o' 'h' 'n' 0 'M' 'i' 'n' 'o' 'r' 0 'T' 'o' ‘n’ 'y' 32 'B' 'l' 'u' 'r' 't' 0 'N' 'o' 32 'n' 'u' 'l' 'l' 0 Lưu ý: kết thúc chuỗi #include using namespace std; int main() { char other[] = "Tony Blurt"; cout<<other; "Blurt" sẽ không được in ra 37 other[4] = '\0'; cout<<other; return 0; } Tony Blurt Tony other 'T' 'o' ‘n’ 'y' 32 'B' 'l' 'u' 'r' 't' 0 Khai báo, nhập/xuất xâu #include using namespace std; #include void main() { 38 char s1[] = ”Hello”; char s2[] = ”What’s your name?”; char name[30]; cout << s1 << endl << s2 << endl; cin >> name; cout << name << ”, welcome!”; } Tham số là xâu ký tự Về cơ bản như mảng Như là tham số biến Có phần tử kết thúc xâu nên thường không cần 39 truyền kích thước void stringCopy(char s1[], char s2[]) { int i = 0; while (s1[i] > 0) { 40 s2[i] = s1[i]; i++; } s2[i] = 0; } Một số hàm thư viện xâu Sử dụng thư viện cstring (thư viện C++) #include Một số hàm strlen(s) : trả l i kích th ớc xâu s 41 ạ ư strcpy(s1, s2) : copy s2 vào s1 strcmp(s1, s2) : so sánh, nếu bằng thì kết quả là 0; có phân biệt IN HOA – in thường stricmp(s1, s2) : so sánh, nếu bằng thì kết quả là 0; không phân biệt IN HOA – in thường strupr(s): Đổi toàn bộ các ký tự của chuỗi thành IN HOA strlwr(s): Đổi toàn bộ các ký tự của chuỗi thành in thường Chuỗi ký tự – Một số hàm thư viện Gán nội dung chuỗi: o Chép toàn bộ chuỗi source sang chuỗi dest: int strcpy(char *dest, const char 42 *src); o Chép tối đa n ký tự từ source sang dest: int strncpy(char *dest, const char *src, int n); Tạo chuỗi mới từ chuỗi đã có: char *strdup(const char *src); #include using namespace std; int main() { char s[] = "Tony Blurt"; Chuỗi ký tự – ví dụ strcpy Tony Blurt To123Blurt Blurt 43 char s2[100], *s3; strcpy(s2, s); cout<<s2; strncpy(s2 + 2, "12345", 3); cout<<s2; s3 = strdup(s + 5); cout<<s2; return 0; } Chuỗi ký tự – Một số hàm thư viện Nối chuỗi: char *strcat(char *dest, const char *src); Tách chuỗi: 44 char *strtok(char *s, const char *sep); Trả về địa chỉ của đoạn đầu tiên. Muốn tách đoạn kế tiếp tham số thứ nhất sẽ là NULL #include #define SEPARATOR "., " int main() { Chuỗi ký tự – ví dụ strtok Thu strtok: 9 123 45 45 char s[]= "Thu strtok: 9,123.45"; char *p; p = strtok(s, SEPARATOR); while (p != NULL) { cout<<p; p = strtok(NULL, SEPARATOR); } return 0; } Chuỗi ký tự – Một số hàm thư viện Tìm một ký tự trên chuỗi: char *strchr(const char *s, int c); 46 Tìm một đoạn ký tự trên chuỗi: char *strstr(const char *s1, const char *s2); #include using namespace std; int main() { Chuỗi ký tự – ví dụ tìm kiếm 47 char s[]= "Thu tim kiem chuoi"; char *p; p = strchr(s, 'm'); cout<<p; p = strstr(s, "em"); cout<<p; return 0; } m kiem chuoi em chuoi #include void StrIns(char *s, char *sub) { int len = strlen(sub); Chuỗi ký tự – chèn một đoạn ký tự 48 memmove(s + len, s, strlen(s)+1); strncpy(s, sub, len); } int main() { char s[]= "Thu chen"; StrIns(s, "123"); cout<<s; StrIns(s + 8, "45"); cout<<p; return 0; } 123 Thu chen 123 Thu 45chen #include void StrDel(char *s, int n) { memmove(s, s + n, strlen(s+n)+1); Chuỗi ký tự – xóa một đoạn ký tự xoa 12345 49 } int main() { char s[]= "Thu xoa 12345"; StrDel(s, 4); cout<<s; StrDel(s + 4, 3); cout<<p; return 0; } xoa 45 Mảng xâu char names[100][30]; for (int i=0; i<100; i++) { 50 cin >> names[i]; cout << strlen(names[i]); } Bài tập Viết hàm tạo xâu nghịch đảo: nhận tham số là xâu, tạo xâu nghịch đảo của chính xâu đó và ghi kết quả vào chính xâu tham số vào. Viết hàm kiểm tra m t xâu ký t có nằm trong 52 ộ ự một xâu ký tự khác hay không. Tự thực hành Thao tác thành thạo với mảng một chiều Cài đặt các hàm sắp xếp và tìm kiếm Thao tác với xâu ký tự 53 nhập xuất, tạo hằng xâu sử dụng các hàm thư viện copy, so sánh,…
File đính kèm:
- Slide bài giảng Lập trình C++ - Lương Trần Hy Hiến - Mảng - Xâu kí tự.pdf