Kieu du lieu co cau truc.doc

36 759 0
Kieu du lieu co cau truc.doc

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

DỮ LIỆU KIỂU MẢNG I MẢNG MỘT CHIỀU Khái niệm chung cấu trúc liệu: Chúng ta làm quen với kiểu liệu đơn giản kiểu vô hướng (Integer, Char, Boolean, Real, kiểu liệt kê) đoạn Trong Pascal tồn kiểu liệu có cấu trúc kiểu liệu tạo từ phần tử có kiểu liệu đơn giản cách Chúng đặc trưng kiểu liệu phần tử quan trọng phương pháp cấu thành kiểu liệu (điều có nghĩa phương pháp truy nhập vào kiểu liệu có cấu trúc) Tính có cấu trúc liệu đặc trưng ngơn ngữ lập trình có cấu trúc Pascal có tất kiểu liệu có cấu trúc mà ngiên cứu : mảng (Array), tập (Set), ghi (Record) tệp (File) Kiểu liệu có cấu trúc : Mảng (Array) Một mảng liệu gồm số hữu hạn phần tử có kiểu gọi kiểu Số phần tử mảng xác định từ định nghĩa mảng Mỗi phần tử mảng đựoc truy nhập trực tiếp thông qua tên mảng với dẫn truy nhập để hai ngoặc vuông [ ] Định nghĩa kiểu mảng T có kiểu phần tử KPT, có kiểu dẫn KCD để hướng dẫn cách tổ chức mảng cách truy nhập vào phần tử mảng viết Pascal sau : Type Kiểu_mảng T = Array[ Kiểu_chỉ_dẫn KCD ] Of Kiểu_phần_tử KPT ; hay viết tắt thành : T = Array[ KCD ] Of KPT ; Khi việc khai báo biến A có kiểu Kiểu_mảng viết sau : Var A : Kiểu_mảng T ; ta khai báo trực tiếp biến A với kiểu mảng phần khai báo biến khơng có định nghĩa kiểu phần Type : Var A : Array[ KCD ] Of KPT ; Chúng ta xét số ví dụ định nghĩa khai báo sau : Type AI = Array[ 10 ] Of Integer ; AC = Array [ 10 ] Of Char ; Color = ( Red, Blue, Green, White, Black ) ; Var A, B, C : AI ; X, Y : AC ; M1, M2 : Array[ -3 ] Of Real ; MC : Array[ 'A' 'Z' ] Of Integer ; MM : Array[ Color ] Of Boolean ; AI, AC hai kiểu mảng gồm 10 phần tử đánh số thứ tự từ đến 10 thông qua kiểu dẫn đoạn số nguyên 10 Các phần tử AI có kiểu số nguyên cịn phần tử AC có kiểu kí tự A, B, C biến có kiểu AI Còn M1, M2 hai biến định nghĩa kiểu khai báo Đây hai biến mảng gồm phần tử số thực, đánh số từ -3 đến MC biến mảng gồm 26 số nguyên đánh số qua dẫn chữ từ 'A' đến 'Z' MM mảng gồm phần tử kiểu Boolean, phần tử đựoc đánh dấu qua dẫn tên màu sắc Một điều lưu ý khai báo mảng, kiểu dẫn chí kiểu đơn giản sau: kí tự ( biến MC ), đoạn ( ví dụ đoạn Integer kiểu AI, AC ), kiểu liệt kê người sử dụng định nghĩa (như biến MM) kiểu Boolean Kiểu dẫn không kiểu Real Integer Nghĩa không viết : X : Array[ Integer ] Of Integer ; Y : Array[ Real ] Of Integer ; Việc truy nhập vào phần tử mảng thực qua tên biến mảng, theo sau giá trị dẫn để ngoặc vuông : MM[ Red ] := True ; MC[ 'B' ] := ; Do thời gian truy nhập vào phần tử mảng không phụ thuộc vào giá trị dẫn nên cấu trúc mảng thuộc kiểu cấu trúc truy nhập trực tiếp Ví dụ1: Gán tất giá trị mảng B ( định nghĩa ) qua bàn phím, ta dùng thêm biến I có kiểu Integer để làm biến dẫn : Writeln (' Vao so lieu cho mang B ' ) ; For I := To Do Begin Write (' B[ ', I, ' ] = ') ; Readln ( B[ I ] ) ; End ; Kết thể hình với số người sử dụng gõ vào : Vao so lieu cho mang B B[1] = B[2] = 12 B[3] = 612 B[4] = B[5] = 34 Nếu bạn muốn vào số liệu hàng Array dịng hình bạn phải ghi rõ tất biến cần đọc ( phần tử mảng ) thủ tục Readln Khi khơng áp dụng vịng For : Write (' Vao so lieu hang ') ; Readln ( B[1], B[2], B[3], B[4], B[5] ) ; Kết hình : Vao so lieu hang : 12 612 34 Giữa số gõ dấu cách với số lượng tùy ý phải Ví dụ 2: Cộng hai mảng C = A + B ( A, B, C với định nghĩa thực mảng hay ma trận chiều ) : For I := To 10 Do C[ I ]:=A[ I ] + B[ I ] ; Ví dụ 3: Giả sử ta muốn đếm 100 lần gõ kí tự vào qua bàn phím, số lần xuất kí tự từ 'A' đến 'Z' Biến MC khai báo đóng vai trị đếm, biến kí tự Ch dùng biến dẫn Var I : Integer ; Ch : Char ; MC : Array[ 'A' 'Z' ] Of Integer ; BEGIN (* Xóa mảng MC khơng *) For Ch := 'A' To 'Z' Do MC[ Ch ] := ; (* Đọc 100 kí tự đếm *) For I := To 100 Do Begin Readln ( Ch ) ; (* Hàm Upcase biến chữ thường thành chữ hoa, Ví dụ 'a' thành 'A' *) Ch := Upcase ( Ch ) ; (* Đếm số lần xuất kí tự *) ; Inc ( MC[ Ch ] ) ; End ; (* Chỉ in kết hình chữ xuất *) For Ch := 'A' To 'Z' Do If MC[ Ch ] > Then Writeln ( ' So chu ', Ch,' = ', MC [Ch ] : ) ; END Kết hình có dạng : So chu A = So chu C = 68 So chu Z = II SẮP XẾP CÁC PHẦN TỬ CỦA MẢNG: Sắp xếp phần tử mảng theo trật tự tăng giảm ví dụ bổ ích cho việc nắm vững phép xử lí mảng Sau trình bày số phương pháp xếp mảng qua ví dụ Giả sử ta có dãy liệu ( số thực, số nguyên, kí tự ) chứa mảng Sau số dụ số phương pháp xếp mảng số nguyên Việc phần tử mảng số nguyên ví dụ, mảng số thực mảng xâu kí tự Cách làm: Đầu tiên đem phần tử thứ so sánh với phần tử tiếp theo, lớn đem đổi chỗ giá trị hai phần tử so sánh Kết sau lượt giữ giá trị nhỏ Tiếp theo vòng 2, Đem phần tử thứ so sánh với phần tử Program SAP_XEP ; Const N= 5; Var MI : Array[ N ] Of Integer ; T : Integer ; (* T biến trung gian *) I, J : Integer ; BEGIN (* Đọc số cần xếp vào mảng MI *) For I := To N Do Begin Write (' MI[ ', I ,' ] = ') ; Readln ( MI[ I ] ) ; End ; (* Sắp xếp *) For I := To N - Do For J := I + To N Do Begin If MI[ I ] > MI[ J ] Then Begin T := MI[ I ] ; MI[ I ] := MI[ J ] ; MI[ J ] := T ; End ; End ; (* In kết *) Writeln ; Writeln ( ' Sau sap xep ' ) ; For I := To N Do Writeln ( MI[ I ] : ) ; END Kết chương trình hình : M[ ] = - M[ ] = 456 M[ ] = 34 M[4 ] = - 312 M[ ] = - 56 Sau xếp : -312 -56 -1 34 456 II MẢNG HAI CHIỀU: Kiểu phần tử mảng khơng bị hạn chế nhiều kiểu dẫn Nó cịn kiểu có cấu trúc Ví dụ sau cho thấy việc khai báo mảng có phần tử mảng Ví dụ: Type PT = Array [ ] Of Real ; Color = ( Red, Blue, Green, White, Black ) ; Var MPT : Array [ ] Of Pt ; Z : Array [ 3, 'A' 'C' ] Of Color ; viết lần sau : Var MPT : Array [ ] Of Array [ ] Of Real ; thường viết gọn lại : Var MPT : Array [ 3, ] Of Real ; MPT định nghĩa ma trận hai chiều hàng cột Việc truy nhập mảng có định nghĩa phức tạp MPT tiến hành qua hai lần đóng mở ngoặc vng Ví dụ MPT [3] [5] MPT [ 3, ] biểu diễn phần tử hàng cột Cách viết MPT[i] [j] MPT[ i, j ] tương đương Mảng định nghĩa hiểu ma trận nhiều chiều Phần tử MPT[ i, j ] phần tử hàng thứ I, cột thứ J MPT Ví dụ: Chương trình nhân hai ma trận vuông cấp N C=A*B Phần tử ma trận tích tính theo cơng thức : Const N=3; Phay = ', ' ; (* Hằng kí tự : Dấu phẩy *) Var A, B, C : Array[ N, N ] Of Integer ; I, J, K : Integer ; BEGIN (* Đọc giá trị ma trận A *) For I := To N Do For J := To N Do Begin Write ( ' A[ ', I, phay, J, ' ] = ' ) ; Readln ( A[ I, J ] ) ; End ; (* Đọc giá trị ma trận B *) For I := To N Do For J := To N Do Begin Write ( ' B[ ', I, phay, J, ' ] = ' ) ; Readln ( B[ I, J ] ) ; End ; (* Nhân hai ma trận vuông cấp N C = A * B *) For I := To N Do For J := To N Do Begin C[ I, J ] := ; For K := To N Do C[ I, J ] := C[ I, J ] + A[ I, K ] * B[ K, J ] ; End ; (* In kết theo kiểu viết ma trận *) Writeln (' Tich cua hai ma tran = ') ; For I := To N Do Begin For J := To N Do Write ( C[ I, J ] : ) ; Writeln ; End ; END Trong chương trình trên, việc đọc ma trận tiến hành qua dòng cho phần tử mảng Bạn sửa lại đọc vào ma trận dạng dòng tương ứng với hàng ma trận : (* Đọc vào giá trị ma trận A theo hàng *) For I := To N Do Begin Write (' Hang ', I, ' : ' ) ; Readln ( A [ I, ], A [ I, ], A [ I, ] ) ; End ; Một cách khác lười đỡ phải đọc ma trận thử, làm đoạn chương trình tạo số ngẫu nhiên cho phần tử ma trận Bạn cần nhớ lại tra cứu hàm Random Randomize Mảng dùng làm tham số cho chương trình mảng khơng dùng làm kết Function Tuy nhiên cần lưu ý khai báo kiểu tham số vùng khai báo Type không định nghĩa trực tiếp phần khai báo tham số chương trình Ví dụ: Cộng hai ma trận C = A + B Type MT = Array [ 3, ] Of Real ; Var X, Y, Z : MT ; (* - *) Procedure Cong_ma_tran ( A, B : MT ; Var C : MT ) ; Var I, J : Integer ; Begin For I := To N Do For J := To N Do C [ I, J ] := A [ I, J ] + B [ I, J ] ; End ; (* -*) BEGIN Cong_ma_tran ( X, Y, Z ) ; END DỮ LIỆU KIỂU XÂU Các chương trình dịch Pascal có kiểu liệu xâu kí tự để xử lý chuỗi, dãy kí tự có độ dài thay đổi nhằm đáp ứng nhu cầu xử lý văn bản, xử lý từ (ngữ) Một xâu kí tự định nghĩa từ khóa String theo sau số kí tự cực đại có xâu kí tự, đặt ngoặc vng : String [ do_dai_cuc_dai ] ; Ví dụ 1: Var Filename : String[20] ; Line : String[80] ; (* Dịng 80 kí tự nhiều *) Ví dụ 2: Biến Filename khai báo gán giá trị : Filename := 'Vidu.pas' : độ dài xâu kí tự Filename kí tự, độ dài cực đại cho phép Filename 20 Hàm chuẩn Length (St) cho ta độ dài xâu kí tự St Một xâu chữ rỗng (khơng chứa kí tự nào) St := '' hay Length (St) = Truy nhập vào phần tử xâu kí tự : ta truy nhập vào kí tự xâu kí tự với tên biến số đặt ngoặc vuông khik truy nhập vào phần tử mảng Chỉsố chạy từ đến độ dài cực đại xâu kí tự If filename[3] = 'D' then Writeln (' Chu thu ba cua xau ki tu la D ') ; Nếu vị trí kí tự nằm ngồi độ dài thực xâu kí tự phần tử xâu khơng có giátrị xác định Vì vậy, truy nhập vào phần tử xâu chữ, ta cịn cần phải kiểm tra xem vị trí có nằm khoảng độ dài thực xâu hay không If < Length(Filename) then Writeln (' Chu thu ba cua Filename la : ', Filename[3]) ; Phép cộng xâu: Xâu kí tự sử dụng toán hạng biểu thức để ghép xâu kí tự qua dấu "+" Ví dụ: Filename := ' Vidu.pas ' ; Filename := ' C:\ ' + Filename ; Cho kết Filename : ' C:\Vidu.pas ' ; Filename := ' Ten ' + ' file ' + '.pas ' ; Cho kết Filename : ' Tenfile.pas ' ; Rõ ràng với kiểu mảng kí tự , khơng thể thực phép cộng để ghép hai mảng với độ dài chúng cố định * Lưu ý: khơng có phép tính trừ, nhân, chia cho xâu kí tự Khai báo String làm tham số chương trình : Tương tự Array , String dùng làm tham số cho chương trình , Ví dụ: Type St20 : String[20] ; St30 : String[30] ; Var Ten20 : String[20] ; Ten30 : String[30] ; Function Vidu1 : St20 ; Procedure Vidu2 ( St : St30 ) ; Cách viết sau sai : Function Vidusai : String[20] ; Procedure Vidusai (St : String[30]) ; Khi dùng String làm tham số cho chương trình , độ dài tham số thực phải độ dài tham số hình thức Vì lời gọi thủ tục sau hoàn toàn : Vidu2(Ten30) ; Ten30(tham số thực) có kiểu St30 trùng với tham số hình thức (St30) Tuy , bạn chuyển tham số String có độ dài khác vào chương trình cách hướng dẫn chương trình dịch khơng kiểm tra tính tương thích độ dài Cách làm : định hướng {$V-}sẽ bỏ việc kiểm tra tính tương thích độ dài tham số xâu kí tự {$V+} làm hoạt động việc kiểm tra trở lại Ví dụ: Lời gọi Vidu2(Ten20) gây lỗi Ten20 có độ dài khác St30 Muốn khắc phục điều , ta cần thêm định hướng {$V-} : 10 ... String[20] ; Ten30 : String[30] ; Function Vidu1 : St20 ; Procedure Vidu2 ( St : St30 ) ; Cách viết sau sai : Function Vidusai : String[20] ; Procedure Vidusai (St : String[30]) ; Khi dùng String... Code1) ; cho ta Var1 = 123.45 Code1 = ; Val (St2 , Var2 , Code2) ; cho ta Var2 không xác định Code2 = ; Lưu ý : Các biến Var1 , Var2 , Code1 , Code2 phải khai báo trước _ Copy(St , Pos , Size) nhận... , ngơn ngữ Pascal cịn cho phép Record mô tả sử dụng cách độc lập với File 2) Mô tả Record: Mô tả Record viết chữ Record, theo sau danh sách mô tả phần liệu Record mà ta gọi trường Mỗi trường

Ngày đăng: 09/06/2013, 01:26

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan