Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Одномерные массивы (справка).doc
Скачиваний:
4
Добавлен:
17.08.2019
Размер:
139.78 Кб
Скачать

Одномерные массивы и указатели

В случае простых переменных каждой области памяти для хранения одной вели­чины соответствует свое имя. Если требуется работать с группой величин одного типа, их располагают в памяти последовательно и дают им общее имя, а различают по порядковому номеру. Такая последовательность однотипных величин называ­ется массивом. Чтобы лучше себе это представить, простые переменные можно упо­добить гражданскому населению, а массивы — обитателям мест лишения свободы.

Массивы, как и любые другие объекты, можно размещать либо с помощью опера­торов описания в сегментах данных или стека, либо в динамической области памя­ти с помощью операций выделения памяти.

При описании массива после имени в квадратных скобках задается количество его элементов (размерность), например int а[10]. Массив располагается в зависимо­сти от места его описания либо в сегменте данных, либо в сегменте стека, и все инструкции по выделению памяти формирует компилятор до выполнения про­граммы. Вследствие этого размерность массива может быть задана только констан­той или константным выражением.

При описании массив можно инициализировать, то есть присвоить его элементам начальные значения, например:

int а[10] = {1. 1. 2. 2. 5. 100}:

Если инициализирующих значений меньше, чем элементов в массиве, остаток мас­сива обнуляется, если больше — лишние значения не используются.

ВНИМАНИЕ

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

Для данного массива элементы имеют номера от 0 до 9. Номер элемента указыва­ется после его имени в квадратных скобках, например, а[0]. а[3]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

СОВЕТ

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

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

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

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

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

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

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

Желательно также проверить, как работает программа, если a[imin] и a[imax] расположены рядом, а также в начале и в конце массива (граничные случаи). Элементы массива нужно задавать как положительные, так и отрицательные.

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

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

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