Алгоритмизация структурой цикла с предусловием
Словесная формулировка алгоритма:
Ввести исходные данные (одномерный массив стоимостей кладов и процент вознаграждения).
Присвоить параметру цикла i его начальное значение (i=1).
Проверить полученное значение параметра на соответствие диапазону изменения ( ):
· если i соответствует диапазону ( ):
выполнить тело цикла (рассчитать текущее значение функции для соответствующего значения аргумента пi=f(сi) и вывести их на печать);
сформировать новое значение параметра цикла через предыдущее (i=i+1);
передать управление на п. 3;
· если i не соответствует диапазону (i>7), прекратить вычисления в цикле.
Графическое изображение алгоритма приведено на рис. 5.8.
Алгоритмизация структурой цикла с постусловием
Словесная формулировка алгоритма:
Ввести исходные данные (одномерный массив стоимостей кладов и процент вознаграждения).
Присвоить параметру цикла 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.
Анализ рассмотренных способов построения цикла показывает, что с точки зрения компактности записи наиболее удобен цикл с параметром, предписывающий универсальный вариант формирования его значений в заголовке цикла.
Программирование задачи
В Си/Си++, как в математике, можно оперировать с массивами в целом и с их элементами. При этом в зависимости от типов составляющих массив элементов в языке Си/Си++ существуют понятия массива и структуры.
Массивв Си/Си++ – совокупность элементов одного типа.
Структура в Си/Си++– совокупность разнотипных элементов.
Поэтому программирование задачи начинается с определения принадлежности используемых данных к массиву или структуре. В большинстве случаев элементы приводятся к одному типу, что позволяет объединить их в языке Си/Си++ понятием массив. Обязательными условиями работы с массивом или его элементами (элементом) являются:
· описание массива;
· обозначение элементов.
5.2.1. Описание массивов в Си/Си++
Любая информация в ЭВМ хранится в ячейках оперативной памяти. Поэтому предполагаемая работа с массивом требует предварительного выделения памяти для его хранения. Это действие выполняет описание массива.
Описание массива предписывает резервирование в оперативной памяти ЭВМ необходимого количества последовательно расположенных ячеек для хранения его элементов. Число ячеек выделяемого участка должно соответствовать количеству элементов массива. Желательно предусматривать увеличенный размер массива (по отношению к реально заданному). При этом возможные изменения условия задачи не потребуют модификации описания.
Например, для реально заданного массива 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;
т.е. порядок расположения элементов в описателе может быть любым.
5.2.2. Обозначение элементов массива в Си/Си++
Описание массива позволяет использовать в программе любой из его элементов. Для обозначения элементов массива в Си/Си++ используются индексированные переменные.
Индексированная переменная (индексное выражение) – обозначение ячейки для хранения элемента массива. Именуется указанием идентификатора массива и индекса (индексов) элемента.
ü Внимание! Особенность обозначения элементов массива в Си/Си++ - нумерация индексов от 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.
Программирование задачи
Идентификация всех переменных алгоритмов: вещественной переменной про, целой i и двух вещественных массивов исходного С(7) и расчетного П(7). представлена в табл. 5.3.
Таблица 5.3
Обозначение в алгоритме | c1 | c2 | ... | c6 | c7 | про | пi | ci | i |
Обозначение в программе | c[0] | c[1] | ... | c[5] | c[6] | pro | p[i] | c[i] | i |
В соответствии с таблицей расположение элементов исходного массива в оперативной памяти представлено схемой:
c[0] | c[1] | c[2] | c[3] | c[4] | c[5] | c[6] | ||
c1 | c2 | c3 | c4 | c5 | c6 | c7 | ||
4 байта | 4 байта | 4 байта | 4 байта | 4 байта | 4 байта | 4 байта |
Для расчетного массива П(7) распределение оперативной памяти аналогично представленному для массива С.
Возможные варианты программ решения задачи с каждым из рассмотренных операторов цикла представлены ниже.
ü Внимание! Формирование начального значения параметра и логического выражения операторов цикла должно учитывать уменьшение индексов в Си/Си++ на единицу по отношению к указанным в алгоритме.
Программа по алгоритму цикла с предусловием
Вариант программы:
/*Задача 5.2. Программа цикла с предусловием. * /
/* Составил студент гр. А033 Трубников П.А.*/
#include <stdio.h> /* директивы */
#include <math.h> /* препроцессора */
main() /* заголовок основной функции */
{
float c[7], p[7], pro; /* описание вещественных массивов*/
/* и переменной */
int i; /* описание целой переменной */
scanf("%3f%4f%4f%4f%4f%4f%4f%4f",&pro,&c[0],&c[1],
&c[2],&c[3],&c[4],&c[5],&c[6]); /* ввод переменных */
printf(" pro=%8.2f\n\n", pro); /* вывод переменной pro */
i=0; /* формирование начального значения параметра цикла */
while( i < 7 ) /* заголовок цикла */
{
p[ i ]=(c[ i ]*pro)/100.;/*расчет текущего значения функции */
printf(" %8.2f %7.2f\n", c[ i ], p[ i ] );
i=i+1; /* закон изменения параметра цикла */
}
}
25.492.503.948.738.892.320.250. – значения вводимых данных.
Результаты решения представлены в приложении 5.4.
Программа по алгоритму цикла с постусловием
Вариант программы имеет вид:
/*Задача 5.2. Программа цикла с постусловием. * /
/* Составил студент гр. А033 Трубников П.А */
#include <stdio.h> /* директивы */
#include <math.h> /* препроцессора */
main() /* заголовок основной функции */
{
float c[7], p[7], pro; /* описание вещественных массивов*/
/* и переменной */
int i; /* описание целой переменной */
scanf("%3f%4f%4f%4f%4f%4f%4f%4f",&pro,&c[0],&c[1],
&c[2],&c[3],&c[4],&c[5],&c[6]); /* ввод переменных */
printf(" pro=%8.2f\n\n", pro); /* вывод переменной pro */
i=0; /*формирование начального значения параметра цикла */
do /* заголовок цикла */
{
p[ i ]=(c[ i ]*pro)/100.;/*расчет текущего значения функции*/
printf(" %8.2f %7.2f\n", c[ i ], p[ i ] );
i=i+1; /* закон изменения параметра цикла */
}while( i < 7 ); /* условие повторения цикла */
}
25.492.503.948.738.892.320.250. – значения вводимых данных.
Результаты решения представлены в приложении 5.5.
Программа по алгоритму цикла с параметром
Вариант программы имеет вид:
/*Задача 5.2. Программа пошагового цикла * /
/* Составил студент гр. А033 Трубников П.А */
#include <stdio.h> /* директивы */
#include <math.h> /* препроцессора */
#include <stdlib.h>
main() /* заголовок основной функции */
{
float c[7], p[7], pro; /* описание массивов и переменной */
int i; /* описание целой переменной */
scanf("%3f%4f%4f%4f%4f%4f%4f%4f",&pro,&c[0],&c[1],
&c[2],&c[3],&c[4],&c[5],&c[6]); /* ввод переменных */
printf(" pro=%8.2f\n\n", pro);/* вывод переменной pro */
for( i=0 ; i < 7 ; i=i+1 ) /* заголовок цикла */
{
p[i]=(c[i]*pro)/100.;/*расчет текущего значения функции*/
printf(" %8.2f %7.2f\n", c[ i ], p[ i ] );
}
}
25.492.503.948.738.892.320.250. – значения вводимых данных.
Результаты решения представлены в приложении 5.6.
Заключение
Циклический – процесс многократного повторения некоторого участка вычислений при изменении хотя бы одной из входящих в него величин. Цикл – повторяющийся участок вычисления.
Тело цикла – совокупность действий, осуществляемых в цикле. Параметр цикла – входная величина, изменяющая своё значение от цикла к циклу. Закон изменения параметра цикла – зависимость, связывающая текущее и предыдущее значения параметра цикла. Условие повторения цикла – зависимость, предписывающая повторение цикла либо выход из него.
Способ определения количества повторений – критерий деления циклических процессов на арифметические и итерационные.
Арифметический – циклический процесс, число повторений в котором может быть определено заранее, т.е. не зависит от результатов счёта в теле цикла.
Вид задания (изменения) параметра цикла определяет деление на циклы с аналитическим и табличным заданием аргумента.
Пути реализации циклических процессов – расположение точки проверки условия повторения (с предусловием, с постусловием, с параметром).
Программные средства – специфические операторы циклов.
Использование циклических процессов широко распространено. Эффективность программирования – наивысшая из всех типовых вычислительных процессов (многократное повторение основного расчетного участка).
Максимальная эффективность – использование в смешанных вычислительных процессах в комплексе с ветвлениями (поиск экстремумов, сортировка, операции над матрицами и т. п.).
Вопросы для контроля
Какой вычислительный процесс называется циклическим?
Что такое цикл, тело цикла, параметр цикла?
На какие виды подразделяются арифметические циклы?
Как графически обозначаются структуры циклов?
Какова структура оператора цикла с предусловием, как он выполняется?
В чем заключаются правила записи и выполнения оператора while?
Какова структура оператора цикла с постусловием, как он выполняется?
В чем заключаются правила записи и выполнения оператора do ... while?
Какова структура пошагового оператора цикла, как он выполняется?
Каковы правила записи и выполнения оператора for?
Как принудительно выйти из любого цикла?
Как выглядит табличное изменение аргумента?
Что такое массив, какими параметрами он характеризуется?
Что определяет размер массива?
Что является параметром цикла при табличном задании и почему?
Что такое описание массива и как оно выполняется?
Как обозначаются элементы массива в Си/Си++?
Как распределяется память для хранения одномерных массивов?