
- •Глава 3 Одномерные массивы
- •Нахождение суммы элементов массива
- •Суммирование элементов массива с учетом условия
- •Нахождение среднего арифметического
- •Нахождение среднего арифметического при условии
- •Поиск максимального элемента в массиве
- •Поиск индексов в массиве
- •Проверка упорядоченности массива
- •Обмен значений массива
- •Суммирование соседних элементов массива
- •Подсчет соседних элементов по условию
- •Перенос модулей значений в другой массив
- •Подсчет количества максимальных элементов
- •Изменение значений элементов массива с заданными свойствами
- •Нахождение индексов элементов с заданными свойствами
- •Удаление из массива определенного элемента
- •Циклическое перемещение элементов массива
- •Заполнение массива случайными числами
- •Нахождение суммы группы элементов массива
Проверка упорядоченности массива
Иногда возникает необходимость проверки упорядоченности массива — все ли элементы расставлены в порядке возрастания. В листинге 3.7 приведена программа, которая попарно анализирует соседние элементы массива. Здесь мы ввели переменную Flag, в которую при нахождении нарушения упорядоченности в массиве (если текущий элемент больше последующего) заносится значение 1 (первоначально значение этой переменной инициализируется нулем). Это и является индикатором при формировании сообщения о неупорядоченности массива чисел. В противном случае, если переменнаяFlag остается равной нулю, то можно сказать, что массив упорядочен. Блок-схема алгоритма представлена на рис. 3.3.
Рис. 3.3. Блок-схема к программе листинга 3.7
Листинг 3.7. Анализ упорядоченности элементов массива
#include <iostream>
using namespace std;
#include <conio.h>
#include <math.h>
#define N 10
#define NM 11
void main()
{
int A[NM];
int J,Flag;
for (J=1; J<= N; J++)
{ A[J]=rand()%5;
cout <<"\n"<<A[J]; }
Flag=0;
for (J=1; J<= N-1;J++)
{
if ( A[J]>A[J+1] )
{
Flag=1;
break;
}
}
if (Flag ==0 )
cout <<"\nМассив упорядочен";
else
cout <<"\nМассив неупорядочен";
_getch();
}
Обмен значений массива
Обмен значений элементов массива достаточно часто встречается при работе с массивами. В программе, приведенной в листинге 3.8, производится следующий вариант обмена значений: первый элемент меняется значением с последним, второй с предпоследним и т. д. На рис. 3.4 показана данная схема обмена.
Рис. 3.4. Блок-схема обмена
Сам алгоритм несложен, а его идея заключается в том, что сначала вычисляется количество обменов. Для этого следует число элементов массива поделить на 2 (выполнить целочисленное деление). После этого в цикле по числу обменов выполняется обмен значений элементов массива. Блок-схема алгоритма представлена на рис. 3.5.
Рис. 3.5. Блок-схема к программе листинга 3.8
Листинг 3.8. Обмен значений элементов массива
#include <iostream>
using namespace std;
#include <conio.h>
#include <math.h>
#define N 7
#define NM 8
void main()
{
int A[NM];
int J,B,L;
for (J=1; J<= N; J++)
{ A[J]=rand()%50;
cout <<"\n"<<A[J]; }
L= N / 2;
for (J=1; J<= L;J++)
{
B= A[J];
A[J]= A[N-J+1];
A[N-J+1]= B;
}
cout <<"\n";
for (J=1; J<=N;J++)
cout <<"\n"<<A[J];
_getch();
}
Суммирование соседних элементов массива
Необходимо разработать алгоритм поиска номера первого из двух последовательных элементов в целочисленном массиве, состоящем из 30 элементов, сумма которых максимальна (если таких пар несколько, то можно выбрать любую). Решение этой задачи похоже на поиск номера максимального элемента, а отличием является только то, что здесь требуется анализировать сумму двух соседних элементов массива.
В листинге 3.9 приведена необходимая программная разработка. В начале программы в переменную SumMaxзаносится сумма первых двух элементов, а далее последовательно сравниваются сSumMax суммы следующих пар элементов. В случае когда сумма элементов очередной пары оказывается большеSumMax, то это приводит к обновлениюSumMax и фиксированию индекса первого элемента пары в переменнойJmax. В конце программы значениеJmax выводится на печать. Блок-схема алгоритма представлена на рис. 3.6.
Листинг 3.9. Поиск пары соседних элементов с максимальной суммой
#include <iostream>
using namespace std;
#include <conio.h>
#include <math.h>
#define N 15
#define NM 16
void main()
{
int A[NM];
int J,Jmax,SumMax;
for (J=1; J<= N; J++)
{ A[J]=rand()%100;
cout <<A[J]<<" ";}
SumMax= A[1]+A[2];
Jmax=1;
for (J=2; J<=(N-1);J++)
{
if (( A[J]+A[J+1] ) > SumMax)
{
Jmax=J;
cout <<"Jmax ="<<Jmax;
SumMax= A[J]+A[J+1];
}
}
cout <<"\nJmax ="<<Jmax;
_getch();
}
Рис. 3.6. Блок-схема к программе листинга 3.9