Личный кабинет

Задача C4: за что снижают баллы

За что снижают баллы при решении задач C4
Станислав Михалкович ( Пользователь )
Уважаемые коллеги!
Мы сейчас переписываем свою книгу "Информатика ЕГЭ шаг за шагом".
Вот в чем мой вопрос. По слухам за задачу C4 снижают 1 балл, если вначале информация считывается по строкам, а потом эти строки разбираются. Если же считывание сразу посимвольное и почисловое, то это считается правильным.

Начало постановки задачи.
В первой строке вводится количество записей об учениках. Каждая запись вводится на отдельной строке и представляет собой имя, фамилию, балл ЕГЭ, год.


То есть, решение
Код
var
  N,i,num,year: integer;
  c: char;
  abitur: array [1990..2010] of integer;
  
begin
  Assign(input,'a.txt');
  readln(N);
  for i:=1 to N do
  begin
    repeat
      read(с)
    until c = ' ';
    repeat
      read(с)
    until c = ' ';
    read(num);
    readln(year);    
    abitur[year] := abitur[year] + 1;
  end;
  writeln(Milliseconds);
end.

считается эффективным, а решение

Код
var
  N,i: integer;
  c: char;
  abitur: array [1990..2010] of integer;
  p,year: integer;
  s,syear: string;
  
begin
  Assign(input,'a.txt');
  Reset(input);
  readln(N);
  for i:=1 to N do
  begin
    readln(s);
    p := 1;
    while s[p]<>' ' do
      p := p+1;
    p := p+1;
    while s[p]<>' ' do
      p := p+1;
    p := p+1;
    while s[p]<>' ' do
      p := p+1;
    syear := Copy(s,p+1,1000);
    year := StrToInt(syear);
    abitur[year] := abitur[year] + 1;
  end;
  writeln(Milliseconds);
end.

- неэффективным, и за него снимается 1 балл.

Может ли кто-то прокомментировать эту ситуацию? Действительно ли это так? Если так, то я выкидываю из книги решение с разбором строки.

Задам здесь также еще 2 вопроса, хотя они имеют отношение к снижению баллов лишь косвенно.

Второй вопрос связан с тем, как школьнику надо мотивировать использование в коде функции StrToInt? Надо ли ему указывать версию Паскаля, и если да, то в каком формате?

Третий вопрос связан с описанием функций. Начиная с Delphi первой версии в функциях используется переменная Result:
Код
function Sum(a,b: integer): integer;
begin
  Result := a + b;
end;


Не хотелось бы использовать старый стиль:
Код
function Sum(a,b: integer): integer;
begin
  Sum := a + b;
end;

- он сильно устарел.
Не будет ли придирок при использовании нового стиля? Как школьнику мотивировать использование этого стиля?
Михаил Густокашин ( Пользователь )
вот эта конструкция:
Код
repeat
    readln(N)
until c = ' ';

вообще работать не должна.
В целом мне обе программы кажутся неправильными с точки зрения ЕГЭ. Надо было считывать число как число, а текст посимвольно.
Да и неактуально это уже, в демо-2012 предлагают читать сразу целую строку.
Серж Андреев ( Пользователь )
С точки зрения "профессионального" программирования, в первом решении допущена "грубая" ошибка - нет проверки на конец файла. Я бы такого "программера" отправил бы доучиваться )))
Станислав Михалкович ( Пользователь )
Цитата (Серж Андреев, 17.09.2011, 10:16) <{POST_SNAPBACK}>
С точки зрения "профессионального" программирования, в первом решении допущена "грубая" ошибка - нет проверки на конец файла. Я бы такого "программера" отправил бы доучиваться )))

С точки зрения профессионального программирования решение задач ЕГЭ - абсурд - не будем это уточнять.
Там в условии сказано, что в первой строчке задается количество вводимых данных, а затем вводится ровно столько строчек. Не говорится, что данные будут считываться из файла - это я чтобы можно было обсуждать производительность.

Цитата (Михаил Густокашин, 17.09.2011, 09:58) <{POST_SNAPBACK}>
вот эта конструкция:
Код
repeat
    readln(N)
until c = ' ';

вообще работать не должна.
В целом мне обе программы кажутся неправильными с точки зрения ЕГЭ. Надо было считывать число как число, а текст посимвольно.
Да и неактуально это уже, в демо-2012 предлагают читать сразу целую строку.

Виноват - это я код правил вручную - форум заменяет некоторые символы на знак копирайта. Исправил.

В первой программе именно так: текст считывается посимвольно. Там - имя и фамилия.

И - поподробнее, несмотря на "неактуально", нельзя ли - почему неправильно?
Михаил Густокашин ( Пользователь )
Цитата (Михалкович Станислав, 17.09.2011, 10:31) <{POST_SNAPBACK}>
В первой программе именно так: текст считывается посимвольно. Там - имя и фамилия.
И - поподробнее, несмотря на "неактуально", нельзя ли - почему неправильно?

Без условия задачи и с неправильным исходником было сложно разобраться. Да и сейчас непросто.
Денис Кириенко ( Пользователь )
Цитата (Михалкович Станислав, 17.09.2011, 09:40) <{POST_SNAPBACK}>
По слухам за задачу C4 снижают 1 балл, если вначале информация считывается по строкам, а потом эти строки разбираются. Если же считывание сразу посимвольное и почисловое, то это считается правильным.


Не слушайте слухи, а читайте критерии оценивания.

В некоторых типах задач С4 за считывание строки целиком снижается один балл, в некоторых - не снижается.

Требование посимвольного считывания появляется только в тех задачах, в которых строки могут быть большими и нет необходимости сохранять все считанные строки в памяти.

Например, в задачах 2011 года (смотрите проект демо-версии 2012 года http://fipi.ru/binaries/1171/infEGE-2012.zip)
данные можно читать построчно, именно так сделано в авторском решении и в критериях оценивания баллы не снижаются за построчное чтение (баллы снижаются только если ВСЕ входные данные целиком сохраняются в памяти).

В задачах 2010 года (смотрите демо-версию 2011 года http://fipi.ru/binaries/1079/inf_10_11_10.zip, задача про числа-палиндромы) программа получает на вход строку, которая может быть очень длинной, но для решения задачи не требуется всю строку целиком сохранять в памяти, достаточно посимвольное считывание с подсчетом числа встретившихся символов. В условии задачи сказано, что необходимо написать эффективную, в том числе и по используемой памяти, программу. Соответственно, в критериях оценивания предусмотрено снижение оценки на 1 балл, если программа верная, но вся строка сохраняется в памяти целиком. Этот балл снижается только для правильного решения, если решение содержит ошибки (т.е. уже не может быть оценено в 3 балла), то эффективность вообще не учитывается. Например, если задача оценивается в 2 балла из-за наличия в ней ошибок, то дополнительное снижение балла за неэффективность не проивзодится.

В более старых задачах, например, в задачах 2009 года, посимвольное считывание требовалось для того, чтобы разделить входную строку на текст и число, например, отделить название улицы, марку бензина и его стоимость. В программе на Паскале для этого требуется посимвольное считывание с поиском пробелов, в программах на C++ можно читать стандартными средствами: строка, затем два числа. Если одна строка считывается в память целиком, затем анализируется, то баллы за это не снижаются, но если целиком считывается весь входной файл (или запоминаются данные обо всех бензозаправках), то оценка снижается.

Цитата
Второй вопрос связан с тем, как школьнику надо мотивировать использование в коде функции StrToInt? Надо ли ему указывать версию Паскаля, и если да, то в каком формате?


Просто перед текстом решения написать - "Используется язык программирования такой-то, версия такая-то". После этого можно пользоваться всеми стандартными средствами языка программирования.

Цитата
Не будет ли придирок при использовании нового стиля? Как школьнику мотивировать использование этого стиля?

Если это допускается синтаксисом используемого языка программирования - то придирок быть не должно, если указан точно язык программирования. Но естественно вопрос "будут или нет придирки" можно адресовать только конкретной региональной проверяющей комиссии - их самодурство и самоуправство зачастую непредсказуемо.
Станислав Михалкович ( Пользователь )
Ну вот, вроде и начало постановки задачи написал :)

Цитата (Денис Кириенко, 17.09.2011, 10:44) <{POST_SNAPBACK}>
Не слушайте слухи, а читайте критерии оценивания.

В некоторых типах задач С4 за считывание строки целиком снижается один балл, в некоторых - не снижается.

Требование посимвольного считывания появляется только в тех задачах, в которых строки могут быть большими и нет необходимости сохранять все считанные строки в памяти.

В более старых задачах, например, в задачах 2009 года, посимвольное считывание требовалось для того, чтобы разделить входную строку на текст и число, например, отделить название улицы, марку бензина и его стоимость. В программе на Паскале для этого требуется посимвольное считывание с поиском пробелов, в программах на C++ можно читать стандартными средствами: строка, затем два числа. Если одна строка считывается в память целиком, затем анализируется, то баллы за это не снижаются, но если целиком считывается весь входной файл (или запоминаются данные обо всех бензозаправках), то оценка снижается.


Да, спасибо. Очень четко. Тогда - Ваша конкретная рекомендация. Книга - хорошая или плохая - так или иначе продаётся по России. Хотелось бы, чтобы информация, приведенная в ней, не привела бы к снижению баллов ни в какой комиссии по ЕГЭ.

Итак, фиксирую: разбор одной строки, если она не очень длинная, не приводит к снижению баллов. То есть, можно тогда и такое решение приводить - свободно:

Код
  readln(N);
  for i:=1 to N do
  begin
    readln(s);
    p := Pos(' ',s);
    p := PosEx(' ',s,p+1);
    p := PosEx(' ',s,p+1);
    syear := Copy(s,p+1,1000);
    year := StrToInt(syear);    
    abitur[year] := abitur[year] + 1;
  end;


И за это балл не будет снижен.

И - попутный вопрос: как всё-таки поточнее сказать, почему можно пользоваться такими средствами как StrToInt, PosEx и Result у функции? Еще раз повторю, что это нужно для формулировки в книге. В книге мы описывали только один язык - Паскаль, поэтому рекомендации относительно других языков не интересуют.

Собственно, задняя мысль проста. Я смело могу написать, что используется PascalABC.NET версии 1.7 - в нём всё будет работать без подключения дополнительных модулей. А вот в Delphi и FreePascal потребуется писать дополнительные строки. Но упоминание PascalABC.NET 2 года назад на ЕГЭ стоило одной нашей воспитаннице по меньшей мере -1 балла ЕГЭ на местной комиссии.
Денис Кириенко ( Пользователь )
Цитата (Михалкович Станислав, 17.09.2011, 10:55) <{POST_SNAPBACK}>
Хотелось бы, чтобы информация, приведенная в ней, не привела бы к снижению баллов ни в какой комиссии по ЕГЭ.


Еще раз повторяю - экзаменационные комиссии обязаны действовать в рамках критериев оценивания и методических рекомендаций, однако поскольку проведением ЕГЭ занимается регион и проверкой заданий занимается регион, то фактически никакого контроля над деятельностью региональных предметных комиссий нет. К сожалению, компетентность предметных комиссий в некоторых регионах вызывает большие сомнения и гарантировать здесь ничего нельзя.

Цитата
И - попутный вопрос: как всё-таки поточнее сказать, почему можно пользоваться такими средствами как StrToInt, PosEx и Result у функции? Еще раз повторю, что это нужно для формулировки в книге. В книге мы описывали только один язык - Паскаль, поэтому рекомендации относительно других языков не интересуют.


Формально - если вы пишите книгу с описанием решений только на одном языке - Паскале, то никаких StrToInt, PosEx, Result быть не может. Ибо в языке программирования Паскаль (естественно, под словом Паскаль мы подразумеваем то, что придумал Вирт и что зафиксировано соответствующими стандартами, а не последующие придумки каких-либо иных сторонних разработчиков) ничего подобного нет.

Если вы хотите использовать данные функции - напишите, какая конкретно реализация имеется в виду, чтобы не было никаких формальных претензий.

Из своего опыта работы на апелляции (конечно, не дословно, но суть сохранена):
Комиссия: "Вы не инициализировали переменные, это ошибка".
Школьник: "А они всегда нулями инициализируются"
Комиссия: "С чего вы это взяли? Это не так"
Школьник: "Ну я всегда когда пишу программу, у меня переменные инициализируются нулями"
Комиссия: "Какой средой вы пользуетесь?"
Школьник: "Turbo Pascal"
Комиссия: "Вот вы должны были написать, на каком языке вы пишите в своей работе. Вы это не сделали, поэтому мы не можем предполагать, что это Turbo Pascal. По виду программы мы догадались, что это язык Pascal, но поскольку вы не указали, какой именно вариант Pascal имеется в виду, то мы исходим из того, что это классический паскаль, соответствующий стандарту языка. Вы уверены, что в стандарте языка Паскаль оговорено, что переменные инициализируются нулями?"
Школьник: "Нет"

Цитата
Но упоминание PascalABC.NET 2 года назад на ЕГЭ стоило одной нашей воспитаннице по меньшей мере -1 балла ЕГЭ на местной комиссии.


Я же говорю - самодурство региональных комиссий непредсказуемо. И управы на них нет - кроме как убеждениями-разговорами или жалобами в Рособрнадзор.
Серж Андреев ( Пользователь )
Цитата (Михалкович Станислав, 17.09.2011, 11:31) <{POST_SNAPBACK}>
С точки зрения профессионального программирования решение задач ЕГЭ - абсурд - не будем это уточнять.

Там в условии сказано, что в первой строчке задается количество вводимых данных, а затем вводится ровно столько строчек. Не говорится, что данные будут считываться из файла - это я чтобы можно было обсуждать производительность.


Ну не совсем. По крайней мере сама по себе задача вполне практически может существовать.

А вот по поводу условия и решения, то я основывался на вашем коде:
Цитата
Assign(input,'a.txt');
readln(N);


Т.к. я, собственно, не знаю, что это за диалект паскаля, то не могу знать, нужен ли там reset(input), но 'a,.txt' - это в лбом случае файл. А что там дальше написано - к этому коду как-то мало относится, конечно...
Дмитрий Изергин ( Пользователь )
Цитата (Михалкович Станислав, 17.09.2011, 10:55) <{POST_SNAPBACK}>
Код
function Sum(a,b: integer): integer;
  readln(N);
  for i:=1 to N do
  begin
    readln(s);
    p := Pos(' ',s);
    p := PosEx(' ',s,p+1);
    p := PosEx(' ',s,p+1);
    syear := Copy(s,p+1,1000);
    year := StrToInt(syear);    
    abitur[year] := abitur[year] + 1;
  end;
Станислав Станиславович , при всем уважении - код жуткий.

На мой взгляд, будет большей ошибкой помещать его в учебник. Функция "плохо" сформирована+ использование глобальной переменной без необходимости.

footer logo © Образ–Центр, 2018. 12+