Transcript end.

Клёсова Н.К.
учитель информатики
МОУ гимназия №56 г.Томска
Май - 2010
Решение задач типа С1.
Согласно СПЕЦИФИКАЦИИ контрольноизмерительных материалов, в задачах типа
С1
проверяется умение прочесть
фрагмент
программы
на
языке
программирования
и
исправить
допущенные ошибки.
Вид деятельности - применение знаний и
умений в новой ситуации.
Задание С1
Требовалось написать программу, которая
определяет, лежит ли точка A(x0,y0) внутри
треугольной области, ограниченной осями
координат и прямой y=2-x. («внутри»
понимается в строгом смысле, т.е. случай,
когда точка лежит на границе области,
недопустим). В результате программа
должна
выводить
соответствующее
текстовое сообщение. Программист сделал в
программе ошибки.
Программа на Паскале:
var x0,y0,y:real;
begin
readln(x0,y0);
if (x0<2) then
begin
if (x0>0) then
begin
y:=2-x0;
if (y0<y) then
writeln (‘точка лежит внутри области’)
else writeln (‘точка не лежит внутри области’)
end
else
writeln(‘точка не лежит внутри области’);
end;
writeln(‘точка не лежит внутри области’)
end.
x0,y0
1
1
x0>0
да
y0<y
0
0
y
нет
y=2-x0
1
x0<2
2
0
2
0
нет
(1,-1)
нет
x
Оформление ответа:
1. При x=1, y=-1 программа выдаст
неверное решение (условию
удовлетворяет, но не лежит внутри
области);
2. Последний оператор writeln(‘не принадлежит’);
не входит ни в один оператор условия,
поэтому, программа будет выдавать
двойной ответ в любом случае, когда x<2.
3. Возможные доработки: добавить
условие y0>0 и конструктивно включить
оператор writeln в условие, либо
записать одно сложное условие.
Первый способ доработки:
var x0,y0,y:real;
begin
readln(x0,y0);
if (x0<2) then
begin
if (x0>0) then
begin
y:=2-x0;
if (y0<y) and (y0>0) then
writeln (‘точка лежит внутри области’)
else writeln (‘точка не лежит внутри области’)
end
else
writeln(‘точка не лежит внутри области’);
end
else
writeln(‘точка не лежит внутри области’);
end.
Второй способ доработки:
var x0,y0,y:real;
begin
readln(x0,y0);
y:=2-x0;
if (x0<2) and (x0>0) and (y0<y) and (y0>0) then
writeln (‘точка лежит внутри области’)
else
writeln (‘точка не лежит внутри области’)
end.
Решение задач типа С2.
Согласно спецификации КИМов задачи С2 направлены на проверку
умения написать короткую (10 – 15 строк) простую программу
(например, обработки массива) на языке программирования или
записать алгоритм на естественном языке.
Основные правила построения программы:
• обязательно определять начальное значение
переменных;
• если в цикле или операторе условия блок состоит более,
чем из одной команды, он заключается в операторные
скобки begin end;
• оператор цикла while выполняется до тех пор, пока
условие истинно, оператор цикла repeat выполняется до тех
пор, пока условие ложно;
• если используются операторы while или repeat, то
необходимо изменять переменную цикла, иначе цикл может
стать бесконечным.
Оформление ответа:
1. Писать четким и понятным почерком;
2. Не отягощать программу лишними
операторами (например, операторами
вывода);
3. Использовать только заданные
переменные и учитывать их тип;
4. Выводить только те значения, которые
требуются по условию задачи (например,
значение элемента массива или его
номер).
Дан целочисленный массив из 30 элементов. Элементы массива могут
принимать произвольные целые значения. Опишите на русском языке
или на одном из языков программирования алгоритм, который находит и
выводит номера двух элементов массива, наименее отличающихся друг
от друга. Исходные данные объявлены так, как показано ниже.
Запрещается использовать переменные, не описанные ниже, но
разрешается не использовать часть из них.
Паскаль
const N=30;
var a: array [1..N] of integer;
i, j, min, min2, s: integer;
begin
for i:=1 to N do readln(a[i]);
...
end.
Естественный язык
Объявляем массив A из 30 элементов. Объявляем
целочисленные переменные i, j, min, min2, s.
В цикле от 1 до 30 вводим элементы массива A с 1го по 30-й.
...
В качестве ответа вам необходимо привести фрагмент программы (или
описание алгоритма на естественном языке), который должен
находиться на месте многоточия.
const N=30;
var a: array [1..N] of integer;
i, j, min, min2, s: integer;
begin
for i:=1 to N do readln(a[i]);
min:=1; min2:=2; s:=abs(a[1]-a[2]);
for j:=1 to n do
for i:=j+1 to n do
if abs(a[j]-a[i])<s then
begin
s:=abs(a[j]-a[i]);
min:=j;
min2:=i;
end;
Write(min, min2);
end.
Решение задач типа С3
В заданиях С3 используется стратегия игры с
полной информацией.
Игра с полной информацией — термин теории
игр, обозначающий логическую игру, в которой
для соперников отсутствует элемент
неопределённости.
Под термином «безошибочная игра» будем
понимать ситуацию, когда игрок не делает ход,
заведомо подставляющий его под проигрыш,
если у него есть возможность сделать другой
ход.
Условие:
*2 в меньшей (если их 2,то в обеих)
+1 в каждую
Выигрыш
Сумма во всех кучах >=23 (не меньше)
Начальное положение
2,3,4
12
11
3,4,5
4,3,4
14
14
4,6,4
17
22
8,6,8
15
5,4,5
5,7,5
5,8,5
17
6,5,6
8,12,8
28 – на
этом ходу
2 игрок
выиграл
10,7,10
27 – на
этом ходу
2 игрок
выиграл
10,8,10
28 – на
этом ходу
2 игрок
выиграл
34 – на этом
ходу 1 игрок
выигрывает
6,10,6
12,10,12
19
II
18
7,5,6
6,8,5
22
I
4,5,6
6,4,5
18
Положение
одинаковое с
6,4,5, поэтому
далее
рассматриваем
только его
I
20
7,6,7
7,12,7
6,8,10
I
26 – на этом
ходу 1 игрок
выигрывает
24– на
этом ходу
2 игрок
выиграл
7,10,6
23 – на этом
ходу 2 игрок
выиграл (23
не меньше
23)
II
Оформление ответа:
1.Выигрывает 2 игрок.
2.Своим первым ходом он должен удвоить
количество камней в меньшей куче
(положение 4,6,4 либо 6,4,5), в
зависимости от хода первого.
Тогда при любом ходе первого игрока у
второго есть выигрышный ход.
1.Ход 5,4,5 он делать не должен, т.к. Этот
ход может привести его к проигрышу.
На что стоит обратить внимание!
1. Недостаточно в ответе только указать
выигрывающего игрока. Ответ нужно
обосновать.
2. Обязательно нужно указать первый ход
выигрывающего игрока.
3. Таблицу или граф не нужно заполнять
всеми возможными ходами (заведомо
неверные ходы нужно отсекать).