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
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Ữ LIỆU KIỂU TỆP
1, Khái niệm:
Khi giải các bài toán cần sử dụng nhiều lần về sau thì ta phải tổ chức dữ liệu lưu trữ
trên đĩa (dữ liệu kiểu tệp).
Các số liệu được gõ vào lưu trên một tệp như văn bản.Kết quả cũng được lưu trên một
tệp văn bản khác .Khi kết thúc chương trình hoặc tắt máy thì dữ liệu kiểu tệp vẫn tồn
Tống Trần Hướng
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);
Tống Trần Hướng
2
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
Reset(FileVar);
Sau lệnh Reset, nếu tệp không rỗng thì cửa sổ tệp bao giờ cũng trỏ vào phần tử đầu
tiên của tệp và chương trình sẽ sao chép phần tử của tệp được trỏ sang biến đệm cửa
sổ. Nếu ta mở một tệp chưa tồn tại trên đĩa thì sẽ có lỗi.
Để đọc dữ liệu từ tệp, ta dùng thủ tục READ dạng sau:
Read(FileVar, Var1, Var2,..., VarN);
Trong đó: Var1, Var2,..., VarN là các biến có cùng kiểu thành phần của FileVar.
Gặp lệnh này máy sẽ đọc các giá trị tại vị trí cửa sổ đang trỏ (nếu có) gán sang biến
tương ứng cùng kiểu. Sau đó, cửa sổ dịch chuyển sang vị trí tiếp theo và đọc giá trị
cho biến khác, cứ thế đọc cho đến biến VarN. READ chỉ có thể đọc giá trị của tệp để
gán giá trị cho các biến.
Việc đọc một phần tử của tệp cần thỏa mãn điều kiện: phần tử đó không phải là phần
tử cuối tệp tức là EOF. Do đó, trước khi muốn đọc tệp và gán cho biến X, cần phải
thử xem tệp đó đã kết thúc chưa bằng câu lệnh:
While Not EOF(FileVar) Do {lệnh này thường được sử dụng trước khi đọc và gán
dữ liệu từ một tệp}
Begin
Read(FileVar, X);
Xử lý biến x nếu cần;
...
End;
Thực hiện xong thao tác đọc hay ghi tệp ta phải đóng tệp với thủ tục 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
Mảng (Array) là một kiểu dữ liệu có cấu trúc bao gồm một số cố định các thành
phần có cùng kiểu, có cùng một tên chung. Các phần tử của mảng được truy xuất
thông qua các chỉ số.
Công dụng của mảng là dùng để lưu trữ một dãy số liệu có cùng một tính chất nào
đó. Ví dụ: các điểm kiểm tra một môn học nào đó của một học sinh, các giá trị của
một dãy nhiều số được nhập từ bàn phím
Bài 1:: cho d·y sè gåm N sè tù nhiªn a1, a2,a3,....aN .Viết chương trình in ra tổng của
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è a1, a2,a3,....aN c¸c sè c¸ch nhau Ýt nhÊt mét kÝ tù trèng.
Tống Trần Hướng
3
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
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
5
Tong la: 28
43678
Hướng dẫn:
-Hiểu ý nghĩa của tệp DULIEU.INP
Dòng 1 5 {được hiểu là dòng dưới có 5 số}
Dòng 2: 4 3 6 7 8 {các số cách nhau một dấu 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ố vào
biến .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ở tệp f1 để lấy dữ liệu}
Assign(F2,’KETQUA.OUT’); Rewrite(F2); {tạo tệp f2 để ghi kết qủa }
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];
Tống Trần Hướng
4
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
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 }
Readln;
End.
Bước 3: Ấn ctrl+f9 để chạy chương tr×nh
Bước 4: mở tệp KETQUA.OUT để xem kết quả tổng.Trong tệp kÕt qña
KETQUA.OUT sÏ cã kết 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ö
Bài 2:: cho d·y sè gåm N sè tù nhiªn a1, a2,a3,....aN .Viết chương trình in ra tổng của
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è a1, a2,a3,....aN 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
Tong la: 28
43678
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ở tệp f1 để lấy dữ liệu}
Assign(F2,’KETQUA.OUT’); Rewrite(F2); {tạo tệp f2 để ghi kết qủa }
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ö
Tống Trần Hướng
5
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
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µ ai .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è a1, a2,a3,....aN 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
7
875672
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:
Tống Trần Hướng
6
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
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:chất lượng
Mét xưởng 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è a1, a2,a3,....aN 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
4
231345234
3456
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:
Tống Trần Hướng
7
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
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[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.
Tống Trần Hướng
9
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
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
3 4
12 1 3
21 2 2
51 3 4
GIAOHUU.OUT
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;
Tống Trần Hướng
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(NM200);
- 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
21355
31253
41553
2 1
4 5
Tống Trần Hướng
11
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
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µ Xi 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è X1 ,X2 ,X3 ...... XM
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
20 6
XANG.OUT
5
Tống Trần Hướng
12
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
783242
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 :
a1= b1 =7 ; a2= b2 =8 ; a3= b3 =2 ; a4= b4 =2 ; a5= b5 =4 ; a6= b6 =2 ;
+ S¾p xÕp m¶ng t¨ng : a1 =2 ;a2 =2 ;a3 =3; a4 =4 ;a5 =7 ;a6 =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
Tống Trần Hướng
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à qi, ai. 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- 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
26 4
24
7 15
2
9 15
13 16
8 13
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 :
b1 = 7 + 15=22 ; b2 =9+ 15=24; b3 =13 + 16=29; b4 =8 + 13=21
+G¸n vµo m¶ng b m¶ng c :
b1 = c1= 22 ; b2 = c2=24 ; b3 = c3= 29 ; b4 = c4=21 ;
+S¾p xÕp m¶ng b t¨ng dÇn: b1 =21; b2 =22; b3 =24; b4 =29
+So s¸nh c¸c phÇn tö cña m¶ng b víi 26 ta cã b3 =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 b3 =24 víi c¸c phÇn tö cña
m¶ng c ®Ó t×m chØ sè ban ®Çu lµ 2 (b3 =24= c2 )
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];
Tống Trần Hướng
15
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
end;
b[i]:=S; {mang 1 chieu b lµ tæng cña c¸c hµng}
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.
Tống Trần Hướng
16
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
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.
Tống Trần Hướng
17