
Лаб_2 Головков И.Е. 12002108 КСМП
.docxФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ БЕЛОГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ (НИУ «БелГУ») ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ
КАФЕДРА ИНФОРМАЦИОННЫХ И РОБОТОТЕХНИЧЕСКИХ СИСТЕМ
Отчет по лабораторной работе №2 Тема работы «Технология разработки модульного приложения методом «сверху-вниз» в C++» по дисциплине «Концепция создания модульных приложений»
студента очного отделения
2 курса группы 12002108
Головкова Игоря Евгеньевича
Проверил:
ст. пр. Гончаров Дмитрий Викторович
Белгород 2023
Цель работы
Изучение принципов разработки сложных систем, получение навыков создания программ на языке C++ путем проектирования сверху вниз.
Общая постановка задачи
Требуется разработать приложение, которое позволяет пользователю получать выпуклую оболочку последовательно поступающих точек плоскости и вычислять различные геометрические характеристики оболочки. В качестве таких характеристик рассмотреть периметр и площадь. Приложение должно предусматривать возможность сохранения построенной оболочки в файле.
Ход работы:
Результаты работы программы показаны на рисунках 1 и 2.
Рисунок 1 – Работа команд вывода из файла и ввода новых точек
Рисунок 2 – Работа команд вычисления площади и периметра поверхности
Листинг программы:
// Главный файл
#pragma once
#include <iostream>
#include "Points.h"
#include "UserInterface.h"
#include "Polygon.h"
using namespace std;
int main() {
setlocale(LC_ALL, "");
system("color f0");
menu();
}
// Файл Points.cpp
#pragma once
#include "Points.h"
vector <Point> points(0);
// Добавление точки
void addPoints() {
cout << "Введите X и Y новой точки: " << endl;
double x, y;
cin >> x >> y;
Point newPoint { x, y };
points.push_back(newPoint);
}
// Вывод всех точек
void outputPoints() {
for (int i = 0; i < points.size(); i++)
{
cout << points[i].x << ' ' << points[i].y << endl;
}
if (points.size() == 0) {
cout << "Отсутствуют введённые точки";
}
}
// Очистка вектора точек
void clearPoints() {
points.clear();
}
// Вычисление расстояния между двумя точками
double distances(Point p1, Point p2) {
return sqrt(pow((p2.x - p1.x), 2) + pow((p2.y - p1.y), 2));
}
// Файл Points.h
#pragma once
#include <cmath>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include "UserInterface.h"
#include "Polygon.h"
using namespace std;
struct Point {
double x;
double y;
};
extern vector <Point> points;
extern void addPoints();
extern void outputPoints();
extern void clearPoints();
extern double distances(Point p1, Point p2);
// Файл Polygon.cpp
#include "Polygon.h"
// Вычисление периметра поверхности
double polygonPerimeter() {
double perimeter = 0;
for (int i = 0; i < points.size(); i++) {
int j = (i + 1) % points.size();
perimeter += distances(points[i], points[j]);
}
return perimeter;
}
// Вычисление площади поверхности
double polygonArea() {
double area = 0;
double sum = 0;
for (int i = 0; i < points.size(); i++) {
int j = (i + 1) % points.size();
sum += (points[j].x - points[i].x) * (points[j].y + points[i].y);
}
area = abs(sum / 2);
return area;
}
// Сохранить точки в файл
void polygonSave() {
string filename = "polygon.txt";
ofstream file(filename);
if (file.is_open()) {
for (int i = 0; i < points.size(); i++)
{
file << points[i].x << ' ' << points[i].y << endl;
}
file.close();
}
else {
cout << "Файл не открывается: " << filename << endl;
}
}
void polygonPrint() {
string filename = "polygon.txt";
ifstream file(filename);
if (file.is_open()) {
string line;
while (getline(file, line)) {
cout << line << endl;
}
file.close();
}
else {
cout << "Файл не открывается: " << filename << endl;
}
}
// Файл Polygon.h
#pragma once
#include <cmath>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include "UserInterface.h"
#include "Points.h"
extern double polygonPerimeter();
extern double polygonArea();
extern void polygonSave();
extern void polygonPrint();
// Файл UserInterface.cpp
#include "UserInterface.h"
void menu() {
int choice = 1;
// Вывод меню до вызова завершения
while (choice != 0) {
showCommands();
cin >> choice;
// Вызов нужной функции
switch (choice) {
case 1:
addPoints();
cout << endl;
break;
case 2:
cout << "Выбрана функция вывода точек. Их координаты: " << endl;
outputPoints();
break;
case 3:
cout << "Площадь поверхности: " << polygonArea() << endl;
break;
case 4:
cout << "Периметр поверхности: " << polygonPerimeter() << endl;
break;
case 5:
cout << "Сохранение точек поверхности в файл..." << endl;
polygonSave();
break;
case 6:
cout << "Ввод точек поверхности из файла..." << endl;
polygonPrint();
break;
case 7:
cout << "Удаление точек..." << endl;
clearPoints();
break;
case 0:
cout << "Завершение работы программы..." << endl;
break;
default:
cout << "Неверный ввод" << endl;
break;
}
}
}
void showCommands() {
cout << endl << "*** Меню пользователя ***" << endl;
cout << "1. Ввести точки" << endl;
cout << "2. Вывести точки" << endl;
cout << "3. Вывести площадь поверхности" << endl;
cout << "4. Вывести периметр поверхности" << endl;
cout << "5. Сохранить точки поверхности в файл" << endl;
cout << "6. Вывести точки из файла" << endl;
cout << "7. Очистить список точек" << endl;
cout << "0. Завершить работу" << endl;
cout << "Введите номер нужной команды меню: ";
}
// Файл UserInterface.h
#pragma once
#include <iostream>
#include <vector>
#include "Points.h"
#include "Polygon.h"
using namespace std;
extern void showCommands();
extern void menu();