← Все вопросы

поиск в массиве паскаль, как проверить есть ли число и на каком месте?

Задан 8 месяцев назад982 просмотров2 ответа
6

Задача: пользователь вводит число, надо сказать есть ли оно в массиве и на какой позиции. У меня выводит результат 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 ответа

12
✓ Принятый ответ — помог автору

Проблема в том, что ты проверяешь и печатаешь внутри цикла на каждом шаге — отсюда 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 — значит не было, иначе там лежит позиция.

Правило-привычка: 'ищем в цикле, а отвечаем после цикла'. Тогда не будет кучи лишних сообщений. Это очень частый приём — флаг 'нашёл/не нашёл' пригодится во многих задачах.

4

если число может встречаться несколько раз и тебе нужно ПЕРВОЕ вхождение — добавь выход из цикла по break сразу после poz := i, чтобы дальше не искал. но для школьных задач и так норм)

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект