Главная » Дан целочисленный массив...Элементы массива могут...
20:36

Дан целочисленный массив...Элементы массива могут...


Задание:

Дан целочисленный массив из 30 элементов. Элементы массива могут принимать произвольные целые значения. С клавиатуры вводится целое число X. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит наименьший номер элемента, равного X, или сообщение, что такого элемента нет. Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.

Паскаль

Естественный язык

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); 
  ...
end.

Объявляем массив A из 30 элементов. Объяв-ляем целочисленные переменные i, j, x. В цикле от 1 до 30 вводим элементы массива A с 1-го по 30-й. Вводим переменную X.
...

Си

 

#include<stdio.h> 
int main(void) {
  const int N=30;
  int a[N]; 
  int  i, j, x; 
  for (i=0; i<N; i++)
     scanf(″%d″, &a[i]); 
  scanf(″%d″, &x); 
  ...
}

 

Решение:

Хитрость этой задачи в том, что нужно найти первый элемент, равный X. Вроде бы все просто – в цикле перебираем все элементы массива, если очередной элемент равен X, записываем его номер в переменную j.  

  1. for i:=1 to N do
  2.   if a[i] = x then
  3.     j := i; { запомнили номер }

Однако при этом в конце цикла в переменной j оказывается номер последнего элемента, равного X. Чтобы выйти их этой ситуации, можно остановить цикл, как только мы нашли первый элемент, равный X. В Паскале (и в Си) это делается с помощью оператора break (досрочный выход из цикла):

  1. for i:=1 to N do
  2.   if a[i] = x then begin
  3.     j := i; { запомнили номер }
  4.     break;
  5.   end; 

Есть и другой способ – просматривать элементы с конца, при этом не нужен досрочный выход из цикла:

  1. for i:=N downto 1 do
  2.   if a[i] = x then
  3.     j := i; { запомнили номер }

Как определить, что элемента, равного X, нет в массиве? Для этого до цикла в переменную  j нужно записать любое значение, которое не может быть номером элемента массива, например, 0. Если по окончании цикла в переменной j остался 0, ни одного элемента, равного X, не нашли.

Решение на естественном языке. Записываем в переменную j начальное значение 0. В цикле рассматриваем последовательно все элементы массива в обратном порядке, с 30-го до 1-го. Если очередной элемент равен X, записываем его номер в переменную j. Если после завершения цикла переменная j равна 0, выводим сообщение, что таких элементов нет, иначе выводим значение переменной j.
Решение на Паскале.

  1. const N=30;
  2. var a: array [1..N] of integer;
  3.     i, j, x: integer;
  4. begin
  5.   for i:=1 to N do readln(a[i]);
  6.   readln(x);
  7.   j:=0;
  8.   for i:=N downto 1 do
  9.     if a[i] = x then
  10.       j := i; { запомнили номер }
  11.   if j = 0 then 
  12.        writeln('Нет таких элементов')
  13.   else writeln(j);
  14. end.

Можно также использовать цикл while со сложным условием:

  1. i:=0;
  2. while (i <= N) and (a[i] <> x) do
  3.   i:= i + 1;

Цикл остановится, когда i станет больше N или найдем элемент, равный X. Если после цикла переменная i больше N, значит, ни одного элемента, равного X, в массиве нет. Иначе в переменной i находится номер первого элемента, равного X.

  1. if i > N then 
  2.        writeln('Нет таких элементов');
  3.   else writeln(i);

Это второй вариант решения задачи.


Похожие материалы:
Нашли ошибку на сайте? Напишите в комментариях!
Категория: Язык программирования: Паскаль | Просмотров: 72 | Добавил: Ученик | Рейтинг: 5.0/1