- •Лабораторная работа №13. Модули. Многофайловые проекты
- •1 Цель и порядок работы
- •2 Краткая теория
- •2.1 Особенности работы с многофайловыми проектами
- •2.2 Добавление новых файлов в проект в среде разработки VisualStudio2008
- •2.3 Пример работы с многофайловыми проектами
- •3 Контрольные вопросы
- •4 Задание
- •5 Варианты заданий
- •6 Содержание отчета
2.2 Добавление новых файлов в проект в среде разработки VisualStudio2008
Для добавления новых файлов в проект новых файлов в проект необходимо вызвать контекстное меню над именем проекта в «Проводнике решений» (SolutionExplorer) (см. рисунок 13.1) и далее выбрать раскрывающийся пункт «Добавить» (Add). В нем нас на текущий момент будут интересовать два подпункта “New Item …” (Новый объект) и “ExitingItem…” (Существующий объект). Первый создает новый файл, одного из предложенных типов, а второй добавляет к проекту уже существующий. Диалоговое окно с вариантами доступных для создания файлов представлено на рисунке 13.2.
Результат добавления файлов в проект представлен на рисунке 13.3. Теперь достаточно воспользоваться директивой #includeдля использования функций, констант и типов данных, располагающихся в новых файлах.
Рисунок 13.1 – Добавление нового файла в проект
Рисунок 13.2 – Диалоговое окно выбора типа добавляемого файла
Рисунок 13.3 – Результат добавления новых файлов в проект
2.3 Пример работы с многофайловыми проектами
Разберем работу с многофайловыми проектами на примере задачи из предыдущей лабораторной работы.
Пример 13.1 Нахождение расстояния между точками
Задание.Написать программу, которая находит расстояние между двумя точками. Координаты могут задаваться как в декартовой, так и в полярной системе координат. Предусмотреть функции перевода из декартовой системы в полярную и обратно.
Алгоритм решения:
Задать или ввести с клавиатуры координаты точек.
Для пары точек определить расстояние по одной из формул:
для декартовой системы:
для полярной системы:
Вывести результаты на экран.
Определение требуемых типов данных.
Для удобства хранения информации о координате точки в одной из систем координат удобно воспользоваться структурами, хранящими пары координат одной и той же точки. Для простоты назовем их cartesianдля декартовой, иpolarдля полярной системы координат.
Разбиение на подзадачи.
В результате описанного алгоритма и задания определяем спецификации нужных нам функций. Для удобства использования воспользуемся перегрузкой:
1. doublelen(cartesiana,cartesianb) – принимает две координаты в декартовой системе и возвращает длину.
2. doublelen(polara,polarb) – принимает две координаты в полярной системе и возвращает длину.
3. doublelen(cartesiana,polarb) – принимает первую координату в декартовой системе, а вторую в полярной, и возвращает длину.
4. doublelen(polara,cartesianb) – принимает первую координату в полярной системе, а вторую в декартовой, и возвращает длину.
5. polarcartesian_to_polar(cartesianx) – переводит координаты точки из в декартовой системы в полярную.
6. cartesian polar_to_cartesian(polar x) – переводит координаты точки из в полярной системы в декартову.
Разбиение на модули.
Исходя из логики работы программы, а также, возможного дальнейшего применения полученных результатов естественным будет разбить ее на два файла: PRG-Lab13.cpp – содержащий точку входа в программу, а также основные вызовы функции и взаимодействие с пользователем; points.cpp – содержащий реализации вышеперечисленных функций; а также points.h – содержащий интерфейсы данных функций и типы данных, и служащий для подключения возможностей работы с точками в различных системах координат.
Файл points.h
// points.h : Содержит определения основных типов и прототипы функций.
//
#ifndef POINTS_H
#define POINTS_H
//Объявления типов
//Точка в декартовой системе координат
struct cartesian{
double x, y;
};
//Точка в полярной системе координат
struct polar{
double r, pi;
};
//Прототипы функций
double len(polar a, polar b);
double len(cartesian a, cartesian b);
double len(cartesian a, polar b);
double len(polar a, cartesian b);
polar cartesian_to_polar(cartesian x);
cartesian polar_to_cartesian(polar x);
#endif
Файл points.cpp
Примечание.Обратите внимание на повторное использование вызовов уже существующих функций. Данная техника позволяет добиться быстрого и удобного внесения корректив (хотя и за счет несущественной потери в производительности). Например, при наличии ошибки, скажем, при неверно запрограммированной формуле, ее достаточно исправить лишь в одном месте, а не искать по всему тексту модуля.
// points.cpp : Содержит определения функций
//
#include "stdafx.h"
#include "points.h"
#include <math.h>
double len(polar a, polar b)
{
return sqrt( pow(a.r, 2) + pow(b.r, 2) - 2*a.r*b.r*cos(a.pi - b.pi) );
}
double len(cartesian a, cartesian b)
{
return sqrt( pow(a.x - b.x, 2) + pow(a.y - b.y, 2) );
}
double len(cartesian a, polar b)
{
cartesian c;
c = polar_to_cartesian(b);
return len(a, c);
}
double len(polar a, cartesian b)
{
return len(b, a);
}
polar cartesian_to_polar(cartesian x)
{
polar y;
y.r = sqrt(pow(x.x, 2) + pow(x.x, 2));
if (y.r == 0)
y.pi = 0;
else
y.pi = asin(x.y/y.r);
return y;
}
cartesian polar_to_cartesian(polar x)
{
cartesian y;
y.x = x.r*cos(x.pi);
y.y = x.r*sin(x.pi);
return y;
}
Файл PRG-Lab13.cpp
// PRG-Lab13.cpp : Основной файл проекта, содержит точку входа в программу
//
#include "stdafx.h"
#include <iostream>
#include "points.h"
using namespace std;
void main(int argc, char* argv[])
{
setlocale(LC_ALL, "Russian");
const double PI = 3.14159;
cartesian a = {3, 0},
b = {1, 1};
polar c = {1.41, PI/4},
d = {3.1, 0.95};
//вызовы перегруженных функций
//для точек в различных системах координат
//декартова - декартова
cout << len(a, b) << endl;
//полярная - полярная
cout << len(c, d) << endl;
//декартова - полярная
cout << len(a, d) << endl;
//полярная - декартова
cout << len(c, b) << endl;
}
Таким образом мы получили собственную мини библиотеку, которую можно расширять в дальнейшем и использовать в других проектах.