Раздел:
Домашние задания
В блог
Подписаться на Дзен!
Отвечать в конференциях и заводить новые темы может любой участник, независимо от наличия регистрации на сайте 7я.ру.
Учителям информатики вопросик ))
Задача:
Дана последовательность из n различных чисел.
Найти сумму её членов, расположенных между максимальным и минимальным значениями
в сумму включить и оба этих числа)
Наша программа:
const n=10;
var
a:array[1..n] of integer;
i, imax, imin: byte;
max, min, sum: integer;
begin
for i:=1 to n do begin
a[i]:=random(100)-50;
write(a[i]:4)
end;
writeln;
max:=-10000; min:=10000; sum:=0;
for i:=1 to n do begin
if a[i]>max then begin max:=a[i]; imax:=i end;
if a[i] end;
{writeln('Максимальное значение = ',max:2, ', порядковый номер = ',imax:2);
writeln('Минимальное значение = ',min:2, ', порядковый номер = ',imin:2);}
if imax>imin then
for i:=imin to imax do
sum:=sum+a[i]
else for i:=imin downto imax do
sum:=sum+a[i];
writeln(' Сумма элементов = ',sum)
end.
Суть вопроса: учитель пишет замечание:
в сумме ошибка:
for i:=imin downto imax do должно быть for i:=imax to imin do
С замечанием я согласна, так тоже можно, но наш то вариант чем хуже, если программа работает правильно?
12.12.2016 00:31:39, alina_akulina
22 комментария
Понятно, что алгоритм с ошибкой - вот в →
Понятно, что алгоритм с ошибкой - вот в этом месте:
if a[i] end;
должно быть if a[i] < min ... end.
То, что вы сейчас написали вообще не компилируется, ибо синтаксически неверно. Может быть при вставке в форум часть кода потерялась?
Что касается конкретной замены "for i:=imin downto imax do должно быть for i:=imax to imin do" - это не ошибка, а вкусовщина. Думаю, что просто преподавателю не нравится цикл с шагом -1, он считает, что лучше цикл с шагом 1. Конкретно это место - совершенно глупая придирка, я бы за такое не стал бы даже замечание писать школьнику (у меня бывают варианты "принято", "принято, но с замечанием", "не принято").
А вот отсутствие фрагмента кода в начале - это уже серьёзно, это, конечно же, "не принято".
12.12.2016 23:16:35, dk
спасибо огромное за ответ! Действительно, часть программы потерялась при копировании, поскольку на работе паскаль не стоит, и пришлось танцы с бубнами совершать )) А шагом -1 хотела показать ребенку и такой вариант реализации, похоже, что перестаралась )) А вкусовщина это плохо, как я понимаю, в среде программистов?
Программа в сообщение действительно вставляется неправильно, попыталась еще раз, такая же ошибка с потерей части кода ((
13.12.2016 00:39:44, alina_akulina
Рискну предположить, что программа →
Рискну предположить, что программа написана для частного случая.
Алгоритм поиска максимального и минимального значения не реализован.
Сначала присваиваете максимуму и минимуму первый элемент
max = a[1]; imax = 1;
min = a[1]; imin = 1;
и погнали по циклу, сравнивать если значение больше max обновляем значение мах и imax, если меньше min обновляем значение min и imin.
по окончанию цикла у вас max максимальное значение в imax его позиция. а в min -минимальное и в imin его позиция.
Ну а далее считаем еще одним циклом сумму между позициями.
Ошибка в том, что начальное значение вы проинициализировали каким-то числом. Можно подобрать последовательность чисел на которой программа не сработает. Но по-скольку, вы задаете ее сами и там есть ограничение на те числа которые попадают у вас в последовательность, ваша программа исправно работает для частного случая.
12.12.2016 16:23:42, кхм
вряд ли. По данным вопросам замечаний нет. Значит такая ограниченная реализация задачи ее устроила, я полагаю? Как будет выглядеть цикл суммирования в вашем варианте?
12.12.2016 17:33:54, alina_akulina
В вашей реализации есть ошибки. Допустим вы не точно ее набили, пропустив половину. Отсутствует часть кода про нахождения минимума.
Но ход мысли можно уловить. Потом вы легко соглашаетесь с замечанием, хотя оно мне как раз непонятно.
Я вам говорю, что алгоритм поиска максимума и минимума реализован для частного случая, и на мой взгляд это действительно то, что здесь имеет место быть. Вы говорите фигня у меня все работает.
Ваша программа не будет работать, если будет последовательность чисел -10001 -10002 -10003
Она просто не найдет максимум. И в переменной imax будет лежать мусор. и дальше когда попытаетесь найти сумму программа "упадет".
У вас все работает потому что вы заполняете массив числами в диапазоне -50 до 50.
Замечание учителя не принципиально: то что предлагает учитель эквивалентно тому, что написано у вас. допустим imax= 3 а imin = 5. Мы попадаем во оператор "else"
от 5 вниз до 3 (ваш вариант) эквивалентно от 3 вверх до 5 (предлагает учитель).
Если бы я была учителем информатики, а я им не являюсь, но имею представление о предмете далеко неповерхностное. Я бы не приняла такую программу
именно из-за того, что она работает только в частном случае. Когда диапазон чисел от -10000 до 10000. Для меня бы это
был нереализованные алгоритм поиска максимума и минимума на массиве чисел. К остальному я бы придираться не стала. Даже закрыла бы может глаза на пропуск части кода.
Что имеет в виду ваш учитель фиг его знает. Но алгоритм с недочетом. Достаточно принципиальным имхо.
12.12.2016 22:32:01, кхм
Если бы я легко согласилась, то этого топа бы здесь не было. Вариант учителя тоже правильный, почему я его должна оспаривать? Меня больше интересовало, что неправильно в моем. Мой уровень знаний по информатике находится на минимальном уровне, поэтому меня все время терзают сомнения. Но чем дальше я ее изучаю и контактирую с учителем посредством ребенка, тем больше у меня накапливается недоуменных вопросов. Я с вами согласна, что программа реализована для частного случая, когда значения не превышают диапазон плюс/минус 10000. Никакие данные пользователь вручную не вводит, массив заполняется рандомом, в диапазоне, заведомо меньшем чем максимальные и минимальные значения. И для этого случая программа работает. На их уровне обучения к ним не предъявляют таких высоких требований. Когда я в других программах пыталась реализовать защиту от дурака и вводила ряд дополнительных проверок на случай, а вдруг пользователь ошибется и введет не те значения, нам было сказано что это лишнее и тоже снижалась оценка. Поэтому теперь я стараюсь не извращаться, а снисхожу до уровня детей на данном этапе обучения, тем более что я сама еще чайник )) Хотя бы для того, чтобы учителю не пришла мысль в голову, что ребенок пишет программы не сам. И раз учитель ничего не написал по поводу ограниченного функционала, значит это ее вполне устроило, но ведь замечание то относилось к другому. Другой разговор, что в процессе копирования кода, когда я его вставляла в сообщение, произошла какая то ерунда и программа вставилась искаженно ((
13.12.2016 00:50:03, alina_akulina
Странные у Вас игры с учителями, ей-богу. Этому тоже объяснять будете, как математику и физику, как детей правильно учить?
13.12.2016 09:15:23, тупик
я не знала, что это политика у мамы такая. Не стала бы ввязываться тогда и что-то пытаться объяснить.
13.12.2016 10:22:39, кхм
Это приблизительно как вас просят доказать теорему для всех прямоугольных треугольников, а вы ее доказываете для треугольника со сторонами 3,4,5. А потом говорите ну доказано ж.
12.12.2016 22:43:17, кхм
Странное исправление, правда. Я не →
Странное исправление, правда. Я не учитель информатики, но рискну предположить, что downto "ещё не проходили", а учитель требует использовать то, что объясняли на уроке...
12.12.2016 14:13:43, Пецилия
проходили. Цикл for проходят в связке to/downto
12.12.2016 14:58:22, alina_akulina
Я не учитель информатики. Но между →
Я не учитель информатики. Но между максимальным и минимальным и членами последовательности, особенно если включить в сумму эти значения, находятся ВСЕ члены последовательности...
12.12.2016 12:37:12, AleXXX
Напрасно Вы придираетесь. Написано же, что найти сумму элементов, РАСПОЛОЖЕННЫХ между максимумом и минимумом. По-моему, всё абсолютно ясно.
12.12.2016 14:07:09, Пецилия
4,5 и 6 расположены между 2 и 9.
13.12.2016 00:25:07, AleXXX
:)) Я тоже очень долго втыкалась в условие задачи. У максимального и минимального значения есть порядковый номер в массиве. Просуммировать надо все элементы, стоящие в массиве между макс и мин
12.12.2016 13:01:31, alina_akulina
Им сначала русский изыг освоить надо, а потом за информатику брацца. Это школьная задачка?
12.12.2016 13:32:14, AleXXX
я тоже бешусь порой от формулировок задач по информатике. Иной раз на осознание условий задачи уходит столько же времени, сколько и на написание программы )) Наверное надо иметь специфическое мышление в этой сфере. 9 класс
12.12.2016 13:43:52, alina_akulina
Правильно поставленная задача - уже на 70% созданный алгоритм. Поэтому они и извращаются.
12.12.2016 13:51:22, AleXXX
Один из уважаемых в среде хакеров →
Один из уважаемых в среде хакеров человек, Эрик Реймонд, как-то написал текст "Как правильно задавать вопросы". Текст годится не только для технических обсуждений.
Один из пунктов этого текста - "Не просите людей отвечать вам на личный адрес электронной почты"
[ссылка-1]
12.12.2016 09:45:23, dk
Прелестно :)
12.12.2016 12:03:49, Люба С.
Я встречался ещё с одной интерпретацией того же.
Обсуждение проблемы в форуме, конференции - это форма самовыражения (Эрик Реймонд называет это "получение вознаграждения").
Ответ "в личку" - это техподдержка. Техподдержка, в отличии от самовыражения, стоит денег. Ибо это помощь лично вам в решении лично ваших проблем.
12.12.2016 23:48:11, dk
Замечание принято )) Не хотела засорять конфу программными кодами и специфичными беседами. Здесь все больше по общим вопросам образования общаются. насколько я заметила. А кибер-форум я пока не тяну, желающих помочь много, а понять у кого оптимальный вариант мне пока тяжело (( Да и предлагаемые зачастую варианты решения совсем не на уровне 9 класса.
12.12.2016 09:58:04, alina_akulina