
Лаб_1 Головков И.Е. 12002108 КСМП
.docxФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ БЕЛОГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ (НИУ «БелГУ») ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ
КАФЕДРА ИНФОРМАЦИОННЫХ И РОБОТОТЕХНИЧЕСКИХ СИСТЕМ
Отчет по лабораторной работе №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);