Тема “Введение. Основные понятия и пределения.”

advertisement
ЛЕКЦИЯ 6
«РАБОТА С МАССИВАМИ»
1
МАССИВЫ
Массив – это последовательность однотипных данных,
объединенная общим именем, элементы которой отличаются
индексами.
Индекс элемента указывает место (номер) элемента в массиве.
a[1] – элемент одномерного массива а с номером 1.
b[1,3] – элемент двумерного массива b на пересечении 1
строки и 3 столбца.
Особенности:
• все элементы массива имеют один тип;
• все элементы массива имеют одно имя.
Примеры:
• список студентов в группе;
• номера квартир в доме;
• данные о температуре воздуха за год.
2
ОДНОМЕРНЫЕ МАССИВЫ
4
5
-10
33
15
15
2
-5
A[2]
A[3]
A[4]
A[5]
1
2
5
A[1]
ЗНАЧЕНИЕ
элемента массива
НОМЕР (ИНДЕКС)
элемента массива: 2
A[2]
ЗНАЧЕНИЕ
элемента массива: -10
3
ОБЪЯВЛЕНИЕ ОДНОМЕРНЫХ МАССИВОВ
Зачем объявлять?
• определить имя массива;
• определить тип массива;
• определить число элементов;
• выделить место в памяти.
Массив целых чисел:
Имя массива
начальный
индекс
конечный
индекс
тип
элементов
var A : array[ 1..5 ] of integer ;
Массивы других типов:
var X, Y: array [1..10] of real;
C: array [-5..13] of char;
4
НАЙДИТЕ ОШИБКУ
var a: array[1..10] of integer;
...
A[5] := 4.5;
var a: array [0..9] of integer;
...
A[10] := 5;
5
ОДНОМЕРНЫЕ МАССИВЫ
Объявление массива:
var a: array[1..100] of integer;
i, n: integer;
Ввод с клавиатуры:
Протокол работы:
writeln (‘Кол-во элементов в массиве’); a[1] = 5
a[2] = 12
readln(n);
a[3] = 34
for i:=1 to n do begin
a[4] = 56
write('a[', i, ']=‘);
a[5] = 13
readln (a[i]);end;
Вывод на экран:
writeln('Массив A:');
for i:=1 to n do
write(a[i], ‘ ‘);
Протокол работы:
Массив A:
5
12
34
56
13
6
ОБРАБОТКА ОДНОМЕРНЫХ МАССИВОВ
Вычисление суммы и среднего арифметического
значения элементов одномерного массива
{вычисление суммы}
sum := 0;
for i := 1 to n do
sum := sum + a[ i ];
sred := sum / n; {вычисление среднего арифм.}
Writeln ('Сумма =',sum);
Writeln ('Среднее значение =', sred);
i
Действие
sum
0
1
sum := sum + a[1]
a[1]
2
sum := sum + a[2]
a[1]+a[2]
sum := sum + a[n]
a[1]+a[2]+…+a[n]
…
n
7
ОБРАБОТКА ОДНОМЕРНЫХ МАССИВОВ
Вычисление суммы элементов одномерного массива,
удовлетворяющих некоторому условию
sum := 0;
for i := 1 to n do
if условие then sum := sum + a[ i ] ;
Writeln ('Сумма =', sum );
Пример (сумма элементов одномерного массива, значения
которых больше 1 и меньше 3)
sum := 0;
for i := 1 to n do
if (a[ i ]>1) and (a[ i ]<3) then
sum := sum + a[ i ];
Writeln ('Сумма =', sum );
8
ОБРАБОТКА ОДНОМЕРНЫХ МАССИВОВ
Вычисление произведения элементов одномерного
массива
pr := 1;
for i := 1 to n do
pr := pr * a[ i ];
writeln ( ' Произведение = ' , pr:6:2 );
i
Действие
pr
1
1
pr := pr * a[1]
a[1]
2
pr := pr * a[2]
a[1]*a[2]
pr := pr * a[n]
a[1]*a[2]*…*a[n]
…
n
9
ОБРАБОТКА ОДНОМЕРНЫХ МАССИВОВ
Вычисление количества элементов одномерного массива,
удовлетворяющих некоторому условию
{количество эл-тов, значения которых больше 0}
kol := 0;
for i := 1 to n do
if a [ i ] > 0 then kol := kol + 1;
Writeln ( ' Количество = ', kol );
i
Условие
Действие
kol
0
1
выполнено
2
не выполнено
3
выполнено
…
…
kol := kol + 1
kol := kol + 1
…
1
1
2
…
10
ОБРАБОТКА ОДНОМЕРНЫХ МАССИВОВ
Поиск в одномерном массиве, состоящем из n
элементов, максимального по значению элемента
ОБРАБОТКА ОДНОМЕРНЫХ МАССИВОВ
Фрагмент программы:
max:= a[1];
for i:=2 to n do
if a[i] > max then max :=a[i];
Writeln (‘Максимальное значение =’, max);
?
Почему цикл начинается с i=2?
ОБРАБОТКА ОДНОМЕРНЫХ МАССИВОВ
Как найти номер максимального элемента?
max := a[1];
imax := 1;
for i:=2 to n do
if a[i] > max then
begin
max := a[i];
imax := i;
end;
Writeln (max, imax);
?
Рассмотрим массив из 5
элементов:
2, -3, 5, -1, 3
i
max
2
imax
1
2
3
4
2
5
5
1
3
3
5
5
3
Как найти минимальный элемент и его номер?
13
ОБРАБОТКА ОДНОМЕРНЫХ МАССИВОВ
Поиск минимального элемента и его номера в
массиве
min := a[1];
imin := 1;
for i:=2 to n do
if a[i] < min then
begin
min := a[i];
imin := i;
end;
Writeln(min, imin);
Каждый элемент a[i]
сравнивается с текущим
значением минимального
элемента min.
Если сравниваемый элемент
массива меньше текущего
минимального, то это значение
запоминается в качестве
минимального, а его номер –
в качестве номера
минимального элемента.
14
ОДНОМЕРНЫЕ МАССИВЫ. ПРИМЕР
Задача. Известны значения объема выпуска продукции предприятием
в денежном выражении за N месяцев. Определить суммарный выпуск
продукции за рассматриваемый период, а также средний и
наименьший значения объема выпуска продукции. Вывести номера
месяцев, для которых объем выпуска продукции оказался в диапазоне
от 300000 руб. до 500000 руб.
Исходные данные:
N – количество месяцев (целое число);
A[ i ], i=1, 2, …, N – нумерованная последовательность значений
выпуска продукции в денежном выражении (массив значений
вещественного типа);
Требуется определить:
SUM – суммарный объем выпуска продукции в денежном выражении
за рассматриваемый период (число с дробной частью);
SRED – среднее значение ежемесячного выпуска продукции (число с
дробной частью);
MIN – наименьшее значение ежемесячного выпуска продукции (число с
дробной частью).
15
ФОРМАЛИЗАЦИЯ ЗАДАЧИ
Значения выпуска продукции предприятием представляют собой
конечный набор (N значений) однотипных данных. Если перенумеровать
эти значения, то для их хранения можно использовать одномерный
массив A, состоящий из N элементов:
A [1] – объем выпуска продукции за первый месяц рассматриваемого
периода, A [ 2 ] – за второй месяц, …, A [ N ] – за месяц с номером N.
Сформулируем нашу задачу как задачу обработки абстрактного
одномерного массива А.
Задача. Для заданного одномерного массива А, состоящего из N
элементов, выполнить:
1. Найти сумму значений элементов массива (SUM).
2. Найти среднее арифметическое значение элементов массива
(SRED).
3. Найти наименьшее из значений элементов массива (MIN).
4. Вывести на экран номера элементов массива, значения которых
находятся в диапазоне от 300000 до 500000.
16
Цикл ввода
элементов
массива
АЛГОРИТМ РЕШЕНИЯ ЗАДАЧИ
Цикл
вычисления
минимального
значения
Цикл
вычисле
ния
суммы
Вычисление
среднего
значения
Вывод номеров
элементов
массива 17
ПРОГРАММА
Максимально
допустимое количество
элементов
program Lab_3;
var
a: array [1 .. 100] of real; {объявляется массив}
i, n: byte; {n - кол-во элементов,
i – текущий номер элемента}
sum, sred, min: real ;
begin
Writeln ('Введите количество месяцев');
Readln( n );
{ввод значений выпуска продукции по месяцам}
for i := 1 to n do
begin
Writeln('Введите объем продукции за месяц', i);
Readln (a[i]);
Демонстрация
end;
18
ПРОГРАММА (ПРОДОЛЖЕНИЕ)
{вычисление суммарного и среднемесячного
выпуска продукции}
sum := 0;
for i :=1 to n do
sum := sum + a[i];
sred := sum / n;
Writeln('Суммарн. выпуск прод.=', sum:6:2);
Writeln('Среднемес. выпуск прод.=', sred:6:2);
19
ПРОГРАММА (ПРОДОЛЖЕНИЕ)
{вычисление наименьшего выпуска продукции}
min := a[1];
for i := 2 to n do
if min > a[i] then min:=a[i];
Writeln ('Наименьший выпуск продукции=',
min:6:2);
{вывод на экран номеров месяцев с заданным
объемом выпуска продукции}
for i := 1 to n do
if (a[i]>=300000) and (a[i]<=500000) then
Writeln ('Номер', i);
end.
20
ПРОТОКОЛ РАБОТЫ ПРОГРАММЫ
Назад
21
ДВУМЕРНЫЕ МАССИВЫ
Двумерный массив – это массив, каждый элемент которого
определяется двумя индексами: [номер строки, номер
столбца]. Например, a [2, 1] – элемент на пересечении строки
2 и столбца 1.
Двумерный массив можно рассматривать как матрицу или
таблицу:
Имя
массива
a [ 1, 1 ]
a [ 1, 2 ]
a [ 1, 3 ]
a [ 2, 1]
a [ 2, 2 ]
a [ 2, 3 ]
a [ 3, 1 ]
a [ 3, 2 ]
a [ 3, 3 ]
Объявление двумерного массива:
Тип
элементов
массива
var a: array [ 1..10, 1..10 ] of integer;
Границы первого
индекса
Границы второго
индекса
22
ДВУМЕРНЫЕ МАССИВЫ
При работе с двумерными массивами используются циклические
структуры «цикл в цикле» следующего вида:
for i := 1 to n do
for k := 1 to m do
begin
<тело цикла>
end;
Циклы работают по принципу «часовой и минутной стрелки»: при
каждом значении параметра внешнего цикла (переменная i)
параметр внутреннего цикла (переменная k) пробегает все
множество допустимых значений 1,2, …, m. Тело цикла будет
выполнено nm раз. Будут последовательно перечислены
следующие пары значений параметров внешнего и внутреннего
циклов:
i
1
1
…
1
2
2
…
2
…
n
n
…
n
k
1
2
…
m
1
2
…
m
…
1
2
…
m
23
Объявление двумерного массива
a : array [1..10 , 1..10] of real;
var i , k , n , m : byte ;
Ввод элементов двумерного массива
writeln (‘Кол-во строк');
readln ( n );
writeln (‘Кол-во столбцов');
readln ( m );
for i := 1 to n do
{внешний цикл}
begin
writeln(‘Элементы',i,'строки');
for k := 1 to m do
{внутренний цикл}
readln(a[i,k] );
end;
Вывод на экран элементов двумерного массива
for i := 1 to n do
{внешний цикл}
begin
for k := 1 to m do {внутренний цикл}
write (a[i,k] : 6 : 2);
writeln; {перевод курсора}
end;
4  2 1


 7 10 3 
 5 7 2


Ввод массива
Протокол работы
Кол-во строк
3
Кол-во столбцов
3
Элементы 1 строки
4
-2
1
Элементы 2 строки
7
10
3
Элементы 3 строки
5
7
2
24
ОБРАБОТКА ДВУМЕРНЫХ МАССИВОВ
Рассматривается двумерный
массив b, состоящий из n строк и
m столбцов, содержащий
элементы вещественного типа
(real):
 b1,1 b1,2

 b2,1 b2,2
 


 bn,1 bn,2

 b1, m 

 b2, m

 

 bn, m
Вычисление суммы элементов массива, значения которых
отрицательны
sum:=0;
For i:=1 to n do
For k:=1 to m do
if b[i,k]<0 then sum := sum + b[i,k];
Writeln(‘Сумма=’, sum:6:2);
25
ОБРАБОТКА ДВУМЕРНЫХ МАССИВОВ
26
ОБРАБОТКА ДВУМЕРНЫХ МАССИВОВ
Вычисление суммы значений элементов массива b,
расположенных в строках с четными номерами (вторая,
четвертая и т. д.)
s:=0;
For i:=1 to n do
For k:=1 to m do
if i mod 2=0 then s := s + b[i,k];
Writeln(‘S=’, s);
27
ОПЕРАЦИИ С ОТДЕЛЬНОЙ СТРОКОЙ МАССИВА
28
ОПЕРАЦИИ С ОТДЕЛЬНОЙ СТРОКОЙ МАССИВА
29
ОПЕРАЦИИ С ОТДЕЛЬНЫМ СТОЛБЦОМ МАССИВА
30
ОПЕРАЦИИ С ОТДЕЛЬНЫМ СТОЛБЦОМ МАССИВА
31
ПРИМЕР
В двумерном массиве B, состоящем из N строк и M
столбцов, находятся размеры начисленной заработной
платы N работников предприятия за M месяцев, т. е.
B[I,K ] – это заработная плата работника предприятия с
номером I за месяц с номером K.
Составить программу, позволяющую выполнить:
• ввести с клавиатуры количество работников и
количество месяцев, а также размеры заработной
платы;
• определить наименьшую заработную плату за месяц с
номером 1.
32
ПРИМЕР
Исходные данные:
N – количество работников предприятия (целое
число);
M – количество месяцев (целое число);
B[ I, K ] (I = 1, 2, 3,…, N; K = 1, 2, 3,…, M) – массив
значений заработной платы (значения вещественного
типа);
Требуется определить:
MIN – наименьшую заработную плату за месяц с
номером 1 (число с дробной частью);
33
ФОРМАЛИЗАЦИЯ ЗАДАЧИ
Значения заработной платы представляют собой конечный
набор (NM значений) однотипных данных. Для их хранения
можно использовать двумерный массив В, состоящий из N
строк и M столбцов ( B [ 1, 1 ] – заработная плата работника
номер 1 за первый месяц, B [ 1, 2 ] – заработная плата
работника номер 1 за второй месяц, B [ 2, 1 ] – заработная
плата работника номер 2 за первый месяц и т.д.
Сформулируем задачу обработки абстрактного двумерного
массива B.
Задача. Для заданного двумерного массива B, состоящего из
N строк и M столбцов, выполнить:
• ввести с клавиатуры количество строк и количество
столбцов массива, а также значения элементов массива;
• определить наименьшее значение среди элементов столбца
с номером 1 (MIN).
34
АЛГОРИТМ РЕШЕНИЯ ЗАДАЧИ
35
Program Lab_4;
ПРОГРАММА
var n, m, i, k : byte;
min : real;
b : array [ 1 .. 10, 1 .. 10 ] of real;
begin
writeln ('Введите количество строк и столбцов в массиве В');
readln (n , m);
writeln ('Вводите значения зарплат из массива B построчно');
for i := 1 to n do
for k := 1 to m do
readln (b[ i , k ]);
{поиск минимального значения в первом столбце массива В}
min := b[1,1];
for i := 1 to n do
if min
> b [i,1] then min := b [i,1];
Writeln ('Минимальная зарплата за первый месяц=', min:8:2);
end.
36
ПРОТОКОЛ РАБОТЫ ПРОГРАММЫ
37
Download