![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Saint |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 1 Пол: Мужской Реальное имя: Владимир Репутация: ![]() ![]() ![]() |
Вот имеется такая задача:
1. Разработать класс "Большое десятичное число" в соответствии со следующим заданием: Состояние класса - Целое число определяется его длинной(кол-во цифр в числе, например, до 47) и массивом значений десятичных цифр (типа char).Число со знаком хранится в прямом коде.При выполнении арифметических операций использовать дополнительный код.Память под массив выделяется статистически,во время компиляции, и задается массивом фиксированного предельного размера. Протокол класса - Определяет возможности создания и инициализации экземпляров класса и правил их использования(методы класса). Предусмотреть следующие возможности: - пустой конструктор для инициализации экземпляров и массивов экземпляров класса по умолчанию - создание экземпляров класса с инициализацией значением целого длинного (типа long) - создание экземпляров класса с инициализацией значением числа как строки символов - ввод экземпляров из входного потока и вывод их значений в выходной поток (с помощью перегруженных операторов >> и <<) - получение дополнительного кода числа ((*) с помощью перегруженного оператора ~) - выполнение операций сложения и вычитания чисел с учетом знаков чисел (с помощью перегруженных операторов + и - ) - выполнение операций уменьшение числа в 10 раз (деление на 10 нацело) - выполнение увеличения числа в 10 раз Очень интересует реализация операторов операторов "+" и "-": как я понял класс хранит не только положительные числа...как правильно реализовать сложение и вычитание чисел с разными знаками данного класса? если бы без класса задача можно было бы использовать сравнение модулей а потом соотвественно из большего вычитать меньшее...можно ли в классе делать такие вещи если условием не оговорено? Что такое прямой код и дополнительный код? Я попытался написать класс,но очевидно блин вышел комом, при компиляции ошибок не выдает,но просто огромное кол-во предупреждений,использовал лицензию Visual Studio 2005 C++. Код class number{ private: int size; private: char value[47]; // конструкторы public:number(long i); public:number(char *buf); public:number(); // вывод+ ввод void operator << (number b){ cout<< b.value << endl; return; } void operator >> (number &b){ long i=0; char buf[47]; cin>> i value[0]=0; sprintf(buf,"%i",i); if (i>0) { value[0]='+'; value[1]=0; } strcat(value,buf); size=strlen(value); b.size=strlen(b.value); return; } // сложение + вычитание number operator + (number b){ int i,max; number c; bool b1=false; char strok1[47],strok2[47]; char sign=0; if (this->size<b.size) { max=b.size; }else { max=this->size; } strcpy(strok1,value); strcpy(strok2,b.value); //это чтобы при сравнении строк убрать знаки sign=strok1[0]; strok1[0]=1; strok2[0]=1; // определим какая строка больше if (cmp(strok1,strok2)<0) { strcpy(strok2,value); strcpy(strok1,b.value); sign=strok1[0]; } invers(strok1); invers(strok2); if (b.value[0]==this->value[0]){ for (i=0;i!=max-1;i++) { c.value[i]=0; if (i>=strlen(strok1)-1) { strok1[i]='0'; strok1[i+1]=0; } if (i>=strlen(strok2)-1) { strok2[i]='0'; strok2[i+1]=0; } c.value[i]=strok1[i]+strok2[i]-'0'; if (b1==true) { c.value[i]=c.value[i]+1; b1=false; } if (c.value[i]-'0'>=10) { b1=true; c.value[i]=c.value[i]-10; } } if (b1==true) { c.value[i]='1'; max++; } c.value[max-1]=value[0]; c.value[max]=0; invers(c.value); c.size=strlen(c.value); return c; }else{ // над алгоритмом думал много for (i=0;i!=max-1;i++){ c.value[i]=0; if (i>=strlen(strok1)-1) { strok1[i]='0'; strok1[i+1]=0; } if (i>=strlen(strok2)-1) { strok2[i]='0'; strok2[i+1]=0; } //int k=0; c.value[i]=strok1[i]-strok2[i]; if (b1==true) { c.value[i]=c.value[i]-1; b1=false; } if (c.value[i]<0) { b1=true; c.value[i]=10+c.value[i]+'0'; }else { c.value[i]=c.value[i]+'0'; } } if (c.value[i-1]=='0') { i--; } c.value[i]=sign; c.value[i+1]=0; invers(c.value); c.size=strlen(c.value); } return c; } number operator - (number b){ // просто поменяем знаки и сложим if (b.value[0]=='+') { b.value[0]='-'; }else { b.value[0]='+'; } return *this + b; } void operator = (number b){ strcpy(value,b.value); size=b.size; return; } void multen(){ value[size]='0'; size++; value[size]=0; return; } void divten(){ if (size==2) { value[size-1]='0'; return; } value[size-1]=0; size--; } }; |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 15:17 |