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

0 / 0 / 0

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

Сообщений: 22

1

Определить количество различных элементов в массиве

13.12.2011, 21:29. Показов 4840. Ответов 10


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

Ребят срочно нужна помощь надо сделать две задачи по одномерным массивам, я знаю логику у этих задач, но не могу написать код…

Исходный массив упорядочен по возрастанию Ввести число К и вставить его в массив, не нарушая упорядоченности.

Определить количество различных элементов в массиве
(например, дано 2 4 3 2 4 7 4 6 , результат 5).

Зарание благодарен…



0



WebMax 2.0

–.founder./–

565 / 565 / 392

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

Сообщений: 867

13.12.2011, 22:39

2

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

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
uses crt;
 
var a: array [1..30] of integer;
i,n,j,k:integer;
m: set of byte;
 
Procedure Swap(var x,y:integer);
var t:integer;
   begin
   t:=x;
   x:=y;
   y:=t;
   end;
 
Procedure Sortirovka;
begin
For i:=1 to n do
     for j:= 1 to n-1 do
     if a[j]>a[j+1] then Swap(a[j],a[j+1]);
end;
 
 
begin
   m:=[];
   k:=0;
   Write('Ââåäèòå ðàçìåð ìàññèâà: ');readln(n);
   Writeln('Èñõîäíûé ìàññèâ: ');
   randomize;
   For i:= 1 to n do
   begin
     a[i]:=random(50)+1;
     write(a[i]:3);
   end;
   Writeln;
   Writeln('Ïî âîçðîñòàíèþ: ');
   Sortirovka;
   For i:= 1 to n do
     write(a[i]:3);
   n:=n+1;
   Writeln;
   Write('Êàêîå ÷èñëî äîáàâèòü â ìàññèâ ? ');readln(a[n]);
   Sortirovka;
   Writeln('Íîâûé ìàññèâ: ');
   For i:= 1 to n do
       begin
       write(a[i]:3);
       if not (a[i] in m) then
          begin
          m:=m+[a[i]];
          inc(k);
          end;
       end;
   Writeln; Writeln('Ðàçëè÷íûõ ýëåìåíòîâ: ',k);
end.



1



0 / 0 / 0

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

Сообщений: 22

13.12.2011, 22:47

 [ТС]

3

WebMax 2.0, спасибо за задачу, а можно как нибудь полегче ее вообще сделать, просто к тому моменту мы еще не прошли процедуры и функции…



0



Steacher

13 / 13 / 13

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

Сообщений: 35

13.12.2011, 22:48

4

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

Решение

ну или мой вариант, не зря же я его писал

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
var i,k,n,c,b,h,x:integer;
a:array[1..100] of integer;
begin
b:=0;
readln(k);
for i:=1 to 10 do
a[i]:=random(20)+1;
writeln('Не упорядоченный массив');
for i:=1 to 10 do
write(a[i]:4);
for c:=1 to 10 do
for i:=1 to 9 do
begin
if a[i]>a[i+1] then
      begin
      b:=a[i+1];
      a[i+1]:=a[i];
      a[i]:=b;
      end;
      end;
      writeln;
      writeln('Упорядоченный массив');
       for i:=1 to 10 do
 write(a[i]:4);
 writeln;
   a[11]:=k;
 Writeln('Массив со вставленным числом');
  for c:=1 to 10 do
for i:=1 to 10 do
begin
if a[i]>a[i+1] then
      begin
      b:=a[i+1];
      a[i+1]:=a[i];
      a[i]:=b;
      end;
      end;
 for i:=1 to 11 do
 write(a[i]:4);
  end.



1



WebMax 2.0

–.founder./–

565 / 565 / 392

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

Сообщений: 867

13.12.2011, 22:53

5

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

а можно как нибудь полегче ее вообще сделать, просто к тому моменту мы еще не прошли процедуры и функции…

Процедуры и функции убрал .

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
uses crt;
 
var a: array [1..30] of integer;
i,n,j,k,t:integer;
m: set of byte;
 
begin
   m:=[];
   k:=0;
   Write('Ââåäèòå ðàçìåð ìàññèâà: ');readln(n);
   Writeln('Èñõîäíûé ìàññèâ: ');
   randomize;
   For i:= 1 to n do
   begin
     a[i]:=random(50)+1;
     write(a[i]:3);
   end;
   Writeln;
   Writeln('Ïî âîçðîñòàíèþ: ');
   For i:=1 to n do
     for j:= 1 to n-1 do
     if a[j]>a[j+1] then begin
     t:=a[j];
     a[j]:=a[j+1];
     a[j+1]:=t;
     end;
   For i:= 1 to n do
     write(a[i]:3);
   n:=n+1;
   Writeln;
   Write('Êàêîå ÷èñëî äîáàâèòü â ìàññèâ ? ');readln(a[n]);
   For i:=1 to n do
     for j:= 1 to n-1 do
     if a[j]>a[j+1] then begin
     t:=a[j];
     a[j]:=a[j+1];
     a[j+1]:=t;
     end;
   Writeln('Íîâûé ìàññèâ: ');
   For i:= 1 to n do
       begin
       write(a[i]:3);
       if not (a[i] in m) then
          begin
          m:=m+[a[i]];
          inc(k);
          end;
       end;
   Writeln; Writeln('Ðàçëè÷íûõ ýëåìåíòîâ: ',k);
end.



1



0 / 0 / 0

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

Сообщений: 22

13.12.2011, 22:54

 [ТС]

6

Steacher, во спасибо вот оно самое…

Добавлено через 1 минуту
WebMax 2.0, Steacher, спасибо большое , отблагодарил, а попробуйте вторую



0



–.founder./–

565 / 565 / 392

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

Сообщений: 867

13.12.2011, 22:57

7

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

а попробуйте вторую

Вторая решена в моем алгоритме , посмотри внимательней !



1



0 / 0 / 0

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

Сообщений: 22

13.12.2011, 22:58

 [ТС]

8

WebMax 2.0, хорошо щас найду)))

Добавлено через 53 секунды
WebMax 2.0, Если не сложно выдели его)))



0



WebMax 2.0

–.founder./–

565 / 565 / 392

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

Сообщений: 867

13.12.2011, 23:02

9

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

Если не сложно выдели его)))

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
uses crt;
var a: array [1..30] of integer;
i,n,k:integer;
m: set of byte;
begin
   m:=[];
   k:=0;
   Write('Ââåäèòå ðàçìåð ìàññèâà: ');readln(n);
   Writeln('Èñõîäíûé ìàññèâ: ');
   randomize;
   For i:= 1 to n do
   begin
     a[i]:=random(50)+1;
     write(a[i]:3);
     if not (a[i] in m) then
          begin
          m:=m+[a[i]];
          inc(k);
          end;
   end;
   Writeln; Writeln('Ðàçëè÷íûõ ýëåìåíòîâ: ',k);
end.



1



0 / 0 / 0

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

Сообщений: 22

13.12.2011, 23:11

 [ТС]

10

WebMax 2.0, спасибо большое очень вам благодарен

Добавлено через 5 минут
WebMax 2.0, слушай и еще один последний вопрос можеш русским языком написать про тип данных set of byte



0



WebMax 2.0

–.founder./–

565 / 565 / 392

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

Сообщений: 867

13.12.2011, 23:31

11

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

set of byte

Множество из целочисленных значений !

Pascal
1
2
3
4
5
if not (a[i] in m) then
          begin
          m:=m+[a[i]];
          inc(k);
          end;

Если значения нет в множестве, то вставляем данное значение в множество и увеличиваем K+1, проверяем следующее значение массива, если значение уже присутствует в множестве, то пропускаем . Таким образом узнаем кол-во различных элементов !



0



Задача. Найти количество различных чисел в массиве из N элементов.

Как будем решать задачу (2 способа)

для хранения уникальных значений исходного массива будем использовать:

  1. новый массив 
  2. множество 

Способ 1

Сформируем массив a случайных чисел из диапазона от 0 до 20.

Заведем массив b и заполним все его ячейки числами -1.

Переменной j присвоим значение 0.

В цикле для k от 1 до n:

  1. Присвоим флагу f значение true, это будет означать, что ячейка a[k] хранит уникальное значение, и его нет в массиве b.
  2. В цикле для s от 1 до j сравним значение a[k] со значениями массива b (a[k]=b[s]), если условие верно, флагу присвоим значение false.
  3. Если флаг не поменял значение true на false и хранит значение true, счетчик j увеличим на 1 и сохраним в ячейке b[j] значение a[k].

В итоге переменная j будет хранить количество измененных ячеек массива b – количество различных элементов исходного массива.

Программа решения задачи на языке Паскаль (способ 1)

const n = 10;

var a,b:array[1..n] of integer;

    k,s,j:integer;

    f:boolean;

begin

  write(‘Исходный массив: ‘);

  for k:=1 to n do

  begin

    a[k]:=random(21); write(a[k],’ ‘);

    b[k]:=-1;

  end;

  j:=0;

  for k:=1 to n do

  begin

    f:=true; //элемента a[k] нет в массиве b

    for s:=1 to j do if a[k]=b[s] then f:=false;

    if f then begin j+=1; b[j]:=a[k]; end;

  end;

  writeln;

  write(‘Неповторяющиеся числа: ‘);

  for k:=1 to j do write(b[k],’ ‘);

  writeln;

  writeln(‘Количество различных чисел: ‘,j);

end.

Способ 2

Заведем пустое множество m.

Сформируем массив a случайных чисел из диапазона от 0 до 20. 

В цикле для k от 1 до n:

  1. если значение a[k] нет в множестве m, увеличим счетчик j на 1,
  2. добавим значение a[k] в множество m.

В итоге переменная j будет хранить длину сформированного множества, то есть количество различных значений исходного массива

В цикле  foreach k in m do (для каждого k, имеющегося в множестве m) выведем значения, сохраненные в множестве m.

Программа решения задачи на языке Паскаль (способ 2)

const n = 10;

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

    k,j:integer;

    m:set of integer;

begin

  m:=[];

  j:=0;

  write(‘Исходный массив: ‘);

  for k:=1 to n do

  begin

    a[k]:=random(21); write(a[k],’ ‘);

    if not(a[k] in m) then j+=1; 

    m:=m+[a[k]];

  end;

  writeln;

  write(‘Неповторяющиеся числа: ‘);

 foreach k in m do write(k,’ ‘);

  writeln;

  writeln(‘Количество различных чисел: ‘,j);

end.

Результат запуска программы

Результат запуска программы

Если значительно увеличить количество элементов массива a, какая программа будет искать различные числа более эффективно (быстро)?

На занятии разбираются разного уровня сложности задачи в Pascal для работы с одномерными массивами

Задача сайта labs-org.ru — получение пользователями практических навыков работы с языком. Уроки по Паскалю, изложенные по мере увеличения их сложности и подкрепляемые наглядными решенными примерами, позволят с легкостью освоить изучаемый материал.

Для начала рассмотрим не сильно сложную задачу с одномерными массивами в Pascal:

Пример: Найти максимальный элемент численного массива и его индекс.

Результат:

поиск макс и мин в массиве
Подумайте, пригодится ли в программе счетчик или нет, нужны ли дополнительные переменные.

Показать листинг программы:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const
m = 20;
var
arr: array[1..m] of byte;
max_index: byte;
i: byte;
begin
randomize;
for i := 1 to m do begin
  arr[i] := random(100);
  write (arr[i]:3);
end;
max_index := 1;
for i := 2 to m do
 if arr[i] > arr[max_index] then begin
  max_index := i;
 end;
writeln;
writeln ('Max = ',arr[max_index]);
writeln ('position: ', max_index);
end.

Задача Array 15. Требуется заполнить массив числами, которые вводит пользователь, и вычислить их сумму. Если пользователь вводит ноль или превышен размер массива, то запросы на ввод должны прекратиться. Использовать цикл с постусловием (repeat)

Результат:

Число: 3
Число: 2
Число: 5
Число: 0
3 2 5 0
sum = 10

сумма элементов массива

[Название файла: task15.pas]

Задача Array 16. Дан массив из 50 элементов, значения которых формируются функцией random и лежат в диапазоне от -50 до 49 включительно.  Требуется из одного массива скопировать в другой массив значения в диапазоне от -5 до 5 включительно и подсчитать их количество.

задача с одномерными массивами Паскальзадача с одномерными массивами Паскаль

[Название файла: task16.pas]

Задача Array 17. В одномерном массиве (заполнение массива случайными числами от -50 до 49) найти сумму отрицательных элементов. Если эта сумма меньше -100, то необходимо прибавить к ней минимальный положительный элемент.
сложные задачи в Pascal

Следующую сложную задачу с одномерными массивы следует разобрать подробно.

Пример: Имеется одномерный массив, содержащий числа от 0 до 49 включительно. Требуется исключить из него все элементы, значения которых меньше 15.

Сложность этого задания состоит в том, что нужно не просто удалять элементы, значения которых < 15, а требуется при этом передвигать остальные элементы, стоящие за удаляемым, на позицию влево. Как бы сжимая массив, чтобы не оставались «пустые» элементы.

Показать решение

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const n=20;
var
   arr: array[1..n] of integer;
   i,j,m:integer;
begin
randomize;
for i:=1 to n do begin
    arr[i]:=random(50);
    write(arr[i]:4);
end;
writeln;
m:=n;
i:=1;
while i<=m do
      if arr[i]<15 then begin
         for j:=i to m-1 do
             arr[j]:=arr[j+1];
         m:=m-1
      end
      else
          i:=i+1;
writeln('Результат:');
for i:=1 to m do
    write(arr[i]:4)
end.

Рассмотрим представленный алгоритм решения данной сложной задачи с одномерным массивом:

  • строка 12: Здесь присваивание значения n переменной m требуется, т.к. n — константа и не может быть изменена. Поскольку при «просмотре» массива в цикле while некоторые элементы будут удаляться, то значение m, обозначающее длину массива, будет уменьшаться.
  • строка 21: Если очередной элемент не удаляется, то переходим к просмотру следующего элемента (i := i + 1) и не уменьшаем массив (m не меняется).

Задача Array 18. Дан массив из N элементов в диапазоне [100;300]. Сжать массив, оставив в нем только те элементы, сумма цифр которых четная.

101  245  167  295  133  >>> 101(2)  167(14)  295(16)

[Название файла: task18.pas]

Задача Array 19. Заполнить массив из 10 элементов случайными числами в интервале [0..4] и определить, есть ли в нем одинаковые соседние элементы.

Пример:

	 Исходный массив:
	 4  0  1  2  0  1  3  1  1  0
	 Ответ: есть

[Название файла: task19.pas]

Задача Array 20.

  1. Определите в массиве A номер первого элемента, равного X.
  2. Определите номер первого элемента, равного X, в первой половине массива A (массив имеет чётное число элементов).
  3. Определите номер первого элемента, равного X, во второй половине массива A (массив имеет чётное число элементов).

[Название файла: task20.pas]

Задача Array 21. Найти количество различных чисел в одномерном массиве.

[Название файла: task21.pas]

Рассмотрим алгоритм решения:
алгоритм решения кол-во разлинчых чисел в массиве

Задача Array 22. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и сделать реверс отдельно для 1-ой и 2-ой половин массива.
Пример:
перестановка элементов массива

[Название файла: task22.pas]

Задача Array 23. Заполнить массив из 12 элементов случайными числами в интервале [-12..12] и выполнить циклический сдвиг ВПРАВО на 4 элемента.
Пример:
1

[Название файла: task23.pas]

Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:

проверь себя

Нужно найти количество элементов равных минимальному. Выводит неправильное количество

var
  s, i: integer;
  A: array [1..5] of integer;
  min := 367131;

begin
  randomize; 
  for i := 1 to 5  do 
    a[i] := Random(1, 5);
  begin
    for i := 1 to 5 do write(a[i], ' ');
    for i := 1 to 5 do
    begin
      if (a[i] < min) and (a[i] >= 0) then  
      begin
        min := a[i]; 
      end;
      if a[i] = min then 
      begin
        s := s + 1; 
      end;
    end;
  end;
  writeln('Минимальный:', min, ' Количество - ', s);
end.

Kromster's user avatar

Kromster

13.5k12 золотых знаков43 серебряных знака72 бронзовых знака

задан 20 мая 2021 в 9:21

Nikita's user avatar

2

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

for i := 1 to 5 do
    begin
      if (a[i] < min) and (a[i] >= 0) then  
      begin
        min := a[i];
        s : = 0;
      end;
      if a[i] = min then 
      begin
        s := s + 1; 
      end;
    end;

В вашей реализации подсчитается количество элементов равных или меньше ВСЕХ предыдущих.

И еще. переменную s в начале программы надо инициализировать s:=0;

ответ дан 20 мая 2021 в 9:43

Sergey  Tatarintsev's user avatar

Sergey TatarintsevSergey Tatarintsev

5,8452 золотых знака5 серебряных знаков14 бронзовых знаков

1

Формулировка задачи:

Дан массив из N чисел в интервале от -32000 до 32000. (1<=N<=1000). Все элементы массива упорядочены (по возрастанию или по убыванию). Найти количество различных элементов в данном массиве. Ввести в первой строке одно число N. Во второй строке через один или несколько пробелов расположены N чисел. Вывести одно число – количество различных элементов в данном массиве.

Код к задаче: «Вычислить количество различных элементов в массиве»

textual

program z1644142;
 const nmax=1000;
 var n,i,k:integer;
     a:array [1..nmax] of integer;
begin 
 writeln('Введите количество элементов массива:');
 readln(n);
 writeln('Введите значения элементов массива:');
 for i:=1 to n do
  read(a[i]);
 k:=1;
  for i:=2 to n do
   if a[i-1]<>a[i]
    then k:=k+1;
 writeln(k)
end.

Полезно ли:

7   голосов , оценка 4.000 из 5

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