Bạn đang lúng túng trong việc biên soạn một tài liệu để giảng dạy phần lý thuyết chuyên đề bồi dưỡng học sinh giỏi tin 11, thì đây chính là tài liệu thực sự bạn cần. Tôi đã tìm hiểu biên soạn và đưa vào giảng dạy hiệu quả phần lý thuyết. Các bài tập thực hành được đưa vào minh họa từ dễ đến khó. Trích đoạn: Bài 5. Kiểu dữ liệu tệp 1. Vai trò của kiểu tệp Dữ liệu kiểu tệp có những đặc điểm sau: + Được lưu trữ lâu dài ở bộ nhớ ngoài (đĩa từ, CD, . . .) và không bị mất khi tắt nguồn điện vào máy + Lượng thông tin lưu trữ trên tệp có thể rất lớn và chỉ phụ thuộc vào dung lượng đĩa. 2. Thao tác với tệp Hai thao tác cơ bản đối với tệp là ghi dữ liệu vào tệp và đọc dữ liệu từ tệp a. Khai báo tệp văn bản : VAR : TEXT; Vd: Var f1, f2 : text; b. Sơ đồ thao tác với tệp: c. Cú pháp: Ví dụ: Một số hàm và thủ tục thông dụng: • Hàm EOF (): trả về giá trị TRUE khi con trỏ tệp đã ở vị trí cuối tệp. • Hàm EOLN(): trả về giá trị TRUE khi con trỏ tệp đã ở vị trí cuối dòng. BÀI TẬP ÁP DỤNG Bài 1. Cho tệp SN.INP gồm các số nguyên, ghi trên nhiều dòng. Đọc dữ liệu từ tệp SN.INP rồi ghi vào tệp SN1.OUT tổng giá trị các phần tử đó. Bước 1. Mở Pascal, tạo tệp số nguyên rồi lưu trên máy với tên tệp là SN.INP Bước 2. Mở màn hình Pascal mới và lập trình. Bước 3. Chạy chương trình. Vì tệp kết quả được lưu trên bộ nhớ ngoài với tên là SN1.OUT, ta sẽ mở xem kết quả bằng cách nhấn File Open (hoặc F3) chọn tên SN1.OUT OK. program Tep1; var f1,f2:text; s,x:integer; begin assign(f1,D:HSG_BTTHSN.INP); reset(f1); assign(f2,D:HSG_BTTHSN1.OUT); rewrite(f2); s:=0; while not eof(f1) do begin read(f1,x); s:=s+x; end; write(f2,Ket qua la: ,s); close(f1); close(f2); end. Bài 2. Cho tệp SN.INP gồm các số nguyên, ghi trên nhiều dòng. Tìm phần tử lớn nhất có trong tệp SN.INP rồi ghi vào tệp SN2.OUT giá trị lớn nhất đó. program Tep2; var f1,f2:text; max,x:integer; begin assign(f1,D:HSG_BTTHSN.INP); reset(f1); assign(f2,D:HSG_BTTHSN2.OUT); rewrite(f2); read(f1,max); while not eof(f1) do begin read(f1,x); if x>max then max:=x end; write(f2,Max la: ,max); close(f1); close(f2); end. Bài 3. Cho tệp SN.INP gồm các số nguyên, ghi trên nhiều dòng. Tìm phần tử lớn nhất có trong tệp SN.INP rồi ghi vào tệp SN3.OUT giá trị lớn nhất và cho biết vị trí đó. program Tep3; var f1,f2:text; max,x,d,vt:integer; begin assign(f1,D:HSG_BTTHSN.INP); reset(f1); assign(f2,D:HSG_BTTHSN3.OUT); rewrite(f2); read(f1,max); d:=1; while not eof(f1) do begin read(f1,x); d:=d+1; if x>max then begin max:=x; vt:=d; end; end; writeln(f2,Max la: ,max); write(f2,Vi tri Max la: ,vt); close(f1); close(f2); end. Bài 4. Cho tệp SN.INP gồm các số nguyên, ghi trên nhiều dòng. Tìm phần tử lớn nhất theo từng dòng trong tệp SN.INP rồi ghi vào tệp SN4.OUT giá trị lớn nhất theo từng dòng tương ứng. program bt21; var f1,f2:text; max,x,d:integer; begin assign(f1,D:HSG_BTTHSN.INP); reset(f1); assign(f2,D:HSG_BTTHSN4.OUT); rewrite(f2); d:=0; while not eof(f1) do begin read(f1,max); while not eoln(f1) do begin read(f1,x); if x>max then max:=x; end; d:=d+1; readln(f1); writeln(f2,Max dong ,d, la: ,max); end; close(f1); close(f2); end. Bài 5. Cho tệp SN.INP gồm các số nguyên, ghi trên nhiều dòng. Tìm phần tử lớn nhất theo từng dòng trong tệp SN.INP rồi ghi vào tệp SN5.OUT giá trị lớn nhất theo từng dòng tương ứng và cho biết vị trí. program Tep5; var f1,f2:text; max,x,d,t,vt:integer; begin assign(f1,D:HSG_BTTHSN.INP); reset(f1); assign(f2,D:HSG_BTTHSN5.OUT); rewrite(f2); d:=0; while not eof(f1) do begin read(f1,max); t:=1; while not eoln(f1) do begin read(f1,x); t:=t+1; if x>max then begin max:=x; vt:=t; end; end; d:=d+1; readln(f1); writeln(f2,Max dong ,d, la: ,max, o vi tri ,vt); end; close(f1); close(f2); end. Bài 6. Cho tệp SN.INP gồm các số nguyên, ghi trên nhiều dòng. Đọc dữ liệu từ tệp SN.INP rồi ghi vào tệp SN6.OUT sao cho các phần tử được sắp xếp tăng dần. program Tep6; var f1,f2:text; A:array1..100 of integer; x,i,j,n,t:integer; begin assign(f1,D:HSG_BTTHSN.INP); reset(f1); assign(f2,D:HSG_BTTHSN6.OUT); rewrite(f2); i:=0; while not eof(f1) do begin read(f1,x); i:=i+1; Ai:=x; end; n:=i; for j:=n downto 2 do for i:=1 to j1 do if Ai > Ai+1 then begin t:=Ai; Ai:=Ai+1; Ai+1:=t; end; writeln(f2,Cac phan tu da duoc sap xep tang dan:); for i:=1 to n do write(f2,Ai, ); close(f1); close(f2); end. Bài 7. Cho tệp SN.INP gồm các số nguyên, ghi trên nhiều dòng. Đọc dữ liệu từ tệp SN.INP rồi ghi vào tệp SN7.OUT sao cho các phần tử được sắp xếp tăng dần theo từng dòng tương ứng. program Tep7; var f1,f2:text; A:array1..100 of integer; x,i,j,n,t,d:integer; begin assign(f1,D:HSG_BTTHSN.INP); reset(f1); assign(f2,D:HSG_BTTHSN7.OUT); rewrite(f2); writeln(f2,Cac phan tu da duoc sap xep tang dan theo tung dong:); d:=0; while not eof(f1) do begin i:=0; while not eoln(f1) do begin read(f1,x); i:=i+1; Ai:=x; end; n:=i; for j:=n downto 2 do for i:=1 to j1 do if Ai > Ai+1 then begin t:=Ai; Ai:=Ai+1; Ai+1:=t; end; d:=d+1; write(f2,Dong ,d,: ); for i:=1 to n do write(f2,Ai, ); writeln(f2); readln(f1); end; close(f1); close(f2); end.
Trang 1Bài 1 CÁC CÂU LỆNH CÓ CẤU TRÚC
If x MOD 2=0 Then Writeln('So vua nhap vao la so chan')
Else Writeln('So vua nhap vao la so le');
Trang 2 <Hằng thứ i>: có thể là một giá trị hằng, các giá trị hằng (phân cách nhau bởi dấu
phẩy) hoặc các đoạn hằng (dùng hai dấu chấm để phân cách giữa giá trị đầu và giá trịcuối)
Giá trị của biểu thức và giá trị của tập hằng i (i=1¸n) phải có cùng kiểu
Khi gặp lệnh CASE, chương trình sẽ kiểm tra:
- Nếu giá trị của <biểu thức> nằm trong tập <hằng i> thì máy sẽ thực hiện <câu lệnh i>
tương ứng
- Ngược lại:
+ Đối với dạng 1: Không làm gì cả
+ Đối với dạng 2: thực hiện lệnh <câu lệnh n+1>
Trang 3Readln;
End
Bài tập 4: Lập trình nhập tháng, năm Tính số ngày của tháng đó.
Hướng dẫn: Ta biết các tháng 1, 3, 5, 7, 8, 10, 12 có 31 ngày, 4, 6, 9, 11 có 30 ngày Riêngtháng 2 của năm nhuận có 29 ngày còn các năm không nhuận thì có 28 ngày
Bài tập 1: Viết chương trình nhập vào từ bàn phím: giờ, phút, giây Cộng thêm một số giây
cũng được nhập từ bàn phím Hãy in ra kết quả sau khi cộng xong
Gợi ý:
- Gọi số giây được cộng thêm là: s Gán giây:=giây+s
- Nếu giây60 thì: phút:=phút + giây DIV 60 và giây:=giây MOD 60
- Nếu phút60 thì: giờ:=giờ + phút DIV 60 và phút:=phút MOD 60
Bài tập 2: Viết chương trình tìm Max, Min của 4 số: a, b, c, d.
Trang 4
FOR <biến đếm>:=<giá trị cuối> DOWNTO <giá trị đầu> DO <Câu lệnh>;
Chú ý: Khi sử dụng câu lệnh lặp FOR cần chú ý các điểm sau:
<Biến đếm> là biến đơn, thường có kiểu nguyên
<Giá trị đầu> và <Giá trị cuối> là các biểu thức cùng kiểu với biến đếm
<Giá trị đầu> bé hơn hoặc bằng < Giá trị cuối>
Nếu <Giá trị đầu> lớn hơn < Giá trị cuối> thì vòng lặp không thực hiện được
vậy có thể sẽ không kiểm soát được biến đếm.
2.2 Vòng lặp không xác định
Repeat
<Dãy câu lệnh>;
Until <Điều kiện>;
While <Điều kiện> Do <Câu lệnh>;
Trang 5Bài tập 1: Viết chương trình tính tổng S = 1+2+ +N.
Trang 6-Bài tập 2: Viết chương trình nhập vào N số nguyên từ bàn phím Hãy tính và in ra màn hình
tổng của các số vừa được nhập vào
Ý tưởng:
Dùng phương pháp cộng dồn Cho vòng lặp FOR chạy từ 1 tới N, ứng với lần lặp thứ
i, ta nhập vào số nguyên X và đồng thời cộng dồn X vào biến S
Bài tập 3: Viết chương trình nhập vào các số nguyên cho đến khi nào gặp số 0 thì kết thúc.
Hãy đếm xem có bao nhiêu số chẵn vừa được nhập vào
Ý tưởng:
Bài toán này không biết chính xác số lần lặp nên ta không thể dùng vòng lặp FOR Vìphải nhập vào số nguyên N trước, sau đó mới kiểm tra xem N=0? Do đó ta nên dùng vònglặp REPEAT
Write('Nhap vao mot so nguyen N= '); Readln(N);
If N MOD 2 = 0 Then dem:=dem+1;
Until N=0;
Trang 7Writeln(’Cac so chan duoc nhap vao la: ’,dem);
Write('Nhap so nguyen N= '); Readln(N);
For i:=1 To N div 2 Do
If N MOD i=0 Then Write(i,’ ’);
- Tìm USCLN: Lấy số lớn trừ số nhỏ cho đến khi a=b thì dừng Lúc đó: USCLN=a
- BSCNN(a,b) = a*b DIV USCLN(a,b)
Trang 8-Bài tập 5: Viết chương trình tìm các số có 3 chữ số abc sao cho: abc = a3 + b3 + c3.
Ý tưởng:
Dùng phương pháp vét cạn Ta biết rằng: a có thể có giá trị từ 19 (vì a là số hàngtrăm), b,c có thể có giá trị từ 09 Ta sẽ dùng 3 vòng lặp FOR lồng nhau để duyệt qua tất cảcác trường hợp của a,b,c
Ứng với mỗi bộ abc, ta sẽ kiểm tra: Nếu 100.a + 10.b + c = a3 + b3 + c3 thì in ra bộ abc
BÀI TẬP CÁC CÂU LỆNH CÓ CẤU TRÚC
Bài tập 1: Viết chương trình nhập vào số tự nhiên N > 0 rồi thông báo lên màn hình số đó
có phải là số nguyên tố hay không
Ý tưởng:
- Ta biết số nguyên tố là số có 2 ước số là 1 và chính nó
- Vậy 1 không phải là số nguyên tố
- Ở chương trình lớp 10, ta biết có thuật toán tìm số nguyên tố như sau: x là số nguyên tốnếu x không chia hết cho các số chạy từ 2 đến phần nguyên căn bậc 2 của x
while (u<=sqrt(x)) and (x mod u <>0) do u:=u+1;
if u> sqrt(x) then write(x,' la so nguyen to')
else write(x,' khong phai la so nguyen to');
end;
readln
end
Trang 9
-Bài tập 2: Viết chương trình giải phương trình bậc hai: ax2 + bx + c = 0, a0.
Gợi ý: Xem sgk Tin 11.
- Tính Delta=b*b-4*a*c
- Biện luận:
Delta<0: Phương trình vô nghiệm
Delta=0: Phương trình có nghiệm kép: x = -b/(2*a)
Delta>0: Phương trình có 2 nghiệm phân biệt: x1,2 = (-bSQRT(Delta))/(2*a).Bài tập 3: Lập trình tính S= 13 + 23 + 33 + … + n3
Bài tập 4: Lập trình tính tổng sau (với x là số thực <=1 nhập từ bàn phím)
writeln(' ',i,' : ','la ki tu ',CHR(i));
if i mod 40 = 0 then readln;
Trang 10ORD(X): Cho giá trị là số thứ tự của kí tự X trong bảng mã ASCII
VD: ORD(’A’) cho giá trị là 65
ORD(’B’) cho giá trị là 66
CHR(n): Cho giá trị là kí tự có số thứ tự n trong bảng mã ASCII
VD: CHR(65) cho giá trị là kí tự ’A’
CHR(66) cho giá trị là kí tự ’B’
***************************************************
BÀI TẬP THỰC HÀNH Bài tập 1: Viết chương trình in ra màn hình các số nguyên từ 1 đến 100 sao cho cứ 10 số thì
For j:=1 To 10 Do Writeln(i,’ x ’,j,’ = ’,i*j);
Bài tập 3: Viết chương trình để tìm lời giải cho bài toán sau:
Trong giỏ vừa thỏ vừa gà,Một trăm cái cẳng bốn ba cái đầu
Hỏi có mấy gà mấy thỏ?
Bài tập 4: Viết chương trình để tìm lời giải cho bài toán sau:
Trăm trâu trăm bó cỏ
Bó lại cho tròn
Trâu đứng ăn năm
Trâu nằm ăn ba
Trâu già ba con ăn một bó
Hỏi có bao nhiêu trâu đứng, trâu nằm, trâu già?
Bài tập 5: Viết chương trình nhập vào một số nguyên dương Hãy thông báo lên màn hình
số đó có bao nhiêu chữ số và tổng các chữ số của số đó
Trang 11n:=n div 10;
d:=d+1;
end;
writeln('So luong chu so: ',d);
writeln('Tong cac chu so: ',t);
readln
end
Bài tập 6: Số hoàn thiện là số tự nhiên có tổng các ước của nó (không kể chính nó) bằngchính nó Viết chương trình kiểm tra xem một số được nhập vào từ bàn phím có phải là sốhoàn thiện hay không? Ví dụ: 6, 28 là các số hoàn thiện
Gợi ý:
- Tính tổng các ước số của N: từ 1 N div 2 lưu vào biến S
- Nếu S=N thì N là số hoàn thiện
Với mảng một chiều ta quan tâm đến :
- Tên mảng một chiều
- Số lượng phần tử trong mảng
- Kiểu dữ liệu của phần tử
- Cách khai báo biến mảng một chiều
- Cách tham chiếu đến từng phần tử của mảng
a> Khai báo mảng một chiều
Trong ngôn ngữ Pascal, mảng một chiều được khai báo bằng hai cách như sau :
Cách 1 : Trực tiếp
Var <Tên biến mảng> : Array[kiểu chỉ số] of <kiểu phần tử> ;
Cách 2 : Gián tiếp
Type <Tên kiểu mảng> = Array [<kiểu chỉ số>] of <kiểu phần tử> ;
Var <Tên mảng> : <tên kiểu mảng> ;
Trong đó :
- Var là từ khóa dùng để khai báo biến, Array là từ khóa để khai báo mảng
- Kiểu chỉ số thường là đoạn số nguyên liên tục có n1 n2, với n1 là chỉ số đầu và n2 làchỉ số cuối
- Kiểu phần tử là kiểu dữ liệu của phần tử mảng
- Để tham chiếu vào phần tử mảng ta viết :
Trang 12Type Mang_nguyen=Array[1 100] of Integer;
Mang_thuc=Array[1 50] of Real;
Var A : Mang_nguyen;
B : Mang_thuc;
Khai báo mảng trực tiếp :
Var A : Array[1 100] of Integer ;
B : Array[1 50] of Real ;
-Bài tập 1 : Tìm phần tử lớn nhất của một dãy số nguyên
- Input : Số nguyên dương N và dãy số A1, A2, … , AN
- Output : Chỉ số và giá trị của số lớn nhất trong dãy
- Ý tưởng :
+ Đặt số A1 là số lớn nhất (max)
+ Cho i lặp từ 2 đến N, nếu A[i] > max thì gán max := A[i] và lưu lại vị trí i
Chương trình như sau :
Writeln('Gia tri lon nhat : ',max) ;
Writeln('chi so ptu lon nhat : ',csmax) ;
Readln ;
End
Bài tập 2 : Sắp xếp dãy số nguyên theo bằng thuật toán tráo đổi
- Input : Số nguyên dương N và dãy số A1, A2, …, AN
- Output : Dãy A được sắp xếp theo thứ tự không giảm
- Ý tưởng :
+ Hoán đổi để đưa số lớn nhất về vị trí cuối cùng
+ Làm tương tự đối với những số còn lại
Trang 13Chương trình như sau :
-Bài tập 3 : Tìm kiếm nhị phân
- Input : Dãy số A1, A2,………, AN đã được sắp xếp tăng dần
- Output : Có hay không chỉ số i mà A[i] = k hoặc thông báo không tìm thấy
- Ý tưởng :
Xem lại thuật toán tìm kiếm nhị phân trong SGK lớp 10
Chương trình như sau :
Trang 14Write('nhap so can tim k : ') ;
If TK then write('Chi so tim thay la : ',giua)
else write(' Khong tim thay ');
Nhập n số thực từ bàn phím vào một mảng, tính trung bình cộng của các số này.
Bài tập 6: In ra màn hình n số hạng của dãy Fibonaci
Trang 151 2 1
Ý tưởng:
Tam giác Pascal được tạo ra theo qui luật sau:
+ Mỗi dòng đều bắt đầu và kết thúc bởi số 1
+ Phần tử thứ j ở dòng k nhận được bằng cách cộng 2 phần tử thứ j-1 và j ở dòng thứk-1
- Tên mảng hai chiều
- Số lượng phần tử của mỗi chiều
- Kiểu dữ liệu của phần tử
- Cách khai báo biến mảng hai chiều
- Cách tham chiếu đến từng phần tử của mảng
Khai báo mảng hai chiều
Trong ngôn ngữ Pascal, mảng hai chiều được khai báo bằng hai cách như sau :
Trang 16Cách 2 : Gián tiếp
Type <Tên kiểu mảng> = Array [kiểu chỉ số hàng, Kiểu chỉ số cột] of <kiểu phần tử> ;Var <Tên biến mảng> : <tên kiểu mảng> ;
Type Mang1 = Array[1 30, 1 50] of Integer;
Mang2 = Array[1 3, 0 2] of Real;
* Chú ý: Mảng hai chiều còn gọi là ma trận Trong ví dụ trên, B là ma trận cấp 3 × 3 Trong
mảng hai chiều, để truy cập đến phần tử hàng thứ i, cột thứ j của mảng hai chiều B ta dùng cách viết: [ i , j ]
Trang 17Var A: Array[1 30, 1 30] of Real;
Writeln( ‘ Tong cot ‘ , j ,’ = ‘ , sum : 0 : 5 );
Trang 18Type Mang = ARRAY[1 10,1 10] Of Integer;
Var A,B:Mang;
m,n,i,j:Integer;
Begin
Write('Nhap so dong m='); Readln(m);
Write('Nhap so cot n='); Readln(n);
writeln('Nhap ma tran A:');
Write('Nhap so dong m='); Readln(m);
Write('Nhap so cot n='); Readln(n);
Trang 19Writeln('So lan xuat hien cua x trong mang la: ',dem);
{Tinh tong cac ptu lon nhat cua moi dong}
-Bài 4 XÂU KÝ TỰ (STRING)
I KHAI BÁO KIỂU STRING
VAR <Tên biến > : STRING[Max];
Trong đó Max là số ký tự tối đa có thể chứa trong chuỗi (Max [0,255]) Nếu không cókhai báo [Max] thì số ký tự mặ mặc định trong chuỗi là 255
Trang 20II TRUY XUẤT DỮ LIỆU KIỂU STRING
- Có thể sử dụng các thủ tục xuất nhập Write, Writeln, Readln để truy xuất các biếnkiểu String
- Để truy xuất đến ký tự thứ i của xâu ký tự, ta sử dụng cú pháp sau: <Tênbiến>[i] III CÁC PHÉP TOÁN TRÊN XÂU KÝ TỰ
Chèn xâu S1 vào xâu S2 bắt đầu tại vị trí vt
4.6 Hàm ORD(X): Cho giá trị là số thứ tự của kí tự X trong bảng mã ASCII
VD: ORD(’A’) cho giá trị là 65
ORD(’B’) cho giá trị là 66
4.7 Hàm CHR(n): Cho giá trị là kí tự có số thứ tự n trong bảng mã ASCII
VD: CHR(65) cho giá trị là kí tự ’A’
For i:=1 to length(S) do S[i]:=Upcase(S[i]);
Write(‘Xau ket qua: ‘, S);
Trang 21Write(‘Nhap xau S: ‘); Readln(S);
For i:=1 to length(S) do
If S[i] IN [‘A’ ’Z’] Then S[i]:=CHR(ORD(S[i])+32);
Write(‘Xau ket qua: ‘, S);
Write(‘Nhap xau St: ‘); Readln(St);
For i:=1 to length(St) do
-Bài tập 4: Viết chương trình nhập vào một xâu ký tự từ bàn phím Thông báo lên màn hình
số lần xuất hiện của mỗi chữ cái tiếng Anh trong xâu S ( Không phân biệt chữ hoa hay chữthường)
Write('Nhap xau S: '); Readln(S);
{Khoi tao mang}
For ch:='A' To 'Z' Do dem[ch]:=0;
{Duyet xau}
For i:=1 To Length(S) Do
If Upcase(S[i]) IN ['A' 'Z'] Then Inc(dem[Upcase(S[i])]); {Liet ke cac ki tu ra man hinh}
Trang 22-Bài tập 5: Viết chương trình tìm các vị trí xuất hiện chuổi S1 trong chuổi S ?
Dữ liệu vào: Chuổi s và chuổi s1.
Kết quả ra: Các vị trí tìm thấy s1 trong s.
Nhập vào một chuỗi sau đó xuất ra các từ dài nhất trong chuỗi
Dữ liệu vào: một chuỗi
Kết quả ra: các từ dài nhất trong chuỗi
Ví dụ:
bggggGiải
{In ra cac tu dai nhat trong xau}
while s[length(s)]=#32 do delete(s,length(s),1);
while pos(#32#32,s)>0 do delete(s,pos(#32#32,s),1);
j:=1;
Trang 23for i:=1 to length(s) do
if length(a[i])>max then max:=length(a[i]);
writeln('cac tu dai nhat co ',max,' ky tu:');
while s[length(s)]=' ' do delete(s,length(s),1);
while pos(' ',s)>0 do delete(s,pos(' ',s),1);
if length(a[i])>max then max:=length(a[i]);
writeln('cac tu dai nhat co ',max,' ky tu:');
-Bài tập 7 : Viết chương trình nhập vào một dòng văn bản, hiệu chỉnh văn bản theo những
yêu cầu sau đây và in văn bản sau khi hiệu chỉnh ra màn hình:
a Xóa tất cả các ký tự trắng thừa (mỗi từ cách nhau đúng một dấu cách)
b Đầu câu, cuối câu không có kí tự trắng
c Đầu câu in hoa
-Bài 8: Viết chương trình nhập vào từ bàn phím một xâu kí tự và in ra màn hình xâu kí tự
ngược tương ứng Ví dụ: nhập ‘TRUNG TAM KTTHHN GIO LINH’
‘HNIL OIG NHHTTK MAT GNURT’
****************************
Trang 24Bài 5 kiÓu d÷ liÖu tÖp
1 Vai trò của kiểu tệp
Dữ liệu kiểu tệp có những đặc điểm sau:
+ Được lưu trữ lâu dài ở bộ nhớ ngoài (đĩa từ, CD, ) và không bị mất khi tắt nguồn điệnvào máy
+ Lượng thông tin lưu trữ trên tệp có thể rất lớn và chỉ phụ thuộc vào dung lượng đĩa
2 Thao tác với tệp
Hai thao tác cơ bản đối với tệp là ghi dữ liệu vào tệp và đọc dữ liệu từ tệp
a Khai báo tệp văn bản :
VAR <Tên biến tệp>: TEXT;
Vd: Var f1, f2 : text;
b Sơ đồ thao tác với tệp:
Trang 25c Cú pháp:
Ví dụ:
Trang 26 Một số hàm và thủ tục thông dụng:
• Hàm EOF (<biến tệp>): trả về giá trị TRUE khi con trỏ tệp đã ở vị trí cuối tệp.
• Hàm EOLN(<biến tệp>): trả về giá trị TRUE khi con trỏ tệp đã ở vị trí cuối dòng.
-BÀI TẬP ÁP DỤNG
Bài 1 Cho tệp SN.INP gồm các số nguyên, ghi trên nhiều dòng Đọc dữ liệu từ tệp SN.INP rồi ghi vào tệp SN1.OUT tổng giá trị các phần tử đó
Bước 1 Mở Pascal, tạo tệp số nguyên rồi lưu trên máy với tên tệp là SN.INP
Bước 2 Mở màn hình Pascal mới và lập trình
Bước 3 Chạy chương trình
Vì tệp kết quả được lưu trên bộ nhớ ngoài với tên là SN1.OUT, ta sẽ mở xem kết quả bằng cách nhấn File Open (hoặc F3) chọn tên SN1.OUT OK
Trang 28writeln(f2,'Max la: ',max);
write(f2,'Vi tri Max la: ',vt);
Trang 29writeln(f2,'Cac phan tu da duoc sap xep tang dan:');
for i:=1 to n do write(f2,A[i],' ');
close(f1);
close(f2);
end
Trang 30
-Bài 7 Cho tệp SN.INP gồm các số nguyên, ghi trên nhiều dòng Đọc dữ liệu từ tệp SN.INPrồi ghi vào tệp SN7.OUT sao cho các phần tử được sắp xếp tăng dần theo từng dòng tươngứng.
Trang 31-Bài 10 Cho số nguyên dương N, ta tạo số nguyên dương N1 bằng cách viết liên tiếp nhau từ
1 đến N Ví dụ N=4, ta có N1=1234 Thực hiện việc thu gọn N1 bằng cách xóa tất cả cácchữ số ở vị trí lẻ, sau đó xóa tất cả các chữ số ở vị trí chẵn, sau đó xóa tất cả các chữ số ở vịtrí lẻ … cho đến khi chỉ còn lại một chữ số Ví dụ:
N1=1234 (ban đầu)
N1=24 (lần xóa 1)
N1=2 (lần xóa 2)
Yêu cầu: Cho số nguyên N (1<=N<=1000)
Hãy xác định chữ số nhận được sau quá trình thu gọn chữ số N1 tương ứng
Dữ liệu vào: File văn bản VB10.INP gồm 1 dòng chứa số nguyên N
Kết quả ra: File văn bản VB10.OUT chứa chữ số tìm được ứng với số N
Trang 32Viết chương trình chuyển các kí tự đầu tiên của mỗi từ thành
for i:=1 to length(s) do
if s[i]=' ' then s[i+1]:=upcase(s[i+1]);
-Bài 12 Xâu giao S của 2 xâu S1 và S2 là xâu chứa các kí tự
có trong xâu S1, đồng thời cũng có trong xâu S2
Cho 2 xâu S1 và S2 gồm các kí tự 'a' 'z','0' '9'(chiều dàimỗi xâu <= 255) Yêu cầu: tìm xâu giao S của 2 xâu S1 và S2
Dữ liệu vào: tệp DL1.INP gồm 2 dòng:
Trang 33for i:=1 to length(s1) do
if pos(s1[i],s2)<>0 then s:=s+s1[i];
b:='';
for i:=1 to length(s) do
if pos(s[i],b)=0 then b:=b+s[i];
-Bài 13 Cho một số nguyên dương N có M chữ số cuối
Yêu cầu: Hãy tính tổng M các số tận cùng của N
end