Sáng kiến 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
Bạn đang xem tài liệu "Sáng kiến 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", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.
File đính kèm:
- sang_kien_kinh_nghiem_mot_so_dang_bai_tap_lap_trinh_pascal_c.doc
Nội dung text: Sáng kiến 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
- 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, chưa 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 nhưng 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. 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 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ạ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: 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 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); 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); 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 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. 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 4 3 6 7 8 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 *Lưu ý: 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. 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 -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 đó lưu 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à lưu 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 chưa nếu chưa 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à lưu 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 nhưng 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 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 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ở 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; { chưa nếu chưa 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ử While Not EOF(F1) Do n:=0; Begin While Not EOF(F1) Do Readln(F1, n); Begin For i:=1 to n do read(f1,a[i]) n:=n+1; End; read(f1,a[i]) End; 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 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 8 7 5 6 7 2 2 5 Giải: Hướng dẫn: -Thường khi đọc đề ta thấy dài nhưng 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: 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} Tống Trần Hướng 7