Задание:
Дан целочисленный массив из 30 элементов. Элементы массива могут принимать произвольные целые значения. С клавиатуры вводится целое число X. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит наименьший номер элемента, равного X, или сообщение, что такого элемента нет. Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.
Паскаль |
const N=30; |
Си |
#include<stdio.h> |
Естественный язык |
Объявляем массив A из 30 элементов. Объяв-ляем целочисленные переменные i, j, x. В цикле от 1 до 30 вводим элементы массива A с 1-го по 30-й. Вводим переменную X. ... |
Решение:
Хитрость этой задачи в том, что нужно найти первый элемент, равный X. Вроде бы все просто – в цикле перебираем все элементы массива, если очередной элемент равен X, записываем его номер в переменную j.
for i:=1 to N do
if a[i] = x then
j := i; { запомнили номер }
Однако при этом в конце цикла в переменной j оказывается номер последнего элемента, равного X. Чтобы выйти из этой ситуации, можно остановить цикл, как только мы нашли первый элемент, равный X. В Паскале (и в Си) это делается с помощью оператора break (досрочный выход из цикла):
for i:=1 to N do
if a[i] = x then begin
j := i; { запомнили номер }
break;
end;
Есть и другой способ – просматривать элементы с конца, при этом не нужен досрочный выход из цикла:
for i:=N downto 1 do
if a[i] = x then
j := i; { запомнили номер }
Как определить, что элемента, равного X, нет в массиве? Для этого до цикла в переменную j нужно записать любое значение, которое не может быть номером элемента массива, например, 0. Если по окончании цикла в переменной j остался 0, ни одного элемента, равного X, не нашли.
Решение на естественном языке. Записываем в переменную j начальное значение 0. В цикле рассматриваем последовательно все элементы массива в обратном порядке, с 30-го до 1-го. Если очередной элемент равен X, записываем его номер в переменную j. Если после завершения цикла переменная j равна 0, выводим сообщение, что таких элементов нет, иначе выводим значение переменной j.
Решение на Паскале.
const N=30;
var a: array [1..N] of integer;
i, j, x: integer;
begin
for i:=1 to N do readln(a[i]);
readln(x);
j:=0;
for i:=N downto 1 do
if a[i] = x then
j := i; { запомнили номер }
if j = 0 then
writeln('Нет таких элементов')
else writeln(j);
end.
Можно также использовать цикл while со сложным условием:
i:=0;
while (i <= N) and (a[i] <> x) do
i:= i + 1;
Цикл остановится, когда i станет больше N или найдем элемент, равный X. Если после цикла переменная i больше N, значит, ни одного элемента, равного X, в массиве нет. Иначе в переменной i находится номер первого элемента, равного X.
if i > N then
writeln('Нет таких элементов');
else writeln(i);
Это второй вариант решения задачи.