Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовик ОП.doc
Скачиваний:
18
Добавлен:
10.02.2016
Размер:
228.35 Кб
Скачать

1.3. Принципы создания консольных многомодульных приложений

При разработке большой программы ее удобно разделить на составные части – подзадачи – и каждую часть поместить в отдельный файл. Подзадача может разрабатываться отдельной группой разработчиков. Набор файлов, образующих программу, называется проектом. Для каждого проекта создается специальный служебный файл – файл проекта, который хранит информацию об именах, типах, местонахождении файлов, содержащих части кода программы или данные. Эта информация используется при компиляции.

Файлы, входящие в проект, могут находиться в любых каталогах, однако удобнее хранить их все вместе в одном каталоге – каталоге проекта, который надо предварительно создать. Такой каталог создается автоматически, если при разработке используется среда Visual C++, однако во многих других средах создание каталога для хранения файлов проекта выполняет сам программист.

Большинство современных инструментальных сред для разработки программ на языке C/C++ поддерживают работу над проектом. Для каждого консольного приложения в Visual Studio C++ создается один файл проекта. В нем программистом добавляются файлы исходного кода и заголовочные файлы. Файл проекта генерируется при выборе пункта меню Файл/Создать/Проект (Ctrl+Shift+N). Также можно добавить существующий проект при помощи меню Файл/Добавить/Существующий проект.

Далее в новый проект добавляются файлы исходного кода с расширением .сpp. Выполнить это можно при помощи команды меню Файл/Создать/Файл /Файл С++ (.cpp) (Ctrl+Shift+A) либо на панели «Обозреватель решений» щелкнув правой кнопкой мыши по папке «Файлы исходного кода» и выбрав Добавить/Создать элемент/Файл С++ (.cpp) . Имя файла должно быть уникальным. Два файла с одним и тем же именем не могут использоваться одновременно в одном и том же проекте.

Модуль – функционально законченный фрагмент программы, оформленный в виде отдельного файла с исходным кодом, предназначенный для использования в других программах.

В языке программирования С, заголовочные файлы – основной способ подключить к программе типы данных, структуры, прототипы функций, перечислимые типы, и макросы, используемые в другом модуле. Имеет по умолчанию расширение .h. Чтобы избежать повторного включения одного и того же кода, используются директивы #ifndef, #define, #endif. Заголовочный файл в общем случае может содержать любые конструкции языка программирования, но на практике исполняемый код в заголовочные файлы не помещают. Например, идентификаторы, которые есть необходимость использовать более чем в одном файле, удобно описать в заголовочном файле, а затем его подключать по мере надобности. Также, по сложившейся традиции, в заголовочных файлах объявляют функции стандартной библиотеки С.

При создании программы из нескольких модулей следует соблюдать принцип независимой компиляции модулей. Этот принцип заключается в том, что при подготовке исполняемого файла сначала надо добиться компиляции каждого модуля независимо от других модулей. Отсутствие синтаксических ошибок во всех модулях проекта – необходимое условие для создания исполняемого файла, но недостаточное, так как ошибки могут появиться при объединении модулей, и пока они не будут исправлены, исполняемый файл не получить.

Директива #include создает копию указанного файла, которая включается в программу вместо директивы. Существует две формы использования директивы #include:

#include <filename>

#include “filename”

Разница между ними заключается в том, где предпроцессор будет искать файлы, которые необходимо включить. Если имя заключено в кавычки, предпроцессор ищет его в том же каталоге, что и компилируемый файл. Такую запись обычно используют для включения определенных пользователем заголовочных файлов, содержащих общие для отдельных файлов программы объявления. Примерами таких объявлений является объявления структур и объединений, констант и прототипов функций. Если имя файла заключено в угловые скобки (< и >), используемые для файлов стандартной библиотеки, то поиск будет вестись в зависимости от конкретной реализации компилятора, обычно в предопределенных каталогах.

Рассмотрим несложный пример. Допустим, нам необходимо выполнить вычисление площади и периметра эллипса. Для решения данной задачи воспользуемся модулем для отделения общей части программы от основной. Создадим файл Ellipse.h, в который поместим структуру эллипса и интерфейс функций, и файл Ellipse.cpp, в который поместим реализацию объявленных ранее функций.

Приведем листинги файлов.

//Ellipse.h

//Заголовочный файл, в котором описывается структура Ellipse и прототипы некоторых функций для работы с ней, а также объявляется константа PI

//объявление константы

const float PI = 3.14;

//объявление структурного типа Ellipse

struct Ellipse {

float axis1; //полуоси

float axis2; //эллипса

};

//объявление прототипов функций

//функция возвращает Ellipse с задаными размерами

Ellipse createEllipse (float a, float b);

//функция возвращает площать переданного ей Ellipse

float area (Ellipse ell);

//функция возвращает периметр переданного ей Ellipse

float perimeter (Ellipse ell);

//Ellipse.cpp

//В этом файле размещается реализация функций, прототипы которых были объявлены в заголовочном файле Ellipse.h

#include "Ellipse.h"

Ellipse createEllipse (float a, float b) {

Ellipse newEll;

newEll.axis1 = a;

newEll.axis2 = b;

return newEll;

}

float area (Ellipse ell) {

return PI*ell.axis1*ell.axis2;

}

float perimeter (Ellipse ell) {

return 4*((PI*ell.axis1*ell.axis2+(ell.axis1-ell.axis2)*(ell.axis1-ell.axis2))/(ell.axis1+ell.axis2)); //формула вычисления преметра эллипса

}

//main.cpp

//Основной файл программы, в котором реализуется функция main

#include <stdio.h>

#include <stdlib.h>

#include "Ellipse.h"

int main()

{

float a, b;

printf("Input ellipse semimajor and semiminor axes: ");

scanf("%f%f", &a, &b);

struct Ellipse theEllipse = createEllipse (a, b);

printf ("\nThe ellipse perimeter is: %.2f", perimeter(theEllipse));

printf ("\nThe ellipse area is: %.2f\n", area(theEllipse));

system ("pause");

}