Đăng ký Đăng nhập
Trang chủ 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ứ...

Tài liệu 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

.DOC
17
715
77

Mô tả:

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(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 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
- Xem thêm -

Tài liệu liên quan

Tài liệu xem nhiều nhất