- Учителю
- Олимпиада по информатике. Школьный тур.
Олимпиада по информатике. Школьный тур.
Олимпиада по информатике 8-11 класс
(школьный тур)
2015 год
Напишите программу на любом языке программирования
в задачах 1-5, используя компьютер
Задача 1. Если введенное с клавиатуры число меньше 0, вывести на экран «Отрицательное!». Если число больше или равно нулю и меньше или равно 10, то вывести «Норма!». От 11 до 100 вывести «Много!». Если число равно 1000, вывести на экран «Мега!», во всех остальных случаях - «Супер!»
Задача 2. Определите какому координатному углу (квадранту) принадлежит точка с координатами (X,Y)
Задача 3. Составить программу вычисления максимального и минимального из 3 различных чисел, введенных с клавиатуры
Задача 4. Определить количество счастливых трамвайных билетов. Билет считается счастливым, если сумма первых двух цифр, равна сумме последних. Пример: 1542 (1+5=4+2) Номер билета считать четырехзначным от 0001 до 9999
Задача 5 Определить сумму цифр натурального числа, вводимого с клавиатуры
Дайте письменный, подробный ответ в задачах 6-9
Задача 6 Последовательность чисел Люка задается рекуррентным соотношением:
F(1) = 2
F(2) = 1
F(n) = F(n-2) + F(n-1), при n >2, где n - натуральное число.
Чему равно десятое число в последовательности Люка?
В ответе запишите только натуральное число.
Задача 7 Определите, что будет напечатано в результате работы следующего фрагмента программы:
var k, s: integer;
begin
s:=1;
k:=0;
while k < 13 do begin
s:=s+2*k;
k:=k+4;
end;
write(s+k);
end.
Задача 8 В программе описан одномерный целочисленный массив с индексами от 0 до 10 и целочисленная переменная i. В приведенном ниже фрагменте программы массив сначала заполняется, а потом изменяется:
for i:=0 to 10 do A[i]:=i;
for i:=0 to 9 do begin
A[i]:=A[i+1];
end;
Чему будут равны элементы этого массива?
1) 10 0 1 2 3 4 5 6 7 8 9
2) 1 2 3 4 5 6 7 8 9 10 10
3) 0 0 1 2 3 4 5 6 7 8 9
4) 1 2 3 4 5 6 7 8 9 10 0
Задача 9 Требовалось написать программу, которая решает неравенство
(x - а) / (bx) > 0 относительно x для любых ненулевых чисел а и b , введенных с клавиатуры. Все числа считаются действительными. Программист торопился и написал программу неправильно.
Паскаль
Бейсик
Си
var a,b,x: real;
begin
readln(a,b,x);
if b>0 then
write ('x > ',a,' или x < 0')
else
if a > 0 then
write ('0 < x <', a)
else
write (a, '< x < 0 ');
end.
INPUT a, b, x
IF b > 0 THEN
PRINT "x > ",a," или x<0"
ELSE
IF a > 0 THEN
PRINT "0 < x < ",a
ELSE
PRINT a," < x < 0"
ENDIF
ENDIF
END
void main(void)
{ float a,b,x;
scanf("%f%f%f", &a,&b,&x);
if (b > 0)
printf("x > %f или x < 0 ", a);
else
if (a>0)
printf("0 < x < %f",a);
else
printf("%f < x < 0",a);
}
Последовательно выполните три задания:
1) Приведите пример таких чисел а, b, х, при которых программа неверно решает поставленную задачу.
2) Укажите, какая часть программы является лишней.
3) Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы).
Победителем и призером, признается тот, кто решил наибольшее
количество задач от 2 и больше, если 0 или 1 - то просто участник.
Ответы на задачи 6-9
Задача 6 Последовательность чисел Люка задается рекуррентным соотношением:
F(1) = 2
F(2) = 1
F(n) = F(n-2) + F(n-1), при n >2, где n - натуральное число.
Чему равно десятое число в последовательности Люка?
В ответе запишите только натуральное число.
Пояснение.
Последовательно находим:
F(3) = F(1) + F(2) = 3,
F(4) = F(2) + F(3) = 4,
F(5) = F(3) + F(4) = 7,
F(6) = F(4) + F(5) = 11,
F(7) = F(5) + F(6) = 18,
F(8) = F(6) + F(7) = 29,
F(9) = F(7) + F(8) = 47,
F(10) = F(8) + F(9) = 76.
Десятое число в последовательности Люка равно 76.
Задача 7 Определите, что будет напечатано в результате работы следующего фрагмента программы:
var k, s: integer;
begin
s:=1;
k:=0;
while k < 13 do begin
s:=s+2*k;
k:=k+4;
end;
write(s+k);
end.
Пояснение.
Цикл while выполняется до тех пор, пока истинно условие k < 13, т. е. переменная k определяет, сколько раз выполнится цикл.
Так как числа небольшие, можно аккуратно выписать все s и k:
s 1 1 9 25 49
k 0 4 8 12 16
(Помните, что условие k < 13 проверяется сразу после k:=k+4, следовательно, действие s:=s+2*k для k=16 выполняться не будет)
Следовательно, ответ 49+16=65.
Задача 8 В программе описан одномерный целочисленный массив с индексами от 0 до 10 и целочисленная переменная i. В приведенном ниже фрагменте программы массив сначала заполняется, а потом изменяется:
for i:=0 to 10 do A[i]:=i;
for i:=0 to 9 do begin
A[i]:=A[i+1];
end;
Чему будут равны элементы этого массива?
1) 10 0 1 2 3 4 5 6 7 8 9
2) 1 2 3 4 5 6 7 8 9 10 10
3) 0 0 1 2 3 4 5 6 7 8 9
4) 1 2 3 4 5 6 7 8 9 10 0
Пояснение.
Идем по программе:
от 0 до 10 выполняем A[i]:=i, т. е. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
от 0 до 9 выполняем A[i]:=A[i+1], т. е. значения ячеек смещаются влево на одну ячейку, кроме последней, так что 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10.
Правильный ответ указан под номером 2.
Задача 9 Требовалось написать программу, которая решает неравенство
(x - а) / (bx) > 0 относительно x для любых ненулевых чисел а и b , введенных с клавиатуры. Все числа считаются действительными. Программист торопился и написал программу неправильно.
Паскаль
Бейсик
Си
var a,b,x: real;
begin
readln(a,b,x);
if b>0 then
write ('x > ',a,' или x < 0')
else
if a > 0 then
write ('0 < x <', a)
else
write (a, '< x < 0 ');
end.
INPUT a, b, x
IF b > 0 THEN
PRINT "x > ",a," или x<0"
ELSE
IF a > 0 THEN
PRINT "0 < x < ",a
ELSE
PRINT a," < x < 0"
ENDIF
ENDIF
END
void main(void)
{ float a,b,x;
scanf("%f%f%f", &a,&b,&x);
if (b > 0)
printf("x > %f или x < 0 ", a);
else
if (a>0)
printf("0 < x < %f",a);
else
printf("%f < x < 0",a);
}
Последовательно выполните три задания:
1) Приведите пример таких чисел а, b, х, при которых программа неверно решает поставленную задачу.
2) Укажите, какая часть программы является лишней.
3) Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы).
Пояснение.
1) a = −11, b = 1, x = 0.
Значение x может быть не указано. Значение а может быть любым отрицательным числом, зна¬чение b - любым положительным. Также допустим ответ, что программа работает неправильно при любых положительных b и отрицательных а.
2) Лишняя часть:
не нужно вводить х с клавиатуры; верно: readln(a, b).
3) Возможная доработка:
readln(а, b);
if b > 0 then
if а > 0 then
write('х >', а, 'или х < 0')
else
write('х < ' а, 'или х > 0')
else
if а > 0 then
write('0 < х <', а)
else
write(а,' < х < 0');
(могут быть и другие способы доработки).