
- •Технология программирования циклических процессов. Арифметические циклы
- •Арифметические циклы с аналитическим заданием аргумента
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма
- •Программирование задачи
- •Операторы цикла
- •Оператор цикла с предусловием
- •Правила записи и выполнения
- •Оператор цикла с постусловием
- •Структура оператора
- •Правила записи и выполнения
- •Оператор пошагового цикла for
- •Структура оператора
- •Правила записи и выполнения
- •Программа по алгоритму цикла с предусловием
- •Программа по алгоритму цикла с постусловием
- •Программа по алгоритму цикла с параметром
- •Арифметические циклы с табличным заданием аргумента
- •Постановка задачи
- •Математическая формулировка
- •Выбор метода решения
- •Составление алгоритма решения
- •Алгоритмизация структурой цикла с предусловием
- •Алгоритмизация структурой цикла с постусловием
- •Алгоритмизация структурой цикла с параметром
- •Программирование задачи
- •Программирование задачи
- •Программа по алгоритму цикла с предусловием
- •Программа по алгоритму цикла с постусловием
- •Программа по алгоритму цикла с параметром
- •Заключение
- •Вопросы для контроля
Алгоритмизация структурой цикла с постусловием
Словесная формулировка алгоритма:
-
Ввести исходные данные (одномерный массив стоимостей кладов и процент вознаграждения).
-
Присвоить параметру цикла i его начальное значение (i=1).
-
Выполнить тело цикла (рассчитать текущее значение функции для соответствующего значения аргумента пi = f(сi) и вывести их на печать).
-
Сформировать новое значение параметра цикла через предыдущее (i=i+1).
-
Проверить полученное значение параметра на соответствие диапазону изменения (
):
-
если i соответствует диапазону (
), передать управление на п. 3;
-
если i не соответствует диапазону (i>7), прекратить вычисления в цикле.
Графическое изображение алгоритма выполнено на рис. 5.9.
Алгоритмизация структурой цикла с параметром
Словесная формулировка алгоритма:
-
Ввести исходные данные (одномерный массив стоимостей кладов и процент вознаграждения).
-
Сформировать заголовок цикла:
-
Присвоить параметру цикла i начальное значение (i=1).
-
Проверить полученное значение параметра на соответствие диапазону изменения (
):
-
если i соответствует диапазону, выполнить тело цикла (рассчитать текущее значение функции для соответствующего значения аргумента пi = f(сi) и вывести их на печать), сформировать новое значение параметра цикла через предыдущее (i=i+1) и передать управление на п. 2.2;
-
если i не соответствует диапазону (i>7), прекратить вычисления.
Графическое изображение представлено на рис. 5.10.
Анализ рассмотренных способов построения цикла показывает, что с точки зрения компактности записи наиболее удобен цикл с параметром, предписывающий универсальный вариант формирования его значений в заголовке цикла.
Программирование задачи
В Си/Си++, как в математике, можно оперировать с массивами в целом и с их элементами. При этом в зависимости от типов составляющих массив элементов в языке Си/Си++ существуют понятия массива и структуры.
Массив в Си/Си++ – совокупность элементов одного типа.
Структура в Си/Си++ – совокупность разнотипных элементов.
Поэтому программирование задачи начинается с определения принадлежности используемых данных к массиву или структуре. В большинстве случаев элементы приводятся к одному типу, что позволяет объединить их в языке Си/Си++ понятием массив. Обязательными условиями работы с массивом или его элементами (элементом) являются:
-
описание массива;
-
обозначение элементов.
-
Описание массивов в Си/Си++
Любая информация в ЭВМ хранится в ячейках оперативной памяти. Поэтому предполагаемая работа с массивом требует предварительного выделения памяти для его хранения. Это действие выполняет описание массива.
Описание массива предписывает резервирование в оперативной памяти ЭВМ необходимого количества последовательно расположенных ячеек для хранения его элементов. Число ячеек выделяемого участка должно соответствовать количеству элементов массива. Желательно предусматривать увеличенный размер массива (по отношению к реально заданному). При этом возможные изменения условия задачи не потребуют модификации описания.
Например, для реально заданного массива X(7) возможно в описании указывать X(7), X(10), X(15), что позволит во втором и третьем вариантах использовать программу для работы с массивом X на 10 и 15 элементов соответственно.
Аналогично выбираются размеры массивов, численные значения которых конкретно не определены.
Например, для массива Y(m) в соответствии с логикой задачи необходимо определить максимально возможное значение m (50, или 100, или 150) и использовать его в описании.
Описание обязательно для всех используемых в задаче массивов. Описание массивов производится в начале программы (функции) аналогично простым переменным. При этом используются отдельные операторы описания или в списках уже существующих (наряду с именами переменных) указываются имена и размеры каждого из массивов.
Структура отдельного оператора описания одномерного массива:
описатель имя[размер];
где описатель – ключевое слово, определяющее тип элементов массива;
имя – идентификатор массива (формируется аналогично имени переменной);
размер – целая константа, определяющая количество элементов массива;
[ ] – ограничители размера массива.
Так, описатель одномерного массива целочисленных элементов с именем D размером 16 элементов имеет вид:
int d[16]; или увеличено int d[20];
Одномерный массив А в 30 вещественных элементов описывается:
float a[30];
Одномерный вещественный массив Y(m) может быть описан:
float y[50]; или float y[100]; или float y[150];
Совместное описание вещественных переменных x, y, z, а также одномерных массивов T(120) и S(70) может иметь вид:
float x, y, z, t[120], s[70]; или float y, t[120], x, s[70], z;
т.е. порядок расположения элементов в описателе может быть любым.
-
Обозначение элементов массива в Си/Си++
Описание массива позволяет использовать в программе любой из его элементов. Для обозначения элементов массива в Си/Си++ используются индексированные переменные.
Индексированная переменная (индексное выражение) – обозначение ячейки для хранения элемента массива. Именуется указанием идентификатора массива и индекса (индексов) элемента.
-
Внимание! Особенность обозначения элементов массива в Си/Си++ - нумерация индексов от 0, а не от 1. Поэтому индексы в Си/Си++ на единицу меньше заданных математически. Это обстоятельство должно учитываться в программе, особенно при формировании условия повторения (выхода из) цикла.
Схема распределения памяти для хранения одномерного массива такова:
|
индекс 0 |
индекс 1 |
индекс 2 |
|
|
|
индекс i-1 |
|
|
|
индекс n-2 |
индекс n-1 |
|
|
1-й элемент |
2-й элемент |
3-й элемент |
.. |
.. |
.. |
i-й элемент |
.. |
.. |
.. |
n-1-й элемент |
n-й элемент |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Длина ячейки для хранения каждого элемента определяется типом массива:
-
символьный – 1 байт;
-
целочисленный – 2 байта;
-
вещественный – 4 байта;
-
двойной точности – 8 байт.
Структура обозначения индексированной переменной одномерного массива:
имя[индекс]
, где имя – идентификатор массива;
индекс – операнд целого типа, определяющий номер элемента в ряду других, составляющих массив;
[ ] – ограничители индекса.
Так, в описанном ранее массиве D(16) первый элемент обозначается индексным выражением d[0], второй – d[1], текущий – d[i], предпоследний – d[14] и последний – d[15].
При необходимости, индекс может задаваться арифметическим выражением. Например, d[i+2] или d[j*5+3]. В любом случае на момент использования переменной индекс должен быть определен (рассчитан) и полученное значение должно укладываться в заданный описателем диапазон.
Рассмотренный пример идентификации элементов массива D применим к любому из описанных одномерных массивов.
Индексированные переменные позволяют осуществить программную реализацию алгоритмов с использованием элементов массивов. При этом для одномерного массива индексированная переменная позволяет определить конкретный адрес каждого элемента.
Адрес любой переменной определяется операцией &. Следовательно, у элемента d[0] адрес – &d[0], у d[i] – &d[i], т.е. все элементы массива располагаются в оперативной памяти линейно, начиная с адреса &d[0].
В языке Си/Си++ идентификатор одномерного массива однозначно определяет адрес его первого элемента. Например, c &c[0], d &d[0].
Адрес каждого элемента одномерного массива выражается зависимостью
имя+индекс
где индекс определяет сдвиг элемента относительно первого на указанное им количество элементов.
Так, адрес i-го элемента массива С (&c[i]) вычисляется как c + i.
Таким образом, индексное выражение полностью определяет конкретную ячейку хранения соответствующего элемента.
С учетом изложенного выполним программирование задачи 5.2.