Как найти номер числа в массиве паскаль

0 / 0 / 0

Регистрация: 16.12.2018

Сообщений: 45

1

В упорядоченном массиве определить номер элемента

16.03.2019, 23:27. Показов 4659. Ответов 29


Студворк — интернет-сервис помощи студентам

Петя перешёл в другую школу. На уроке физкультуры ему понадобилось определить своё место в строю. Помогите ему это сделать.

Входные данные
Программа получает на вход невозрастающую последовательность натуральных чисел, означающих рост каждого человека в строю. После этого вводится число X – рост Пети. Все числа во входных данных натуральные и не превышают 200.
Выходные данные
Выведите номер, под которым Петя должен встать в строй. Если в строю есть люди с одинаковым ростом, таким же, как у Пети, то он должен встать после них.

Примеры
входные данные
165 163 160 160 157 157 155 154
162
выходные данные
3



0



431 / 361 / 130

Регистрация: 09.09.2011

Сообщений: 1,313

16.03.2019, 23:32

2

зачем упорядочивать массив, если он по условию задачи уже упорядочен?

тут бинарный поиск, а с учетом отсутствия ограничений по времени – то пойдет и линейный, программируется в 4 строчки.



0



PascalProgram

0 / 0 / 0

Регистрация: 16.12.2018

Сообщений: 45

17.03.2019, 15:24

 [ТС]

3

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var n, k, m, i, s:integer;
a:array[1..n] of integer;
begin
read(n, k, m);
read(a[i]);
s:=0;
for i:=1 to k do
begin
s:=s+a[i];
end;
for i:=1 to (n-k-1) do
begin
if s=m then
writeln(i+1);
break;
s:=s+(a[i+k+1]-a[i])
else
writeln(0);
end;
end.

При компиляции такого кода выдаёт Can’t evaluate constant expression.



0



ZX Spectrum-128

Эксперт Pascal/Delphi

6805 / 4564 / 4817

Регистрация: 05.06.2014

Сообщений: 22,438

17.03.2019, 19:26

4

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const
  n = 8;
  a: array[1..n] of integer = (165, 163, 160, 160, 157, 157, 155, 154 );
 
var
  i, x, m: integer;
 
begin
  readln(x);
  m := 0;
  for i := 1 to n do
    if a[i] < x then
    begin
      m := i;
      break;
    end;
  if m <> 0 then
    writeln('Позиция: ', m)
  else
    writeln('Нет такого числа!');
end.



1



bormant

Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,586

Записей в блоге: 1

17.03.2019, 22:21

5

Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Цитата
Сообщение от ZX Spectrum-128
Посмотреть сообщение

writeln(‘Нет такого числа!’);

разве нельзя встать после последнего в шеренге?

Pascal
10
  m:=n+1;
Pascal
17
WriteLn(m);



1



Эксперт Pascal/Delphi

6805 / 4564 / 4817

Регистрация: 05.06.2014

Сообщений: 22,438

18.03.2019, 07:26

6

bormant, да, недодумал. Спасибо!



0



bormant

Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,586

Записей в блоге: 1

18.03.2019, 11:31

7

А можно было попроще:

Pascal
1
2
3
4
5
6
7
8
9
10
const
  n = 8;
  a: array [1..n] of Integer = (165, 163, 160, 160, 157, 157, 155, 154);
var
  x, m: Integer;
begin
  ReadLn(x); m:=1;
  while (m<=n) and (x<=a[m]) do Inc(m);
  WriteLn(m);
end.

Добавлено через 26 минут
или

Pascal
7
8
9
10
  ReadLn(x); {m:=0;}
  repeat Inc(m) until (m>n) or (x>a[m]);
  WriteLn(m);
end.



1



0 / 0 / 0

Регистрация: 16.12.2018

Сообщений: 45

18.03.2019, 16:34

 [ТС]

8

Спасибо, конечно, всем, но массив должен вводиться, а не быть постоянным.



0



Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,586

Записей в блоге: 1

18.03.2019, 16:59

9

Цитата
Сообщение от PascalProgram
Посмотреть сообщение

массив должен вводиться, а не быть постоянным

И что от этого поменяется? Допишите недостающий ввод массива.



0



0 / 0 / 0

Регистрация: 16.12.2018

Сообщений: 45

18.03.2019, 17:04

 [ТС]

10

Поменяется. Например, если вводить данные из примера, на выход пойдёт первый номер, а должен быть третий.



0



Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,586

Записей в блоге: 1

18.03.2019, 17:07

11

Если утверждаете, что изменение инициализированного массива на ввод значений приведет к изменению алгоритма, продемонстрируйте.



0



PascalProgram

0 / 0 / 0

Регистрация: 16.12.2018

Сообщений: 45

18.03.2019, 17:12

 [ТС]

12

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const n=8;
var a:array[1..n] of integer;
i, x, m:integer;
begin
read(a[i]);
end;
readln(x);
m:=1;
while (m<=n) and (x<=a[i]) do
begin
inc(m);
end;
writeln(m);
end.

Программа получает на ввод массив из элементов 165 163 160 160 157 157 155 154 и число 162. По условию, должно выводиться число 3. А выводится число 1. Как так?



0



Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,586

Записей в блоге: 1

18.03.2019, 17:49

13

Цитата
Сообщение от PascalProgram
Посмотреть сообщение

Программа

Какая программа? То, что выше, программой не является ввиду наличия синтаксических ошибок.

Добавлено через 3 минуты
Вижу, описка есть, x должен сравниваться с a[m]. Исправлено.



0



0 / 0 / 0

Регистрация: 16.12.2018

Сообщений: 45

18.03.2019, 18:05

 [ТС]

14

Ошибки нашёл и исправил. Но все равно проходит не все тесты.



0



Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,586

Записей в блоге: 1

18.03.2019, 18:12

15

Так там количество бывает явно больше 8.

Добавлено через 2 минуты
Давайте посмотрим на то, как описан ввод…



0



0 / 0 / 0

Регистрация: 16.12.2018

Сообщений: 45

18.03.2019, 18:19

 [ТС]

16

Какое количество ни подставь – все равно проходит не все тесты.



0



Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,586

Записей в блоге: 1

18.03.2019, 18:22

17

Цитата
Сообщение от PascalProgram
Посмотреть сообщение

Какое количество ни подставь

Выходит, маловато подставляете

А может дело-то не в количестве, а в том, как написан ввод данных?

Цитата
Сообщение от bormant
Посмотреть сообщение

Давайте посмотрим на то, как описан ввод…



0



0 / 0 / 0

Регистрация: 16.12.2018

Сообщений: 45

18.03.2019, 18:27

 [ТС]

18

Цитата
Сообщение от bormant
Посмотреть сообщение

Выходит, маловато подставляете

Сотни хватит?)

Цитата
Сообщение от bormant
Посмотреть сообщение

А может дело-то не в количестве, а в том, как написан ввод данных?

Я исправил ошибки, сказал же.



0



Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,586

Записей в блоге: 1

18.03.2019, 18:32

19

Цитата
Сообщение от PascalProgram
Посмотреть сообщение

Я исправил ошибки, сказал же.

Воля ваша, не хотите — как хотите. Нет кода — нечего и обсуждать. У вас всё правильно (но это неточно).



0



PascalProgram

0 / 0 / 0

Регистрация: 16.12.2018

Сообщений: 45

18.03.2019, 18:42

 [ТС]

20

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const n=100;
var a:array[1..n] of integer;
i, x, m:integer;
begin
for i:=1 to n do
begin
read(a[i]);
end;
readln(x);
m:=1;
while (m<=n) and (x<=a[m]) do
begin
inc(m);
end;
writeln(m);
end.



0



НАЙТИ НОМЕР ЭЛЕМЕНТА ПАСКАЛЬ

12312312321312554



Мыслитель

(5332),
закрыт



2 года назад

Как найти номер элемента в паскале? Например минимального элемента. И как его вывести?

Alexandr

Мудрец

(11943)


2 года назад

const
N = 10;

var
A: array[1..N] of integer;
i: integer;
i_min: integer;

begin
randomize;
for i := 1 to N do
begin
A[i] := 1 + random(10);
write(A[i], ‘ ‘);
end;

i_min := 1;
for i := 1 to N do
if A[i] < A[i_min] then
i_min := i;
writeln(#10#13,’Index minimal”nogo elementa:’, i_min);

write(‘Nazhmite klavishu Enter dlya prodolzheniya…’);
readln;
end.

Урок 23. Поиск элемента в массиве

Просмотров 3.1к. Обновлено 23 ноября 2020

Урок из серии: «Язык программирования Паскаль»

На этом уроке рассмотрим алгоритмы поиска элемента в одномерном массиве. Эти алгоритмы очень похожи на обработку последовательностей (поиск, выборка и т.д.).

Отличие заключается в том, что в массиве одновременно доступны все его компоненты. Такой доступ называется параллельным.

Рассмотрим несколько примеров.

Пример 1. Найти номера четных элементов.

Решение.

Для нахождения четных элементов необходимо просмотреть весь массив, и если будут попадаться четные элементы, то нужно выводить их на экран. Напишем процедуру, которая принимает в качестве входного параметра массив и выводит на экран нужные элементы.

Procedure Solve(m : myarray);
Var i: Integer;
Begin
   For i:=1 To n Do 
      If m[i] Mod 2 = 0 Then Write(i:5);{если элемент четный, то вывести на экран}
End;

Пример 2. Есть ли отрицательный элемент в массиве?

Решение.

Для решения таких задач удобнее использовать циклы с условиями и составлять функции, результат которых имеет логический тип.

Начинаем с первого элемента (i = 1).

Пока не просмотрен последний (i<=n) и не найден отрицательный (m [i]>=0), будем переходить к следующему (inc (i)).

Таким образом, мы закончим просмотр в одном из двух случаев:

  • первый — просмотрели все элементы и не нашли отрицательный, тогда i>n;
  • второй — нашли нужный, при этом i<=n.

Напишем функцию, значение которой истина (True), если такой элемент есть, и ложь (False), если его нет.

Function Controll (m: myarray): Boolean;
Var i : Integer;
Begin
   i := 1;
   While (i<=n) And (m[i]>0) Do Inc(i);
   Control1:=(i<=n)
End;

Пример 3. Найти номер последнего отрицательного элемента массива.

Решение.

Последний отрицательный — это первый отрицательный элемент, если начать просмотр с конца.

Если очередной элемент не является отрицательным, то нужно уменьшать значение текущего индекса, пока он не станет меньше номера первого элемента или не будет найден отрицательный элемент.

Таким образом, можно модифицировать предыдущую функцию. Но поскольку надо найти номер элемента, тип результата будем целым.

Договоримся, что если такого элемента нет, то значение функции будет равно 0.

Function Control2 (m: myarray): Integer;
Var i : Integer;
Begin
   i:=n;
   While (i>=1) And (m[i]>0) Do Des(i);
   If i<1 Then Control2:=0
          Else Control2:=i;
End;

Вы рассмотрели алгоритмы на поиск и выборку элементов в массиве.

На следующем уроке продолжим знакомиться с алгоритмами  обработки одномерных массивов.

Дана задача

Составить программу, осуществляющую поиск элемента p в массиве, состоящем из n элементов. В случае присутствия этого числа в массиве вывести его порядковый номер, в случае отсутствия — вывести соответствующее сообщение

Итак, что нам необходимо сделать? Нам известно, что есть некоторый массив, длина которого n элементов. Также нам нужно проверить, есть ли среди этих элементов число p. Как решать? Ничего сложного нет: необходимо просто сравнить каждый элемент массива с числом p.

const
n = 5;
var
s: array [1..n] of integer;
x, i, p: integer;
begin
writeln(‘Введите число ,которое будем искать в массиве’);
readln(p);
writeln(‘заполните ‘, n, ‘ элементов массива’);
for i := 1 to n do
begin
readln(s[i]);
if s[i] = p then x := i;
end;
if x = 0 then writeln(‘В массиве нет такого числа!’) else writeln(‘Число найдено, его порядковый номер = ‘, x);
end.

Данный код представляет собой самый простой поиск элемента в массиве. Однако в нем есть один существенный недостаток. Здесь не рассматривается случай, когда в массиве 2 и одинаковых элементов равных p. Проще говоря, если например p=5, а в массиве 5 повторяется 2 раза, первый раз в позиции 2, второй — в позиции 6, то в результате выше написанного кода будет выведено, что число 5 стоит а позиции 6. Объясняется это просто: в результате цикла, записывается сначала более ранняя позиция, которая потом стирается другой. То есть при нахождении новой позиции старая стирается, и в итоге цикла записывается только конечная позиция. Многих данный код устроит, но лучше его доработать. Будем считать все случаи, включая наихудший, в котором все элементы массива равны p. Поэтому для позиций создаем дополнительный цикл (назовем его k). Итак модифицируем программу

const
n = 5;
var
s, k: array [1..n] of integer;
y, i, p: integer;
begin
writeln(‘Введите число ,которое будем искать в массиве’);
readln(p);
writeln(‘заполните ‘, n, ‘ элементов массива’);
for i := 1 to n do
begin
readln(s[i]);
if s[i] = p then begin
y := y + 1;
k[y] := i;
end;
end;
if y = 0 then writeln(‘В массиве нет такого числа!’)  else
if y = 1 then writeln(‘Число найдено, его порядковый номер = ‘, k[y]) else
begin
write(‘Число найдено, его порядковые номера = ‘);
for i := 1 to y do
write(k[i], ‘,’);
end;
end.

Минимум в некоторой последовательности чисел это наименьшее значение. Например, среди чисел последовательности 431, 85, 200, 125 минимумом является число 85. Если числа последовательности сохранить в массиве, то можно найти номер минимального элемента массива

Сохраним числа в массиве: a[1]=431, a[2]=85, a[3]=200, a[4]=125.

Минимум хранится в ячейке с номером 2, значит номер минимального элемента это число 2. 

В этой публикации приведем примеры программ поиска номера минимального элемента массива.

Будем считать, что в массиве хранятся целые числа, диапазон значений не известен.

Исходные данные: a – массив целых чисел

Выходные данные: min – минимальный элемент, kmin – номер минимального элемента массива

За  начальное значение минимума min возьмем значение первого элемента, тогда за номер минимального элемента kmin возьмем номер 1.

Далее будем сравнивать каждый элемент массива со значением min, если a[k]<min, то перезапишем значение min на значение a[k], а значение kmin на значение k.

Программа решения на языке Паскаль

var a:array[1..10] of integer;

    k,min,kmin:integer;

begin

  for k:=1 to 10 do

  begin

    read(a[k]);

  end;

  min:=a[1];

  kmin:=1;

  for k:=2 to 10 do

  begin

    if a[k]<min then

    begin

      min:=a[k];

      kmin:=k;

    end;

  end;

  writeln(‘Минимальный элемент ‘,min);

  writeln(‘Номер минимального элемента массива ‘,kmin);

end.

Результат выполнения программы

Как найти номер минимального элемента массива

Чтобы не вводить значения элементов массива с клавиатуры, можно воспользоваться датчиком случайных чисел.

Еще одна программа

Теперь не будем сохранять само минимальное значение, а будем пользоваться номером минимального элемента.

За номер минимального элемента kmin возьмем 1. Далее будем сравнивать a[k]<a[kmin], в случае истины, будем перезаписывать kmin на k.

Программа решения на языке Паскаль

var a:array[1..10] of integer;

    k,min,kmin:integer;

begin

  for k:=1 to 10 do

  begin

    read(a[k]);

  end;

  kmin:=1;

  for k:=2 to 10 do

  begin

    if a[k]<a[kmin] then

    begin

      kmin:=k;

    end;

  end;

  writeln(‘Минимальный элемент ‘,a[kmin]);

  writeln(‘Номер минимального элемента массива ‘,kmin);

end.

Еще одна программа с применением методов последовательностей PascalABC.NET

a.min – определяет минимальное значение в массиве

a.indexof(a.min) – определяет номер элемента, равного минимальному

Массив описан как динамический (не указываются номера элементов, нумерация начинается с 0). Оператор setlength(a,10) выделяет память под массив (десять ячеек).

var a:array of integer;

    k:integer;

begin

  setlength(a,10);

  for k:=0 to 10-1 do

  begin

    read(a[k]);

  end;

  writeln(‘Минимальный элемент ‘,a.min);

  writeln(‘Номер минимального элемента массива ‘,a.indexof(a.min));

end.

Как еще можно найти номер минимального элемента массива? 

Предложите свои способы. 

Читайте также:

Добавить комментарий