Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб_2 Головков И.Е. 12002108 КСМП

.docx
Скачиваний:
0
Добавлен:
26.06.2024
Размер:
86.8 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ БЕЛОГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ (НИУ «БелГУ») ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ

КАФЕДРА ИНФОРМАЦИОННЫХ И РОБОТОТЕХНИЧЕСКИХ СИСТЕМ

Отчет по лабораторной работе №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();