U CÓ C.U TRÚC

Một phần của tài liệu Bài giảng ngôn ngữ lập trình pascal (Trang 38 - 70)

I.Khái ni m v" d li u có c u trúc

Trong Turbo Pascal ta ã dùng các ki u d li u vô h ng ( n gi n chu/n) nh các ki u : Boolean, s nguyên, s th c, char, o n con, li t kê. Ngoài ra Pascal còn cho phép ta xây d ng các ki u d li u khác t các ki u

n gi n chu/n, ó là d li u có c u trúc.

D li u có c u trúc c a Pascal có các ki u : M ng(Array), chu i(String), T p h p(Set), B n ghi(Record), T p tin(File), Con tr (Pointer).

Ngôn ng cho phép dùng nhi u d li u c u trúc ph)c t p thì ngơn ng ó càng m nh và d$ s d#ng. II.C u trúc d li u m ng 1. M ng và cách khai báo m ng M ng là m t t p g m nhi u ph n t có cùng chung m t ki u d li u. M i ph n t c a m ng có m t i l ng xác nh v trí t ng i c a ph n t ó so v i các ph n t khác trong m ng, g i là ch# s . Các y u t xác nh m t m ng g m có: -Tên m ng - Ki u d li u chung c a các ph n t trong m ng - Ki u d li u c a ch s và ph m vi c a ch s . Ki u d li u c a các ph n t m ng là m i ki u d li u mà m t bi n có th có. Ki u ch có th là ki u m c : nguyên, ký t , lôgic, li t kê hay o n con. 2.M ng m$t chi"u

2.1 Khai báo m ng m t chi u TYPE

Tênki um ng = Array[m1 . . m2] of Tênki ud li u;

. ây m1, m2 là hai h ng xác nh ph m vi c a ch s , chúng có chung m t ki u d li u và m1< m2.

Ví d# :

Type

Mang1 = array[0..10] of Real; Mang2 = array[1..5] of String[18];

Mang3 = array[‘a’..’d’] of Integer; 2.2: Khai báo bi n m ng VAR Tênm ng : Tênki um ng ; Ví d#: Var A : Mang1; Hten: Mang2; B: Mang3;

2.3 Khai báo m ng có gán tr ban u

Pascal cho phép v a khai báo m ng v a gán gía tr ban u cho các ph n t m ng, ch4ng h n nh d i ây:

Khi ó X là m t m ng g m 5 ph n t cùng ki u nguyên và có giá tr X[1]=12, X[2]=14, X[3]=16, X?4]=18, X[5]=20.

2.4 Khai báo tr c ti p bi n m ng

VAR

Tênm ng : Array[m1 . . m2] of Tênki ud li u ; Ví d#: Cho khai báo d i ây:

Var

A : Array[0..10] of Real;

Hten: Array[1..5] of String[18]; B: Array[‘a’..’d’] of Integer; 2.5 Truy xu t các ph n t m ng Các x lý trên m ng c quy v x lý t ng ph n t m ng. Ð xác nh m t ph n t c a m ng, ta dùng cách vi t : Tênm ng[ ch s c a ph n t ] Các phép x lý trên ph n t m ng +Phép gán : Ta có th gán m t giá tr cho m t ph n t m ng Ví d# : A[0]:= 15.8; A[1]:= 2*A[0]; Hten[3]:= ‘Nguyen Thi Loan’; B[‘a’]:=100;

+Nh p d li u : Khi nh p d li u cho các ph n t c a m t m ng , ta có th dùng câu l nh For, While hay Repeat.

Ví d#, nh p d li u cho các ph n t c a m ng A 10 ph n t : For i:=0 to 10 do begin Write(‘A[‘,I,’]=’);Readln(A[i]); end; ho&c (dùng While) : i:=0; While i<= 10 do begin Write(‘A[‘,I,’]=’);Readln(A[i]); i:=i+1; end;

+In d li u : Ð in các gía tr c a m ng A lên màn hình, ta vi t : For i:=0 to 10 do Write(A[i]:6:2);

2.6. Các bài c b n v m ng

+ + m các ph n t m ng th a mãn m t i u ki n nào ó.

Ta xét ví d# nh p m t m ng A có N ph n t , in m ng A lên màn hình, và m xem m ng A có bao nhiêu s d ng :

PROGRAM DemSo; { Ð m s d ng trong m ng} Type

Kmang = Array[1..20] of Real; Var

A: Kmang;

i, N, Dem : Integer; Begin (adsbygoogle = window.adsbygoogle || []).push({});

Repeat Write(‘ Nh p s ph n t N : ‘); Readln(N); Until (N>0) and ( N<21); { nh p m ng } For i:=1 to N do begin

Write(‘Nh p A[‘ , i , ‘ ]: ‘);Readln( A[i] ); end;

{ In m ng A}

Writeln(‘ M ng A là : ’);

For i:=1 to N do Write(A[i]:3:0); Writeln;

{ m s d ng } Dem:=0;

or i:=1 to N do If A[i]>0 then Dem:=Dem+1; Writeln(‘ S s d ng = ‘ , Dem );

Readln; End.

+ Bài tóan tìm s l n nh t c a dãy A1, A2, ..., An. G i Max là bi n ch)a s l n nh t ph i tìm, th thì : B c 1: Gán Max:=A[1]; B c 2: N u Max<A[2] thì gán Max:=A[2]; B c 3: N u Max<A[3] thì gán Max:=A[3]; ... B c n: N u Max<A[n] thì gán Max:=A[n]; + Bài s p x p m ng t ng d n (hay gi m d n)

Có nh ng ph ng pháp s*p x p m ng khác nhau, ây ch xin gi i thi u m t ph ng pháp, tuy ch a ph i là hay nh ng n gi n và d$ hi u cho nh ng ng !i m i l p trình, ó là ph ng pháp l a ch n tr c ti p (Bubble sort).

Ý t ng c a ph ng pháp là nh sau:

B c 1: Tìm s nh nh t trong các ph n t A[1], A[2],.., A[n] và vào v trí u tiên A[1].

B c 2: Tìm s nh nh t trong các ph n t A[2], A[3],.., A[n] và vào v trí th) hai A[2]..v.v.

B c n-1: Tìm s nh nh t trong hai ph n t A[n-1], A[n] và vào v trí n-1. Tóm l i, thu t s*p x p dãy A t ng c vi t nh sau:

For i:=1 to N-1 do For j:=i+1 to N do if A[i]>A[j] then

begin { Ð i ch A[i] và A[j] } Z:=A[i];

A[i]:=A[j]; A[j]:=Z; end;

Trong ó N là s ph n t c a dãy A còn Z là m t bi n trung gian có cùng ki u d li u v i các ph n t c a m ng A. Ch ng trình d i ây tìm s l n nh t c a m ng A và s*p dãy A t ng d n: PROGRAM Tangdan; Uses CRT; Type

Kmang = array[1..20] of Real; Var i, j, N : Integer; A: Kmang; z, Max : Real; Begin Clrscr; Repeat Write(‘ Nh p s ph n t N : ‘); Readln(N); Until (N>0) and ( N<21); For i:=1 to N do { nh p m ng } begin

Write(‘Nh p A[‘, i, ‘]: ‘); Readln(A[i]); end;

{ Tìm s l n nh t } Max :=A[1];

For i :=1 to N do if Max< A[i] then Max:=A[i]; Writeln(‘ S l n nh t là: ’ , Max : 4:1);

{ s*p x p dãy t ng } For i:=1 to N-1 do For j:=i+1 to N do

If A[i]>A[j] then begin { i ch A[i] và A[j] } z:=A[i];

A[i]:=A[j]; A[j]:=z; end;

Writeln(‘ Dãy ã s*p t ng là : ‘); For i:=1 to N do Write(A[i]:3:0); Readln;

End.

+ Ki m tra m ng có th"a m t tính ch t khơng.

Ta th !ng g&p bài ki m tra xem m i ph n t c a m ng A có th a mãn m t

i u ki n khơng, ví d# m ng A có ph i là dãy t ng khơng, có ph i là dãy i x)ng khơng, có ph i là m t c p s c ng không v.v... Cách th c hi n nh sau : Ta x d#ng m t bi n Kiemra ki u Boolean th c hi n nh sau: (adsbygoogle = window.adsbygoogle || []).push({});

Kiemtra:=TRUE; For i:=1 to N do

if A[i] không th a i u ki n then Kiemtra:= FALSE; Vi c xác nh i u ki n là tùy t ng bài c# th .

Ví d#: Ki m tra xem A có ph i là m t dãy i x)ng không ? Dãy 1 3 5 4 5 3 1 là i x)ng.

Dãy 1 3 5 4 2 3 1 là không i x)ng vì A[3] khác A[5].

Gi thi t bi n Kiemtra ã c khai báo ki u Boolean. Trong ch ng trình ta dùng các l nh sau:

Kiemtra:=TRUE; For i:=1 to N do

if A[i]<>A[N-i+1] then Kiemtra:=FALSE;

If Kiemtra=TRUE then writeln(‘ Dãy A i x)ng’) else

Writeln( ‘Dãy A không i x)ng ‘);

3. M ng hai chi"u (ma tr n) 3.1. Khai báo m ng hai chi u +Ki u d li u

TYPE

Tênki um ng= Array[n1..n2 , m1..m2] of Tênki udli u;

Trong ó n1, n2 là các h ng có cùng ki u d li u và n1.. n2, chúng xác nh ph m vi c a ch s th) nh t, g i là ch s dòng. T ng t m1, m2 là các h ng có cùng ki u d li u và m1 .. m2, chúng xác nh ph m vi c a ch s th) hai, g i là ch s c t. Gi ng nh m ng m t chi u, ki u d li u c a các ch s ch có th là ki u m c: nguyên, ký t , lô gic, li t kê hay o n con, không c là ki u th!c hay chu i.

+ Bi n m ng VAR

Tênm ng : Tênki um ng ; Ví d# : Type

Kmang1 = array[1..2, 1..3] of Real;

Kmang2 = array[‘a’..’c’ , 1..3] of String[15]; Var

X : Kmang1; Y : Kmang2;

Ghi chú : Trong m ng hai chi u TP cho phép khai báo tr c ti p bi n m ng, cách

khai báo nh sau : VAR

Tênm ng : Array[n1..n2 , m1..m2] of Tênki ud li u; Ví d#, cho khai báo :

Var

X : array[1..2, 1..3] of Real;

Y : array[‘a’..’c’ , 1..3] of String[15]; K t qu ta nh n c hai m ng hai chi u:

M ng X g m 6 ph n t cùng ki u d li u th c: X[1,1], X[1,2], X[1,3]

X[2,1], X[2,2], X[2,3]

Y[‘a’,1], Y[‘a’,2], Y[‘a’, 3] Y[‘b’,1], Y[‘b’,2], Y[‘b’, 3] Y[‘c’,1], Y[‘c’,2], Y[‘c’, 3]

Chú ý: - Có th xem m ng hai chi u là m ng m t chi u mà m i ph n t c a nó l i là m t m ng m t chi u.

3.2 Khai báo và gán giá tr ban u

Có th khai báo và gán giá tr ngay cho m t m ng hai chi u, ch4ng h n: Type (adsbygoogle = window.adsbygoogle || []).push({});

Kmang1 = array[1..2, 1..3] of Real; Const

X : Kmang1 = ( (1.5, 2.5, 3.5), (5.0, 6.5, 7.0) );

Khi ó X là m t m ng hai chi u có 6 ph n t cùng ki u th c và có giá tr là: X[1,1]=1.5, X[1,2]=2.5, X[1,3]=3.5

X[2,1]=5.0, X[2,2]=6.5, X[2,3]=7.0

C n nh n m nh r ng m&c dù t khóa ây là Const song X và các ph n t c a X có th dùng nh các bi n, t)c là các ph n t c a X có th thay i giá tr

c.

3.3 Các thao tác trên ma tr n

Ð xác nh m t ph n t trong m ng hai chi u, ta vi t: Tênbi nm ng[ch s 1, ch s 2]

Ví d#:

X[1,1]:=12.5; X[2,1]:=X[1,1]+15; Y[‘a’,1]:=‘Tran Thi Mai’;

Ð nh p d li u cho m t m ng hai chi u, ta ph i dùng hai vòng l&p duy t theo hai ch s , ch4ng h n mu n nh p d li u cho m ng X, ta vi t: For i:=1 to 2 do For j:=1 to 3 do begin Write(‘nh p ph n t hàng ‘, i, ‘ c t ‘, j , ‘: ‘); Readln(X[i, j]); end; T ng t , l nh nh p d li u cho m ng Y c vi t là: For ch:=‘a’ to ‘c’ do For j:=1 to 3 do begin Write(‘nh p ph n t hàng ‘, ch , ‘ c t ‘, j , ‘: ‘); Readln(X[ch, j]); end; trong ó ch là bi n ki u ký t , còn i và j là các bi n nguyên. Ð in m ng X lên màn hình, trình bày gi ng nh cách vi t ma tr n, m i hàng in trên m t dòng, ta dùng l nh : For i:=1 to 2 do begin For j:=1 to 3 do write(X[i, j]:3:1); { in hàng th i}

Writeln; { xu ng dòng, chu n b in hàng ti p theo } end;

3.4. Các ví d v ma tr n

Vì ma tr n là m ng m t chi u c a các m ng m t chi u nên nhi u bài v m ng c m r ng t nhiên cho ma tr n.

Ví d# 1: Tính t%ng c a hai ma tr n

Nh p vào hai ma tr n A, B c p NxM. Tính ma tr n C là t ng c a hai ma tr n A và B, in ma tr n C lên màn hình.

Cơng th)c tính các ph n t c a ma tr n C= A+B : C[i,j ] = A[i, j] + B[i, j] v i i=1,..., N, và j=1,..., M Ch ng trình nh sau: PROGRAM Tong_hai_ma_tran; Uses CRT; Var A, B, C : Array[1..10, 1..10] of Real; i, j , N, M : Integer; Begin Clrscr; Repeat Write(‘Nh p s hàng N, s c t M : ‘); Readln(N, M); Until ( N>0) and ( N<11) and ( M>0) and (M<11); For i:=1 to N do

For j:=1 to M do begin

Write(‘Nh p A[‘ , i, ‘,’ , j , ‘]: ‘); Readln(A[i,j]); end; { nh p B và tính C ln} For i:=1 to N do For j:=1 to M do begin Write(‘Nh p B[‘ , i, ‘,’ , j , ‘]: ‘); Readln(B[i,j]); C[i, j]:=A[i, j] + B[i, j];

end; { In ma trân A lên màn hình } Writeln(‘ Ma tran A la :’); For i:=1 to N do begin For j:=1 to M do write(A[i, j]:3:0); Writeln; end; { In ma trân B lên màn hình } Writeln(‘ Ma tran B la :’); For i:=1 to N do begin For j:=1 to M do write(B[i, j]:3:0);

Writeln; end; { In ma tr n C lên màn hình } Writeln(‘ Ma tran C la :’); For i:=1 to N do begin For j:=1 to M do write(C[i, j]:3:0); Writeln; end; Readln; End. Ví d# 2: Tìm s l n nh t (s nh" nh t) trong ma tr n A: Gi s A là ma tr n N hàng, M c t, và Max là bi n ch)a s l n nh t ph i tìm. Kh i u ta gán A[1,1] cho Max, sau ó duy t t t c các ph n t c a ma tr n, n u ph n t nào l n h n Max thì l u nó vào Max, t)c là:

Max:=A[1,1]; For i:=1 to N do For j:=1 to M do

if Max< A[i, j] then Max:=A[i, j]; Writeln(‘ S l n nh t là ’, Max);

Ví d# 3: Tìm s l n nh t (hay s nh" nh t) trong t ng hàng (hay t ng c t) c a ma tr n A:

Hàng i c a ma tr n A có d ng : A[i,1], A[i,2], ..., A[i,M]

N u xem i là c nh thì ó là m ng m t chi u có M ph n t , nên s l n nh t c a hàng i c tìm b ng các l nh:

Max:=A[i, 1]; For j:=1 to M do

if Max< A[i, j] then Max:=A[i, j]; Writeln(‘Sln c a hàng ‘, i, ‘ là: ‘, Max) ;

Vì có c th y N hàng nên cơng vi c trên ph i làm N l n )ng v i i=1, 2, ..., N, t)c là: (adsbygoogle = window.adsbygoogle || []).push({});

For i:=1 to N do

begin { tìm s l n nh t c a hàng i } Max:=A[i, 1];

For j:=1 to M do

if Max< A[i, j] then Max:=A[i, j]; Writeln(‘Sln c a hàng ‘, i, ‘ là: ‘, Max) ; end;

Ví d# 4: Ki m tra ma tr n vng A có i x ng không ?.

Ma tr n vuông A g i là i x)ng n u nó khơng thay i khi ta i c t thành hàng và i hàng thành c t.

Hai ma tr n A,B : A là i x)ng, cịn B khơng i x)ng vì B[1,2] <> B[2,1]. Ch c n có m t c&p i, j sao cho

A[i,j]<>A[j,i] thì A là ma tr n khơng i x)ng.

V y các l nh ki m tra tính i x)ng c a ma tr n A là: Kiemtra := TRUE;

For i:=1 to N do For j:=1 to N do

if A[i, j]<>A[j, i] then Kiemtra:=FALSE ; If Kiemtra=TRUE then writeln(‘ Ð i x)ng ‘) else writeln(‘ Không i x)ng ‘); Ví d# ch ng trình ma tr n c# th th c hi n các công vi c trên: PROGRAM Matran; Uses CRT; Type

Matran = Array[1..10, 1..10] of Real; Var

A : Matran;

i, j , N, Dem : Integer; Max, Min : Real; Kiemtra: Boolean; Begin Clrscr; Repeat Write(‘Nh p c p N : ‘); Readln(N); Until ( N>0) and ( N<11) ; For i:=1 to N do For j:=1 to N do begin

Write(‘Nh p A[‘, i, ‘,’ , j , ‘]: ‘); Readln(A[i,j]); end; { In ma trân A lên màn hình } Writeln(‘ Ma tran A la : ’); For i:=1 to N do begin For j:=1 to N do write(A[i, j]: 3 :0); Writeln; end; { Ð m s s 0 } Dem:=0; For i:=1 to N do

For j:=1 to N do if A[i, j]=0 then Inc(Dem); Writeln(‘ Có ‘, Dem, ‘ s khơng’);

{ Tìm s l n nh t c a ma tr n } Max:=A[1,1];

For i:=1 to N do For j:=1 to N do

Writeln(‘ S l n nh t c a ma tr n= ‘, Max : 4:1); { Tìm s nh nh t trong t ng hàng c a ma tr n } For i:=1 to N do

begin

Min:=A[i,1];

For j:=1 to N do if Min > A[i,j] then Min:=A[i,j];

Writeln(‘ S nh nh t c a hàng ‘, i , ‘ là: ‘, Min : 4:1); end; { Ki m tra ma tr n có i x)ng khơng} Kiemtra:=True; For i:=1 to N do For j:=1 to i-1 do

if A[i ,j]<>A[j ,i] then Kiemtra:=False; If Kiemtra=True then Writeln(‘ Ð i x)ng’) else Writeln(‘ Không i x)ng’) ; Readln; End. III D li u ki u chu*i ký t 1. Khái ni m

- Chu i là m t dãy ký t c rào trong 2 d u nháy n. Ví d# : ‘Ngon ngu Pascal’

‘Tin hoc 1998’ ‘12345678’

- Chu i khơng có ký t nào ‘‘ (ch g m hai d u nháy n liên ti p) g i là chu i r ng.

- S ký t có trong chu i g i là dài c a chu i. Chu i ‘ABCD’ có dài 4, chu i ‘Pascal’ có dài là 6. Chu i r ng có dài b ng khơng.

2 Cách khai báo

2.1 Khai báo ki u d li u Type (adsbygoogle = window.adsbygoogle || []).push({});

Tên chu i = String[N]; Tên chu i =String;

Trong ó N là m t h ng nguyên (0<= N <= 255) n nh s ký t t i a mà bi n có th nh n và g i là dài t i a c a bi n chu i. N u khơng có ch th [N] thì chu i có dài t i a là 255 ký t .

Ví d# : Type

Chuoi1=String[60]; Chuoiso=String[50;

2.2.Khai báo bi n chu i

Var

Tên bi n chu i :=H ng chu i; Ví d# :

Var

St2:Chuoiso;

Ghi chú : T ng t nh m ng , TP cho phép khai báo tr c ti p bi n chu i. Cách khai báo nh sau:

Var

Tênbi nchu i : String[N] ; Tênbi nchu i : String ; Var

St : String[17]; Diachi : String;

Khi ó St là bi n chu i có dài t i a là 17 ký t , còn bi n Diachi có dài t i a là 255 ký t .

3. Truy nh p vào t'ng ph!n t c a chu*i

Gi ng nh m ng, m i ph n t c a chu i c truy nh p thông qua tên chu i và ch s c a ph n t .

G i N =Length(St), khi ó ký t th) i (i=1, 2, ..., N) c a St c ký hi u là St[i]. Ví d#, cho : St :=‘ABC’; thì N=3 và St[1]=‘A’, St[2]=‘B’, St[3]=‘C’. Nh v y m i ký t St[i] c dùng nh m t bi n ki u ký t , và chu i có th xem là m t m ng các ký t . Ch4ng h n in chu i ta có th in t ng ký t nh sau:

For i:=1 to Length(St) do write(St[i]);

Ði u này cho th y chu i là m t ki u d li u có tính c u trúc.

Nh ng m&t khác, m i chu i l i có th xem là m t gía tr duy nh t, vì có th nh p và in chu i tr c ti p b ng các l nh:

Readln(St); Write(St);

Ð&c i m này cho th y chu i còn là m t ki u d li u có tính n gi n. 4. Các phép tóan trên chu*i :

Một phần của tài liệu Bài giảng ngôn ngữ lập trình pascal (Trang 38 - 70)