Upload
others
View
32
Download
0
Embed Size (px)
Citation preview
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
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.
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:
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ị
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:
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à:
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ụ:
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);
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.
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.
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
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
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
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
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.