Ngôn ngữ lập trình C++ Chương 4 – Mảng CuuDuongThanCong.com https://fb.com/tailieudientucntt Chương 4 – Mảng Đề mục 4.4 Ví dụ về sử dụng mảng 4.5 Truyền tham số cho hàm 4.6 Sắp xếp mảng 4.7 Ví dụ: Dùng mảng tính Mean, Median và Mode 4.8 Tìm kiếm trên mảng: Tìm kiếm Tuyến tính và tìm kiếm Nhị phân 4.9 Mảng nhiều chiều CuuDuongThanCong.com https://fb.1 Giới thiệu • Mảng (array) – Cấu trúc của những phần tử dữ liệu có liên quan – Thực thể tĩnh (giữ nguyên kích thước trong suốt chương trình) • Một vài loại mảng – mảng dựa vào con trỏ (Pointer-based arrays) (C-like) – mảng là đối tượng (Arrays as objects) (C++) CuuDuongThanCong.com https://fb.2 Mảng • Mảng – Tập hợp các vùng nhớ liên tiếp – Cùng tên, cùng kiểu (int, char, .) • Truy nhập đến 1 phần tử – Chỉ ra tên mảng và vị trí - position (chỉ số - index) – Cú pháp: tên_mảng[ chỉ_số ] – Phần tử đầu tiên ở vị trí 0 • Mảng c có n phần tử c[ 0 ], c[ 1 ] … c[ n - 1 ] – Phần tử thứ N ở vị trí thứ N-1 CuuDuongThanCong.com https://fb.2 Mảng • Phần tử của mảng cũng như các biến khác – Gán giá trị và in mảng số nguyên c c[ 0 ] = 3; cout << c[ 0 ]; • Có thể sử dụng các phép toán trong cặp ngoặc vuông c[ 5 – 2 ] cũng giống c[3] CuuDuongThanCong.com https://fb.com/tailieudientucntt Tên mảng (Lưu ý rằng mọi phần tử của mảng này đều có cùng tên, c) c[0] -45 c[1] 6 c[2] 0 c[3] 72 c[4] 1543 c[5] -89 c[6] 0 c[7] 62 c[8] -3 c[9] 1 c[10] 6453 c[11] 78 Chỉ số của phần tử trong mảng c CuuDuongThanCong.com https://fb.3 Khai báo mảng • Khi khai báo mảng, chỉ rõ – Tên – Kiểu của mảng • Bất cứ kiểu dữ liệu nào – Số phần tử – type arrayName[ arraySize ]; int c[ 10 ]; // mảng của 10 số nguyên float d[ 3284 ]; // mảng của 3284 số thực • Khai báo nhiều mảng cùng kiểu – Sử dụng dấu phẩy như với các biến bình thường int b[ 100 ], x[ 27 ]; CuuDuongThanCong.com https://fb.4 Ví dụ về sử dụng mảng • Khởi tạo mảng – Dùng vòng lặp khởi tạo từng phần tử – Khởi tạo cả danh sách • Chỉ rõ từng phần tử khi khai báo mảng int n[ 5 ] = { 1, 2, 3, 4, 5 }; • Nếu trong danh sách không có đủ số giá trị khởi tạo, các phần tử ở bên phải nhất sẽ nhận giá trị 0 • Nếu danh sách thừa sẽ gây lỗi cú pháp – Khởi tạo giá trị bằng 0 cho tất cả các phần tử int n[ 5 ] = { 0 }; – Nếu không khai báo kích thước mảng, kích thước của danh sách các giá trị khởi tạo sẽ quyết định kích thước mảng int n[] = { 1, 2, 3, 4, 5 }; • Có 5 giá trị khởi tạo, do đó mảng có 5 phần tử • Nếu không khai báo kích thước mảng thì phải khởi tạo khi khai báo CuuDuongThanCong.com https://fb.com/tailieudientucntt 1 // Fig.cpp 2 // Initializing an array. 3 #include <iostream> 4 fig04_03.cpp 5 using std::cout; (1 of 2) 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; 11 Khai báo mảng 10 phần tử số nguyên. 12 int main() 13 { 14 int n[ 10 ]; Khởi tạo mảng bằng vòng lặp for. // n is an array of 10 integers 15 Chú ý rằng mảng gồm các phẩn tử 16 // initialize elements of array n to 0 từ n[0] đến n[9].
17 for ( int i = 0; i < 10; i++ ) 18 n[ i ] = 0; // set element at location i to 0 19 20 cout << "Element" << setw( 13 ) << "Value" << endl; 21 22 // output contents of array n in tabular format 23 for ( int j = 0; j < 10; j++ ) 24 cout << setw( 7 ) << j << setw( 13 ) << n[ j ] << endl; 25 CuuDuongThanCong.com https://fb.com/tailieudientucntt 26 return 0; // indicates successful termination 27 28 } // end main fig04_03.cpp (2 of 2) Element Value 0 0 fig04_03.cpp 1 0 output (1 of 1) 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 CuuDuongThanCong.com https://fb.com/tailieudientucntt 1 // Fig.cpp 2 // Initializing an array with a declaration. 3 #include <iostream> 4 fig04_04.cpp 5 using std::cout; (1 of 1) 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; 11 Lưu ý cách dùng danh sách 12 int main() khởi tạo cho mảng. 13 { 14 // use initializer list to initialize array n 15 int n[ 10 ] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 }; 16 17 cout << "Element" << setw( 13 ) << "Value" << endl; 18 19 // output contents of array n in tabular format 20 for ( int i = 0; i < 10; i++ ) 21 cout << setw( 7 ) << i << setw( 13 ) << n[ i ] << endl; 22 23 return 0; // indicates successful termination 24 25 } // end main CuuDuongThanCong.com https://fb.com/tailieudientucntt Element Value 0 32 1 27 2 64 fig04_04.cpp 3 18 4 95 output (1 of 1) 5 14 6 90 7 70 8 60 9 37 CuuDuongThanCong.com https://fb.4 Ví dụ về sử dụng mảng • Kích thước của mảng – Có thể được xác định bằng hằng số (const) • const int size = 20; – Hằng số không thể thay đổi – Hằng phải được khởi tạo khi khai báo – Còn được gọi là “named constant” (giá trị được đặt tên) hoặc “read-only variable” (biến chỉ đọc) CuuDuongThanCong.com https://fb.com/tailieudientucntt 1 // Fig.cpp 2 // Initialize array s to the even integers from 2 to 20. 3 #include <iostream> 4 fig04_05.cpp 5 using std::cout; (1 of 2) 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; 11 12 int main() Chú ý từ khoá const.
Chỉ có 13 { các biến const được dùng 14 để khai // constant variable can be used to báo kích specify thướcsize array mảng. 15 const int arraySize = 10; 16 17 int s[ arraySize ]; // array s has 10 elements 18 Chương trình dễ thay đổi hơn khi ta dùng hằng (const) cho kích thước của 19 for ( int i = 0; i < arraySize; i++ ) // set the values mảng.com https://fb.com/tailieudientucntt 24 // output contents of array s in tabular format 25 for ( int j = 0; j < arraySize; j++ ) 26 cout << setw( 7 ) << j << setw( 13 ) << s[ j ] << endl; 27 fig04_05.cpp 28 return 0; // indicates successful termination (2 of 2) 29 30 } // end main fig04_05.cpp output (1 of 1) Element Value 0 2 1 4 2 6 3 8 4 10 5 12 6 14 7 16 8 18 9 20 CuuDuongThanCong.com https://fb.com/tailieudientucntt 1 // Fig.cpp 2 // Using a properly initialized constant variable. 3 #include <iostream> 4 fig04_06.cpp 5 using std::cout; (1 of 1) 6 using std::endl; 7 Khởi tạo hằng fig04_06.cpp 8 int main() output (1 of 1) 9 { 10 const int x = 7; // initialized constant variable 11 12 cout << "The value of constant variable x is: " 13 << x << endl; 14 15 return 0; // indicates successful termination 16 17 } // end main The value of constant variable x is: 7 CuuDuongThanCong.com https://fb.com/tailieudientucntt 1 // Fig.cpp 2 // A const object must be initialized. 3 Lỗi cú pháp do không khởi tạo hằng.
4 int main() Sửa giá trị của hằng cũng là một lỗi.cpp 5 { (1 of 1) 6 const int x; // Error: x must be initialized 7 fig04_07.cpp 8 x = 7; // Error: cannot modify a const variable output (1 of 1) 9 10 return 0; // indicates successful termination 11 12 } // end main d:\cpphtp4_examples\ch04\Fig04_07.cpp(6) : error C2734: 'x' : const object must be initialized if not extern d:\cpphtp4_examples\ch04\Fig04_07.cpp(8) : error C2166: l-value specifies const object CuuDuongThanCong.com https://fb.com/tailieudientucntt 1 // Fig.cpp 2 // Compute the sum of the elements of the array. 3 #include <iostream> 4 fig04_08.cpp 5 using std::cout; (1 of 1) 6 using std::endl; 7 fig04_08.cpp 8 int main() output (1 of 1) 9 { 10 const int arraySize = 10; 11 12 int a[ arraySize ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 13 14 int total = 0; 15 16 // sum contents of array a 17 for ( int i = 0; i < arraySize; i++ ) 18 total += a[ i ]; 19 20 cout << "Total of array element values is " << total << endl; 21 22 return 0; // indicates successful termination 23 24 } // end main Total of array element values is 55 CuuDuongThanCong.com https://fb.com/tailieudientucntt fig04_09.cpp (1 of 2) 2 // Histogram printing program. 3 #include <iostream> Element Value Histogram 4 0 19 ******************* 5 using std::cout; 1 3 *** 6 using std::endl; 2 15 *************** 7 3 7 ******* 8 #include <iomanip> 4 11 *********** 9 5 9 ********* 10 using std::setw; 6 13 ************* 11 7 5 ***** 12 int main() 8 17 ***************** 13 { 9 1 * 14 const int arraySize = 10; 15 int n[ arraySize ] = { 19, 3, 15, 7, 11, 9, 13, 5, 17, 1 }; 16 17 cout << "Element" << setw( 13 ) << "Value" 18 << setw( 17 ) << "Histogram" << endl; 19 CuuDuongThanCong.com https://fb.com/tailieudientucntt 20 // for each element of array n, output a bar in histogram 21 for ( int i = 0; i < arraySize; i++ ) { 22 cout << setw( 7 ) << i << setw( 13 ) In số dấu saofig04_09. 24 25 for ( int j = 0; j < n[ i ]; j++ ) // print one bar 26 cout << '*'; fig04_09.cpp 27 output (1 of 1) 28 cout << endl; // start next line of output 29 30 } // end outer for structure 31 32 return 0; // indicates successful termination 33 34 } // end main Element Value Histogram 0 19 ******************* 1 3 *** 2 15 *************** 3 7 ******* 4 11 *********** 5 9 ********* 6 13 ************* 7 5 ***** 8 17 ***************** 9 1 * CuuDuongThanCong.com https://fb.com/tailieudientucntt 1 // Fig.cpp 2 // Roll a six-sided die 6000 times.
3 #include <iostream> 4 fig04_10.cpp 5 using std::cout; (1 of 2) 6 using std::endl; 7 8 #include <iomanip> 9 Viết lại một chương trình cũ. Một 10 using std::setw; mảng được sử dụng thay cho 6 11 biến thường, và các phần tử dễ 12 #include <cstdlib> dàng cập nhật hơn (không cần sử 13 #include <ctime> dụng switch). 14 15 int main() 16 { 17 const int arraySize = 7; 18 int frequency[ arraySize ] = { 0 }; Dòng lệnh này tạo ra một số trong 19 khoảng 1 đến 6 và tăng phần tử 20 srand( time( 0 ) ); // seed random-number generator frequency[] có chỉ số đó. 21 22 // roll die 6000 times 23 for ( int roll = 1; roll <= 6000; roll++ ) 24 ++frequency[ 1 + rand() % 6 ]; // replaces 20-line switch 25 // of Fig.com https://fb.com/tailieudientucntt 26 27 cout << "Face" << setw( 13 ) << "Frequency" << endl; 28 29 // output frequency elements 1-6 in tabular format fig04_10.