Автор | Сообщение |
|
Отправлено: 24.06.12 08:01. Заголовок: C2, задачи №27 и №28; опечатки в №30 и №32
1. Не вполне понятно само условие задачи (не знаю, откуда она взялась). Должен ли сам первый элемент входить в среднеарифметическое? Непонятно. Я, перечитав несколько раз условие, решил, что не должен, и записал цикл в виде "for i:=2 to N do". А у Вас ("for i:=1 to N do") он может входить (если положителен). Если подобное разночтение возникнет на экзамене, то засчитают ли это в мою пользу? Конечно, понятно, что неоднозначность условия можно доказать на апелляции, но всё же... 2. Другая прореха в условии: это то, что "гарантируется, что первый элемент массива отличен от нуля", но нигде не указано, что элементы, кратные первому, вообще обязаны присутствовать в массиве. И при Вашем, и при моём решении, если первый элемент отрицателен и для него не находится ни одного кратного, то тогда мы в итоге поделим на ноль и программа вылетит... 3. Внешние операторные скобки begin-end (для цикла for) явно лишние: внутри содержится только один оператор if со своими внутренними begin-end. Программа идентично работает и при стёртых внешних операторных скобках. Хотя скобки лишними никогда не бывают, :-), но здесь они всё же несколько усложняют программу. Плюс к тому, вывод ответа на экран у Вас производится в экспоненциальной форме, но это, я так понимаю, никакой роли для С2 не играет.
|
|
|
Ответов - 10
[только новые]
|
|
|
Отправлено: 24.06.12 08:25. Заголовок: До кучи вкину сюда е..
До кучи вкину сюда ещё и задачу №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. |
|
|
|
|
|
| постоянный участник
|
Сообщение: 100
|
|
Отправлено: 24.06.12 08:44. Заголовок: Ion пишет: Должен л..
Ion пишет: цитата: | Должен ли сам первый элемент входить в среднеарифметическое? Непонятно. |
| Почему же непонятно? В условии четко сказано: "ВСЕХ положительных элементов массива". Т. к. любое число кратно само себе, то в случае, если первый элемент будет положительным - его надо учитывать. Ion пишет: цитата: | нигде не указано, что элементы, кратные первому, вообще обязаны присутствовать в массиве. |
| В задачах С2 предполагается, что данные корректны (т. е. кратные первому существуют), в решении дополнительные проверки корректности введенных данных не проводятся. Ion пишет: цитата: | если первый элемент отрицателен |
| Анализируем ОСТАТОК ОТ ДЕЛЕНИЯ на этот отрицательный элемент, а не знак этого элемента.
|
|
|
|
Отправлено: 24.06.12 09:31. Заголовок: tavabar пишет: Поче..
tavabar пишет: цитата: | Почему же непонятно? В условии четко сказано: "ВСЕХ положительных элементов массива". Т. к. любое число кратно само себе, то в случае, если первый элемент будет положительным - его надо учитывать. |
| Не знаю. Перечитал ещё два раза. На мой взгляд, всё равно очень спорная и неоднозначная трактовка. Остаётся уповать на то, что важно написать сам алгоритм, а эти детали являются несущественными. цитата: | В задачах С2 предполагается, что данные корректны (т. е. кратные первому существуют), в решении дополнительные проверки корректности введенных данных не проводятся. |
| Да, но посмотрите последние задачи в блоке С2. Там буквально везде такие моменты оговариваются, например: цитата: | "Опишите на русском языке или на одном из языков программирования алгоритм, позволяющий найти и вывести сумму элементов массива, кратных тринадцати. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого делится на тринадцать". |
| цитата: | "Опишите на русском языке или на одном из языков программирования алгоритм, позволяющий найти и вывести произведение элементов массива, которые имеют чётное значение и не оканчиваются на 0. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не оканчиваются на 0". |
| цитата: | "Опишите на русском языке или на одном из языков программирования алгоритм, позволяющий найти минимально трехзначное число, записанное в этом массива. Если такого числа нет, нужно вывести сообщение об этом". |
| Опять же, гарантия на то, что первый элемент массива - не 0 - в тексте задачи есть, а про гарантии того, что существует ещё хотя бы один элемент, кратный первому - забыли... Именно забыли, потому что нигде не оговорено, что первый элемент обязан быть положительным. tavabar пишет: цитата: | Анализируем ОСТАТОК ОТ ДЕЛЕНИЯ на этот отрицательный элемент, а не знак этого элемента. |
| Я лишь просто имел в виду, что при отсутствии кратных первому элементу программа поделит на ноль и вылетит. Просто в версии Константина Юрьевича она вылетит только если первый элемент отрицателен (тогда делитель y=0 ни разу не увеличится; при положительном же первом элементе игрек сразу станет равным 1), а в моём варианте - "фатальный" элемент может быть и положительным тоже.
|
|
|
|
| постоянный участник
|
Сообщение: 101
|
|
Отправлено: 24.06.12 10:17. Заголовок: Ion пишет: нигде не..
Ion пишет: цитата: | нигде не оговорено, что первый элемент обязан быть положительным. |
| Он не обязан быть положительным. Остаток от деления на отрицательное число тоже существует. Ion пишет: на ноль делить нельзя:) Наверное, вы имели ввиду значение счетчика...
|
|
|
|
Отправлено: 24.06.12 10:34. Заголовок: tavabar пишет: Он н..
tavabar пишет: цитата: | Он не обязан быть положительным. Остаток от деления на отрицательное число тоже существует. |
| Простите, но я не понимаю, что Вы хотите этим сказать. Введите программу, предложенную Константином Юрьевичем, для удобства сократите константу, скажем, до пяти-десяти, введите первый элемент отрицательным, а остальные - не кратные ему. Программа благополучно поделит на ноль и вылетит.
|
|
|
|
| постоянный участник
|
Сообщение: 102
|
|
Отправлено: 24.06.12 10:49. Заголовок: Ion пишет: введите..
Ion пишет: цитата: | введите первый элемент отрицательным, а остальные - не кратные ему. |
| А вы введите первый отрицательный, а какой-то последующий - кратный ему. Все будет работать.
|
|
|
|
Отправлено: 24.06.12 10:47. Заголовок: В ответах к задаче №..
В ответах к задаче №30 (всё то же С2) замечена опечатка: цитата: | Решение на естественном языке. Записываем в переменную min начальное значение 1000. В цикле перебираем значения переменной i от 1 до N. Если значение очередного элемента массива a[ i] одновременно больше 99, меньше 1000 и меньше, чем текущее значение переменной min, записываем в переменную min значение a[ i]. После окончания цикла проверяем значение min: если оно равно 100, то выводим сообщение «Нет трёхзначных чисел», иначе выводим значение min. |
| Очевидно, что тут упустили ещё один нолик - должна быть 1000. :-)
|
|
|
|
Отправлено: 24.06.12 11:14. Заголовок: Ну и в задаче №32 то..
Ну и в задаче №32 тоже опечатка... цитата: | Решение на естественном языке. Записываем в переменную p начальное значение 1. В цикле перебираем значения переменной i от 1 до N. Если значение очередного элемента массива a[ i] больше или равно 9, меньше или равно 99 и при делении на 6 даёт ненулевой остаток (все условия должны выполняться одновременно), умножаем переменную p на значение a[ i]. После окончания цикла выводим значение p. |
| Тут десятка, конечно, должна стоять. :-)
|
|
|
|
Отправлено: 24.06.12 11:17. Заголовок: tavabar пишет: А вы..
tavabar пишет: цитата: | А вы введите первый отрицательный, а какой-то последующий - кратный ему. Все будет работать. |
| Само собой, будет. Я с этим нигде и не спорил.
|
|
|
|
| Администратор
|
Сообщение: 407
|
|
Отправлено: 25.06.12 07:59. Заголовок: Ion пишет: 1. Не вп..
Ion пишет: цитата: | 1. Не вполне понятно само условие задачи (не знаю, откуда она взялась). Должен ли сам первый элемент входить в среднеарифметическое? |
|
Как следует из условия, должен. цитата: | 2. Другая прореха в условии: это то, что "гарантируется, что первый элемент массива отличен от нуля", но нигде не указано, что элементы, кратные первому, вообще обязаны присутствовать в массиве. |
|
Тут согласен. Простейший вариант уточнения задачи - сказать, что первый элемент массива заведомо положительный. Исправлено. цитата: | 3. Внешние операторные скобки begin-end (для цикла for) явно лишние. |
|
Да, можно убрать. цитата: | Задача 28. На мой взгляд, решение какое-то чересчур усложнённое. Разве не элегантнее и проще сделать так? 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. |
|
Согласен. Хотя вариант равноценный. Спасибо за замеченные опечатки, они исправлены.
|
|
|
|