Đề 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: 3,0 điểm Tổng giá trị các phần tử trong một ma trận - SUM.PAS Cho một ma trận A gồm M dòng N cột
Trang 1Sở giáo dục - đào tạo Kỳ thi chọn học Sinh Giỏi lớp 11
SBD: Môn: Tin học - phân ban, THPT
Đề chính thức Thời gian làm bài: 180 phút.
Đề 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: (3,0 điểm) Tổng giá trị các phần tử trong một ma trận - SUM.PAS
Cho một ma trận A gồm M dòng N cột Dòng đợc đánh số từ 1 đến M từ trên xuống dới Cột đợc đánh số từ 1 đến N từ trái qua phải Mỗi phần tử của ma trận
có giá trị nguyên Hãy tính tổng giá trị các phần tử có chỉ số dòng chẵn và chỉ số cột lẽ.
Dữ liệu vào: Cho trong file SUM.INP có cấu trúc nh sau:
- Dòng 1: Ghi hai giá trị M, N là số dòng và số cột của ma trận, các số ghi
cách nhau một dấu cách (2<=M, N<=100).
- M dòng tiếp theo: Mỗi dòng ghi N số nguyên aij, là các giá trị của phần tử trên dòng i, cột j của ma trận, các số ghi cách nhau một dấu cách.
(-1000 <= aij <= 1000)
Dữ liệu ra: Ghi ra file SUM.OUT theo cấu trúc nh sau:
- Dòng 1: Ghi số S, là tổng tìm đợc.
Ví dụ:
4 5
2 4 1 5 7
2 2 8 3 5
1 7 4 8 0
9 6 4 7 3
31
Câu 2: (3,5 điểm) Số nguyên tố cùng nhau - NT.PAS
Tìm tất cả các số tự nhiên X có ba chữ số sao cho khi đảo ngợc trật tự các chữ số của X ta sẽ thu đợc một số nguyên Y mà X và Y là hai số nguyên tố cùng nhau.
Ví dụ: X =122 và Y= 221
Dữ liệu ra: Ghi ra file NT.OUT theo cấu trúc nh sau:
- Dòng 1: Ghi số nguyên dơng N, là số lợng số X tìm đợc.
- Dòng 2: Ghi N số tìm đợc Các số ghi cách nhau một dấu cách.
Trang 2Câu 3 (3,5 điểm) Tìm số sát sau - SOSATSAU.PAS
Cho số tự nhiên A có N chữ số Hãy hoán vị các chữ số trong A để thu đợc
số B thoả mãn đồng thời hai điều kiện sau:
- B lớn hơn A.
- B nhỏ nhất.
Dữ liệu vào: Cho trong file Sosatsau.inp có cấu trúc nh sau:
- Dòng 1: Ghi số N là số lợng chữ số của A (0<N<=1000).
- Dòng 2: Ghi các chữ số của số A, giữa các chữ số không có dấu cách.
Dữ liệu ra: Ghi vào file Sosatsau.out theo cấu trúc:
- Dòng 1: Ghi số B tìm đợc, giữa các chữ số không có dấu cách Nếu không
tìm đợc số B thì ghi chữ số 0.
Ví dụ
Sosatsau.inp Sosatsau.out Sosatsau.inp Sosatsau.out
6
526431
21
0
Hết
Trang 3Hớng dẫn chấm thi học sinh giỏi lớp 11 - phân ban, thpt
năm học 2005-2006 I/ 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: SUM.PAS NT.PAS SOSATSAU.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 Riêng đối với Câu 2: NT.PAS, không có dữ liệu vào, giám khảo chỉ chấm trên một bộ dữ liệu
ra và cho điểm tối đa 3,5 điểm; Nếu chơng trình cha hoàn thành thì có thể chấm giải thuật tuỳ theo bài làm của học sinh.
- 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
Câu 1: (3,0 điểm) Tổng giá trị các phần tử trong một ma trận - SUM.PAS
{$r+}
const fi='Sum.in2'; fo='sum.ou2';
nn=100;mm=100;
type mhci=array[1 mm,1 nn] of integer;
var a:mhci; m,n:byte; s:longint;
procedure doc;
var f:text; i,j:byte;
begin
assign(f,fi);reset(f);
readln(f,m,n);
for i:=1 to m do
begin
for j:=1 to n do read(f,a[i,j]);
readln(f);
end;
close(f);
end;
procedure xl;
var i,j:byte;
begin
s:=0;
for i:=1 to m do
begin
for j:=1 to n do
if (i mod 2=0) and (j mod 2=1) then s:=s+a[i,j];
end;
end;
procedure xuat;
var i,j:byte; f:text;
begin
assign(f,fo); rewrite(f);
writeln(f,s);
close(f);
end;
begin
doc;
xl;
xuat;
Trang 4end
C©u 2: (3,5 ®iÓm) Sè nguyªn tè - NT.PAS
const fo='NT.OUT';
nn=901;
type mmcw=array[0 901] of word;
var n:word; s:mmcw;
function uscln(a,b:word):word;
var r:word;
begin
while b>0 do
begin r:=a mod b; a:=b; b:=r; end; uscln:=a;
end;
function dao(x:word):word;
var y:word;
begin
y:=0;
while x>0 do
begin y:=10*y+(x mod 10); x:=x div 10; end; dao:=y;
end;
function tim:word;
var x,d:word;
begin
d:=0;
for x:=100 to 999 do
if uscln(x,dao(x))=1 then
begin d:=d+1; s[d]:=x; end;
tim:=d;
end;
procedure xuat;
var f:text; i:word;
begin
n:=tim;
assign(f,fo);rewrite(f);
writeln(f,n);
for i:=1 to n do write(f,s[i],' ');
close(f);
end;
begin xuat; end
C©u 3 (3,5 ®iÓm) T×m sè s¸t sau - SOSATSAU.PAS
const
max=1000;
fi='sosatsau.inp';
fo='sosatsau.out';
var
a:array[0 max]of char;
n:integer;
kt:boolean;
Procedure docdl;
var
f:text;
c:char;
i:integer;
begin
Trang 5assign(f,fi);
reset(f);
readln(f,n);
i:=0;
while not eof(f) do
begin
read(f,c);
if(c>='0') and(c<='9') then begin
inc(i); a[i]:=c; end;
end;
close(f);
end;
procedure kiemtra;
var
i,j:integer;
tg:char;
begin
kt:=false;
i:=n-1;
while a[i]>=a[i+1] do
dec(i);
if i<>0 then
begin
j:=n;
while a[j]<=a[i] do
dec(j);
tg:=a[i];
a[i]:=a[j];
a[j]:=tg;
inc(i);
j:=n;
while j>i do
begin
tg:=a[i];
a[i]:=a[j];
a[j]:=tg;
inc(i);
dec(j);
end;
kt:=true;
end;
end;
procedure xuatdl;
var
f:text;
i:integer;
begin
assign(f,fo);
rewrite(f);
if kt then
for i:=1 to n do
write(f,a[i])
else
write(f,'0');
close(f);
Trang 6begin
docdl;
kiemtra;
xuatdl;
end
III/ Mét sè test gîi ý.
5 5
2 4 1 5 7
2 2 8 3 5
1 7 4 8 0
9 6 4 7 3
8 5 3 2 7
31
6 5
2 4 1 5 7
2 2 8 3 5
1 7 4 8 0
9 6 4 7 3
8 5 3 2 7
3 -1 -2 -3 -4
28
4 5
4 5 6 7 2 -1 2 3 9 10
4 3 -20 3 6 -19 13 20 -20 2
15
5
6
1
4
HÕt