130 likes | 321 Views
Lập trình với dữ liệu kiểu mảng. HỌC VIỆN QUÂN Y Bộ môn Toán – Tin học. Người trình bày: Hoàng Anh. Nội dung. Khái niệm về dữ liệu kiểu mảng Khai báo và truy cập mảng Lập trình với dữ liệu kiểu mảng Sắp xếp mảng Mảng nhiều chiều. I. Khái niệm về dữ liệu kiểu mảng.
E N D
Lập trình với dữ liệu kiểu mảng HỌC VIỆN QUÂN Y Bộ môn Toán – Tin học Người trình bày: Hoàng Anh
Nội dung • Khái niệm về dữ liệu kiểu mảng • Khai báo và truy cập mảng • Lập trình với dữ liệu kiểu mảng • Sắp xếp mảng • Mảng nhiều chiều
I. Khái niệm về dữ liệu kiểu mảng • Dữ liệu kiểu mảng là loại dữ liệu có cấu trúc • Kiểu dữ liệu có cấu trúc được tạo ra từ các phần tử có kiểu dữ liệu đơn giản (Integer, Real, Char, Boolean ...) bằng một cách nào đó. • Các kiểu dữ liệu có cấu trúc trong Pascal là: Mảng – Array; Tập hợp – Set; Bản ghi – Record; Tệp – File. • Mảng bao gồm một số hữu hạn các phần tử có cùng kiểu dữ liệu. • Số phần tử của mảng được xác định ngay từ khi định nghĩa mảng • Mỗi phần tử của mảng được truy cập trực tiếp thông qua tên mảng và chỉ số của nó trong mảng. Chỉ số được để trong ngoặc vuông
II. Khai báo và truy cập mảng • Khai báo thông qua định nghĩa kiểu dữ liệu • Type • <Kiểu mảng> = Array [Kiểu chỉ số] of <Kiểu phần tử> ; • Var • <Biến mảng> : <Kiểu mảng> ; • Ví dụ: • Type • AI : Array [1..10] of Integer; • AC: Array[1..10] of Char; • Var • A, B, C: AI; • X, Y: AC
II. Khai báo và truy cập mảng • Khai báo trực tiếp • Var • <Tên mảng 1>,..., <Tên mảng n>: Array [Kiểu chỉ số] of <Kiểu dữ liệu>; • Ví dụ • Var • A, B, C : Array [ 1 .. 10 ] of Integer ; • X, Y: Array [ 1 .. 10 ] of Char ; • Mang_So: Array [ ‘A’ .. ’Z’ ] of Real ; • Truy cập mảng • Mang_So[ ’A’ ] := 100 ; {Gán 100 vào phần tử thứ A của mảng Mang_so} • X[1] := ‘b’ ; {Gán ký tự b vào phần tử thứ nhất của mảng X} • Read ( A [ 1 ] ) ; (Đọc một số nguyên vào phần tử thứ nhất của mảng A} • Write (Mang_So [ ‘B’ ]) ; {Viết ra giá trị chứa ở phần tử thứ B của mảng Mang_So} • KT := X [ 2 ] ; {Gán giá trị chứa ở phẩn tử thứ 2 mảng X vào biến KT}
III. Lập trình với dữ liệu kiểu mảng • Đọc dữ liệu vào mảng B có n phần tử: • For i := 1 to n do • Begin • Write ( ‘ B[ ‘ , i , ’ i ] = ’ ); Readln ( B[ i ] ); • End; • Khởi tạo mảng B (Integer; Real) có n phần tử • For i := 1 to n do • Begin • ( B [ i ] ) := 0 ; • End; • Viết dữ liệu vào mảng B có n phần tử ra màn hình • For i := 1 to n do • Begin • Write ( ‘ B [ ‘, i , ’ ] = ’, B[ i ] ); • End;
III. Lập trình với dữ liệu kiểu mảng • Sao chép dữ liệu từ mảng B sang mảng A cùng kiểu dữ liệu, cùng có n phần tử • For i := 1 to n do • A [ i ] := B [ i ] ; • So sánh hai mảng: Nếu hai mảng A và B cùng kích thước và cùng kiểu phần tử thì có thể thực hiện được phép so sánh bằng và khác ( A = B hoặc A <> B). Không thể thực hiện được phép so sánh lớn hơn hoặc nhỏ hơn. • Tính toán với dữ liệu kiểu mảng • Thuật toán cộng hai mảng một chiều A, B có n phần tử. Kết quả đưa ra mảng C: • Khai báo biến n, i, mảng A, mảng B, mảng kết quả C • Đọc n • Đọc mảng A, mảng B • Tính các phần tử của mảng C theo công thức C(i) = A(i) + b(i) (i = 1n) • For i := 1 to n do C[i] := A[i] + b[i]; • Viết mảng kết quả C ra màn hình
III. Lập trình với dữ liệu kiểu mảng • Ví dụ 1: Đếm trong 100 lần gõ vào bàn phím, số lần xuất hiện của mỗi ký tự từ A đến Z là bao nhiêu (không phân biệt chữ hoa, chữ thường) • Thuật toán: Sử dụng một mảng đếm được chỉ số hoá bằng chữ cái và khởi tạo bằng 0. Mỗi khi gõ vào một chữ cái thì tăng giá trị của phần tử có chỉ số bằng chữ cái vừa gõ lên 1 đơn vị. • Var • i: Integer; ch : Char; • MC: Array[ ‘A’ .. ‘Z’ ] of Integer ; (* mảng đếm*) • Begin • For ch := ‘A’ to ‘Z’ Do MC[ch] := 0; (* Khởi tạo mảng đếm*) • For i:= 1 to 100 Do (* Đọc 100 ký tự gõ liên tiếp từ bàn phím*) • Begin • Read(ch); • ch := UpCase(ch); • MC[ch] = MC[ch] + 1; • End; • For ch := ‘A’ to ‘Z’ Do • if MC[ch] > 0 then Writeln(‘So chu ‘, ch , ‘ = ‘, Mc[ch]:4); • End.
IV. Sắp xếp mảng • Thuật toán chọn trực tiếp • Coi phần tử đầu tiên là số nhỏ nhất • Đem phần tử đầu tiên đó so sánh lần lượt với các số còn lại trong dãy số. Nếu có phần tử thứ i nào đó nhỏ hơn nó thì đổi chỗ của phần tử ấy cho nó. Như vậy sau khi duyệt xong dãy số, phần tử đầu tiên là phần tử nhỏ nhất • Lặp lại thuật toán lần lượt với các phần tử thứ 2, thứ 3 vv... • .................................................... • For i := 1 to n - 1 do • For j := i +1 to n do • if A[ i ] >A[ j ] then • Begin • Tam := A[i]; • A[i] := A[j]; • A[j] := Tam; • End; • ............................................
IV. Sắp xếp mảng • Thuật toán chọn sủi bọt • Lần lượt so sánh phần tử thứ i với phần tử thứ i – 1 ( i = n 1 ). Nếu phần tử thứ i nhỏ hơn phần tử thứ i – 1 thì đổi chỗ cho chúng. Sau khi duyệt xong dãy số, phần tử đầu tiên sẽ là phần tử nhỏ nhất • Lặp lại thuật toán trên với i = n 2, Sau khi duyệt xong dãy số, phần tử thứ hai sẽ là phần tử nhỏ thứ hai trong dãy số • Lặp lại n – 1 bước, ta sẽ có dẫy số được sắp xếp theo thứ tự tăng dần. • .................................................... • For i := 1 to n - 1 do • For j := n Down to i do • if A[j] < A[j – 1] then • (* Đổi chỗ A [ j] và A [ j – 1 ] *) • Begin • Tam := A [ j ] ; • A [ j ] := A [ j – 1 ] ; • A [ j –1 ] := Tam ; • End; • ............................................
V. Mảng nhiều chiều • Mỗi phần tử của mảng có thể là một mảng khác. Trong trường hợp như vậy ta có một mảng nhiều chiều. • Khai báo mảng nhiều chiều: • Var • A : Array [ 1 .. 3, 1 .. 5 ] of Real ; • B : Array [ ‘A’ .. ‘C’ , 1 .. 10 ] of Char ; • Truy cập các phần tử của mảng nhiều chiều bằng cách sử dụng cặp ngoặc vuông. Trong ngoặc là chỉ số theo các chiều tương ứng, phân cách bởi dấu phẩy • A[1,1] = 12.5; Write(A[1,3]); Readln(A[2,4]);
V. Mảng nhiều chiều • Ví dụ 2: Viết chương trình nhân hai ma trận vuông cùng cấp • Gọi ma trận vuông C là tích của hai ma trận vuông A, B cùng cấp n • Mỗi phần tử của C được tính theo công thức: Ci,j = Ai,k * Bk,j víi k = 1n • Thuật toán: • Khai báo biến mảng A, B, C • Khai báo các biến Integer i, j, k, n • Đọc n • Đọc mảng A, mảng B • Tính ma trận tổng • For i := 1 to n do • For j := 1 to n do • Begin • c[i,j] := 0; • for k:= 1 to n do C[i,j] = C[i,j] + A[i,k]*B[k,j]; • End, • Viết ra ma trận tích
V. Mảng nhiều chiều • Ví dụ 3: Viết chương trình cộng hai ma trận vuông cùng cấp • Gọi ma trận vuông C là tổng của hai ma trận vuông A, B cùng cấp n • Mỗi phần tử của C được tính theo công thức: Ci,j = Ai,j + Bi,j • Thuật toán: • Khai báo biến mảng A, B, C • Khai báo các biến Integer i, j, n • Đọc n • Đọc mảng A, mảng B • Tính ma trận tích • For i := 1 to n do • For j := 1 to n do • C[ i , j ] = A [ i , j ] + B [ i , j ] ; • Viết ra ma trận tổng