|
|
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
Добрый день ! Требуется произведение элементов массива, расположенных между максимальным кратным 10 и минимальным четным элементами. Вот код программы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. Иногда правильно рассчитывает, но чаще всего неправильно. Откуда то берется индекс 0 временами. Не посмотрите, в чем ошибка? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2013, 00:07 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
Вы забыли проверить случаи, когда минимум/максимум не найдены (например, в массиве нет кратных 10) - вот у вас и не инициализируются соответствующие индексы. Просто добавьте проверку ( b>0 and c>0 ). Кроме того: - поиск и минимума, и максимума можно вести за один проход - вставьте обе проверки внутрь одного цикла - не требуется двух циклов для умножения - просто проведите сравнение, и поменяйте местами значения b,c если необходимо (if (b>c) => c:=b,b:=c; if (b>0)&(c>b+1) => считаем произведение else "Предупреждение!") - аккуратнее относитесь к переполнению - произведение может внезапно выйти за диапазон integer , если вы по каким-либо причинам измените n или random() ; можно просто все переменные (кроме sum ) описать как shortint ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2013, 02:23 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
Сделал поиск min и max за один проход. Надеюсь, что получилось действительно за один проход, а не через один проход. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Здесь происходит умножение за один цикл Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Результат выдает неверный. Также опять появляются нулевые индексы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2013, 21:00 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
alexander4321Результат выдает неверный. Также опять появляются нулевые индексы.Добавь блок распечатывающий весь массив. Погоняй программу до тех пор пока она не выдаст неправильные результаты. Теперь замени создание случайного массива на тот который увидел в последнем (неправильном) прогоне. А теперь думай что в этом массиве исходных данных такого-этакого что твой алгоритм обработки не справляется. Как решишь эту загадку, заменяй ручное создание исходного массива обратно на случайный. Повторяй весь цикл пока не уверишься что все работает как надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2013, 22:23 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
Вот полный код программы Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. Для начала нужно определиться с индексами элементов массива. Припоминаю, что индексы элементов в массиве нумеруются с нуля. Во всех примерах по переборке массивов встречал первым индексом единицу Код: sql 1. Поэтому, сильно не ломая над этим голову, предполагаю, что нумерация индексов в созданном в моей программе массиве тоже начинается с единицы. Добавил в программу перед вычислением произведения и возможной исходя из условия заменой min и max вывод значения min и max, а также их индексов. Интересный получился результат: прилагаю скриншот результата работы программы, на котором виден и 1-й и 20-й индекс массива. Напоминаю, что в массиве только 20 элементов, а в этом случае получается 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 00:10 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
Вчера мне посоветовали осуществлять поиск min и max за один проход. Я переписал код. Сейчас смотрю на результаты: получается, что max правильно, а min не правильно. Вот данный код Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Уверен, что есть здесь ошибка. Поэтому и min находится неправильно. Не подскажете, что здесь нужно подкорректировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 00:17 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
alexander4321Вчера мне посоветовали осуществлять поиск min и max за один проход. Я переписал код. Сейчас смотрю на результаты: получается, что max правильно, а min не правильно. Вот данный код Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Уверен, что есть здесь ошибка. Поэтому и min находится неправильно. Не подскажете, что здесь нужно подкорректировать? минимальным ЧЁТНЫМ :) А Вы за основу для минимального берёте mas[1] . P.S. Если видите, что имена переменных подсвечиваются синим - немедленно их меняйте (на данном уровне не критично, но если будете более-менее большой проект создавать - будут проблемы). Вот у Вас переменные min и max используются, а это имена стандартных функций в модуле math. Если его к проекту подрубить - начнёте ошибку компиляции ловить и не будете понимать почему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 00:39 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
Програмёр, Тогда не получится найти min и max за один проход. Получается, что при поиске max Код: sql 1. При поиске min массив перебирается со второго элемента Код: sql 1. Так что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 00:55 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
alexander4321Програмёр, Тогда не получится найти min и max за один проход. Получается, что при поиске max Код: sql 1. При поиске min массив перебирается со второго элемента Код: sql 1. Так что ли? там же написано i mod 2 = 0 . ) Первый элемент никак не попадёт под это правило... как и 3-й, 5-й и т.д. )) Так что min:=mas[2] и не паримся ;) P.S. Не забываем переименовать переменные )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 01:01 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
Програмёр, Понял это дело. Спасибо! При поиске минимума и максимума за 2 прохода (как в первоначальном варианте было) это прекрасно работает Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Но вот как это все записать в коде поиска минимума и максимума за один проход? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Один проход он и есть один проход. Если задаю перебор массива от 1 до n, то это будет задано для всех операторов. А мне получается нужно для поиска одного значения перебрать весь массив, а для поиска другого параметра только часть массива. Реально так сделать за один проход или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 01:19 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
alexander4321, Вам же всёровно каждый элемент массива проийти надо. Вот Вы его и проходите, но выбираете только нужные Вам. Другое дело для улучшения производительности, условия можно местами поменять и после проверки условия до and, если оно равно false, следующее проверяться не будет... Но это уже заморочки, которые Вам, пока что по крайней мере, не нужны. Так что код можно считать рабочим и имеющим полное право на существование ;) (моё мнение) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 01:34 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
Програмёр Так что код можно считать рабочим и имеющим полное право на существование ;) (моё мнение) Если это о втором варианте кода (с поиском за один проход), то там с минимумом ерунда какая-то получается. Там даже индексы со значением 0 (ноль) присутствуют, хотя в коде четко сказано для i от 1 до n. Если ничего не придумаю, то придется лучше оставить поиск за два прохода - там хотя бы результат верный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 01:39 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
alexander4321, индекс 0 - потому что перед циклом надо написать Код: pascal 1. А почему элементы неверно считает, я уже сказал (и пояснил что сделать). Как видите, оно минимальным выводит первый :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 10:35 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 12:44 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
Подкорректировал код. Переменной sum присвоил значение longint, иначе результат вычислений чаще всего выходил за рамки значений типа integer. Сейчас все работает. Вот код: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. Осталась пара вопросов. 1) Поиск минимума и максимума в массиве у меня получается осуществить только за два прохода. Вот код поиска минимума и максимума за один проход Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. По большому счету препод не будет придираться к рабочему варианту (в два прохода). Но просто самому интересно, что в этом коде неправильно. 2) При поиске максимума есть условие, что он должен быть кратным 10. Когда диапазон значений массива был от 1 до 20 периодически в массиве не было элементов со значениями 10 или 20. В этом случае значение максимум присваивалось какому-нибудь другому элементу. Я решил эту проблему увеличив диапазон значений элементов массива от 1 до 40. При таком раскладе точно появляется хотя бы один элемент, кратный 10. Не подскажете, как бы в коде записать условие о выводе, допустим, предупреждения об отсутствии подходящего для максимального значения элемента при отсутствии такового в полученном массиве (например, если диапазон значений элементов массива опять сделаю от 1 до 20)? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2013, 20:27 |
|
||
|
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
|
|||
|---|---|---|---|
|
#18+
alexander4321, а) b:=1; c:=2; Я же вам советовал - проверять наличие минимума/максимума по истинности ( b>0 and c>0 ). А это означает, что надо первоначально присваивать b:=0; c:=0; - и тогда как раз и работает все в один проход, и есть возможность выдать предупреждение об отсутствии миниума или максимума, удовлетворяющего условиям поиска. б) Чётный элемент и чётный номер элемента - это, как бы, две большие разницы. Я склоняюсь к тому, что у вас всё же должна быть проверка ( mas[i] mod 2 = 0 ). в) Начальные значения для Max и Min при переборе по возможности задаются таким образом, чтобы они лежали вне возможного диапазона значений, с которыми будет проводиться сравнение. Таким образом, начальное присвоение может выглядеть так: min:=41; max:=0; С учетом вышеизложенного, должен правильно работать даже тот ваш код 14423406 , надо только формулировку фраз во Writeln() правильно построить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2013, 07:07 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38295381&tid=1341776]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
173ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 508ms |

| 0 / 0 |
