Часть 1
За правильный ответ на каждое задание части 1 ставится 1 балл.
Если указаны два и более ответов (в том числе правильный), неверный ответ или ответ отсутствует — 0 баллов.
Вар. |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
Al |
1 |
4 |
4 |
1 |
3 |
1 |
2 |
3 |
3 |
1 |
А2 |
2 |
2 |
3 |
1 |
2 |
3 |
1 |
4 |
4 |
1 |
АЗ |
1 |
3 |
1 |
3 |
4 |
2 |
3 |
4 |
3 |
4 |
А4 |
1 |
1 |
3 |
4 |
3 |
4 |
2 |
3 |
4 |
2 |
А5 |
4 |
1 |
2 |
4 |
2 |
3 |
4 |
2 |
1 |
3 |
А6 |
2 |
4 |
4 |
3 |
1 |
3 |
2 |
4 |
2 |
3 |
А7 |
3 |
3 |
4 |
2 |
3 |
1 |
4 |
2 |
1 |
4 |
А8 |
3 |
2 |
3 |
1 |
4 |
3 |
3 |
1 |
2 |
3 |
А9 |
4 |
1 |
2 |
3 |
3 |
1 |
3 |
4 |
1 |
2 |
AlO |
1 |
3 |
1 |
3 |
4 |
2 |
3 |
4 |
4 |
4 |
All |
4 |
3 |
2 |
3 |
4 |
3 |
1 |
2 |
1 |
4 |
А12 |
1 |
4 |
3 |
2 |
2 |
2 |
1 |
4 |
1 |
2 |
А13 |
2 |
2 |
4 |
4 |
1 |
3 |
2 |
4 |
2 |
3 |
Часть 2
За правильный ответ на каждое задание части 2 ставится 1 балл, за неверный ответ или его отсутствие — О баллов.
Вар. |
1 |
2 |
3 |
4 |
5 |
Bl |
12112 |
22112 |
12122 |
21112 |
11122 |
В2 |
1 |
12 |
2 |
-8 |
-1 |
ВЗ |
3 |
4 |
4 |
1 |
6 |
В4 |
24 |
96 |
80 |
192 |
40 |
В5 |
263 |
18 |
25 |
22 |
25 |
В6 |
720 |
240 |
21 |
28 |
17 |
В7 |
7 |
5 |
7,14,28 |
2,4,8,16,32 |
6,14,22 |
В8 |
66 |
13 |
14 |
42 |
127 |
В9 |
75 |
46 |
30 |
12 |
36 |
BlO |
1875 |
48 |
32 |
1288 |
400 |
Bll |
ДАГВЖБЕ |
ВГБА |
ВБГА |
FCDA |
EFCA |
В12 |
3421 |
3124 |
8900 |
2200 |
11600 |
В13 |
9 |
11 |
7 |
14 |
7 |
В14 |
2 |
6 |
9 |
-28 |
6 |
В15 |
192 |
68 |
192 |
162 |
64 |
Вар. |
6 |
7 |
8 |
9 |
10 |
Bl |
11211 |
21221 |
22211 |
21121 |
22122 |
В2 |
8 |
-14 |
1 |
1 |
-6 |
ВЗ |
3 |
7 |
5 |
9 |
7 |
В4 |
4 |
62 |
4 |
5 |
351 |
В5 |
1023 |
93 |
512 |
64 |
42 |
В6 |
14 |
15 |
24 |
21 |
25 |
В7 |
7,16,25 |
28 |
30 |
5 |
3 |
В8 |
67 |
78 |
107 |
997 |
555 |
В9 |
13 |
41 |
18 |
16 |
40 |
BlO |
40 |
Б35 |
Б39 |
А4 |
Б37 |
Bll |
CGDA |
CDEA |
GCDA |
EFBA |
BGFC |
В12 |
1500 |
2600 |
16500 |
11000 |
2000 |
В13 |
12 |
48 |
28 |
74 |
32 |
В14 |
30 |
22 |
-32 |
0 |
27 |
В15 |
73 |
16 |
243 |
32 |
21 |
Часть 3
Критерии оценивания заданий
с развёрнутым ответом
Вариант 1
Cl. Требовалось написать программу, при выполнении которой с клавиатуры считывается координата точки на прямой (х — действительное число) и определяется принадлежность этой точки одному из выделенных отрезков BhD(включая границы). Программист торопился и написал программу неправильно.
Паскаль |
Бейсик |
Var х: real; Begin Readln(х) ; If х >= -2 then If х <= 7 then If x < 4 then Write(‘не принадлежит’) else Write (,принадлежит,) end. |
INPUT x IF x >= -2 THEN IF x <= 7 THEN IF x < 4 THEN PRINT «не принадлежит» ELSE PRINT «принадлежит» ENDIF ENDIF END |
Си |
Алгоритмический язык |
Void main(void) { Float x; Scanf(«%f»,&x); If (x >= -2) If (x <= 7) If (x < 4) Printf(«не принадлежит»); else Printf(«принадлежит»); } |
Ал г Нач Вещ х, у Ввод х, у Если х >= -2 То Если х <= 7 то Если х < 4 то Вывод,не принадлежит’Иначе Вывод‘принадлежит’Все Все Все KOH |
Последовательно выполните следующее:
1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих различным областям (А, В, С, D и Е). Границы (точки — 2, 1, 4 и 7) принадлежат заштрихованным областям (BhDсоответственно).
Область |
Условие 1 (х>= -2) |
Условие 2 (х <= 7) _______ |
Условие 3 (х<4) |
Программа выведет |
Область обрабатывается верно |
А |
|||||
В |
|||||
C |
|||||
D |
|||||
E |
В столбцах условий укажите «да», если условие выполнится, «нет», если условие не выполнится, «—» (прочерк), если условие не будет проверяться, «не изв.», если программа ведёт себя по-разному для разных значений, принадлежащих данной области. В столбце «Программа выведет» укажите, что программа выведет на экран. Если программа ничего не выводит, напишите «—» (прочерк). Если для разных значений, принадлежащих области, будут выведены разные тексты, напишите «не изв.». В последнем столбце укажите «Да» или «Нет».
2. Укажите, как нужно доработать программу, чтобы не было случаев её неправильной работы. (Это можно сделать несколькими способами, поэтому укажите любой способ доработки исходной программы.)
Ответ:
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) |
Баллы |
|||||
Элементы ответа: 1. |
||||||
Область |
Условие 1 (χ>=-2) |
Условие 2 (х<=7) |
Условие 3 (х<4) |
Программа выведет |
Область обрабатывается верно |
|
А |
Нет |
— |
— |
— |
Нет |
|
В |
Да |
Да |
Да |
Не принадлежит |
Нет |
|
C |
Да |
Да |
Да |
Не принадлежит |
Да |
|
D |
Да |
Да |
Нет |
Принадлежит |
Да |
|
E |
Да |
Нет |
— |
— |
Нет |
Продолжение табл.
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) |
Баллы |
2. Возможная доработка (Паскаль): If (х >= -2) and (х <= 1) or (х >= 4) and (х <= 7) then Write(‘принадлежит’) Else Write (‘не принадлежит’) Возможны и другие способы доработки. Например: If х >= -2 then If х <= 1 then Wri te(‘принадлежит’) Else If x >= 4 then If x <= 7 then Write (‘принадлежит’) Else Write (‘не принадлежит’) Else Write (‘не принадлежит’) Else Write (‘не принадлежит’) |
|
Указания по оцениванию |
|
Обратите внимание! В задаче требуется выполнить три действия. 1. Заполнить таблицу. 2. Исправить ошибку в условном операторе. 3. Исправить ошибку, связанную с неправильным набором условий. Баллы за данное задание начисляются как сумма баллов за верное выполнение каждого действия. Рассмотрим отдельно каждое действие. 1. Действие по заполнению таблицы считается выполненным, если в таблице нет ошибок или ошибки присутствуют только в одной строке. 2. Неправильное использование условного оператора, в результате чего при невыполнении первого или второго условия программа не выдавала ничего (отсутствуют случаи ELSE). Исправлением этой ошибки может быть либо добавление случая ELSE к каждому условию IF, либо объединение всех условий IF в одно при помощи конъюнкции. |
Продолжение табл.
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) |
Баллы |
В сложных случаях это действие считается выполненным, если программа выдаёет одно из двух сообщений: «принадлежит» или «не принадлежит» — для любых чисел Х, при этом программа не стала работать хуже, чем раньше, т. е. для всех точек, для которых программа ранее выдавала верный ответ, доработанная программа также должна выдавать верный ответ. 3. Приведённых трёх ограничений недостаточно для описания двух областей (потеряно условие Х<= 1). Кроме того, необходимо учесть, что области не соединены. Исправлением этой ошибки может быть разбиение области на две части и использование дизъюнкции либо использование сложной комбинации каскадных условий. В сложных случаях это действие считается выполненным, если верно определены заштрихованные области, т. е. программа выводит сообщение «принадлежит» для всех точек закрашенных областей, и только для них, для точек вне заштрихованных областей программа выводит «не принадлежит» или не выводит ничего. В работе (во фрагментах программ) допускается наличие отдельных синтаксических ошибок, не искажающих замысла автора решения |
|
Выполнены все три действия |
3 |
Правильно выполнены два действия из трёх (исправлены обе ошибки, но в пункте 1 задания не приведена таблица (либо таблица содержит ошибки в двух и более строках), либо приведена таблица (которая содержит ошибки не более чем в одной строке), но исправлена только одна ошибка программы). При написании операций сравнения допускается одно неправильное использование строгих/нестрогих неравенств (считается несущественной ошибкой, погрешностью записи). Например, вместо «х <= 1» используется «х <1» |
2 |
Правильно выполнено только одно действие из трёх, т. е. либо только приведена таблица, которая содержит ошибки не более чем в одной строке, либо таблица не приведена (или приведена и содержит ошибки более |
1 |
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) |
Баллы |
Чем в одной строке), но исправлена одна ошибка программы. При оценивании этого задания на 1 балл допускается не учитывать корректность работы программ на точках границ областей (вместо нестрогих неравенств в решении были использованы строгие неравенства или наоборот) |
|
Все пункты задания выполнены неверно (таблица анализа правильности алгоритма не приведена либо содержит ошибки в двух и более строках, программа не приведена либо ни одна из двух ошибок не исправлена) |
0 |
Максимальный балл |
3 |
С2. Дан целочисленный массив из 28 элементов. Элементы массива могут принимать значения от 0 до 100 — процент выполнения учащимися домашних заданий по информатике. Для получения положительной оценки за год требовалось набрать не менее 40 баллов. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит минимальный балл среди учащихся, получивших за год положительную оценку. Гарантируется, что в классе хотя бы один учащийся получил за год положительную оценку.
Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.
Паскаль |
Бейсик |
Const N = 28; Var a: array [1..N] of integer; I, J, min: integer; Begin For i : = 1 to N do readln(a[i]); End. |
N = 28 DIM A(N) AS INTEGER DIM I, J, MIN AS INTEGER FOR I = 1 TO N INPUT A(I) NEXT I END |
СИ |
Алгоритмический язык |
#include #define N 28 void main(void) { Int a [Ni ; Int i, j, min; For (i = 0; i <.N; i++) scanf("%d", &a[i]); I |
Алг нач ЦелN = 28 Целтаб а[1:N] ЦелI, j, MIN Нц дляI От1 ДоN Ввод а [ i ] Кц KOH |
Русский (естественный) язык |
|
Объявляем массив А из 28 элементов. Объявляем целочисленные переменные I, J, MIN. В цикле от 1 до 28 вводим элементы массива А с 1-го по 28-й. |
В качестве ответа вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например Borland Pascal 7.0) или в виде блок-схемы. В этом случае вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке).
Ответ:
На языке Паскаль |
На языке Бейсик |
Min := 100; For i := 1 to N do if (a[i] >= 40) and a(i] < min) Then min : = a [ i ] ; writein(min); |
MIN = 100 FOR I = 1 TO N IF A(I) >= 40 AND A(I) < MIN THEN MIN = A(I) ENDIF NEXT I PRINT MIN |
На языке СИ |
На алгоритмическом языке |
Min = 100; For (i = 0; i < N; i++) If (a[i] >= 40 && a[i] < min) min = a[i]; Printf(«%d», min); |
MIN := 100 Нц дляI от 1 до N ЕслиA[i] >= 40 и a[i] < MIN то MIN := a[i] Все Кц ВыводMIN |
На естественном языке
Записываем в переменную MIN начальное значение, равное 100. В цикле от первого элемента до двадцать восьмого сравниваем элементы исходного массива с 40. Если текущий элемент больше или равен 40, то сравниваем значение текущего элемента массива со значением переменной MIN. Если текущий элемент массива меньше MIN, то записываем в MIN значение этого элемента массива. Переходим к следующему элементу. После завершения цикла выводим значение переменной MIN.
СЗ. У исполнителя Калькулятор две команды, которым присвоены номера:
1. прибавь 3,
2. умножь на 3.
Первая из них увеличивает число на экране на 3, вторая — утраивает его.
Программа для Калькулятора — это последовательность команд.
Сколько есть программ, которые число 3 преобразуют в число 93?
Ответ обоснуйте.
Решение:
Обозначим R(N) — количество программ, которые преобразуют число 3 в число П. Обозначим T(N)Наибольшее кратное девяти, не превосходящее П.
Заметим, что мы можем получить только числа, кратные 3.
Обе команды исполнителя увеличивают исходное число, поэтому общее количество команд в программе не может превосходить (93 — 3)/3 = 31.
Верны следующие соотношения:
Если П не делится на 9, то тогда R(Ri) = R(T(Jι)),Так как существует единственный способ получения П из T(N) — Прибавлением троек.
Пусть П делится на 9.
Тогда jR(n) = jR(n∕3) + R(N— 3) = R(N∕3) + R(N —9) (если п > 9).
При П= 9 R(Ri) = 2 (два способа: прибавлением двух троек или однократным умножением на 3).
Поэтому достаточно постепенно вычислить значения R(N) Для всех чисел, кратных девяти и не превосходящих 72: сначала вычисляем 7?(3), затем 7?(9), Я(18) и т. д.
Имеем:
7?(3) = 1 = Я(6)
Я(9) = 2 = Я(12) = Я(15)
-R(18) = jR(6) + Я(9) =1 + 2 = 3 = Я(21) = Я(24)
JR(27) = Λ(9) + Я(18) = 2 + 3 = 5 = B(30) = Я(33)
Λ(36) = jR(12) + Я(27) = 2 + 5 = 7 = Я(39) = Я(42)
Я(45) = Я(15) + Я(36) = 2 + 7 = 9 = Я(48) = В(51) jR(54) = Я(18) + Я(4 5) = 3 + 9=12= Я(57) = Я(60) B(63) = — R(21) + Я(54) = 3 + 12 = 15 = jR(66) = В(69)
Я(72) = 2?(24) + Я(63) = 3 + 15 = 18 = Я(75) = Я(78)
□R(81) = Я(27) + Н(72) = 5 + 18 = 23 = Л(84) = В(87)
JR(90) = В(30) + Я(81) = 5 + 23 = 28 = Я(93)
Ответ;28
Другая форма решения
Будем решать поставленную задачу последовательно для чисел 3, 6, 9, 93 (то есть для каждого из чисел определим,
Сколько программ исполнителя существует для его получения). Заметим, что мы можем получить только числа, кратные 3. Количество программ, которые преобразуют число 3 в число П, Будем обозначать через 7?(и). Число 3 у нас уже есть, значит, его можно получить с помощью «пустой» программы. Любая непустая программа увеличит исходное число, т. е. даст число, больше 3. Значит, K(3) = 1. Для каждого следующего числа рассмотрим, из какого числа оно может быть получено за одну команду исполнителя. Если число не делится на девять, то оно может быть получено только из предыдущего с помощью команды прибавь 3. Значит, количество искомых программ для такого числа равно количеству программ для предыдущего возможного числа: R(I) = R(I —3). Если число на 9 делится, то вариантов последней команды два: прибавь 3 и умножь на 3, тогда R(I) = R(I— 3) + R(I∕3).Заполним соответствующую таблицу по привед’нным формулам слева направо:
3 |
6 |
9 |
12 |
15 |
18 |
21 |
24 |
27 |
30 |
33 |
36 |
39 |
42 |
45 |
1 |
1 |
2 |
2 |
2 |
3 |
3 |
3 |
5 |
5 |
5 |
7 |
7 |
7 |
9 |
48 |
51 |
54 |
57 |
60 |
63 |
66 |
69 |
72 |
75 |
78 |
81 |
84 |
87 |
90 |
9 |
9 |
12 |
12 |
12 |
15 |
15 |
15 |
18 |
18 |
18 |
23 |
23 |
23 |
28 |
93
28
При этом ячейки, относящиеся к числам, которые не делятся на девять, можно в решении и опустить (за исключением первого и последнего чисел):
3 |
9 |
18 |
27 |
36 |
45 |
54 |
63 |
72 |
81 |
90 |
93 |
1 |
2 |
3 |
5 |
7 |
9 |
12 |
15 |
18 |
23 |
28 |
28 |
Ответ:28
С4. После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик какой школы сколько баллов набрал. Эта информация в том же виде была разослана в школы.
Завуч школы № 50 решила наградить двух учащихся, которые лучше всех в школе сдали информатику.
Программа должна вывести на экран фамилии и имена этих учеников.
Если наибольший балл набрало больше двух человек — вывести количество таких учеников.
Если наибольший балл набрал один человек, а следующий балл набрало несколько человек — нужно вывести только фамилию и имя лучшего.
Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая должна вывести на экран требуемую информацию. Известно, что информатику сдавало больше 5-ти учеников школы № 50.
На вход программе сначала подаётся число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:
<Фамилия><Имя><Номер школы><Количество баллов> где <Фамилия> — строка, состоящая не более чем из 30 символов без пробелов, <Имя> — строка, состоящая не более чем из 20 символов без пробелов, <Номер школы> — целое число в диапазоне от 1 до 99, <Количество баллов> — целое число в диапазоне от 1 до 100. Эти данные записаны через пробел, причём ровно один между каждой парой (то есть всего по три пробела в каждой строке).
Пример входной строки:
Иванов Иван 50 87
Пример выходных данных:
Круглов Василий
Тарасова Дарья
Другой вариант выходных данных:
7
Третий вариант выходных данных:
Гусарский Илья
Ответ:
VarS, Smaxz Smax2: string[52];
Ch: char;
I, N, shz ball, max, nmax, max2, nmax2: integer; begin
Max : = -1; Smax : = ,’; nmax : = 0; max2 : = -1; readln(N); {считали количество строк}
For i := 1 to N do {перебираем все входные строки} begin
S : = ’ ‘ ;
Repeat
Read(ch);
S := s + ch
Until ch = ‘,; {считана фамилия и
Запомнена в переменнойз} repeat
Read(ch);
S : = s + ch
Until ch = ‘1; {считано имя
И добавлена к переменной s} readln(sh, ball); {считали номер школы и балл
Ученика}
If sh = 50 then {обрабатываем только учеников 50-й школы} if ball > max then {текущий балл — лучший} begin
Max2 : = max; Smax2 : = Smax; nmax2 : = nmax ;
Max := ball; Smax := s; nmax := 1 end
Else
If ball = max then {текущий балл — такой же, как лучший} begin
Птах := птах + 1; max2 := max; Smax2 := S end
Else
If ball > max2 then {текущий балл — лучше второго} begin
Max2 := ball; Smax2 := S; nmax2 := 1 end
Else
If ball = max2 then {текущий балл такой же, как второй} nmax2 : = nmax2 + 1
End;
If (птах =2) or (птах = 1) and (nmax2 = 1) then * {два лучших ученика}
Begin
Writeln(Smax); writein(Smax2) end else if (птах = 1) and (nmax2 > 1) then {один лучший ученик}
Writeln(Smax)
Else
Writein(птах) {лучших учеников больше двух} end.
Вариант 2
Cl. Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (х, У — действительные числа) и определяет принадлежность точки заштрихованной области. Программист торопился и написал программу неправильно.
Паскаль |
Бейсик |
Var х, у: real; Begin Readln(x, у); If у <= х * х then If х >= -1 then If у >= 1 then Write (‘принадлежит’) else Write (‘не принадлежит,) end. |
INPUT X, у IF у <= X * x THEN IF X >= -1 THEN IF y >= 1 THEN PRINT «принадлежит»ELSE PRINT «не принадлежит»ENDIF ENDIF ENDIF END |
Си |
Алгоритмический язык |
Void main(void) {float x, y; Scanf(«%f%f», &x, &y) ; If (y <= x * x) If (x >= -1) if (y >= D Printf(«принадлежит»); else Printf(«не принадлежит»); } |
Алг Нач вещ х, у Ввод х, у Если у <= х * х То если х > = -1 То Если у >= 1 То вывод‘принадлежит’Иначе Вывод‘не принадлежит’Все все все KOH |
Последовательно выполните следующее:
1. Приведите пример таких чисел х, У, при которых программа работает неправильно.
2. Укажите, как нужно доработать программу, чтобы не было случаев её неправильной работы. (Это можно сделать несколькими способами, поэтому укажите любой способ доработки исходной программы.)
Ответ:
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) |
Баллы |
Элементы ответа: 1) Пример: Х= 1, У= 1 (Любая пара (х, У), для которой выполняется: х < -1 или (у >= 1 и х >= 1) или У >Х2) 2) Возможная доработка (Паскаль): if (у <= х * х) and (х >= -1) and (у >= 1) and (х < 0) then write ('принадлежит') else write(,He принадлежит') (могут быть и другие способы доработки). |
|
Указания по оцениванию |
|
Обратите внимание! В задаче требовалось выполнить три действия: указать пример входных данных, при которых программа работает неверно и исправить две ошибки: 1. Неправильное использование условного оператора, в результате чего при невыполнении первого или второго условия программа не выдавала ничего (отсутствуют случаи ELSE). 2. Приведённым трём ограничениям удовлетворяют также те точки плоскости, у которых (у <=Х2) и (у>= 1) и (х > 0). |
|
Правильно выполнены оба пункта задания. Исправлены обе ошибки. В работе (во фрагментах программ) допускается наличие отдельных синтаксических ошибок, не искажающих замысла автора решения |
3 |
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) |
Баллы |
Правильно выполнены 2 пункта задания из трёх (исправлены обе ошибки, но не указан/неправильно указан пример требуемых входных данных, либо правильно указан пример входных данных, программа правильно работает при большем числе случаев, чем исходная, но не при всех). Например, выдает «принадлежит» для точек, у которых (£/ <= х2) и (у>= 1) и (х > 0). При этом не допускается, чтобы программа неправильно работала при тех входных данных, при которых раньше работала правильно (даже если она при этом правильно стала работать при большем количестве входных данных, чем исходная). ИСКЛЮЧЕНИЕ! При написании операций сравнения допускается одно неправильное использование стро- гих/нестрогих неравенств (считается несущественной ошибкой, погрешностью записи). Например, вместо «у >= 1″используется «у > 1″(даже если программа при этом стала неверно работать при тех входных данных, при которых раньше работала правильно). Допускается, например, такое решение: if у <= х * х then if х >= -1 then if у >= 1 then write (‘принадлежит’) else write(‘не принадлежит’) else write(‘не принадлежит’) else write(‘не принадлежит’) |
2 |
Правильно выполнено только одно действие из трёх. То есть, либо только приведён пример входных данных, либо он не приведён (или приведён неверно), но имеется программа, корректно работающая при большем количестве входных данных, чем исходная, но не при всех (допускается применение исключения, описанного в критериях оценки задачи на 2 балла). |
1 |
Все пункты задания выполнены неверно (пример входных данных не указан или указан неверно, программа не приведена, либо приведённая программа корректно работает в не большем количестве случаев, чем исходная). |
0 |
Максимальный балл |
3 |
С2. Дан вещественный массив из 50 элементов. Элементы массива могут принимать произвольные значения. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит наименьший номер отрицательного элемента массива или сообщение, что такого элемента нет.
Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.
Паскаль |
Бейсик |
Const N = 50; Var a: array [1..N] of real; I, j: integer; Begin For i := 1 to N do readln(a[i]); End. |
N = 50 DIfd A(N) AS REAL DIM I, J AS INTEGER FOR I = 1 TO N INPUT A(I) NEXT I END |
СИ |
Алгоритмический язык |
#include #define N 50 void main(void) { Float a [N]; Int i, j; For (i = 0; i < N; i++) scanf (,,%f", &a[i]); ) |
Алг нач ЦелN = 50 ВещтабA[l:N] ЦелI, j Нц дляI От1 ДоN Ввод а [ i] Кц KOH |
Русский (естественный) язык |
|
Объявляем массив А из 50 элементов. Объявляем целочисленные переменные I, J. В цикле от 1 до 50 вводим элементы массива А с 1-го по 50-й. |
В качестве ответа вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например Borland Pascal 7.0) или в виде блок — схемы. В этом случае вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке).
Ответ:
На языке Паскаль |
IIa языке Бейсик |
I : = 1 ; While (i < N) and (a[i] >= 0) do I : = i + 1;
If a[i] >= 0 then Writein(‘нет таких’) Else Writein (i); |
I = I WHILE I < N AND A(I) >= 0 I = I + 1 ENDW IF A(I) >= 0 THEN PRINT «нет таких» ELSE PRINT I ENDIF |
На языке СИ |
На алгоритмическом языке |
For(i = 0; i If(a[i] >= 0) Printf(«Heτ таких»); Else Printf(«%d»,i); |
I := 1 Нц ПокаI < N и a[i] >= 0 I := i + 1 Кц Если а[i] > = 0 То Вывод«нет таких» Иначе ВыводI Все |
На естественном языке |
|
Записываем в переменную I начальное значение, равное 1. В цикле пока I меньше 50 и пока I-й элемент неотрицательный, увеличиваем переменную I на единицу. Если после окончания цикла элемент массива с номером I неотрицательный — выводим сообщение, что отрицательных элементов в массиве нет. Иначе, выводим значение переменной I. |
СЗ. У исполнителя Калькулятор две команды, которым присвоены номера:
1. прибавь 2,
2. умножь на 2.
Первая из них увеличивает число на экране на 1, вторая — утраивает его.
Программа для Калькулятора — это последовательность команд.
Сколько есть программ, которые число 8 преобразуют в число 64?
Ответ обоснуйте.
Решение:
Обозначим 72(n) — количество программ, которые преобразуют число 8 в число П. Обозначим /(n) наибольшее кратное четырём, не превосходящее П.
Обе команды исполнителя увеличивают исходное число, поэтому общее количество команд в программе не может превосходить (64 — 8)/2 = 28.
Верны следующие соотношения:
Если П не делится на 4, то тогда R(N) = R(T(N)),Так как существует единственный способ получения П из T(N) — Прибавлением двоек.
Пусть П делится на 4.
Тогда R(n) = R(n∕4) + R(n — 2) = R(n∕4) + R(n -4) (если п > 4).
При л = 12 22(n) = 1 (один способ — прибавлением двух двоек).
Поэтому достаточно постепенно вычислить значения R(N) Для всех чисел, кратных трём и не превосходящих 29: сначала вычисляем 72(8), затем 22(12), 72(16) и т. д.
Имеем:
72(8) = 1 = 72(10) 72(12) = 1 = 72(14) 72(16) = 22(8) + 22(12) =1 + 1 = 2 = J2(18) 72(20) = 22(10) + jR(16) = 1 + 2 = 3 = R(22)
R(24) = 72(12) + 72(20) =1 + 3 = 4= 22(26)
12(28) = 22(14) + 72(24) = 1 + 4 = 5 = 22(30)
22(32) = 22(16) + 72(28) = 2 + 5 = 7 = 72(34)
22(36) = 22(18) + 22(32) = 2 + 7 = 9 = 72(38)
72(40) = 22(20) + 72(36) = 3 + 9= 12 = 72(42) 22(44) = 22(22) + 22(40) = 3 + 12 = 15 = 22(46)
72(48) = 22(24) + 72(44) = 4 + 15 = 19 = 72(50)
22(52) = 22(26) + /2(48) = 4 + 19 = 23 = 22(54)
22(56) = 72(28) + 72(52) = 5 + 23 = 28 = 72(58)
72(60) = 72(30) + 22(56) = 5 + 28 = 33 = 72(62)
72(64) = 72(32) + 22(60) = 7 + 33 = 40
Ответ: 40
Другая форма решения
Будем решать поставленную задачу последовательно для чисел 8, 10, 12, …, 64 (то есть для каждого из чисел определим, сколько программ исполнителя существует для его получения). Количество программ, которые преобразуют число 8 в число П, будем обозначать через 72(л). Число 8 у нас уже есть, значит, его можно получить с помощью «пустой» программы. Любая непустая программа увеличит исходное число, т. е. даст число, больше 8. Значит, /?(8) = 1. Для каждого следующего числа рассмотрим, из какого числа оно может быть получено за одну команду исполнителя. Если число не делится на четыре, то оно может быть получено только из предыдущего с помощью команды прибавь 2. Значит, количество искомых программ для такого числа равно количеству программ для предыдущего числа: R(I) = R(I— 2). Если число на четыре делится, то вариантов последней команды два: прибавь 2 и умножь на 2, тогда R(I) = R(I— 2) + jR(i∕2). Заполним соответствующую таблицу по приведенным формулам слева направо:
8 |
10 |
12 |
14 |
16 |
18 |
20 |
22 |
24 |
26 |
28 |
30 |
32 |
34 |
36 |
1 |
1 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
7 |
7 |
9 |
38 |
40 |
42 |
44 |
46 |
48 |
50 |
52 |
54 |
56 |
58 |
60 |
62 |
64 |
|
9 |
12 |
12 |
15 |
15 |
19 |
19 |
23 |
23 |
28 |
28 |
33 |
33 |
40 |
При этом ячейки, относящиеся к числам, которые не делятся на четыре, можно в решении и опустить (за исключением первого и последнего чисел):
8 |
12 |
16 |
20 |
24 |
28 |
32 |
36 |
40 |
44 |
48 |
52 |
56 |
60 |
64 |
1 |
1 |
2 |
3 |
4 |
5 |
7 |
9 |
12 |
15 |
19 |
23 |
28 |
33 |
40 |
Ответ:40
С4. После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик какой школы сколько баллов набрал.
Районный методист решила выяснить номер школы, ученики которой набрали наибольший средний балл, с точностью до целых. Программа должна вывести на экран номер такой школы и её средний балл.
Если наибольший средний балл набрало больше одной школы — вывести количество таких школ.
Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая должна вывести на экран требуемую информацию. Известно, что информатику сдавало больше 5-ти учеников района. Также известно, что в районе школы с некоторыми номерами не существуют.
На вход программе сначала подаётся число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:
<Фамилия><Имя> сНомер школы><Количество баллов>где <Фамилия> — строка, состоящая не более чем из 30 символов без пробелов, <Имя> — строка, состоящая не более чем из 20 символов без пробелов, <Номер школы> — целое число в диапазоне от 1 до 99, сКоличество баллов> — целое число в диапазоне от 1 до 100. Эти данные записаны через пробел, причём ровно один между каждой парой (то есть всего по три пробела в каждой строке).
Пример входной строки:
Иванов Иван 50 87
Пример выходных данных:
50 74
Другой вариант выходных данных:
7
Ответ;
Var S1 k: array[1..99] of integer;
Ch: char;
I, N, sh, ball, max, nmax: integer;
Begin
For i := 1 to 99 do {обнуляем массивы}
Begin
S [ i ] : = 0; к [ i ] : = О end;
Readln(N); {считали количество строк}
For i := 1 to N do {перебираем все входные строки} begin
Repeat
Read(ch)
Until ch = ,’; {считана фамилия}
Repeat
Read(ch)
Until ch = , ,; {считано имя}
Readln(sh, ball); {считали номер школы и балл ученика}
S[sh} := s[sh] + ball; {считаем сумму баллов по школе}
K[sh] := k[sh] + 1 {считаем количество учеников из школы} end;
For i := 1 to 99 do
If k[i] > 0 then
S[i] := s[i] div k[i]; {считаем средний балл по каждой школе} max : = 1; nmax : = 1;
For i := 2 to 99 do {ищем максимум среди средних баллов}
If s[i]>s[max] then
Begin
Max : = i; птах : = 1
End
Else
If s[i] = stmax] then {считаем количество максимумов}
Nmax := nmax + 1;
If nmax = 1 then writein (max, »,s[max))
Else writein(nmax)
End.
Вариант 3
Cl. Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (х, У — действительные числа) и определяет принадлежность точки заштрихованной области. Программист торопился и написал программу неправильно.
Паскаль |
Бейсик |
Var х, у: real; Begin Readln(x, у); If у <= sin(x) then If у >= 1 — х then if у >= 0 then write (,принадлежит’) Else Write(‘не принадлежит’) end. |
INPUT x, у IF у <= SIN(X) THEN IF у >= 1 — x THEN IF y >= 0 THEN PRINT «принадлежит» ELSE PRINT «не принадлежит» ENDIF ENDIF ENDIF END |
Си |
Алгоритмический язык |
Void main(void) { float x, y; Scanf(«⅞ f⅞ f»,&x,&y); If (y <= sin(x)) If (y >= 1 — x) If (y >= 0) Printf(«принадлежит»); Else Printf («не принадлежит»); } |
Ал г нач вещ х, у Ввод х, у Если у <= sin(x) То Если у >= 1 — х То если у >= 0 то Вывод‘принадлежит’Иначе Вывод‘не принадлежит’Все Все все KOH |
Последовательно выполните следующее:
1. Приведите пример таких чисел х, У, при которых программа работает неправильно.
2. Укажите, как нужно доработать программу, чтобы не было случаев её неправильной работы. (Это можно сделать несколькими способами, поэтому укажите любой способ доработки исходной программы.)
Ответ:
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) |
Баллы |
Элементы ответа: 1) Пример: Х= 2π, У= 0 (Любая пара (х, У), для которой выполняется: У > sin х или У< 1 - х или (у<= sin х и У>= 0 и х >= 2π)) 2) Возможная доработка (Паскаль): If (у <= sin(×)) and (у >= 1 — х) and (у >= 0) and (х <= 4) then Write (‘принадлежит’) Else Write(‘не принадлежит’) (могут быть и другие способы доработки). |
|
Указания по оцениванию |
|
Обратите внимание! В задаче требовалось выполнить три действия: указать пример входных данных, при которых программа работает неверно и исправить две ошибки: 1. Неправильное использование условного оператора, в результате чего при невыполнении первого или второго условия программа не выдавала ничего (отсутствуют случаи ELSE). 2. Приведённым трём ограничениям удовлетворяют также те точки плоскости, у которых (у<= sin х) и (у>= 0) и (х >= 2π). |
|
Правильно выполнены оба пункта задания. Исправлены обе ошибки. В работе (во фрагментах программ) допускается наличие отдельных синтаксических ошибок, не искажающих замысла автора решения |
3 |
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) |
Баллы |
Правильно выполнены 2 пункта задания из трёх (исправлены обе ошибки, но не указан/неправильно указан пример требуемых входных данных, либо правильно указан пример входных данных, программа правильно работает при большем числе случаев, чем исходная, но не при всех). Например, выдаёт «принадлежит» для точек, у которых (у<= sin х) и (t∕ >= 0) и (х >= 2π). При этом не допускается, чтобы программа неправильно работала при тех входных данных, при которых раньше работала правильно (даже если она при этом правильно стала работать при большем количестве входных данных, чем исходная). ИСКЛЮЧЕНИЕ! При написании операций сравнения допускается одно неправильное использование стро — гих/нестрогих неравенств (считается несущественной ошибкой, погрешностью записи). Например, вместо «у <= 0» используется «у <0» (даже если программа при этом стала неверно работать при тех входных данных, при которых раньше работала правильно). Допускается, например, такое решение: if у <= sin(x) then if у >= 1 — х then if у >= 0 then write (‘принадлежит’) else write(‘не принадлежит’) else write (‘не принадлежит,) Else Write (‘не принадлежит’) |
2 |
Правильно выполнено только одно действие из трёх. То есть либо только приведён пример входных данных, либо он не приведён (или приведён неверно), но имеется программа, корректно работающая при большем количестве входных данных, чем исходная, но не при всех (допускается применение исключения, описанного в критериях оценки задачи на 2 балла). |
1 |
Все пункты задания выполнены неверно (пример входных данных не указан или указан неверно, программа не приведена, либо приведённая программа корректно работает в не большем количестве случаев, чем исходная). |
0 |
Максимальный балл |
3 |
С2. Дан вещественный массив из 40 элементов. Элементы массива могут принимать произвольные значения. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит минимальный положительный элемент массива или сообщение, что такого элемента нет.
Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.
Паскаль |
Бейсик |
Const N = 40; Var a: array [1..N] of Real; I, j: integer; Min: real; Begin For i := 1 to N do readln(a [i]); End. |
N = 40 DIM A(N) AS REAL DIM I, J AS INTEGER DIM MIN AS REAL FOR I = 1 TO N INPUT A(I) NEXT I END |
СИ |
Алгоритмический язык |
#include For (i = 0; i < N; i++) scanf("%f", &a[i]); } |
Алг нач ЦелN = 40 Вещтаб а[1:N] ЦелI, j ВещMIN Нц дляI От1 ДоN ВводA [i ] Кц KOH |
Русский (естественный) язык |
|
Объявляем массив А из 40 элементов. Объявляем целочисленные переменные I, J, и вещественную переменную MIN. В цикле от 1 до 40 вводим элементы массива Ac 1-го по 40-й. |
В качестве ответа вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например Borland Pascal 7.0) или в виде блок-схемы. В этом случае вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке).
Ответ:
На языке Паскаль |
На языке Бейсик |
3 := 1; While (j < N) and (a[j] <= 0) do 3 := j + 1; If a[j] <= 0 then writein(,нет таких') else Begin For i := j to N do if (a[i] > 0) and (a[i] < a[j]) then j : = i; Writein(a[j]) end; Другой Способ: J :=0; For i := 1 to N do If a[i] > 0 then if (j = 0) or (a (i ] < a [ j ) ) then j : = i ; If j = 0 then Writein(‘нет таких’) else Writein(a[j]); |
J = I WHILE J < N AND A(J) <= 0 J = J + 1 ENDW IF A(J) <= 0 THEN PRINT "нет таких"ELSE FOR I = J TO N IF A(I)>0 AND A(I) < A(J) THEN J = I ENDIF NEXT I PRINT A(J) ENDIF |
На языке СИ |
На алгоритмическом языке |
For(j = 0; j If(a[j] <= 0) printf("Heτ таких"); Else { For(i = j; i < N; i++) If (a[i] > 0 && a[i] < a[j]) 3 = i; Print f («%f»,a[j]); } |
J := 1 Нц покаJ КЦ ЕслиA[j] <= 0 То Вывод«нет таких»Иначе Нц дляI от j до N Если а [ i ] • > 0 и a[i] < a[j] То 3 := i Все КЦ Вывод а [ j ] Все |
На естественном языке
Записываем в переменную J начальное значение, равное 1. В цикле пока J меньше 40 и пока J-й элемент неположительный, увеличиваем переменную J на единицу (ищем номер первого положительного элемента). Если после окончания цикла элемент массива с номером J неположительный — выводим сообщение, что положительных элементов в массиве нет и заканчиваем работу. Иначе, от J-ro элемента до сорокового сравниваем значение текущего элемента с нулём и со значением J-ro элемента. Если значение текущего элемента больше нуля и меньше чем значение J-ro элемента, то в переменную J записываем номер текущего элемента. После окончания цикла выводим значение J-ro элемента.
СЗ. Два игрока играют в следующую игру. На координатной плоскости стоит фишка. Игроки ходят по очереди. В начале игры фишка находится в точке с координатами (5, 2). Ход состоит в том, что игрок перемещает фишку из точки с координатами (х, У) в одну из трёх точек: или в точку с координатами (х + 3, У), или в точку с координатами (х, У+ 3), или в точку с координатами (х, У+ 4). Выигрывает игрок, после хода котор jγoрасстояние от фишки до точки с координатами (0, 0) не меньше 13 единиц. Кто выигрывает при безошибочной игре обоих игроков — игрок, делающий первый ход, или игрок, делающий второй ход? Каким должен быть первый ход выигрывающего игрока? Ответ обоснуйте.
Ответ:
Содержание верного ответа (допускаются иные формулировки ответа, не искажающие его смысла)
Выигрывает второй игрок.
Для доказательства рассмотрим неполное дерево игры, оформленное в виде таблицы, где в каждой ячейке записаны координаты фишки на каждом этапе игры.
1 ход |
2 ход |
3 ход |
4 ход |
||
Стартовая позиция |
1-й игрок (все варианты хода) |
П-й игрок (выигрышный ход) |
1-й игрок (все варианты хода) |
П-й игрок (выигрышный ход, один из вариантов) |
|
5,2 |
5,6 |
8,6 |
11,6 |
14,6 |
|
8,9 |
11,9 |
||||
8,10 |
11,10 |
||||
1 ход |
2 ход |
3 ход |
4 ход |
|
|
Стартовая позиция |
1-й игрок (все варианты хода) |
П-й игрок (выигрышный ход) |
1-й игрок (все варианты хода) |
П-й игрок (выигрышный ход, один из вариантов) |
|
5,5 |
8,5 |
11,5 |
14,5 |
|
|
8,8 |
11,8 |
|
|||
8,9 |
11,9 |
|
|||
8,2 |
8,5Или 8,6 (достаточно привести один из вариантов) |
Те же варианты третьего-четвёртого ходов. |
|
||
Таблица содержит Все возможные варианты ходов первого игрока. Из неё видно, что при любом ходе первого игрока у второго имеется ход, приводящий к победе.
С4. После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик какой школы сколько баллов набрал.
Районный методист решила выяснить номера школ, ученики которых набрали средний балл по школе, больший, чем районный средний балл (все средние баллы вычисляются с точностью до целых). Программа должна вывести на экран номера таких школ, в любом порядке. Если такая школа окажется только одна — вывести также средний балл по этой школе, с указанием, что это средний балл.
Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая должна вывести на экран требуемую информацию. Известно, что информатику сдавало больше 5-ти учеников района. Также известно, что в районе школы с некоторыми номерами не существуют.
На вход программе сначала подаётся число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:
<Фамилия><Имя><Номер школы><Количество баллов> где <Фамилия> — строка, состоящая не более, чем из 30 символов без пробелов, <Имя> — строка, состоящая не более, чем из 20 символов без пробелов, <Номер школы> — целое число в диапазоне от 1 до 99, <Количество баллов> — це-
Лое число в диапазоне от 1 до 100. Эти данные записаны через пробел, причём ровно один между каждой парой (то есть, всего по три пробела в каждой строке).
Пример входной строки:
Иванов Иван 50 87
Пример выходных данных:
5 50 74 87
Другой вариант выходных данных:
7
Средний балл = 74
Ответ:
Var s, k: array[1..99] of integer;
Ch:char;
Iz N, sh, ball, avg, m: integer;
Begin
For i := 1 to 99 do {обнуляем массивы} begin
S[i] := 0;
K[i] := 0
End;
Readln(N); {считали количество строк}
For i := 1 to N do {перебираем все входные
Строки} begin
Repeat
Read(ch)
Until ch = ,’; {считана фамилия} repeat
Read(ch)
Until ch = ,’; {считано имя}
Readln(sh, ball); {считали номер школы и балл ученика} s[sh] := s[sh] + ball; {считаем сумму баллов по школе} k[sh] := k[sh] + 1 {считаем количество
Учеников из школы} end;
Avg : = 0;
For i := 1 to 99 do
If k[i] > 0 then
Begin
Avg := avg + s[i]; {считаем сумму баллов по району} s[i] := s[i] div k[i]; {считаем средний балл по каждой школе} end;
Avg := avg div N; {считаем средний балл по району} m : = 0;
For i := 1 to 99 do
If s[i] > avg then {отбираем школы, где средний балл выше районного} begin
M := m + 1; {подсчитываем количество таких школ} ball := s[i]; {запоминаем средний балл
Какой-нибудь из них} write(i, ‘ ’ )
End;
Writein;
If m = 1 then
Writein(,Средний балл = ‘,ball) end.
Вариант 4
Cl. Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (х, У — действительные числа) и определяет принадлежность точки заштрихованной области. Программист торопился и написал программу неправильно.
Паскаль |
Бейсик |
Var х, у: real; Begin Readln(x, у); If у >= — х * х then If у >= — х — 2 then if у <= 0 then write ('принадлежит’) Else Write(‘не принадлежит’) end. |
INPUT x, у IF у >= — X * x THEN IF у >= — x — 2 THEN IF y <= 0 THEN PRINT «принадлежит» ELSE PRINT ‘,не принадлежит» ENDIF ENDIF ENDIF END________________________________________ |
Си |
Алгоритмический язык |
Void main(void) { float x, y; Scanf (»%f%f» , &x, &y) ; If (y >= — x * x) If (x >= — x — 2) If (y <= 0) Printf(«принадлежит»); Else Printf(«не принадлежит»); ) |
Алг Нач Вещ х, у Ввод х, у Если у >= — х * х то Если х >= — х — 2 То Если у <= 0 То вывод‘принадлежит’ Иначе Вывод‘не принадлежит’Все Все Все KOH |
Последовательно выполните следующее:
1. Приведите пример таких чисел х, У, при которых программа работает неправильно.
2. Укажите, как нужно доработать программу, чтобы не было случаев её неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы.)
Ответ:
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) |
Баллы |
Элементы ответа: 1) Пример: Х= 1, У= 0 (Любая пара (х, У), для которой выполняется: У<-х - 2 или (у<= 0 и х > 0) или У < — X2) 2) Возможная доработка (Паскаль): If (у >= — х * х) and (у >= — х — 2) and (у <= 0) and (х <= 0) then Write (1принадлежит1) Else Write (1не принадлежит’) (могут быть и другие способы доработки). |
|
Указания по оцениванию |
|
Обратите внимание! В задаче требовалось выполнить три действия: указать пример входных данных, при которых программа работает неверно и исправить две ошибки: 1. Неправильное использование условного оператора, в результате чего при невыполнении первого или второго условия программа не выдавала ничего (отсутствуют случаи ELSE). 2. Приведённым трём ограничениям удовлетворяют также те точки плоскости, у которых (у>= — х2) и (у <= 0) и (х > 0) и (у>= — х — 2). |
|
Правильно выполнены оба пункта задания. Исправлены обе ошибки. В работе (во фрагментах программ) допускается наличие отдельных синтаксических ошибок, не искажающих замысла автора решения |
3 |
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) |
Баллы |
Правильно выполнены 2 пункта задания из трёх (исправлены обе ошибки, но не указан/неправильно указан пример требуемых входных данных, либо правильно указан пример входных данных, программа правильно работает при большем числе случаев, чем исходная, но не при всех). Например, выдаёт «принадлежит» для точек, у которых (у>= — X2) и (у <= 0) и (х > 0) и (у>= — х — 2). При этом не допускается, чтобы программа неправильно работала при тех входных данных, при которых раньше работала правильно (даже если она при этом правильно стала работать при большем количестве входных данных, чем исходная). ИСКЛЮЧЕНИЕ! При написании операций сравнения допускается одно неправильное использование стро- гих/нестрогих неравенств (считается несущественной ошибкой, погрешностью записи). Например, вместо «у >= 1» используется «у >1» (даже если программа при этом стала неверно работать при тех входных данных, при которых раньше работала правильно). Допускается, например, такое решение: if у >= — х * х then if у >= — х — 2 then if у <= 0 then write ('принадлежит , ) else write(’не принадлежит') else write('не принадлежит') else Write(,He принадлежит’) |
2 |
Правильно выполнено только одно действие из трёх. То есть либо только приведён пример входных данных, либо он не приведён (или приведён неверно), но имеет-‘ ся программа, корректно работающая при большем количестве входных данных, чем исходная, но не при всех (допускается применение исключения, описанного в критериях оценки задачи на 2 балла). |
1 |
Все пункты задания выполнены неверно (пример входных данных не указан или указан неверно, программа не приведена, либо приведённая программа корректно работает в не большем количестве случаев, чем исходная). |
0 |
Максимальный балл |
3 |
С2. Дан целочисленный массив из 30 элементов. Элементы массива могут принимать произвольные значения. C клавиатуры вводится целое число X. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит наименьший номер элемента массива, равного X, или сообщение, что такого элемента нет.
Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.
Паскаль |
Бейсик |
Const N = 30; Var a: array [1..N] of integer; Iz j, х: integer; Begin for i := 1 to’N do Readln(a[i]); Readlh(x); End. |
N = 30 DIM A(N) AS INTEGER DIM I, Jz X AS INTEGER FOR I = 1 TO N INPUT A(I) NEXT I INPUT X END |
СИ |
Алгоритмический язык |
#include #define N 30 void main(void) {int a[N]; Int i, j, x; For (i = 0; i < N; i++) , scanf("%d", &a[i]); Scanf(«%d»,&x); } |
Алг нач ЦелN = 30 ЦелтабA[l:N] ЦелIz j, х Нц дляI От1 ДоN ВводA [i] Кц ВводX KOH |
Русский (естественный) язык |
|
Объявляем массив А из 30 элементов. Объявляем целочисленные переменные I, J. В цикле от 1 до 30 вводим элементы массива Ac 1-го по 30-й. Вводит переменную X. |
В качестве ответа вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка програм
мирования, например Borland Pascal 7.0) или в виде блок — схемы. В этом случае вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке).
Ответ:
На языке Паскаль |
На языке Бейсик |
J : = 0; For i : = N downto 1 do if a[i] = х then J : = i; If j = 0 then Writein(‘нет таких’) else Writein(j); Другой» способ: |
I = I WHILE I < N AND A(I) о X 1 = 1 + 1 ENDW IF A(I) <>X THEN PRINT «нет таких» ELSE PRINT I ENDIF |
I : = 1 ; While (i < N) and (a [i] <> x) do i : = i + 1 ; If a[i] <> x then writein(‘нет таких’) Else Writein(i); |
|
На языке СИ |
На алгоритмическом языке |
For(I = 0; i < N && a[i] != x; i++) If(a[i] != x) Printf(«Heτ таких»); else Printf(«%d», i); |
I := 1 Нц ПокаI < N и a[i] <>х I := i + 1 Кц Если а[i] о х То Вывод«нет таких» Иначе выводI Все |
На естественном языке |
|
Записываем в переменную I начальное значение, равное 1. В цикле пока I меньше 30 и пока I-й элемент не равен X, увеличиваем переменную I на единицу. После окончания цикла: если элемент массива с номером I не равен X — выводим сообщение, что таких элементов в массиве нет. Иначе, выводим значение переменной I. |
СЗ. Два игрока играют в следующую игру. На координатной плоскости стоит фишка. Игроки ходят по очереди. В начале игры фишка находится в точке с координатами (3, 2). Ход состоит в том, что игрок перемещает фишку из точки с координатами (х, У) в одну из трёх точек: или в точку с координатами (х + 3, 1/), или в точку с координатами (х, У+ 2), или в точку с координатами (х, У+ 4). Выигрывает игрок, после хода которого расстояние от фишки до точки с координатами (0, 0) больше 12 единиц. Кто выигрывает при безошибочной игре обоих игроков — игрок, делающий первый ход, или игрок, делающий второй ход? Каким должен быть первый ход выигрывающего игрока? Ответ обоснуйте.
Ответ:
Содержание верного ответа (допускаются иные формулировки ответа, не искажающие его смысла)
Выигрывает первый игрок, своим первым ходом он должен поставить фишку в точке с координатами (3, 4). Для доказательства рассмотрим неполное дерево игры, оформленное в виде таблицы, где в каждой ячейке координаты фишки на каждом этапе игры.
1 Ход |
2 Ход |
3 Ход |
4 Ход |
5 Ход |
Позиция после первого хода |
П-й игрок (все варианты хода) |
1-й игрок (выигрышный ход) |
П-й игрок (все варианты хода) |
1-й игрок (один из вариантов) |
3,4 |
6,4 |
6,6 |
9,6 |
12,6 |
6,8 |
9,8 |
|||
6,10 |
9,10 |
|||
3,6 |
6,6 |
Те же варианты 4-5 Хода |
||
3,8 |
3,12 |
Первый игрок выиграл |
Таблица содержит Все возможные варианты ходов второго игрока. Из неё видно, что при любом ответе второго игрока у первого имеется ход, приводящий к победе.
С4. После единых выпускных экзаменов по информатике в район пришла информация о том, какой ученик какой школы сколько баллов набрал.
Районный методист решила выяснить фамилии учеников, которые набрали наибольший балл, по каждой школе в отдельности, но только если из школы информатику сдавало не меньше трёх человек. Если в школе информатику сдавало
Меньше трёх человек, информацию по этой школе выводить не нужно. Программа должна вывести на экран информацию с виде:
<Номер школы> «Фамилия ученика>
В отдельной строке для каждой школы.
Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая должна вывести на экран требуемую информацию. Известно, что информатику сдавало больше 5-ти учеников района. Также известно, что в районе школы с некоторыми номерами не существуют.
На вход программе сначала подаётся число учеников, сдававших экзамен. В каждой из следующих N строк находится информация об учениках в формате:
<Фамилия><Имя><Номер школы> сКоличество бал — лов>
Где <Фамилия> — строка, состоящая не более чем из 30 символов без пробелов, <Имя> — строка, состоящая не более чем из 20 символов без пробелов, <Номер школы> — целое число в диапазоне от 1 до 99, сКоличество баллов> — целое число в диапазоне от 0 до 100. Эти данные записаны через пробел, причём ровно один между каждой парой (то есть всего по три пробела в каждой строке).
Пример входной строки:
Иванов Иван 50 87
Пример выходных данных:
5 Иванов
50 Петров
74 Сидоров
Ответ:
Var num, bal: array[1..99] of integer;
Name: array[1..99] of string[52];
S: string[52];
Ch: char;
I, N, sh, ball: integer;
Begin
For i := 1 to 99 do {обнуляем массивы} begin
Num[i ] := 0;
Bal[i] := -1
End;
Readln(N); {считали количество строк}
For i := 1 to N do {перебираем все входные строки}
Begin
S : = ,’;
Repeat read(ch); s := s + ch
Until ch = , ,; {считана фамилия и записана в переменную s} repeat
Read(ch)
Until ch = ,’; {считано имя}
Readln(sh, ball); {считали номер школы и балл ученика} if ball > bal[sh] then {если текущий балл лучше}
Begin
Bal[sh] := ball; {запоминаем текущий балл по школе} name[sh] := s {и фамилию ученика}
End;
Num[sh] := num[sh] + 1 {считаем количество учеников из школы} end;
For i := 1 to 99 do
If num[i] >= 3 then {выбираем только школы, из которых сдавало больше трех учеников}
Writein(i, », name[i]) end.
Вариант 5
Cl. Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (г, У — Действительные числа) и определяет принадлежность точки заштрихованной области. Программист торопился и написал программу неправильно.
Паскаль |
Бейсик |
Var х, у: real; Begin Readln(x, у); Ifx<=y*y then If х >= 0 then If у <= 1 then Write (,принадлежит,) else Write(‘не принадлежит’) end. |
INPUT x, у IF X <= у * y THEN IF X >= 0 THEN IF y <= 1 THEN PRINT «принадлежит» ELSE PRINT «не принадлежит» ENDIF ENDIF ENDIF END |
Си |
Алгоритмический язык |
Void main(void) { float x, y; Scanf(«%f%f»,&x,&y); If (x <= у * у) If (x >= 0) If (y <= 1) Printf(«принадлежит»); else Printf(«не принадлежит»); } |
Алг Нач Вещ х, у Ввод х, у Если х < = у * у То Если х >= 0 то Если у <= 1 То Вывод‘принадлежит’Иначе Вывод‘не принадлежит’Все Все Все KOH |
Последовательно выполните следующее:
1. Приведите пример таких чисел Х, у, при которых программа работает неправильно.
2. Укажите, как нужно доработать программу, чтобы не было случаев её неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы.)
Ответ:
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) |
Баллы |
Элементы ответа: 1) Пример: Х= 0, У= -1 (Любая пара (х, У), для которой выполняется: х < 0 или (у < 0 и х >= 0) или х >У2) 2) Возможная доработка (Паскаль): If (х <= у * у) and (х >= 0) and (у <= 1) and (у >= 0) then write (‘принадлежит ‘ ) else write(‘не принадлежит’) (могут быть и другие способы доработки). |
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) |
Баллы |
Указания по оцениванию |
|
Обратите внимание! В задаче требовалось выполнить три действия: указать пример входных данных, при которых программа работает неверно и исправить две ошибки: 1. Неправильное использование условного оператора, в результате чего при невыполнении первого или второго условия программа не выдавала ничего (отсутствуют случаи ELSE). 2. Приведённым трём ограничениям удовлетворяют также те точки плоскости, у которых (х <= У2) и (у<= 1) и (х >=f 0) и (у < 0). |
|
Правильно выполнены оба пункта задания. Исправлены обе ошибки. В работе (во фрагментах программ) допускается наличие отдельных синтаксических ошибок, не искажающих замысла автора решения |
3 |
Правильно выполнены 2 пункта задания из трёх (исправлены обе ошибки, но не указан/неправильно указан пример требуемых входных данных, либо правильно указан пример входных данных, программа правильно работает при большем числе случаев, чем исходная, но не при всех). Например, выдает «принадлежит» для точек, у которых (х <= У2) и (у<= 1) и (х >= 0) и (у < 0). При этом не допускается, чтобы программа неправильно работала при тех входных данных, при которых раньше работала правильно (даже если она при этом правильно стала работать при большем количестве входных данных, чем исходная). ИСКЛЮЧЕНИЕ! При написании операций сравнения допускается одно неправильное использование стро — гих/нестрогих неравенств (считается несущественной ошибкой, погрешностью записи). Например, вместо «у >= 0» используется «у > 0» (даже если программа при этом стала неверно работать при тех входных данных, при которых раньше работала правильно). |
2 |
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) |
Баллы |
Допускается, например, такое решение: if х <= у * у then if х >= 0 then if у <= 1 then Write (,принадлежит,) else Write (,не принадлежит’) else t Write (1не принадлежит,) else Write(‘не принадлежит 1) |
|
Правильно выполнено только одно действие из трёх. То есть, либо только приведён пример входных данных, либо он не приведён (или приведён неверно), но имеется программа, корректно работающая при большем количестве входных данных, чем исходная, но не при всех (допускается применение исключения, описанного в критериях оценки задачи на 2 балла). |
1 |
Все пункты задания выполнены неверно (пример входных данных не указан или указан неверно, программа не приведена, либо приведённая программа корректно работает в не большем количестве случаев, чем исходная). |
0 |
Максимальный балл |
3 |
С2. Дан целочисленный массив из 40 элементов. Элементы массива могут принимать произвольные значения. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит значение второго максимума (элемента, который в отсортированном по невозрастанию массиве стоял бы вторым).
Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.
Паскаль |
Бейсик |
Const N = 40; Var a: array [1..N] of integer; I, k, max, max2: integer; begin For i := 1 to N do readln(a[i]); |
N = 40 DIM A(N) AS INTEGER DIM I, К, MAX, MAX2 AS INTEGER FOR I = 1 TO N INPUT A(I) NEXT I |
End. |
END |
СИ |
Алгоритмический язык |
#include ‘ Int i, k, max, max2 ; For (i = 0; i < N; i++) scanf("%d", &a{i]); |
Алг Нач ЦелN = 40 ЦелтабA[l:N] ЦелI, k, MAX, ∙ МАХ2 Нц ДляI От1 ДоN Ввод а [ i ] Кц |
) |
KOH |
Русский (естественный) язык |
|
Объявляем массив А из 40 элементов. Объявляем целочисленные переменные I, К, MAX, МАХ2. В цикле от 1 до 40 вводим элементы массива Ac 1-го по 40-й. |
В качестве ответа вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например Borland Pascal 7.0) или в виде блок — схемы. В этом случае вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке).
Ответ:
На языке Паскаль |
На языке Бейсик |
Max : = а [ 1 ] ; Max2 := а[2]; If max < max2 then Begin Max := а [ 2]; Max2 := а[1] End; For i := 3 to N do if a[i] > max then begin Max 2 := max; Max : = a [ i ] end else If a[i] > max2 then max2 : = a [ i ] ; Writein(max2); |
MAX = A(I) MAX2 = A (2) IF MAX < MAX2 THEN MAX = A(2) MAX2 = A(I) ENDIF FOR I = 3 TO N IF A(I) > MAX THEN MAX2 = MAX MAX = A(I) ELSE IF A(I) > MAX2 THEN MAX2 = A(I) ENDIF ENDIF NEXT I PRINT MAX2 |
На языке СИ |
На алгоритмическом языке |
Max = a [ 0 ] ; Max2 = a [ 1 ] ; If (max < max2) { Max = a [ 1 ] ; Max2 = a [ 0 ] ; } For(i = 2; i < N; i++) if(a[i] > max) { Max 2 = max ; Max = a [ i ] ; } Else I f(a[i] > max2) max2 = a [ i ] ; Printf(«%dπ, max2); |
MAX := a[l] MAX2 := a [2] ЕслиMAX < MAX2 TO MAX := a[2] MAX2 := a[l] Все Нц дляI От3 ДоN Если а [ i ] > MAX То MAX2 := MAX MAX := a[i] Иначе Если а [ i ] >МАХ2 То MAX2 := a[i] Все все Кц Вывод МАХ2 |