Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 25.12.2013
Сообщений: 12

Реализация класса "Число в строковой записи"

17.12.2015, 18:45. Показов 625. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!

Имеется задание реализовать класс "Число произвольной размерности в строковой записи"
То есть очень большие числа в виде строк. Нужно перегрузить существующие операторы (+, -, <, > и т. д.)
Но я запутался уже с первым +
C++
1
2
3
4
5
6
7
8
9
class Strch 
{
private: 
    char *chislo;
public: 
    Strch(void);
    Strch(char *strch_chislo);
    Strch operator + (const Strch &a2) const;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include "class.h"
using namespace std;
 
Strch::Strch(char *strch_chislo)
{
    chislo = strch_chislo;
 
};
Strch Strch::operator+(const Strch& a2) const {
    Strch result;
 
    
 
};
Я нашел вот такой способ реализации сложения двух длинных чисел лежащих в строках
Но как мне это в перегрузке плюса реализовать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    int l, la, lb;
    char *a = "12";
    char *b = "130";
    char *c;
    la = strlen(a);
    lb = strlen(b);
    l = (la > lb) ? la : lb;
    l++;
    c = (char *)malloc(l + 1);
        memset(c, ' ', 1);
    c[l] = '\0';
    int z = 0;  // ? ???
    for (int i = 1; i <= l; i++) {
        int a1 = (i>la) ? 0 : a[la - i] - '0';
        int b1 = (i>lb) ? 0 : b[lb - i] - '0';
        int c1 = a1 + b1 + z;
        c[l - i] = '0' + c1 % 10;
        z = c1 / 10;
    }
    cout << c << endl;
Не могу понять минимум, как мне узнать длину строки уже моего класса Strch, так как strlen естественно работает только со стандартным типом
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2015, 18:45
Ответы с готовыми решениями:

Супер длинные вычисления(число в строковой записи)
Подскажите как реализовать супер длинные вычисления(число в строковой записи) на С++ . Уже несколько дней написать не могу.

Создание экземпляра класса, имя класса находиться в строковой переменной
Подскажите люди добрые, как можно выйти из такой ситуации, вот допустим имеются классы class new1{ . . . } class new2{ . . ...

Как инициализировать строковой член класса?
Доброго времени. Подскажите, пожалуйста, как инициализировать строковую переменную класса, используя конструктор? #include...

5
236 / 75 / 24
Регистрация: 12.05.2010
Сообщений: 216
17.12.2015, 18:50
Можно добавить метод Length, который будет возвращать strlen(chislo)

C++
1
2
3
4
5
6
7
8
9
10
class Strch 
{
private: 
    char *chislo;
public: 
    Strch(void);
    Strch(char *strch_chislo);
    Strch operator + (const Strch &a2) const;
    int length();
};
C++
1
2
3
4
5
#include "class.h"
using namespace std;
int Strch::length() {
   return strlen(chislo);
}
1
1 / 1 / 0
Регистрация: 25.12.2013
Сообщений: 12
17.12.2015, 19:04  [ТС]
Цитата Сообщение от Tyoma Посмотреть сообщение
Можно добавить метод Length, который будет возвращать strlen(chislo)

C++
1
2
3
4
5
6
7
8
9
10
class Strch 
{
private: 
    char *chislo;
public: 
    Strch(void);
    Strch(char *strch_chislo);
    Strch operator + (const Strch &a2) const;
    int length();
};
C++
1
2
3
4
5
#include "class.h"
using namespace std;
int Strch::length() {
   return strlen(chislo);
}
Сейчас попробую, спасибо.
А еще вопрос, когда я перегружаю "+" мне нужно два параметра передавать, то есть a1 и a2, чтобы их сложить или как?

Добавлено через 6 минут
Добавил метод, но по предложенному примеру мы не передаем параметров, а следовательно не знаем длину какого числа(Strch) мы хотим узнать.
Я имею в виду как потом писать
C++
1
la = Length(a);
0
236 / 75 / 24
Регистрация: 12.05.2010
Сообщений: 216
18.12.2015, 11:22
Эти методы объекта, те length будет вызываться следующим образом для вашего примера.
C++
1
la = a.Length();
либо
C++
1
la = a->Length();
в зависимости от a, если указатель на объект то второй вариант.
В сложении вам нужно использовать this->chislo и складывать с a2.chislo
1
1 / 1 / 0
Регистрация: 25.12.2013
Сообщений: 12
18.12.2015, 15:40  [ТС]
А еще, мне для реализации такого сложения нужно брать символ по индексу, если бы был char, то там a[la-i] брали
То есть мне нужно перед этим перегрузить [] для Strch?
Набросал такой вариант, но знаю, что неправильно. Что изменить?
C++
1
Strch operator [] (int i);
Strch Strch::operator[](int i){
return chislo[i];
}
0
33 / 33 / 21
Регистрация: 26.10.2015
Сообщений: 94
18.12.2015, 17:44
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
#include <iostream>
#include <cstring>
 
class Strch
{
private:
    char *chislo;
public:
    Strch(int);
    Strch(char*);
    Strch operator+(const Strch&) const;
    int Lenght()const;
    void print()const;
};
 
Strch::Strch(int L)
{
    chislo = new char[L];
    for(int i = 0; i < L; i++)
        chislo[i] = '\0';
}
 
void Strch::print() const
{
    std::cout << chislo << std::endl;
}
 
Strch::Strch(char* ch)
{
    chislo = new char[strlen(ch)];
    for(int i = 0; i < strlen(ch); i++)
        chislo[i] = ch[i];
}
 
int Strch::Lenght() const
{
    return strlen(chislo);
}
 
Strch Strch::operator+(const Strch& right)const
{
    int Lenght1 = Lenght(), Lenght2 = right.Lenght();
    int LenLong = (Lenght1 > Lenght2 ? Lenght1 : Lenght2), over = 0;
    static Strch temp(LenLong);
    for(int i = 0; i < LenLong; i++)
    {
        int num1 = i > Lenght1 ? 0 : chislo[Lenght1 - 1 - i] - '0';
        int num2 = i > Lenght2 ? 0 : right.chislo[Lenght2 - 1 - i] - '0';
        temp.chislo[LenLong - 1 - i] = (num1 + num2 + over)%10 + '0';
        over = (num1 + num2 + over)/10;
    }
    if(over)
    {
        static Strch temp_over = (LenLong + 1);
        temp_over.chislo[0] = over + '0';
        for(int i = 0; i < LenLong; i++)
            temp_over.chislo[i + 1] = temp.chislo[i];
        return temp_over;
    }
    return temp;
}
 
 
using namespace std;
 
int main()
{
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.12.2015, 17:44
Помогаю со студенческими работами здесь

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

Правильно ли создавать объект задавая имя класса в строковой переменной?
Доброго времени суток! Рассматриваю такую ситуацию. Есть, например, класс UserName. Правильно ли создавать объект в такой способ? ...

Составить функцию замены одной строковой конструкции другой строковой конструкцией.
Дана такая задача: Составить функцию замены одной строковой конструкции другой строковой конструкцией. Метод должен работать по аналогии...

Создание объекта класса, если его имя находится в строковой перменной.
Как создать объект класса, если его имя находится в строковой перменной, скажем, было считано из файла?

Реализация generic класса и метода(в зависимости от передаваемого типа(другого класса)
Задание: Создать generic класс что позволяет в зависимости переданного типа (другого класса) создать файл с расширением cs где будет...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru