Trờng thpt minh khai đề thi chọn hsg lớp 11 năm học 2010-2011
Môn thi: Tin Học 11
Thời gian: 150 Phút
Ngày thi: 25/12/2010
-------------------------------------------------------------------------------------------------------------------
Sử dụng ngôn ngữ lập trình pascal, lập trình giải các bài toán sau đây:
Bài 1: Sắp xếp
Cho số tự nhiên n (n<=100) và dãy số nguyên a1,a2,..,an (bao gồm cả số nguyên âm cả
số nguyên dơng). Hãy đỗi chổ các phần tử của dãy sao cho các phần tử dơng nằm ở đầu dãy,
các phần tử âm nằm ở cuối dãy. In dãy sau khi đã sắp xếp.
Bài 2: Tìm xâu con dài nhất
Nhập vào một xâu bất kỳ từ bàn phím. Hãy cho biết độ dài lớn nhất của xâu con chứa
liên tiếp kí tự a. In ra màn hình xâu con dài nhất vừa tìm đợc?
Ví dụ: Xâu nhập vào: aabcaaade
Độ dài max= 3
Xâu con cần tìm là: aaa
Bi 3: Các thao tác trên mảng 2 chiều
Tạo mảng 2 chiu A cp nxn gm cỏc s nguyờn v mt s nguyờn x. Vit chng
trỡnh thc hin cỏc cụng vic sau:
a/ m s ln xut hin ca x trong A v v trớ ca chỳng.
b/ Tớnh tng cỏc phn t ln nht ca mi dũng.
c./ Sắp xếp lại mảng theo thứ tự tăng dần nh sau:
Trêng thpt minh khai
§¸p ¸n ®Ò thi HSG líp 11 n¨m häc 2010-2011
M«n tin häc 11
Bµi 1(6®)
PROGRAM BAI1;
USES CRT;
VAR tg,i,j,n:integer;
a:array[1..20] of integer;
BEGIN
Clrscr;
write('Nhap n='); Readln(n);
For i:=1 to n do Read(a[i]);
Readln;
i:=1; j:=n;
Repeat
While a[i]>0 do inc(i);
While a[j]<=0 do dec(j);
If i<j then Begin
tg:=a[i];
a[i]:=a[j];
a[j]:=tg;
End;
Until j<=i;
j:=n;
Repeat
While a[i]>=0 do inc(i);
While a[j]<0 do dec(j);
If i<j then begin
tg:=a[i];
a[i]:=a[j];
a[j]:=tg;
End;
Until j<=i;
for i:=1 to n do Write(a[i]:4);
readln
END.
Bµi 2(6®)
PROGRAM BAI2;
USES CRT;
var s:string;
i,max,t,k,d:byte;
begin
clrscr;
Write('nhap xau'); Readln(s);
k:=length(s);
max:=0; t:=0;
for i:=1 to k do
begin
if s[i]='a' then
begin
t:=t+1;
if t>max then
begin
max:=t;
d:=i;
end;
end
else t:=0;
end;
if t>max then max:=t;
for i:=d-max+1 to d do write(s[i]);
readln
end.
Bài 3(10đ)
- Câu a: 2đ
- Câu b: 3đ
- Câu c:3đ
Program bai3;
Uses Crt;
Var A: array[1..10,1..10] of integer;
B :array[1..100]of integer;
tg, k, n,i,j,x,dem,S,max:Integer;
Begin
Write('Nhap n='); Readln(n);
For i:=1 To n do
begin
For j:=1 To n Do read (a[i,j]);
Readln;
end;
{Câu a: Tìm kiếm phần tử x trong mang A}
Write('Nhap x='); Readln(x);
dem:=0;
Writeln('Vi tri cua x trong mang A: ');
For i:=1 To n Do
For j:=1 To n Do
If a[i,j]=x Then
Begin
Writeln(i,j);
dem:=dem+1;
End;
Writeln('So lan xuat hien cua x trong mang A la: ',dem);
{Câu b: Tính tổng các phần tử lớn nhất của mỗi dòng}
S:=0;
For i:=1 To n Do
Begin
Max:=A[i,1];
For j:=2 To n Do
If max<A[i,j] Then max:=A[i,j];
S:=S+max;
End;
Writeln('Tong cac phan tu lon nhat cua moi dong la: ',S);
{C©u c: S¾p xÕp m¶ng}
{chuyÓn m¶ng 2 chiÒu A thµnh m¶ng 1 chiÒu B}
k:=0;
For i:=1 to n do
For j:=1 to n do
If k<n*n then
begin
k:=k+1;
b[k]:=a[i,j];
end;
{S¾p xÕp m¶ng 1 chiÒu B theo thø tù t¨ng dÇn}
For i:=1 to n*n-1 do
For j:=i+1 to n*n do
if b[i]>b[j] then
begin
tg:=b[i];
b[i]:=b[j];
b[j]:=tg;
end;
{ChuyÓn m¶ng 1 chiÒu A thµnh m¶ng 2 chiÒu B}
k:=0;
For j:=1 to n do
begin
If j mod 2 =1 then
Begin
for i:=1 to n do
Begin
k:=k+1;
a[i,j]:=b[k];
End;
End
Else
Begin
for i:=n downto 1 do
Begin
k:=k+1;
a[i,j]:=b[k];
End;
End;
End;
{in m¶ng 2 chiÒu sau khi s¾p xÕp}
Writeln('mang sau khi sap xeo la:');
For i:=1 to n do
Begin
For j:=1 to n do write(a[i,j]);
Writeln;
End;
Readln;
End.