1 / 1 / 0
Регистрация: 20.04.2014
Сообщений: 140
1

Создайте методы для арифметических действий на числами класса verylong

19.05.2015, 20:56. Показов 583. Ответов 0
Метки нет (Все метки)

Добрый вечер!

В универе нам задали следующее задание: создайте методы для арифметических действий на числами класса verylong (порядок чисел < 10000). Перегрузите соответствтующие операции. Числа могут быть как положительные, так и отрицательные. Также перегрузите операции сравнения долгих чисел.

И дан код-образец, который нужно модифицировать:

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// verylong.h
// описатель класса сверхбольших целых чисел
#include <iostream>
#include <string.h> // для strlen()и т. п.
#include <stdlib.h> // для ltoa()
using namespace std;
const int SZ = 1000; // максимальное число разрядов
class verylong
{
private:
char vlstr[SZ]; // число как строка
int vlen; // длина строки verylong
verylong multdigit(const int) const; // прототипы
verylong mult10(const verylong) const;// скрытых
// функций
public:
verylong() : vlen(0) // конструктор без аргументов
{ vlstr[0] = '\0'; }
verylong(const char s[SZ]) // конструктор (1 аргумент)
{ strcpy(vlstr, s); vlen = strlen(s); } // для строки
verylong(const unsigned long n) // конструктор (1 арг.)
{ // для long int
ltoa(n, vlstr, 10); // перевести в строку
strrev(vlstr); // перевернуть ее
vlen = strlen(vlstr); // найти длину
}
void putvl() const; // вывести число
void getvl(); // получить число от пользователя
verylong operator+(const verylong); // сложить числа
verylong operator*(const verylong); // умножить
};

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// verylong.cpp
// реализация обработки данных типа verylong
#include "verylong.h" // заголовочный файл для verylong
//---------------------------------------------------------
void verylong::putvl() const // вывод на экран verylong
{
char temp[SZ];
strcpy(temp, vlstr); // создать копию
cout << strrev(temp); // перевернуть копию
} // и вывести ее
//---------------------------------------------------------
void verylong::getvl() // получить сверхбольшое число от
// пользователя
{
cin >> vlstr; // получить строку от пользователя
vlen = strlen(vlstr); // найти ее длину
strrev(vlstr); // перевернуть ее
}
//---------------------------------------------------------
verylong verylong::operator+(const verylong v)
// сложение
{
char temp[SZ];
int j;
// найти самое длинное число
int maxlen = (vlen > v.vlen) ? vlen : v.vlen;
int carry = 0; // установить в 1, если сумма >= 10
for(j = 0; j < maxlen; j++) // и так для каждой позиции
{
int d1 = (j > vlen - 1) ? 0 : vlstr[j]-'0'; // получить
// разряд
int d2 = (j > v.vlen - 1) ? 0 : v.vlstr[j]-'0';// и еще
int digitsum = d1 + d2 + carry; // сложить разряды
if(digitsum >= 10) // если перенос, то
{ digitsum -= 10; carry = 1; } // увеличить сумму на 10
else // установить перенос в 1
carry = 0; // иначе перенос = 0
temp[j] = digitsum + '0';// вставить символ в строку
}
if(carry == 1) // если перенос в конце,
temp[j++] = '1'; // последняя цифра = 1
temp[j] = '\0'; // поставить ограничитель строки
return verylong(temp); // вернуть временный verylong
}
//---------------------------------------------------------
verylong verylong::operator*(const verylong v)// умножение
{ // сверхбольших чисел
verylong pprod; // произведение одного разряда
verylong tempsum; // текущая сумма
for(int j = 0; j < v.vlen; j++)// для каждого разряда аргумента
{
int digit = v.vlstr[j]-'0'; // получить разряд
pprod = multdigit(digit); // умножить текущий на него
for(int k = 0; k < j; k++) // умножить результат на
pprod = mult10(pprod); // степень 10-ти
tempsum = tempsum + pprod; // прибавить произведение к
// текущей сумме
}
return tempsum; // вернуть полученную текущую сумму
}
//---------------------------------------------------------
verylong verylong::mult10(const verylong v) const // умножение аргумента
// на 10
{
char temp[SZ];
for(int j = v.vlen - 1; j >= 0; j--)// сдвинуться на один разряд
temp[j + 1] = v.vlstr[j]; // выше
temp[0] = '0'; // обнулить самый младший разряд
temp[v.vlen + 1] = '\0'; // поставить ограничитель строки
return verylong(temp); // вернуть результат
}
//---------------------------------------------------------
verylong verylong::multdigit(const int d2) const
{ // умножение числа на
char temp[SZ]; // аргумент (цифру)
int j, carry = 0;
for(j = 0; j < vlen; j++) // для каждого разряда
{ // в этом сверхбольшом
int d1 = vlstr[j]-'0'; // получить значение разряда
int digitprod = d1 * d2; // умножить на цифру
digitprod += carry; // добавить старый перенос
if(digitprod >= 10) // если возник новый перенос,
{
carry = digitprod / 10; // переносу присвоить значение старшего разряда
digitprod -= carry * 10;// результату - младшего
}
else
carry = 0; // иначе перенос = 0
temp[j] = digitprod + '0';// вставить символ в строку
}
if(carry != 0) // если на конце перенос,
temp[j++] = carry + '0'; // это последний разряд
temp[j] = '\0'; // поставить ограничитель
return verylong(temp); // вернуть сверхбольшое число
}

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// vl_app.cpp
// вычисляет факториалы больших чисел
#include "verylong.h" // заголовочный файл verylong
int main()
{
unsigned long numb, j;
verylong fact = 1; // инициализировать verylong
cout << "\n\nВведите число: ";
cin >> numb; // ввод числа типа long int
for(j = numb; j > 0; j--)// факториал — это numb *
fact = fact * j; // numb-1 * numb-2 *
cout << "Факториал = "; // numb-3 и т. д.
fact.putvl(); // вывести значение факториала
cout << endl;
return 0;
}


Буду очень благодарна за помощь!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2015, 20:56
Ответы с готовыми решениями:

Создайте класс с именем Complex для выполнения арифметических действий с комплексными числами
В Общем программу написал, складывает-вычитает, но преподаватель требует в нее добавить класс...

Выполнение арифметических действий с 32-разрядными числами на 286
Доброго времени суток Возникла проблема осуществления задания с лабораторной. Написать...

Программа выполнения арифметических действий с очень большим целыми числами
Программа выполнения арифметических действий с очень большим целыми числами. Примерно с такими...

Выполнить одно из указанных пользователем арифметических действий над двумя числами
Всем доброго дня! Помогите пожалуйста решить задачу. Задача: Разработайте программу, которая бы...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2015, 20:56
Помогаю со студенческими работами здесь

Четыре лямбда оператора для выполнения арифметических действий
Проверьте правильно ли я сделал? И подскажите, как в Лямбда оператор впихнуть проверку деления на...

Сделать класс для выполнения арифметических действий с дробями
Доброго времени суток!! Нужна помощь с заданием;) Задание: Создать класс для представления...

Функция для арифметических действий в четверичной системе счисления
составить функции для реализации следующих арифметических операций в четверичной системе...

Калькулятор для выполнения арифметических действий с обыкновенными дробями
Создать web-форму (aspx) Задание:создать дробный калькулятор. Калькулятор для выполнения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru