Sở giáo dục và đào tạo Kỳ thi chọn hSG lớp 11 quảng bình Năm học 2005-2006 Thời gian: 180 phút, không kề thời gian giao đề Đề ra Sử dụng ngôn ngữ lập trình Turbo Pascal để lập trình giải
Trang 1Sở giáo dục và đào tạo Kỳ thi chọn hSG lớp 11
quảng bình Năm học 2005-2006
Thời gian: 180 phút, không kề thời gian giao đề
Đề ra
Sử dụng ngôn ngữ lập trình Turbo Pascal để lập trình giải các bài toán sau:
Câu 1: (2.5 điểm) Đếm số từ có trong xâu-WORD.PAS
Ta định nghĩa: Từ là một nhóm ký tự bất kỳ mà trong đó không chứa dấu cách Ví dụ ‘thch’ là một từ.
Cho một xâu S gồm N ký tự đợc lấy từ tập ký tự ‘a’ ’z’ và ‘ ’ (dấu cách), (1<=N<=255)
Yêu cầu: Đếm số lợng từ có trong xâu và in ra file mỗi từ trên một dòng.
Dữ liệu vào: Cho trong file WORD.INP có cấu trúc nh sau:
-Dòng 1: Ghi xâu S.
Dữ liệu ra: Ghi ra file WORD.OUT theo cấu trúc nh sau:
-Dòng 1: Ghi số K là số lợng từ đếm đợc có trong xâu.
-K dòng tiếp theo, mỗi dòng ghi một từ.
Ví dụ:
bien hoc khong bo 4
bien hoc khong bo
Câu 2: (3.5 điểm) Dãy con DAYCON.PAS –
Cho hai dãy số thực a1, a2, ,an (1) và b1, b2, ,bm (2) Dãy (1) đợc gọi là dãy con của dãy (2) nếu bỏ đi k (k>=0) phần tử trong dãy (2) thì ta đợc dãy (1) Chằng hạn: dãy 1, 3, 5 là dãy con của dãy 0,1, 2, 1, 4, 3, 5, 7.
Yêu cầu: Với hai dãy số cho trớc, hãy xác định xem dãy (1) có phải là dãy con của
dãy (2) hãy không.
Dữ liệu vào: Cho trong file DAYCON.INP có cấu trúc nh sau:
-Dòng 1: Ghi số N là số lợng phần tử của dãy (1) (1<=N<=1000)
-Dòng 2: Ghi N số a1 a2 an, các số ghi cách nhau một dấu cách.
-Dòng 3: Ghi số M là số lợng phần tử của dãy (2) (1<=M<=1000)
Trang 2-Dòng 4: Ghi M số b1 b2 bm, các số ghi cách nhau một dấu cách.
Dữ liệu ra: Ghi ra file DAYCON.OUT theo cấu trúc nh sau:
-Dòng 1: Ghi ký tự ‘Y’ nếu dãy (1) là dãy con của dãy (2), ngợc lại ghi ký tự ‘N’
Ví dụ:
1 3 5
8
0 1 2 1 4 3 5 7
Câu 3: (4 điểm) Đếm các hình vuông nhìn thấy đợc từ gốc tọa độ
SQUARES.PAS
Trong mặt phẳng tọa độ cho N hình vuông có các cạnh song song với các trục tọa độ Các hình vuông đợc đánh số từ 1 đến N Các đỉnh của các hình vuông
đều có tọa độ nguyên và không có hai hình vuông nào có điểm chung.
Một hình vuông đợc gọi là nhìn thấy đợc từ gốc tọa độ O=(0,0), nếu tìm đợc hai điểm A, B trên một số các cạnh của hình vuông sao cho phần trong của tam giác OAB không có điểm chung với bất kỳ hình vuông nào trong các hình vuông còn lại.
Yêu cầu: Tìm số lợng hình vuông nhìn thấy đợc từ gốc tọa độ.
Dữ liệu vào: Cho trong file SQUARES.INP có cấu trúc nh sau:
-Dòng 1: Ghi số nguyên N (1<=N<=1000), là số lợng hình vuông
-Trong N dòng tiếp theo: dòng thứ i ghi 3 số nguyên Xi Yi Li, trong đó (Xi , Yi) là tọa độ của đỉnh ở góc dới bên trái của hình vuông thứ i, Li là độ dài cạnh của hình vuông thứ i Các số ghi cách nhau một dấu cách (1<= Xi Yi Li <=1000)
Dữ liệu ra: Ghi ra file SQUARES.OUT theo cấu trúc nh sau:
-Dòng 1: Ghi số M, là số lợng hình vuông nhìn thấy đợc từ gốc tọa độ.
-Dòng 2: Ghi M số, là số hiệu của các hình vuông nhìn thấy đợc từ gốc tọa độ Các
số ghi cách nhau một dấu cách.
Ví dụ:
SQUARES.INP SQUARES.OUT SQUARES.INP SQUARES.OUT
3 7 1 Hớng dẫn chấm thi học sinh giỏi toàn tỉnh
lớp 11 năm học 2005-2006
Trang 3I/ Ph ơng pháp chung
- Giám khảo tạo các bộ dữ liệu vào, tính toán kết quả Thực hiện chơng trình của học sinh và so sánh kết quả.
- Giám khảo có thể sử dụng chơng trình mẫu để tính kết quả của dữ liệu vào: WORD.PAS DAYCON.PAS SQUARES.PAS
- Chơng trình học sinh chạy đúng mỗi bộ test, giám khảo cho 0.5 điểm Nh vậy, nếu câu hỏi có 3 điểm thì giám khảo phải tạo đợc 6 bộ test.
- Nếu chơng trình chạy sai test nào thì giám khảo cho 0 điểm đối với test đó
- Giám khảo có thể sử dụng các test gợi ý dới đây nếu cần thiết.
II/ Ch ơng trình mẫu
WORD.PAS
const fi='word.in5';
fo='word.ou5';
var s:string;
f:text;
d:byte;
procedure doc;
begin
assign(f,fi);reset(f);
readln(f,s);
close(f);
end;
procedure xl;
var i:byte;
begin
while s[1]=' ' do delete(s,1,1);
while s[length(s)]=' ' do delete(s,length(s),1);
while pos(' ',s)<>0 do delete(s,pos(' ',s),1);
assign(f,fo);rewrite(f);
if s= '' then d:=0 else d:=1;
for i:=1 to length(s) do if s[i]=' ' then d:=d+1;
writeln(f,d);
for i:=1 to length(s) do
begin
write(f,s[i]);
if s[i]=' ' then writeln(f);
end;
close(f);
end;
begin
doc;
xl;
end.
DAYCON.PAS
const fi='daycon.in6';
fo='daycon.ou6';
type mmcr=array[1 1000] of real;
var f:text;
a,b:mmcr;
n,m:word;
procedure doc;
var i:word;
Trang 4assign(f,fi); reset(f);
readln(f,n);
for i:=1 to n do read(f,a[i]);
readln(f);
readln(f,m);
for i:=1 to m do read(f,b[i]);
close(f);
end;
function tim(x:real;var j:word):word;
begin
while (j<=m) and (x<>b[j]) do j:=j+1;
tim:=j;
end;
procedure xl;
var i,j:word; kt:char;
begin
j:=1; kt:='Y';
for i:=1 to n do
begin
if (tim(a[i],j)>m) then kt:='N';
end;
assign(f,fo);rewrite(f);
writeln(f,kt);
close(f);
end;
begin
doc;
xl;
readln;
end.
SQUARES.PAS
{$r+}
program Cac_hinh_chu_nhat_co_the_nhin_thay_tu_goc_toa_do; const fi='squares.in7';
fo='squares.ou7';
type ii=integer; bo=boolean; rr=real;
mmc=array[0 1001] of ii;
mmc1=array[0 1001] of bo;
mmc2=array[0 1001] of rr;
var x1,y1,x2,y2,e:mmc; b:mmc1; g1,g2:mmc2;
n:ii;
f:text;
procedure doc;
var i,j,x,y,l:ii;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
begin
readln(f,x,y,l);
x1[i]:=x; y1[i]:=y+l;
x2[i]:=x+l; y2[i]:=y;
end;
close(f);
end;
Trang 5procedure sort(l,r:integer);
var i,j,x,y:integer;
begin
i:=l;
j:=r;
x:=x1[(l+r) div 2]+ y1[(l+r) div 2];
repeat
while x1[i]+y1[i]<x do i:=i+1;
while x<x1[j]+y1[j] do j:=j-1;
if i<=j then
begin
y:=x1[i]; x1[i]:=x1[j]; x1[j]:=y; y:=y1[i]; y1[i]:=y1[j]; y1[j]:=y; y:=x2[i]; x2[i]:=x2[j]; x2[j]:=y; y:=y2[i]; y2[i]:=y2[j]; y2[j]:=y; y:=e[i]; e[i]:=e[j]; e[j]:=y; i:=i+1; j:=j-1;
end;
until i>j;
if l<j then Sort(l,j);
if i<r then Sort(i,r);
end;
procedure tinhgoc;
var i:ii;
begin
for i:=1 to n do
begin
if x1[i]=0 then g1[i]:=90
else g1[i]:=arctan(y1[i]/x1[i]);
if x2[i]=0 then g2[i]:=90
else g2[i]:=arctan(y2[i]/x2[i]);
end;
end;
procedure quet(x,y:real);
var i:ii;
begin
if x<y then
for i:=1 to n do
if not(b[i]) then
if (g1[i]>x) and (g2[i]<y) then
begin
b[i]:=true;
quet(x,g2[i]);
quet(g1[i],y);
break;
end;
end;
procedure xl;
var i,j,dem:ii;
begin
for i:=1 to n do e[i]:=i;
writeln;
sort(1,n);
tinhgoc;
fillchar(b,sizeof(b),false);
quet(0,pi/2);
dem:=0;
for i:=1 to n do
Trang 6if b[i] then inc(dem);
assign(f,fo);
rewrite(f);
writeln(f,dem);
for i:=1 to n do
if b[i] then write(f,e[i],' ');
close(f);
end;
begin
doc;
xl;
end.
III/ Mét sè test gîi ý.
an qua nho
ke trong cay
ngu dot nhat cua doi nguoi
la doi tra
cong cha nhu nui thai son
4
1 2 3 4
3
1 2 3
N
4
1 2 3 4
4
1 2 3 4
Y
1
1
1
1
Y
1
1
1
4
N
3
1 3 5
5
1 5 3 6 7
N
Trang 7SQUARES.INP SQUARES OUT
2
3 1 1000
1 1 1
2
2 1 1
5
1 2 1
3 1 1
2 4 2
3 7 1
20 20 100
3
1 2 5
Tµi liÖu tham kh¶o:
Ng«n ng÷ lËp tr×nh Pascal-Qu¸ch TuÊn Ngäc
Bµi tËp lËp tr×nh Pascal-KiÒu V¨n Hng