Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 11 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
11
Dung lượng
99,43 KB
Nội dung
CHƯƠNG 5: MẢNG MỘT CHIỀU • Nội dung Khái niệm Mảng chiều Khai báo mảng Khởi tạo mảng Nhập xuất mảng Sử dụng mảng làm tham số truyền cho hàm Thuật toán xếp Thuật toán tim kiếm • • • • • • • Khái niệm Mảng tập hợp biến (phần tử) có kiểu chung tên Mảng chiều Mảng chiều hiểu dãy phần tử xếp liên tiếp nhớ Khai báo mảng []; Mỗi phần tử mảng chứa giá trị thuộc kiểu khai báo truy nhập theo số Chỉ số số nguyên đánh số từ trở Ví dụ 1: int a[10]; /*khai báo mảng nguyên gồm 10 phần tử, phần tử có kiểu int.*/ Các phần tử mảng a phân bố nhớ sau: a[0] a[1] a[2] … a[9] • • • • • • • • Khởi tạo mảng Để khởi tạo mảng ta liệt kê danh sách giá trị chúng cặp dấu {} Ví dụ 2: int a[5] = {-6, 2, 7, -10, 9}; Kích thước mảng cần không nhỏ số giá trị danh sách Tuy nhiên khởi tạo mảng không cần kích thước nó, máy dành cho mảng khoảng nhớ đủ để thu nhận danh sách giá trị khởi tạo Ví dụ 3: float a[] = {4.2, 5,8, 3.9, 10}; Khi số phần tử mảng tính công thức sau: n = sizeof(a)/sizeof(float); Toán tử sizeof cho biết kích cỡ (tính theo byte) kiểu liệu hay đối tượng liệu • • • • • • • • • • • • • • • • • Nhập xuất mảng Ví dụ 4: #define SIZE 20 void main() { int a[SIZE]; // khai báo mảng nguyên gồm SIZE phần tử int n; // lưu số phần tử mảng int i; { printf(“Nhap so phan tu:”); scanf(“%d”, &n); } while(n < || n > SIZE); for(i = 0; i < n; i++) { // nhập liệu cho mảng từ bàn phím printf(“pt thu %d:”, i); scanf(“%d”, &a[i]); } for(i = 0; i < n; i++) // xuất liệu mảng hình printf(“%d\t”, a[i]); printf(“\n”); } Sử dụng mảng làm tham số truyền cho hàm Theo C tên mảng địa địa phần tử mảng • Ví dụ 5: • int a[20] • Với khai báo a tương đương với &a[0] Khi dùng mảng làm tham số truyền cho hàm thực chất địa phần tử mảng truyền cho hàm Do đối số hàm phải viết dạng trỏ • • • • • • • • • • • • • • • • • • Ví dụ 6: #define SIZE 20 // khai báo nguyên mẫu hàm void Nhap(int *a, int *n); void Xuât(int *a, int n); // định nghĩa hàm void Nhap(int *a, int *n) { { printf(“Nhập so phan tu:”); scanf(“%d”, &(*n)); } while(*n < || *n > SIZE); for(i = 0; i < *n; i++) { printf(“pt thu %d:”, i); scanf(“%d”, &a[i]); } } • • • • • • • • • • • • • • • void Xuat(int *a, int n) { for(i = 0; i < n; i++) printf(“%d\t”, a[i]); printf(“\n”); } void main() { int a[SIZE]; int n; Nhap(a, &n); Xuat(a, n); } Chú ý: Đối số thứ hai hàm khai báo mảng hình thức sau: void Nhap(int a[], int *n); void Xuât(int a[], int n); • • • • • • • Thuật toán xếp mảng Ý tưởng thuật toán phần tử so sánh với phần tử lại thỏa điều kiện so sánh hoán vị hai phần tử với nhau, tiếp tục đến phần tử so sánh với phần tử lại gặp phần tử cuối cùng, sau phần tử cuối không phần tử để so sánh Việc xếp hoàn tất Ví dụ 7: Sắp xếp tăng Mảng ban đầu: 25 15 10 60 45 Lần 10 25 15 60 45 Lần 10 15 25 60 45 Lần 10 15 25 60 45 Lần 10 15 25 45 60 • • • • • • • • • • • • • void SapXepTang(int a[], int n) { int i, j; for(i = 0; i < n - 1; i++) for(j = i + 1; j a[j]) { //so sánh a[i] a[j] //hoán vị a[i] a[j] { int tam = a[i]; a[i] = a[j]; a[j] = tam; } } } } • • • • • • • • • • Thuật toán tìm kiếm Giả sử cần tìm phần tử có giá trị x mảng nguyên (x gọi khóa tìm kiếm) Tìm kiếm tuyến tính Thuật toán tiến hành so sánh x với phần tử thứ 0, phần tử thứ 1, … mảng gặp phần tử có khóa cần tìm tìm hết mảng mà không thấy x int LinearSearch(int a[], int n, int x) { int i; for(i = 0; i < n; i++) if(a[i] == x) return i; // tìm thấy ví trí i return -1; //không tìm thấy } • • • • • • • • • • • • Tìm kiếm nhị phân Thuật toán áp dụng cho mảng có thứ tự tăng Ý tưởng thuật toán bước ta tiến hành so sánh với phần tử nằm vị trí dãy tìm kiếm hành, dựa vào kết so sánh để định giới hạn dãy tìm kiếm bước nửa hay nửa dãy tìm kiếm hành int BinarySearch(int a[], int n, int x) { int dau = 0, cuoi = n-1; while(dau [...]... toán này chỉ áp dụng cho mảng đã c thứ tự tăng Ý tưởng c a thuật toán là tại mỗi bư c ta tiến hành so sánh với phần tử nằm ở vị trí giữa c a dãy tìm kiếm hiện hành, dựa vào kết quả so sánh này để quyết định giới hạn dãy tìm kiếm ở bư c kế tiếp là nửa trên hay nửa dưới c a dãy tìm kiếm hiện hành int BinarySearch(int a[], int n, int x) { int dau = 0, cuoi = n-1; while(dau ... niệm Mảng tập hợp biến (phần tử) c kiểu chung tên Mảng chiều Mảng chiều hiểu dãy phần tử xếp liên tiếp nhớ Khai báo mảng [ ]; Mỗi phần tử mảng chứa giá trị thu c. .. tạo mảng Để khởi tạo mảng ta liệt kê danh sách giá trị chúng c p dấu {} Ví dụ 2: int a [5] = {-6, 2, 7, -10, 9}; Kích thư c mảng c n không nhỏ số giá trị danh sách Tuy nhiên khởi tạo mảng không c n... t c đến phần tử so sánh với phần tử lại gặp phần tử cuối c ng, sau phần tử cuối không phần tử để so sánh Vi c xếp hoàn tất Ví dụ 7: Sắp xếp tăng Mảng ban đầu: 25 15 10 60 45 Lần 10 25 15 60 45