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

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

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

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

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

Отчет по лабораторной работе №1 Тема работы «Введение в модульное программирование на языке C++» по дисциплине «Концепция создания модульных приложений»

студента очного отделения

2 курса группы 12002108

Головкова Игоря Евгеньевича

Проверил:

ст. пр. Гончаров Дмитрий Викторович

Белгород 2023

Цель работы

Изучение принципов модульного программирования, получение навыков разработки программ на языке C++ путем декомпозиции задачи.

Общая постановка задачи

Разработать набор функций, позволяющих выполнять операции над объектами указанного типа. Библиотека должна представлять собой один или несколько модулей реализаций указанных функций с общей интерфейсной частью. Для проверки работоспособности полученной реализации написать тестовую программу. Тестовая программа должна охватывать все функции проблемно-ориентированной библиотеки. В каждом задании вначале указывается тип объектов, для которых необходимо разработать библиотеку, после чего перечисляются операции для программной реализации. Кроме указанных в списке, должны быть реализованы операции инициализации (задание значения объекта), ввода с клавиатуры и вывода значения на экран. Индивидуальные данные для выполнения работы (№ варианта)

8. Длинные целые числа с произвольным количеством десятичных разрядов (например, 27340051993271935986746307).

– арифметические операции сложения и вычитания;

– операция умножения;

– операция деления.

Результаты работы приложения (скриншоты)

Рисунок 1 – Результат работы программы с применением функций инициализации, ввода-вывода, сложения, вычитания, умножения, деления.

Листинг программы

Главный файл с main():

#include <iostream>

#include "longNumberIO.h";

#include "longNumberMult.h";

#include "longNumberSub.h";

#include "longNumberSum.h";

#include "longNumberDiv.h"

using namespace std;

int main()

{

system("color F0");

vector<int> num1 = initializeLongNumber();

vector<int> num2 = initializeLongNumber();

cout << "Input first long number: ";

num1 = readLongNumber();

cout << "Input second long number: ";

num2 = readLongNumber();

cout << "Result of summation: ";

writeLongNumber(summarizeLongNumbers(num1, num2));

cout << "Result of subtraction: ";

writeLongNumber(subtractLongNumbers(num1, num2));

cout << "Result of multiplication: ";

writeLongNumber(multipyLongNumbers(num1, num2));

cout << "Result of division: ";

writeLongNumber(divideLongNumbers(num1, num2));

return 0;

}

longNumberDiv.cpp

#include "longNumberDiv.h";

#include "longNumberIO.h";

#include "longNumberSub.h";

#include "longNumberSum.h";

vector<int> divideLongNumbers(vector<int> longNumber1, vector<int> longNumber2)

{

try {

while (longNumber2[0] == 0 && longNumber2.size() > 1) { // обработка деления на ноль

auto iter = longNumber2.cbegin();

longNumber2.erase(iter);

}

if (longNumber2[0] == 0)

throw exception("Division by zero");

}

catch (const exception e) {

cout << "Error: Division by zero. Write correct second number.";

longNumber2 = readLongNumber();

}

vector<int> resultOfDiv(1);

vector<int> oneVector(1);

oneVector[0] = 1;

while (longNumber1[0] > 0) {

longNumber1 = subtractLongNumbers(longNumber1, longNumber2);

resultOfDiv = summarizeLongNumbers(resultOfDiv, oneVector);

while (longNumber1[0] == 0 && longNumber1.size() > 1) { // удаление лишних нулей, если они есть

auto iter = longNumber1.cbegin();

longNumber1.erase(iter);

}

}

if (longNumber1[0] < 0) {

resultOfDiv = subtractLongNumbers(resultOfDiv, oneVector);

}

return resultOfDiv;

}

longNumberDiv.h

#pragma once

#include <vector>

using namespace std;

extern vector<int> divideLongNumbers(vector<int> longNumber1, vector<int> longNumber2);

longNumberIO.cpp

#include "longNumberIO.h"

vector<int> readLongNumber()

{

string lineOfDigits;

cin >> lineOfDigits;

vector <int> longNumber(lineOfDigits.length());

for (int i = 0; i < lineOfDigits.length(); i++) {

longNumber[i] = lineOfDigits[i] - '0';

}

return longNumber;

}

void writeLongNumber(vector<int> longNumber)

{

for (int i = 0; i < longNumber.size(); i++) {

cout << longNumber[i];

}

cout << endl;

}

vector<int> initializeLongNumber() {

vector<int> newVector(0);

return newVector;

}

longNumberIO.h

#pragma once

#include <string>

#include <iostream>

#include <vector>

using namespace std;

extern vector<int> readLongNumber();

extern vector<int> initializeLongNumber();

extern void writeLongNumber(vector<int> longNumber);

longNumberMult.cpp

#include "longNumberMult.h";

vector<int> multipyLongNumbers(vector<int> longNumber1, vector<int> longNumber2)

{

while (longNumber2.size() < longNumber1.size()) { // сдвиг вправо вектора 2, если он меньше

longNumber2.insert(longNumber2.begin(), 0);

}

vector<int> resultOfMult(longNumber2.size(), 0);

for (int i = 0; i < longNumber1.size(); i++) {

for (int j = 0; j < longNumber2.size(); j++) {

resultOfMult[longNumber2.size() - j - 1] += longNumber1[longNumber1.size() - i - 1] * longNumber2[longNumber2.size() - j - 1];

}

resultOfMult.insert(resultOfMult.begin(), 0);

}

for (int i = resultOfMult.size() - 1; i >= 1; i--) { // по 1 цифре на разряд

if (resultOfMult[i] >= 10 && i != 0) {

resultOfMult[i - 1] += resultOfMult[i] / 10;

resultOfMult[i] %= 10;

}

}

if (resultOfMult[0] >= 10) { // по 1 цифре на разряд (проверка нулевого индекса)

resultOfMult.insert(resultOfMult.begin(), resultOfMult[0] / 10);

resultOfMult[1] %= 10;

}

while (resultOfMult[0] == 0 && resultOfMult.size() > 1) { // удаление лишних нулей, если они есть

auto iter = resultOfMult.cbegin();

resultOfMult.erase(iter);

}

return resultOfMult;

}

longNumberMult.h

#pragma once

#include <vector>

using namespace std;

extern vector<int> multipyLongNumbers(vector<int> longNumber1, vector<int> longNumber2);

longNumberSub.cpp

#include "longNumberSub.h";

vector<int> subtractLongNumbers(vector<int> longNumber1, vector<int> longNumber2)

{

vector<int> longNumber1tmp = longNumber1;

bool firstIsLess = false;

if (longNumber2.size() > longNumber1.size()) { // обмен значений, если вектор 2 имеет больше разрядов

longNumber1.swap(longNumber2);

firstIsLess = true;

}

while (longNumber2.size() < longNumber1.size()) { // сдвиг вправо вектора 2, если он меньше

longNumber2.insert(longNumber2.begin(), 0);

}

vector<int> resultOfSub(longNumber1.size());

for (int i = longNumber2.size() - 1; i >= 0; i--) {

if (longNumber1[i] < longNumber2[i] && i != 0) { // если цифра разряда первого числа меньше второй

longNumber1[i] += 10;

longNumber1[i - 1] -= 1;

}

else if (longNumber1[i] < longNumber2[i] && i == 0) { // если первый вектор численно меньше

resultOfSub = subtractLongNumbers(longNumber2, longNumber1tmp);

resultOfSub[0] *= -1;

return resultOfSub;

}

resultOfSub[i] = longNumber1[i] - longNumber2[i];

}

while (resultOfSub[0] == 0 && resultOfSub.size() > 1) { // удаление лишних нулей, если они есть

auto iter = resultOfSub.cbegin();

resultOfSub.erase(iter);

}

if (firstIsLess == true) resultOfSub[0] *= -1; // создание отрицательного значения, если первый вектор меньше

return resultOfSub;

}

longNumberSub.h

#pragma once

#include <vector>

using namespace std;

extern vector<int> subtractLongNumbers(vector<int> longNumber1, vector<int> longNumber2);

longNumberSum.cpp

#include "longNumberSum.h";

vector<int> summarizeLongNumbers(vector<int> longNumber1, vector<int> longNumber2)

{

while (longNumber1.size() < longNumber2.size()) { // сдвиг вправо вектора 1, если он меньше

longNumber1.insert(longNumber1.begin(), 0);

}

while (longNumber2.size() < longNumber1.size()) { // сдвиг вправо вектора 2, если он меньше

longNumber2.insert(longNumber2.begin(), 0);

}

vector<int> resultOfSum(longNumber2.size());

for (int i = longNumber2.size() - 1; i >= 0; i--) {

resultOfSum[i] += longNumber1[i] + longNumber2[i];

if (resultOfSum[i] >= 10) {

if (i == 0) { // если нужно добавить старший разряд в сумму

resultOfSum[i] -= 10;

resultOfSum.insert(resultOfSum.begin(), 1);

}

else {

resultOfSum[i] -= 10;

resultOfSum[i - 1] += 1;

}

}

}

return resultOfSum;

}

longNumberSum.h

#pragma once

#include <vector>

using namespace std;

extern vector<int> summarizeLongNumbers(vector<int> longNumber1, vector<int> longNumber2);