11833

Модули. Многофайловые проекты

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа №13. Модули. Многофайловые проекты 1 Цель и порядок работы Цель работы – ознакомиться с возможностью работы с многофайловыми проектами в среде разработки Visual Studio и научиться применять полученные знания при создании собственных модулей. Порядок...

Русский

2013-04-12

227 KB

46 чел.


Лабораторная работа №13. Модули. Многофайловые проекты

1 Цель и порядок работы

Цель работы – ознакомиться с возможностью работы с многофайловыми проектами в среде разработки Visual Studio и научиться применять полученные знания при создании собственных модулей.

Порядок выполнения работы:

  •  ознакомиться с описанием лабораторной работы;
  •  получить задание у преподавателя, согласно своему варианту;
  •  написать программу и отладить ее на ЭВМ;
  •  оформить отчет.

2 Краткая теория

2.1 Особенности работы с многофайловыми проектами

До сих пор мы писали программы, исходный текст которых размещался в одном файле. Однако реальные задачи требуют создания многофайловых проектов с распределением решаемых подзадач по разным модулям (файлам).

Среда разработки Visual Studio 2008, как и подавляющее большинство других, поддерживают создание, компиляцию и сборку многофайловых проектов.

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

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

Пользуясь технологией нисходящего проектирования программ, мы разбиваем исходную задачу на подзадачи. Затем при необходимости каждая из них также разбивается на подзадачи, и так далее, пока решение очередной подзадачи не окажется достаточно простым, то есть реализуемым в виде функции обозримого размера (наиболее предпочтительным считается размер не более одного-двух экранов текстового редактора).

Исходные тексты совокупности функций для решения какой-либо подзадачи, как правило, размещаются в отдельном модуле (файле). Такой файл называют исходным (sources). Обычно он имеет расширение .c или .cpp Прототипы всех функций исходного файла выносят в отдельный так называемый заголовочный файл (header file), для него принято использовать расширение .h или .hpp.

Таким образом, заголовочный файл xxx.h содержит интерфейс для некоторого набора функций, а исходный файл ххх.срр содержит реализацию этого набора. Если некоторая функция из указанного набора вызывается из какого-то другого исходного модуля ууу.срр, то обязаны включить в этот модуль заголовочный файл xxx.h с помощью директивы #include. Негласное правило стиля программирования на C++ требует включения этого же заголовочного файла (с помощью #include) и в исходный файл ххх.срр.

Хотя использование глобальных переменных считается дурным тоном в программировании, иногда возникают ситуации когда невозможно избежать их использования. В многофайловом проекте возможны два «вида глобальности переменных». Если некоторая глобальная переменная glvar1 объявлена в файле ххх.срр с модификатором static, то она видима от точки определения до конца этого файла, то есть области видимости ограничена файлом. Если же другая глобальная переменная glvar2 объявлена в файле ххх.срр без модификатора static, то она может быть видимой в пределах всего проекта. Правда, для того, чтобы она оказалась видимой в другом файле, необходимо в этом файле ее объявление с модификатором extern (рекомендуется это объявление поместить в файл xxx.h).

В заголовочном файле принято размещать:

  •  определения типов, задаваемых пользователем, констант, шаблонов;
  •  объявления (прототипы) функций;
  •  объявления внешних глобальных переменных (с модификатором extern);
  •  пространства имен.

При подобно использовании заголовочных файлов возникает проблема их повторного включения. Проблема может возникнуть при иерархическом проектировании структур данных, когда в некоторый заголовочный файл ууу.h включается при помощи директивы include другой заголовочный файл xxx.h (например, для использования типов, определенных в этом файле) и где-нибудь еще, например в основной программе.

Для решения этой проблемы рекомендуется использовать так называемые стражи включения. Данный способ состоит в следующем: чтобы предотвратить заголовочных файлов, содержимое каждого .h файла должно находиться между директивами условной компиляции #ifndef #endif, а внутри устанавливаться признак включения при помощи директивы #define.

#ifndef FILENAME_H

#define FILENAME_H

/* содержимое заголовочного файла */

#endif

2.2 Добавление новых файлов в проект в среде разработки Visual Studio 2008

Для добавления новых файлов в проект новых файлов в проект необходимо вызвать контекстное меню над именем проекта в «Проводнике решений» (Solution Explorer) (см. рисунок 13.1) и далее выбрать раскрывающийся пункт «Добавить» (Add). В нем нас на текущий момент будут интересовать два подпункта “New Item …” (Новый объект) и “Exiting Item …” (Существующий объект). Первый создает новый файл, одного из предложенных типов, а второй добавляет к проекту уже существующий. Диалоговое окно с вариантами доступных для создания файлов представлено на рисунке 13.2.

Результат добавления файлов в проект представлен на рисунке 13.3. Теперь достаточно воспользоваться директивой #include для использования функций, констант и типов данных, располагающихся в новых файлах.

Рисунок 13.1 – Добавление нового файла в проект

Рисунок 13.2 – Диалоговое окно выбора типа добавляемого файла

Рисунок 13.3 – Результат добавления новых файлов в проект

2.3 Пример работы с многофайловыми проектами

Разберем работу с многофайловыми проектами на примере задачи из предыдущей лабораторной работы.

Пример 13.1 Нахождение расстояния между точками

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

Алгоритм решения:

  •  Задать или ввести с клавиатуры координаты точек.
  •  Для пары точек определить расстояние по одной из формул:
    •  для декартовой системы:
    •  для полярной системы:
  •  Вывести результаты на экран.

Определение требуемых типов данных.

Для удобства хранения информации о координате точки в одной из систем координат удобно воспользоваться структурами, хранящими пары координат одной и той же точки. Для простоты назовем их cartesian для декартовой, и polar для полярной системы координат.

Разбиение на подзадачи.

В результате описанного алгоритма и задания определяем спецификации нужных нам функций. Для удобства использования воспользуемся перегрузкой:

1. double len(cartesian a, cartesian b) – принимает две координаты в декартовой системе и возвращает длину.

2. double len(polar a, polar b) – принимает две координаты в полярной системе и возвращает длину.

3. double len(cartesian a, polar b) – принимает первую координату в декартовой системе, а вторую в полярной, и возвращает длину.

4. double len(polar a, cartesian b) – принимает первую координату в полярной системе, а вторую в декартовой, и возвращает длину.

5. polar cartesian_to_polar(cartesian x) – переводит координаты точки из в декартовой системы в полярную.

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;

}

Таким образом мы получили собственную мини библиотеку, которую можно расширять в дальнейшем и использовать в других проектах.

3 Контрольные вопросы

  1.  В чем отличие многофайлового проекта?
  2.  Как добавить новый файл в проект?
  3.  Что такое модуль?
  4.  Для чего нужно разбиение на модули?
  5.  Для чего применяются заголовочные файлы?
  6.  Что размещается в заголовочных файлах, а что выносится в тело модуля?

4 Задание

  1.  Создать новый проект.
  2.  Добавить к проекту файл исходным кодом (.h и .cpp).
  3.  Вынести в отдельный модуль функции и типы данных.
  4.  Написать программу в соответствии с вариантом задания из пункта 5, задав начальные значения при объявлении переменных.
  5.  Отладить и протестировать программу.
  6.  Создать новый проект.
  7.  Подключить модуль из предыдущего задания в новый проект.
  8.  Написать программу в соответствии с вариантом задания из пункта 5, введя начальные значения переменных с клавиатуры.
  9.  Отладить и протестировать программу.
  10.  Оформить отчёт.

5 Варианты заданий

Определить функцию, возвращающую количество дней до конца месяца. Выполнить перегрузку функции для следующих типов параметров:

Структура «дата» (год, месяц, день).

Три целочисленных параметра: год, месяц, день.

Два целочисленных параметра: месяц, день (считать передаваемые числа датой текущего года).

Определить функцию, возвращающую НОК нескольких чисел. Выполнить перегрузку функции для следующих типов параметров:

Два параметра типа int.

Два параметра типа long.

Два параметра типа float.

Два параметра типа double.

Определить функцию, находящую максимальный элемент массива. Выполнить перегрузку функции для следующих типов параметров:

Одномерный массив типа int размерностью N.

Одномерный массив типа float размерностью N.

Одномерный массив типа double размерностью N.

Определить функцию, возвращающую минимальное из нескольких чисел. Выполнить перегрузку функции для следующих типов параметров:

Три параметра типа int.

Четыре параметра типа int.

Три параметра типа float.

Два параметра типа double.

Определить функцию, возвращающую количество недель с начала года. Выполнить перегрузку функции для следующих типов параметров:

Структура «дата» (год, месяц, день).

Три целочисленных параметра: год, месяц, день.

Два целочисленных параметра: месяц, день (считать передаваемые числа датой текущего года).

Определить функцию, возвращающую количество недель до конца года. Выполнить перегрузку функции для следующих типов параметров:

Структура «дата» (год, месяц, день).

Три целочисленных параметра: год, месяц, день.

Два целочисленных параметра: месяц, день (считать передаваемые числа датой текущего года).

Определить функцию, возвращающую НОД нескольких чисел. Выполнить перегрузку функции для следующих типов параметров:

Два параметра типа int.

Два параметра типа long.

Два параметра типа float.

Два параметра типа double.

Определить функцию, возвращающую количество минут до окончания суток. Выполнить перегрузку функции для следующих типов параметров:

Структура «время» (часы, минуты, секунды).

Три целочисленных параметра: часы, минуты, секунды.

Два целочисленных параметра: часы, минуты.

Определить функцию, возвращающую предыдущую минуту. Выполнить перегрузку функции для следующих типов параметров:

Структура «время» (часы, минуты, секунды).

Три целочисленных параметра: часы, минуты, секунды.

Два целочисленных параметра: часы, минуты.

Определить функцию, находящую сумму элементов массива. Выполнить перегрузку функции для следующих типов параметров:

Одномерный массив типа int размерностью N.

Одномерный массив типа float размерностью N.

Одномерный массив типа double размерностью N.

Определить функцию, проверяющую верна ли дата. Выполнить перегрузку функции для следующих типов параметров:

Структура «дата» (год, месяц, день).

Три целочисленных параметра: год, месяц, день.

Два целочисленных параметра: месяц, день (считать передаваемые числа датой текущего года).

Определить функцию, возвращающую расстояние между точками числа. Выполнить перегрузку функции для следующих типов параметров:

Два параметра типа структура «точка» (координаты x, y).

Четыре параметра типа float.

Четыре параметра типа double.

Определить функцию, возвращающую следующую минуту. Выполнить перегрузку функции для следующих типов параметров:

Структура «время» (часы, минуты, секунды).

Три целочисленных параметра: часы, минуты, секунды.

Два целочисленных параметра: часы, минуты.

Определить функцию, находящую произведение ненулевых элементов массива. Выполнить перегрузку функции для следующих типов параметров:

Одномерный массив типа int размерностью N.

Одномерный массив типа float размерностью N.

Одномерный массив типа double размерностью N.

Определить функцию, возвращающую прошедшее время в минутах (считать, что разница между передаваемыми значениями не превышает 24 часа). Выполнить перегрузку функции для следующих типов параметров:

Два параметра типа структура «время» (часы, минуты, секунды).

Шесть целочисленных параметра: часы, минуты, секунды.

Четыре целочисленных параметра: часы, минуты.

Определить функцию, возвращающую минимальное из нескольких чисел. Выполнить перегрузку функции для следующих типов параметров:

Два параметра типа int.

Три параметра типа int.

Два параметра типа float.

Три параметра типа float.

Три параметра типа double.

Определить функцию, возвращающую количество дней с начала года. Выполнить перегрузку функции для следующих типов параметров:

Структура «дата» (год, месяц, день).

Три целочисленных параметра: год, месяц, день.

Два целочисленных параметра: месяц, день (считать передаваемые числа датой текущего года).

Определить функцию, возвращающую n-ю степень числа x. Выполнить перегрузку функции для следующих типов параметров:

Два параметра: x и n – оба типа int.

Два параметра: x и n – оба типа float.

Два параметра: x – типа float, и n – типа int.

Определить функцию, находящую минимальный элемент массива. Выполнить перегрузку функции для следующих типов параметров:

Одномерный массив типа int размерностью N.

Одномерный массив типа float размерностью N.

Одномерный массив типа double размерностью N.

Определить функцию, возвращающую количество минут с начала суток. Выполнить перегрузку функции для следующих типов параметров:

Структура «время» (часы, минуты, секунды).

Три целочисленных параметра: часы, минуты, секунды.

Два целочисленных параметра: часы, минуты.

Определить функцию, возвращающую среднеарифметическое нескольких чисел. Выполнить перегрузку функции для следующих типов параметров:

Два параметра типа int.

Три параметра типа int.

Три параметра типа float.

Два параметра типа double.

Определить функцию, возвращающую день недели (иметь в виду, что 1 января 1-го года нашей эры было понедельником). Выполнить перегрузку функции для следующих типов параметров:

Структура «дата» (год, месяц, день).

Три целочисленных параметра: год, месяц, день.

Два целочисленных параметра: месяц, день (считать передаваемые числа датой текущего года).

Определить функцию, находящую среднеарифметическое элементов массива. Выполнить перегрузку функции для следующих типов параметров:

Одномерный массив типа int размерностью N.

Одномерный массив типа float размерностью N.

Одномерный массив типа double размерностью N.

Определить функцию, возвращающую максимальное из нескольких чисел. Выполнить перегрузку функции для следующих типов параметров:

Два параметра типа int.

Три параметра типа int.

Два параметра типа float.

Три параметра типа double.

Определить функцию, возвращающую количество дней до конца года. Выполнить перегрузку функции для следующих типов параметров:

Структура «дата» (год, месяц, день).

Три целочисленных параметра: год, месяц, день.

Два целочисленных параметра: месяц, день (считать передаваемые числа датой текущего года).

6 Содержание отчета

  1.  Титульный лист.
  2.  Наименование и цель работы.
  3.  Краткое теоретическое описание.
  4.  Задание на лабораторную работу.
  5.  Схема алгоритма.
  6.  Листинг программы.
  7.  Результаты выполнения программы.


 

А также другие работы, которые могут Вас заинтересовать

76996. Характеристика участников производства по делу об административном правонарушении, имеющих заинтересованность в исходе дела 26 KB
  Характеристика участников производства по делу об административном правонарушении имеющих заинтересованность в исходе дела. По степени заинтересованности в деле участников производства по делу об административном правонарушении не обладающих государственновластными полномочиями следует классифицировать на: 1 имеющих личную заинтересованность в исходе дела об административном правонарушении; 2 не имеющих личной заинтересованности в исходе дела. К первой группе следует отнести: лицо в отношении которого ведется производство по делу об...
76997. Характеристика участников производства, способствующих осуществлению производства по делам об административных правонарушениях 27.05 KB
  Они вправе давать показания по делу; заявлять отводы других участников производства; пользоваться юридической помощью; обжаловать итоговые решения стадий; получать копии процессуальных документов; знакомиться со всеми материалами дела об административном правонарушении. В качестве лиц способствующих осуществлению производства по делу об административном правонарушении могут быть только физические лица. По делу об административном правонарушении подлежат выяснению: 1.характер и размер ущерба причиненного административным правонарушением; В...
76998. Меры обеспечения производства по делам об административных правонарушениях: правовое основание и цели применения, особенности процессуального оформления некоторых мер 28.22 KB
  Меры обеспечения производства по делам об административных правонарушениях применяются в следующих целях: пресечение правонарушения; установления личности нарушителя; составление протокола об административном правонарушении при невозможности его составления на месте выявления нарушения; обеспечение своевременного и правильного рассмотрения дела и исполнения принятого по делу постановления.1 освидетельствование на состояние алкогольного опьянения; 6 медицинское освидетельствование на состояние опьянения; 7 задержание транспортного средства...
76999. Возбуждение дела об административном правонарушении. Поводы и основания. Процессуальное оформление 26.14 KB
  Возбуждение дела об административном правонарушении. Возбуждение дела об административном правонарушении начальная стадия производства. Применительно к производству по делам об административных правонарушениях данная стадия имеет специфическое процессуальное оформление. Поскольку составление такого протокола отнесено к компетенции соответствующего полномочного должностного лица постольку инициатором возбуждения дела является именно оно в некоторых случаях представитель общественного объединения.
77000. Протокол об административном правонарушении: содержание, требования, предъявляемые к протоколу, сроки его составления, случаи, когда протокол не составляется 28.31 KB
  Протокол об административном правонарушении: содержание требования предъявляемые к протоколу сроки его составления случаи когда протокол не составляется. Протокол об административном правонарушении процессуальный документ свидетельствующий о совершении данного противоправного деяния конечно предположительно. В Кодексе об административных правонарушениях установлены реквизиты протокола: дата и место составления; данные о его составителях; сведения о личности нарушителя; место время совершения и его существо; нормативный акт...
77001. Административное расследование. Основания для проведения, процессуальное оформление, сроки расследования 27.67 KB
  Составлению протокола об административном правонарушении может предшествовать административное расследовании на основании определения вынесенного должностным лицом уполномоченным составлять такой протокол за предусмотренные КоАП РФ административные правонарушения: монопольного валютного законодательства законодательства о защите прав потребителей охраны окружающей среды пожарной безопасности дорожного движения и на транспорте и др. Административное расследование проводится если осуществляются экспертиза или иные процессуальные...
77002. Место и порядок подготовки дела об административном правонарушении к рассмотрению, разрешаемые вопросы и процессуальное оформление принятого решения 27.19 KB
  Место и порядок подготовки дела об административном правонарушении к рассмотрению разрешаемые вопросы и процессуальное оформление принятого решения. Рассмотрение дела по существу начинается с момента получения субъектом административной юрисдикции протокола об административном правонарушении за которым следует подготовка дела к рассмотрению. Субъекты юрисдикции в порядке подготовки к рассмотрению дела выясняют: относится ли к их компетенции рассмотрение дела; имеются ли обстоятельства исключающие рассмотрение ими дела; правильно ли...
77003. Порядок рассмотрения и разрешения дела об административном правонарушении, сроки рассмотрения, решения, принимаемые по результатам рассмотрения дела 26.52 KB
  Порядок рассмотрения и разрешения дела об административном правонарушении сроки рассмотрения решения принимаемые по результатам рассмотрения дела. Подготовка к рассмотрению дела об административном правонарушении Судья орган должностное лицо при подготовке к рассмотрению дела об административном правонарушении выясняют следующие вопросы: 1 относится ли к их компетенции рассмотрение данного дела; 2 имеются ли обстоятельства исключающие возможность рассмотрения данного дела судьей членом коллегиального органа должностным лицом; 3...
77004. Содержание постановлений и определений, принятых по результатам рассмотрения дела об административном правонарушении 27.61 KB
  Содержание постановлений и определений принятых по результатам рассмотрения дела об административном правонарушении. По результатам рассмотрения дела об административном правонарушении может быть вынесено постановление. В постановлении по делу об административном правонарушении должны быть указаны: должность фамилия имя отчество судьи должностного лица наименование и состав коллегиального органа вынесших постановление; дата и место рассмотрения дела; сведения о лице в отношении которого рассмотрено дело; обстоятельства...