В общем так, раз тут обсуждаются языки программирования, то напишу тут. Итак, писали по информатике пробное ЕГЭ. Теперь в чем суть вопроса-есть такая программа на Паскале:
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 максимальных всего один. За что, собственно? Все же верно.
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Проверил сейчас, да, всё работает в Free Pascal 2.6.0
А снизить могут от того, что использовал не такой алгоритм, как в школьной программе
У моего сына была аналогичная проблема. Пришлось пойти поговорить с учителем информатики. А когда я узнал, что на самом деле это учитель биологии и географии, и информатика у неё только по совместительству, вопросов у меня больше не было.
In theory, theory and practice are the same. In practice, they're not.
о б-же
и что тебе мешало подойти к учителю и самому узнать, почему тебе столько поставили?
я бы тебе за быдлокод тоже снизил
Pika4u писал(а):m:=32767;
Pika4u писал(а):and(a<m))
then m:=a;
writeln(m);
к тому же должны быть потом разборы заданий и ответы для сравнения
но не ссы, ты хоть сдал, а я уже бородатый дядька, 25 лет с паяльником, а электронику не сдал, ассемблер не сдал, электротехнику не сдал, архитектуру процессоров не сдал
абыдна, слющяй
Pika4u писал(а):В Паскале максимальное значение для Integer равно 32767
это если используется знак минус
в нормальных языках инт равен 65535, если не стоит signed int
тематические ответы только в форуме, в приват не пишите
А что тебе помешало присвоить m значение a[1], отпал бы вопрос про допустимый размер числа в переменной?
PS Постоянно приходилось объяснять и защищать свои алгоритмы и решения когда учился на программиста. Однажды меня препод убил фразой "USB параллельный интерфейс потому что к нему подключен сканер"
radteh писал(а):Однажды меня препод убил фразой "USB параллельный интерфейс потому что к нему подключен сканер"
Мой знакомый на работе нач. сектора ( не моего, к счастью ) на мое сомнение в правильности их программы мне заявил :
"Программа написана са языке Си, откомпилирована, следовательно, неправильной быть НЕ МОЖЕТ!"
Все верно, программа правильная. Если скомпилировалась. А вот алгоритм по которому она работает... представляет особый интерес. А программа-то с точки зрения процессора очень даже правильная!
По сути вопроса - оценку могли снизить за использование "магической константы".
32767 - лишь изредка бывает максимальным значением INTEGER(вообще если заглядывать в учебник тип INTEGER напрямую связан с разрядностью системы и максимум 32767 будет только на 16-разрядной а нынче поголовно 32-х разрядные системы а собственно так называемая 64-разрядность это просто набор дополнительных инструкций процессора), а с математической точки зрения брать какое-то заранее определенное число для нахождения максимума/минимума - просто лишено смысла.
Везде учат что в таких случаях правильней взять любое число из исходных данных(да и вроде бы должно быть очевидно), самый удобный вариант - это как правило первое значение из массива. Тогда мы разом избавляемся от "магической константы", вероятного нежданчика и проходим исходные данные в цикле на 1 элемент меньше.
Ну и форматирование... не знаю как у вас, но у нас изначально учили использовать ОТСТУПЫ для разных уровней вложенности. За это запросто могли снизить оценку. Хотя конечно неизвестно как У ВАС устроена система оценки.
Alexeyslav писал(а): А программа-то с точки зрения процессора очень даже правильная!
Правильная программа по неправильному алгоритму - не могу согласиться. Существует понятие -- синтаксическая корректность и семантическая, смысловая. А у процессора нет точки зрения - он железный Если программа состоит из одного байта , который к тому же не входит в набор команд МК, он тупо по железному ее выпонит - пойдет по ресету.
Ладно, не будем разводить оффтоп. Сойдемся на констатации факта - и в нашем ремесле встречаются неадекваты.
radteh писал(а):Самый правильный способ это присвоить переменной m значение первого элемента массива и цикл гонять со следующего.
А если он оканчивается на 7 ?
А если все элементы в массиве оканчиваются на 7 ?
А если первый элемент оканчивается на 7, а все остальные - отрицательные ?
Предложенный ТС вариант хорош тем, что он корректно обрабатывает "неправильные" входные данные. Только его нужно дополнить выводом сообщения, в случае, если 32767, то вывести "Ничего не было найдено". В рамках текущих среды и компиллятора задание выполнено правильно.
In theory, theory and practice are the same. In practice, they're not.
Господа, все понимают, что это учебная задача, и всё, что требуется - узнать у преподавателя, что именно требуется
Если бы мне на дали такое задание на работе, я бы решил тупо в лоб:
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.
не будет работать. вот 2 простейших примера для N=2:
1. a[] = {-1, 3}
2. a[] = {3, -1}
что выдаст программа? правильно, "Ты чё за хрень ввёл???"
нужно 2 прогона цикла:
1. ищем первое, удовлетворяющее всем условиям число, или посылаем подальше, если не нашли.
2. ищем возможное другое, меньшее найденного в первом прогоне.