
- •Технология программирования линейных процессов
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Ключевые слова
- •Константы
- •Целые константы
- •Вещественные константы
- •Текстовые константы
- •Переменные
- •Правила записи и использования оператора
- •Функции. Вызовы функций
- •Арифметические выражения
- •Правила записи и вычисления арифметических выражений
- •Оператор присваивания
- •Правила составления и использования
- •Операторы ввода-вывода
- •Оператор ввода
- •Правила составления и выполнения оператора ввода
- •Оператор вывода на дисплей
- •Правила составления и выполнения оператора вывода
- •Оператор вывода в поток
- •Организация ввода-вывода переменных
- •Ввод переменных
- •Вывод переменных
- •Заголовок программы
- •Тело программы
- •Поэлементная структура простейшей программы
- •Предмашинная подготовка задачи определения площади круга
- •Постановка задачи
- •Создание математической модели задачи
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Заключение
- •Вопросы для контроля
Вывод переменных
При организации вывода руководствуются следующими положениями:
-
численные значения большинства выводимых переменных неизвестны (формируются при решении);
-
чтение результатов из сплошной строки (без пробелов) не удобно;
-
спецификатор каждой переменной жёстко определяет расположение выводимого численного значения. Для вещественных – относительно точки, для целых – от правого края поля;
-
если в дробной части выводимой переменной больше разрядов, чем запланировано в спецификаторе, лишние отбрасываются с возможным округлением выводимых значений в зависимости от величины отброшенного;
-
если число разрядов дробной части меньше, чем запланировано в спецификаторе, эти лишние разряды заполняются нулями;
-
если число разрядов целой переменной или целой части вещественной меньше, чем запланировано в спецификаторе, все оставшиеся свободными левые разряды заполняться не будут;
-
если число разрядов целой части выводимой переменной больше, чем отведённое для них поле в спецификаторе, целая часть выводится полностью, автоматически увеличивая поле вывода (сдвигая запланированное поле вправо).
Методика организации вывода:
-
уточнить список переменных конкретного блока «вывод» алгоритма;
-
определить тип каждой переменной и значение (известно, неизвестно);
-
задаться желаемой формой представления численного значения выводимой переменной;
-
сформировать (представить) шаблон вывода каждой переменной;
-
составить спецификатор вывода в соответствии с указаниями шаблона;
-
предусмотреть вид разделителей между выводимыми значениями (пробелы, названия переменных, печать в новой строке);
-
записать оператор вывода, расположив сформированные спецификаторы в управляющей строке (с учётом разделителей) в том же порядке, что и переменные в списке.
Рассмотрим варианты организации вывода введённых переменных.
Пример 3.3. Организовать вывод введённых переменных A=13,2 B= -6,8 I=70 PI=3,1416 (пример 3.1).
Первый вариант предусматривает организацию пробелов по общей методике – указанием заведомо больших полей при требуемой точности.
Последовательность подготовки к выводу представлена в табл. 3.11.
Таблица 3.11
Переменная |
Шаблон вывода |
Разделитель |
|||||||
Обозначение |
Тип |
Значение |
Длина |
Точность |
Форма представления |
Длина |
Точность |
Спецификатор |
|
a b i pi |
Вещ. Вещ. Цел. Вещ. |
13,2 -6,8 70 3,1416 |
4 4 2 6 |
1 1 – 4 |
f f d f |
7 7 7 10 |
2 2 – 4 |
%7.2f %7.2f %7d %10.4d |
Нет Нет Нет Нет |
Шаблон вывода можно представить следующим образом
_
_ _ _
_ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _
-
a
b
i
pi
Следовательно, фрагмент вывода, с учётом ранее составленных описателей будет иметь вид:
float a, b, pi; /* описатели */
int i; /* переменных */
. . .
printf(“%7.2f%7.2f%7d%10.4f”, a, b, i, pi ); /* оператор вывода */
Оператор printf предписывает вывод на экран значений переменных (a, b, i, pi) в указанном порядке, расположив их в одной строке следующим образом:
– – 13.00 – – -6.80 – – – – – 70 – – – – 3.1416
Второй вариант предусматривает организацию пробелов непосредственным указанием их перед спецификаторами в управляющей строке.
Последовательность подготовки к выводу имеет вид табл. 3.12.
Таблица 3.12
Переменная |
Шаблон вывода |
Разделитель |
|||||||
Обозначение |
Тип |
Значение |
Длина |
Точность |
Форма представления |
Длина |
Точность |
Спецификатор |
|
a b i pi |
Вещ. Вещ. Цел. Вещ. |
13,2 -6,8 70 3,1416 |
4 4 2 6 |
1 1 – 4 |
f f d f |
4 4 2 6 |
1 1 – 4 |
%4.1f %4.1f %2d %6.4f |
_ _ _ _ _ _ _ _ |
Шаблон вывода можно представить следующим образом
_
_ _ _
_ _ _ _ _
_ _ _ _ _ _ _ _
_ _ _ _
-
a
b
i
pi
Следовательно, оператор вывода с учётом ранее составленных описателей имеет вид:
printf(“_ _ %4.1f _ _ %4.1f _ _ %2d _ _ %6.4f ”, a, b, i, pi );
Оператор предписывает вывод на экран значений переменных (a, b, i, pi) в указанном порядке, расположив их в одной строке следующим образом:
– – 13.0– –-6.8– – 70– – 3.1416
Недостатком первого и второго вариантов является невозможность выяснить без обращения к программе, какое численное значение какой переменной соответствует.
Третий вариант позволяет выполнить поясняющие надписи в выводимой строке добавлением соответствующего текста в управляющую строку оператора вывода.
Подготовка к выводу имеет вид табл. 3.13.
Таблица 3.13
Переменная |
Шаблон вывода |
Разделитель |
|||||||
Обозначение |
Тип |
Значение |
Длина |
Точность |
Форма представления |
Длина |
Точность |
Спецификатор |
|
a b i pi |
Вещ. Вещ. Цел. Вещ. |
13,2 -6,8 70 3,1416 |
4 4 2 6 |
1 1 – 4 |
f f d f |
4 4 2 6 |
1 1 – 4 |
%4.1f %4.1f %2d %6.4f |
_ a= _ b= _ i= _ pi= |
Шаблон вывода можно представить следующим образом
_
а = _ _
_ _b = _ _
_ _i = _ _ _ pi = _
_ _ _ _
-
a
b
i
pi
Оператор вывода с учётом ранее составленных описателей имеет вид
printf(“_ a=%4.1f _ b=%4.1f _ i=%2d _ pi=%6.4f”, a, b, i, pi);
Оператор предписывает вывод на экран значений переменных (a, b, i, pi) в указанном порядке, расположив их в одной строке следующим образом:
– a=13.0 – b=-6.8 – i=70 – pi=3.1416
Рассмотрим варианты организации вывода результатов.
Результаты – переменные, численные значения которых на момент составления программы неизвестны (будут получены в процессе счёта).
Решение проблемы возможно использованием удлинённых полей вывода или формированием разделителей между ними. В первом случае число разрядов целой части выводимой переменной меньше, чем планируемое спецификатором, и оставшиеся свободными левые разряды заполняются пробелами. Во втором – начинает действовать правило об автоматическом выводе целой части переменных полностью и разделители не позволят им слиться (разграничат их).
Следовательно, при записи спецификаторов выводимых переменных требуется указывать заведомо большое поле вывода (длину) при планируемом числе разрядов дробной части (точности), либо предусмотреть печать пробелов между ними.
Пример 3.4. Организовать вывод промежуточных и конечных результатов (вещественных переменных) X, Y, Z.
Первый вариант – организация пробелов по общей методике: указанием заведомо больших полей при требуемой точности.
Подготовка к выводу имеет вид табл. 3.14.
Таблица 3.14
Переменная |
Шаблон вывода |
Разделитель |
|||||||
Обозначение |
Тип |
Значение |
Длина |
Точность |
Форма представления |
Длина |
Точность |
Спецификатор |
|
x y z |
Вещ. Вещ. Вещ. |
Не изв. Не изв. Не изв. |
– – – |
– – – |
f f f |
10 10 10 |
2 2 2 |
%10.2f %10.2f %10.2f |
Нет Нет Нет |
Шаблон вывода можно представить следующим образом
_
_ _ _ _ _ _
_ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _
_ _
-
x
y
z
Следовательно, оператор вывода:
printf(“%10.2f%10.2f%10.2f”, x, y, z);
если переменные в процессе счёта приняли значения x=265.38, y=1244.5, z=4.7 сформирует строку вида:
– – – – 265.38– – – 1244.50– – – – – – 4.70
В случае, если планируемая длина полей вывода меньше требуемой, произойдёт слияние выводимых значений. Например, выполнение оператора
printf(“%6.2f%6.2f%6.2f”, x, y, z);
(в качестве длины выбраны значения 6) сформирует строку вида
265.381244.50– – 4.70
В выводимой строке произошло слияние значений переменных x и y.
Второй вариант – организация пробелов непосредственным указанием их перед спецификаторами в управляющей строке.
Подготовка к выводу имеет вид табл. 3.15.
Таблица 3.15
Переменная |
Шаблон вывода |
Разделитель |
|||||||
Обозначение |
Тип |
Значение |
Длина |
Точность |
Форма представления |
Длина |
Точность |
Спецификатор |
|
x y z |
Вещ. Вещ. Вещ. |
Не изв. Не изв. Не изв. |
– – – |
– – – |
f f f |
6 6 6 |
2 2 2 |
%6.2f %6.2f %6.2f |
_ _ _ _ _ _ |
Шаблон вывода можно представить следующим образом
_
_ _ _ _
_ _ _ _ _ _ _
_ _ _ _ _ _ _
_ _
-
x
y
z
Оператор вывода примет вид:
printf(“_ _%6.2f _ _%6.2f _ _.%6.2f”, x, y, z);
и сформирует следующую выводимую строку:
– – 265.38– – 1244.50– – 4.70
-
Внимание! Поле для вывода переменной «y» автоматически увеличилось на один разряд в соответствии с правилами.
Недостатки первого и второго вариантов – невозможность выяснить без обращения к программе, какое численное значение какой переменной соответствует.
Третий вариант позволяет выполнить поясняющие надписи в выводимой строке добавлением соответствующего текста в управляющую строку оператора вывода.
Последовательность подготовки к выводу аналогична представленной в табл. 3.15 с указанием в последнем столбце надписей ( _ X= , _ Y= , _ Z=).
В этом варианте вывод переменных оператором:
printf(“_X=%6.2f _ Y=%6.2f _ Z=%6.2f”, x, y, z);
приведёт к индикации в текущей строке экрана информации:
– X=265.38 – Y=1244.50 – Z= – – 4.70
Особенность рассмотренных вариантов – распечатка переменных одной строкой.
Четвёртый вариант – вывод переменных в разных строках. При этом вывод численных значений X и Y выполним в экспоненциальной форме, увеличив точность представления мантиссы.
Подготовка к выводу имеет вид табл. 3.16.
Таблица 3.16
Переменная |
Шаблон вывода |
Разделитель |
|||||||
Обозна- чение |
Тип |
Значение |
Длина |
Точность |
Форма представ- ления |
Длина |
Точность |
Спецификатор |
|
x y z |
Вещ. Вещ. Вещ. |
Не изв. Не изв. Не изв. |
– – – |
– – – |
e e f |
9 9 6 |
4 4 2 |
%9.4e %9.4e %6.2f |
\nX= \nY= \nZ= |
Шаблон вывода можно представить следующим образом:
X = _ _ _ _ _ E _ _
Y = _ _ _ _ _ E _ _
Z = _ _ _ _ _
В этом варианте вывод переменных оператором:
printf(“\nX=%9.4e\nY=%9.4e\nZ=%6.2f”, x, y, z);
приведёт к индикации в текущих строках экрана информации:
X=2.6538E+2
Y=1.2445E+3
Z=– –4.70
-
Внимание! Предложенные методики вывода на экран (функцией printf) полностью справедливы для вывода в поток (функцией fprintf).
-
Структура Си/Си++-программы
Эффективность языка программирования в достаточной степени определяется хорошей его структурированностью. Для языка Си/Си++, в частности, структурированность обусловлена следующими требованиями к отдельным конструкциям и программе в целом:
-
использованием составных операторов наряду с простыми;
-
применением функций в качестве основной сборной конструкции;
-
оформлением максимума возможных расчетов и действий стандартными (системными) функциями;
-
формированием аналогичных по назначению системных функций в стандартные блоки (внешние файлы);
-
использованием специальной программы (препроцессора) для эффективного подключения стандартных файлов.
Сформулируем, исходя из изложенного, некоторые определения.
Составной оператор – совокупность нескольких простых операторов заключенная в фигурные скобки.
Составной оператор позволяет обозначить (оформить) выполнение конкретного раздела задачи в виде одного блока.
Внешний файл – отдельная поименованная совокупность дополнительных программных модулей, используемых (при необходимости) для создания программы.
По назначению внешние файлы делятся на библиотечные и заголовочные.
Библиотечные внешние файлы – хранилища текстов стандартных подпрограмм (например, вычисления трансцендентных функций), оформленных на языке конкретной ЭВМ.
Заголовочные внешние файлы – хранилища служебной информации, в частности, объявлений функций (структур, аналогичных их заголовкам).
Второе название обусловлено тем, что объявления функций (в частности стандартных) по структуре соответствуют заголовкам. Объявления позволяют определить основные элементы функции (наименование, типы формальных параметров и возвращаемого результата) записанной на языке Си/Си++.
Внешние, как любые файлы, хранятся на магнитных носителях (дисках).
Препроцессор – системная программа для предварительной (до компиляции) машинной обработки программного модуля пользователя.
Основное назначение препроцессора (в большинстве случаев) – включение текстов заголовочных внешних файлов.
Использование препроцессора позволяет облегчить написание Си/Си++-программ, делать их мобильными, легко читаемыми и удобными для отладки.
Исходя из изложенного, можно для языка Си/Си++ дать поясняющее определение программы.
Программа – алгоритм решения, оформленный в виде одной основной (главной) или нескольких функций, одна из которых является главной.
Физически любая Си/Си++-программа реализуется как исходный модуль, состоящий из заголовка программы и её тела, расположенных последовательно (рис. 3.10).
Рис. 3.10. Структура исходного модуля программы
Рассмотрим основные элементы программы.