ТЗ
Написать класс, описывающий целое число. Класс должен содержать
• поля: значение в виде массива цифр:
• конструкторы: по-умолчанию, с параметрами, копирования; деструктор;
• метод суммы двух целых чисел.
Выдает ошибку и указывает на print
#include <iostream>
#include <cstring>
using namespace std;
class Massiv {
private:
int* Arr; // массив цифр числа
int size; // размер массива цифр
public:
// Конструкторы
Massiv() {
size = 1;
Arr = new int[size];
Arr[0] = 0;
}
Massiv(int size)
{
this-> size = size;
Arr = new int[size];
}
Massiv(const Massiv& l) {
size = l.size;
Arr = new int[size];
for (int i = 0; i < size; i++) {
Arr[i] = l.Arr[i];
}
}
// Деструктор
~Massiv() {
delete[] Arr;
}
// Методы
Massiv add(const Massiv& l,const Massiv& k) {
int max_size = max(l.size, k.size);
int* result_Arr = new int[max_size + 1];
int V = 0;
for (int i = 0; i < max_size; i++) {
int sum = V;
if (i < l.size) {
sum += l.Arr[i];
}
if (i < k.size) {
sum += k.Arr[i];
}
result_Arr[i] = sum % 10;
V = sum / 10;
}
if (V > 0) {
result_Arr[max_size] = V;
max_size++;
}
Massiv result;
delete[] result.Arr;
result.Arr = result_Arr;
result.size = max_size;
return result;
}
void Zap()
{
int size;
cout << "Задайте размер массива" << endl;
cin >> size;
cout << "Заполните массив" << endl;
for (int i = 0; i < size; i++)
{
cin >> Arr[i];
}
this->size = size;
}
// Вывод числа на экран
void print() {
for (int i = size - 1; i >= 0; i--)
{
cout << Arr[i];
}
cout << endl;
}
};
int main() {
Massiv a;
a.Zap();
Massiv b;
b.Zap();
Massiv c;
c.add(a,b);
c.print();
return 0;
}
C/C++
Помогите пожалуйста исправить код
Ошибка в методе add, причём ошибка логическая. Метод описан как метод класса (то есть применяется к объекту класса), принимает два числа. По логике он должен сложить эти числа и записать результат в объект, к которому применяется. То есть вместо кода
Massiv result;
delete[] result.Arr;
result.Arr = result_Arr;
result.size = max_size;
return result;
должен быть код delete[] this->Arr;
this->Arr = result_Arr;
this->size = max_size;
return *this;
Переписал с более приятными конструкторами.
Так же цифры проще хранить в 1 байте а не в int.
В задании написан метод сложения - значит к текущему числу прибавляется второе (т.е. один аргумент).
Так же цифры проще хранить в 1 байте а не в int.
В задании написан метод сложения - значит к текущему числу прибавляется второе (т.е. один аргумент).
#include
#include
using namespace std;
class Massiv
{
private:
uint8_t* arr;
size_t size;
public:
Massiv()
{
arr = new uint8_t[1]{};
size = 1;
}
Massiv(const initializer_list param)
{
size = param.size();
arr = new uint8_t[size];
copy(param.begin(), param.end(), arr);
}
Massiv(const string& str)
{
size = str.size();
arr = new uint8_t[size];
for (size_t i = 0; i < size; i++) arr[i] = str[i] - '0';
}
Massiv(const Massiv& other)
{
size = other.size;
arr = new uint8_t[size];
copy(other.arr, other.arr + size, arr);
}
~Massiv() { delete[] arr; }
Massiv& add(const Massiv& other)
{
size_t tmp_size = max(other.size, size);
uint8_t* tmp = new uint8_t[++tmp_size]{};
uint8_t sum{};
size_t this_it = size - 1;
size_t other_it = other.size - 1;
size_t tmp_it = tmp_size - 1;
do
{
sum += (other_it == -1 ? 0 : other.arr[other_it]) + (this_it == -1 ? 0 : arr[this_it]);
tmp[tmp_it--] = sum % 10; sum /= 10;
if (other_it != -1) --other_it;
if (this_it != -1) --this_it;
} while (other_it != -1 || this_it != -1||sum);
if (tmp[0] == 0) {
copy(tmp + 1, tmp + tmp_size, arr); delete[] tmp;
}
else {
delete[] arr; arr = tmp;
size = tmp_size;
}
return *this;
}
Massiv& operator = (const Massiv& other)
{
delete[] arr;
size = other.size;
arr = new uint8_t[size];
copy(other.arr, other.arr + size, arr);
}
friend ostream& operator
Да, тяжеловато с массивами всё это, но вот что-то вроде этого получилось:
#include
#include
class BigInt {
private:
int* digits; // массив цифр
int size; // размер массива цифр
public:
// конструкторы
BigInt() {
size = 1;
digits = new int[size];
digits[0] = 0;
}
BigInt(int num) {
size = 0;
int tmp = num;
while (tmp != 0) {
tmp /= 10;
size++;
}
digits = new int[size];
for (int i = size - 1; i >= 0; i--) {
digits[i] = num % 10;
num /= 10;
}
}
BigInt(const BigInt& other) {
size = other.size;
digits = new int[size];
std::memcpy(digits, other.digits, size * sizeof(int));
}
// деструктор
~BigInt() {
delete[] digits;
}
// методы
BigInt sum(const BigInt& other) const {
int carry = 0;
int maxSize = size > other.size ? size : other.size;
int* result = new int[maxSize + 1];
for (int i = 0; i < maxSize; i++) {
int tmp = carry;
if (i < size) {
tmp += digits[size - i - 1];
}
if (i < other.size) {
tmp += other.digits[other.size - i - 1];
}
result[maxSize - i] = tmp % 10;
carry = tmp / 10;
}
if (carry != 0) {
result[0] = carry;
return BigInt(result, maxSize + 1);
} else {
return BigInt(result, maxSize);
}
}
// вспомогательный челоконстукт
BigInt(int* arr, int arrSize) {
size = arrSize;
digits = new int[size];
std::memcpy(digits, arr, size * sizeof(int));
}
// вывод числа на экран
void print() const {
for (int i = 0; i < size; i++) {
std::cout
Проблема заключается в том, что метод add() объявлен как метод класса, и он должен использовать поля объекта, а не передавать их как параметры. Кроме того, необходимо изменить конструктор с параметрами таким образом, чтобы он заполнял массив Arr введенными цифрами. Вот исправленный код:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
class Massiv {
private:
int* Arr; // массив цифр числа
int size; // размер массива цифр
public:
// Конструкторы
Massiv() {
size = 1;
Arr = new int[size];
Arr[0] = 0;
}
Massiv(int size)
{
this-> size = size;
Arr = new int[size];
for (int i = 0; i < size; i++) {
Arr[i] = 0;
}
}
Massiv(const Massiv& l) {
size = l.size;
Arr = new int[size];
for (int i = 0; i < size; i++) {
Arr[i] = l.Arr[i];
}
}
// Деструктор
~Massiv() {
delete[] Arr;
}
// Методы
Massiv add(const Massiv& k) {
int max_size = max(size, k.size);
int* result_Arr = new int[max_size + 1];
int V = 0;
for (int i = 0; i < max_size; i++) {
int sum = V;
if (i < size) {
sum += Arr[i];
}
if (i < k.size) {
sum += k.Arr[i];
}
result_Arr[i] = sum % 10;
V = sum / 10;
}
if (V > 0) {
result_Arr[max_size] = V;
max_size++;
}
Massiv result;
delete[] result.Arr;
result.Arr = result_Arr;
result.size = max_size;
return result;
}
void Zap()
{
int size;
cout << "Задайте размер массива" << endl;
cin >> size;
cout << "Заполните массив" << endl;
Arr = new int[size];
for (int i = 0; i < size; i++)
{
cin >> Arr[i];
}
this->size = size;
}
// Вывод числа на экран
void print() {
for (int i = size - 1; i >= 0; i--)
{
cout << Arr[i];
}
cout << endl;
}
};
int main() {
Massiv a;
a.Zap();
Massiv b;
b.Zap();
Massiv c;
c = a.add(b);
c.print();
return 0;
}
```
Теперь метод add() использует поля объекта, а не передаваемые параметры. Конструктор с параметрами корректно заполняет массив Arr введенными цифрами.
```cpp
#include <iostream>
#include <cstring>
using namespace std;
class Massiv {
private:
int* Arr; // массив цифр числа
int size; // размер массива цифр
public:
// Конструкторы
Massiv() {
size = 1;
Arr = new int[size];
Arr[0] = 0;
}
Massiv(int size)
{
this-> size = size;
Arr = new int[size];
for (int i = 0; i < size; i++) {
Arr[i] = 0;
}
}
Massiv(const Massiv& l) {
size = l.size;
Arr = new int[size];
for (int i = 0; i < size; i++) {
Arr[i] = l.Arr[i];
}
}
// Деструктор
~Massiv() {
delete[] Arr;
}
// Методы
Massiv add(const Massiv& k) {
int max_size = max(size, k.size);
int* result_Arr = new int[max_size + 1];
int V = 0;
for (int i = 0; i < max_size; i++) {
int sum = V;
if (i < size) {
sum += Arr[i];
}
if (i < k.size) {
sum += k.Arr[i];
}
result_Arr[i] = sum % 10;
V = sum / 10;
}
if (V > 0) {
result_Arr[max_size] = V;
max_size++;
}
Massiv result;
delete[] result.Arr;
result.Arr = result_Arr;
result.size = max_size;
return result;
}
void Zap()
{
int size;
cout << "Задайте размер массива" << endl;
cin >> size;
cout << "Заполните массив" << endl;
Arr = new int[size];
for (int i = 0; i < size; i++)
{
cin >> Arr[i];
}
this->size = size;
}
// Вывод числа на экран
void print() {
for (int i = size - 1; i >= 0; i--)
{
cout << Arr[i];
}
cout << endl;
}
};
int main() {
Massiv a;
a.Zap();
Massiv b;
b.Zap();
Massiv c;
c = a.add(b);
c.print();
return 0;
}
```
Теперь метод add() использует поля объекта, а не передаваемые параметры. Конструктор с параметрами корректно заполняет массив Arr введенными цифрами.
Илюха Бужерак
не работает выдает какие то большие цифры
Ошибка заключается в том, что в методе add() создается объект result типа Massiv, но его массив Arr не выделяется в памяти. Вместо этого происходит удаление неинициализированного массива Arr из объекта result, что приводит к ошибке. Чтобы исправить это, нужно сначала выделить память для массива Arr в объекте result перед его использованием. Это можно сделать, например, в конструкторе класса Massiv.
Вот исправленный код:
#include <iostream>
#include <cstring>
using namespace std;
class Massiv {
private:
int* Arr; // массив цифр числа
int size; // размер массива цифр
public:
// Конструкторы
Massiv() {
size = 1;
Arr = new int[size];
Arr[0] = 0;
}
Massiv(int size) {
this->size = size;
Arr = new int[size];
}
Massiv(const Massiv& l) {
size = l.size;
Arr = new int[size];
for (int i = 0; i < size; i++) {
Arr[i] = l.Arr[i];
}
}
// Деструктор
~Massiv() {
delete[] Arr;
}
// Методы
Massiv add(const Massiv& l,const Massiv& k) {
int max_size = max(l.size, k.size);
int* result_Arr = new int[max_size + 1];
int V = 0;
for (int i = 0; i < max_size; i++) {
int sum = V;
if (i < l.size) {
sum += l.Arr[i];
}
if (i < k.size) {
sum += k.Arr[i];
}
result_Arr[i] = sum % 10;
V = sum / 10;
}
if (V > 0) {
result_Arr[max_size] = V;
max_size++;
}
Massiv result(max_size);
for (int i = 0; i < max_size; i++) {
result.Arr[i] = result_Arr[i];
}
delete[] result_Arr;
return result;
}
void Zap() {
int size;
cout << "Задайте размер массива" << endl;
cin >> size;
cout << "Заполните массив" << endl;
for (int i = 0; i < size; i++) {
cin >> Arr[i];
}
this->size = size;
}
// Вывод числа на экран
void print() {
for (int i = size - 1; i >= 0; i--) {
cout << Arr[i];
}
cout << endl;
}
};
int main() {
Massiv a;
a.Zap();
Massiv b;
b.Zap();
Massiv c;
c = c.add(a, b);
c.print();
return 0;
}
Вот исправленный код:
#include <iostream>
#include <cstring>
using namespace std;
class Massiv {
private:
int* Arr; // массив цифр числа
int size; // размер массива цифр
public:
// Конструкторы
Massiv() {
size = 1;
Arr = new int[size];
Arr[0] = 0;
}
Massiv(int size) {
this->size = size;
Arr = new int[size];
}
Massiv(const Massiv& l) {
size = l.size;
Arr = new int[size];
for (int i = 0; i < size; i++) {
Arr[i] = l.Arr[i];
}
}
// Деструктор
~Massiv() {
delete[] Arr;
}
// Методы
Massiv add(const Massiv& l,const Massiv& k) {
int max_size = max(l.size, k.size);
int* result_Arr = new int[max_size + 1];
int V = 0;
for (int i = 0; i < max_size; i++) {
int sum = V;
if (i < l.size) {
sum += l.Arr[i];
}
if (i < k.size) {
sum += k.Arr[i];
}
result_Arr[i] = sum % 10;
V = sum / 10;
}
if (V > 0) {
result_Arr[max_size] = V;
max_size++;
}
Massiv result(max_size);
for (int i = 0; i < max_size; i++) {
result.Arr[i] = result_Arr[i];
}
delete[] result_Arr;
return result;
}
void Zap() {
int size;
cout << "Задайте размер массива" << endl;
cin >> size;
cout << "Заполните массив" << endl;
for (int i = 0; i < size; i++) {
cin >> Arr[i];
}
this->size = size;
}
// Вывод числа на экран
void print() {
for (int i = size - 1; i >= 0; i--) {
cout << Arr[i];
}
cout << endl;
}
};
int main() {
Massiv a;
a.Zap();
Massiv b;
b.Zap();
Massiv c;
c = c.add(a, b);
c.print();
return 0;
}
Илюха Бужерак
не работает выдает какие то большие цифры
#include <iostream>
#include <cstring>
using namespace std;
class Massiv {
private:
int* Arr; // массив цифр числа
int size; // размер массива цифр
public:
// Конструкторы
Massiv() {
size = 1;
Arr = new int[size];
Arr[0] = 0;
}
Massiv(int size) {
this->size = size;
Arr = new int[size];
}
Massiv(const Massiv& l) {
size = l.size;
Arr = new int[size];
for (int i = 0; i < size; i++) {
Arr[i] = l.Arr[i];
}
}
// Деструктор
~Massiv() {
delete[] Arr;
}
// Методы
Massiv add(const Massiv& k) {
int max_size = max(size, k.size);
int* result_Arr = new int[max_size + 1];
int V = 0;
for (int i = 0; i < max_size; i++) {
int sum = V;
if (i < size) {
sum += Arr[i];
}
if (i < k.size) {
sum += k.Arr[i];
}
result_Arr[i] = sum % 10;
V = sum / 10;
}
if (V > 0) {
result_Arr[max_size] = V;
max_size++;
}
Massiv result(max_size);
for (int i = 0; i < max_size; i++) {
result.Arr[i] = result_Arr[i];
}
delete[] result_Arr;
return result;
}
void Zap() {
int size;
cout << "Задайте размер массива" << endl;
cin >> size;
cout << "Заполните массив" << endl;
for (int i = 0; i < size; i++) {
cin >> Arr[i];
}
this->size = size;
}
// Вывод числа на экран
void print() {
for (int i = size - 1; i >= 0; i--) {
cout << Arr[i];
}
cout << endl;
}
};
int main() {
Massiv a;
a.Zap();
Massiv b;
b.Zap();
Massiv c = a.add(b);
c.print();
return 0;
}
#include <cstring>
using namespace std;
class Massiv {
private:
int* Arr; // массив цифр числа
int size; // размер массива цифр
public:
// Конструкторы
Massiv() {
size = 1;
Arr = new int[size];
Arr[0] = 0;
}
Massiv(int size) {
this->size = size;
Arr = new int[size];
}
Massiv(const Massiv& l) {
size = l.size;
Arr = new int[size];
for (int i = 0; i < size; i++) {
Arr[i] = l.Arr[i];
}
}
// Деструктор
~Massiv() {
delete[] Arr;
}
// Методы
Massiv add(const Massiv& k) {
int max_size = max(size, k.size);
int* result_Arr = new int[max_size + 1];
int V = 0;
for (int i = 0; i < max_size; i++) {
int sum = V;
if (i < size) {
sum += Arr[i];
}
if (i < k.size) {
sum += k.Arr[i];
}
result_Arr[i] = sum % 10;
V = sum / 10;
}
if (V > 0) {
result_Arr[max_size] = V;
max_size++;
}
Massiv result(max_size);
for (int i = 0; i < max_size; i++) {
result.Arr[i] = result_Arr[i];
}
delete[] result_Arr;
return result;
}
void Zap() {
int size;
cout << "Задайте размер массива" << endl;
cin >> size;
cout << "Заполните массив" << endl;
for (int i = 0; i < size; i++) {
cin >> Arr[i];
}
this->size = size;
}
// Вывод числа на экран
void print() {
for (int i = size - 1; i >= 0; i--) {
cout << Arr[i];
}
cout << endl;
}
};
int main() {
Massiv a;
a.Zap();
Massiv b;
b.Zap();
Massiv c = a.add(b);
c.print();
return 0;
}
Илюха Бужерак
нет все равно ошибка и цифра в результате наоборот
Artem Prikman
Извиняюсь
Похожие вопросы
- Помогите, пожалуйста, исправить ошибку в коде (C++).
- Помогите пожалуйста написать код.(C++)
- С++ Помогите пожалуйста исправить, дополнить код.
- Помогите пожалуйста написать код на c++, выводящий имя, фамилию и дату рождения нескольких человек
- Помогите пожалуйста написать код на C++
- Срочно!!! Помогите пожалуйста написать код к задачке на с++! Заранее спасибо!
- Помогите пожалуйста с кодом на с++
- Помогите пожалуйста с кодом....
- Помогите пожалуйста с кодом на с++
- Помогите пожалуйста ускорить код