ПРОГРАММИРОВАНИЕ
Итак, алгоритм работы с массивами:
Алгоритм работы с многомерными массивами тот же:
Примеры
1.26M
Категория: ПрограммированиеПрограммирование

ПРОГРАММИРОВАНИЕ_9лекция_new(1)

1. ПРОГРАММИРОВАНИЕ

Тема: Массивы
Половина И.П.
доцент, к.т.н.

2.

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

3.

Массивы
Основные характеристики массива:
• имя,
• размерность,
• длина,
• тип его элементов,
• тип индекса.
Число элементов массива конечно.

4.

Объявление массивов
– определить имя массива,
– определить тип элементов массива,
– определить число элементов,
– выделить место в памяти.
Возможны два способа описания массивов:
1. Ввести новый тип в разделе Type, затем
описать переменную этого типа в разделе Var.
2. Описать переменную в разделе Var.

5.

Объявление массивов
Type
<имя_типа> = array [<тип_индекса>] of
<тип_компонентов>;
Var
<имя_переменной> : <имя_типа>;
<тип_индекса> либо <список индексных типов> любой упорядоченный тип,
<тип_компонентов> - базовый тип, любой.

6.

Объявление массивов (одномерных)
Type
mas = array [1 .. 5] of integer;
Переменная типа mas,
Представляет одномерный массив
var
длиной 5 элементов, тип элементов
m : mas;
integer
x, y : array [1..10] of real;
c : array [1..20] of char;
ch: array [-5..13] of char;
Второй способ
описания массивов
a: array ['A'..'Z'] of real;
b: array [False .. True] of integer;

7.

Объявление массивов (одномерных)
var
Имя
массива
Начальный
индекс
Конечный
индекс
cc : array [ 1 .. 20 ] of char
char;
Объявление через константу:
const
n = 20;
var
c : array [1..n] of char;
Тип
элемента

8.

Доступ к элементу массива
Указывается имя массива и индекс (номер по
порядку расположения) элемента в массиве:
m [2], b [False], a ['D'].
Элементу массива, указав имя массива и индекс
элемента, можно присвоить значение:
m [2] := 6;
b [false] := 10;
a ['D'] := 3.14;

9.

Массивы
A
НОМЕР
массив
1
2
5
10
A[1]
33
15
15
элемента массива
(ИНДЕКС)
4
5
20
25
A[2] ЗНАЧЕНИЕ
A[3] элемента
A[4]
A[5]
массива
НОМЕР (ИНДЕКС)
элемента массива: 2
A[2]
ЗНАЧЕНИЕ
элемента массива: 10

10.

Что неправильно?
var a: array[10..1]
[1..10] of integer;
...
a[5] := 4.5;
var a: array ['a'..'z']
['z'..'a'] of integer;
...
a['B']
a['b'] := 15;
var a: array [0..9] of integer;
...
a[10] := 'X';

11.

Как присвоить значение элементам массива?
• непосредственно через присвоение (указав имя и
индекс, место элемента в массиве):
m [2] := 6; m [3] := 8; m [4] := 10; и т.д.
• ввод через клавиатуру, а так как элементов массива
много, то надо организовать цикл:
For i := 1 to 5 do read(a[i]);
Выполнение программы приостановится в ожидании
ввода:
4_5_6_10_15

12.

• программно при описании:
Var
a : array[1..5] of integer := (1, 2, 3, 4, 5); //pascalABC.Net
либо изменение по какому-то закону:
for i := 1 to 10 do a[i] := i*i;
либо через счетчик случайных чисел:
for i := 1 to 10 do a[i] := random(100);

13.

• Random() – функция возвращает числа [0..1).
• Random(range : Word) => 0 .. (range -1).
• Random(-a..b) => -a .. b-1)
Например:
Random(10) => 0..9;
Random(10)+1 => 1..10;
random(-10..10) => -10 .. 9;
Генерация упорядоченной последовательности:
Randomize;
a[1] := 1+random(10);
for i := 2 to n do a[i] := a[i-1] + random(10)+1;

14.

Как вывести значения элементов массива?
Вывод осуществляется также по элементам.
Надо прочитать все элементы от начала до конца, т.е.
организовать цикл:
for i := 1 to 10 do write (a[i]);

15.

Пример
начало
Создать массив длиной n и определить сумму
всех
Ввод(n)
его чисел.
sum :=0
Дано: n;
i:= 1,n,1
Найти: sum = ?
a[i]:=random(50)
Алгоритм: Создает элемент и записывает
Суммирует элемент
Организация вывода элементов на экран
Sum:=sum + a[i]
Вывод(a[i])
Вывод(sum)
конец

16.

const n = 10;
Var i, sum : integer;
a : array [1..n] of integer; //описание массива
begin
sum := 0; randomize;
for i := 1 to n do
begin
a[i] := random(50);
//формирование массива
sum := sum + a[i];
//суммирование элементов массива
write(a[i],' ');
//вывод элементов массива
end;
writeln; //чтобы следующий вывод был с новой строки
На экран будет выведено:
write ('сумма = ',sum);
31 37 11 35 3 17 7 29 29 12
end.
сумма = 211

17. Итак, алгоритм работы с массивами:

//нахождение суммы элементов массива
const n = 10;
const n = 10;
• Описать.
Var i, sum : integer;
Var i, sum : integer;
• Создать.
a : array [1..n] of integer;
a : array [1..n] of integer;
begin
• Обработать. begin
sum := 0; randomize;
for i := 1 to n do
randomize;
• Вывести.
begin
for i := 1 to n do
a[i] := random(50);
a[i] := random(50);
sum := sum + a[i];
write(a[i],' ');
sum := 0
end;
for i := 1 to n do
//следующий вывод с новой строки
sum := sum + a[i];
Эти 2 цикла можно
writeln;
объединить в один
write ('сумма = ',sum);
write ('сумма = ',sum);
end.
end.

18.

Задача: найти минимальный элемент в одномерном
начало
массиве и его индекс (место).
Ввод n, a(n)
Вставка создание
массива
Дано: 6 4 7 2 8 (не повторяющиеся элементы)
min:=a[1]
k:=1
Найти: min=?
i:= 2,n,1
Пусть min: = 6; k :=1.
min≥a[i]
+
min:=
a[i]n, и
Далее просматриваем элементы массива, со 2 места
до
k:=i
сравниваем с min.
Если min ≥ a[i],то min:= a[i] и фиксируем Вывод(min,
место k:=i,
иначе
k)
переходим к следующему элементу.
конец

19.

А если есть повторяющиеся элементы?
Дано: 6 2 7 2 8
Найти: min=?
По рассмотренному алгоритму найдем 1-ый или последний
минимальный элемент?
Как найти 1-ый минимальный элемент?
Как найти последний минимальный элемент?
Как найти максимальный элемент?

20.

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

21.

Операции над массивами (в одномерном):
• Сумма элементов массива:
s:=0;
for i := 1 to n do s := s + a[i];
• Количество элементов в массиве,
удовлетворяющих некоторому условию, например:
k:=0;
for i := 1 to n do
if a[i]>0 then k := k + 1;
• Произведение элементов в массиве:
p := 1;
for i := 1 to n do p := p * a[i];

22.

Задача: Сдвиг элементов массива a на K-шагов вперед
Алгоритм:
1. Создаем массив а длиной n.
2. Сохраняем k элементов массива a в дополнительном
массиве b.
3. В массиве a сдвигаем элементы вперед с места k+1
до конца.
4. Дополняем массив a с места k+1 элементами
массива b.

23.

Без второго массива
12345

24.

Многомерные массивы
Глубина вложения может быть любая.
Но чаще применяют 2-х, 3-х мерные массивы.
Описание:
Var
a : array[1..4, 1..5] of integer;
b : array[1..5, 1..5, 1..5] of integer;
Список
индексов

25. Алгоритм работы с многомерными массивами тот же:

• Описать.
• Создать.
• Обработать.
• Вывести

26.

Двумерные массивы
Var
a : array[1..2, 1..3] of integer;
можно представить как таблицу:
строки
j = 1 2 3 -> столбцы
i=1
a11 a12 a13
i=2
a21 a22 a23

27.

28.

Доступ к элементу двумерного массива
имя_массива [<индекс_строки>, <индекс_столбца>]
a[1,1]
a[2,3]
3
1
5
8
2
99

29.

Ввод/вывод элементов 2-х мерного массива
Для ввода значений элементам массива n*m
необходимо организовать циклы:
for i:= 1 to n do
for j := 1 to m do
a[i, j] := <выражение>;
Вывод значений элементов массива:
for i:= 1 to n do
for j := 1 to m do
write (a[i, j]);

30.

31.

32.

33.

Пример
начало
Ввод(n,m)
Создать массив n*m и найти сумму всех
его чисел.
sum :=0
Дано: n, m;
i:= 1,n,1
Найти: sum = ?
j:= 1,m,1
Алгоритм:
a[i,j] :=random(50)
Sum:=sum + a[i,j]
И красиво вывести массив на экран
Рассмотрим на примере:
Вывод(sum)
конец

34.

const n = 8; m = 4;
var
i, j, sum : integer;
a : array [1..n, 1..m] of integer;
begin
sum := 0;
for i := 1 to n do
begin
for j:= 1 to m do
begin
a[i, j] := 10+ random(50);
write (a[i, j]);
sum := sum + a[i, j];
end;
end;
write('сумма = ', sum);
end.
(pascal)
А как вывести
элементы массива
«таблицей»?
//создаем элемент массива
// вывод элементов массива (как?)
//суммируем элементы
//вывод суммы

35.

const n = 8; m = 4;
Var i, j, sum : integer;
a : array [1..n, 1..m] of integer;
begin
sum := 0;
for i := 1 to n do
begin
for j:= 1 to m do
begin
a[i, j] := 10+ random(50);
//создаем элемент массива
write (a[i, j]:4);
// вывод элементов
sum := sum + a[i, j];
//суммируем элементы
end;
writeln;
//переход на новую строку
end;
writeln('сумма = ', sum);
//вывод суммы
end.

36. Примеры

В матрице (m*n) поменять местами элементы первой
и последней строки.
Пусть матрица будет 2*4:
51
26 73 84
i=1
k
51
62
37
48
i=m

37.

//меняем местами
const n=2; m=4;
for j := 1 to m do
var i, j, k : integer;
begin
a : array[1..n,1..m] of integer;
k := a[n, j];
begin
//формируем массив
a[n, j] := a[1, j];
writeln ('Старый массив');
a[1, j] := k;
randomize;
end;
for i := 1 to n do
//выводим на экран
begin
writeln ('Новый массив');
for j:=1 to m do
for i := 1 to n do
begin
begin
for j := 1 to m do
a[i, j] := random(10)+1;
//выводим элементы массива
write(a[i, j]:8);
end;
writeln;
end;
writeln;
end;
end.
write(a[i, j]:8);

38.

Задачи: Дан массив n*m.
1. Найти сумму элементов 1-ой строки, последней
строки.
2. Найти сумму элементов 1-ого столбца, последнего
столбца.
3. Найти суммы элементов строк матрицы и
поместить их в новый массив:

39.

//Создаем и выводим массив a
//работаем со строками
//cоздаем и выводим второй массив

40.

//транспонировать матрицу(n*m)
const n=4;m=5;
var
i, j : integer;
a : array[1..n,1..m] of integer;
begin
Randomize;
writeln('isxodn massiv');
for i:=1 to n do
begin
for j:=1 to m do
begin
a[i, j]:=random(10);
write (a[i, j]:5);
end;
writeln;
end;
writeln('new massiv');
for j:=1 to m do
begin
for i:=1 to n do
write (a[i, j]:5);
writeln;
end;
end.

41.

42.

43.

//найти max среди min в строках
const n=5;m=5;
var
i, j : integer;
a:array[1..n,1..m] of integer;
min, maxmin : integer;
begin
randomize; //создаем массив
for i:=1 to n do
begin
for j:=1 to m do
begin
a[i,j]:=random(100);
write (a[i,j]:5);
end;
writeln;
end;
writeln('---------');
maxmin:=a[1,1];
for i:=1 to n do
begin
min:=a[i,1];
for j:=2 to m do
if min>a[i, j] then min:=a[i, j];
write (min:5); //вывод min в строке
if maxmin < min then
maxmin:=min;
end;
writeln;
writeln ('---------');
writeln ('maxmin = ', maxmin);
end.

44.

i
1
2
3
4
j
1
2
3
4

45.

У индексов элементов, расположенных ниже главной диагонали,
справедливо соотношение i > j, выше i < j

46.

• Пример: Вывести на экран сначала элементы главной
диагонали квадратной матрицы из N строк и N
столбцов, а затем элементы побочной диагонали.
Задача: Найти суммы элементов на главной и
побочной диагоналях

47.

Пример:
Дана матрица 5х5. Найти сумму элементов, стоящих на двух
соседних диагоналях с главной и параллельных ей.
НО:
1. соотношения для индексов элементов, расположенных на
линиях, параллельных главной диагонали, удовлетворяют
соотношениям:
ниже главной i-j=k , выше i-j=-k, где k – номер линии по
отношению к главной диагонали.
2. соотношения для индексов элементов, расположенных на
линиях, параллельных побочной диагонали, удовлетворяют
соотношению 2<= i+j<=2*n

48.

//подсчитать суммы элементов на диагоналях
//ниже и выше главной диагонали
const n=5;
var
i, j, s1, s2 : integer;
a:array[1..n, 1..n] of integer;
begin
randomise;
for i := 1 to n do
for j := 1 to n do
a[i, j] := random(10);
writeln ('isxodn massiv');
for i := 1 to n do
begin
for j := 1 to n do
write (a[i, j]:5);
writeln;
end;
s1:=0; s2:=0;
//сумма на диагонали ниже главной
for i:=1 to n do
for j:=1 to n do
if i-j =1 then s1:= s1+a[i, j];
//сумма на диагонали выше главной
for i:=1 to n do
for j:=1 to n do
if j-i =1 then s2 := s2 + a[i, j];
writeln('s1 = ', s1:4,' s2 = ‘, s2:4);
end.

49.

const n=5;
var i, j : integer;
a : array[1..n, 1..n] of integer;
begin
a[1,1] := 2*n + 1;
for i := 2 to n do
begin
for j :=1 to i do
begin
if i = j then a[i, i]:=a[1,1] + i - 1
else
a[i, j] := a[i-1, j] - (n – i + j);
end;
writeln;
end;
writeln('vuvod');
for i := 1 to n do
begin
for j :=1 to n do
write (a[i, j]:5);
writeln;
end;
end.
English     Русский Правила