поиск в массиве паскаль, как проверить есть ли число и на каком месте?
Задача: пользователь вводит число, надо сказать есть ли оно в массиве и на какой позиции. У меня выводит результат 5 раз (на каждый элемент) и часто пишет 'нет', хотя число там есть.
var
a: array[1..5] of integer = (3, 7, 2, 9, 5);
i, x: integer;
begin
readln(x);
for i := 1 to 5 do
if a[i] = x then
writeln('нашёл на ', i)
else
writeln('нет');
end.
Как сделать чтоб один раз ответил?
2 ответа
Проблема в том, что ты проверяешь и печатаешь внутри цикла на каждом шаге — отсюда 5 ответов. Надо завести флаг (или запомнить позицию), а вывод сделать после цикла, один раз:
var
a: array[1..5] of integer = (3, 7, 2, 9, 5);
i, x, poz: integer;
begin
readln(x);
poz := 0;
for i := 1 to 5 do
if a[i] = x then
poz := i;
if poz > 0 then
writeln('Нашёл на позиции ', poz)
else
writeln('Числа нет в массиве');
end.
Идея:
- заводим
poz := 0— 'пока не нашли'. - в цикле, если нашли элемент, запоминаем его номер в
poz. - ПОСЛЕ цикла один раз смотрим: если
pozтак и 0 — значит не было, иначе там лежит позиция.
Правило-привычка: 'ищем в цикле, а отвечаем после цикла'. Тогда не будет кучи лишних сообщений. Это очень частый приём — флаг 'нашёл/не нашёл' пригодится во многих задачах.
если число может встречаться несколько раз и тебе нужно ПЕРВОЕ вхождение — добавь выход из цикла по break сразу после poz := i, чтобы дальше не искал. но для школьных задач и так норм)