
Скажите почему в этом коде на Pascal ответ равен 0 var a:array[1..10] of integer; i,p:integer;
begin randomize; for i:=1 to 10 do begin a[i]:=random(50); writeln(a[i]); p:=p*a[i]; if a[i] mod 5 =0 then p:=p*a[i]; end; writeln('p' ,p); end.

Ответы на вопрос

Решение представлено во вложении.
Язык: Pascal
Пояснение: Если я правильно всё понимаю, то твоя программа должна подсчитывать произведение элементов массива кратных 5.
Так вот, во-первых - для начала необходимо проинициализировать переменную p в самом начале программы:
p:=1; // единица, т.к если мы сюда присвоим ноль, то произведение всегда будет равно нулю.
Во-вторых: я не очень понимаю, зачем нужна строчка №9:
p:=p*a[i] // Она у тебя написана вне конструкции if. Поэтому получается так, что ты считаешь произведение всех элементов массива, а не только кратных 5. К тому же, если найдётся элемент кратный пяти, то p домножится на него ещё раз.
Почему p = 0?
P могла быть равна 0 из-за строчки №9. В массиве мог сгенерироваться элемент с нулевым значением. А т.к у тебя было лишнее присвоение вне конструкции if, то твоё произведение было бы равно нулю.
А теперь реальная причина, по которой p = 0.
Компилятор выделил память для переменной p, но т.к ты её не инициализировал, то в этом выделенном под p участке памяти могло быть что угодно. Чтобы избежать различных конфликтов, если ты самостоятельно явно не инициализируешь переменную, то компилятор её обнуляет сам. Что и произошло в твоём случае. У тебя p просто не могло быть равным другому числу, потому что 0*(любое число) = 0.
Я исправил твою программу, теперь она работает правильно. Строки, которые я перенёс в другую часть программы или строки, содержащие ошибки, я закомментировал, так что ты можешь сравнить изначальную версию программы и исправленную.
Примечание: т.к мы инициализировали в начале программы p и присвоили значение 1, то необходимо учесть то, что в массиве может не оказаться ни одного элемента, который был бы кратен 5. Шанс очень мал, но он есть. Тогда p так и останется = 1 и программа выдаст ложный результат. Учти этот момент и пропиши необходимые условия.
Какие такие необходимые условия?
Давай подумаем, а может ли p = 1 при том условии, что у нас есть хотя бы один элемент, который кратен 5? Конечно нет. Так вот, необходимо сделать проверку: if (p = 1) then write('Не обнаружено ни одного элемента кратного 5!', #10) else write(#10, 'Произведение элементов массива кратных 5 = ', p);
Также необходимо обговорить тот момент, что p всё же может оказаться равным 0. Это произойдёт если сгенерируется хотя бы один элемент с нулевым значением. Тогда у нас выполнится условие (0 mod 5 = 0) и p станет равным 0.
Если мы хотим избежать этого случая, то необходимо исключить генерацию элементов с нулевым значением. Хотя свойство делимости определено на всём множестве целых чисел, обычно рассматривается лишь делимость натуральных чисел. Так что, я думаю это будет логичным решением.
Я попытался написать всё подробно и понятно, но если возникнут вопросы, ты всегда можешь их задать.




Ваш код на Pascal выполняет следующие действия:
Создает массив
a
из 10 целых чисел и инициализирует его случайными значениями в диапазоне от 0 до 49 с помощьюrandom(50)
.Инициализирует переменные
i
иp
значением 0.В цикле
for i := 1 to 10 do
вы выполняете следующие действия:- Записываете значение элемента массива
a[i]
вp
. - Проверяете, делится ли значение
a[i]
на 5 без остатка, с помощьюif a[i] mod 5 = 0 then
. Если это условие выполняется, то умножаетеp
наa[i]
.
- Записываете значение элемента массива
После завершения цикла вы выводите значение
p
.
Проблема в вашем коде заключается в том, что вы инициализируете переменную p
значением 0, а затем внутри цикла умножаете ее на a[i]
исходя из условия. Таким образом, p
всегда остается равным 0, потому что умножение на 0 всегда дает 0.
Чтобы получить правильный результат, вы можете инициализировать переменную p
значением 1 в начале вашей программы:
pascalvar a: array[1..10] of integer; i, p: integer; begin randomize; p := 1; // Инициализируем p значением 1 for i := 1 to 10 do begin a[i] := random(50); writeln(a[i]); p := p * a[i]; if a[i] mod 5 = 0 then p := p * a[i]; end; writeln('p', p); end.
Теперь ваш код должен правильно вычислить значение p
.


Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili