Форум программистов, компьютерный форум CyberForum.ru

Число представляется массивом, каждый элемент которого – цифра - C++

Восстановить пароль Регистрация
 
StriBog45
5 / 5 / 2
Регистрация: 03.09.2013
Сообщений: 80
11.12.2013, 13:12     Число представляется массивом, каждый элемент которого – цифра #1
Задание: Создайте абстрактный базовый класс Integer (целое) с виртуальными арифметическими операциями и функцией вывода на экран. Определите производные классы Decimal (десятичное) и Binary (двоичное), реализующие собственные арифметические операции и функцию вывода на экран. Число представляется массивом, каждый элемент которого – цифра.

Во всём этом задании меня смущает строка: Число представляется массивом, каждый элемент которого – цифра.
Спрашивал у преподавателя, он сказал, что это длинная арифметика и послал гуглить...

Нашёл вот такую тему: Длинная арифметика на Си
Почитал пять страничек, глаза на лоб полезли. -_-
В общем может быть это не обязательно длинная арифметика, идеи нужны.

На данный момент моя программа выглядит вот так:
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
#include "stdafx.h"
#include <iostream>
#include <locale>
 
class Integer // целое
{
public:
    int G;
    virtual void Sum(Integer *)=0; // Сумма || Чисто виртуальная функция
    virtual void Subtraction(Integer *)=0; // Вычитание
    virtual void Multiplication(Integer *)=0; // Умножение
    virtual void Div(Integer *)=0; // Деление
    virtual void Mod(Integer *)=0; // Остаток от деления
    virtual void print()=0; // Вывод
};
 
class Decimal: public Integer // Десятичное
{
    void Sum(Integer *);
    void Subtraction(Integer *);
    void Multiplication(Integer *);
    void Div(Integer *);
    void Mod(Integer *);
    void print()=0;
};
class Binary: public Integer // Двоичное
{
    void Sum(Integer *);
    void Subtraction(Integer *);
    void Multiplication(Integer *);
    void Div(Integer *);
    void Mod(Integer *);
    void print();
};
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"Russian");
    system("PAUSE");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2013, 13:12     Число представляется массивом, каждый элемент которого – цифра
Посмотрите здесь:

Получите вектор b, каждый элемент которого есть количество различных чисел в строках матрицы C++
C++ Сформировать одномерный массив, каждый элемент которого равен наибольшему по модулю элементу
C++ Работа с массивом. Ввести число x и продублировать каждый элемент массива, превосходящий x
Сформировать вектор ., каждый элемент которого представляет собой среднее арифметическое C++
Создать двумерный массив, каждый элемент которого задается случайным образом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 31
11.12.2013, 13:31     Число представляется массивом, каждый элемент которого – цифра #2
Я так понял что проблема в преобразовании массива в число? или как? если да то есть функция atoi(массив) c библиотеки cstdlib (stdlib.h), преобразовывает массив в инт. Для длинной арифметики не покатет, но если число в инт влезет то норм.
StriBog45
5 / 5 / 2
Регистрация: 03.09.2013
Сообщений: 80
11.12.2013, 19:29  [ТС]     Число представляется массивом, каждый элемент которого – цифра #3
Цитата Сообщение от Bino321 Посмотреть сообщение
Я так понял что проблема в преобразовании массива в число? или как? если да то есть функция atoi(массив) c библиотеки cstdlib (stdlib.h), преобразовывает массив в инт. Для длинной арифметики не покатет, но если число в инт влезет то норм.
Но оно преобразует только в int, а мне нужно в пользовательский тип и работать с ним

Добавлено через 3 часа 59 минут
Восстание темы.
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 31
11.12.2013, 19:47     Число представляется массивом, каждый элемент которого – цифра #4
Ну так преобразуй в инт, а потом передай это значение объекту класса
StriBog45
5 / 5 / 2
Регистрация: 03.09.2013
Сообщений: 80
11.12.2013, 20:59  [ТС]     Число представляется массивом, каждый элемент которого – цифра #5
Цитата Сообщение от Bino321 Посмотреть сообщение
Ну так преобразуй в инт, а потом передай это значение объекту класса
Цифры после запятой в этом случаи потеряются.
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 31
11.12.2013, 22:33     Число представляется массивом, каждый элемент которого – цифра #6
Я думал у тебя будут целые числа... В таком случае есть функция atof(). Преобразовует массив в флоат. Потесть ее, но я пробывал у меня она через раз работала. А можна попробывать самому сделать подобную функцию. Както так:
1)создай массив, в который, из начального массива, перекинь цифры до запятой
2)создай второй массив, в который перекинь числа после запятой
3)переконвертируй оба массива в инт
4)переконвертируй оба полученых в 3 пункте инта в дабл или флоат
5)раздели флоат, в котором число из массива из пункта 2, на 10 в степене n, где n-количество элементов массива из пункта 2.
6)сложи этот флоат с тем, в котором число из целой части массива.
З.Ы. Алгоритм не тестил (только что придумал)
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
11.12.2013, 22:44     Число представляется массивом, каждый элемент которого – цифра #7
Цитата Сообщение от StriBog45 Посмотреть сообщение
Во всём этом задании меня смущает строка: Число представляется массивом, каждый элемент которого – цифра.
это значит что число например 1234
будет выглядеть так
arr[0]=4
arr[1]=3
arr[2]=2
arr[3]=1
это новый тип, пользовательский, и для него придется переопределить все арифметические операции и что там еще есть у int
разрядность твоего числа будет зависеть только от размера массива

вот так можно например реализовать сложение
arr1[0]=(arr2[0]+arr3[0])%10
arr1[1]=(arr2[1]+arr3[1]+1 если предыдущий результат больше 10)%10
arr1[2]=(arr2[1]+arr3[1]+1 если предыдущий результат больше 10)%10
arr1[3]=(arr2[1]+arr3[1]+1 если предыдущий результат больше 10)%10
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 31
11.12.2013, 22:53     Число представляется массивом, каждый элемент которого – цифра #8
Аааа... так... Я подумал что просто входные данные задаются как массив...
StriBog45
5 / 5 / 2
Регистрация: 03.09.2013
Сообщений: 80
12.12.2013, 20:32  [ТС]     Число представляется массивом, каждый элемент которого – цифра #9
Цитата Сообщение от ValeryS Посмотреть сообщение
это значит что число например 1234
будет выглядеть так
arr[0]=4
arr[1]=3
arr[2]=2
arr[3]=1
это новый тип, пользовательский, и для него придется переопределить все арифметические операции и что там еще есть у int
разрядность твоего числа будет зависеть только от размера массива

вот так можно например реализовать сложение
arr1[0]=(arr2[0]+arr3[0])%10
arr1[1]=(arr2[1]+arr3[1]+1 если предыдущий результат больше 10)%10
arr1[2]=(arr2[1]+arr3[1]+1 если предыдущий результат больше 10)%10
arr1[3]=(arr2[1]+arr3[1]+1 если предыдущий результат больше 10)%10
Если честно, то всё равно это как-то сложно представить реализацию. С начала нужно узнать количество разрядов в числе, после видимо делить на десятки, но тогда у нас в этом же числе останется 123,4 ( после запятой от цифр можно избавиться с помощью преобразования типов), а нам нужно только одно. Можно идти с другой стороны, 1234 / 1000 тогда будет 1,234 , хорошо, но в следующей разряде 1234 / 100 уже получится 12,34 , что нам не подходит. Вообще вроде бы есть в библиотеке string функция для считывания символа мгновенно, возможно так получится брать цифры по одной, но что если пользователь захочет стереть последнею нажатую им цифру?
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
12.12.2013, 22:19     Число представляется массивом, каждый элемент которого – цифра #10
вот пример
для целочисленного числа
C++
1
2
3
4
5
6
int k=0;
do
{
  k++;
  n/=10;
}while(n);
теперь выделяем массив
C++
1
int arr*=new int[k];
и заполняем массив
C++
1
2
for(int i=0;i<k;i++, n/=10)
   arr[i]=n%10;
после первого цикла n испортится значит её нужно сохранить где то а потом восстановить
если у тебя массив фиксированного размера то первые два шага можно выбросить и сразу заполнять
C++
1
2
for(int i=0;n;n/=10;i++)
   arr[i]=n%10;
Добавлено через 5 минут
Цитата Сообщение от StriBog45 Посмотреть сообщение
Вообще вроде бы есть в библиотеке string функция для считывания символа мгновенно, возможно так получится брать цифры по одной, но что если пользователь захочет стереть последнею нажатую им цифру?
если у тебя входной стринг то все упрощается
C++
1
2
3
4
5
6
int size=str.len();
int *arr =new int[size];
for(int i=0;i<size;i++)
  arr[i]=0;
for(int i=0;i<size;i++)
   arr[i]=str[size-1-i]-'0';
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2013, 19:56     Число представляется массивом, каждый элемент которого – цифра
Еще ссылки по теме:

C++ Сформировать массив, каждый элемент которого равен суме элементов соответствующего столбца матрицы
Сформировать массив, каждый элемент которого является суммой отрицательных элементов строк матрицы C++
C++ Сформировать массив каждый элемент которого это среднее арифметическое элементов исходного массива

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

Или воспользуйтесь поиском по форуму:
StriBog45
5 / 5 / 2
Регистрация: 03.09.2013
Сообщений: 80
15.12.2013, 19:56  [ТС]     Число представляется массивом, каждый элемент которого – цифра #11
Примерно вот так я это понял. В while какое-то не понятное условие стоит, а если быть точнее его вообще нет. Просто переменная.)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    int k=0,n,g;
    cout << "Введите число: ";
    cin >> n;
    g = n;
    do // Узнаём длинну числа
    {
        k++; // Счётчик длинны
        n/=10; // Отбрасываем по разряду
    }while(n);
    n = g;
    int *arr=new int [k]; // выделяем память
    for(int i=0;i<k;i++, n/=10)
    {
        arr[i]=n%10;
    }
    delete [] arr;
Цитата Сообщение от ValeryS Посмотреть сообщение
arr1[0]=(arr2[0]+arr3[0])%10
arr1[1]=(arr2[1]+arr3[1]+1 если предыдущий результат больше 10)%10
arr1[2]=(arr2[1]+arr3[1]+1 если предыдущий результат больше 10)%10
arr1[3]=(arr2[1]+arr3[1]+1 если предыдущий результат больше 10)%10
Вот эта часть мне не совсем понятно, точнее я знаю что здесь подразумевается, но это не код. Под 1,2,3 понятно что будет цикл для i, но как прибавлять нужное количество массивов для числа(то что есть счётчик k я помню)

Добавлено через 7 часов 13 минут
Тема вверх.

Добавлено через 21 час 12 минут
Тема вверх.

Добавлено через 4 часа 5 минут
И снова.
Yandex
Объявления
15.12.2013, 19:56     Число представляется массивом, каждый элемент которого – цифра
Ответ Создать тему
Опции темы

Текущее время: 12:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru