Как найти массив в информатике 9 класс

Массивы в Паскале


Массивы в Паскале

4.6

Средняя оценка: 4.6

Всего получено оценок: 501.

4.6

Средняя оценка: 4.6

Всего получено оценок: 501.

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

Массивы в Паскале

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

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

Одномерный массив

Рис. 1. Одномерный массив.

Объявление массива выполняется с помощью ключевого слова ARRAY с указанием размерности массива и типа его элементов.

Например, массив в разделе описания переменных можно задать так:

Var Mass: array[1..10] of integer;

Доступ к элементу в массиве осуществляется через указание индекса. Например, число 10 в массиве Mass имеет порядковый номер 6. Обращаться к конкретной ячейке следует по имени массива, указывая в квадратных скобках номер индекса, например, Mass [6].

Рис. 2. Двумерный массив.

Массивы могут быть как одномерными, так и многомерными. Двумерный массив выглядит в виде таблицы, трехмерный массив с виду похож на кубик Рубика.

Трехмерный массив

Рис. 3. Трехмерный массив.

Заполнение массива данными

Заполнить пустой массив данными можно следующими способами:

  • В тексте программы присвоить ячейкам числа.
  • Организовать ввод с клавиатуры.
  • Воспользоваться процедурой генерации случайных чисел.

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

Заполнение массива Mass (10) случайными числами можно программное реализовать так:

program Massiv ;
var i: integer; Mass: array[1..10] of integer;

randomize;

begin
for i:=1 to 10 do Mass [i]:=random(100);

end.

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

for i:=1 to 10 do write (Mass [i],` `);

Как видно из примера, для организации перебора индексов массива, используется циклическая конструкция оператора повтора с заданным числом повторений FOR .. TO.. DO.

Действия с массивами

Работа с массивами данных основывается на решении таких типовых задач, как:

  • Определение суммы или произведения элементов массива.
  • Поиск элемента в соответствии с определенным критерием.
  • Сортировка массива.

Рассмотрим примеры программ обработки массивов

Определение суммы элементов массива

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

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

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

program Summa;

var summ, i: integer; Mass: array[1..10] of integer;

begin

s:=0;

randomize;

for i:=1 to 10 do Mass[i]:=random(100);

for i:=1 to 10 do write (Mass[i],` `);

for i:=1 to 10 do summ:=summ+Mass[i];

writeln (‘Сумма элементов массива десяти целых чисел равна ‘, summ)

end.

Поиск элемента массива

В программируемых задачах обычно ищут наибольшее или наименьшее число, или число равное заданному.

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

Программа для поиска элемента в массиве может выглядеть так:

program Poisk;

var x, i, k: integer; Mass: array[1..10] of integer;

begin

write(‘Введите некоторое целое число k = ‘);

readln(k);

randomize;

for i:=1 to 10 do Mass[i]:=random(100);

for i:=1 to 10 do write (Mass[i],` `);

n:=0;

for i:=1 to 10 do

if Mass[i]=k then n:=i;

if n=0 then write(‘В массиве нет числа, равного заданному’) else write (‘Порядковый номер искомого числа равен’,i)

end.

Сортировка массива

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

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

Заключение

Что мы узнали?

Массивы представляют собой именованную совокупность данных одного типа. Ввод элементов массива удобнее всего осуществлять с клавиатуры или путем генерации случайных чисел. Обработка массива включает в себя вычисление суммы или произведения элементов массива, поиска элемента в соответствии с заданным условием и сортировку массива.

Тест по теме

Доска почёта

Доска почёта

Чтобы попасть сюда – пройдите тест.

  • Евгений Куклин

    10/10

  • Евгения Малык

    9/10

  • Artem Dubrovin

    7/10

  • Harvey Weber

    10/10

  • Даниэль Усманов

    6/10

  • Кирилл Васильевич

    7/10

  • Татьяна Алексеева

    10/10

Оценка статьи

4.6

Средняя оценка: 4.6

Всего получено оценок: 501.


А какая ваша оценка?

Типовые задачи на Паскале (массивы)

Массив
это упорядоченный набор однотипных элементов, обозначаемых одним именем; доступ
к элементу массива осуществляется по его номеру.

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

В программе для каждого массива должны быть указаны
его параметры: имя, размерность и размер. Бывают одномерные, двумерные и т.д.
массивы. Это называется размерностью.

Одномерные массивы (последовательности).

A: 3,-4,0,3,-5,10,0

A[1]=3, A[3]=0, A[7]=0

I
– номер элемента, A[I] – элемент массива, стоящий на I-ом месте

1.                 
Сформировать и
вывести на экран последовательность из n элементов, заданных датчиком случайных
чисел на интервале [-23, 34].

Program posled;

Var a: array[1..100] of integer;

      i, n: integer;

Begin

  Write (Сколько элементов? ‘); 

  Readln(n);

   For i:=1 to n do

       begin      

            a[i]:= Random(58)-23;

             write (a[i],‘ ‘);

       end;

End.

2. Найти произведение элементов одномерного массива,
состоящего из n элементов. Элементы
вводятся с клавиатуры.

Program proisveden;

Var a: array[1..100] of integer;

      i, n, p: integer;

Begin

  Write (Сколько элементов? ‘);  Readln (n);

  p:=1;

  For i:=1 to n do

     begin

       write (введите число); readln (a[i]);

       p:=p*a[i];

     end;

     writeln(‘произведение
элементов равно:  ‘
,p);

End.

3. Найти сумму элементов одномерного массива. Размер
произвольный. Элементы вводятся с клавиатуры.

Program summa;

Var a: array[1..100] of real;

      i, n: integer;

        s: real;

Begin

  Write (сколько элементов); Readln (n);

  s:=0;

  For i:=1 to n do

     begin

       write (введите число); readln (a[i]);

       s:=s+a[i];

     end;

     writeln(сумма  элементов равна  ‘,s);

End.

4. Задан массив А, состоящий из n чисел. Найти среднее арифметическое
его элементов. Элементы
вводятся с клавиатуры.

Program srednee;

Var a: array[1..100] of  real;

      i, n: integer;

        s,sred: real;

Begin

  Write (сколько элементов); Readln (n);

  s:=0;

  For i:=1 to n do

     begin

       write (введите число); readln (a[i]);

       s:=s+a[i];

     end;

   sred:=s/n;    

  writeln(‘среднее арифметическое  элементов: ‘,sred);

End.

5. Найти сумму элементов массива с четными
номерами, содержащего N элементов. Элементы
вводятся с клавиатуры.

Program sumshet;

Var a: array[1..100] of  real;

      i, n: integer;

        s: real;

Begin

  Write (сколько элементов); Readln (n);

  s:=0;

  For i:=1 to n do

     begin

       write (введите число); readln (a[i]);

       if i mod 2 = 0 then s:=s+a[i];

     end;

   writeln(‘сумма элементов
с четными номерами: ‘
,s);

End.

6. Сформировать и вывести на экран массив,
элементы которого заданы датчиком случайных чисел на интервале [-19, 26]
(размер произвольный). Найти произведение элементов с нечетными номерами.

Program proisvednechet;

Var a: array[1..100] of  integer;

      i, n, p: integer;

Begin

  Write (Сколько элементов? ‘);  Readln (n);

  P:=1;  

  For i:=1 to n do

       begin      

            a[i]:= Random(46)-19;

             writeln (a[i],‘ ‘);

            if i mod 2 <> 0 then P:=P*a[i];

       end;

  Writeln(‘Произведение
элементов с нечетными номерами: ‘
, P);

End.

7. Сформировать и вывести на экран массив,
элементы которого заданы датчиком случайных чисел на интервале [-56, 47]
(размер произвольный). Найти произведение элементов с четными номерами, которые
превосходят некоторое число t.

Program proisvedchetbolt;

Var a: array[1..100] of integer;

      i, n, p, t: integer;

Begin

  Write (Сколько элементов? ‘);  Readln (n);

  Write (Введите t ‘); Readln (t);

  P:=1;

  For i:=1 to n do

       begin      

            a[i]:= Random(104)-56;  writeln (a[i],‘ ‘);

            if (i mod 2 = 0) and (a[i]>t) then
P:=P*a[i];

       end;

  Writeln(‘Произведение
элементов с четными номерами, превосходящие число t:’
, P);

End.

8. Найти наименьший элемент одномерного массива, состоящего из n
элементов. Элементы

вводятся с клавиатуры.

Program minim;

Var a: array[1..100] of real;

      i, n: integer;

         min: real;

Begin

  Write (‘n=’); Readln (n);

  For i:=1 to n do

    begin

       write(‘a[‘,i,’]=’); readln
(a[i]);

    end;

  min:=a[1];

  For i:=2 to n do

     If a[i]< min then min:=a[i];

  Writeln(‘наименьшее число:   ‘,min);

End.

9. Найти номер наименьшего элемента в массиве, заданного датчиком
случайных чисел на интервале [-20, 25]. Размер
произвольный.

Program numberminim;

Var a: array[1..100] of integer;

      i, n, num, min: integer;

Begin

  Write (‘n=’); Readln (n);

  For i:=1 to n do

    begin

       
a[i]:= Random(46)-20;

        writeln (a[i]);

    end;

  min:=a[1];

  num:=1;

  For i:=2 to n do

       If a[i]< min then

            begin

                min:=a[i];

                num:=i;

            end;

  Writeln(‘ номер наименьшего элемента:   ‘,num);

End.

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

Program  kolv0;

Var a: array[1..100] of integer;

      i, n, k: integer;

Begin

  Write (‘n=’); Readln (n);

  For i:=1 to n do

    begin

       Write(‘a[‘,i,’]=’); readln
(a[i]);

       if a[i]=0 then k:=k+1;

    end;

  Writeln(‘количество 0
равно  ’, k);

end.

11. В заданном одномерном  массиве, состоящем из n  целых чисел,
подсчитать количество четных элементов.

Program  kolvсchet;

Var a: array[1..100] of integer;

      i, n, k: integer;

Begin

  Write (‘n=’); Readln (n);

  For i:=1 to n do

    begin

       Write(‘a[‘,i,’]=’); readln
(a[i]);

       if  a[i] mod 2=0 then k:=k+1;

    end;

  Writeln(‘количество четных
элементов: ’, k);

end.

12. Найдите среднее арифметическое элементов массива, состоящего из 10 чисел,
которые превышают по величине число С. Элементы вводятся с клавиатуры.

Program sredarifmet;

Var a: array[1..10] of  real;

      i, k: integer;

      C, S, sred: real;

Begin

  For i:=1 to 10 do

    begin

       write(‘a[‘,i,’]=’);    
readln (a[i]);

    end;

  write(‘введите С: ‘);
readln (C );

  For i:=1 to 10 do

    begin

       If a[i]>C then

           begin      S=S+a[i];    
K=K+1;   end;

     end;

   sred=S/k;

  
Writeln(‘среднее арифметическое чисел, превосходящих ‘,C,’  равно  ‘,sred);

End.

13. Найти произведение элементов целочисленного одномерного массива с
четными номерами, состоящего из n элементов. Элементы
вводятся с клавиатуры.

Program proizved_chet;

Var a: array [1..100] of integer;

   i, n, p: integer;

Begin

  p:=1;

 write (‘n=’);  readln (n);

  for i:=1 to n do

    begin

      write (‘a[‘,i,’]=’); readln
(a[i]);

      if i mod 2=0 then p:=p*a[i];

    end;

  Writeln (‘произведение
элементов массива с четными номерами равно ‘,p);

End.

14. Массив А вводится с клавиатуры.
Сформировать новый массив В, состоящий из четных элементов массива А. Элементы
вводятся с клавиатуры. Размер

n.

Program newmasiv;

Var a: array[1..100] of  integer;

       b: array[1..100] of  integer;

     n, i, k: integer;

Begin

  kol:=0; k:=0;

  write (‘n=’);  readln (n);

  For i:=1 to n do

    begin

       write(‘a[‘,i,’]=’);    
readln (a[i]);

       if a[i] mod 2=0 then

              begin

                   k:=k+1;
b[k]:=a[i]; kol:=kol+1;

              end;

          if kol=0 then writeln(‘четных элементов нет’) else   

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

    end;

Задачи для самостоятельной работы

1.      
Массив А вводится с
клавиатуры. Найти сумму его элементов. Размер произвольный.

2.      
Найти произведение
элементов, кратных 3 в массиве, заданном датчиком случайных чисел на интервале
[-28, 27]. Размер произвольный.

3.      
Массив А вводится с
клавиатуры. Найти среднее арифметическое его элементов с нечетными номерами.
Размер произвольный.

4.      
Массив А вводится с
клавиатуры. Найти сумму его элементов с четными номерами, произведение
отрицательных элементов, количество нечетных элементов. Размер произвольный.

5.      
Найти наибольший элемент и
его номер  в последовательности, элементы которой вводятся с клавиатуры. Размер
произвольный.

6.      
Найти средне
арифметическое элементов последовательности, превосходящих некоторое число С.
Массив задан датчиком случайных чисел на интервале [-44, 35]. Размер произвольный.
Значение С вводится с экрана.

7.      
Массив А вводится с
клавиатуры. Вывести только нечетные элементы. Размер произвольный.

8.      
Упорядочить данную
последовательность по убыванию. Элементы вводятся с клавиатуры. Размер
произвольный.

9.      
Упорядочить данную
последовательность по убыванию. Массив задан датчиком случайных чисел на
интервале [-54, 33]. Размер произвольный.

10.     Массив А вводится с клавиатуры. Сформировать
новый массив В, состоящий из положительных элементов массива А. Размер
произвольный.

11.     Массив задан датчиком случайных чисел на
интервале [-31, 45]. Сформировать новый массив В, состоящий из нечетных
элементов массива А. Размер произвольный.

12.    Массив А вводится с клавиатуры. Сформировать
новый массив В, состоящий из положительных элементов массива А и  найти в нем
наибольший элемент. Размер произвольный.

13.    Массив задан датчиком случайных чисел на
интервале [-37, 66]. Найти наименьший нечетный элемент. Размер произвольный.

Двумерные массивы (матрицы)

1. Сформировать с помощью датчика случайных чисел и
вывести на экран матрицу, размером МхN. Элементы
задаются на интервале [-20, 25].

Var a: array[1..50,1..50] of
integer;

      i, j, n, m: integer;

Begin

Write(‘сколько строк?’);
Readln(m);

Write(‘сколько столбцов?’);
Readln(n);

For i:=1 to m do

   begin

       For j:=1 to n do

          begin

              
a[i,j]:=int(rnd*46)-20;      

                write(a[i,j],’ ‘);

          end;

      writeln;

   end;

End.

2. В двумерном массиве, состоящем из n целых чисел,
найти сумму элементов в каждой строке. Размер
произвольный.

Program
summastrok;

Var a: array[1..50,1..50] of
integer;

      i, j, n, m,S: integer;

Begin

Write(‘сколько строк?’);
Readln(m);

Write(‘сколько столбцов?’);
Readln(n);

For i:=1 to m do

  For j:=1 to n do

       begin      

            
write(‘a[‘,i,’,’,j,’)=’);     readln (a[i,j]);      

      end;

For i:=1 to m do

  begin

     S:=0;

     For j:=1 to n do

       S:=S+a[i,j];

     Writeln(‘сумма элементов в ‘,i,’ строке равна  ‘,S);

  end;

End.

3. Найти наименьший элемент двумерного
массива. Размер MXN. Элементы задаются на интервале [-30, 45].

Program minim;

Var a: array[1..50,1..50] of
integer;

      i, j, n, m, min: integer;

Begin

Write(‘сколько строк?’);
Readln(m);

Write(‘сколько столбцов?’);
Readln(n);

For i:=1 to m do

   begin

       For j:=1 to n do

          begin

              
a[i,j]:=int(rnd*76)-30;  write(a[i,j],’ ‘);

          end;

      writeln;

   end;

min:=a[1,1];

  For i:=1 to m do

  For j:=1 to n do

     if a[i,j]< min then
min:=a[i,j];

  Writeln(‘наименьшее число   ‘,min);

End.

4. В двумерном  массиве, состоящем из целых
чисел, найти наименьший элемент и номер строки, в которой он находится.
Элементы
вводятся с клавиатуры. Размер MXN.

Program minim;

Var a: array[1..50,1..50] of
integer;

      i, j, m, n, min, K: integer;        

Begin

 Write(‘сколько строк?’);
Readln(m);

Write(‘сколько столбцов?’);
Readln(n);

For i:=1 to m do

For j:=1 to n do

       begin      
write(‘a[‘,i,’,’,j,’]=’);  readln (a[i,j]);  end;

min:=a[1,1]; K:=1;

  For i:=1 to m do

  For j:=1 to n do

     If a[i,j]< min then

        begin

           min:=a[i,j];    K:=i;

         end; 

  Writeln(‘наименьшее
число   ‘,min,’  находится в ‘, k , ‘ строке’);

End.

5. Найти сумму элементов в каждой строке
двумерного массива, состоящего из целых чисел. Размер
MXN. Элементы задаются на интервале [-19,
30].

program sumstr;

Var a: array[1..50,1..50] of
integer;

      i, j, n, m,sum: integer;

Begin

Write(‘сколько строк?’);
Readln(m);

Write(‘сколько столбцов?’);
Readln(n);

For i:=1 to m do

   begin

       For j:=1 to n do

          begin

              
a[i,j]:=int(rnd*50)-19;  write(a[i,j],’ ‘);

          end;

      writeln;

   end;

   for i:=1 to m do

     begin

       sum:=0;

       for j:=1 to n do
sum:=sum+a[i,j];

       writeln(‘сумма элементов в ‘,i,’ строке: ‘,sum);

     end;

end.

6. Подсчитать количество положительных элементов в каждой строке
матрицы размером МхN, элементы которой вводятся с клавиатуры.

program kolpolvstr;

Var a: array[1..50,1..50] of
integer;

      i, j, m, n, kol: integer;        

Begin

 Write(‘сколько строк?’);
Readln(m);

Write(‘сколько столбцов?’);
Readln(n);

For i:=1 to m do

  begin 

    For j:=1 to n do

       begin      
write(‘a[‘,i,’,’,j,’]=’);  readln (a[i,j]);  end;

    for i:=1 to m do

       begin

         kol:=0;

         for j:=1 to n do if
a[i,j]>0 then kol:=kol+1;

         writeln(‘количество положительных элементов в ‘,i,’
строке: ‘,kol);

        end;

     writeln;

   end;

end.

7. Сформировать матрицу типа  1 0 0 0

                   
                                       0 1 0 0

                                                          0
0 1 0

                                                          0
0 0 1

program formir;

Var a: array[1..50,1..50] of
integer;

      i, j, m, n: integer;        

Begin

 Write(‘сколько строк?’);
Readln(m);

Write(‘сколько столбцов?’);
Readln(n);

For i:=1 to m do

  begin 

    For j:=1 to n do

      begin

         if i=j then a[i,j]:=1 else
a[i,j]:=0;

         write(a[i,j]);

      end;

    writeln;

End.

8. Найти номер столбца массива размером МхN, в котором находится
наибольшее количество отрицательных элементов. Элементы
вводятся с клавиатуры.

program nomerstolb;

Var a: array[1..50,1..50] of
integer;

       b: array[1..50] of integer;

      i, j, m, n, max, jmax:
integer;
        

Begin

 Write(‘сколько строк?’);
Readln(m);

 Write(‘сколько столбцов?’);
Readln(n);

 For i:=1 to m do

  begin 

    For j:=1 to n do

       begin      

             
write(‘a[‘,i,’,’,j,’]=’);  readln (a[i,j]); 

       end;

    for j:=1 to m do

       begin

         b[j]:=0;

         for i:=1 to n do

              if a[i,j]<0 then
b[j]:=b[j]+1;

       end;

  max:=b[1]; jmax:=1;

  For j:=2 to n do

    begin

      if b[j]>max then

            begin

              max:=b[j]; jmax:=j;

            end;

     end;

  writeln(‘Наибольшее
количество отрицательных элементов в ‘;jmax ; ‘столбце’);

   end;

end.

9. Упорядочить каждый столбец матрицы по возрастанию. Массив размером
МхN, элементы которого задаются датчиком случайных чисел на интервале [-17;26].

program porydok;

Var a: array[1..50,1..50] of
integer;

      i, j, n, m,t,r: integer;

Begin

Write(‘сколько строк?’);
Readln(m);

Write(‘сколько столбцов?’);
Readln(n);

For i:=1 to m do

   begin

       For j:=1 to n do

          begin

              
a[i,j]:=int(rnd*44)-17;      

                write(a[i,j],’ ‘);

          end;

      Writeln;

   end;

For j:=1 to n do

  For r:=1 to m do

    For i:=1 to m-1 do

         if a[i,j]> a[i+1,j] then

            begin

                 t:= a[i,j];

                 a[i,j]:= a[i+1,j];

                 a[i+1,j]:= t;

            end;

For i:=1 to m do

  begin 

    For j:=1 to n do write(a[i,j],’
‘);

    Writln;

 end;

End.

10. Сформировать матрицу 1 1 1 1

                                                
2 2 2 2

                                                
3 3 3 3

program former;

Var a: array[1..3,1..4] of integer;

      i, j: integer;

Begin

For i:=1 to 3 do

  begin 

    For j:=1 to 4 do

          begin

             a[i,j]:=i;
write(a[i,j]);

        end;

    writln;

 end;

End.

11. Найти наибольшее
нечетное число в матрице размером МхN, элементы которой задаются датчиком
случайных чисел на интервале [-27, 38].

program maxnechet;

Var a: array[1..50,1..50] of
integer;

       b: array[1..50] of integer;

      i, j, n, m, p, max, k:
integer;

Begin

Write(‘сколько строк?’);
Readln(m);

Write(‘сколько столбцов?’);
Readln(n);

For i:=1 to m do

   begin

       For j:=1 to n do

          begin

                  
a[i,j]:=int(rnd*66)-27; 

                   write(a[i,j],’
‘);

          end;

       writeln;

   end;

kol:=0; p:=0;

For i:=1 to m do

     For j:=1 to n do

          If a[i;j]mod 2 <> 0
then

               begin

                   p:=p+1;
b[p]:=a[i,j]; k:=k+1:

                end;

if k=0 then writeln(‘нечетных элементов нет’) else

                                       begin

                                               
write(‘нечетные элементы:’);

                                               
max:=b[1];

                                               
for p:=1 to k do

                                                      
begin

                                              
             writ(b[p],’ ‘);

                                                            
if b[p]>max then max:=b[p];

                                                      
end;

                                                
writeln(‘наибольшее нечетное число’, max);

                                       
end;

Задачи для самостоятельной работы

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

2.  Подсчитать количество отрицательных элементов
в каждой строке матрицы размером МхN, элементы которой задаются с помощью
датчика случайных чисел на интервале [-35; 65].

3.  Подсчитать количество четных элементов в
каждом столбце матрицы размером МхN, элементы которой задаются с помощью
датчика случайных чисел на интервале [-98; 54].

4.  Подсчитать количество четных отрицательных
элементов в матрице размером МхN, элементы которой вводятся с клавиатуры.

5. Сформировать матрицу     1 1 1 1

                                               2 2 2 2

                                               3 3 3 3

                                               4 4 4 4

6. Сформировать матрицу     1 2 3 4

                                               1 2 3 4

                                               1 2 3 4

                                               1 2 3 4

7. Сформировать матрицу     0 0 0  1

                                               0 0 1 0

                                               0 1 0 0

                                               1 0 0 0

8. Найти номер наибольшего элемента массива размером
МхN, элементы которого задаются датчиком случайных чисел на интервале [-67;23].

9. Найти номер наибольшего элемента массива размером
МхN, элементы которого вводятся с клавиатуры.

10. Найти наибольший элемент массива размером МхN,
элементы которого задаются датчиком случайных чисел на интервале [-25;19].

11. Найти наименьший элемент массива размером МхN,
элементы которого вводятся с клавиатуры.

12. Найти сумму элементов в каждом столбце массива
размером МхN, элементы которого задаются датчиком случайных чисел на интервале
[-19;20].

13. Найти произведение элементов в каждом столбце
массива размером МхN, элементы которого вводятся с клавиатуры.

14. Найти произведение элементов в каждой строке
массива размером МхN, элементы которого вводятся с клавиатуры.

15. Найти произведение диагональных элементов массива
размером МхN, элементы которого вводятся с клавиатуры.

16. Найти сумму элементов, стоящих на побочной
диагонали массива размером МхN, элементы которого вводятся с клавиатуры.

17.
Найти номер столбца массива размером МхN, в котором находится наименьшее
количество положительных элементов. Элементы вводятся с клавиатуры.

18.
Найти номер строки массива размером МхN, в котором находится наименьшее
количество положительных элементов. Элементы вводятся с клавиатуры.

19.
Найти номер строки массива размером МхN, в котором находится наибольшее
количество четных элементов. Элементы задаются датчиком случайных чисел на
интервале [-54;61].

20.
Найти номер столбца массива размером МхN, в котором находится наибольшее
количество элементов, кратных 5. Элементы задаются датчиком случайных чисел на
интервале [-27;43].

21.
Найти наименьшее четное число в матрице размером МхN, элементы которой задаются
датчиком случайных чисел на интервале [-65, 45].

22.
Найти наибольшее число, кратное 3, в матрице размером МхN, элементы которой
вводятся с клавиатуры.

На занятии объясняется, как работать с одномерными массивами в Паскале, как использовать генератор случайных чисел — функцию random в Паскале. Рассматривается пример того, как вывести числа Фибоначчи

Материалы сайта labs-org.ru направлены на практическое освоение языка программирования Pascal. Краткие теоретические сведения не претендуют на полное освещение материала по теме; необходимую информацию можно найти в сети Интернет в большом количестве. В наши же задачи входит предоставление возможности получения практических навыков программирования на Паскале. Решенные наглядные примеры и задания изложены по мере увеличения их сложности, что позволит с легкостью изучить материал с нуля.

Содержание:

  • Одномерные массивы в Паскале
    • Объявление массива
    • Инициализация массива
    • Вывод элементов массива
    • Динамические массивы (pascalAbc.Net)
    • Функция Random в Pascal
    • Числа Фибоначчи в Паскале
    • Максимальный (минимальный) элемент массива
    • Поиск в массиве
    • Циклический сдвиг
    • Перестановка элементов в массиве
    • Выбор элементов и сохранение в другой массив
    • Сортировка элементов массива

Одномерные массивы в Паскале

Объявление массива

Массивы в Паскале используются двух типов: одномерные и двумерные.
Определение одномерного массива в Паскале звучит так: одномерный массив — это определенное количество элементов, относящихся к одному и тому же типу данных, которые имеют одно имя, и каждый элемент имеет свой индекс — порядковый номер.
Описание массива в Паскале (объявление) и обращение к его элементам происходит следующим образом:

Описание массива в Паскале

Объявление массива

var dlina: array [1..3] of integer;
begin
dlina[1]:=500; 
dlina[2]:=400; 
dlina[3]:=150;
...
  • dlina — идентификатор (имя) массива;
  • для объявления используется служебное слово Array (в переводе с англ. «массив» или «набор»);
  • [1..3] — в квадратных скобках ставится номер (индекс) первого элемента, затем две точки и индекс последнего элемента массива, т.е. по сути, указывается количество элементов; количество элементов массива называется размерностью массива
  • of integer (с англ. «из целых чисел») — указывает, к какому типу относится массив, of здесь — служебное слово.
  • Объявить размер можно через константу:

    размер массива через константу

    Инициализация массива

    Кроме того, массив может быть сам константным, т.е. все его элементы в программе заранее определены. Описание такого массива выглядит следующим образом:

    const a:array[1..4] of integer = (1, 3, 2, 5);

    Заполнение последовательными числами:
    заполнение массива

    Результат:
    A[1] = 8, A[2] = 9, A[3] = 10, ..., A[N] = A[N-1] + 1
    

    Ввод с клавиатуры:

    Пример: Рассмотрим, как происходит ввод массива в Паскале:

    writeln ('введите кол-во элементов: ');
    readln(n); {если кол-во заранее не известно, - запрашиваем его}
    for i := 1 to n do begin
       write('a[', i, ']=');
       read(a[i]);
       ...
    end;
    ...

    ввод массива с клавиатуры
    ✍ Пример результата:

    введите кол-во элементов: 
    3
    a[1]=5
    a[2]=7
    a[3]=4
    

    Вывод элементов массива

    Пример: Рассмотрим, как вывести массив в Паскале:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    var
      a: array[1..5] of integer; {массив из пяти элементов}
      i: integer;
    begin
    a[1]:=2;
    a[2]:=4;
    a[3]:=8;
    a[4]:=6;
    a[5]:=3;
    writeln('Массив A:');
    for i := 1 to 5 do
        write(a[i]:2); {вывод элементов массива}
    end.

    ✍ Пример результата:

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

    Задача Array 0. Необходимо задать вещественный массив размерностью 6 (т.е. из шести элементов); заполнить массив вводимыми значениями и вывести элементы на экран. Использовать два цикла: первый — для ввода элементов, второй — для вывода.

    Пример результата:

    введите элемент массива: 3.0
    введите элемент массива: 0.8
    введите элемент массива: 0.56
    введите элемент массива: 4.3
    введите элемент массива: 23.8
    введите элемент массива: 0.7
    Массив =  3, 0.8, 0.56, 4.3, 23.8, 0.7

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

    В данном примере работы с одномерным массивом есть явное неудобство: присваивание значений элементам.

    Обработка массивов в Паскале, так же как и заполнение массива, происходит обычно с использованием цикла for.

    Динамические массивы (pascalAbc.Net)

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

  • Основной особенностью динамических массивов является возможность выделения для них памяти на любом этапе выполнения программы.
  • Имеется возможность корректировки размера динамического массива как в сторону его уменьшения, так и в сторону увеличения.
  • Объявление:

    var a: array of integer;
    var n:=readInteger;
    a:=new integer[n]; // инициализация, выделение памяти для элементов массива

    или:

    var a: array of integer;
    var n:=readInteger;
    SetLength(a,n); // устанавливаем размер

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

    procedure p(a: array of integer);

    Созданные элементы сразу получают начальное значение, равное нулевому значению соответствующего типа: для чисел это целый или вещественный нуль, для символов — символ с кодом 0, для строк и других ссылочных типов данных — нулевая ссылка nil

    Объявление и инициализация массива:

    Пример:

    begin
      var a: array of integer;
      a := new integer[3];
      a[0] := 5;
      a[1] := 2;
      a[2] := 3;
    end.

    или в одну строку:

    begin
      var a: array of integer;
      a := new integer[3](5,2,3);
      print(a)
    end.

    или короткая запись:

    var a:=Arr(1,2,3);// по правой части - integer

    Элементы динамического массива всегда индексируются от 0.

    Ввод элементов:

    Пример:

    var a:=ReadArrInteger(5); // ввод пяти целых
    var a:=ReadArrReal(5); // ввод пяти вещественных

    Функции генерации массивов:

    1. ArrFill :

    var a := ArrFill(10, 1); // массив из 10 целых чисел, равных 1

    2. ArrGen :

    var a := ArrGen(ReadInteger, 1, e -> e + 2); // массив, состоящий из n первых положительных нечетных чисел
    a.Print;

    Проход по элементам массива:

    Пример:

    for var i:=0 to a.Length-1 do
      a[i] += 1;

    или:

    for var i := 0 to a.High do
      a[i] += 1;

    Проход по элементам (только для чтения):
    Пример:

    foreach var x in a do
      Print(x)
  • Размер динамического массива (т. е. количество его элементов) можно определить с помощью его свойства Length
  • Для динамического массива определены еще два свойства: Low и High, определяющие соответственно нижнюю и верхнюю границу диапазона изменения индекса. Свойство a.Low всегда возвращает 0, а свойство a.High определяется как a.High = a.Length – 1
  • Простой вывод элементов:

    Writeln(a); // пример вывода: [1,5,3,13,20]

    или метод массива Print:

    a.Print; // пример вывода: 1 5 3 13 20
    a.PrintLines; // каждый элемент с новой строки

    Функция Random в Pascal

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

    Для генерации чисел от 0 до n (не включая само значение n, целые числа в интервале [0,N)) используется запись random (n).
    Перед использованием функции необходимо инициализировать датчик случайных чисел с помощью процедуры randomize.

    Диапазон в Паскале тех самых случайных чисел от a до b задается формулой:

    Пример: Заполнение массива случайными числами в Pascal:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var f: array[1..10] of integer;
        i:integer;
    begin
    randomize;
    for i:=1 to 10 do
      begin
       f[i]:=random(10); { интервал [0,9] }   
       write(f[i],' ');
      end;
    end.

    ✍ Пример результата: 

    Для вещественных чисел в интервале [0,1):

    var x: real;
    ...
    x := random(0.0,1.0);;         { интервал [0,1), т.е. единица не включена }

    PascalABC.NET:

  • Сгенерированный случайным образом кортеж из двух (Random2), либо из трех (Random3) элементов:
  • var (a, b, c) := Random3(10.0, 20.0); // диапазон [10, 20)
    write(a:0:2,' ',b:0:2,' ', c:0:2) // 14.73 18.63 19.72
  • Массив из 10 сгенерированных случайным образом целых чисел в диапазоне [0;99]:
  • Пример:

    var a:=arrRandomInteger(10);

    или с дополнительными параметрами (диапазон [5;15]):

    var a:=arrRandomInteger(10,5,15);

    Задача Array 1. Необходимо задать массив размерностью 5, заполнить массив случайными числами в интервале [-1,1] и вывести элементы на экран: определить три позиции для вывода каждого элемента, с двумя знаками после запятой.

    Пример результата:

    Массив =  0.22 0.00 -0.69 -0.35 -0.11 

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

    Числа Фибоначчи в Паскале

    Наиболее распространенным примером работы с массивом является вывод ряда чисел Фибоначчи в Паскаль. Рассмотрим его.

    Пример: Ряд чисел Фибоначчи: 1 1 2 3 5 8 13…

    f[0]:=1;   
    f[1]:=1; 
    f[2]:=2;

    или

    f[2]:=f[0]+f[1];
    f[3]:=f[1]+f[2];

    или

    Получили формулу элементов ряда.

    Пример: Вычислить и распечатать первые 20 чисел Фибоначчи.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var i:integer;
    f:array[0..19]of integer;
    begin
    f[0]:=1;
    f[1]:=1;
    for i:=2 to 19 do
    begin
      f[i]:=f[i-1]+f[i-2];
      writeln(f[i])
    end;
    end.

    На данном примере, становится понятен принцип работы с числовыми рядами. Обычно, для вывода числового ряда находится формула определения каждого элемента данного ряда. Так, в случае с числами Фибоначчи, эта формула-правило выглядит как f[i]:=f[i-1]+f[i-2]. Поэтому ее необходимо использовать в цикле for при формировании элементов массива.

    Задача Array 2. Дан ряд из 10 произвольных чисел: a[1], a[2], ... , a[10] (использовать функцию random()). Подсчитать и напечатать суммы троек стоящих рядом чисел: a[1]+a[2]+a[3], a[2]+a[3]+a[4], a[3]+a[4]+a[5], …… , a[8]+a[9]+a[10]

    Пример результата:

    Массив =  2 0 4 29 3 11 26 11 9 4 
    mas[1] + mas[2] + mas[3] = 6
    mas[2] + mas[3] + mas[4] = 33
    mas[3] + mas[4] + mas[5] = 36
    mas[4] + mas[5] + mas[6] = 43
    mas[5] + mas[6] + mas[7] = 40
    mas[6] + mas[7] + mas[8] = 48
    mas[7] + mas[8] + mas[9] = 46
    mas[8] + mas[9] + mas[10] = 24

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

    Задача Array 3. Написать программу решения задачи о печати ряда чисел 2 4 8 16 32 ... 512; для заполнения массива использовать цикл Repeat
    [Название файла: taskArray3.pas]

    Максимальный (минимальный) элемент массива

    Псевдокод:
    Максимальный (минимальный) элемент массива

    Поиск максимального элемента по его индексу:
    максимальный элемент по номеру


    PascalABC.NET:

    Минимальный элемент и его индекс:

    Решение 1:

      // …
      var (min, minind) := (a[0], 0);  
      for var i:=1 to a.Length-1 do
        if a[i]<min then
          (min, minind) := (a[i], i);  Result := (min, minind);

    Решение 2:

      // …
      var (min, minind) := (real.MaxValue, 0);  
      for var i:=0 to a.Length-1 do
        if a[i]<min then
          (min, minind) := (a[i], i);  Result := (min, minind);

    Решение 3:

    begin
      var a := new integer[5];
      a := arrRandomInteger(5); // [86,37,41,45,76] 
      print(a.Min,a.IndexMin); // 37  1
    end.

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

    Пример результата:

    9 5 4 22 23 7 3 16 16 8 
    Минимальный элемент массива A[7]=3
    

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

    Задача Array 4. Дан массив из 10 целочисленных элементов. Найти количество отрицательных и вывести количество на экран.

    Пример результата:

    3 4 6 -1 6 -2 1 5 0 1 
    Количество отрицательных элементов: 2
    

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

    Задача Array 5. Найти минимальное и максимальное из n введенных чисел (массива). Определить расстояние между этими элементами.

    3  2  6  1  3  4  7  2  >>>  min=1, max=7, distance=3
    

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

    Задача Array 6. Дан целочисленный массив размера N. Вывести все содержащиеся в данном массиве четные числа в порядке убывания их индексов, а также их количество K.

    N=4
    mas: 8 9 2 5
    >>> 2 8 количество= 2
    

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

    Задача Array 7. Ввести с клавиатуры массив из 5 элементов, найти в нем два максимальных элемента и их номера.

    Пример:

    Исходный массив:
    4   -5   10  -10  5
    максимальные A[3]=10, A[5]=5
    

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

    Поиск в массиве

    Рассмотрим сложный пример работы с одномерными массивами:

    Пример: Дан массив из 10 чисел. Определить, есть ли в массиве число, введенное пользователем. Если есть – выводить «найдено», если нет – «не найдено».
    Сложность задания заключается в том, что выводить слова «найдено» или «не найдено» необходимо один раз.

    Для решения поставленной задачи понадобится оператор break — выход из цикла.
    Решение Вариант 1. Цикл for:


    PascalABC.NET:

    Cтандартные методы a.IndexOf(x) и a.LastIndexOf(x):

    begin
      var a := new integer[10];
      a := arrRandomInteger(5,0,5); //[1,3,5,4,5] 
      print(a.IndexOf(3)) // 1
    end.

    или метод a.Contains(x) наравне с x in a:

    begin
      var a := new integer[10];
      a := arrRandomInteger(5,0,5); //[1,3,5,4,5] 
      print(a.Contains(3)); // True
      print(3 in a)// True
    end.

    Рассмотрим эффективное решение:

    Задача: найти в массиве элемент, равный X, или установить, что его нет.

    Алгоритм:

    • начать с 1-го элемента (i:=1);
    • если очередной элемент (A[i]) равен X, то закончить поиск иначе перейти к следующему элементу.

    решение на Паскале Вариант 2. Цикл While:

    Поиск элемента в массиве

    Поиск элемента в массиве

    Предлагаем посмотреть подробный видео разбор поиска элемента в массиве (эффективный алгоритм):

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

    Пример:

    	 Исходный массив:
    	 4  0  1  2  0  1  3  4  1  0
    	 Что ищем? 0
    	 A[2], A[5], A[10]
    

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

    Циклический сдвиг

    Пример: сдвинуть элементы массива влево на 1 позицию, первый элемент становится на место последнего.
    циклический сдвиг

    Решение:

    Алгоритм:
    A[1]:=A[2]; A[2]:=A[3];… A[N-1]:=A[N];

    Программа:
    сдвиг элементов массива


    PascalABC.NET:

    Циклический сдвиг влево:

      // …
      var v := a[0];
      for var i:=0 to a.Length-2 do
        a[i] := a[i+1];
      a[a.Length-1] := v;

    Циклический сдвиг вправо:

      // …
      var v := a[a.Length-1];
      for var i:=a.Length-1 downto 1 do
        a[i] := a[i-1];
      a[0] := v;

    Задача Array 9. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и выполнить циклический сдвиг влево без первого элемента.
    Пример:

    Исходный массив:
      4  -5   3  10  -4  -6   8 -10  1  0
    Результат:
      4   3  10  -4  -6   8 -10   1  0 -5
    

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

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

    Рассмотрим, как происходит перестановка или реверс массива.

    Пример: переставить элементы массива в обратном порядке
    реверс массива

    Решение:

    Алгоритм:
    алгоритм перестановки элементов массива

    Псевдокод:
    2

    Программа:
    перестановка элементов массива


    PascalABC.NET:

    Перестановка (ревёрс):

    Решение 1:

    begin
    var a: array of integer := (1,3,5,7); 
    var n := a.Length;
    for var i:=0 to n div 2 - 1 do
        Swap(a[i],a[n-i-1]);
    End.

    Решение 2 (стандартная процедура Reverse()):

    begin
    var a:=new integer[10];
    a:=arrRandomInteger(10);
    print(a);// [41,81,84,63,12,26,88,25,36,72] 
    Reverse(a);
    print(a) //[72,36,25,88,26,12,63,84,81,41] 
    end.

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

     Исходный массив:
    -5  3   10  -4  -6   8 -10  1   0  4
     Результат:
    0  1  -10   8  -6  -4  10  3  -5  4
    

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

    Выбор элементов и сохранение в другой массив

    Пример: найти в массиве элементы, удовлетворяющие некоторому условию (например, отрицательные), и скопировать их в другой массив
    выбор элементов массива

    Решение:

    Решение: подсчитывать количество найденных элементов с помощью счетчика count, очередной элемент устанавливать на место B[count]. Переменой count необходимо присвоить 1.

    сохранение элементов массива в другой
    Вывод массива B:

    writeln('Выбранные элементы');
    for i:=1 to count-1 do
       write(B[i], ' ')

    PascalABC.NET:

    Процедура SetLength():

    // ...
    for var i := 0 to a.length - 1 do 
        if a[i] < 0 then
        begin
          b[j] := a[i];
          j += 1;
        end;
      SetLength(b, j);

    Задача Array 11. Заполнить массив случайными числами в интервале [20,100] и записать в другой массив все числа, которые оканчиваются на 0.
    Пример:

    	 Исходный массив:
    	 40   57   30  71  84
    	 Заканчиваются на 0:
    	 40 30
    

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

    Сортировка элементов массива

    Сортировка методом «Пузырька»

    • В таком типе сортировок массив представляется в виде воды, маленькие элементы — пузырьки в воде, которые всплывают наверх (самые легкие).
    • При первой итерации цикла элементы массива попарно сравниваются между собой:предпоследний с последним, пред предпоследний с предпоследним и т.д. Если предшествующий элемент оказывается больше последующего, то производится их обмен.
    • При второй итерации цикла нет надобности сравнивать последний элемент с предпоследним. Последний элемент уже стоит на своем месте, он самый большой. Значит, число сравнений будет на одно меньше. То же самое касается каждой последующей итерации.

    сортировка методом пузырька

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    8
    
    for i:=1 to N-1 do begin
       for j:=N-1 downto i do
         if A[j] > A[j+1] then begin
           с := A[j];
           A[j] := A[j+1];
           A[j+1] := с;
         end;
     end;
    1
    2
    3
    4
    
    for var i := 0 to arr.High - 1 do
        for var j := arr.High - 1 downto i do
          if arr[j] > arr[j + 1] then 
            Swap(arr[j], arr[j + 1]);

    Задача Array 12. Заполнить массив из 10 элементов случайными числами в интервале [0..100] и отсортировать первую половину массива по возрастанию, а вторую – по убыванию (методом ‘Пузырька’).

    Пример:
    Исходный массив:
    14  25  13  30  76  58  32  11  41  97
    Результат:
    13  14  25  30  76  97  58  41  32  11

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

    Сортировка методом выбора

    • в массиве ищется минимальный элемент и ставится на первое место (меняется местами с A[1]);
    • среди оставшихся элементов также производится поиск минимального, который ставится на второе место (меняется местами с A[2]) и т.д.

    сортировка методом вставки

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    for i := 1 to N-1 do begin
      min:= i ;
      for j:= i+1 to N do
        if A[j] < A[min] then min:=j; 
      if min <> i then begin
        c:=A[i]; 
        A[i]:=A[min]; 
        A[min]:=c;
      end;
    end;
    1
    2
    3
    4
    5
    6
    7
    8
    
    for var i := 0 to a.High-1 do
      begin
        var (min,imin) := (a[i],i);
        for var j := i + 1 to a.High do
          if a[j] < min then
            (min,imin) := (a[j],j);
        Swap(a[imin],a[i]);
      end;

    Задача Array 13: Заполнить массив из 10 элементов случайными числами в интервале [0..50] и отсортировать его по возрастанию суммы цифр

    Пример:
    Исходный массив:
    14  25  13  12  76  58  21  87  10  98
    Результат:
    10  21  12  13  14  25  76  58  87  98  
    

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


    PascalABC.NET:

    Стандартная процедура sort():

    Sort(a);
    SortByDescending(a);

    Быстрая сортировка или quick sort

    Алгоритм:

    1. Выбирается и запоминается средний элемент массива (присвоим X):
    2. быстрая сортировка

    3. Инициализируем две переменные (будущие индексы массива): L:=1, R:=N (N — количество элементов).
    4. Увеличиваем L и ищем первый элемент A[L], который больше либо равен X (в итоге он должен находиться справа).
    5. Уменьшаем R и ищем элемент A[R], который меньше либо равен X (в итоге он должен находиться слева).
    6. Смотрим, если L<=R, то меняем местами A[L] и A[R], возвращаемся к пункту 3.

    быстрая сортировка паскаль

    Выполнение на Паскале:
    1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    procedure QSort ( first, last: integer);
    var L, R, c, X: integer;
    begin
      if first < last then begin
        X:= A[(first + last) div 2];
        L:= first; R:= last;
     while L <= R do begin
       while A[L] < X do L:= L + 1;
       while A[R] > X do R:= R - 1;
       if L <= R then begin
         c:= A[L]; A[L]:= A[R]; A[R]:= c;
         L:= L + 1; R:= R - 1;
       end;
     end;
      QSort(first, R);   QSort(L, last);
      end;
    end.

    Задача Array 14:
    Заполнить массив из 10 элементов случайными числами в интервале [-50..50] и отсортировать его с помощью алгоритма быстрой сортировки.

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

    Понятие «массив» носит фундаментальный характер. Самым удобным способом хранения большого количества однотипных данных является массив. Обработка массивов является основой практически любой программы.

    Школьник, который умеет обрабатывать массивы, может считать себя начинающим программистом.

    Созданная обучающая программа может использоваться при изучении темы «Одномерные массивы в языке программирования Паскаль» в среднем и старшем звене общеобразовательной школы. 

    В презентации имеется главное меню, то есть Содержание (Презентеция), с которого с помощью гиперссылок мы можем перейти на любой пункт меню (слайд 2).

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

    1.  Одномерный массив

    1.1.  Понятие «массив»

    С понятием «массив» приходится сталкиваться при решении научно-технических и экономических задач обработки совокупностей большого количества значений. В общем случае массив – это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип.

    Название регулярный тип (или ряды) массивы получили за то, что в них объединены однотипные (логически однородные) элементы, упорядоченные (урегулированные) по индексам, определяющим положение каждого элемента в массиве. (Приложение 1 [13, с.181])

    Массив – это составной объект, образованный из элементов (компонент) одного и того же типа. Такой тип данных применяется в программировании для обозначения объектов, аналогичных числовым последовательностям в математике, где сразу целая группа чисел обозначается одним именем (чаще всего буквой), а для обращения к каждому отдельному числу данной последовательности используются различные индексы (номера элементов). В математике это может выглядеть, например, так:

    a1, а2, а3, …, аn.

    Таким образом, в программировании массив – это последовательность однотипных элементов, имеющих общее имя, причем каждый элемент этой последовательности определяется порядковым номером (индексом) элемента.

    Примеры массивов:

    • Х1, Х2, …, Хnодномерный массив, состоящий из n элементов;
    • А0, А1, А2, …, А10одномерный массив,состоящий из 11 элементов.

    Массивы бывают одномерными  (один индекс), двумерными (два индекса) и т.д.

    Структура массива всегда однородна. Массив может состоять из элементов типа integer , real или char , либо других однотипных элементов. Другая особенность массива состоит в том, что к любой его компоненте можно обращаться произвольным образом. Программа может сразу получить нужный ей элемент по его порядковому номеру (индексу). Номер элемента массива называется индексом. Индекс – это значение порядкового типа, определенного, как тип индекса данного массива. (Приложение 1 [13, с.181]). Тип индекса определяет границы изменения значений индекса.

    Рассмотрим массив Х1, Х2, …, Хn.  Здесь

    • Х – имя массива;
    • 1, 2,…, n – индексы (порядковые номера) элементов;
    • Х7седьмой элемент массива Х.

    1.2. Описание одномерных массивов

    Одномерный массив – это фиксированное количество элементов одного типа, объединенных одним именем, причем каждый элемент имеет свой уникальный номер, и номера элементов идут подряд. (Приложение 1 [12, с.100])

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

    Тип массив описывается следующим образом:

    Type

           Имя типа = Array [тип индекса (ов)] Of  тип элементов;

    Var

           Имя переменной: имя типа;

    Переменную типа массив можно описать сразу в разделе описания переменных Var:

    Var   Имя переменной: array [тип индекса (ов)] Of  тип элементов;

    Здесь

    • Array – служебное слово (в переводе с английского означает «массив»);
    • Of – служебное слово (в переводе с английского означает «из»).
    • Тип индекса – любой порядковый тип, кроме типов integer, longint.
    • Тип же самих элементов может быть любым, кроме файлового типа.
    • Количество элементов массива называется его размерностью. Несложно подсчитать, что при последнем способе описания множества индексов размерность массива равна: максимальное значение индекса – минимальное значение индекса + 1.

    Например:

    Type

           mas = array [1..20] of  real;

    Var  X: mas;

    Массив Х – одномерный, состоящий из двадцати элементов вещественного типа. Элементы массива хранятся в памяти компьютера последовательно друг за другом.

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

    Индексы элементов массива могут начинаться с любого целого числа, в том числе и отрицательного, например:

    Type bb = Array [-5..3] Of Boolean;

    Массивы данного типа будут содержать 9 логических переменных, пронумерованных от -5 до 3.

    1.3. Ввод и вывод одномерных массивов в Паскале

    Ввод и вывод массивов осуществляется поэлементно.

    Введем одномерный массив Х, состоящий из 30 элементов, то есть необходимо ввести некую последовательность элементов Х1, Х2, …, Х30.

    Пусть iиндекс (порядковый номер) элемента в массиве Х. Тогда

    Хii-й элемент массива Х, где i = 1, 2, …, 30.

    Для ввода массива можно использовать любой цикл.

    Первый вариант: ввод массива с использованием цикла с предусловием (Рисунок 1).

    Program Primer_1;

    Var i: integer;

         X: array [1..30] of Integer;

    Begin

         i := 1;

         While i <= 30 Do

             Begin

                Read (X[i]); i := i + 1

              End;

           Readln

    End.

    Можно ввести с клавиатуры элементы следующим образом:

    -7 _ 4 _ -2 _ 0 _ 12 _ -1 _ -5 _  9 _ 11 _ -3 _ -5 _ … _15, то есть через пробел ввести в строчку и нажать клавишу Enter.

    Можно было ввести элементы в столбец,   отделяя элементы клавишей Enter, то есть каждый элемент с новой экранной строки:

    -7 Enter

     4 Enter

    -2 Enter

      …

      …

      …

     15 Enter

    В первом варианте ввод массива Х в программе осуществляется с использованием цикла с предусловием.

    Второй вариант: ввод массива с использованием цикла с постусловием (Рисунок 2).

    Program Primer_2;

    Var i: integer;

         X: array [1..30] of Integer;

    Begin

         i := 1;

         Repeat

               Read (X[i]); i := i + 1

         Until i > 30;

           Readln

    End.

    Массив X введен с использованием цикла с постусловием.

    Третий вариант: ввод массива с использованием цикла с параметром (Рисунок 3).

    Program Primer_3;

    Var i: integer;

         X: array [1..30] of Integer;

    Begin

         For i := 1 To 30 Do Read (X[i]);

         Readln

    End.

    Массив вводится с помощью цикла с параметром, где в качестве параметра используется индекс элемента массива (i).

    Вывод одномерного массива осуществляется аналогично.

    В программе вместо операторов Read или Readln используются операторы Write или Writeln. Но просто заменить одни операторы на другие здесь недостаточно. Для того чтобы выводимые значения не сливались между собой, надо явным образом вставлять между ними разделитель – пробел или перевод строки. Приведем два возможных способа вывода массива:

    • For i := 1 To n Do Write (X[i],’ ‘);
    • For i := 1 To n Do Writeln (x[i]).

    На первый взгляд второй способ может показаться более простым и удобным, но это далеко не всегда так. Результат работы такой программы зачастую неудобно, а то и просто невозможно анализировать. Ведь каждый элемент массива будет располагаться в отдельной строке, следовательно, мы не сможем увидеть более 25 элементов одновременно. Кроме того, очень часто массив требуется распечатать дважды, чтобы сравнить состояние массива до обработки и результат его обработки. В этом случае сравнение состояний массива гораздо удобнее проводить, если они распечатаны в двух соседних строках, а элементы выровнены по столбцам, то есть к варианту 1 должна быть добавлена еще и форматная печать (указано количество позиций, которое должно отводиться на печать одного элемента).

    Например, выведем одномерный массив Х1, Х2, …, Хn, состоящий из элементов вещественного типа, используя цикл с параметром (Рисунок 4):

    Program Primer_4;

    Const n = 30;

    Var i: Integer;

         X: Array [1..n] Of Real;

    Begin

            For i:= 1 To n Do Write (X[i] : 6 : 2,  ‘ ‘);

              Writeln; {курсор переводит на новую строку}

            Readln

    End.

    2.  Примеры решения задач

    2.1. Вычисление суммы и произведения элементов массива, удовлетворяющих заданному условию.

    Задача 1. Дан целочисленный одномерный массив, состоящий из n элементов. Найти сумму и произведение нечетных элементов, кратных 3. (Презентация)

    Введем обозначения: n – количество элементов в массиве; А – имя массива; i – индекс элемента массива; Ai – i-й элемент массива A; s – сумма нечетных элементов массива, кратных 3; p – произведение нечетных элементов массива, кратных 3.

    Входные данные: n, A.

    Выходные данные: s, p.

    Первоначально сумма искомых элементов равна нулю: не просуммировано ни одно слагаемое, то есть s:=0. Далее, используя любой оператор цикла, просматриваем весь массив от первого и до последнего элемента. И если при этом элемент массива нечетный и кратен 3, то к уже накопленной сумме добавляется очередное слагаемое, т.е. s:= s + A[i]. Здесь слева и справа от знака присваивания записано имя одной и той же переменной s, именно это обеспечивает постепенное накопление суммы: s справа – уже вычисленное известное значение суммы, s  – ее новое, вычисляемое значение.

    При просмотре массива можно сразу вычислить и произведение элементов массива, удовлетворяющих заданному условию. Произведение вычисляется с помощью оператора p:=p*A[i]. При этом p справа и p слева имеют разные значения: p справа – уже известное, вычисленное ранее значение произведения, p слева – новое, вычисляемое его значение. Первоначально искомое произведение равно единице, т.е. p:=1.

    При решении этой задачи можно использовать любой из видов циклов. Рассмотрим несколько вариантов решения задачи.

    Первый способ.  Для решения используется цикл с параметром:

    Program Primer1_1;

    Var A: Array[1..20] Of Integer;

          i, n, s, p: Integer;

    Begin

         Write (‘n=’); Readln (n);

         For i:=1 To n Do Readln (A[i]);   {ввод массива}

         s:= 0;  p:=1;

         For i:=1 To n Do   {обработка массива}

          If (A[i] mod 2 <>0) and (A[i] mod 3 = 0) Then

          Begin

              s:=s+A[i];  p:= p*A[i]

          End;

          Writeln (‘s=’, s, ‘p=’, p);

          Readln

          End.

    Второй способ. Для решения используется цикл с предусловием:

    Program Primer1_2;

    Var A: Array[1..20] Of Integer;

          i, n, s, p: Integer;

    Begin

         Write (‘n=’); Readln (n); i:=1;

         While i <= n Do

          Begin     

          Readln (A[i]);   i:= i + 1

          End;

         s:= 0;  p:=1; i:=1;

         While i<=n  Do  

         Begin

                 If (A[i] mod 2 <>0) and (A[i] mod 3 = 0) Then

    Begin

              s:=s+A[i]; p:= p*A[i]

      End;  i:= i + 1

          End;     

          Writeln (‘s=’, s, ‘p=’, p);

          Readln

          End.

    2.2. Нахождение количества элементов, удовлетворяющих заданному условию

    Задача 2. Дан массив целых чисел. Найти количество тех элементов, значения которых положительны и не превосходят заданного натурального числа А. (Презентация)

    Введем обозначения: n – количество элементов в массиве; X – имя массива; i – индекс элемента массива; Xii-й элемент массива X; А – заданное число; k – количество элементов, значения которых положительны и не превосходят заданного числа А.

    Входные данные: n, X, A.                                  

    Выходные данные: k.

    Вводим с клавиатуры значение числа А. Количество элементов, значения которых положительны и не превосходят заданного числа А, вначале полагаем равным нулю, то есть k:=0. Если очередной элемент массива положителен и не превосходят заданного числа A, то количество таких элементов нужно увеличить на единицу, то есть k:=k + 1. Таким образом, обрабатываются все элементы массива.

    При решении этой задачи можно использовать любой из видов циклов. Рассмотрим несколько вариантов решения задачи.

    Первый способ.  Для решения используется цикл с параметром:

    Program Primer2_1;

    Var X: Array[1..20] Of Integer;

          i, n, k, A: Integer;

    Begin

         Write (‘n=’); Readln (n);

         For i:=1 To n Do Readln (X[i]);   {ввод массива}

          Write (‘A=’);  Readln (A); k:= 0; 

         For i:=1 To n Do   {обработка массива}

          If (X[i] >0) and (X[i] <= A) Then k:=k + 1;

          Writeln (‘k=’, k);

          Readln

          End.

    Второй способ. Для решения используется цикл с постусловием:

    Program Primer2_2;

    Var X: Array[1..20] Of Integer;

          i, n, k, A: Integer;

    Begin

         Write (‘n=’); Readln (n); i:=1;

         Repeat

               Read (X[i]); i := i + 1

         Until i > n;

          Write (‘A=’); Readln (A); k:= 0; i:=1;

         Repeat

          If (X[i] >0) and (X[i] <= A) Then

              k:=k + 1; i := i + 1

         Until I > n;

          Writeln (‘k=’, k);

          Readln

          End.

    2.3. Нахождение номеров элементов, обладающих заданным свойством

    Задача 3. Найти номера четных элементов, стоящих на нечетных местах. (Презентация)

    Введем обозначения: n – количество элементов в массиве; X – имя массива; i – индекс элемента массива; Xi – i-й элемент массива Х.

    Входные данные: n, X.

    Выходные данные: i.

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

    Составим программу с помощью цикла с параметром:

    Program Primer3_1;

    Var X: Array[1..20] Of Integer;

          i, n:  Integer;

    Begin

         Write (‘n=’); Readln (n);

         For i:=1 To n Do Readln (X[i]);   {ввод массива}

          For i:=1 To n Do   {обработка массива}

          If (X[i] mod 2 = 0) and (i mod 2<>0) Then Write (i:5);

          Readln

          End.

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

    Введем обозначения: n – количество элементов в массиве; А – имя массива; i – индекс элемента массива; Ai – i-й элемент массива A; m – номер последнего отрицательного элемента массива.

    Входные данные: n, A.

    Выходные данные: m.

    Последний отрицательный элемент массива – это первый отрицательный элемент, который встретится при просмотре массива с конца. Если очередной элемент не является отрицательным, то нужно уменьшать значение текущего индекса (i:=i-1), пока он не станет меньше номера первого элемента или не будет найден отрицательный элемент. Переменная m получает значение i (номер отрицательного элемента), т.е. m := i. Если в массиве нет отрицательного элемента, то значение переменной m остается равным нулю.

    Program Primer3_2;

    Const n=10;

    Var A: Array[1..n] Of Integer;

          i, m: Integer; 

    Begin

          For i:=1 To n Do Readln (A[i]);   {ввод массива}

          m := 0;  i:=n;

          While  (i >= 1) and (A[i] >=0) Do i:=i-1;    m:=i;

           Writeln (‘m=’, m);

          Readln

          End.

    Содержание

    1. Работа с одномерными массивами на языке программирования Паскаль
    2. Одномерный числовой массив
    3. Способы заполнения одномерных массивов
    4. Ручной ввод данных
    5. Заполнение случайными числами
    6. Ввод данных по заданному правилу (формуле)
    7. Ввод данных из текстового файла
    8. Вывод линейного массива
    9. Шаблон для использования в однотипных задачах
    10. Задачи с решением
    11. Простая обработка элементов
    12. Сортировка элементов одномерного массива
    13. Задачи с использованием массива

    Работа с одномерными массивами на языке программирования Паскаль

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

    В Pascal используются одномерные и двумерные массивы. В школьной программе обычно их изучают в 9-10 классах.

    Одномерный массив — это конечное количество однотипных элементов, объединенных общим именем. Каждому элементу присвоен свой порядковый номер. Обращение к элементам происходит по имени массива и индексу (порядковому номеру).

    Одномерный числовой массив

    Одномерные массивы называют линейными, так как элементы расположены друг за другом. Их можно представить в виде таблицы, в которой всего две строки. В первой перечислены индексы элементов, а во второй — значения элементов.

    одномерный массив в паскале

    Одномерный массив. Обозначение элементов

    Имя массива формируется по тем же правилам, что и имя любой другой переменной в программе. Границы индексов задают при описании массива в квадратных скобках. Удобнее задавать начальный индекс равный единице. Конечный индекс определяется условием задачи и численно равен размеру массива — количеству элементов. Числовые массивы могут содержать целые и действительные числа. Тип элементов указывается в описании. Смотрите рисунок выше.

    Способы заполнения одномерных массивов

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

    var
      i:integer;
      a: array[1..5] of integer; {определение одномерного массива из пяти целых чисел}

    Ручной ввод данных

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

    for i:=1 to 5 do
      read a[i]; {ручной ввод значений элементов массива с клавиатуры}

    Заполнение случайными числами

    В задачах на массивы, количество элементов может быть достаточно большим. Использование ручного ввода становиться затруднительным. В этом случае для удобства отладки и проверки работоспособности программы целесообразнее использовать другие способы заполнения. Например, случайные числа, сгенерированные служебной функцией Random().

    for i:=1 to 5 do
      a[i]:=random(10); {задаются случайные числа из интервала [0,10)}

    Ввод данных по заданному правилу (формуле)

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

    for i:=1 to 5 do
      a[i]:=i*i; {квадрат натурального числа - число, умноженное само на себя}

    Ввод данных из текстового файла

    Еще один способ получить данные — прочитать их из файла.

    Подробнее про работу с файлами на Паскале читайте здесь.

    Вывод линейного массива

    В языке программирования Pascal ABC вывод элементов одномерного массива организуется с помощью цикла.

    for i:=1 to 5 do write (a[i]);
    или так
    for i:=1 to 5 do print (a[i]);

    Шаблон для использования в однотипных задачах

    Определение, заполнение и вывод одномерного массива.

    var
      i,n:integer;
      a: array[1..100] of integer; {определение одномерного массива из 100 целых чисел}
    begin
    write('Введите количество элементов в массиве');
    readln(n);
    for i:=1 to n do
      begin
        a[i]:=random(100)-random(100);{заполнение случайными числами из интервала (-100;100)}
        print (a[i]); {можно использовать write}
      end;
    {здесь записывается код обработки по условию задачи}
    end.

    Задачи с решением

    Простая обработка элементов

    Задача 1. Дан одномерный массив из N целых элементов. Написать программу вычисления произведения  всех элементов. Используйте ручной способ ввода чисел.

    Посмотреть решение

    var
      i,n,p:integer;
      a: array[1..100] of integer; {определение одномерного массива из 100 целых чисел}
    begin
    write('Введите количество элементов в массиве');
    readln(n);
    p:=1;
    for i:=1 to n do
      begin
        write('Введите ',i,' -й элемент'); 
        readln(a[i]);
        p:=p*a[i];
      end;
    write('Произведение = ',p);
    end.

    Задача 2. Дан линейный массив из N целых чисел. Написать программу вычисления суммы этих элементов. Используйте для заполнения массива случайные числа.

    Посмотреть решение

    var
      i,n,s:integer;
      a: array[1..100] of integer; {определение одномерного массива из 100 целых чисел}
    begin
    write('Введите количество элементов в массиве');
    readln(n);
    s:=0;
    writeln('Исходный массив'); 
    for i:=1 to n do
      begin
        a[i]:=random(10); 
        print(a[i]);
        s:=s+a[i];
      end;
    write('Сумма = ',s);
    end.

    Задача 3. Дан массив A(n). Заполнить двузначными числами. Найти элементы сумма цифр, которых равна числу элементов массива.

    Посмотреть решение

    Решение:

    var
     i,n,s,c1,c2,k:integer;
     a: array[1..100] of integer; {определение одномерного массива из 100 целых чисел}
    begin
     k:=0;
    write('Введите количество элементов в массиве');
    readln(n);
    for i:=1 to n do
     begin
       a[i]:=random(90)+10;{заполнение случайными числами из интервала [10;99]}
       print (a[i]); {можно использовать write}
     end;
     writeln;
     writeln('Сумма цифр элементов равна размеру массива');
     for i:=1 to n do
     begin
       c1:=a[i]div 10; c2:=a[i]mod 10;
       If c1+c2=n then print (a[i])else k:=k+1;
     end;
     If k=n then print ('Таких элементов нет');
    end.

    Сортировка элементов одномерного массива

    Задача 4. Упорядочить массив чисел по возрастанию.

    Посмотреть решение

    Решение:

    Применяем сортировку методом пузырька.

    const n=10;
    var i,j:integer;
    x:real;
    a:array[1..n] of real;
    begin
     println('Исходный массив'); 
      for i:=1 to n do 
        begin
        a[i]:=random(100);
        print(a[i]);
        end;
        {сортировка по возрастанию}
       for i:=1 to n-1 do  
        for j:=1 to n-i do
        if a[j]>a[j+1] then 
                          begin
                          x:=a[j];a[j]:=a[j+1];a[j+1]:=x;
                          end;
        println;
        {вывод отсортированного массива}
        println('Упорядоченный массив');
        for i:=1 to n do 
           print(a[i]);    
    end.

    Задачи с использованием массива

    Задача 5. Составьте программу, которая выполнит перевод натурального числа из десятичной системы счисления в любую с основанием 2-16

    Посмотреть решение

    Решение:

    var a,b,c,i,k,s:integer;
    mas: array[0..1000] of integer;  
    begin  
    	k:=0;  
    	write('Введите число ');readln(a);
    	write('Введите основание системы для перевода ');readln(s);
    	repeat  
    		b:=a mod s;
    		k:=k+1;  
    		mas[k]:=b;  
    		c:=a div s;  
    		if c>=s then a:=c;  
    	until c<s;  
    	case c of
    	10: write('A');
    	11: write('B');
    	12: write('C');
    	13: write('D');
    	14: write('E');
    	15: write('F');
    		else write(c);  
    	end;
    	for i:=k downto 1 do  
    		case mas[i] of
    		10: write('A');
    		11: write('B');
    		12: write('C');
    		13: write('D');
    		14: write('E');
    		15: write('F');
    			else write(mas[i]);
    		end;
    end.

    Дополнительные задания:

    mas1 Дан целочисленный массив произвольного размера. Подсчитать сколько раз заданная цифра встречается в элементах массива. Числа в массиве только 3-х значные.

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