Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
40
Добавлен:
28.03.2015
Размер:
188.42 Кб
Скачать

Подсчет соседних элементов по условию

Необходимо разработать алгоритм подсчета максимального количества идущих подряд совпадающих элементов в целочисленном массиве, который имеет длину 15. Программа, решающая данную задачу, представлена в листинге 3.10. Учитывая некоторую неочевидность алгоритма, на рис. 3.7 приведена блок-схема, которая предоставляет необходимую информативность. Здесь мы для фиксирования максимального количества подряд идущих элементов определили переменную MaxNums, а для хранения текущего числа совпадающих элементов ввели переменнуюNums. В цикле анализируется текущий и предыдущий элементы массива. Если они оказываются равными, то увеличивается значение счетчикаNumsи анализируется значение следующего элемента массива. Если же предыдущий и текущий элементы не совпадают, то проверяется, больше лиNums, чемMaxNums. Если больше, то значениеNumsфиксируется в качестве нового значенияMaxNums. И в том, и в другом случае после этого сбрасывается в единицу значениеNumsи начинается анализ следующего элемента массива.

Листинг 3.10. Подсчет максимального количества подряд идущих элементов массива

#include <iostream>

using namespace std;

#include <conio.h>

#include <math.h>

#define N 15

#define NM 16

void main()

{

int A[NM];

int J,Nums,MaxNums;

Nums=1;

MaxNums=1;

for (J=1;J<=N;J++)

{ A[J]=rand()%3;

cout <<A[J]<<" "; }

for (J=2;J<= N;J++)

{

if (A[J]==A[J-1])

Nums= Nums+1;

else

{

if (Nums > MaxNums)

MaxNums= Nums;

Nums= 1;

}

}

if (Nums > MaxNums)

MaxNums= Nums;

cout <<"\n"<<MaxNums;

_getch();

}

Рис. 3.7. Блок-схема к программе листинга 3.10

Перенос модулей значений в другой массив

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

Здесь следует вспомнить, что модуль числа можно записать так:

, если;

, если.

Именно это преобразование и необходимо выполнить последовательно над каждым элементом массива. В листинге 3.11 приведена программная разработка для решения данной задачи. Здесь исходным массивом является A[J], а массивом, содержащим модули, —B[J]. При заполнении массива с помощью датчика случайных чисел мы обеспечили равновероятное генерирование как положительных, так и отрицательных чисел.

Листинг 3.11. Перенос модулей значений элементов массива

#include <iostream>

using namespace std;

#include <conio.h>

#include <math.h>

#define N 15

#define NM 16

void main()

{

int A[NM],B[NM];

int J;

for (J=1;J<=N;J++)

{ A[J]=rand()%100 - 50;

cout <<A[J]<<" ";}

cout <<"\n";

for (J=1;J<=N;J++)

{ if (A[J]< 0)

B[J]=-A[J];

else

B[J]=A[J];

cout <<B[J]<<" ";

}

_getch();

}

Подсчет количества максимальных элементов

Требуется разработать программу подсчета числа элементов в массиве, значения которых равны максимальному элементу. Число элементов в массиве равно 15.

Наиболее простой и очевидный вариант решения (рис. 3.8) заключается в организации двух этапов:

  • первоначальный просмотр массива с целью поиска максимального элемента;

Рис. 3.8. Блок-схема к программе листинга 3.12

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

В листинге 3.12 приведено программное решение поставленной задачи данным способом.

Листинг 3.12. Подсчет количества максимальных элементов (вариант 1)

#include <iostream>

using namespace std;

#include <conio.h>

#include <math.h>

#define N 15

#define NM 16

void main()

{

int A[NM];

int J, Max, Nums;

for (J=1;J<=N;J++)

{ A[J]=rand()%5;

cout <<A[J]<<" ";}

Max=A[1];

for (J=2; J<=N;J++)

{ if (A[J]> Max)

Max=A[J];

}

Nums=0;

for (J=1; J<=N;J++)

{ if (A[J] == Max )

Nums= Nums+1;

}

cout <<"\n"<<Nums;

_getch();

}

Однако такой вариант иногда рекомендуется оценивать как недостаточно эффективный. Это связано с тем, что в предложенном варианте решения происходит повторный просмотр элементов массива. Реализуем теперь поставленную задачу по-другому. На рис. 3.9 представлена блок-схема алгоритма. Построение решения связано с тем, что мы используем переменную Numsдля подсчета количества максимальных значений массива. При нахождении очередного максимума значение этой переменной сбрасывается в единицу, а при нахождении такого же максимального значения увеличивается на единицу. В листинге 3.13 приведена программная реализация алгоритма.

Листинг 3.13. Подсчет количества максимальных элементов (вариант 2)

#include <iostream>

using namespace std;

#include <conio.h>

#include <math.h>

#define N 15

#define NM 16

void main()

{

int A[NM];

int J, Max, Nums;

for (J=1;J<=N;J++)

{ A[J]=rand()%5;

cout <<A[J]<<" ";}

Max=A[1];

Nums=1;

for (J=2; J<=N;J++)

{ if (A[J]> Max)

{ Max=A[J];

Nums=1;

}

else

if (A[J] == Max )

Nums= Nums+1;

}

cout <<"\n"<<Nums;

_getch();

}

Рис. 3.9. Блок-схема к программе листинга 3.13

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