Uploaded by firnafas

8 Лекция. Массивы

advertisement
8 - ЛЕКЦИЯ
ОДНОМЕРНЫЕ И ДВУМЕРНЫЕ ЧИСЛОВЫЕ
МАССИВЫ
1.Числовые массивы, основные понятии
2. Математические операции над одномерными и
двумерными числовыми массивами
Переменные, с которыми вы имели дело до сих пор,
могут хранить только одно значение в каждый момент
времени. То есть, если вы, например, хотите узнать
среднее арифметическое для 31 значения температуры,
вам придется 31 раз ввести значение переменной, по
одному за цикл, используя аккумулятор для подсчета
суммы. При этом, когда вводится второе значение,
первое теряется, когда вводится третье - утрачивается
второе, и так далее. Если в программе есть
соответствующие инструкции, вы будете знать сумму
этих чисел и их среднее арифметическое, но исходные
значения будут потеряны.
Если же вы захотите сохранить все значения для
дальнейшего использования в программе, вам
потребуется определить 31 переменную и написать 31
инструкцию ввода данных.
В этой главе рассказывается о том, как внести
значения в специальную переменную, которая
называется массивом (array). Кроме того, здесь
подробно описывается работа со строковыми
переменными.
1
Массивы. Представьте себе группу людей,
стоящих в очереди, например, перед входом в
кинотеатр. Единственная вещь, которая объединяет
этих людей, - это то, что они стоят в одной очереди. Тот
факт, что кто-то из них занимает первую позицию, не
говорит нам ничего об этом человеке. У нас нет
оснований думать, что он проворнее, выше, или богаче,
чем любой другой из стоящих за ним.
В то же время, хотя все эти люди являются
отдельными индивидами, не связанными никакими
иерархическими отношениями, все они входят в одно
множество (в данном случае - составляют одну
очередь). Поскольку они стоят вместе, в определенном
смысле их можно рассматривать как группу. Например,
если капельдинер попросит очередь сдвинуться
немного влево, чтобы не загораживать автомат с
попкорном, очередь сдвинется, продолжая составлять
единое целое.
Массив можно представить себе в виде некоего
подобия такой очереди. Массив - это множество
значений, которыми можно оперировать как группой.
Каждый элемент или значение в массиве является
отдельной переменной, и с ней можно обращаться, как с
обычной переменной, но так как эти переменные
собраны в массив, их также можно трактовать как
общность. И так же, как место в очереди не дает нам
никакой дополнительной информации о человеке,
который его занимает, положение элемента массива не
2
имеет никакого отношения к присвоенному ему
значению.
Вы уже создавали и использовали массивы в форме
строк. Строка и в самом деле является массивом,
состоящим из отдельных символов. При отображении
строки сообщения на дисплее функция puts()
обращается с массивом как с группой, но к каждому
символу можно обратиться и в отдельности.
Работа с массивом осуществляется поэтапно. Вопервых,
необходимо
определить
массив
как
переменную, во-вторых, в массив надо ввести значения,
и, наконец, можно использовать массив в соответствии
с требованиями логики программы.
Определение массива. Для определения массива
необходимо указать типы значений, которые он
содержит, и максимальное количество элементов,
которое может быть в него записано. Для того чтобы
создать массив, содержащий, например, 31 целое число,
надо написать определение:
int temps[31];
Запомните, что в этом случае используются именно
квадратные скобки, а не круглые или фигурные. Массив
определяют так же, как и другие переменные, перед
main(), если хотят создать внешний массив (доступный
для всех функций), и внутри main(), когда хотят
определить автоматический массив.
3
При
определении
массива
одновременно
определяются и его отдельные элементы. К первому
элементу массива fios обращаются как к fios[0], ко
второму— как к fios[1], к третьему— как к fios[2] и так
далее. Заметьте, что нумерация элементов массива
начинается с 0, так что массив, состоящий из пяти
элементов, показан на рисунке как массив, содержащий
элементы с номерами от 0 до 4. Элемент с номером
fios[5] не существует. Число, заключенное в квадратные
скобки, называется индексом (subscript), и про
элементы массива можно говорить как про «нулевой
элемент массива fios», «первый элемент массива fios» и
так далее.
Нельзя использовать индекс, имеющий значение
больше
указанного
максимального
количества
элементов массива минус один. Если определен массив,
имеющий 10 элементов, значит максимальным
возможным индексом является число 9. Компилятор не
будет генерировать ошибку, если существует проблема
с индексом, но при запуске программы произойдет
ошибка выполнения или программа выдаст результаты,
далекие от истинных.
Ввод значений в массив. После того как вы
определили массив, в него можно вводить информацию.
Начальные значения элементам массива можно
присвоить при его определении:
int masA[5] = {45, 56, 12, 98, 12};
4
Таким образом, мы создали пять элементов, имеющих
следующие значения:
masA[0] 45
masA[1] 56
masA[2] 12
masA[3] 98
masA[4] 12
Массив
—
это
пронумерованная
последовательность
величин
одинакового
типа,
обозначаемая одним именем. Элементы массива
располагаются в последовательных ячейках памяти,
обозначаются именем массива и индексом. Каждое из
значений, составляющих массив, называется его
компонентой (или элементом массива).
Массив данных в программе рассматривается как
переменная
структурированного
типа.
Массиву
присваивается имя, посредством которого можно
ссылаться как на массив данных в целом, так и на
любую из его компонент.
Переменные,
представляющие
компоненты
массивов, называются переменными с индексами в
отличие от простых переменных, представляющих в
программе
элементарные
данные.
Индекс
в
обозначении компонент массивов может быть
константой, переменной или выражением порядкового
типа.
Если за каждым элементом массива закреплен
только один его порядковый номер, то такой массив
5
называется линейным. Вообще количество индексов
элементов массива определяет размерность массива.
По этом признаку массивы делятся на одномерные
(линейные), двумерные, трѐхмерные и т.д.
Пример: числовая последовательность четных
натуральных чисел 2, 4, 6, ..., N представляет собой
линейный массив, элементы которого можно
обозначить А[0]=2, А[1]=4, А[2]=6, ..., А[К]=2*(К+1),
где К — номер элемента, а 2, 4, 6, ..., N — значения.
Индекс (порядковый номер элемента) записывается в
квадратных скобках после имени массива.
Например, A[7] — седьмой элемент массива А; D[6]
— шестой элемент массива D.
Для размещения массива в памяти ЭВМ отводится
поле памяти, размер которого определяется типом,
длиной и количеством компонент массива. В языке С++
эта информация задается в разделе описаний. Массив
описывается так:
Тип имя массива [количество элементов-предел
индекса];
Например,
int В[5];
— описывается массив В, состоящий из 6 элементов.
Для массива В будет выделено 6*6=36 байт памяти.
Базовый тип элементов массива может быть любым,
за исключением файлового.
6
1.2. Математические операции над одномерными
числовыми массивами
Описание одномерного числового массива.
Математическое описание, общий случай.
A  {a1 , a2 , a3 ,....., ai ,...., an }
Сокрашенный запись
A  {ai }
i  1, n
здес
a – имя массива;
n – количество элементов массива;
i – индекс элемента массива, т.е. место, порядковый
номер элемента в массиве, индекс всегда начинается с
нуля;
ai
- элемент массива a который находится в i – том
месте;
an - элемент массива a который находится в n – том
месте;
Описание одномерного числового массива на языке
С++:
Например, int a[10]={1,2,3,4,5,6,7,8,9,10}. Это
означает, что числовой массив имеет 10 целочисленных
чисел.
Если числовой массив описан следующим образом
int a[10]={1,2,3,4,5}. Это означает, что элементы с
номерами 6-10 не определены.
7
Если числовой массив описан следующим образом
int
a[10]={1,2,3,4,5,6,7,8,9,10,11,12,13,14},
то
элементы 11-14 неиспользуется.
В языке С++ конечное значение индекса
автоматически не проверяется!!!, эти обстоятельства
должен знать программист.
На языке С++ нумерация индекса начинается с нуля.
Например, int a[5]={1, 2, 4, 12 ,5}. 0-element – 1, 1element – 2, 2-element – 4, 3-element – 12, 4-element – 5,
т.е.: a[0]=1; a[1]=2; a[2]=4; a[3]=12; a[4]=5.
Ввод значений одномерного
числового массива в
оперативный память компьютера
В программе
С помощью
клавиатуры
Чтение с файла
1 - variant. Ввод значений одномерного числового
массива в оперативный память компьютера прямо в
программе
#include <iostream.h>
int main()
{
const int n=10; // целечисленной константе n задается значение 10
int a[n]={1,2,5,8,-2,4,8,-6,9,3};
……………………………………………….
8
2 - variant. Ввод значений одномерного числового
массива в оперативный память компьютера прямо в
программе.
1.Пример. Значение элементов целочисленного
массива a ввести в памят ЭВМ и вывести из памяти на
монитор.
a = {5,-2,3,1,8,-4,6}.
I. Математическое описание.
A  {a i }
i  1,n
n7
Одномерный целочисленный числовой массив a
имеет 7 элементов.
II. алгоритм и программа ввода и вывода значений
элементов одномерного целочисленного массива a.
Boshlash
n
i=1,n
ai
i=1,n
ai
//M-14.1
//vvod I viviod elementov
// odnomernogo chislovogo massiva
#include<iostream.h>
#include<math.h>
int main()
{
const int n=10;
int i,a[n];
for (i=1;i<=n;i++)
{
cout<<"a["<<i<<"]= ";
cin>>a[i];
}
cout<<endl;
// vivod elementov massiva na ekran monitora
for (i=1;i<=n;i++)
{
cout<<"a["<<i<<"]= "<<a[i]<<endl;
}
cout<<endl;
return 0;
}
9
Задача 1. Определить общую сумму и среднее
значение одномертного числового массива:
1. Математическая формализация.
A  {ai }
i  1, n
n
s   a i s  a  a  a  ...  a
1
2
3
n,
,
i 1
s
so 
n.
10
s = 0;
s=0
for (i=1;i<=n;i++)
i=1,n
{
S = s + a[i];
}
s = s + ai
s0 = s/n;
so = s/n
cout<<” s =”<<s<<” s0 =”s0<<endl;
return 0;
}
s, so
Конец
Задача 2. Определение наибольшего (наименьшего)
элемента массива по значению.
1. Математическая формализация
A  {a1 , a2 , a3 ,.....,ai ,....,an } ;
A  {ai }
i  1, n
rk  max{ ai },
i  1, n
11
2. алгоритм и программа
задачи
r = a[1]; k = 1;
r=a1, k=1
for (i=1;i<=n;i++)
{
i=1,n
if (r<a[i]) { r=a[i]; k=i }
+
r < ai
}
r=ai , k=i
cout<<” max=”<<r<<” k =”k<<endl;
“max=”, r, k
return 0;
}
Тамом
Задача 3. Одномерном числовом массиве определить
число которое равно по значению числа b.
1. математическая формализация:
Задано число b и одномерный числовой массив
(ОЧМ):
A  {a1 , a2 , a3 ,.....,ai ,....,an } ;
A  {ai }
Для всех
i  1, n
ai , i  1, n ,
если ai  b то вывод значений
ai .
12
3. Алгоритм и программа задачи:
cout<<”b = “; cin>>b;
b
for (i=1;i<=n;i++)
{
i=1,n
if (b = a[i])
+
b=
ai
cout<<”a[“i<<”]=”<<a[i]<<endl;
ai
}
return 0;
}
Тамом
Задача 4. Упорядочить числовой массив в порядке
возрастания значений элементов массива.
1. Математическая формализация:
A  {a1 , a2 , a3 ,.....,ai ,....,an } ;
A  {ai }
i  1, n
Условия упорядочивания
ai  ai 1 , для всех ai ,
i  1, n  1
13
2. Алгоритм и программа задачи:
i=1,n-1
y=a(i):k=i
j=i,n
y>a(j)
+
y=a(j):k=j
a(k)=a(i): a(i)=y
i=1,n
ai
Тамом
Задача 5. Из четных элементов ОЧМ по значению
составить новый ОЧМ.
1. Математическая формализация:
Исходный ОЧМ
A  {ai }
i  1, n .
i  1, m , m  n.
Новый ОЧМ B  {bi }
Элементы массива В определяется следующим
14
образом:
m  0. Для всех ai , i  1, n , если значение
ai чѐтно, тогда m  m  1, bm  ai .
2. алгоритм и программа задачи:
j=1,n
+
ai/2=[ai /2]
m=m+1
b(m)=a(i)
i=1,m
bi
Тамом
15
Задача 6. Определить все максимальные по значению
элементы по соседству.
1. Математическая формализация:
A  {ai }
i  1, n
Максимальный элемент по соседству:
ai1  ai  ai1 ,
i  2, n  1
2. Алгоритм и программа задачи:
i=2,n-1
+
ai-1< ai va
ai > ai +1
ai
Тамом
16
Задача 7. В заданной ОЧМ удалить k-й элемент.
1. Математическая формализация:
A  {ai }
i  1, n
a1 , a2 , a3 ,...,ak , ak 1 , ak 2 ,...,an1 , an
Заданный ОЧМ:
ak  ak 1 , ak 1  ak 2 , ....... , an1  an .
Алгоритм сдвига элемента массива на одно место вперед:
ai  ai 1 , i  k , n  1
2. Алгоритм и программа задачи:
k
i=k,n-1
ai= ai +1
n=n-1
i=1,n
ai
Тамом
17
Задача 8. Дано ОЧМ и интервал [a,b]. Определить
минимальный элемент и среднее значение элементов
попадающихся в интервал [a,b], а также создать новый ОЧМ
из нечетных элементов которые не попадают в интервал [a,b]
и вычислить среднее значение этого массива.
I. Математическая формализация.
Исходный ОЧМ:
A  {ai }
i  1, N
и
интервал [a,b].
1. Определение минимального элемента из числа элементов,
которые находится в интервале [a,b]:
R  min{ai }, a  ai  b;
k
i  1, N
2. Определение среднего значения
находится в интервале [a,b]:
1 n
S   a , a  ai  b;
k i 1 i
.
элементов,
i  1, N
которые
.
3. Создание нового ОЧМ из нечетных элементов которые не
попадают в интервал [a,b]:
i  1, N ,
B  {bi }, j  1, M .
Для всех
при этом
4.
a  a ѐки a  b,
i j
i
j  j  1, b j  ai ,
b
b 
i  i
 
2  2 .
 
1 m
определение среднего значения ОЧМ В. S  m  bi .
i 1
18
1. Двумерные числовые массивы, основные
понятии
2. Типовые операции над двумерными числовыми
массивами
Двумерный массив представляется в C++ как
массив, состоящий из массивов. Для этого при
описании в квадратных скобках указывается вторая
размерность. Если массив определяется с помощью
операторов описания, то обе его размерности должны
быть константами или константными выражениями,
поскольку инструкции по выделению памяти
формируются
компилятором
до
выполнения
программы. Например:
int а[3][5]: // Целочисленная матрица из 3 строк и 5
столбцов
Массив хранится по строкам в непрерывной
области памяти:
a00 , a01, a02 , a03 , a04, a10 , a11, a12 , a13, a14, a20 , a21, a22 , a23 , a24 , ....
| --- 0-я строка -- | -- 1-я строка - | - 2-я строка - | и т.д.
Строки массива ничем не отделены одна от другой,
то есть прямоугольной матрицей двумерный массив
является только в нашем воображении. В памяти
сначала располагается одномерный массив а[0],
представляющий собой нулевую строку массива а,
19
затем — массив а[1], представляющий собой первую
строку массива а, и т. д. Количество элементов в
каждом из этих массивов равно длине строки, то есть
количеству столбцов в матрице. При просмотре
массива от начала в первую очередь изменяется правый
индекс (номер столбца).
Для доступа к отдельному элементу массива
применяется конструкция вида a[i][j], где i (номер
строки) и j (номер столбца) — выражения
целочисленного типа. Каждый индекс может
изменяться
от
0
до
значения
соответствующей
размерности,
уменьшенной на единицу.
ВНИМАНИЕ: Первый индекс всегда воспринимается
как номер строки, второй — как номер столбца,
независимо от имени переменной.
2. Типовые операции над двумерными числовыми
массивами
1). Организация ввода значений элементов
двумерного числового массива в память ЭВМ.
1. Математическая формулировка:
A  {ai , j };
i  1, n;
j  1, m;
здес
А – имя массива;
n – количество строк в массиве;
20
m – количество столбцов в массиве;
i,j – индексы, строковые и столбцовые, т.е. индекс
i указывает номер строки, индекс j указывает номер
столбца;
2. Алгоритм и программа ввода и вывода
значений элементов ДЧМ.
Начало
n,m
i=1,n
j=1,m
ai,j
i=1,n
j=1,m
ai,j
Конец
21
2). Определите среднее значение двумерного
числового массива.
1. Математическая формулировка
A  {ai , j }; i  1, n;
j  1, m;
n
m
S   ai , j ;
i 1 j 1
S c  S /( n * m)
Начало
n,m
i=1,n
j=1,m
ai,j
s=0
i=1,n
j=1,m
s=s+aij
sс=s/(n*m)
s,sс
Конец
22
3).
Определить максимальное (минимальное) по
значению элемента ДЧМ.
1. Математическая формулировка
A  {ai , j };
i  1, n;
j  1, m;
Rk,l  max {ai,j }; i  1,n , j  1,m.
2. Алгоритм и программа определения максимального
(минимального) по значению элемента ДЧМ.
Начало
n,m
i=1,n
j=1,m
ai,j
R:= a1,1,k=1;l=1
i=1,n
j=1,m
+
R>ai,j
R:= ai,j
k=1;l=1
„max=‟,R. „строка',
k; «столбец»,l
Конец
23
4). Создать ОЧМ из суммы элементов по строкам ДЧМ.
1. Математическая формулировка:
A  {ai , j }; i  1, n;
j  1, m;
m
с1  a11  a12  a13  ...  a1m   a1 j ,
j 1
........................................................
........................................................
m
сn  an1  an 2  an 3  ...  anm   anj
j 1
Обошенный вид формулы:
m
сi   a i , j ,
i  1, n
j 1
24
2. Алгоритм и программа задачи
Начало
n,m
i=1,n
j=1,m
ai,j
i=1,n
s=0
j=1,m
s=s+aij
ci=s
i=1,n
ci
Конец
25
5). Поменять местами любых двух строк ДЧМ.
1. Математическое описание:
A  {ai , j }; i  1, n;
j  1, m;
Номера поменяемых строк – k, l.
..........
.............................
ak 1 ,
ak 2 ,
..... akm
.......................
al1 ,
al 2 ,
...... alm
........................................
R  a k ,1 R  a k , 2
a k 1  a l ,1 a  a
k2
l ,2
al 1  R
R  a k ,m
............
al 2  R
a km  al ,m
alm  R
Умумлашган холда
R  a k , j , a k , j  al , j , al , j  R,
26
j  1, m;
2. Алгоритм и программа задачи:
Начало
n,m
i=1,n
j=1,m
ai,j
j=1,n
r= akj
akj = alj
alj=r;
i=1,n
j=1,m
ai,j;
Конец
27
6). Поменят местами строк и столбец в ДЧМИ.
1. Математическое описание:
A  {ai , j };
i  1, n;
j  1, m; при этом, n=m.
Поменят местами k-ю строку с l-м столбцом.
a11.................a1l ........................a1m
a 21.................a 2l ........................a 2 m
..................................................
ai1 ..................ail ........................aim
...................................................
a k 1 , a k 2 ,..........a kl , a k ,l 1 , a k ,l  2 ,.....a km
.....................................................
a n1 ..................a nl ........................a nm
R  ak 1 , ak 1  a1l ,
a1l  R
............................................
R  aki , aki  ail ,
ail  R
............................................
R  akm ,
akm  aml ,
aml  R.
Обобщенная формула
R  aki , aki  ail , ail  R ;
28
Ниже представляется алгоритм задачи.
Начало
n,m
i=1,n
j=1,n
ai,j
i=1,n
r= a,k,i
ak,i = ai,m
ai,m=r;
i=1,n
j=1,n
ai,j;
Конец
29
7). В ДЧМ удалить l-ю столбец.
1. Математическая формулировка:
A  {ai , j };
i  1, n;
j  1, m;
l – номер столбца которое удаляется из ДЧМ.
.......a1l , a1l 1 , a1l  2 ...........a1m1 , a1m
.......a 2l , a 2l 1 , a 2l  2 ..........a 2 m 1 , a 2 m
...................................................
.......ail , ail 1 , ail  2 ............aim 1 , aim
...................................................
.......a nl , a nl 1 , a nl  2 ..........a nm 1 , a nm
a1l  a1l 1 , a1l 1  a1l 2 ,.....a1m1  a1m . a1 j  a1 j 1 , j  l , m  1
a2l  a2l 1 , a2l 1  a2l 2 ,.....a2 m1  a2 m . a2 j  a2 j 1 , j  l , m  1
...............................................................................................
ail  ail 1 , ail 1  ail 2 ,.....aim1  aim . aij  aij 1 , j  l , m  1
................................................................................................
anl  anl1 , anl1  anl2 ,.....anm1  anm . anj  anj1 , j  l , m  1
30
После выполнения этих операций сдвига элемннтов
матрицы, количество столбцов умнщается на единицу,
т.е. m = m-1
Обобщенный алгоритм сдвига элементов матрицы:
aij  aij1 , i  1, n; j  l , m  1; m  m  1.
Начало
n,m,l
i=1,n
j=1,m
ai,j
i=1,n
j=l,m-1
a,i,j= ai,j+1
i=1,n
j=1,m
ai,j
Конец
31
8). В ДЧМ вставить новую строку с номером k.
Элементы новой строки задано в одномерном числовом
массиве.
1.Математическая формулировка:
A  {ai , j };
i  1, n;
j  1, m;
Одномерный числовой
составляют k-ю строку.
B  {b j };
массив,
элементы
j  1, m;
.......................................
a k 1 , a k 2 , a k 3 ,........,a km




a k 1,1 , a k 1, 2 , a k 1, 3 , .....,a k 1,m ,




... ...... ....... ............ ..




a n 1,1 , a n  2 , 2 , a n 3, 3 ,.....,a n 1,m




a n ,1 , a n , 2 , a n ,3 ,......,a n ,m




a n 1,1 , a n 1, 2 , a n 1,3 ,.....,a n 1,m .
32
которого
Сдвиг элементов строки начинается с
n-й (последней)
строки, т.е.
an1,1  an1 , an1, 2  an 2 , an1,3  an3 ,...,an1,m  anm ; an1, j  anj , j  1, m.
an1,1  an1 , an1, 2  an 2 , an1,3  an3 ,...,an1,m  anm ; an1, j  anj , j  1, m.
......................................................................................................
an1,1  an1 , an1, 2  an 2 , an1,3  an3 ,...,an1,m  anm ; an1, j  anj , j  1, m.
После сдвига вместе освобожденной строки
к-записываются
элементы ОЧМ В , т.е.
ak1  b1 , ak 2  b2 , ak 3  b3 ,....,akj  bm ; akj  b j ; j  1, m
.
Обобщенный алгоритм:
1.
ai 1, j  ai , j ,
2.
i  n, k  1;
j  1, m;
akj  b j , j  1, m.
33
n  n  1.
Начало
n,k,m
i=1,n
j=1,m
ai,j
j=1,m
bj
i=n,k-1
j=1,n
ai+1,j= ai,j
j=1,n
ak,j= bj
j=1,n
j=1,m
ai,j
Конец
34
Давайте повторим основные моменты данной лекции.
1. В массивах, определенных с помощью операторов
описания, обе размерности должны быть константами
или константными выражениями.
2. Массив хранится по строкам в непрерывной
области памяти.
3. Первый индекс всегда представляет собой номер
строки, второй — номер столбца. Каждый индекс
может изменяться от 0 до значения соответствующей
размерности, уменьшенной на единицу.
4. При описании массива можно в фигурных скобках
задать начальные значения его элементов.
При выделении динамической памяти сразу под весь
массив самую левую размерность можно задавать с
помощью переменной, все остальные размерности
должны быть константами. Для двумерного массива это
означает, что первая размерность может быть
константой или переменной, а вторая — только константой.
1. Для выделения динамической памяти под массив, в
котором все размерности переменные, используются
циклы.
2. Освобождение памяти из-под массива с любым
количеством измерений выполняется с помощью
операции delete С[].
Ниже в сжатом виде приведены рекомендации по
порядку создания программы.
1. Выбрать тип и способ хранения в программе
35
исходных данных, результатов и промежуточных
величин.
2. Записать алгоритм сначала в общем виде, стремясь
разбить его на простую последовательность шагов, а
затем детализировать каждый шаг.
3. Написать программу. При написании программы
рекомендуется:
■ давать переменным понятные имена;
■ не пренебрегать содержательными комментариями;
■ использовать промежуточную печать вычисляемых
величин в удобном формате;
■ при
написании вложенных циклов следить за
отступами;
■ операторы инициализации накапливаемых в цикле
величин задавать непосредственно перед циклом, в
котором они вычисляются.
4. Параллельно с написанием программы задать
тестовые примеры, которые проверяют все ветви
алгоритма и возможные диапазоны значений исходных
данных. Исходные данные удобнее формировать в
файле (по крайней мере, при отладке), не забывая
проверять в программе успешность его открытия.
Более подробно технология создания программы
описана в Учебнике на с. 102-114.
36
Задания:
Задания для данной лекции соответствуют приведенным в Учебнике на с.
139. Рекомендуется выполнять каждое задание в двух вариантах: используя
локальные и динамические массивы. Размерности локальных массивов задавать
именованными константами, значения элементов массива — в списке
инициализации. Ввод данных в динамический массив выполнять из файла.
Более сложные задания на массивы приведены в Учебнике на с. 142.
Книга.
С/С++.
Структурное
программирование:
Практикум/
T.A.Павловская, Ю.A. Щупак. – СПб.: Питер, 2003. – 240 с. (страницы 67-70)
Вариант 1
Дана целочисленная прямоугольная матрица. Определить:
1) количество строк, не содержащих ни одного нулевого элемента;
2) максимальное из чисел, встречающихся в заданной матрице более одного
раза.
Вариант 2
Дана целочисленная прямоугольная матрица. Определить количество
столбцов, не содержащих ни одного нулевого элемента.
Характеристикой строки целочисленной матрицы назовем сумму ее
положительных четных элементов. Переставляя строки заданной матрицы,
расположить их в соответствии с ростом характеристик.
1)
2)
1)
2)
1)
2)
1)
Вариант 3
Дана целочисленная прямоугольная матрица. Определить:
количество столбцов, содержащих хотя бы один нулевой элемент;
номер строки, в которой находится самая длинная серия одинаковых элементов.
Вариант 4
Дана целочисленная квадратная матрица. Определить:
произведение элементов в тех строках, которые не содержат отрицательных
элементов;
максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы.
Вариант 5
Дана целочисленная квадратная матрица. Определить:
сумму элементов в тех столбцах, которые не содержат отрицательных элементов;
минимум среди сумм модулей элементов диагоналей, параллельных
побочной диагонали матрицы.
Вариант 6
Дана целочисленная прямоугольная матрица. Определить:
сумму элементов в тех строках, которые содержат хотя бы один
37
отрицательный элемент;
2) номера строк и столбцов всех седловых точек матрицы.
Примечание. Матрица А имеет седловую точку А~, если А~ является
минимальным элементом в i-й строке и максимальным в j-м столбце.
Вариант 7
Для заданной матрицы размером 8 на 8 найти такие к, что к-я строка
матрицы совпадает с k-м столбцом.
Найти сумму элементов в тех строках, которые содержат хотя бы один
отрицательный элемент.
Вариант 8
Характеристикой столбца целочисленной матрицы назовем сумму
модулей его отрицательных нечетных элементов. Переставляя столбцы
заданной матрицы, расположить их в соответствии с ростом характеристик.
Найти сумму элементов в тех столбцах, которые содержат хотя бы один
отрицательный элемент.
Вариант 9
Соседями элемента A;j в матрице назовем элементы Ак1 с i - 1 < k < i+1, j-1
< 1 < j+1, (к, 1) * (i, j). Операция сглаживания матрицы дает новую матрицу того
же размера, каждый элемент которой получается как среднее арифметическое
имеющихся соседей соответствующего элемента исходной матрицы. Построить
результат сглаживания заданной вещественной матрицы размером 10 на 10.
В сглаженной матрице найти сумму модулей элементов, расположенных
ниже главной диагонали.
Вариант 10
Элемент матрицы называется локальным минимумом, если он строго
меньше всех имеющихся у него соседей. Подсчитать количество локальных
минимумов заданной матрицы размером 10 на 10.
Найти сумму модулей элементов, расположенных выше главной
диагонали.
Вариант 11
Коэффициенты системы линейных уравнений заданы в виде
прямоугольной матрицы. С помощью допустимых преобразований привести
систему к треугольному виду. Найти количество строк, среднее арифметическое
элементов которых меньше заданной величины.
Вариант 12
Уплотнить заданную матрицу, удаляя из нее строки и столбцы,
заполненные нулями. Найти номер первой из строк, содержащих хотя бы один
положительный элемент.
38
Вариант 13
Осуществить циклический сдвиг элементов прямоугольной матрицы на п
элементов вправо или вниз (в зависимости от введенного режима), п может
быть больше количества элементов в строке или столбце.
Вариант 14
Осуществить циклический сдвиг элементов квадратной матрицы
размерности М х N вправо на к элементов таким образом: элементы 1-й строки
сдвигаются в последний столбец сверху вниз, из него — в последнюю строку
справа налево, из нее — в первый столбец снизу вверх, из него — в первую
строку; для остальных элементов — аналогично.
Вариант 15
Дана целочисленная прямоугольная матрица. Определить номер первого
из столбцов, содержащих хотя бы один нулевой элемент.
Характеристикой строки целочисленной матрицы назовем сумму ее
отрицательных четных элементов. Переставляя строки заданной матрицы,
расположить их в соответствии'с убыванием характеристик.
Вариант 16
Упорядочить строки целочисленной прямоугольной матрицы по
возрастанию количества одинаковых элементов в каждой строке.
Найти номер первого из столбцов, не содержащих ни одного
отрицательного элемента.
Вариант 17
Путем перестановки элементов квадратной вещественной матрицы
добиться того, чтобы ее максимальный элемент находился в левом верхнем
углу, следующий по величине — в позиции (2,2), следующий по величине — в
позиции (3,3) и т. д., заполнив таким образом всю главную диагональ.
Найти номер первой из строк, не содержащих ни одного положительного
элемента.
Вариант 18
Дана целочисленная прямоугольная матрица. Определить:
1) количество строк, содержащих хотя бы один нулевой элемент;
2) номер столбца, в котором находится самая длинная серия одинаковых элементов.
Вариант 19
Дана целочисленная квадратная матрица. Определить:
1) сумму элементов в тех строках, которые не содержат отрицательных элементов;
2) минимум среди сумм элементов диагоналей, параллельных главной
диагонали матрицы.
Вариант 20
Дана целочисленная прямоугольная матрица. Определить:
39
68
количество отрицательных элементов в тех строках, которые содержат
хотя бы один нулевой элемент;
2) номера строк и столбцов всех седловых точек матрицы.
Примечание. Матрица А имеет седловую точку A(j, если А~ является
минимальным элементом в i-й строке и максимальным в j-м столбце.
1)
Задания для самостоятельной работы
Одномерные числовые массивы
Книга.
С/С++.
Структурное
программирование:
Практикум/
T.A.Павловская, Ю.A. Щупак. – СПб.: Питер, 2003. – 240 с. (страницы 67-70).
Вариант 1. В одномерном массиве, состоящем из п вещественных элементов,
вычислить: 1.сумму отрицательных элементов массива; 2.произведение элементов
массива, расположенных между максимальным и минимальным элементами.
Упорядочить элементы массива по возрастанию.
Вариант 2. В одномерном массиве, состоящем из п вещественных элементов,
вычислить: 1.сумму положительных элементов массива; 2. произведение элементов
массива, расположенных между максимальным по модулю и минимальным по
модулю элементами. Упорядочить элементы массива по убыванию.
Вариант 3. В одномерном массиве, состоящем из п целых элементов,
вычислить:
1) произведение элементов массива с четными номерами;
2) сумму элементов массива, расположенных между первым и последним нулевыми элементами.
Преобразовать массив таким образом, чтобы сначала располагались все
положительные элементы, а потом — все отрицательные (элементы, равные 0,
считать положительными).
Вариант 4. В одномерном массиве, состоящем из п вещественных элементов,
вычислить:
1) сумму элементов массива с нечетными номерами;
2) сумму элементов массива, расположенных между первым и последним
отрицательными элементами.
Сжать массив, удалив из него все элементы, модуль которых не
превышает 1. Освободившиеся в конце массива элементы заполнить нулями.
Вариант 5. В одномерном массиве, состоящем из п вещественных элементов,
вычислить:
1) максимальный элемент массива;
2) сумму элементов массива, расположенных до последнего
40
положительного элемента.
Сжать массив, удалив из него все элементы, модуль которых находится в
интервале [а, Ь]. Освободившиеся в конце массива элементы заполнить нулями.
Вариант 6. В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1)
минимальный элемент массива;
2)
сумму элементов массива, расположенных между первым и
последним положительными элементами.
Преобразовать массив таким образом, чтобы сначала располагались все
элементы, равные нулю, а потом — все остальные.
Вариант 7. В одномерном массиве, состоящем из п целых элементов,
вычислить:
1)
номер максимального элемента массива;
2)
произведение элементов массива, расположенных между первым и
вторым нулевыми элементами.
Преобразовать массив таким образом, чтобы в первой его половине
располагались элементы, стоявшие в нечетных позициях, а во второй половине
— элементы, стоявшие в четных позициях.
Вариант 8. В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1)
номер минимального элемента массива;
2)
сумму элементов массива, расположенных между первым и вторым
отрицательными элементами.
Преобразовать массив таким образом, чтобы сначала располагались все
элементы, модуль которых не превышает 1, а потом — все остальные.
Вариант 9. В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) максимальный по модулю элемент массива;
2) сумму элементов массива, расположенных между первым и вторым положительными элементами.
Преобразовать массив таким образом, чтобы элементы, равные нулю,
располагались после всех остальных.
Вариант 10. В одномерном массиве, состоящем из п целых элементов,
вычислить:
1) минимальный по модулю элемент массива;
2) сумму модулей элементов массива, расположенных после первого
элемента, равного нулю.
Преобразовать массив таким образом, чтобы в первой его половине
располагались элементы, стоявшие в четных позициях, а во второй половине —
элементы, стоявшие в нечетных позициях.
41
70
Вариант 11. В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1)
номер минимального по модулю элемента массива;
2)
сумму модулей элементов массива, расположенных после первого
отрицательного элемента.
Сжать массив, удалив из него все элементы, величина которых находится
в интервале [а, Ь]. Освободившиеся в конце массива элементы заполнить
нулями.
Вариант 12. В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) номер максимального по модулю элемента массива;
2) сумму элементов массива, расположенных после первого положительного
элемента.
Преобразовать массив таким образом, чтобы сначала располагались все
элементы, целая часть которых лежит в интервале [а, Ь], а потом — все
остальные.
Вариант 13. В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) количество элементов массива, лежащих в диапазоне от А до В;
2) сумму элементов массива, расположенных после максимального элемента.
Упорядочить элементы массива по убыванию модулей элементов.
Вариант 14. В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) количество элементов массива, равных 0;
2) сумму элементов массива, расположенных после минимального элемента.
Упорядочить элементы массива по возрастанию модулей элементов.
Вариант 15. В одномерном массиве, состоящем из п вещественных
элементов, вычислить:
1) количество элементов массива, больших С;
2) произведение элементов массива, расположенных после максимального по
модулю элемента.
Преобразовать массив таким образом, чтобы сначала располагались все
отрицательные элементы, а потом — все положительные (элементы, равные 0,
считать положительными).
Вариант 16. В одномерном массиве, состоящем из п вещественных элементов,
вычислить:
1) количество отрицательных элементов массива;
2) сумму модулей элементов массива, расположенных после минимального по
модулю элемента.
Заменить все отрицательные элементы массива их квадратами и
упорядочить элементы массива по возрастанию.
42
Вариант 17. В одномерном массиве, состоящем из п целых элементов,
вычислить:
1) количество положительных элементов массива;
2) сумму элементов массива, расположенных после последнего элемента,
равного нулю.
Преобразовать массив таким образом, чтобы сначала располагались все
элементы, целая часть которых не превышает 1, а потом — все остальные.
Вариант 18. В одномерном массиве, состоящем из п вещественных элементов,
вычислить:
1) количество элементов массива, меньших С;
2) сумму целых частей элементов массива, расположенных после последнего
отрицательного элемента.
Преобразовать массив таким образом, чтобы сначала располагались все
элементы, отличающиеся от максимального не более чем на 20%, а потом —
все остальные.
Вариант 19. В одномерном массиве, состоящем из п вещественных элементов,
вычислить: 1.произведение отрицательных элементов массива; 2. сумму
положительных элементов массива, расположенных до максимального элемента.
Изменить порядок следования элементов в массиве на обратный.
Вариант 20. В одномерном массиве, состоящем из п вещественных элементов,
вычислить:
1) произведение положительных элементов массива;
2) сумму элементов массива, расположенных до минимального элемента.
Упорядочить по возрастанию отдельно элементы, стоящие на четных
местах, и элементы, стоящие на нечетных местах.
//M-14.4
//C++ opredelenie summu otritsatelnix elementov massiva
// s pomoshyu FOR
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n;
cout<<"vvedite kolichestvo elementov massiva n = ";
cin>>n;
cout<<endl;
int i;
float a[n+1];
for(int i=1;i<=n;i++)
43
{
cout<<"a["<<i<<"]= ";
cin>>a[i];
}
float s=0;
for(i=1;i<=n;i++)
if (a[i]<0) s=s+a[i];
cout<<" summa s = "<<s;
cout<<endl;
return 0;
}
Задача.
Напишите сценарий, определяющий максимальную по длине неубывающую
последовательность чисел в массиве:
Алгоритм решения
Циклом идем по массиву. Сохраняем последовательности чисел во временный
массив tmp_arr. Т.е., если значение текущего элемента массива больше или
равно предыдущему, то помещаем его во временный массив tmp_arr. Как только
текущий элемент становится меньше предыдущего – значит неубывающая
последовательность закончилась и переходим к сравнению длин
массивов tmp_arr и seq_arr В этих массивах хранятся текущая неубывающая
последовательность
и
предыдущая
соответственно.
Если
размер
массива tmp_arr, а соответственно и длина текущей последовательности чисел
больше предыдущей, то сохраняем текущую последовательность в seq_arr. В
итоге, после цикла в массиве seq_arr будет храниться максимальная
неубывающая последовательность чисел из заданного массива arr.
Код javascript:
1
2
3
4
5
6
7
8
9
var arr = [1,2,3,4,5,0,7,8,9,10,0,1,2,10,20,1,2,3,4,5,6,7,5,4,3,2,1,3,5,6,8,8];
function max_sequence(arr) {
var seq_arr = [arr[0]];
var tmp_arr = [arr[0]]
for (i = 1; i < arr.length; i++) {
if (arr[i] >= arr[i-1]) {
tmp_arr.push(arr[i]);
44
10
} else {
11
if (tmp_arr.length > seq_arr.length) {
12
seq_arr = tmp_arr;
13
}
14
tmp_arr = [arr[i]];
15
}
16
}
17
if (tmp_arr.length > seq_arr.length) {
18
seq_arr = tmp_arr;
19
}
20
return seq_arr;
21 }
22 document.write(max_sequence(arr));
23
Если в заданном массиве arr будет две последовательности чисел, которые
окажутся максимальными по длине, то в данной реализации будет выдана
первая максимальная последовательность, если нужно выводить последнюю, то
в код нужно внести такое изменение при сравнении длин массивов (вместо
знака > написать >=).
1
2
3
4
5
6
7
if (tmp_arr.length >= seq_arr.length) {
seq_arr = tmp_arr;
}
45
Download