- •1. Основные этапы разработки программных продуктов
- •1.1 Постановка задачи
- •Словесная формулировка
- •Формульная постановка задачи
- •1.2 Создание программного продукта
- •1.2.1.Формирование математической модели
- •Формирование исходных данных
- •Составление расчётных зависимостей
- •Правила формирования математической модели.
- •1.2.2.Алгоритмизация задачи
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •1.2.3. Реализация программного продукта
- •1.2.4. Работа с результатами
- •1.2.5.Анализ результатов решения
- •1.2.6.Принятие решения
- •1.2.7.Составление технической документации
- •1.3.Полная обработки задачи пользователя
- •1.4.Обеспечение эффективности разработки программных продуктов
- •2.5 Идентификаторы
- •2.6 Описание операций
- •2.6.1 Унарные операции
- •2.6.2 Бинарные операции
- •2.6.3 Пунктуаторы
- •Программирование простых ветвлений
- •4.1.5. Программирование задачи
- •Правила составления и использования
- •4.1.5.2. Операторы условной передачи управления
- •Укороченный оператор условного перехода
- •Правила записи и выполнения
- •Условная операция
- •Технология программирования арифметических циклов
- •Циклы с аналитическим заданием аргумента
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма
- •Оператор цикла с предусловием
- •Правила записи и выполнения
- •Оператор цикла с постусловием
- •Правила записи и выполнения
- •Оператор пошагового цикла for
- •Правила записи и выполнения
- •Программа по алгоритму цикла с предусловием
- •Программа по алгоритму цикла с постусловием
- •Программа по алгоритму цикла с параметром
- •Циклы с табличным заданием аргумента
- •Описание массивов
- •Описатель имя[размер];
- •Обозначение элементов массива
- •Имя[индекс]
- •Описатель имя[разм_1] …[разм_i]… [разм_n];
- •Постановка задачи
- •Математическая формулировка
- •Выбор метода решения
- •Составление алгоритма решения
- •Алгоритмизация структурой цикла с предусловием
- •Алгоритмизация структурой цикла с постусловием
- •Алгоритмизация структурой цикла с параметром
- •Программирование задачи
- •Описание массивов
- •Обозначение элементов массива
- •Составление программ решения задачи
- •Улучшение качества программных продуктов
- •Организация ввода-вывода Использование укороченных спецификаторов
- •Ввод переменных
- •Вывод переменных
- •Организация ввода в диалоге
- •Варианты ввода массивов
- •Оформление выводимых величин
- •Управление выполнением программ Использование составных присваиваний
- •Выбор устройства вывода
- •Повторение расчётов
- •Приостановка вывода
- •Очистка экрана
- •Позиционирование курсора
- •Пример улучшения качества
- •Программирование с использованием подпрограмм
- •Имя (фактические параметры)
- •Подпрограмма с одним результатом
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Подпрограмма с аргументом – одномерным массивом
- •Постановка задачи примера
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Подпрограмма с несколькими результатами
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Подпрограмма с результатом – массивом
- •Постановка задачи
- •Математическая формулировка
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Обработка текстовой информации в Си Символьные строки
- •Определение значения символьной строки
- •Массивы строк
- •Ввод строки
- •Выделение памяти
- •Функции ввода символьной строки
- •Функция ввода символьной строки gets( )
- •Функция ввода символьной строки scanf( )
- •Преобразование символьных строк
- •Функцияatoi( )
- •Функцияatol( )
- •Функцииatof( ) иatold( )
- •Методика ввода числовых данных с использованием функцииgets( )
- •Вывод строки
- •Вывод строки функциями printf( ) и fprintf( )
- •Вывод строки функциямиputs( ) и fputs( )
- •Перевод чисел в формат символьной строки
- •Обработка символьных строк
- •Определение длины строки
- •Объединение строк
- •Копирование строк
- •Сравнение строк
- •Функции по работе с датой и временем.
- •Структуры.
- •Работа с дисками.
- •Ввод-вывод потока.
- •Открытие потока.
- •Объектно−ориентированное программирование
- •Классы ObjectWindows
- •Приложение коды клавиш
- •Краткий справочник по Си
- •Оператор вывода на принтер
- •Структура оператора
- •Структура оператора
- •Структура оператора
- •Библиографический список
Подпрограмма с одним результатом
Этот вариант подпрограммы (дополнительной функции) применяют, когда в дополнительный алгоритм выносится участок вычислений, содержащий одну (несколько) формулу с одним конечным результатом. Результат возвращается в вызывающую функцию посредством оператора return. Рассмотрим программирование задачи на конкретном примере 6.1.
Постановка задачи
Вычислить значение функции:
z = ln a + n! - m! + ( k - m )! - 0.2 a
если a=16.9; n=5; m=4; k=10.
Формирование математической модели
Ввиду того, что общая математическая формулировка выполнена в постановке задачи, дополним её развёрнутыми формулами вычисления факториалов:
;
;
.
Выбор метода решения
В качестве метода решения желательно выбрать вычислительный процесс с использованием подпрограммы, так как в примере требуется трижды вычислять значение факториала отдельно для фактического параметра n или m или (k-m). Вынесенный в дополнительный алгоритм (функцию) участок вычислений обозначим fakt, а используемый в нём аргумент (формальный параметр) назовёмf. Известно, что вычисление значенияосуществляется в цикле по методике накопления произведения.
Следовательно, рациональное решение задачи возможно с использованием одного дополнительного алгоритма с формальным параметром f. Численные значения ему будут переданы из основного алгоритма как фактические параметры n, m, k-m обращениями fakt(n), fakt(m), fakt(k-m).
Составление алгоритма решения
Выбранный метод решения с использованием одной подпрограммы реализуется в виде отдельных алгоритмов – основного и дополнительного.
Как правило, при использовании подпрограмм с одним искомым результатом, вызов дополнительной функции (функций) производится из арифметических (логических) выражений, где этот результат используется. Следовательно, обращения к дополнительному алгоритму выполним из основного блока головного алгоритма (рис. 6.3).
Начальный блок дополнительного алгоритма определяет название алгоритма и используемый формальный параметр.
В дополнительном алгоритме наряду с формальным параметром fиспользуются локальные (местные) переменныеfiи i. Первая обозначает вычисляемое в цикле значение факториала, а вторая является текущим значением последнего сомножителя. В конечном блоке указан возвращаемый операнд (переменнаяfi).
Рис. 6.3. Схема алгоритма примера 6.1
Программирование задачи
Программирование задачи требует использования двух пользовательских функций:
головной – для реализации требований основного алгоритма;
дополнительной – для выполнения требований вспомогательного алгоритма.
При этом в головной функции требуется организовать обращение к дополнительной (подпрограмме). Необходимо создать прототип (описание) дополнительной функции и разместить его над головной.
Каждая из функций Си представляется одной из упрощенных структур
[тип]
имя([b1,
. . . ,bi,. . .,bn]) [описатели
bi] { тело функции [return
[РВ];] }
{
тело
функции
[return [РВ];]
}
где имя– идентификатор (название) функции;
тип– описатель типа функции (результата);
bi– список (перечисление через запятую) формальных параметров, используемых в вычислениях (действиях) тела функции с указанием типа каждого;
описатели bi– операторы описания типов формальных параметров, выполненные вне заголовка;
( ) – ограничители списка формальных параметров;
тело функции – основная часть (совокупность операторов), реализующая вынесенные в отдельный алгоритм вычисления (действия);
return РВ;– оператор возврата (return) результата вычислений;
РВ – результат вычислений (выражение);
[ ] – признак необязательности содержимого;
{ } – ограничители тела функции.
Первая строка структуры является заголовком функции.
Структура вызова функции:
имя ([a1, . . . , ai, . . . , an])
где имя– идентификатор функции;
a1, ai, an– список (перечисление через запятую) фактических параметров (аргументов), численные значения которых требуется передать в дополнительную функцию (подпрограмму);
( ) – ограничители аргументов;
[ ] – признак необязательности содержимого.
Правила записи и использования
1. Различия структур определения функций обусловлено возможностью использования различных средств машинной обработки создаваемых программ. Большинство средств поддерживают оба варианта.
2. Деление функций на главную и дополнительные осуществляется по имени. Главной является функция с именем main(головная). В этой функции в большинстве случаев описатель типа, список формальных параметров и операторreturnне указываются.
3. Дополнительной считается функция с любым, кроме main, именем. Для пользовательских функций имена формируются самим пользователем аналогично идентификаторам переменных. Для стандартных – указываются в технической документации.
4. Функция предписывает выполнение указанных в теле вычислений (действий) с операндами – формальными параметрами, идентификаторы которых указаны в списке заголовка.
5. В качестве формальных параметров используются переменные и указатели.
6. Физически формальные параметры (переменные) – дополнительные ячейки памяти, предназначенные для временного хранения, передаваемых им значений фактических параметров.
7. Количество, типы и последовательность расположения формальных параметров в списке задается создателем функции.
8. В функции наряду с формальными параметрами могут использоваться вспомогательные (локальные) переменные.
9. Для возврата результата вычисления тела функции дополняются выражением оператора return. В качестве выражения могут использоваться константы, переменные и их совокупности. Результаты вычислений тела функции – константы.
10. В основную (вызывающую) функцию передается значение только одной константы – результата вычисления выражения return. Поэтому, если все планируемые в алгоритме вычисления могут быть сведены к одной формуле, их можно оформить в качестве выраженияreturn.
11. Тип возвращаемого значения определяется типом функции. Если он не указан, подразумевается целочисленный результат (int). Результат возвращается в точку вызова.
12. В функции при необходимости могут быть несколько операторов возврата (return), располагаемых в теле функции в соответствии с требованиями алгоритма.
13. В головной функции оператор returnможно не указывать (результат не требуется возвращать куда-либо). В этом случае на этапе компиляции может выдаваться соответствующее предупреждение.
14. Головная и дополнительные функции – есть отдельные программные модули. Поэтому в них могут использоваться одноимённые переменные, указатели и массивы.
15. Тексты (определения) дополнительных пользовательских функций могут располагаться в любом месте программы (вне тела любой из функций), стандартных – в соответствующих библиотеках языка Си в виде объектных модулей.
16. Независимо от взаиморасположения функций выполнение программного модуля начинается с головной функции.
17. Из тела каждой функции можно обращаться к любой другой, а также и к ней самой.
18. Фактические и формальные параметры в списках должны совпадать по количеству, месту расположения и типу.
19. В качестве фактических параметров используются константы, переменные, вызовы дополнительных функций, арифметические выражения, адреса переменных и массивов.
20. Вызов дополнительной функции требует ее предварительного определения (расположение над вызывающей). В противном случае её необходимо описать (задать прототипом). Описание размещается над вызывающей функцией. Описания стандартных функций (их прототипы) находятся в стандартных заголовочных файлах.
Прототип является конструкцией, аналогичной описателям переменных, что позволяет проверить указанные в вызове типы фактических параметров и возвращаемого результата на соответствие указанным в заголовке функции.
Прототипфункции аналогичен ее заголовку и имеет структуру
[тип] имя([тип [b1], . . . ,тип [bi], . . . ,тип [bn]]);
где имя– идентификатор (название) функции;
тип– описатель типа функции (результата);
b1, bi, bn– список (перечисление через запятую) формальных параметров с указанием типа;
( ) – ограничители списка формальных параметров;
[ ] – признак необязательности содержимого;
; – признак оператора.
В списке допускается указывать только типы формальных параметров.
Рассмотрим конкретные примеры определения, вызова, и описания функций.
Пример взаимодействия головной функции с одной пользовательской и стандартными
Вариант 1.
#include<stdio.h> /*stdio.h- файл с прототипами функций ввода-вывода */
#include<math.h> /*math.h- файл с прототипами математических функций */
floatsum(floata,floatb); /* прототип пользовательской функции */
main( ) /* заголовок головной функции */
{
floata,b,c,d,d1; /* описатели локальных переменных */
. . .
c=pow(a, 2 ) +b; /* вычисление с вызовом
стандартной функции pow*/
d=sum(a,b) - 0.5*c; /* вычисления с вызовами поль- */
d1 =d+sum( 3.6,sqrt(d) ); /* зовательской функцииsum*/
. . .
printf(“%f%f%f”,c,d,d1); /* вызов стандартной функцииprintf*/
}
/* определение пользовательской функции sum*/
floatsum(floats1,floats2 ) /* заголовок дополнительной функции */
{
floats; /* описание локальной переменнойs*/
s=s1 +s2; /* вычислениеsпо формальным параметрамs1 иs2 */
returns; /* возвращение значенияsв вызывающую функцию */
}
В представленном фрагменте до определения главной функции, путем подключения заголовочных файлов, выполнены описания стандартных функций (математических и ввода-вывода) и пользовательской функции sum– указанием её прототипа. Главная функция расположена над дополнительной и не содержит в заголовке описатель типа и список формальных параметров. Дополнительная функция предназначена для вычисления суммы двух операндов (формальных параметров) и выполнена по первому варианту структуры. Заголовок определяет тип возвращаемого значения (float), название функции (sum) и список формальных параметров – вещественных переменныхs1 иs2. Порядок их расположения в списке задан произвольно. Искомая переменнаяs(локальная) рассчитывается в теле функции и указана в оператореreturnкак возвращаемое значение. Из тела главной функции выполняются обращения к стандартным функциям:sqrt– с одним фактическим параметром (d),pow– с двумя (a, 2) иprintf– с четырьмя (“%f%f%f”,c,d,d1). В арифметическом выражении вычисления переменнойdв качестве первого операнда используется вызов пользовательской функцииsumс указанием фактических параметров –aиb, описанных в головной функции как локальные переменные. Типы (вещественные) и последовательность расположения в списке определяются аналогичными формальным параметрам (s1 иs2) заголовка вызываемой функцииsum.
В арифметическом выражении вычисления переменной d1 в качестве второго операнда используется вызов пользовательской функцииsumс указанием фактических параметров – 3.6 иsqrt(d). Типы операндов (вещественные) и последовательность расположения в списке определяются аналогичными формальным параметрам (s1 иs2) заголовка вызываемой функцииsum.
Выполнение программного модуля (аналогично работе со стандартными функциями) приведет к двукратной автоматической передаче численных значений фактических параметров (a,b), а затем (3.6,sqrt(d)) из головной функции в вызываемую пользовательскую (sum) формальным параметрам (s1,s2). После выполнения вычислений тела функции результат (s) автоматически возвратится в точки вызова как операнды вычисления переменныхdиd1. Время существования переменныхs1,s2 иsсоответствует длительности работы функцииsum.
Вариант 2.
#include<stdio.h> /*stdio.h- файл с прототипами функций ввода-вывода */
#include<math.h> /*math.h- файл с прототипами математических функций */
/* определение пользовательской функции sum*/
floatsum(s1,s2 ) /* заголовок дополнительной функции */
floats1,s2;
{returns2+s1; /*возвращение значенияsв вызывающую функцию */
}
main( ) /* заголовок головной функции */
{ floata,b,c,d,d1; /* описатели локальных переменных */
. . .
c=pow(a, 2 ) +b; /* вычисление с вызовом
стандартной функции pow*/
d=sum(a,b) - 0.5*c; /* вычисления с вызовами поль- */
d1 =d+sum( 3.6,sqrt(d) ); /* зовательской функцииsum*/
. . .
printf(“%f%f%f”,c,d,d1); /* вызов стандартной функцииprintf*/
}
Дополнительная функция составлена с использованием второго варианта структуры. Тело дополнительной функции составляет один оператор return.
Расположение дополнительной функции над основной с описанием типов формальных параметров вне заголовка подпрограммы при машинной обработке приводит к выдаче предупреждений о невозможности проконтролировать типы по заголовку функции, что может повлиять на результаты счета. Устранение возможных последствий выполняется стандартным способом – указанием прототипа дополнительной функции над главной. При составлении дополнительной функции по первому варианту структуры и размещении её над основной, прототип не требуется. В этом случае заголовок функции играет роль прототипа.
Рассмотренные структуры и правила их использования позволяют осуществить программирование задачи с факториалами, предварительно выполнив идентификацию переменных (табл. 6.1).
Таблица 6.1
Обозначение в алгоритме |
a |
z |
n |
m |
k |
f |
fi |
i |
Обозначение в программе |
a |
z |
n |
m |
k |
f |
fi |
i |
Программа решения примера 6.1
#include<stdio.h> /*stdio.h- файл с прототипами функций ввода-вывода */
#include<conio.h> /*conio.h- файл с прототипом функцийgetch( ),clrscr( )*/
#include<math.h> /*math.h- файл с прототипами математических функций*/
longfakt(intfi); /* прототип функции расчета факториала */
/* определение головной функции */
main( )
{ floata,z1,z2,z;
int n, m, k;
clrscr( );
printf("\nВведите значенияa,n,m,k: ");
scanf("%f%d%d%d", &a, &n, &m, &k);
z1 = log(a) + fakt(n);
z2 = fakt(m) + fakt( k-m );
z = z1 + z2 - 0.2*a;
fprintf(stdprn, "\n a=%.2f n=%d m=%d k=%d"
"\n z1=%.2f z2=%.2f"
"\n z=%.2f\n", a, n, m, k, z1, z2, z);
getch( );
}
/* определение функции расчета факториала */
long fakt(int f)
{int i;
long fi; /* описание переменной текущего значения факториала */
fprintf(stdprn, "\n\n f=%d", f);
for( fi=1, i=1 ; i<=f ; i++ ) /* заголовок цикла расчета факториала */
{fi=fi* i; /* расчет текущего значения факториала */
fprintf(stdprn, "\n %d %ld",i, fi); /* вывод текущего значения */
}
return fi; /* возврат в головную функцию значения переменной fi*/
}
16.9 5 4 10
В подпрограмме наряду с формальным параметром fиспользованы локальные переменныеfiиi. Первая из них определяет значение вычисляемого факториала, изменяясь от единицы до конечного значения. Вторая используется как параметр цикла для организации последовательного умножения в заданном диапазоне. Функцияfprintfпозволяет проверить правильность работы подпрограммы.