Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Задача 3.1. Количество элементов между минимумом и максимумом



Читайте также:
  1. I. Гашение дуги с помощью полупроводниковых элементов
  2. I. О различии между чистым и эмпирическим познанием
  3. II этап Развитие грудобрюшного типа дыхания с включением элементов дыхательной гимнастики А.Н. Стрельниковой
  4. II. НАЦИОНАЛЬНАЯ ОХРАНА И МЕЖДУНАРОДНАЯ ОХРАНА КУЛЬТУРНОГО И ПРИРОДНОГО НАСЛЕДИЯ
  5. II.3.2. Эффекты взаимного влияния элементов
  6. III. Общение между супругами
  7. III. Отношения между культурами

Написать программу, которая для целочисленного массива из 100 элементов опре­деляет, сколько положительных элементов располагается между его максималь­ным и минимальным элементами.

Запишем алгоритм в самом общем виде.

1. Определить, где в массиве расположены его максимальный и минимальный эле­менты, то есть найти их индексы.

2. Просмотреть все элементы, расположенные между ними. Если элемент масси­ва больше нуля, увеличить счетчик элементов на единицу.

Перед написанием программы полезно составить тестовый пример, чтобы более наглядно представить себе алгоритм решения задачи. Ниже представлен пример массива из 10 чисел и обозначены искомые величины:

6 –8 15 9 –1 3 5 –10 12 2

макс + + + мин.

 

Ясно, что порядок расположения элементов в массиве заранее не известен, и сна­чала может следовать как максимальный, так и минимальный элемент, кроме того, они могут и совпадать. Поэтому прежде чем просматривать массив в поисках ко­личества положительных элементов, требуется определить, какой из этих индек­сов больше. Запишем уточненный алгоритм:

1. Определить, где в массиве расположены его максимальный и минимальный элементы:

• Задать начальные значения для индексов максимального и минимального элементов (например, равные нулю, но можно использовать любые другие значения индекса, не выходящие за границу массива).

• Просмотреть массив, поочередно сравнивая каждый его элемент с ранее най­денными максимумом и минимумом. Если очередной элемент больше ранее найденного максимума, принять этот элемент за новый максимум (т. е. за­помнить его индекс). Если очередной элемент меньше ранее найденного минимума, принять этот элемент за новый минимум.

2. Определить границы просмотра массива для поиска положительных элементов, находящихся между его максимальным и минимальным элементами:

• Если максимум расположен в массиве раньше, чем минимум, принять левую границу просмотра равной индексу максимума, иначе — индексу минимума.

• Если максимум расположен в массиве раньше, чем минимум, принять правую границу просмотра равной индексу минимума, иначе — индексу максимума.

3. Обнулить счетчик положительных элементов. Просмотреть массив в указан­ном диапазоне. Если очередной элемент больше нуля, увеличить счетчик на единицу.

Для экономии времени при отладке значения элементов массива задаются путем инициализации.

#iinclude <iostream.h>

int main(){

const int n = 10;

int a[n] = {1, 3, –5, 1, -2, 1, -1, 3, 8. 4};

int i, imax, imin, count;

for (i = imax = imin = 0; i < n; i++) {

if (a[i] > a[imax]) imax = i;

if (a[i] < a[imin]) imin = i;

}

cout << “\n\t max= “ << a[imax] << “ min= “ << a[imin]; // отладка

int ibeg = imax < imin? imax: imin;

int iend = imax < imin? imin: imax;

cout << “\n\t ibeg= “ << ibeg << “ iend= “ << iend; // отладка

for (count = 0, i = ibeg + 1; i < iend; i++)

if (a[i] > 0) count++;

cout << “ Количество положительных: “ << count << endl;

return 0;

}

В программе использована управляющая последовательность \t, которая задает отступ при выводе на следующую позицию табуляции.

СОВЕТ: После нахождения каждой величины вставлена отладочная печать. Мы рекомендуем ни­когда не пренебрегать этим способом отладки и не жалеть времени, стараясь сделать эту печать хорошо читаемой, то есть содержащей необходимые пояснения и хорошо отформа­тированной. Это экономит много времени при отладке программы.

Массив просматривается, начиная с элемента, следующего за максимальным (мини­мальным), до элемента, предшествующего минимальному (максимальному). Ин­дексы границ просмотра хранятся в переменных ibeg и iend. В приведенной выше программе для определения их значений используется тернарная условная опера­ция (см. с. 36). Можно поступить и по-другому: просматривать массив всегда от максимума к минимуму, а индекс при просмотре увеличивать или уменьшать в зависимости от их взаимного расположения.

В приведенной ниже программе направление просмотра, то есть приращение ин­декса, хранится в переменной d. Если массив просматривается «слева направо», она равна 1, иначе— -1. Обратите внимание и на изменившееся условие продолже­ния этого цикла.

#include <i.ostream.h>

int main(){

const int n = 10;

int a[n];

int i, imax, imin, kol;

cout << “ Введите “ << n << “ целых чисел:” << endl;

for (i = 0; i < n; i++) cin >> a[i];

for (i =0; i < n; i++) cout << a[i] << “ “;

for (i = imax = imin = 0; i < n; i++) {

if (a[i] > a[imax]) imax = i;

if (a[i] < a[imin]) imin = i;

}

int d = 0;

if (imax < imin) d = 1;

else if (imax > imin) d = -1;

for (kol = 0, i = imax + d; i!= imin; i += d) if (a[i] > 0) kol++;

cout << “\n Количество положительных: “ << kol << endl;

return 0;

}

Ввод массива в этом варианте программы осуществляется с клавиатуры. Напоми­наем, что в этом случае желательно для проверки вывести введенные значения на печать.

Тестовых примеров для этой задачи должно быть, по крайней мере, три для случа­ев, когда:

1) a[imin] расположен левее a[imax];

2) a[imin] расположен правее a[imax];

3) a[imin] и а[mах] совпадают.

Последняя ситуация имеет место, когда в массиве все элементы имеют одно и то же значение. Кстати, во втором варианте программы третий случай корректно об­рабатывается благодаря значению d = 0 для этой ситуации. Желательно также проверить, как работает программа, если a[imin] и a[imax] расположены рядом, а также в начале и в конце массива (граничные случаи). Элементы массива нужно задавать как положительные, так и отрицательные.

Разница между приведенными способами решения несущественна, но первый ва­риант более «прозрачен», поэтому он, на наш взгляд, предпочтительнее.

Измените приведенную выше программу так, чтобы она вычисляла произведение отрицательных элементов, расположенных между минимальным и максимальным по модулю элементами массива.

Часто бывает, что точное количество элементов в исходном массиве не задано, но известно, что оно не может превышать некое конкретное значение. В этом случае память под массив выделяется «по максимуму», а затем заполняется только часть этой памяти. Память можно выделить либо с помощью оператора описания в сте­ке или сегменте данных, либо в динамической области. Фактическое количество введенных элементов запоминается в переменной, которая затем участвует в организации циклов по массиву, задавая его верхнюю границу. Этот подход является весьма распространенным, поэтому мы приводим ниже небольшую, но полезную программу, в которой выполняется только считывание элементов массива с кла­виатуры и их вывод на экран:

#include <iostream.h>

int main(){

const int n = 1000;

int a[n];

int i, kol_a;

cout << “Введите количество элементов “; cin >> kol_a;

if (kol_a > n) {

cout << “ Превышение размеров массива “ << endl; return 1;}

for (i = 0; i < kol_a; i++) cin >> a[i];

for (i = 0: i < kol_a; i++) cout << a[i] << “ “;

cout << endl;

return 0;

}

Несмотря на то, что значение константы n определяется «с запасом», надо обяза­тельно проверять, не запрашивается ли большее количество элементов, чем воз­можно. Привычка к проверке подобных, казалось бы, маловероятных случаев по­зволит вам создавать более надежные программы, а нет ничего более важного для программы, чем надежность. Впрочем, и для человека это качество совсем не лишнее.


Дата добавления: 2015-07-11; просмотров: 103 | Нарушение авторских прав






mybiblioteka.su - 2015-2024 год. (0.012 сек.)