Процедуры и функции. Блочная структура программы. Параметры. Блочно-структурированные языки программирования
Как было отмечено выше, тело функции может быть блоком или составным оператором . Блок как совокупность описаний объектов и операторов может включать вложенные блоки, и тогда появляются внешние и локальные переменные по отношению к блоку, а также глобальные переменные, описанные вне функций программы.
В дополнение к атрибутам имени и типа объекта существует ещё два атрибута – область действия и время жизни , определяемые классом хранения (памяти) по умолчанию или задаваемые программистом. Область действия (видимости) – это часть текста программы, в котором видим и может быть использован данный объект. Переменные, описываемые в охватывающем блоке, являются внешними для вложенных блоков и включают их в область своего действия за одним исключением – внутренняя переменная имеет приоритет над одноимённой внешней переменной, закрывая её, и даже тип внутренней переменной может быть переопределён.
Время жизни – это интервал времени, в течение которого значение объекта (переменной или функции) доступно для использования в некоторой части программы. Время жизни переменной может быть локальным или глобальным . Объект, с глобальным временем жизни, имеет распределённую для него память и определённое значение на протяжении всего времени выполнения программы. Для локального объекта выделяется новая область памяти при каждом входе в блок и освобождается при выходе из блока, при этом значение объекта теряется . Переменные, описанные в функции, в том числе формальные параметры имеют локальную область действия. Сами функции в программе являются внешними по отношению друг к другу и имеют глобальное время жизни, то есть существуют на протяжении всего времени выполнения программы.
Си-программа является отдельным программным модулем, который оформляется и записывается во внешнюю память как исходный файл с расширением “.c”, например, myprog.c.
Структуру модуля программы и области действия её объектов можно представить следующей схемой:
/* Глобальные объекты и описания */ /* Область действия */
Директивы предпроцессора глобальная макроопределения
прототипы функций
описания типов
описания глобальных переменных
заголовок функции локальная
{внешние переменные блока;
операторы;
{ внутренний блок локальная
описания других функций
/* конец программы */
Пример. Применение вложенных блоков с одноимёнными переменными.
Программа :
{ int i=2; /* i – переменная внешнего блока */
int count=0; /* count – внешняя переменная */
while (count <= i) /* цикл внешнего блока */
{ int=0; /* i – локальная переменная внутреннего блока */
count++; /* счётчик циклов */
printf (“В цикле: count=%d; i=%d\n”, count, i);
/* конец внутреннего блока, возврат к переменной i внешнего блока */
printf (“Вне цикла: count=%d, i=%d”, count, i);
Результат программы :
В цикле count=1 i=0
В цикле count=2 i=0
В цикле count=3 i=0
Вне цикла count=3 i=2
Программист может явно задать атрибуты области действия и времени жизни с помощью спецификаторов классов памяти (хранения): для переменных (auto – локальный, register – регистровый, static – статический, extern – внешний) и для функций (static, extern).
Переменные с классом хранения auto (принимается по умолчанию) и register относятся к локальным в блоке и по области действия и по времени жизни. Для переменных с классом auto выделяется память в стеке (временная память), а с классом register – в одном из свободных регистров процессора.
Память для переменных с классом static отводится в сегменте данных (статическая память программы), а не в стеке, благодаря чему они сохраняют своё значение при выходе из блока. Если отсутствует явная инициализация таких переменных, то по умолчанию они устанавливаются в 0. Инициализация выполняется один раз и не повторяется при новом входе в блок. Объекты класса static имеют локальную область действия (блок) и глобальное время жизни (время выполнения программы).
Пример . Использование статических переменных.
Программа :
void example (int c); /* прототип функции */
void main () /* главная функция */
{ int count; /* локальная переменная блока */
for (count=9; count >= 5; count -= 2) /* цикл счетчика */
example (count); /* вызов функции */
void example (int c) /* заголовок функции */
{ int f=1; /* локальная переменная */
static int stat=1; /* статическая переменная */
printf (“c=%d, f=%d, stat=%d\n”, c, f ,stat);
stat++; /* изменение статической переменной */
Результаты программы : c=9, f=1, stat=1
c=7, f=1, stat=2
Модульная структура программы
Чтобы упростить приложение, повысить его надежность и эффективность применяется модульный подход. Разбиение на модули позволяет разбить задачу на более мелкие функциональные блоки, облегчая этим разработку. Применяя такой подход к разработке системы, можно легко расширять функциональные возможности отдельных модулей, не затрагивая при этом исходный код прочих. Для уменьшения сложности программного обеспечения, необходимо сделать модули небольшими и более независимые. Чтобы сделать модули более независимыми можно применить два метода:
Усиление внутренних связей модулей;
Ослабление взаимосвязи между модулями.
Данная структура используется для обеспечения функциональной независимости модулей программы, т.е. максимального разделения функции модулей. Благодаря этому повышается внутренняя связность модулей и ослабляется их внешнее сцепление.
Модули программы обладают сильной внутренней связностью, так как содержат методы, обрабатывающие определенный набор данных, и имеют своё функциональное назначение.
Модульная структура библиотеки представлена в приложении Д на рисунке Д.1, визуализатора на рисунке Д.2.
Тестирование
Из всех этапов отладки программного обеспечения тестирование является самым трудоемким и дорогим. При создании типичного программного обеспечения на тестирование приходится около 40% общего времени и более 40% общей стоимости программного обеспечения.
Тестирование нужно, чтобы повысить надежность программного обеспечения, иначе в нем нет необходимости. Повысит надежность можно, устранив ошибки. Поэтому тестирование для доказательства корректности программы лишено смысла. Тестированием можно выявить ошибки, исправить их и, таким образом, повысить надежность программного обеспечения.
В ходе реализации проекта каждый класс подвергался тщательному тестированию, при выполнении которого осуществлялись формальный анализ текста программы, позволяющий выявлять большое количество ошибок на ранних стадиях программирования, и проверка корректности работы программы с использованием определенных тестовых наборов данных. При этом контролировалась каждая комбинация исходных данных, а также соответствие результатов для каждого исходного набора данных требуемому результату.
Документирование
Техническое задание
Для многих проектов требуется использовать ландшафты. Данный программный комплекс позволяет генерировать трехмерный ландшафт и показывает его на экране монитора.
6.1.1 Назначение разработки
Программный комплекс предназначен для генерации и отображения ландшафтов.
6.1.2 Требования к программе или программному изделию
Для пользователя приложение должно предоставлять следующие возможности:
1) возможность введения входных данных, таких как минимальная и максимальная высота, размеры карты, крутизны гор;
2) генерация ландшафтов;
3) сохранение ландшафта для использования его в сторонних программах;
4) демонстрация получившегося результата, путем вывода картинки на экран.
6.1.3 Требования к надежности
В программном комплексе должна присутствовать проверка входной информации на соответствие типов, принадлежность диапазону допустимых значений и соответствие структурной корректности, кроме того визуализатор перед запуском должен проверить оборудования на соответствие к требуемым техническим и программным средствам. В случае возникновения ошибок предусмотреть возможность вывода информативных диагностических сообщений.
6.1.4 Требования к составу и параметрам технических средств
Для минимального функционирования программы требуется: персональный компьютер, 2 ГБ оперативной памяти, 50 Мб свободного места на жестком диске; клавиатура, мышь.
Для оптимальной работы приложения необходимо оперативной памяти не менее 3ГБ оперативной памяти.
6.1.5 Требования к информационной и программной совместимости
Программа должна функционировать под управлением ОС семейства Windows 7 и выше; DirectX 11; Visual c++2015; .Net Framework 4.5 и выше.
6.1.6 Требования к программной документации
Документация к программе должна содержать руководство пользователя, документации по работе с библиотекой.
Руководство пользователя
Запуск программы производится запуском файла shell.exe, после запуска вы увидите окно, представленное на рисунке 6.1.
Вызвать меню «файл», можно с помощью кнопки «очистить» сбросить данные до стандартных значений. С помощью кнопки «Сохранить как bmp» сохранить карту высот в формате bmp. С помощью кнопки «Сохранить как obj» можно сохранить ландшафт в формате obj. Нажав на кнопку «Просмотр» запуститься визуализатор, в котором можно будет увидеть в трехмерном виде, представлен на рисунке 6.2.
Рисунок 6.1 - Окно программы
Рисунок 6.2 - Окно программы
Вызвать меню «настройки», можно с помощью кнопки «настройки программы» настроить программу для визуализации. С помощью кнопки «настройки визуализации» можно настроить визуализатор.
Движение в визуализаторе осуществляется кнопками на клавиатуре w, a, s, d, которые соответствуют направлениям вперед, влево, вправо, назад.
Управление камерой осуществляется мышкой.
Документация по работе с библиотекой
Для работой с библиотекой необходимо подключить файл LandscapeGenerator.dll к вашему проекту. В проекте необходимо объявить экземпляр класса LandscapeGenerator. Класс содержит следующие методы для изменения параметров ландшафта, такие как ширина, длина, минимальная и максимальная высота, гористость, генерации ландшафта, возврат ландшафта как bitmap, сохранение ландшафта в формате obj и bmp.
Раньше на просторах Интернета был широко распространён табличный тип вёрстки, которому посвящена . Однако со временем этот подход к созданию структуры сайта устарел, и на смену ему пришла блочная вёрстка.
Отличия блочной вёрстки от табличной
Если табличная вёрстка подразумевает, что содержимое страницы находятся внутри тега Блочная вёрстка лишена недостатков табличной - поисковыми системами она индексируется лучше, её код не такой развесистый, да и блоки Единственный ощутимый минус блочной вёрстки - сделанные на ней сайты могут по-разному отображаться в обозревателях. Чтобы этого избежать, нужно делать вёрстку «кроссбраузерной», то есть одинаково отображаемой любым обозревателем. В графическом редакторе создаётся макет сайта: размечается, где какая область страницы (шапка, низ, боковая панель, основной контент) будет находиться и сколько места занимать, готовятся картинки, фоны. Каждая часть страницы помещается в свой блок Конечный HTML-документ представляет собой набор блоков
, то концепция блочной вёрстки основана на активном использовании универсальных тегов
- это таблица, которую нужно использовать для отображения табличных данных и не более того.
Суть блочной вёрстки