На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение



Сообщение: 18
ссылка на сообщение  Отправлено: 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 не играет.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 10 [только новые]





Сообщение: 19
ссылка на сообщение  Отправлено: 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.



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Сообщение: 100
ссылка на сообщение  Отправлено: 24.06.12 08:44. Заголовок: Ion пишет: Должен л..


Ion пишет:

 цитата:
Должен ли сам первый элемент входить в среднеарифметическое? Непонятно.


Почему же непонятно? В условии четко сказано: "ВСЕХ положительных элементов массива".
Т. к. любое число кратно само себе, то в случае, если первый элемент будет положительным - его надо учитывать.
Ion пишет:

 цитата:
нигде не указано, что элементы, кратные первому, вообще обязаны присутствовать в массиве.


В задачах С2 предполагается, что данные корректны (т. е. кратные первому существуют), в решении дополнительные проверки корректности введенных данных не проводятся.
Ion пишет:

 цитата:
если первый элемент отрицателен


Анализируем ОСТАТОК ОТ ДЕЛЕНИЯ на этот отрицательный элемент, а не знак этого элемента.


Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 21
ссылка на сообщение  Отправлено: 24.06.12 09:31. Заголовок: tavabar пишет: Поче..


tavabar пишет:

 цитата:
Почему же непонятно? В условии четко сказано: "ВСЕХ положительных элементов массива".
Т. к. любое число кратно само себе, то в случае, если первый элемент будет положительным - его надо учитывать.


Не знаю. Перечитал ещё два раза. На мой взгляд, всё равно очень спорная и неоднозначная трактовка. Остаётся уповать на то, что важно написать сам алгоритм, а эти детали являются несущественными.


 цитата:
В задачах С2 предполагается, что данные корректны (т. е. кратные первому существуют), в решении дополнительные проверки корректности введенных данных не проводятся.


Да, но посмотрите последние задачи в блоке С2. Там буквально везде такие моменты оговариваются, например:

 цитата:
"Опишите на русском языке или на одном из языков программирования алгоритм, позволяющий найти и вывести сумму элементов массива, кратных тринадцати. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого делится на тринадцать".



 цитата:
"Опишите на русском языке или на одном из языков программирования алгоритм, позволяющий найти и вывести произведение элементов массива, которые имеют чётное значение и не оканчиваются на 0. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не оканчиваются на 0".



 цитата:
"Опишите на русском языке или на одном из языков программирования алгоритм, позволяющий найти минимально трехзначное число, записанное в этом массива. Если такого числа нет, нужно вывести сообщение об этом".


Опять же, гарантия на то, что первый элемент массива - не 0 - в тексте задачи есть, а про гарантии того, что существует ещё хотя бы один элемент, кратный первому - забыли...
Именно забыли, потому что нигде не оговорено, что первый элемент обязан быть положительным.

tavabar пишет:

 цитата:
Анализируем ОСТАТОК ОТ ДЕЛЕНИЯ на этот отрицательный элемент, а не знак этого элемента.


Я лишь просто имел в виду, что при отсутствии кратных первому элементу программа поделит на ноль и вылетит. Просто в версии Константина Юрьевича она вылетит только если первый элемент отрицателен (тогда делитель y=0 ни разу не увеличится; при положительном же первом элементе игрек сразу станет равным 1), а в моём варианте - "фатальный" элемент может быть и положительным тоже.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Сообщение: 101
ссылка на сообщение  Отправлено: 24.06.12 10:17. Заголовок: Ion пишет: нигде не..


Ion пишет:

 цитата:
нигде не оговорено, что первый элемент обязан быть положительным.


Он не обязан быть положительным. Остаток от деления на отрицательное число тоже существует.
Ion пишет:

 цитата:
делитель y=0


на ноль делить нельзя:)
Наверное, вы имели ввиду значение счетчика...


Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 23
ссылка на сообщение  Отправлено: 24.06.12 10:34. Заголовок: tavabar пишет: Он н..


tavabar пишет:

 цитата:
Он не обязан быть положительным. Остаток от деления на отрицательное число тоже существует.


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Сообщение: 102
ссылка на сообщение  Отправлено: 24.06.12 10:49. Заголовок: Ion пишет: введите..


Ion пишет:

 цитата:
введите первый элемент отрицательным, а остальные - не кратные ему.


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

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 24
ссылка на сообщение  Отправлено: 24.06.12 10:47. Заголовок: В ответах к задаче №..


В ответах к задаче №30 (всё то же С2) замечена опечатка:

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


Очевидно, что тут упустили ещё один нолик - должна быть 1000. :-)

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 25
ссылка на сообщение  Отправлено: 24.06.12 11:14. Заголовок: Ну и в задаче №32 то..


Ну и в задаче №32 тоже опечатка...

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


Тут десятка, конечно, должна стоять. :-)

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 27
ссылка на сообщение  Отправлено: 24.06.12 11:17. Заголовок: tavabar пишет: А вы..


tavabar пишет:

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


Само собой, будет. Я с этим нигде и не спорил.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Сообщение: 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.

Согласен. Хотя вариант равноценный.

Спасибо за замеченные опечатки, они исправлены.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 5134
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет