Пробное ЕГЭ. Рассудите пожалуйста.

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

В общем так, раз тут обсуждаются языки программирования, то напишу тут. Итак, писали по информатике пробное ЕГЭ. Теперь в чем суть вопроса-есть такая программа на Паскале:

Код: Выделить всё

Program C2;
const N=70;
var a:array [1..N] of Integer; i,m,j:Integer;
BEGIN
for i:=1 to N do
readln(a[i]);
.......
END.
Нужно её дописать таким образом, чтобы она искала наименьший положительный элемент в массиве, который не оканчивается на 7.
Я сделал это так:

Код: Выделить всё

Program C2;
const N=70;
var a:array [1..N] of Integer; i,m,j:Integer;
BEGIN
for i:=1 to N do
readln(a[i]);
m:=32767;
for i:=1 to N do
if((a[i]>0)and(a[i] mod 10<>7)and(a[i]<m))
then m:=a[i];
writeln(m);
END.
По идее, правильно. В Паскале максимальное значение для Integer равно 32767(см.ссылка).
Мне же поставили из 3 максимальных всего один. За что, собственно? Все же верно. :dont_know:
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3085
Зарегистрирован: Вт дек 25, 2012 14:51:33
Откуда: Санкт-Петербург

Сообщение a_klyuev »

Pika4u писал(а):...В Паскале максимальное значение для Integer равно 32767...
Вот за это и поставили. В современных системах Integer соответствует LongInt из приведенной ссылки.
Processor not found. Loaded software emulation ......
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

На будущее: максимальное значение переменной возвращает функция High().
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

Для Free Pascal это работает? И снизить за это не имеют права же?
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Реклама
Эиком - электронные компоненты и радиодетали
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина

Сообщение Tolmi »

Pika4u писал(а):Для Free Pascal это работает?
Проверил сейчас, да, всё работает в Free Pascal 2.6.0

А снизить могут от того, что использовал не такой алгоритм, как в школьной программе :(
У моего сына была аналогичная проблема. Пришлось пойти поговорить с учителем информатики. А когда я узнал, что на самом деле это учитель биологии и географии, и информатика у неё только по совместительству, вопросов у меня больше не было. :shock:
In theory, theory and practice are the same. In practice, they're not.
Контактная информация:
Реклама
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

о б-же :facepalm:
и что тебе мешало подойти к учителю и самому узнать, почему тебе столько поставили?
я бы тебе за быдлокод тоже снизил
Pika4u писал(а):m:=32767;
Pika4u писал(а):and(a<m))
then m:=a;
writeln(m);

:facepalm:

к тому же должны быть потом разборы заданий и ответы для сравнения

но не ссы, ты хоть сдал, а я уже бородатый дядька, 25 лет с паяльником, а электронику не сдал, ассемблер не сдал, электротехнику не сдал, архитектуру процессоров не сдал
абыдна, слющяй

Pika4u писал(а):В Паскале максимальное значение для Integer равно 32767

это если используется знак минус
в нормальных языках инт равен 65535, если не стоит signed int
тематические ответы только в форуме, в приват не пишите
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

Хм,а можете кинуть в меня примерчиком??? А то как не пытаюсь-не выходит. В гугле описаны примеры только для массивов.
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

Всем спасибо,получилось)В PascalABC-не вышло, а в Free Pascal-все норм))
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Друг Кота
Аватара пользователя
Сообщения: 3088
Зарегистрирован: Пт мар 09, 2007 15:01:52
Откуда: Биробиджан

Сообщение radteh »

А что тебе помешало присвоить m значение a[1], отпал бы вопрос про допустимый размер числа в переменной?
PS Постоянно приходилось объяснять и защищать свои алгоритмы и решения когда учился на программиста. Однажды меня препод убил фразой "USB параллельный интерфейс потому что к нему подключен сканер"
Друг Кота
Аватара пользователя
Сообщения: 6339
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

radteh писал(а):Однажды меня препод убил фразой "USB параллельный интерфейс потому что к нему подключен сканер"
Мой знакомый на работе нач. сектора ( не моего, к счастью ) на мое сомнение в правильности их программы мне заявил :
"Программа написана са языке Си, откомпилирована, следовательно, неправильной быть НЕ МОЖЕТ!"
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Все верно, программа правильная. Если скомпилировалась. А вот алгоритм по которому она работает... представляет особый интерес. А программа-то с точки зрения процессора очень даже правильная!

По сути вопроса - оценку могли снизить за использование "магической константы".
32767 - лишь изредка бывает максимальным значением INTEGER(вообще если заглядывать в учебник тип INTEGER напрямую связан с разрядностью системы и максимум 32767 будет только на 16-разрядной а нынче поголовно 32-х разрядные системы а собственно так называемая 64-разрядность это просто набор дополнительных инструкций процессора), а с математической точки зрения брать какое-то заранее определенное число для нахождения максимума/минимума - просто лишено смысла.

Везде учат что в таких случаях правильней взять любое число из исходных данных(да и вроде бы должно быть очевидно), самый удобный вариант - это как правило первое значение из массива. Тогда мы разом избавляемся от "магической константы", вероятного нежданчика и проходим исходные данные в цикле на 1 элемент меньше.

Ну и форматирование... не знаю как у вас, но у нас изначально учили использовать ОТСТУПЫ для разных уровней вложенности. За это запросто могли снизить оценку. Хотя конечно неизвестно как У ВАС устроена система оценки.
Контактная информация:
Открыл глаза
Сообщения: 69
Зарегистрирован: Сб июл 11, 2009 18:56:07
Откуда: Новосибирск. Академгородок

Сообщение кошка Муся »

Не буду придираться к оформлению и что макс integer 32768.

1 Подумайте, что выдаст прога, если все числа в массиве или неположительные, или оканчиваются на 7.
2 Не факт, что первое число массива -положительно
Друг Кота
Аватара пользователя
Сообщения: 3088
Зарегистрирован: Пт мар 09, 2007 15:01:52
Откуда: Биробиджан

Сообщение radteh »

Самый правильный способ это присвоить переменной m значение первого элемента массива и цикл гонять со следующего.
Открыл глаза
Сообщения: 69
Зарегистрирован: Сб июл 11, 2009 18:56:07
Откуда: Новосибирск. Академгородок

Сообщение кошка Муся »

radteh писал(а):Самый правильный способ это присвоить переменной m значение первого элемента массива и цикл гонять со следующего.
А если он отрицательный ?
Друг Кота
Аватара пользователя
Сообщения: 6339
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Alexeyslav писал(а): А программа-то с точки зрения процессора очень даже правильная!
Правильная программа по неправильному алгоритму - не могу согласиться. Существует понятие -- синтаксическая корректность и семантическая, смысловая. А у процессора нет точки зрения - он железный :) Если программа состоит из одного байта , который к тому же не входит в набор команд МК, он тупо по железному ее выпонит - пойдет по ресету.
Ладно, не будем разводить оффтоп. Сойдемся на констатации факта - и в нашем ремесле встречаются неадекваты.
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина

Сообщение Tolmi »

radteh писал(а):Самый правильный способ это присвоить переменной m значение первого элемента массива и цикл гонять со следующего.
А если он оканчивается на 7 ? :wink:
А если все элементы в массиве оканчиваются на 7 ?
А если первый элемент оканчивается на 7, а все остальные - отрицательные ? :tea:

Предложенный ТС вариант хорош тем, что он корректно обрабатывает "неправильные" входные данные. Только его нужно дополнить выводом сообщения, в случае, если 32767, то вывести "Ничего не было найдено". В рамках текущих среды и компиллятора задание выполнено правильно.
In theory, theory and practice are the same. In practice, they're not.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Господа, все понимают, что это учебная задача, и всё, что требуется - узнать у преподавателя, что именно требуется :)
Если бы мне на дали такое задание на работе, я бы решил тупо в лоб:

Код: Выделить всё

m:=a[1];
j:=0;
for i:=1 to N do
  if((a[i]>0)and(a[i] mod 10<>7)and(a[i]<m))
  then 
  begin    
    m:=a[i];
    inc j;
  end;
if j>0 then writeln(m) else writeln("Ты чё за хрень ввёл???")
END.
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

не будет работать. вот 2 простейших примера для N=2:
1. a[] = {-1, 3}
2. a[] = {3, -1}
что выдаст программа? правильно, "Ты чё за хрень ввёл???"

нужно 2 прогона цикла:
1. ищем первое, удовлетворяющее всем условиям число, или посылаем подальше, если не нашли.
2. ищем возможное другое, меньшее найденного в первом прогоне.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Да, так и есть. Это уже называется отладка :)))
Я просто для примера привёл.
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

но можно и в одном цикле, с дополнительной логикой. синтаксис паскаля не помню точно, вот на С как-то так:

Код: Выделить всё

m=a[0];
j=0;
for(i=0; i<N; i++)
{
  if(a[i]<=0 || (a[i]%10)==7) continue;
  if(j == 0)  
  {
     m=a[i]; 
     j=1;
  }
  else if(a[i] < m) m=a[i];
}
if(j) printf("%d\n",m);
else printf("Ты чё за хрень ввёл???\n");
Ответить

Вернуться в «Интеграция с ПК»