Форум » Массивы, сортировка, работа с файлами » C2, задачи №27 и №28; опечатки в №30 и №32 » Ответить

C2, задачи №27 и №28; опечатки в №30 и №32

Ion: 1. Не вполне понятно само условие задачи (не знаю, откуда она взялась). Должен ли сам первый элемент входить в среднеарифметическое? Непонятно. Я, перечитав несколько раз условие, решил, что не должен, и записал цикл в виде "for i:=2 to N do". А у Вас ("for i:=1 to N do") он может входить (если положителен). Если подобное разночтение возникнет на экзамене, то засчитают ли это в мою пользу? Конечно, понятно, что неоднозначность условия можно доказать на апелляции, но всё же... 2. Другая прореха в условии: это то, что "гарантируется, что первый элемент массива отличен от нуля", но нигде не указано, что элементы, кратные первому, вообще обязаны присутствовать в массиве. И при Вашем, и при моём решении, если первый элемент отрицателен и для него не находится ни одного кратного, то тогда мы в итоге поделим на ноль и программа вылетит... 3. Внешние операторные скобки begin-end (для цикла for) явно лишние: внутри содержится только один оператор if со своими внутренними begin-end. Программа идентично работает и при стёртых внешних операторных скобках. Хотя скобки лишними никогда не бывают, :-), но здесь они всё же несколько усложняют программу. Плюс к тому, вывод ответа на экран у Вас производится в экспоненциальной форме, но это, я так понимаю, никакой роли для С2 не играет.

Ответов - 10

Ion: До кучи вкину сюда ещё и задачу №28, следующую:min:= 9999; for i:=1 to N do begin if (a[ i] mod 2 <> 0) and (a[ i] mod 5 = 0) then if a[ i] < min then min:=a[ i]; end; writeln(min); end. На мой взгляд, решение какое-то чересчур усложнённое. Разве не элегантнее и проще сделать так? min:= 9999; for i:=1 to N do if (a[ i] mod 2 <> 0) and (a[ i] mod 5 = 0) and (a[ i] < min) then min:=a[ i]; writeln(min) end.

tavabar: Ion пишет: Должен ли сам первый элемент входить в среднеарифметическое? Непонятно. Почему же непонятно? В условии четко сказано: "ВСЕХ положительных элементов массива". Т. к. любое число кратно само себе, то в случае, если первый элемент будет положительным - его надо учитывать. Ion пишет: нигде не указано, что элементы, кратные первому, вообще обязаны присутствовать в массиве. В задачах С2 предполагается, что данные корректны (т. е. кратные первому существуют), в решении дополнительные проверки корректности введенных данных не проводятся. Ion пишет: если первый элемент отрицателен Анализируем ОСТАТОК ОТ ДЕЛЕНИЯ на этот отрицательный элемент, а не знак этого элемента.

Ion: tavabar пишет: Почему же непонятно? В условии четко сказано: "ВСЕХ положительных элементов массива". Т. к. любое число кратно само себе, то в случае, если первый элемент будет положительным - его надо учитывать. Не знаю. Перечитал ещё два раза. На мой взгляд, всё равно очень спорная и неоднозначная трактовка. Остаётся уповать на то, что важно написать сам алгоритм, а эти детали являются несущественными. В задачах С2 предполагается, что данные корректны (т. е. кратные первому существуют), в решении дополнительные проверки корректности введенных данных не проводятся. Да, но посмотрите последние задачи в блоке С2. Там буквально везде такие моменты оговариваются, например: "Опишите на русском языке или на одном из языков программирования алгоритм, позволяющий найти и вывести сумму элементов массива, кратных тринадцати. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого делится на тринадцать". "Опишите на русском языке или на одном из языков программирования алгоритм, позволяющий найти и вывести произведение элементов массива, которые имеют чётное значение и не оканчиваются на 0. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не оканчиваются на 0". "Опишите на русском языке или на одном из языков программирования алгоритм, позволяющий найти минимально трехзначное число, записанное в этом массива. Если такого числа нет, нужно вывести сообщение об этом". Опять же, гарантия на то, что первый элемент массива - не 0 - в тексте задачи есть, а про гарантии того, что существует ещё хотя бы один элемент, кратный первому - забыли... Именно забыли, потому что нигде не оговорено, что первый элемент обязан быть положительным. tavabar пишет: Анализируем ОСТАТОК ОТ ДЕЛЕНИЯ на этот отрицательный элемент, а не знак этого элемента. Я лишь просто имел в виду, что при отсутствии кратных первому элементу программа поделит на ноль и вылетит. Просто в версии Константина Юрьевича она вылетит только если первый элемент отрицателен (тогда делитель y=0 ни разу не увеличится; при положительном же первом элементе игрек сразу станет равным 1), а в моём варианте - "фатальный" элемент может быть и положительным тоже.


tavabar: Ion пишет: нигде не оговорено, что первый элемент обязан быть положительным. Он не обязан быть положительным. Остаток от деления на отрицательное число тоже существует. Ion пишет: делитель y=0 на ноль делить нельзя:) Наверное, вы имели ввиду значение счетчика...

Ion: tavabar пишет: Он не обязан быть положительным. Остаток от деления на отрицательное число тоже существует. Простите, но я не понимаю, что Вы хотите этим сказать. Введите программу, предложенную Константином Юрьевичем, для удобства сократите константу, скажем, до пяти-десяти, введите первый элемент отрицательным, а остальные - не кратные ему. Программа благополучно поделит на ноль и вылетит.

tavabar: Ion пишет: введите первый элемент отрицательным, а остальные - не кратные ему. А вы введите первый отрицательный, а какой-то последующий - кратный ему. Все будет работать.

Ion: В ответах к задаче №30 (всё то же С2) замечена опечатка: Решение на естественном языке. Записываем в переменную min начальное значение 1000. В цикле перебираем значения переменной i от 1 до N. Если значение очередного элемента массива a[ i] одновременно больше 99, меньше 1000 и меньше, чем текущее значение переменной min, записываем в переменную min значение a[ i]. После окончания цикла проверяем значение min: если оно равно 100, то выводим сообщение «Нет трёхзначных чисел», иначе выводим значение min. Очевидно, что тут упустили ещё один нолик - должна быть 1000. :-)

Ion: Ну и в задаче №32 тоже опечатка... Решение на естественном языке. Записываем в переменную p начальное значение 1. В цикле перебираем значения переменной i от 1 до N. Если значение очередного элемента массива a[ i] больше или равно 9, меньше или равно 99 и при делении на 6 даёт ненулевой остаток (все условия должны выполняться одновременно), умножаем переменную p на значение a[ i]. После окончания цикла выводим значение p. Тут десятка, конечно, должна стоять. :-)

Ion: tavabar пишет: А вы введите первый отрицательный, а какой-то последующий - кратный ему. Все будет работать. Само собой, будет. Я с этим нигде и не спорил.

Поляков: Ion пишет: 1. Не вполне понятно само условие задачи (не знаю, откуда она взялась). Должен ли сам первый элемент входить в среднеарифметическое? Как следует из условия, должен. 2. Другая прореха в условии: это то, что "гарантируется, что первый элемент массива отличен от нуля", но нигде не указано, что элементы, кратные первому, вообще обязаны присутствовать в массиве. Тут согласен. Простейший вариант уточнения задачи - сказать, что первый элемент массива заведомо положительный. Исправлено. 3. Внешние операторные скобки begin-end (для цикла for) явно лишние. Да, можно убрать. Задача 28. На мой взгляд, решение какое-то чересчур усложнённое. Разве не элегантнее и проще сделать так? [pre2]min:= 9999; for i:=1 to N do if (a[ i] mod 2 <> 0) and (a[ i] mod 5 = 0) and (a[ i] < min) then min:=a[ i]; writeln(min) end.[/pre2] Согласен. Хотя вариант равноценный. Спасибо за замеченные опечатки, они исправлены.



полная версия страницы