15
GV: ThS Đậu Ngc Sáng 1 MNG MT CHIU TRONG PASCAL 1. Khái nim mng- dãy sDliu kiu mng là mt tp hp hu hn các phn tcó thtvà có cùng kiu dliu. Thtđược sp xếp bắt đầu tphn tđầu tiên 1 đến phn tcui cùng ca mng. Thtchính là chsca phn ttrong mng. Ví d: Cho mng A gm có 7 phn tlà snguyên thì mng A có dng như sau 1 2 3 4 5 6 7 8 4 70 43 57 5 1 Vy A là mt mng hay mt dãy liên tiếp gm có 7 phn t(có chst1 đến 7) mang giá trlà snguyên. Trong đó A[1]=8 tc là phn tth1 ca mng A có giá trlà 8 Tương tự ta có A[2]=4 A[3]=70 A[4]=43 A[5]=57 A[6]=5 A[7]=1 Để ly giá trca mt phn tvtrí i bt kì trong mng A ta chcn truy xut trc tiếp đến chsca phn tđó A[i]. Khi khai báo mt biến có kiu dliu là kiu mng thì biến đó được gi là biến mng. Giá trca biến mng là mt mng hay là mt dãy có tht. 2. Khai báo biến mng Để khai báo biến mảng trong pascal người ta dùng cú pháp sau: Cú pháp: TYPE <Kiểu mảng> = ARRAY [chỉ số đầu..chỉ số cuối] OF <Kiểu dữ liệu>; Chỉ số A

MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

  • Upload
    others

  • View
    32

  • Download
    0

Embed Size (px)

Citation preview

Page 1: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

1

MẢNG MỘT CHIỀU TRONG PASCAL

1. Khái niệm mảng- dãy số

Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có

cùng kiểu dữ liệu. Thứ tự được sắp xếp bắt đầu từ phần tử đầu tiên 1 đến phần

tử cuối cùng của mảng. Thứ tự chính là chỉ số của phần tử trong mảng.

Ví dụ: Cho mảng A gồm có 7 phần tử là số nguyên thì mảng A có dạng

như sau

1 2 3 4 5 6 7

8 4 70 43 57 5 1

Vậy A là một mảng hay một dãy liên tiếp gồm có 7 phần tử (có chỉ số từ 1

đến 7) mang giá trị là số nguyên.

Trong đó A[1]=8 tức là phần tử thứ 1 của mảng A có giá trị là 8

Tương tự ta có A[2]=4

A[3]=70

A[4]=43

A[5]=57

A[6]=5

A[7]=1

Để lấy giá trị của một phần tử ở vị trí i bất kì trong mảng A ta chỉ cần truy

xuất trực tiếp đến chỉ số của phần tử đó A[i].

Khi khai báo một biến có kiểu dữ liệu là kiểu mảng thì biến đó được gọi là

biến mảng. Giá trị của biến mảng là một mảng hay là một dãy có thứ tự.

2. Khai báo biến mảng

Để khai báo biến mảng trong pascal người ta dùng cú pháp sau:

Cú pháp:

TYPE <Kiểu mảng> = ARRAY [chỉ số đầu..chỉ số cuối] OF <Kiểu dữ liệu>;

Chỉ số

A

Page 2: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

2

VAR <Biến mảng>:<Kiểu mảng>;

hoặc khai báo trực tiếp:

VAR <Biến mảng> : ARRAY [chỉ số đầu..chỉ số cuối] OF <Kiểu dữ liệu>;

Ví dụ:

TYPE Mangnguyen = Array[1..100] of Integer;

MangKytu = Array[Byte] of Char;

VAR A: Mangnguyen;

C: MangKytu;

hoặc:

VAR A: Array[1..100] of Integer;

C: Array[Byte] of Char;

Với 2 cách khai báo trên ta có A là mảng số nguyên có 100 phần tử.

3. Nhập giá trị cho mảng

Vì mảng là một dãy liên tiếp các phần tử có cùng kiểu dữ liệu nên ta sử

dụng câu lệnh lặp FOR…TO…DO để nhập.

FOR <biến chỉ số>:=1 TO <Số phần tử> DO

Readln(biến mảng[biến chỉ số]);

Ví dụ:

for i:=1 to 10 do

readln(A[i]);

Trong đó A là biến mảng; i là chỉ số của các phần tử trong mảng A.

Trong phần này chúng ta dùng chương trình con khai báo một thủ tục để

nhập mảng. Việc này tạo nên sự thuận lợi khi thực hiện chương trình, dễ quản

lí, dễ kiểm tra lỗi và có tính sử dụng lại rất cao.

Page 3: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

3

Lưu ý: ở thủ tục nhập mảng trên thì A là tham biến

Khi thực hiện chương trình sẽ cho phép chúng ta nhập vào giá trị cho mảng

giống như khi viết bình thường mà không dùng thủ tục.

Trong phần trên đã cho chúng ta nhập các giá trị cho mảng. Tuy nhiên để

dễ dàng quan sát chúng ta thực hiện thay đổi lại chương trình như sau:

Page 4: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

4

Bây giờ chúng ta thấy rõ ràng từng phần tử a[i] và giá trị nhập vào tương

ứng của chúng trong mảng.

4. In giá trị mảng

Sau khi nhập giá trị cho mảng. Để in các giá trị của mảng ra màn hình

chúng ta thực hiện như sau:

for i:=1 to 10 do

write(A[i]);

Lệnh trên sẽ thực hiện in ra màn hình 10 phần tử của mảng A.

Cũng giống như nhập mảng chúng ta xây dựng một thủ tục in mảng để dễ

dàng thao tác, quản lí, kiểm tra lỗi và sử dụng lại. Lưu ý trong thủ tục InMang

thì A là một tham trị

Page 5: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

5

Kết quả thực hiện sẽ cho ta:

Phần in mảng đã thể hiện cho chúng ta thấy đây là một dãy số gồm có 10

phần tử.

5. Nhập mảng với số phần tử bất kỳ.

Ở phần trên chúng ta xây dựng mảng số nguyên với 10 phần tử

for i:=1 to 10 do

Vậy để xây dựng mảng với số phần tử bất kỳ được nhập tùy ý khi thực

hiện chương trình. Đây là sự linh hoạt khi gán số phần tử cho mảng ta thực hiện

theo cấu trúc sau:

Page 6: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

6

Như vậy với việc nhập vào số phần tử n tùy ý thì chúng ta thay đổi cấu trúc

của thủ tục NhapMang với 2 tham số hình thức là mảng A và số phần tử n.

Lưu ý: ở thủ tục nhập mảng trên thì A là tham biến và n là tham trị. Khi

thực hiện gọi thủ tục NhapMang(A,n) trong chương trình chính thì ta có thể gán

n bằng một giá trị số nguyên cụ thể như NhapMang(A,5) hoặc có thể nhập một

số phần tử bất kỳ bằng lệnh readln thông dụng.

Kết quả thực hiện là:

Page 7: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

7

6. Chương trình hoàn chỉnh

program dayso; uses crt; type Mang=array[1..100] of integer; var A:Mang; i,pt:integer; //CHUONG TRINH CON NHAP MANG procedure NhapMang(var A:Mang; n:integer); begin for i:=1 to n do Begin write('a[',i,']='); readln(A[i]); end;

end; //CHUONG TRINH CON IN MANG procedure InMang(A:Mang; n:integer); Begin for i:=1 to n do write(a[i]:4); End; //CHUONG TRINH CHINH Begin clrscr; write('Nhap so phan tu mang:'); readln(pt); NhapMang(A,pt); writeln('MANG SAU KHI NHAP'); InMang(a,pt); readln; End.

7. Đọc mảng vào file

Để đọc các giá trị của mạng lưu vào file riêng ta thực hiện thứ tự các lệnh

như sau tại chương trình chính:

assign(t,'tên file'); với t là biến kiểu tệp

rewrite(t); mở tệp ra ghi

//ghi các phần tử của mảng A vào tệp

for i:=1 to pt do

write(t,A[i]);

close(t);

Ví dụ:

Page 8: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

8

write('Nhap so phan tu mang:'); readln(pt);

NhapMang(A,pt);

assign(t,'b.inp');

rewrite(t);

writeln(t,pt);

for i:=1 to pt do

write(t,a[i]);

close(t);

Sau khi thực hiện đoạn chương trình trên thì chúng ta nhập được mảng A

gồm pt phần tử. Tiếp đến là chúng ta mở file b.inp ra và thực hiện ghi tất cả các

phần tử trong mảng A vào file b.inp

Sau đây là chương trình hoàn chỉnh cho việc ghi dữ liệu mảng vào file

Program dayso;

Uses crt;

Type mang=array[1..100] of integer;

Var a:mang; m,i,pt:integer;t:text;

//chuong trinh con nhap mang

Procedure nhapmang(var a:mang; var n:integer);

Begin

for i:=1 to n do

begin

write('a[',i,']=');

readln(a[i]);

end;

End;

//chuong trinh con in mang

Procedure inmang(a:mang; n:integer);

Begin

for i:=1 to n do

write(a[i]:4);

End;

//chuong trinh chinh

Begin

Clrscr;

Write('nhap so phan tu mang:'); readln(pt);

Nhapmang(a,pt);

Assign(t,'dulieu.inp');

Rewrite(t);

Writeln(t,pt);

Page 9: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

9

For i:=1 to pt do

Write(t,a[i]);

Close(t);

Writeln('mang sau khi nhap');

Assign(t,'inmang.out');

Rewrite(t);

Writeln(t,pt);

For i:=1 to pt do

Write(t,a[i]);

Close(t);

Readln;

End.

8. Đọc dữ liệu từ file đã có vào mảng

Để đọc dữ liệu từ file đã có vào mảng để tiến hành tính toán, xử lí thì ta

thực hiện như sau:

Assign(f,’tên file’);

Reset(f);

For i:=1 to n do

read(f, A[i]);

close(f)

Lưu ý: f là biến kiểu file

Tên file: là tên file đã có dữ liệu cần đọc vào mảng A

Ví dụ: Cho file dulieu.inp như mẫu sau:

Hàng thứ nhất là số phần tử trong mảng. Hàng thứ hai là giá trị các phần tử

trong mảng. Mỗi giá trị cách nhau 1 khoảng trắng. Tuy nhiên chúng ta có thể

cho bao nhiêu khoảng trắng cũng được.

Page 10: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

10

Hãy đọc dữ liệu từ file dulieu.inp trên và lưu vào file mới ketqua.out như sau:

Sau đây là toàn bộ chương trình

program dayso;

uses crt;

type Mang=array[1..100] of integer;

var A:Mang; i,n,d,t:integer;

f:text;

Begin

clrscr;

assign(f,'f:\vong2\dulieu.inp');

reset(f);

readln(f,n);

for i:=1 to n do

read(f,A[i]);

readln(f);

close(f);

assign(f,'f:\vong2\ketqua.out');

rewrite(f);

for i:=1 to n do

write(f,a[i],' ');

close(f);

readln;

End.

Page 11: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

11

BÀI TẬP

Bài 1. Cho mảng số nguyên A gồ 10 phần tử. Hãy viết chương trình con thực

hiện nhập mảng, in mảng sau khi đã nhập trên một hàng. Khoảng cách

giữa các phần tử là 1 khoảng trắng.

Ví dụ:

Bài 2. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100). Tính tổng các giá trị của mảng vừa nhập.

Bài 3. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

Tính tổng các giá trị lẻ của mảng vừa nhập.

Tính tổng các giá trị chẵn của mảng vừa nhập.

Tính tổng các giá trị có chỉ số lẻ của mảng vừa nhập.

Tính tổng các giá trị có chỉ số chẵn của mảng vừa nhập.

Bài 4. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

Tính tổng các giá trị là số nguyên tố

Tính tổng các giá trị là số chính phương

Tính tổng các giá trị là số hoàn hảo

Bài 5. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

In ra tất cả các số có ước số là 2 hoặc 3

In ra tất cả các số có ước số là 2 và 3

Page 12: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

12

Bài 6. Hãy thực hiện tất cả các bài tập từ 1 đến 5 ở trên dưới dạng file gồm có

file dulieu.inp có 2 dòng: Dòng đầu chứa số phần tử mảng và dòng thứ 2

chứa giá trị của mảng. Ví dụ

File ketqua.out chứa kết quả thực hiện chương trình.

Bài 7. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

In ra phần tử có giá trị lớn nhất.

Bài 8. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

In ra phần tử có giá trị nhỏ nhất.

Bài 9. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

In ra phần tử có giá trị lớn thứ 2.

Bài 10. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

In ra phần tử có giá trị nhỏ thứ 2.

Bài 11. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

In ra các phần tử có giá trị nhỏ hơn trung bình cộng của mảng.

Bài 12. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

In ra các phần tử có giá trị lớn hơn số k bất kì với k nhập vào từ bàn

phím.

Bài 13. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100). K là một số nguyên nhập tùy ý.

Tìm k và in ra tất cả vị trí của k trong mảng. Nếu không tìm thấy thì trả

về FALSE

Bài 14. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

In ra phần tử có số lần xuất hiện nhiều nhất

Page 13: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

13

Bài 15. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

In ra số lần xuất hiện nhiều nhất của một giá trị phần tử

Bài 16. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

In ra các phần tử chỉ xuất hiện 1 lần

Bài 17. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100). K là một số nguyên nhập tùy ý.

Tìm k và in ra vị trí đầu tiên của k trong mảng. Nếu không tìm thấy thì

trả về FALSE

Bài 18. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100). K là một số nguyên nhập tùy ý.

Tìm K và thay thế K bằng một giá trị X tùy ý tại vị trí đầu tiên của K

trong mảng.

Bài 19. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100). K là một số nguyên nhập tùy ý.

Tìm K và thay thế K bằng một giá trị X tùy ý tại tất cả vị trí của K trong

mảng.

Bài 20. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

In ra các dãy con tăng liên tục

Ví dụ

Mảng A gồm 4 6 8 3 1 1 3 5 6

Thì các dãy con tăng liên tục là

4 6 8

1 3 5 6

Bài 21. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

In ra dãy con tăng liên tục dài nhất.

Bài 22. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

In ra dãy con tăng liên tục có tổng lớn nhất.

Bài 23. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

In ra dãy con không giảm dài nhất.

Ví dụ

Mảng A gồm 4 6 8 3 1 1 3 5 6

Page 14: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

14

Thì các dãy con không giảm liên tục là :1 1 3 5 6

Bài 24. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100). (Lưu ý dãy không liên tục)

In ra các dãy con tăng.

Ví dụ

Mảng A gồm 4 6 8 3 1 1 3 5 6

Thì các dãy con tăng là :

4 6 8

4 5 6

3 5 6

1 3 5 6

Bài 25. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100). (Lưu ý dãy không liên tục)

In ra các dãy con tăng.

Ví dụ

Mảng A gồm 4 6 8 0 3 1 1 3 5 6

Thì các dãy con tăng dài nhất là : 0 1 3 5 6

Bài 26. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

Mảng A gọi là mảng tăng giảm tuần hoàn nếu mảng A có các giá trị

A[1]<A[2]>A[3]<A[4]>A[5]<A[6]….

Hãy kiểm tra mảng vừa nhập có thỏa mãn tính chất trên không. Có thì

TRUE, ngược lại thì FALSE.

Bài 27. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

Sắp xếp mảng theo chiều tăng dần giá trị

Sắp xếp mảng theo chiều giảm dần giá trị

Bài 28. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

Sắp xếp mảng theo chiều tăng dần các phần tử có chỉ số chẵn và giảm

dần các phần tử có chỉ số lẻ.

Bài 29. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).Tìm kiếm các cặp 2 phần tử gần nhau có tổng chia hết

cho 10. Thay thế cặp phần tử đó bằng tổng của chúng

Dulieu.inp : 1 19 62 7 8 32 12

Ketqua.out: 20 20 62 7 40 40 12

Page 15: MẢNG MỘT CHIỀU TRONG PASCAL · Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và có cùng kiểu dữ liệu. Thứ tự được

GV: ThS Đậu Ngọc Sáng

15

Bài 30. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).Mảng A là mảng đối xứng nếu A[i]=A[n-i+1].

Kiểm tra A có phải là mảng đối xứng không. TRUE là có, FALSE là

không

Bài 31. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

Kiểm tra mảng A là một chuỗi cấp số cộng có công sai k = 5?

Ví dụ: 1 6 11 16 21 26 31

TRUE là có, FALSE là không

Bài 32. Hãy viết chương trình nhập vào một mảng số nguyên gồm n phần tử bất

kì (n>0, n<=100).

Sắp xếp mảng theo chiều tăng dần các giá trị.

Chèn thêm một phần tử có giá trị X sao cho mảng vẫn đảm bảo tăng

dần.