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

Программирование C++ (1 сем, мага) / Лабы / Лабораторная работа №5

.pdf
Скачиваний:
0
Добавлен:
01.09.2026
Размер:
1 Мб
Скачать
int *wholeB – указатель на первый элемент массива, содержащего целую часть
второго из складываемых чисел;
int *fractionalB – указатель на первый элемент массива, содержащего дробную
часть второго из складываемых чисел;
int *wholeResult – указатель на первый элемент массива, в который будет
записана целая часть результата сложения двух чисел;int *fractionalResult –
указатель на первый элемент массива, в который будет записана дробная часть
результата сложения двух чисел.
Внутри функции реализованы несколько условных блоков:
1. Блок if (wholeA[0] == wholeB[0]){…} выполняется, если складываемые
числа имеют один знак. При сложении чисел одного знака результат равен сумме модулей
этих чисел, а знак результата – знаку, который имеют числа. В этом блоке сначала в цикле
for поразрядно складываются дробные части числа, затем опять же поразрядно в цикле for – целые. После сложения чисел также заполняется значение нулевого элемента
массива, содержащего целую часть результата, – элемента, описывающего знак числа. Сложение разрядов чисел осуществляется с помощью функции sumDigits(…),
caseNumber = 0. Описание этой функции будет приведено ниже.
2. Блок else if (wholeA[0] == 0 and wholeB[0] == 1) {…}первое из
складываемых чисел положительно, а второе отрицательно. С помощью функции
checkAbs(…) (описание её работы будет приведено ниже) проверяется, больше или равно положительное число отрицательному. Если это так, переменная isPosBigger = true, иначе false. Далее в циклах с помощью функции sumDigits(…), caseNumber = 1
поразрядно складываются дробные и целые части чисел. Первым в функцию передается
большее по модулю число. Знак результата сложения чисел принимает значение, равное знаку большего по модулю числа.
3. Блок else if (wholeA[0] == 1 and wholeB[0] == 0) {…} – первое из
складываемых чисел отрицательно, второе положительно. Логика выполнения этого блока
аналогично предыдущему.
Рассмотрим функцию int sumDigits(int a, int b, int *addToNext,
int caseNumber).
Функция принимает в качестве аргументов:
int a – цифру, стоящую в складываемом разряде первого числа;
int b – цифру, стоящую в этом же разряде второго числа;
int *addToNext – указатель на переменную, хранящую величину, которую нужно
добавить к текущему складываемому разряду (1, -1, 0);
int caseNumber – если складываемые числа (именно числа) имеют один знак, то
значение равено 0, если числа имеют разный знак – 1. Возвращает функция значение типа int, равное результату сложения разрядов двух
чисел.
Функция состоит из двух условных блоков:
1. if (caseNumber == 0) {…} – складываются разряды чисел одного знака. Если
сумма складываемых цифр не превышает 9, результирующее значение равно сумме цифр, а добавка к следующему разряду равна 0. Если же сумма двух цифр превышает 10, то результирующее значение равно остатку от деления этой суммы на 10, а добавка к
следующему разряду – +1.
2. else if (caseNumber == 1) {…} – одно из складываемых чисел отрицательно,
а второе положительно. Фактически происходит вычитание одного числа из второго.
Причем важно передавать в функцию большее по модулю число. Если цифра, стоящая в разряде уменьшаемого с учетом добавки от предыдущего разряда (может быть равно 0 или
-1) меньше цифры, стоящей в этом же разряде вычитаемого, то занимается десяток из следующего разряда и выполняется вычитание. Добавка к следующему разряду становится равной -1. Если цифра, стоящая в разряде уменьшаемого с учетом добавки от предыдущего
разряда больше или равна цифре, стоящей в этом же разряде вычитаемого, то просто выполняется вычитание, а добавка к следующему разряду равна 0.
Рассмотрим функцию bool checkAbs(int *wholePos, int
*fractionalPos, int *wholeNeg, int *fractionalNeg) {…}.
Функция принимает в качестве аргументов:
int *wholePos – указатель на первый элемент массива, содержащего целую часть
положительного числа;
int *fractionalPos – указатель на первый элемент массива, содержащего
дробную часть положительного числа;
int *wholeNeg – указатель на первый элемент массива, содержащего целую часть
отрицательного числа;
int *fractionalNeg – указатель на первый элемент массива, содержащего
отрицательного числа.
Функция возвращает true, если положительное число больше, и false, если отрицательное число больше. Если числа равны, возвращается true.
Поразрядно, начиная со старшего разряда, выполняется сравнение чисел. Как только
цифра в разряде положительного числа оказывается меньше цифры в соответствующем разряде отрицательного, возвращается false. И наоборот, как только цифра в разряде положительного числа оказывается больше цифры в разряде отрицательного, -­возвращается true.
Иллюстрация работы операции сложения:
Здесь представлены случаи сложения:
двух положительных действительных чисел;
положительного действительного числа и комплексного числа, у которого и
вещественная и мнимая части больше нуля;
положительного действительного числа и комплексного числа, у которого и
вещественная и мнимая части меньше нуля (причем эта сумма посчитана дважды –
числа передавались в функцию в разном порядке, результат получился одинаковый);
комплексного числа с положительными вещественной и мнимыми частями и
комплексного числа, у которого вещественная часть положительна, а мнимая –
отрицательна;
комплексного числа с положительными вещественной и мнимыми частями и
комплексного числа, у которого и вещественная, и мнимая части отрицательны;
комплексного числа, у которого вещественная часть положительна, а мнимая –
отрицательна, и комплексного числа, у которого и вещественная, и мнимая части
отрицательны.
Полученные результаты сложения чисел корректны.
Для вывода числа, хранящегося в структурной переменной, написана функция
void printNumber(longNumber *number) {…}.
Функция принимает в качестве аргумента указатель на структуру longNumber. Результатом ее работы является вывод структуры на экран в виде числа.
Сначала выводится вещественная часть числа. Если эта часть отрицательна,
печатается ‘-’, если положительна, то знак не выводится. Далее в цикле for выводится целая часть (причем нули в старших разрядах опускаются), а затем также в цикле for – дробная. Если число комплексное, аналогичным образом выводится его мнимая часть.
Перед мнимой частью знак выводится в любом случае, также выводится мнимая единица.
Вывод операции сложения двух чисел осуществляется с помощью функции
void printSumOperation(longNumber *a, longNumber *b,
longNumber *result):
В качестве аргументов функция принимает указатели на структуры двух складываемых чисел и на число, являющееся их суммой. Эта функция вызывалась в блоке main() для вывода операций сложения в терминал.
Заключение
В лабораторной работе создана структура для хранения длинных чисел и выполнено
чтение чисел из файла с последующим их сохранением в структурные переменные.
Для полученных чисел также реализована операция сложения и вывод этих чисел в
консоль.
Формат исходных чисел не позволял хранить их в переменных стандартных типов
данных, но с использованием структур удалось считать эти числа из файла, записать в
структурные переменные и использовать в дальнейшем, например, в операции сложения.