Lập trình cơ bản - Sử dụng mảng

Khai báo ma trận MxN (M, N là hằng số). Viết chương trình in ra những phần tử của mảng có số tận cùng là 7. 2. Viết chương trình in ra các phần tử nằm trên 2 đường chéo. 3. Viết chương trình tạo ma trận a các số nguyên gồm 9 dòng 14 cột. Trong đó a[i][j] = i*j; 4. Viết chương trình tính tổng các giá trị lớn nhất trên mỗi dòng (mỗi dòng chọn giá trị lớn nhất, sau đó cộng các giá trị này lại)

pdf43 trang | Chia sẻ: nguyenlam99 | Lượt xem: 971 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Lập trình cơ bản - Sử dụng mảng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
SỬ DỤNG MẢNG LÊ ĐỨC LONG-NGÔ QUỐC VIỆT 2011 NỘI DUNG 1. Khai báo và sử dụng mảng một hay hai chiều  Khai báo mảng một chiều  Thao tác trên dữ liệu mảng một chiều  Khai báo mảng hai chiều  Thao tác trên dữ liệu mảng hai chiều  Dùng mảng làm tham số cho hàm 2. Khai báo và sử dụng chuỗi.  Khai báo chuỗi ký tự  Nhập xuất chuỗi trên bàn phím và màn hình  Một số hàm dùng với chuỗi 3. Bài tập Ngô Quốc Việt-Lập trình cơ bản 2 MẢNG  100 quả trứng, mỗi quả trứng có vai trò, tính chất “gần như nhau” lưu trữ 100 biến ?  1000 số nguyên trong dãy số nguyên  lưu 1000 biến nguyên?  Tính trung bình cộng của một dãy n số (không phải tăng từ 1 đến n) cần lưu n giá trị dùng n biến?  Ví dụ: tính trung bình 10 giá trị  Nhập 10 giá trị từ bàn phím, lưu vô n1, n2, n3, n4, n5, n6, n7, n8, n9, n10.  Tính ntb = (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10) /10.0;  Khi n lớn thì sao? Không thể làm như vậy. Ngô Quốc Việt-Lập trình cơ bản 3 MẢNG Mảng được dùng để lưu trữ nhiều giá trị cùng kiểu và tham gia vào một vấn đề cụ thể. Mảng là một biến được cấp phát bộ nhớ liên tục và bao gồm nhiều biến thành phần.  Các thành phần của mảng là tập hợp các biến có cùng kiểu dữ liệu và cùng tên.  Để truy xuất thành phần, dùng chỉ số mảng. Ngô Quốc Việt-Lập trình cơ bản 4 Khai báo mảng một chiều [ ] ;  Ví dụ khai báo mảng integer 50 phần tử int iArr[5]; //kiểu integer, tên iArr, số phần tử: 5 Các phần tử của mảng iArr là iArr[0], iArr[1], ..iArr[4]: là các tên biến sử dụng được.  Ví dụ khai báo mảng float 50 phần tử float fArr[20]; //kiểu float, tên fArr, số lượng: 20 Ngô Quốc Việt-Lập trình cơ bản 5 iArr[0] iArr[1] iArr[2] iArr[3] iArr[4] Chỉ số phần tử mảng Sử dụng mảng một chiều  Chương trình khai báo, nhập và in ra mảng 10 phần tử integer #include int main() { int iMyArr[10]; cout << “Hay nhap 10 phan tu ” << endl; for (int i = 0; i < 10; i ++) { cout << “Nhap phan tu thu: “ << i; cin >> iMyArr[i]; cout << endl; } cout << “Cac phan tu moi nhap tinh tu cuoi la:” << endl; for (int i = 9; i >= 0; i --) { cout << iMyArr[i] << “’ ”; } } Ngô Quốc Việt-Lập trình cơ bản 6 Sử dụng mảng một chiều  Truy xuất các phần tử mảng thông qua chỉ số mảng. int iArr[5];  Chỉ số mảng bắt đầu từ zero.  Phần tử cuối cùng có chỉ số n-1, với n là kích thướcmảng Ngô Quốc Việt-Lập trình cơ bản 7 0 1 2 3 4 iArr[1]iArr[0] iArr[2] Sử dụng mảng một chiều Ngô Quốc Việt-Lập trình cơ bản 8 Sử dụng mảng một chiều Ngô Quốc Việt-Lập trình cơ bản 9  Khai báo tường minh và gán giá trị  Khai báo không tường minh Trường hợp với chuỗi - string Ngô Quốc Việt-Lập trình cơ bản 10 Processing an array – NNLT C Ngô Quốc Việt-Lập trình cơ bản 11 Lowercase to Uppercase Text Conversion /* read in a line of lowercase text to uppercase */ #include #include #define SIZE 80 void main ( ) { char letter[SIZE]; int count ; /* read in the line */ for (count = 0; count < SIZE; ++count) letter[count] = getchar(); /* display the line in uppercase */ for (count = 0; count < SIZE; ++count) putchar(toupper(letter[count])); } Sử dụng mảng một chiều Ngô Quốc Việt-Lập trình cơ bản 12 Khởi tạo mảng lúc khai báo  Mục đích: gán giá trị cho phần tử mảng lúc khai báo.  Khởi tạo khi biết rõ mảng cần giá trị nào.  Ví dụ, khai báo mảng chứa các loại tiền có mệnh giá 500, 1000, 2000, 5000, 10000. int iMoneyArr[5] = {500, 1000, 2000, 5000, 10000}’;  Ví dụ, khai báo mảng chứa các giá vé, không cần kích thước. Kích thước mảng xác định bởi số phần tử khởi tạo int iMoneyArr[] = {40000, 50000, 60000, 240000}’; Ngô Quốc Việt-Lập trình cơ bản 13 Ví dụ về mảng  Trả về giá trị lớn nhất trong mảng các số thực #include int main() { const int MAXPHANTU = 20; float fMyArr[MAXPHANTU]; cout << “Hay nhap “ << MAXPHANTU << “ phan tu ” << endl; for (int i = 0; i < MAXPHANTU; i ++) { cout << “Nhap phan tu thu: “ << i; cin >> fMyArr[i]; cout << endl; } float fMax = iMyArr[0]; for (int i = 1; i < MAXPHANTU; i ++) { if(fMax < fMyArr [i]) fMax = fMyArr [i]; } cout << “Gia tri lon nhat la: “ << fMax << endl; } Ngô Quốc Việt-Lập trình cơ bản 14 “Xoá” một phần tử ra khỏi mảng  “Xoá”: thật ra là “dồn” các phần tử phía sau phần tử cần xóa lên trên một vị trí.  “Xoá” một phần tử mảng không làm thay đổi kích thước mảng  Duyệt mảng từ trái sang phải . Xuất phát từ vị trí cần xoá tiến hành dời các phần tử về phía trước cho đến khi kết thúc mảng Ngô Quốc Việt-Lập trình cơ bản 15 “Xoá” một phần tử ra khỏi mảng  Ví dụ “xoá” một phần tử tại vị trí cho trước trong mảng void XoaPhanTuMatTai(int iArr[], int &n, int vitri) { if(vitri >= n || vitri < 0) return; for(int i = vitri; i < n-1; i ++) iArr[i] = iArr[i+1]; n = n-1; } Ngô Quốc Việt-Lập trình cơ bản 16 “Thêm” một phần tử vào mảng  “Thêm” một giá trị vào mảng: dời các phần tử về bên phải mảng, chừa ra một chỗ trống để đặt giá trị mới vào  “Thêm” một phần tử mảng không làm thay đổi kích thước mảng void ChenX (int a[], int &n, int X, int vitri) { for (int i = n; i >vitri ; i--) a[i] = a[i-1] ; a[vitri] = X; n++; } Ngô Quốc Việt-Lập trình cơ bản 17 Bài tập luyện tập 1. Viết chương trình nhập vào N ( <= 50)số nguyên, tính trung bình cộng N số nguyên đó 2. Nhập vào nhập vào N ( <= 50) số nguyên chứa trong mảng. Nhập vào phần tử x. Tìm vị trí xuất hiện của x trong mảng đã nhập. Nếu x không tồn tại trong mảng, xuất ra -1. 3. Sửa lại bài 2 với yêu cầu, viết hàm tìm vị trí phần tử có giá trị x xuất hiện cuối cùng trong mảng. 4. Viết hàm in vị trí các phần tử nguyên tố trong mảng các số nguyên. Ngô Quốc Việt-Lập trình cơ bản 18 Bài tập luyện tập 5. Viết hàm tính tổng các phần tử nằm ở vị trí lẻ trong mảng các số nguyên. 6. Viết hàm tính tổng các phần tử nằm ở vị trí nguyên tố trong mảng 7. Viết chương trình nhập M giá trị nguyên vào mảng. Thực hiện xoá ra khỏi mảng các giá trị âm. 8. Viết chương trình xóa phần tử nhỏ nhất ra khỏi mảng. 9. Viết hàm chèn phần tử có giá trị X vào phía sau phần tử có giá trị lớn nhất trong mảng Ngô Quốc Việt-Lập trình cơ bản 19 Sử dụng tham số mảng một chiều  Cho phép chuyển mảng một chiều giữa các hàm  Ví dụ về hàm có tham số dạng mảng //Trả về giá rịmax trongmảng //n: số phần tử trongmảng //iArr:mảng input int KiemtraMax(int iArr[], int n) { int iMax = iArr[0]; for(int i = 1; i < n; i ++) if(iMax < iArr[i]) iMax = iArr[i]; return iMax; } Ngô Quốc Việt-Lập trình cơ bản 20 Sử dụng tham số mảng một chiều int main() { int iArr[10]; cout << “Nhap 10 gia tri chomang” << endl for(int i = 0; i < 10; i ++) { cout < “Nhap gia tri cho phan tu thu: “ << i; cin >> iArr[i]; //nhap gia tri cho phan tu mang thu i coutn << endl; } int iMax = KiemtraMax(iArr, 10); cout << “Gia tri lon nhat la: “ << iMax; return 0; } Ngô Quốc Việt-Lập trình cơ bản 21 Sử dụng tham số mảng một chiều Ngô Quốc Việt-Lập trình cơ bản 22 An entire array can be passed to a function as an argument. To pass an array to a function, the array name must appear by itself, without brackets or subscripts, as an actual argument within the function call.  Lời gọi hàm – sử dụng tên của mảng Sử dụng tham số mảng một chiều Ngô Quốc Việt-Lập trình cơ bản 23 Kết luận: Mảng được truyền vào trong hàm theo dạng tham biến Sử dụng tham số mảng một chiều Ngô Quốc Việt-Lập trình cơ bản 24 Lưu ý: cách sử dụng biến toàn cục và biến địa phương Bài toán tìm phần tử Ngô Quốc Việt-Lập trình cơ bản 25 YÊU CẦU: Tìm phần tử đầu tiên trong (A,n) thoả mãn một điều kiện nào đó DẠNG BÀI TOÁN: flag = -1; i = 0; // flag được gọi là phần tử lính canh Lặp trong khi (i < n) và (flag = -1) làm Nếu (A[i] thoả điều kiện) thì flag = i; Cuối nếu i ++; Cuối lặp Ví dụ: Nhập vào số nguyên dương n ( 1  n  20) và một mảng số nguyên A gồm n phần tử. Tìm và in ra phần tử âm đầu tiên trong mảng tận cùng bằng 6 Gợi ý: int Am_6(int A[ ], int n); // kết thúc vòng lặp nếu j = -1 thì tìm không có – ngược lại thì a[j] chính là phần tử cần tìm ở vị trí j Bài toán tìm phần tử Ngô Quốc Việt-Lập trình cơ bản 26 YÊU CẦU: Tìm tất cả các phần tử trong (A,n) thoả mãn một điều kiện nào đó DẠNG BÀI TOÁN: //Sử dụng một mảng phụ (B,m) để lưu phần tử tìm được //Duyệt mảng (B,m) để xuất tất cả các phần tử tìm được m = 0; Lặp tuần tự i = 0, 1, 2, n-1 làm Nếu (A[i] thoả điều kiện) thì B[m] = A[i]; m = m + 1; Cuối nếu Cuối lặp Hoặc, trường hợp xuất thẳng ra màn hình: Lặp tuần tự i = 0, 1, 2, n-1 làm Nếu (A[i] thoả điều kiện) thì In A[i] ra màn hình Cuối nếu Cuối lặp Bài toán tìm phần tử lớn/nho ̉ nhất Ngô Quốc Việt-Lập trình cơ bản 27 YÊU CẦU: Tìm phần tử lớn nhất (max) hoặc nhỏ nhất (min) trong (A,n) Điều kiện cần: S là tập hợp có thứ tự toàn phần – nghĩa là, mọi cặp phần tử của S đều có thể so sánh được với nhau DẠNG BÀI TOÁN: // Tìm phần tử lớn nhất + Chọn phần tử x0  S, gán max = x0 + Lặp cho đến khi chọn hết các phần tử của S Với mỗi phần tử kế tiếp x  S, nếu max < x thì gán max = x Cuối lặp. Ví dụ: Nhập vào số nguyên dương n ( 1  n  20) và một mảng số thực A gồm n phần tử. Tìm phần tử nhỏ nhất trong mảng. Gợi ý: float Tim_min(float A[ ], int n); // Tìm phần tử nhỏ nhất + Chọn phần tử x0  S, gán min = x0 + Lặp cho đến khi chọn hết các phần tử của S Với mỗi phần tử kế tiếp x  S, nếu min > x thì gán min = x Cuối lặp. Bài toán sắp xếp Ngô Quốc Việt-Lập trình cơ bản 28 YÊU CẦU: Sắp xếp các phần tử trong (A,n) thoả mãn một điều kiện nào đó DẠNG BÀI TOÁN: // Sắp xếp phần tử tăng dần Lặp tuần tự i = 0, 1, 2, n-2 làm Lặp tuần tự j = 1, 2, 3, n-1 làm Nếu A[i] > A[j] thì Tmp = A[i]; // hoán vị 2 phần tử thứ i và j A[i] = A[j]; A[j] = Tmp; Cuối nếu Cuối lặp j Cuối lặp i Ví dụ: Nhập vào số nguyên dương n ( 1  n  20) và một mảng số nguyên A gồm n phần tử. Sắp xếp các phần tử trong mảng A theo thứ tự tăng dần Gợi ý: void Sapxep(int A[ ], int n); // Có nhiều thuật toán sắp xếp như: Selection, Insertion, Buble, Quick, Merge, ... Bài toán sắp xếp Ngô Quốc Việt-Lập trình cơ bản 29 YÊU CẦU: Sắp xếp các phần tử trong (A,n) thoả mãn một điều kiện nào đó DẠNG BÀI TOÁN: // Sắp xếp các phần tử thoả điều kiện. // Giữ nguyên vị trí các phần tử khác Lặp tuần tự i = 0, 1, 2, n-2 làm Lặp tuần tự j = i+1, i+2, i+3, n-1 làm Nếu (A[i], A[j] thoả điều kiện) thì Nếu A[i] > A[j] thì Hoán vị A[i], A[j]; Cuối nếu Cuối nếu Cuối lặp j Cuối lặp i Ví dụ: Nhập vào số nguyên dương n ( 1  n  20) và một mảng số nguyên A gồm n phần tử. Sắp xếp các phần tử không âm trong mảng A theo thứ tự tăng dần Bài toán tìm cặp quan hệ Ngô Quốc Việt-Lập trình cơ bản 30 YÊU CẦU: Tìm cặp phần tử trong (A,n) có quan hệ với nhau theo đkiện nào đó DẠNG BÀI TOÁN: //Chương trình chính Lặp tuần tự i = 0, 1, 2, n-2 làm Lặp tuần tự j = i+1, i+2, i+3, n-1 làm Nếu (Quan_he(A[i], A[j])) thì In cặp (A[i], A[j]); Cuối nếu Cuối lặp j Cuối lặp i Ví dụ: a) Nhập vào 10 số nguyên, xác định xem có cặp số nào trong các số đó có quan hệ chia hết hay không? In ra nếu có. b) Nhập vào 10 số nguyên, xác định xem có cặp số nào trong các số đó có hiệu của chúng bằng 5 hay không? In ra nếu có. // nếu qh = FALSE thì không có cặp quan hệ nào, ngược lại thì in ra //Chương trình con-xét quan hệ qh = FALSE; // qh được gọi là cờ hiệu Nếu (A[i], A[j] có quan hệ nhau) thì qh = TRUE; Cuối nếu return qh; Mảng hai chiều  Phát triển tự nhiên từ mảng một chiều.  Là mảng một chiều: trong đó mỗi phần tử lại là mảng một chiều. Ma trận MxN (M hàng N cột): sử dụng mảng hai chiều để quản lý.  Các phần tử trong mảng hai chiều được truy xuất bằng hai chỉ số Ngô Quốc Việt-Lập trình cơ bản 31 Ví dụ về mảng 2 chiều Ngô Quốc Việt-Lập trình cơ bản 32 x là mảng 2 chiều, có m dòng và n cột Ví dụ: float x[20][50]; char page[24][80]; int A[20][20]; Ví dụ về mảng 2 chiều Ngô Quốc Việt-Lập trình cơ bản 33 Khai báo mảng hai chiều [ ][ ];  Ví dụ khai báo mảng: int iArr[5][6]; //ma trận 5 hàng 6 cột. float fArr[10][7]//ma trận thực 10 hàng, mỗi hàng 7 cột  Khai báo mảng 2 chiều và khởi tạo giá trị int iArr[3][4] = { {1,3,5,4} , {5,1,3,2} , {2,3,4,5} }; float fArr[2][3] = {{3, 4, 7}, {4, 1, 8}}; Ngô Quốc Việt-Lập trình cơ bản 34 Sử dụng mảng hai chiều  Sử dụng hai chỉ số để truy xuất một phần tử mảng void Nhap (int a[][], int &d, int &c ) { printf (“\nNhap so dong: ”); scanf (“ %d”, &d ); printf (“\nNhap so cot: ”); scanf (“%d”, &c ); for ( int i = 0; i < d; i ++ ) for (int j = 0; j < c; j ++) { printf (“ a[%d][%d] = ”, i, j ); scanf (“%d”,&a[i][j]); } } Ngô Quốc Việt-Lập trình cơ bản 35 Truy xuất phần tử mảng  Đường chéo loại 1 (đường chéo chính và những đường song song với nó ) ma trận vuông  Đường chéo chính có tính chất: chỉ số cột = chỉ số dòng. Ví dụ: for ( i = i0, j = i0 ; i < n ; i ++, j ++ ) printf (“%4d”,A[i][j]);  Đường chéo loại 2 ma trận vuông (gồm đường chéo phụ và những đường song song với nó)  Đường chéo phụ có tính chất: chỉ số cột + chỉ số dòng = số dòng (hoặc số cột).  Ví dụ for ( i = io , j = jo ; i = 0 ; i ++ , j --) printf (“%4d”,A[i]][j]); Ngô Quốc Việt-Lập trình cơ bản 36 Minh hoạ nhập giá trị mảng 2 chiều #define MAX 100 typedef int [MAX][MAX] MATRAN; MATRAN a; void Nhap (MATRAN a, int &d, int &c ) { printf (“\nNhap so dong: ”); scanf (“ %d”, &d ); printf (“\nNhap so cot: ”); scanf (“%d”, &c ); for ( int i = 0; i < d; i ++ ) for (int j = 0; j < c; j ++) { printf (“ a[%d][%d] = ”, i, j ); scanf (“%d”, &a[i][j]); } } Ngô Quốc Việt-Lập trình cơ bản 37 Minh hoạ xuất giá trị mảng 2 chiều void Xuat (MATRAN a, int d, int c) { printf (“\nNoi dung ma tran:\n”); for (int i = 0; i < d; i++) { for (int j = 0; j < c; j++) printf (“ \t %d ”, a[i][j] ); printf (“\n”); } } Ngô Quốc Việt-Lập trình cơ bản 38 Minh hoạ kiểm tra tồn tại giá trị lẻ trong mảng 2 chiều int KiemTraLe (MATRAN a, int d, int c) { int flag = 0; //tra ve 1 neu co nguoc lai tra ve 0 for (int i = 0; i < d; i ++ ) for (int j = 0; j < c; j++) if ( a[i][j] % 2 != 0 && a[i][j] > 100 ) { flag = 1; break; } return flag; } Ngô Quốc Việt-Lập trình cơ bản 39 Tổng hai ma trận  Cho hai ma trận A(MxN) và B(MxN). Tính tổng của hai ma trận A, B và lưu vào ma trận C. #define M 100 #define N 50 typedef int [M][N] MATRAN; void SumMatrix(MATRAN a, MATRAN b, MATRAN c) { for (int i = 0; i < M; i ++ ) for (int j = 0; j < N; j++) C[i][ j] = A[i][j] + B[i][j]; return; } Ngô Quốc Việt-Lập trình cơ bản 40 Nhân hai ma trận  Cho hai ma trận A(KxM) và B(MxN). Tính tích của hai ma trận A, B và lưu vào ma trận C(KxN). #define K 100 #defineM 50 #defene N 40 typedef int [K][M] MATRANA; typedef int [M][N] MATRANB; typedef int [K][N] MATRANC; voidMultipleMatrix(MATRANA a, MATRANB b, MATRANC c) { for (int i = 0; i < K; i ++ ) for (int j = 0; j < N; j++) { c[i][j] = 0; for(k = 0; k < M; k ++) c[i][j] += a[i][k]*b[k][j]; } } Ngô Quốc Việt-Lập trình cơ bản 41 Bài tập luyện tập 1. Khai báo ma trận MxN (M, N là hằng số). Viết chương trình in ra những phần tử của mảng có số tận cùng là 7. 2. Viết chương trình in ra các phần tử nằm trên 2 đường chéo. 3. Viết chương trình tạo ma trận a các số nguyên gồm 9 dòng 14 cột. Trong đó a[i][j] = i*j; 4. Viết chương trình tính tổng các giá trị lớn nhất trên mỗi dòng (mỗi dòng chọn giá trị lớn nhất, sau đó cộng các giá trị này lại). Ngô Quốc Việt-Lập trình cơ bản 42 CÁM ƠN ĐÃ THEO DÕI TP.HCM - 2011

Các file đính kèm theo tài liệu này:

  • pdfltcb_baigiang06_3371.pdf
Tài liệu liên quan