Tải bản đầy đủ (.doc) (17 trang)

SKKN Một số dạng bài tập lập trình pascal có dữ liệu kiểu tệp vận dụng kiến thức mảng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (218.2 KB, 17 trang )

SKKN - Mt s dng bi tp lp trỡnh Pascal cú d liu kiu tp vn dng kin thc mng
A. Đặt vấn đề :
Hiện nay máy tính đang đợc sử dụng rộng rãi trong các cơ quan và gia đình.Nó
là một công cụ hữu hiệu giúp cho công việc nhanh hơn dễ dàng hơn. Học sinh đang
học tập tin học trong nhà trờng. Có nhiều cuộc thi tổ chức cho học sinh giỏi tin học ,
trong đó có cuộc thi tin học trẻ không chuyên.Thi thực hành lập trình bằng ngôn ngữ
Pascal là một phần thi hay và khó.
PASCAL là ngôn ngữ lập trình bậc cao của tác giả Niklaus Wirth (giáo s ngời
Thuỵ sĩ), đợc công bố vào đầu những năm 1970. Tên PASCAL là để kỉ niệm nhà Toán học
ngời Pháp B. Pascal.
Là ngôn ngữ lập trình có tính cấu trúc và tính hệ thống: các kiểu dữ liệu đa dạng,
các cấu trúc điều khiển chặt chẽ, các cấu trúc khối trong chơng trình rõ ràng,các đại lợng
(biến và hằng) đã đợc khai báo để sử dụng với kiểu dữ liệu này thì không thể đem dùng
lẫn với kiểu khác.
PASCAL ban đầu đợc sáng tác để làm ngôn ngữ dạy học cho những ngời mới học lập
trình. Có tính sáng sủa, dễ hiểu, dễ đọc của nó giúp ngời mới học có thể viết một chơng
trình máy tính một cách dễ dàng.
Hoc sinh thờng gặp khó khăn ở phần này vì bài tập đa dạng và khó. Đa số những bài
tập ra theo kiểu tệp ứng dụng thực tế nên học sinh còn lúng túng để đa về dạng bài
toán cơ bản, cha tìm đợc thuật toán phù hợp. Để giúp học sinh hiểu rõ hơn cách làm
bài Pascal khi thi tin học không chuyên tôi đã đa ra kinh nghiệm một số dạng bài
tập lập trình Pascal có dữ liệu kiểu tệp vận dụng kiến thức mảng .Có nhiều dạng
bài tập nhng tôi chủ yếu đa ra bài tệp kiểu tệp vận dụng kiến thức mảng 1 chiều, mảng
2 chiều.
B. giảI quyết vấn đề:
I,D LIU KIU TP
1, Khỏi nim:
Khi gii cỏc bi toỏn cn s dng nhiu ln v sau thỡ ta phi t chc d liu lu tr
trờn a (d liu kiu tp).
Cỏc s liu c gừ vo lu trờn mt tp nh vn bn.Kt qu cng c lu trờn mt
tp vn bn khỏc .Khi kt thỳc chng trỡnh hoc tt mỏy thỡ d liu kiu tp vn tn


Tng Trn Hng
1
SKKN - Một số dạng bài tập lập trình Pascal có dữ liệu kiểu tệp vận dụng kiến thức mảng
tại trên đĩa.Các chương trình không phải kiểu tệp thì chỉ lưu tạm kết quả trên RAM
nên khi tắt máy thì mất hết dữ liệu
Khai báo:
TYPE
Tên tệp:kiểu tệp; vd : var f1, f2: text
Ghi chú:
- Kiểu phần tử của tệp có thể là bất kỳ kiểu dữ liệu nào ngoại trừ kiểu tệp.
- Biến tệp được khai báo băng cách sử dụng một kiểu tệp đã được định nghĩa
trước đó hoặc khai báo trực tiếp với mô tả kiểu. Ví dụ:
Var
F3: File Of Char;
F4: File Of Array[1 5] Of Integer;
- Biến tệp là một biến thuộc kiểu dữ liệu tệp. Một biến kiểu tệp đại diện cho một
tệp. Việc truy cập dữ liệu ở một tệp được thể hiện qua các thao tác với thông số là
biến tệp đại diện.
2. C¸c thao t¸c trªn tÖp :
a. Mở tệp mới để cất dữ liệu:
Chương trình chỉ có thể lưu lại dữ liệu vào một tệp sau khi ta làm thủ tục mở tệp mới
để lưu kết quả.Việc mở tệp được tiến hành với hai thủ tục đi liền nhau theo thứ tự:
Assign(FileVar, FileName)
ReWrite(FileVar);
Trong đó:
- FileVar:biến tệp
- FileName: .Ta nên đặt tên sao cho tên đó phản ánh được ý nghĩa hay bản chất, nội
dung của tệp.
b. Ghi các giá trị vào tệp với thủ tục Write :
Thủ tục Write sẽ đặt các giá trị mới vào tệp.

Cú pháp:
Write(FileVar, Item1, Item2, , ItemN);
Ví dụ: Ta cần ghi vào tệp ChuCai.txt các giá trị 1 5, thực hiện như sau:
Assign(F1, ’ChuCai.txt’);
ReWrite(F1); {mở tệp}
For a:= 1 to 5 do Write(F1, a);
Close(F); {khi ghi xong phải đóng tệp thì dữ liệu mới được lưu vào tệp}
End.
c. Đọc dữ liệu từ một tệp đã có :
Một chương trình muốn sử dụng các dữ liệu đã được chứa trong một têp, đầu tiên phải
mở tệp đó ra để đọc, thủ tục sau nhằm mở một đọc:
Cú pháp:
Assign(FileVar, FileName);
Reset(FileVar);
Tống Trần Hướng
2
SKKN - Mt s dng bi tp lp trỡnh Pascal cú d liu kiu tp vn dng kin thc mng
Sau lnh Reset, nu tp khụng rng thỡ ca s tp bao gi cng tr vo phn t u
tiờn ca tp v chng trỡnh s sao chộp phn t ca tp c tr sang bin m ca
s. Nu ta m mt tp cha tn ti trờn a thỡ s cú li.
c d liu t tp, ta dựng th tc READ dng sau:
Read(FileVar, Var1, Var2, , VarN);
Trong ú: Var1, Var2, , VarN l cỏc bin cú cựng kiu thnh phn ca FileVar.
Gp lnh ny mỏy s c cỏc giỏ tr ti v trớ ca s ang tr (nu cú) gỏn sang bin
tng ng cựng kiu. Sau ú, ca s dch chuyn sang v trớ tip theo v c giỏ tr
cho bin khỏc, c th c cho n bin VarN. READ ch cú th c giỏ tr ca tp
gỏn giỏ tr cho cỏc bin.
Vic c mt phn t ca tp cn tha món iu kin: phn t ú khụng phi l phn
t cui tp tc l EOF. Do ú, trc khi mun c tp v gỏn cho bin X, cn phi
th xem tp ú ó kt thỳc cha bng cõu lnh:

While Not EOF(FileVar) Do {lnh ny thng c s dng trc khi c v gỏn d
liu t mt tp}
Begin
Read(FileVar, X);
X lý bin x nu cn;

End;
Thc hin xong thao tỏc c hay ghi tp ta phi úng tp vi th tc sau:
Close(FileVar);
II, Một số dang bài tập dữ liệu kiểu TệP
1, Dạng bài tập sử dụng mảng 1 chiều
Mng (Array) l mt kiu d liu cú cu trỳc bao gm mt s c nh cỏc thnh
phn cú cựng kiu, cú cựng mt tờn chung. Cỏc phn t ca mng c truy xut
thụng qua cỏc ch s.
Cụng dng ca mng l dựng lu tr mt dóy s liu cú cựng mt tớnh cht no
ú. Vớ d: cỏc im kim tra mt mụn hc no ú ca mt hc sinh, cỏc giỏ tr ca
mt dóy nhiu s c nhp t bn phớm

Bi 1:: cho dãy số gồm N số tự nhiên a
1
, a
2
,a
3
, a
N .
Vit chng trỡnh in ra tng ca
N s trờn .
Dữ liệu vào cho bởi tệp DULIEU.INP có cấu trúc:
-Dòng đầu tiên chứa số nguyên N

-Dòng thứ 2 chứa các số a
1
, a
2
,a
3
, a
N
các số cách nhau ít nhất một kí tự trống.
Dữ liệu ra ghi vào tệp KETQUA.OUT có cấu trúc
Tng Trn Hng
3
SKKN - Mt s dng bi tp lp trỡnh Pascal cú d liu kiu tp vn dng kin thc mng
-Một dòng trả lời kết quả của tổng
Ví dụ
DULIEU.INP KETQUA.OUT
5
4 3 6 7 8
Tong la: 28
Hng dn:
-Hiu ý ngha ca tp DULIEU.INP
Dũng 1 5 {c hiu l dũng di cú 5 s}
Dũng 2: 4 3 6 7 8 {cỏc s cỏch nhau mt du cỏch}
-Bài này giống nh tính tổng của mảng có 5 phần tử đợc nhập dữ liệu từ một tệp có
sẵn chứ không phải nhập dữ liệu khi chạy chơng trình.
-Khi viết chơng trình có 2 phần lớn:
+Phần 1: Đầu tiên ta phải đọc dữ liệu từ tệp DULIEU.INP gỏn cỏc s vo
bin .Ta gán số 5 vào biến N .Sau đó gán 5 số hàng dới vào mảng 1 chiều có 5 phần
tử.
+Phần 2: Sau khi gán các số vào mảng ta có thể xử lí giống nh bài tập mảng 1

chiều
*Lu ý: Phần 1 của các chơng trình cơ bản giống nhau và khá dễ. Phần 2 là phần quan
trọng và khó nhất.
-Sau khi gán các số vào mảng ta có thể xử lí giống nh bài tập mảng.Phải tìm ra đợc
thuật giải nhanh và tối u
-Ta ghi kết quả tổng vào tệp KETQUA.OUT
Các bớc giải:
Bớc 1: Mở một tệp pascal mới và nhập các số liệu trên vào sau đó lu với tên
DULIEU.INP
Bớc 2:Mở một tệp pascal mới và nhập chơng trình sau vào và lu lại với tên bất kì
Program tinh_tong;
Uses CRT;
Var f1,f2: Text; a:array [1 20] of integer; s,n:integer;
Begin
ClrScr;
{ Phần 1}
Assign(F1,DULIEU.INP); Reset(F1); {m tp f1 ly d liu}
Assign(F2,KETQUA.OUT); Rewrite(F2); {to tp f2 ghi kt qa }

While Not EOF(F1) Do
{kiểm tra xem đã kết thúc tệp f1 cha nếu cha kết thúc thì tiếp tục đọc dữ liệu }
Begin
Readln(F1, n); {gán số 5 cho biến n}
For i:=1 to n do read(f1,a[i]) { gán 5 số ở dòng dới vào biến mảng a[i] }
End;
{sau khi gán các số vào mảng ta có thể xử lí giống nh bài tập mảng}
{ Phần 2}
S:=0;
For i:=1 to n do s:=s+a[i];
Write(f2,'Tong la:',s); {trả lời tổng s và lu vào tệp f2 , KETQUA.OUT}

Close(f1);close(f2);
{sau khi ghi xong dữ liệu phải đóng tệp nếu không dữ liệu sẽ không đợc ghi }
Tng Trn Hng
4
SKKN - Mt s dng bi tp lp trỡnh Pascal cú d liu kiu tp vn dng kin thc mng
Readln;
End.
Bc 3: n ctrl+f9 chy chng trình
Bc 4: m tp KETQUA.OUT xem kt qu tng.Trong tp kết qủa
KETQUA.OUT sẽ có kt qu Tong la:28
Bài 1 là dạng bài tập mà số phần tử của mảng đã đợc cho trớc trong tệp DULIEU.INP
là số đầu tiên của tệp.Nếu dạng bài không cho biết số phần tử của mảng thì ta phải có
thêm lệnh đếm số phần tử. Sau đây là bài tơng tự bài 1 nhng không cho biết số phần tử
Bi 2:: cho dãy số gồm N số tự nhiên a
1
, a
2
,a
3
, a
N .
Vit chng trỡnh in ra tng ca
N s trờn .
Dữ liệu vào cho bởi tệp DULIEU.INP có cấu trúc:
-Một dòng chứa các số a
1
, a
2
,a
3

, a
N
các số cách nhau ít nhất một kí tự trống.
Dữ liệu ra ghi vào tệp KETQUA.OUT có cấu trúc
-Một dòng trả lời kết quả của tổng
Ví dụ
DULIEU.INP KETQUA.OUT
4 3 6 7 8
Tong la: 28
Viết chơng trình
Program tinh_tong;
Uses CRT;
Var f1,f2: Text; a:array [1 20] of integer; s,n:integer;
Begin
ClrScr;
{ Phần 1}
Assign(F1,DULIEU.INP); Reset(F1); {m tp f1 ly d liu}
Assign(F2,KETQUA.OUT); Rewrite(F2); {to tp f2 ghi kt qa }
n:=0; {n là biến đếm số phần tử}
While Not EOF(F1) Do
Begin
n:=n+1; { cha nếu cha kết thúc tệp thì tăng n một đơn vị}
read(f1,a[i]) { gán lần lợt 5 số vào biến mảng a[i] }
End;

So sánh sự khác nhau của 2 đoan chơng trình
Cho biết số phần tử Không cho biết số phần tử
Tng Trn Hng
5
SKKN - Mt s dng bi tp lp trỡnh Pascal cú d liu kiu tp vn dng kin thc mng

While Not EOF(F1) Do
Begin
Readln(F1, n);
For i:=1 to n do read(f1,a[i])
End;
n:=0;
While Not EOF(F1) Do
Begin
n:=n+1;
read(f1,a[i])
End;
Bài 3: Cầu lông
Trong buổi lễ bế mạc cuộc thi đấu cầu lông .Các vận động viên đứng thành 1 hàng.Có
N vận động viên tham gia.Kết quả điểm của mỗi vận động viên thứ i là a
i
.Trong đó chỉ
có 2 vận động viên bằng điểm nhau.Hãy tìm vị trí 2 vân động viên bằng điểm nhau và
số điểm của họ .
Dữ liệu vào cho bởi tệp CAULONG.INP có cấu trúc:
-Dòng đầu tiên chứa số nguyên N
-Dòng thứ 2 chứa các số a
1
, a
2
,a
3
, a
N
các số cách nhau ít nhất một kí tự trống.
Dữ liệu ra ghi vào tệp CAULONG.OUT có cấu trúc

-Dòng đầu tiên ghi số điểm của 2 động viên bằng điểm nhau
-Dòng thứ 2 ghi vị trí đứng của 2 động viên trong hàng
ví dụ:
CAULONG.INP CAULONG.OUT
6
8 7 5 6 7 2
7
2 5
Giải:
Hớng dẫn:
-Thờng khi đọc đề ta thấy dài nhng ta không nên chú ý nhiều vào yếu tố thực tế mà
chủ yếu tập trung số liệu của 2 tệp ví dụ vào và ra để xem thử cần số liệu ra là gì
-Đây là bài tập mảng 1 chiều tìm 2 phần tử bằng nhau và chỉ số của 2 phần tử đó
-Ta duyệt tất cả các phần tử xem 2 phần tử nào bằng nhau thi in ra giá trị và chỉ số
Viết chơng trình:
Tng Trn Hng
6
SKKN - Mt s dng bi tp lp trỡnh Pascal cú d liu kiu tp vn dng kin thc mng
Program caulong;
uses crt;
Type mang=array[1 100] of integer;
var
a,b,c:mang; ; f1,f2:text;
n,i,j:integer;
BEGIN
Assign(F1, CAULONG.INP); Reset(F1);
Assign(F2, CAULONG.OUT '); Rewrite(F2);
While Not EOF(F1) Do
begin
readln(f1,n);

for i:=1 to n do read(f1,a[i]);
end;

for i:=1 to n do {bat dau duyet tung so}
for j:=i+1 to n do
if a[i]=a[j] then {nếu bằng nhau thì in ra}
Begin
writeln(f2,a[i]:3); {in ra giá trị bằng nhau}
writeln(f2,i:3,j:3); {in ra chỉ số 2 giá trị bằng nhau}
end;
close(f1);close(f2);
readln
. END.
Bài 4:cht lng
Một xng sản xuất sản phẩm trong N tháng. Ban giám đốc muốn biết khả năng sản
xuất của xởng đó.Họ muốn biết số tháng liên tục nhiều nhất mà sản phẩm liên tục
tăng và các tháng đó là tháng nào?.
Dữ liệu vào cho bởi tệp NN.INP có cấu trúc:
-Dòng đầu tiên chứa số nguyên N
-Dòng thứ 2 chứa các số a
1
, a
2
,a
3
, a
N
là số sản phẩm của tháng 1,2,3, N.
Dữ liệu ra ghi vào tệp NN.OUT có cấu trúc
- Dòng 1 là số tháng liên tục nhiều nhất mà sản phẩm liên tục tăng

- Dòng 2 là số các tháng đó .
ví dụ:
NN.INP NN.OUT
9
2 3 1 3 4 5 2 3 4
4
3 4 5 6
Giải:
Hớng dẫn:
- Đây là bài tập mảng 1 chiều tìm số lợng các số liên tiếp tăng nhiều nhất và chỉ số
của các phần tử đó
-Ta duyệt tất cả các phần tử để tính số lợng phần tử tăng nhiều nhất và in ra giá trị số l-
ợng và chỉ số
Viết chơng trình:
Tng Trn Hng
7
SKKN - Mt s dng bi tp lp trỡnh Pascal cú d liu kiu tp vn dng kin thc mng
Program tang_nhieu_nhat;
uses crt;
var
n,i,j,s,bd, max :integer; a:array[1 12] of integer;
f1,f2:text;
BEGIN
clrscr;
assign(f1,'NN.INP'); reset(f1);
assign(f2,'NN.OUT'); rewrite(f2);
while not eof(f1) do
begin
readln(f1,n);
for i:=1 to n do read(f1,a[i]);

end;
Max:=0; {biến max dùng để tính số lợng phần tử tăng nhiều nhất}
For i:=1 to N do
begin
s:=0;
for j:=i to n do
if a[j]<a[j+1] then s:=s+1 else break; {lệnh break là lệnh thoát vòng lặp}
{nếu các số tăng dần thì cộng thêm vào tổng s, ngợc lại nếu không tăng thì thóat
vòng lặp}
if max<s then
begin
max:=s; bd:=j-max; {bd la chi so bat dau cua day lon nhat}
end;
end;
{so luong so thang san pham tang nhieu nhat la }
writeln(f2,max+1);
{so cac thang la}
for i:= bd to bd+max do write(f2,i:3);
close(f1); close(f2);
readln
END.
B i 5: Dãy số đỉnh núi
Dãy số đỉnh núi là dãy số có số phần tử là lẻ, số chính giữa là số lớn nhất(đỉnh núi)
và phía bên trái và bên phải của số đỉnh núi các số giảm dần (xuống núi).Kiểm tra 1
dãy số có phải là dãy số đỉnh núi không?
Dữ liệu vào cho bởi tệp DINHNUI.INP có cấu trúc:
-Một dòng chứa các số a
1
, a
2

,a
3
, a
N
các số cách nhau ít nhất một kí tự trống.
Dữ liệu ra ghi vào tệp DINHNUI.OUT có cấu trúc
-Một dòng trả lời kết quả là dãy số đỉnh núi hay không là dãy số đỉnh núi
Ví dụ
DINHNUI.INP DINHNUI.OUT
3 6 7 8 6 5 2
dãy số đỉnh núi
4 5 7 9 6 7 3
không là dãy số đỉnh núi
Giải:
Hớng dẫn:
Tng Trn Hng
8
SKKN - Mt s dng bi tp lp trỡnh Pascal cú d liu kiu tp vn dng kin thc mng
- Đây là bài tập mảng 1 chiều không cho biết số phần tử
-Nếu n chẵn thì không phải
-Nếu n lẻ thì ta lấy phần tử ở chính giữa làm trung tâm (có chỉ số là (n-1)/2+1 ) sau đó
xét xem
+ Dãy các phần tử từ a
1
đến phần tử ở chính giữa có mấy phần tử tăng dần (bien t)
+ Dãy các phần tử từ phần tử ở chính đến giữa a
N
có mấy phần tử giảm dần (bien s)
-Nếu t=s trả lời là dãy số đỉnh núi ngợc lại thì không phải
Viết chơng trình

Program daydinhnui;
Uses CRT;
Var f1,f2: Text; a:array [1 20] of integer; s,n:integer;
Begin
ClrScr;
Assign(F1, DINHNUI.INP); Reset(F1);
Assign(F2, DINHNUI.OUT); Rewrite(F2);
n:=0;
While Not EOF(F1) Do
Begin
n:=n+1;
read(f1,a[i])
End;
if (n mod 2 = 0) then write(f2,'khong la day dinh nui'); { n chẵn}
else { nếu n lẻ}
begin
s:=0; t:=0;
for i:=1 to n do
begin
for i:=1 to (n div 2)+1 do
if a[i]<a[i+1] then s:=s+1 else break;
if s=((n div 2)+1) then
begin
for i:= ((n div 2)+1) to n do
if a[i]>a[i+1] then t:=t+1 else break;
end;
if t=s then write(f2,'la day dinh nui ') else
write(f2,'khong la day dinh nui');
end;
end;

close(f1); close(f2);
readln
end.

Tng Trn Hng
9
SKKN - Mt s dng bi tp lp trỡnh Pascal cú d liu kiu tp vn dng kin thc mng
2, Dạng bài tập sử dụng mảng 2 chiều
Bài 1: giao hữu thể thao
Trong 1 cuộc thi đấu giao hữu thể thao có 2 đội A,B mỗi đội tham gia N môn thi đấu.
Sau khi thi đấu xong 2 đội xếp thành M hàng để công bố kết quả.Các vân động viên
đứng theo thứ tự i các môn thi đấu.Để tao sự thân thiện các hàng của 2 đội xếp xen kẽ
nhau. Đội A xếp hàng số lẻ, đội B xếp hàng số chẵn.Hãy tính tổng số điểm của từng
môn của từng đội và tổng điểm của từng đội?
Dữ liệu vào cho bởi tệp GIAOHUU.INP có cấu trúc:
-Dòng đầu tiên chứa 2 số nguyên N,M
-N dòng tiếp theo mỗi dòng chứa M số nguyên dơng là số điểm của từng vận
động viên tơng ứng môn i
Dữ liệu ra ghi vào tệp GIAOHUU.OUT có cấu trúc là
-M dòng đầu là tổng số điểm của từng môn của từng đội
-Dòng cuối cùng là tổng điểm của từng đội
ví dụ:
GIAOHUU.INP GIAOHUU.OUT
3 4
1 2 1 3
2 1 2 2
5 1 3 4

2 5
4 3

8 5
14 13
Hớng dẫn:
-Đây là bài tập mảng 2 chiều tính tổng các số hàng lẻ và hàng chẵn sau đó lại tính
tổng của cột lẻ và cột chẵn
Viết chơng trình:
PROGRAM giaohuu;
uses crt;
var
i,j,k,m,n,l,s,t,tl,tc:integer;
f1,f2:text; a:array[1 100,1 100] of integer;
begin
clrscr;
assign(f1,'GIAOHUU.INP');
reset(f1);
assign(f2,'GIAOHUU.OUT');
REWRITE(F2);
while not eof(f1)do
begin
readln(f1,n,m); {n là số hàng,m là số cột}
for i:=1 to n do
for j:=1 to m do read(f1,a[j,i]);
end;
for i:=1 to n do
begin
s:=0; t:=0; j:=1; k:=2;
Tng Trn Hng
10
SKKN - Một số dạng bài tập lập trình Pascal có dữ liệu kiểu tệp vận dụng kiến thức mảng
{s lµ tæng c¸c sè hµng lÎ; t tæng c¸c sè hµng ch½n; j lµ chØ sè cét lÎ, k lµ chØ sè cét

ch½n }
while (j <=m) and (k<=m) do
begin
s:=s+a[j,i]; t:=t+a[k,i];
j:=j+2; k:=k+2;
end;
writeln(s:3,t:3);
tl:=tl+s; { tl lµ tæng cét lÎ}
tc:=tc+t; { tc lµ tæng cét ch½n}
end;
write(f2,tl:3, tc:3);
close(f1); close(f2);
readln
end
Bài 2:Nhà máy có M tổ sản xuất . Mỗi tổ sản xuất N loại sản phẩm . Lãnh đạo nhà
máy muốn biết trong cùng 1 loại sản phẩm thì sản phẩm nào được tất cả các tổ sản
xuất số lượng bằng nhau?
Dữ liệu: File văn bản BANGNHAU.DAT:
- Dòng đầu tiên chứa hai số nguyên dương M ,N(N≤M≤200);
- Các dòng tiếp theo chứa các số lượng của từng loại sản phẩm của các tổ
Kết quả: Ghi ra file văn bản BANGNHAU.OUT:
- Ghi số hiệu loại sản phẩm và số lượng loại sản phẩm được tất cả các tổ sản xuất số
lượng bằng nhau
Ví dụ:
BANGNHAU.DAT BANGNHAU.OUT
3 5
2 1 3 5 5
3 1 2 5 3
4 1 5 5 3
2 1

4 5
Tống Trần Hướng
11
SKKN - Mt s dng bi tp lp trỡnh Pascal cú d liu kiu tp vn dng kin thc mng
Hớng dẫn:
-Đây là bài tập mảng 2 chiều tìm những cột nào mà giá trị phần tử hoàn toàn bằng
nhau
-In ra chỉ số cột và phần tử bằng nhau đó
Viết chơng trình:
PROGRAM bangnhau;
uses crt;
var i,j,m,n,k,t,s:integer; f1,f2:text;
a,b:array[1 100,1 100] of integer;
begin
clrscr;
assign(f1,'BANGNHAU.DAT');
RESET(f1);
assign(f2,'BANGNHAU.OUT');
rewrite(f2);
while not eof(f1) DO
begin
readln(F1,m,n);
for i:=1 to m do
for j:=1 to n do read(F1,a[i,J]);
end;
for j:=1 to n do
if i<=m then
begin
i:=1; t:=i+1;
if a[i,j]=a[t,j] then {so sánh các phần tử cột j }

begin
writeln(F2,j:3,a[i,j]:3);
end;
end;
readln
end.
3, Dạng bài tập sử dụng mảng tìm ph ơng án tối u
-Ta thờng phải sắp xếp mảng đã cho theo thứ tự tăng hoặc giảm để tìm ra giá trị lớn
nhất hay nhỏ nhất
Bài 1:Phân Phối Xăng
Trạm phân phối A có N lít xăng.Có M xe ô tô cần đến trạm A để lấy xăng
(đánh số từ 1 M) nhu cầu lấy của xe thứ i là X
i
lít .(0< i <=M)
Hãy tìm cách giúp trạm A phân phối xăng sao cho có nhiều xe đợc lấy xăng theo
đúng nhu cầu lấy nhất
Dữ liệu vào cho bởi tệp XANG.INP có cấu trúc:
-Dòng đầu tiên chứa 2 số nguyên N,M
-N dòng tiếp theo mỗi dòng chứa các số X
1
,X
2 ,
X
3
X
M


Dữ liệu ra ghi vào tệp XANG.OUT có cấu trúc là
-Dòng đầu ghi số lợng xe đợc lấy xăng theo đúng nhu cầu lấy nhất

-Các dòng tiếp theo ghi số hiệu của xe đợc lấy xăng theo đúng nhu cầu lấy
ví dụ:
XANG.INP XANG.OUT
20 6 5
Tng Trn Hng
12
SKKN - Mt s dng bi tp lp trỡnh Pascal cú d liu kiu tp vn dng kin thc mng
7 8 3 2 4 2 6
4
3
5
1
Hớng dẫn:
-Đây là dạng bài tập tìm tổng của nhiều phần tử nhất mà không vợt quá 20
-Ta thờng phải sắp xếp mảng đã cho theo thứ tự tăng hoặc giảm
-Ta gán mảng a vào một mảng b (để sau lấy lại chỉ số) sau đó sắp xếp tăng dần rồi
tính lần lợt tổng lợng xăng tiêu thụ.Nếu khi nào vợt quá tổng lợng xăng là 20 lít thì
dừng lại
-Minh họa thuật toán:
+Gán mảng a vào mảng b :
a
1
= b
1
=7 ; a
2
= b
2
=8 ; a
3

= b
3
=2 ; a
4
= b
4
=2 ; a
5
= b
5
=4 ; a
6
= b
6
=2 ;
+ Sắp xếp mảng tăng : a
1
=2 ;a
2
=2 ;a
3
=3; a
4
=4 ;a
5
=7 ;a
6
=8 các chỉ số của
mảng a cũ đã thay đổi
+ Tính tổng các số :2+2+ 3+ 4+ 7=18<20.Nếu cộng thêm 8 sẽ vợt quá 20

+ Dựa vào biến đếm ta xác định đợc 5 xe đợc lấy xăng theo đúng nhu cầu lấy
nhất
+Muốn in ra chỉ số ban đầu ta phải so sánh 5 phần tử của mảng a đã sắp xếp
tăng với mảng b để tìm chỉ số ban đầu
-Sau đó in ra số lợng xe và chỉ số của các xe đó
Viết chơng trình:
PROGRAM phanphoixang;
uses crt;
TYPE MANG=array[1 10] of integer;
var
t,n,i,k,j ,s,m:integer; a,b,c:MANG;
begin clrscr;
assign(f1, XANG.INP );
reset(f1);
assign(f2, XANG.OUT);
rewrite(f2);

while not eof(f1) do
begin
readln(F1,m,n);
for i:=1 to n do read(F1,a[i]);
end;
for i:=1 to n do b[i]:=a[i];
{do phải sắp xếp mảng a nên ta gán mảng a nào mảng b để sau nay lấy lại chỉ số mảng
a}
{sap xep mang a tang dan}
for i:=1 to n do
for j:=i to n do
Tng Trn Hng
13

SKKN - Một số dạng bài tập lập trình Pascal có dữ liệu kiểu tệp vận dụng kiến thức mảng
if a[i]>a[j] then
begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
end;
{tinh so luong xe thoa man}
s:=a[1];i:=1;k:=0;
while (s<=m) and (i<=n)do
begin
k:=k+1; {bien k de tinh so luong xe}
s:=s+a[i]; {bien s tinh tong luong xang}
i:=i+1; {bien i la chi so cua mang a}
end;
writeln(f2,k:4); { in ra so luong xe}
{tim chi so cac xe duoc lay xang}
s:=a[1];i:=1;
while (s<=m) and (i<=n)do
begin
if a[i]<>a[i+1] then
for k:=1 to n do
if a[i]=b[k] then write(k:3); {in ra chi so cua xe duoc lay xang}
i:=i+1;
s:=s+a[i];
end;
readln
end.
Bài 2 : Một người mang số tiền là N đi mua một bộ quần áo. Cửa hàng có M kiểu bộ
quần áo đánh số từ 1 đến M. Quần và áo có giá riêng là q

i
, a
i
. Hãy giúp người đó chọn
mua một bộ quần áo sao cho giá bộ quần áo đó là lớn nhất nhưng không vượt quá số
tiền người đó mang theo?
Dữ liệu vào: File văn bản QUANAO.INP:
- Dòng đầu tiên chứa hai số nguyên dương N, M
- M dòng tiếp theo chứa các số nguyên dương .Dòng i chứa 2 số là giá quần và giá áo
của kiểu i
Kết quả: Ghi ra file văn bản QUANAO.OUT:
- Dòng đầu tiên ghi tổng số tiền bộ quần áo
- Dòng thứ 2 ghi số kiểu của bộ quần áo
QUANAO.INP QUANAO.OUT
Tống Trần Hướng
14
SKKN - Mt s dng bi tp lp trỡnh Pascal cú d liu kiu tp vn dng kin thc mng
26 4
7 15
9 15
13 16
8 13
24
2
Hớng dẫn:
-Đây là dạng bài tập mảng a 2 chiều tìm hàng có tổng lớn nhất nhng không vợt quá
26
-Ta tính tổng của từng hàng gán vào một mảng b
-Ta sắp xếp mảng b tăng dần .Xét lần lợt nếu phần tử mảng b nào vợt quá tổng lợng
tiền là 26 thì dừng lại

-Minh họa thuật toán:
+ Tính tổng của từng hàng gán vào mảng b :
b
1
=

7 + 15=22 ; b
2
=9+ 15=24; b
3
=13 + 16=29; b
4
=8 + 13=21
+Gán vào mảng b mảng c :
b
1
= c
1
= 22 ; b
2
= c
2
=24 ; b
3
= c
3
= 29 ; b
4
= c
4

=21 ;
+Sắp xếp mảng b tăng dần: b
1
=21; b
2
=22; b
3
=24; b
4
=29
+So sánh các phần tử của mảng b với 26 ta có b
3
=24 là phần tử lớn nhất không
lớn hơn 26. Sau đó in ra tổng tiền lớn nhất không vợt quá 26 là 24
+Muốn in ra chỉ số của hàng ban đầu ta phải so sánh b
3
=24 với các phần tử của
mảng c để tìm chỉ số ban đầu là 2 (b
3
=24= c
2
)
Viết chơng trình:
uses crt;
type
mang=array[1 10,1 200] of integer;
var n,m,i,j,t,k,s,h:integer ;
a:mang; f1,f2:text; c,b:array[1 10] of integer;

BEGIN

Assign(F1,'QA.INP');
Reset(F1);
Assign(F2,'QA.TXT');
Rewrite(F2);
While Not EOF(F1) Do
Begin
Readln(F1,m,n);
For i:=1 to n do
for j:=1 to 2 do read(f1,A[i,j]);
end;
{tinh tong cua tung hang}
For i:=1 to n do
begin
s:=0;
for j:=1 to 2 do s:=s+a[i,j];
Tng Trn Hng
15
SKKN - Mt s dng bi tp lp trỡnh Pascal cú d liu kiu tp vn dng kin thc mng
b[i]:=S; {mang 1 chieu b là tổng của các hàng}
end;
for j:=1 to n do c[j]:=b[j];
{do phải sắp xếp mảng b nên ta gán mảng b nào mảng c để sau nay lấy lại chỉ số các
hàng nh ban đầu}
{sap xep mang b tang dan}
for j:=1 to n do
for i:=j+1 to n do
if b[j]>b[i] then
begin
t:=b[j];
b[j]:=b[i];

b[i]:=t;
end;

for i:=1 to n do if b[i]> m then break; {nếu lớn hơn tổng số tiền m thì thoát}

for j:=1 to i do {i là giá trị ở lệnh trên sau khi thoát vòng lặp for}
if b[i-1]=c[j] then {phai tru di 1 don vi moi dung voi gia tri nho hon m}
begin
writeln(f2,c[j]:4
Write(f2,j:3);
End;

close(f1);close(f2);
readln
end.
Tng Trn Hng
16
SKKN - Mt s dng bi tp lp trỡnh Pascal cú d liu kiu tp vn dng kin thc mng
III. KếT LUậN:
Trên đây là một số kinh nghiệm của tôi khi dạy và làm bài tập Pascal dữ liệu kiểu
tệp .Tôi viết kinh nghiêm này nhằm mục đích cùng trao đổi với các thầy cô trong dạy
học lập trình Pascal thế nào cho hiệu quả đồng thời giúp cho học sinh có thể dể hiểu
hơn khi làm bài lập trình thi hoc sinh giỏi tin học . Vì kiến thức và thời gian còn hạn
chế nên còn có nhiều thiếu sót, tôi mong đón nhận sự góp ý của quý Thầy Cô. Tôi xin
chân thành cảm ơn.
Tng Trn Hng
17

×