Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 38 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
38
Dung lượng
543,48 KB
Nội dung
Bài 10: Mảng danh sách 10.1 Mảng 10.1.1 Mảng chiều, mảng nhiều chiều Kh¸i niƯm Mảng tập hợp phần tử cố định có kiểu, gọi kiểu phần tử Kiểu phần tử có kiểu bất kỳ: ký tự, số, chuỗi ký tự…; có ta sử dụng kiểu mảng để làm kiểu phần tử cho mảng (trong trường hợp ta gọi mảng mảng hay mảng nhiều chiều) Ta chia mảng làm loại: mảng chiều mảng nhiều chiều Mảng kiểu liệu sử dụng thường xuyên Chẳng hạn người ta cần quản lý danh sách họ tên khoảng 100 sinh viên lớp Nhận thấy họ tên để lưu trữ ta cần biến kiểu chuỗi, 100 họ tên cần khai báo 100 biến kiểu chuỗi Nếu khai báo đoạn khai báo thao tác họ tên dài dịng rắc rối Vì thế, kiểu liệu mảng giúp ích ta trường hợp này; cần khai báo biến, biến coi tương đương với 100 biến chuỗi ký tự; mảng mà phần tử l chui ký t Cấu trúc l-u trữ mảng Cấu trúc liệu đơn giản dùng địa tính đ-ợc để thực l-u trữ tìm kiếm phần tử, mảng chiều hay véc tơ Thông th-ờng số từ máy đ-ợc dành để l-u trữ phần tử mảng Cách l-u trữ đ-ợc gọi l-u trữ (sequential storage cách allocation) Tr-ờng hợp mảng chiều hay véc tơ có n phần tử l-u trữ đ-ợc từ máy cần phải dành cho n từ máy Do kích th-ớc véc tơ đà đ-ợc xác định nên không gian nhớ dành đ-ợc ấn định tr-ớc Véc tơ A có n phần tử, phần tö (0 ≤ i ≤ n) chiÕm c tõ máy đ-ợc l-u trữ cn từ máy nh- hình vẽ: a0 A1 cn tõ m¸y kÕ tiÕp an L0 Địa đ-ợc tính c«ng thøc: Loc(ai) = L0 + c * i : L0 đ-ợc gọi địa gốc - địa từ máy miền nhớ dành để l-u trữ véc tơ (gọi véc tơ l-u trữ) f(i) = c * i gọi hàm địa (address function) Đối với mảng nhiều chiều việc l-u trữ t-ơng tự nh- nghĩa sử dụng véc tơ l-u trữ nh- a11 a01 aij anm Giả sử phần tử ma trận n hàng m cột (mảng nhiều chiều) chiếm từ máy địa aij đ-ợc tính công thức tổng quát nh- sau: Loc(aij) = L0 + j * n + i { theo thø tù -u tiªn cét (column major order } Cịng với ma trận n hàng, m cột cách l-u trữ theo thứ tự -u tiên hàng (row major order) công thức tính địa là: Loc(aij) = L0 + i * m + j + Tr-êng hỵp cËn d-ới số 1, nghĩa øng víi aij th× b1 ≤ i ≤ u1, b2 j u2 ta có công thức tính địa nh- sau: Loc(aij) = L0 + (i - b1) * (u2 - b2 + 1) + (j - b2) hàng có (u2 - b2 + 1) phần tử Ví dụ : Xét mảng ba chiều B có phần tử bijk với i ≤ 2; ≤ j ≤ 3; ≤ k 4; đ-ợc l-u trữ theo thứ tự -u tiên hàng phần tử đ-ợc ®Ỉt kÕ tiÕp nh- sau: b111, b112, b113, b114, b121, b122, b123, b124, b131, b132, b133, b134, b211, b212, b213, b214, b221, b222, b223, b224, b231, b232, b233, b234 C«ng thức tính địa : Loc(aijk) = L0 + (i - 1) *12 + (j - 1) * + (k - 1) VD Loc(b223) = L0 + 22 Xét tr-ờng hợp tổng quát với mảng A n chiều mà phần tử : A[s1, s2, , sn] ®ã bi ≤ si ≤ ui ( i = 1, 2, , n), øng với thứ tự -u tiên hàng ta có: n Loc(A[s1, s2, , sn]) = L0 + ∑ pi(si - bi) n i=1 víi pi = Π (uk - bk +1) k =i + đặc biệt pn = Chú ý : 1> Khi mảng đ-ợc l-u trữ việc truy nhập vào phần tử mảng đ-ợc thực trực tiếp dựa vào địa tính đ-ợc nên tốc độ nhanh đồng phần tử 2> Mặc dầu có nhiều ứng dụng mảng đ-ợc sử dụng ®Ĩ thĨ hiƯn mèi quan hƯ vỊ cÊu tróc gi÷a phần tử liệu, nh-ng tr-ờng hợp mà mảng lộ rõ nh-ợc điểm Ví dụ : Xét toán tính đa thức x,y chẳng hạn cộng hai đa thức sau: (3x - xy + y2 + 2y - x) + (x2 + 4xy - y2 +2x) = (4x2 + 3xy + 2y + x) Ta biÕt thùc cộng đa thức ta phải phân biệt đ-ợc số hạng, phân biệt đ-ợc biến, hệ số số mũ Để biểu diễn đ-ợc đa thức víi biÕn x,y ta cã thĨ dïng ma trËn: hệ số số hạng xiyj đ-ợc l-u trữ phần tử có hàng i cột j ma trËn NÕu ta h¹n chÕ kÝch th-íc cđa ma trËn n ì n số mũ cao x,y xử lý đ-ợc với đa thức bậc n-1 th«i VD : Víi x + 4xy - y +2x th× ta sÏ sư dơng ma trËn × biĨu diƠn nã sÏ cã d¹ng: 0 0 0 0 -1 0 0 0 0 10.1.2 Cấu trúc lưu trữ mảng số ngôn ngữ lập trình I GIỚI THIỆU KIỂU DỮ LIỆU “KIỂU MẢNG” TRONG C Hay để lưu trữ từ khóa ngơn ngữ lập trình C, ta dùng đến mảng để lưu trữ chúng Ví dụ 1: Viết chương trình cho phép nhập ma trận a, b có m dịng n cột, thực phép tốn cộng hai ma trận a,b in ma trận kết lên hình Trong ví dụ này, ta sử dụng hàm để làm ngắn gọn chương trình ta Ta viết hàm: nhập ma trận từ bàn phím, hiển thị ma trận lên hình, cộng ma trận #include #include void Nhap(int a[][10],int M,int N) { int i,j; for(i=0;i