Материалы семинара

Download Report

Transcript Материалы семинара

«Методика решения заданий высокого уровня сложности по теории алгоритмов и программированию в рамках подготовки учащихся к итоговой аттестации по информатике» Семинар для учителей информатики

Особенности заданий - 2015

• • • • • Всего 4 задания из ныне существующих, сохранят свои формулировки Задания 1-3 будут значительно усложнены Задание 23 останется в своем нынешнем виде Задание С4 (27) разбивается на часть А и часть В. В части 27А необходимо написать

неэффективную

программу. В части 27В –

эффективную

. В случае, если часть 27В не является эффективной, она не будет засчитана как неэффективная в части 27А Основным ориентиром в заданиях является сайт Полякова – kpolyakov.narod.ru

Структура задания С1 (24)

Дана программа. Необходимо выполнить следующие действия: 1. Написать, что выведет эта программа при вводе указанных значений 2. Приведите пример таких значений, при которых программа даст правильный ответ.

3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки: • выпишите строку, в которой сделана ошибка; • укажите, как исправить ошибку, т.е приведите правильный вариант строки.

Особенности оценивания С1(24)

• • • Если при выполнении п.2 указать несколько вариантов входных данных, при которых программа выдаст верный ответ и среди них будет хотя бы один, при котором ответ будет неверным –

баллы не начисляются

Одно исправление в п.3 или п.4 должно затрагивать

только 1 строку

Если при выполнении п.3, 4 указать задание считается

невыполненным свое решение

,

Решение заданий С1(24)-1

• Требовалось написать программу, которая вводит с клавиатуры натуральное число N, не превышающее 10 9 , и выводит сумму чётных цифр в десятичной записи этого числа или 0, если чётных цифр нет. Программист торопился и написал программу неправильно. Вот она:

var N: longint; s: integer; begin readln(N); s := 0; while N > 1 do begin if N mod 2 = 0 then begin s := N mod 10; end; N := N div 10; end; write(s); end.

Решение заданий С1(24)-1

Последовательно выполните следующее.

1. Напишите, что выведет эта программа при вводе числа

1984

.

2. Приведите пример числа, при вводе которого программа выдаст

верный ответ

.

3. Найдите

в программе все

ошибки

.

• 4. Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.

Обратите внимание: вам нужно исправить приведённую программу, а не написать свою. Вы можете только заменять ошибочные строки, но не можете удалять строки или добавлять новые. Заменять следует только ошибочные строки: за исправления, внесённые в строки, не содержащие ошибок, баллы будут снижаться

Решение заданий С1(24)-1

1. При вводе числа

1984

будет выведено число

8

первой чётной цифры числа.

– значение 2. Программа выдаст правильный ответ для

N = 1981

.

• • • •

Программа выдаст верный ответ когда сумма чётных цифр и значение первой чётной цифры совпадают; это возможно, если в числе нет чётных цифр (сумма останется равной 0) все чётные цифры – нули одна чётная цифра одна ненулевая чётная цифра, а нули стоят после неё (нули не меняют суммы!)

3. Ошибка допущена в строке s := N mod 10; Эта строка должна в правильной программе выглядеть так

s := s + N mod 10;

Решение заданий С1(24)-2

Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (x, y – действительные числа) и определяет принадлежность точки заштрихованной области, включая ее границы. Программист торопился и написал программу неправильно. Вот она:

var x,y: real; begin readln(x,y); if y>=x then if y>=0 then if y<=2-x*x then write('принадлежит') else write('не принадлежит') end.

Решение заданий С1(24)-2

Последовательно выполните следующее: 1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих различным областям (A, B, C, D, E, F и G). Точки, лежащие на границах областей, отдельно не рассматривать. 2. В столбцах условий укажите "да", если условие выполнится, "нет" если условие не выполнится, "—" (прочерк), если условие не будет проверяться, «не изв.», если программа ведет себя по-разному для разных значений, принадлежащих данной области. 3. Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы) .

Решение заданий С1(24)-2

Область A B C D E F G y>=x?

y>=0?

y<=2-x*x?

вывод верно?

Решение заданий С1(24)-2

Область y>=x? y>=0? y<=2-x*x?

A B

да да да нет нет –

C D E F G

нет нет да да нет – – да нет – – – да – –

вывод

не принадлежит – – – принадлежит – –

верно?

да нет нет нет да нет нет

var x,y: real; begin readln(x,y); if (y <=2-x*x) and ((y>=x) or (y>=0)) then write('принадлежит') else write('не принадлежит') end.

Особенности оценивания С2(25)

• • • • • Необходимо правильно

инициализировать

начальные значения)

ВСЕ

переменные (присваивать Необходимо обязательно

выводить ответ

Программа должна обрабатывать случай, когда

искомого числа нет в массиве

(если иное не указано) Если синтаксических ошибок в программе 2 или более – за

задание ставится 0 баллов Эффективность алгоритма не оценивается

Цель задания: Обработка массива (написать программу из 10 15 строк на языке программирования или алгоритм на естественном языке).

Особенности решения заданий С2(25)

• • • • Вначале опишите решение на русском языке Проверяйте выход индекса за границы массива

for i:=1 to N do begin if a[i] > a[i+1] then …

Верно присваивайте начальное значение, особенно в случае поиска произведения

P:=1; for i:=1 to N do begin p:=p*i;

Верно определяйте начальные значения переменных поиска max и min: min назначить запредельное максимальное или первый элемент массива

Решение заданий С2(25)-1

Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от –10 000 до 10000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести количество пар элементов массива, сумма которых • нечётна и положительна. Под парой подразумевается два подряд идущих элемента массива.

const N = 20;

Исходные данные объявлены так, как показано ниже.

var a: array [1..N] of integer;

Запрещается использовать

i, j, k: integer;

переменные, не описанные

begin

ниже, но использовать все

for i := 1 to N do

описанные переменные не

readln(a[i]);

обязательно.

...

end.

Решение заданий С2(25)-1

Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от –10 000 до 10000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести количество пар элементов массива, сумма которых нечётна и положительна.

k := 0; for i:=1 to N-1 do begin j := a[i]+a[i+1]; if (j > 0) and (j mod 2 <> 0) then k := k + 1 end; writeln(k);

Решение заданий С2(25)-2

Опишите на русском языке или одном из языков программирования алгоритм получения из заданного целочисленного массива размером 30 элементов другого массива, который будет содержать модули значений элементов первого массива (не используя специальной функции, вычисляющей модуль числа).

const N = 30; var a, b:array[1..N] of integer; i: integer; begin for i:=1 to N do read(a[i]); … end.

Решение заданий С2(25)-2

const N = 30; var a, b:array[1..N] of integer; i: integer; begin for i:=1 to N do { ввод всех элементов массива с клавиатуры } read(a[i]); for i:=1 to N do { формирование массива B } if a[i] < 0 then b[i]:= -a[i] else b[i]:= a[i]; for i:=1 to N do { вывод всех элементов массива B } write(b[i], ' '); end.

Решение заданий С2(25)-3

Дан массив, содержащий неотрицательные целые числа, не превышающие 10 000. Необходимо вывести: • минимальный чётный элемент, если количество чётных элементов не больше, чем нечётных; • минимальный нечётный элемент, если количество нечётных элементов меньше, чем чётных.

Например, для массива из шести элементов, равных соответственно 4, 6, 12, 17, 9, 8, ответом будет 9 – наименьшее нечётное число, поскольку нечётных чисел в этом массиве меньше.

const N=2000; var a: array [1..N] of integer; i, j, k, m: longint; begin for i:=1 to N do readln(a[i]); … end.

Решение заданий С2(25)-3

В этой задаче нам нужно подсчитать: – количество чётных элементов; – количество нечётных элементов; – максимальный чётный элемент; – максимальный нечётный элемент; Итого 5 переменных.

Заметим, что количество нечётных будет равно N минус количество чётных. Значит достаточно найти четные элементы.

Поскольку по условию все элементы неотрицательны, начальные значения для поиска максимальных элементов можно взять равными нулю (или отрицательными):

Решение заданий С2(25)-3

j:= 0; { количество чётных } k:=-1; { максимальный чётный } m:=-1; { максимальный нечётный } for i:=1 to N do begin if a[i] mod 2 = 0 then begin { если чётный } j:= j + 1; if a[i] > k then k:=a[i]; end else { если нечётный } if a[i] > m then m:=a[i]; end; if j >= N-j then { если чётных больше } writeln(k) else writeln(m); { если нечётных больше }

Решение заданий С2(25)-4

Дан целочисленный квадратный массив 10 х 10. Опишите на русском языке или на одном из языков программирования алгоритм вычисления суммы максимальных элементов из каждой строки. Напечатать значение этой суммы. Предполагается, что в каждой строке такой элемент единственный

const N=10; var A: array[1..N,1..N] of integer; i, k, max, Sum: integer; begin { ввод матрицы N на N } … end.

Решение заданий С2(25)-4

const N=10; var A: array[1..N,1..N] of integer; i, k, max, Sum: integer; begin { ввод матрицы N на N } Sum := 0; for i:=1 to N do begin max := A[i,1]; for k:=2 to N do if A[i,k] > max then max := A[i,k]; Sum := Sum + max; end; writeln(Sum); end.

Особенности оценивания С4(27)

• • • • Отсутствие описания работы алгоритма на естественном языке

не уменьшает баллы

, но облегчит работу эксперту Систематически повторяющаяся

ошибка принимается за одну

Задание С4 (27) разбивается на часть А и часть В. В части 27А необходимо написать

неэффективную

программу. В части 27В –

эффективную

.

В случае, если часть 27В не является эффективной, она

не будет засчитана

как неэффективная в части 27А Эффективность оценивается по времени и по памяти (или хотя бы по одной из этих характеристик).

Решение заданий С4(27)

Для заданной последовательности неотрицательных целых чисел необходимо найти максимальное произведение двух её элементов, номера которых различаются не менее чем на 8. Значение каждого элемента последовательности не превышает 1000. Количество элементов последовательности не превышает 10000.

Задача А (2 балла). Напишите на любом языке программирования программу для решения поставленной задачи, в которой входные данные будут запоминаться в массиве, после чего будут проверены все возможные пары элементов.

Задача Б (4 балла). Напишите программу для решения поставленной задачи, которая будет эффективна как по времени, так и по памяти (или хотя бы по одной из этих характеристик).

Решение заданий С4(27)

Вход Выход 10 2600

Программа считается эффективной по времени, если

100

время работы программы пропорционально

45

количеству элементов последовательности N, т.е. при

55 245

увеличении N в k раз время работы программы

35

должно увеличиваться не более чем в k раз.

25

Программа считается эффективной по памяти, если

10

размер памяти, использованной в программе для

13

хранения данных, не зависит от числа N и не

10 26

превышает 1 килобайта.

Входные данные представлены следующим образом. В первой строке задаётся число N – общее количество элементов последовательности. Гарантируется, что N > 8. В каждой из следующих N строк задаётся одно неотрицательное целое число – очередной элемент последовательности. Программа должна вывести одно число – описанное в условии произведение.

Решение заданий С4(27)-1A

Задача А. Сначала выделяем массив на максимальное возможное количество элементов (по условию – 10000), читаем все данные в массив:

var a: array[1..10000] of integer; readln(N); for i:=1 to N do read(a[i]);

Решение заданий С4(27)-1A

Теперь в двойном цикле (по переменным i и j) нужно рассмотреть все возможные пары элементов (a[i],a[j]), такие что j-i  8. Поэтому при выбранном значении меньшего индекса i второй индекс, j, будет изменяться от i+8 до N. В свою очередь, меньший индекс (i) будет изменяться от 1 до N-8:

max:= 0; for i:= 1 to N-8 do for j:= i+8 to N do if a[i]*a[j] > max then max := a[i]*a[j]; writeln(max); Такое решение «стоит» 2 балла

Решение заданий С4(27)-1B

Задача B. Можно ли не перебирать все пары? Оказывается, можно. Например, рассмотрим все пары, в которых второй элемент – это элемент с номером j: (a[i],a[j]). Поскольку все числа неотрицательны, из всех таких пар максимальное произведение имеет пара (m,a[j]), где m – максимальное из чисел a[1], …, a[j-8]. Такой максимум можно искать постепенно, добавляя в зону поиска следующий элемент массива, a[j-8], при рассмотрении нового значения j.

Решение заданий С4(27)-1B

Решение на 3 балла

(неэффективное по памяти, потому что все данные хранятся в массиве):

Вход Выход readln(N); for j:=1 to N do read(a[j]); max:= 0; m:= 0; for j:= 9 to N do begin if a[j-8] > m then m := a[j-8]; if m*a[j] > max then max := m*a[j]; end; writeln(max);

1 2 3 4 5 6 7 8 9 10 11

35 25 10 13 10 26 10 100 45 55 245 2600

Решение заданий С4(27)-1В

Улучшим программу по памяти – не будем хранить ВСЕ числа в массиве.

Читаем первые 8 чисел в массив, а затем читаем остальные данные (по одному числу):

for j:=1 to 8 do read(a[j]); for j:= 9 to N do begin read(x); { обработка x } end;

7 8 9 10 11 1 2 3 4 5 6

Вход Выход 10 25 10 13 10 26 100 45 55 245 35 2600 j A 1

10

2

100

3

45

4

55

5

245

6

35

7

25

8

10

13 10 26 x

Решение заданий С4(27)-1В

Код обработки введенного значения x: if a[1] > m then m := a[1]; if m*x > max then max := m*x;

После этого значение a[1] нам уже не нужно, мы сдвигаем весь массив влево на 1 элемент и записываем в конец массива только что полученное значение x:

for i:=1 to 7 do a[i]:=a[i+1]; a[8]:=x; j A A нов 1

10 100

2

100 45

3

45

4

55

5

245

6

35 55 245 35 25

7

25 10

8

10 13

13 10 26 x

Решение заданий С4(27)-1В

Решение на 4 балла: {ввод 8 элементов массива} max:= 0; m:= 0; for j:= 9 to N do begin read(x); if a[1] > m then m := a[1]; if m*x > max then max := m*x; for i:=1 to 7 do a[i]:=a[i+1]; a[8]:=x; end; writeln(max); end.