Файл: Особенности и примеры использования массивов при использовании программ.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 23.04.2023

Просмотров: 74

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Рисунок 4 – Циклическая структура с постусловием

Цикл с предусловием можно прочитать следующим образом:

пока проверка условия дает результат «да», выполнять действие.

Если при очередной проверке условия будет получено результат «нет», повторное выполнение действия будет прекращено и произойдет выход из цикла.

Например, для подсчета остатка от деления целого числа t на целое число n с помощью вычитания можно воспользоваться циклом:

пока t> n, уменьшить t на n.

В цикле с постусловием (рисунок 4) условие цикла формулируется противоположным образом: если очередная проверка условия дает результат "да", происходит выход из цикла. Цикл с постусловием можно сокращенно прочитать так:

повторять действие до получения результата «да» при проверке условия.

Например, подсчет остатка от деления целого числа t на целое число n (t> n) можно реализовать с помощью цикла:[9]

повторять уменьшить t на n до t <n.

Стоит обратить внимание на то, что является общим для обоих типов цикла:

– обе базовые структуры цикла являются замкнутыми;

– количество повторений цикла определяется его условием;

– выход из цикла происходит только через проверку условия цикла.

Наиболее существенная разница между типами циклов заключается в том, что тело цикла с постусловием обязательно выполняется хотя бы один раз – до первой проверки условия, а цикл с предусловием может не выполнятся ни разу, если при первой же проверке условия имеем результат «нет». Поэтому рассмотренные типы циклов не являются взаимозаменяемыми: цикл с постусловием можно заменить циклом с предусловием, а наоборот – нет.

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

Обработка массивов с использованием циклических алгоритмов

Реализация циклических алгоритмов в С++

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


Для реализации циклического процесса в С++ существуют 3 циклических оператора:

  1. Оператор цикла с предусловием while. Его интерфейс:

while (логическое_выражение)

{

Тело цикла

}

Если параметр оператора while принимает значение истина, то будут выполнятся операторы тела циклической части. После этого опять проверяется условие и если логическое выражение имеет значение истина – снова выполняется тело цикла.

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

Пример 1.

l=0;

while(l<=5)

{

a=pow(l,2);

cout<<a<<” “;

l++;

}

Описанный в примере алгоритм будет выполняться пока значение переменной l будет меньше равно 5. В противоположном случае произойдет выход с циклического алгоритма.

  1. Оператор цикла с послеусловием do … while имеет следующий синтаксис:

do

{

Тело цикла

}

while (логическое_выражение)

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

Пример 2.

с=1;

do

{

p=pow(c,2);

cout<<p<<” “;

c++;

}

Как видно в двух примерах, перед циклическим оператором нужно указать начальное значение счетчика цикла, а в теле цикла указать шаг приращения переменной цикла.

  1. Циклический оператор for использует такой синтаксис:

for (инициализация; условие; приращение)

{

Тело цикла

}

Описанный выше оператор часто используется при реализации вычислений в массивах. В нем инициализируется переменная цикла, потом сразу проверяется условие окончания цикла. Если цикл выполняется, то операторы циклической части проводя вычисления, иначе идет переход к операторам, которые следуют за оператором for.

Пример 3.

for(w=1;w<=15;w++)

{

a=pow(w,2);

cout<<w<<" ";

}

2.2. Использование операторов цикла в одномерных массивах

Часто, в процессе разработки программы, возникает потребность хранить большое количество однотипных значений, которые должны поддаваться одинаковым методам обработки. Например, экзаменационные оценки студентов, следует вводить, выводить, анализировать (сравнение с "2" или "5"), изменять при необходимости и тому подобное. Такие однотипные значения имеет смысл хранить в одной переменной, перенумеровать их внутри этой переменной, предоставить доступ к этим значениям по индексу и обрабатывать эти значения в цикле (номер индекса должен совпадать с значением параметра цикла).


Массив – это упорядоченная совокупность однотипных элементов. Массивы широко применяются для хранения и обработки однородной информации, например таблиц, векторов, матриц, коэффициентов уравнений и т.д. [16]

Каждый элемент массива однозначно можно определить по имени массива и индексе. Имя массива (идентификатор) подбирают по тем же правилам, что и для переменных.

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

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

Различия массива от обычных переменных следующие:[14]

– общее имя для всех значений;

– доступ к конкретному значению по его номеру (индексу)

– возможность обработки в цикле.

Одномерный массив объявляется в программе следующим образом:

<тип данных> <имя_массива> [<размер массива>];

Тип данных задает тип элементов массива. Элементами массива не могут быть функции и элементы типа void. Размер массива в квадратных скобках задает количество элементов массива. В отличие от других языков, в C++ не проверяется выход за пределы массива, поэтому, чтобы избежать ошибок в программе, следует следить за размерностью объявленных массивов.

Значение размера массива при объявлении может быть не указано в следующих случаях:[15]

– при объявлении массив инициализируется;

– массив объявлен как формальный параметр функции;

– массив объявлен как ссылка на массив, явно определенный в другом модуле.

Используя имя массива и индекс, можно обращаться к элементам массива:

<имя_массива> [<значение_ индекса>]

Значения индексов должны находиться в диапазоне от нуля до величины, на единицу меньше размера массива, который определен при его объявлении, поскольку в C ++ нумерация индексов начинается с нуля.

Например,

int A[10];

объявляет массив с именем А, содержащий 10 целых чисел; при этом выделяет и закрепляет за этим массивом оперативную память для всех 10-ти элементов соответствующего типа (int – 4 байта), то есть 40 байтов, следующим образом (рисунок 5):


A[0]

A[1]

A[2]

A[3]

A[4]

A[5]

A[6]

A[7]

A[8]

A[9]

Рисунок 5 ­ Изображение одномерного массива

Следовательно, при объявлении массива выделяется память, необходимая для размещения всех его элементов. Элементы массива с первого до последнего запоминаются в последовательно возрастающих адресах памяти. Между элементами массива в памяти промежутков нет. Элементы массива записываются один за другим поэлементно.[13]

Для получения доступа к i-му элементу массива А, можно написать А[і], где i – переменная цикла (счетчик цикла), которая может принимать значения от 0 до 9. При этом величина i умножается на размер типа int и представляет собой адрес i-го элемента массива А от его начала, после чего осуществляется выбор элемента массива А по сложившейся адресу.[12]

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

Например,

int a[5] = {9, 33, -23, 8, 1}; // а [0] = 9, а [1] = 33, а [2] = - 23, а [3] = 8, а [4] = 1;

float b[10] = {1.5, -3.8, 10}; // B [0] = 1.5, b [1] = - 3.8, b [2] = 10, b [3] = ... = b [9] = 0;

Все операции с массивами выполняются с помощью операторов цикла. Например, ввод информации в массив:

for (int i = 0; i <n; i ++)

cin >> a [i];

Вывод информации из массива:

for (int i = 0; i <n; i ++)

cout << a [i] << "";

2.3. Использование операторов цикла в двумерных массивах

Для многих структур данных изображения в виде одномерного массива является неприемлемым. Например, результаты матчей футбольного чемпионата удобнее подавать в виде квадратной таблицы. Для хранения таких структур данных применяют многомерные массивы, среди которых наиболее широко используются двумерные массивы (матрицы).

Как отмечалось в данном разделе, размерность массива определяется количеством индексов. Элементы одномерного массива имеют один индекс, двумерного массива (матрицы, таблицы) – два индекса: первый из них – номер строки, второй – номер столбца. При размещении элементов массива в памяти компьютера сначала меняется крайний правый индекс, затем остальные - справа налево. [11]

Многомерный массив объявляется в программе следующим образом:


<тип> <имя_массива> [<размерность1>] [<размерность2>] ... [<размерностьN>];

Количество элементов массива равна произведению количества элементов по каждому индексу. Например,

int a [3][4];

объявлено двумерный массив из 3-х строк и 4-х колонок (12-ти элементов) целого типа:

a [0] [0] a [0] [1], a [0] [2], a [0] [3],

a [1] [0], a [1] [1], a [1] [2], a [1] [3],

a [2] [0], a [2] [1], a [2] [2], a [2] [3];

Приведем еще несколько примеров объявления массивов:

float Mas1 [5] [5]; // Матрица 5х5 = 25 элементов вещественного типа.

char Mas2 [10] [3]; // Двумерный массив с 10х3 = 30 элементов символьного типа

double Mas3 [4] [5] [4]; // Трехмерный массив с 4х5х4 = 80 элементов вещественного типа

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

1) int w [3] [3] = {{2, 3, 4}, {3, 4, 8}, {1, 0, 9}};

2) float C [4] [3] = {1.1, 2, 3, 3.4, 0.5, 6.8, 9.7, 0.9};

В первом примере объявлено и инициализирован массив целых чисел w[3][3]. Элементам массива присвоено значение из списка: w[0][0] = 2, w[0][1] = 3, w[0][2] = 4, w[1][0] = 3 и т.д.

Рассмотрим примеры для ввода и вывода элементов матрицы а.

Инициализировать матрицу a размерности nxm можно с помощью следующего кода:

for (i = 0; i <n; i ++)

for (j = 0; i <m; j ++)

cin >> a [i] [j];

Для вывода двумерного массива на экран используются следующие операторы:

for (i = 0; i <n; i ++)

{

for (j = 0; i <m; j ++)

cout << a [i] [j] << "";

cout << endl;

}

Во втором разделе рассмотрено реализацию циклических алгоритмов в С++, использование операторов цикла в одномерных и двумерных массивах, приведено конкретные примеры программного кода.

Базовые алгоритмы обработки массивов с использованием циклических операторов

3.1.Основные алгоритмы обработки одномерных массивов

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

В подобных случаях в языке С++ используют объекты, называемые массивами.

Практически все операции с массивом следует проводить поэлементно в цикле. Для обработки элементов массива  удобно использовать цикл  for ...do, а верхний индекс массивов определять как предварительно описанную константу.