Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Доработка программы 
V
    Опции темы
Kernigan
Дата 25.6.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 18.6.2006

Репутация: нет
Всего: нет



Уважаемые участники форума

Здесь представлена программа, преобразующая двоичное число в десятичное. Программа работоспособная, компилировалась в KDeveloper, но далека от совершенства. Помогите, пожалуйста, довести её до "ума", с использованием инструментов C++.

Буду очень благодарен.

Код

#include<iostream>
//========================================================================
#define SIZE 16
//========================================================================

class CBinaryNumbers {
    char *p;                        // pointer to the beginning of the array
    char bin[SIZE];                 // the image of binary number 
    int dec;                         // decimal number 
    int i;                             // number i the category of binary number 
    int v;                             // weight  i of the caqtegory of binary number
public:
                   // constructor and destructor
    CBinaryNumbers(int num);        // initialize constructor
    CBinaryNumbers();                    // null constructor
    virtual ~CBinaryNumbers();   
    //CBinaryNumbers(const & ob);   // copy constructor 

    void todecimal(char *bin);
    int show();


};
 //============================================================

 inline CBinaryNumbers::CBinaryNumbers(int num)
 {
    p = new char [num];
    if(!p)  {
     std::cout << "Erorr memory\n";
     exit(1);
     }
    
   bin [SIZE] = num;
   dec = 0;
   v = 1;

 }
 //=================================================================

  inline CBinaryNumbers::~CBinaryNumbers()
  {
     if(p)
    delete [] p;
  }
 //=================================================================

 inline void CBinaryNumbers::todecimal(char *bin)
 {
   for ( i = strlen(bin) -1; i >= 0; i --)
   {
    if ( bin[i] == '1')
   dec += v;
    v *= 2;
   }
   
 }
 //================================================================
 inline int CBinaryNumbers::show() { return dec; }

 //=================================================================
 
 int main()
 {
    CBinaryNumbers b(16);
    int i = 0;
    char arr[8];
    std::cout << "enter eight- digit binary number ”;
    do {
      std::cin >> arr[i++];
    } while ( i< 8);

    b.todecimal(arr);
    std::cout << Decimal number :" << b.show();
    return 0;
  } 

 
PM MAIL   Вверх
MAKCim
Дата 25.6.2006, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 6
Всего: 207



зачем привязка класса к потокам стандартной библиотеки?
зачем виртуальный деструктор?
зачем #define?
Цитата

Код

 if(!p)  {
     std::cout << "Erorr memory\n";
     exit(1);
     }


по стандарту при невозможности выделения памяти генерируется bad_alloc
так что лучше перехватывать (если нужно) исключение
Код

catch (std::bad_alloc) {...}

Цитата

Код

 for ( i = strlen(bin) -1; i >= 0; i --)


с точки зрения оптимизации лучше в цикле strlen не вызывать
Цитата

Код

 if(p)
    delete [] p;


проверка лишняя (опять оптимизация), применение delete к нулевому указателю - не ошибка по стандарту!
Цитата

Код

bin [SIZE] = num;


выход за диапозон (индексация с 0) + ошибка компиляции (преобразование из int в char). Вообще что ты этим хотел сказать? 
наверное так
Код

size_t index=SIZE;
while (num) bin[--index]=num%10+48, num/=10;
while (index>=0) bin[index--]='0'; 
 

Это сообщение отредактировал(а) MAKCim - 25.6.2006, 15:56


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Oleg_Ci
Дата 26.6.2006, 05:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Вот-так работает, вроде без ошибок.
Код

#include<iostream>
#include <string.h>
using namespace std;

const int num = 16;
class CBinaryNumbers
{
    char *p;                 // the image of binary number
    int dec, v, i;                         // decimal number
public:
    CBinaryNumbers(char *c);        // initialize constructor
    //CBinaryNumbers();                    // null constructor
    ~CBinaryNumbers();
    void todecimal(char *bin);
    int show();
};
 //============================================================
CBinaryNumbers::CBinaryNumbers(char *c)
{
  p = new char [num+1];
  if(!p) exit(1);
  strncpy(p,c,num);
  p[num+1]='\0';
  dec = 0;
  v = 1;
  todecimal(p);
 }
 //=================================================================    
CBinaryNumbers::~CBinaryNumbers()
{
  delete [] p;
}
 //=================================================================
void CBinaryNumbers::todecimal(char *bin)
{
  for ( i=strlen(bin)-1; i>=0; i-- )
  {
    if ( bin[i] == '1')
    dec += v;
    v *= 2;    
  }
}
 //================================================================
int CBinaryNumbers::show() { return dec; }
 //=================================================================

int main()
{
  char *Bin;
  while(1)
  {
    cout<<"Bin ('end'-exit) ->";
    cin>>Bin;
    if (Bin[0]=='a') return 0;
    CBinaryNumbers b_d(Bin);
    cout<<b_d.show()<<endl;
  }
  return 0;
}
  

Это сообщение отредактировал(а) Олег4 - 26.6.2006, 05:55
PM MAIL   Вверх
Rockie
Дата 26.6.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



Цитата(Олег4 @  26.6.2006,  05:42 Найти цитируемый пост)
using namespace std;    
const int num = 16;


Цитата(Олег4 @  26.6.2006,  05:42 Найти цитируемый пост)
CBinaryNumbers::CBinaryNumbers(char *c)    
{    
  p = new char [num+1];


здесь в методе класса используется глобальная переменная. ее надо занести в класс и инициализировать в конструкторе.

Цитата(Rockie @  26.6.2006,  10:49 Найти цитируемый пост)
здесь в методе класса

то есть в конструкторе


  

Это сообщение отредактировал(а) Rockie - 26.6.2006, 10:53


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Rockie
Дата 26.6.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



да и вообще, такая конструкция
Цитата(Олег4 @  26.6.2006,  05:42 Найти цитируемый пост)
 p = new char [num+1];

выглядит нелогично. то есть указывается
Цитата(Олег4 @  26.6.2006,  05:42 Найти цитируемый пост)
const int num = 16;

но в то же время память выделяется под 17 элементов. 

функции лучше писать с большой буквы, но это опять же стиль.


 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Oleg_Ci
  Дата 26.6.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Rokie, я сам пытаюсь отвечать на вопросы ради тренировки, сам ещё недавно начал учить С++. А то, что глобальная перем.  num должна быть в нутри класса, это вроде правильно, а то что p = new char [num+1];   выделяет 17 элементов это я для символа '\0' (конец строки)  зарезервировал, хотя смотрю сейчас на программу, вижу что этого ненадо. Если только надо-будет вывести число в двоичном формате, как его ввели, тогда нужна строка завершонная '\0',  ведь 16 символов для десятичного числа int16(в dos) как я понял.
Вот переделал, работает с 30 разрядами, почему-то с 32 разрядами long не пашет.   smile 
Чтоб проблем небыло работает не с char  а со,  string
Код

#include<iostream>
#include <string.h>
using namespace std;

class CBinaryNumbers
{
private:
    string str;                 // the image of binary number
    int v, i;
    unsigned long dec;          // 30 разрядное десятичное число
public:
    CBinaryNumbers(string s);        // initialize constructor
    CBinaryNumbers() {};                    // null constructor
    void ToDecimal();
    long ShowDec();
    long ShowDec(string s);
    string ShowBin();
};
 //============================================================
CBinaryNumbers::CBinaryNumbers(string s)
{
  str = string(s,0,30);
  ToDecimal();
 }
 //=================================================================
void CBinaryNumbers::ToDecimal()
{
  dec = 0;
  v = 1;
  for ( i=str.length()-1 ; i>=0; i-- )
  {
    if ( str[i] == '1')
    dec += v;
    v *= 2;    
  }
}
 //================================================================
long CBinaryNumbers::ShowDec() { return dec; }
 //=================================================================
string CBinaryNumbers::ShowBin() { return str;}
//=================================================
long CBinaryNumbers::ShowDec(string s)
{ // перегруженный  ShowDec()
  str = string(s,0,30);
  ToDecimal();
  return dec;
}
//===================================================
int main()
{
  CBinaryNumbers bb;
  string Bin;
  while(1)
  {
    cout<<"Bin ('end'-exit) ->";
    cin>>Bin;
    if (Bin=="end") break;
    cout<<bb.ShowDec(Bin)<<endl;
    cout<<bb.ShowBin()<<endl<<endl;
  }
  return 0;
}
 
PM MAIL   Вверх
Kernigan
Дата 26.6.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 18.6.2006

Репутация: нет
Всего: нет



Цитата

Вот переделал, работает с 30 разрядами...


Хорошее решение, сам бы не догадался.
В функции 
Цитата

main()
 
очевидно, следует добавить обработку  на нажатие клавишь от 2 до 9, а также, выход за 30 разрядов. А деструктор, я так полагаю, здесь неуместен или его можно включить? 
PM MAIL   Вверх
Oleg_Ci
Дата 27.6.2006, 03:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Цитата
 А деструктор, я так полагаю, здесь неуместен или его можно включить? 

Память оператором new  невыделяем, и delete ненадо, а без delete деструктор необязателен. Вот выдумал как с ошибками работать.
Код

#include<iostream>
#include <string.h>
using namespace std;

class CBinaryNumbers
{
private:
    string str;                 // двоичное число
    int v, i;
    unsigned long dec;          // 30 разрядов для десятич числа

    void ToDecimal();
    void SetBin(string s);
public:
    int Error;            // код ошибки
    string Errors;       // описание ошибки
    int Errno(string s);   // обработка ошибок ввода
    CBinaryNumbers(string s);        // initialize constructor
    CBinaryNumbers() {};                    // null constructor
    long ShowDec();
    long ShowDec(string s);
    string ShowBin();

};
 //============================================================
CBinaryNumbers::CBinaryNumbers(string s)
{
  Errno(s);
 }
 //=================================================================
void CBinaryNumbers::ToDecimal()
{
  dec = 0;
  v = 1;
  for ( i=str.length()-1 ; i>=0; i-- )
  {
    if ( str[i] == '1')
    dec += v;
    v *= 2;
  }
}
 //================================================================
long CBinaryNumbers::ShowDec() { return dec; }
 //=================================================================
string CBinaryNumbers::ShowBin() { return str;}
//=================================================
long CBinaryNumbers::ShowDec(string s)
{ // перегруженный ShowDec()
  Errno(s);
  return dec;
}
//==================
int CBinaryNumbers::Errno(string s)
{
  Error = 0;    // 0  "OK"
  Errors = "OK";
  if(s.length()>30) {Error=1; Errors="Error 1 :string.lengt>30 ";}// 1
  else
  {
  for ( i=0; i<s.length(); i++ )
    if ( s[i] !='1' && s[i] != '0' )
      {Error=2; Errors="Error 2 :string no bin - ";Errors+=s[i];break;}    // 2
  }
  str = string(s,0,30);
  ToDecimal();
  return Error;
}
//=====================================================
int main()
{
  CBinaryNumbers bb;
  string Bin;
  while(1)
  {
    cout<<"Bin ('end'-exit) ->";
    cin>>Bin;
    if (Bin=="end") break;
    if(bb.Errno(Bin)!=0) { cout<<bb.Errors<<endl<<endl; continue; }
    cout<<"Dec > "<<bb.ShowDec()<<endl;
    cout<<"Bin > "<<bb.ShowBin()<<endl<<endl;
  }
  return 0;
}
 
PM MAIL   Вверх
Kernigan
Дата 27.6.2006, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 18.6.2006

Репутация: нет
Всего: нет



Реализация этого класса очень понравилась. Спасибо. Обработка ошибок реализована удачно. Лучше не придумаешь.

По аналогии этого класса попытался сделась другой, переводящий из дясятичных в двоичные: вот что получилось.

Код

#include<iostream>
#include <string.h>
using namespace std;

class CDecimalNumbers {
private:
    int v, i;
    long dec;                                        // decimal number
    void ToBinary();
public:
    CDecimalNumbers(long dnum);        // initialize constructor
    CDecimalNumbers() {};                    // null constructor
    long ShowDec();
    //long ShowBin(string s);
    void ShowBin();
};
//=========================================================
CDecimalNumbers::CDecimalNumbers(long dnum)
{
  dec = dnum;
  v = 128;
}  
 //=============================================================
  long CDecimalNumbers::ShowDec() {return dec;}
 //=============================================================
  void CDecimalNumbers::ShowBin()  { ToBinary();  }
//=============================================================
void CDecimalNumbers::ToBinary()
{
  for ( i =1; i <= 8; i ++)
  {
    if (dec >= v)
    {
     cout << '1';
     dec -= v;
    }
    else
     cout << '0';
  }
}
//========================================================  

int main()
{
 CDecimalNumbers dd;
 long Dec;
 while (1)
 {
  cout << "Dec (end -> exit) ->";
  cin >> Dec;
  
 ...
   }
   return 0;
 }       

 


  
PM MAIL   Вверх
Oleg_Ci
Дата 28.6.2006, 04:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Можно-было сообразить один класс конвертации из десятич. в двоичную и обратно. 
PM MAIL   Вверх
Kernigan
Дата 28.6.2006, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 18.6.2006

Репутация: нет
Всего: нет



Здравствуй Олег

Выбор такого способа реализации операций из 2 -> 10 и наоборот, не случаен. Таким образом я хочу реализовать механизм наследования. Эти два класса будут потомками класса, который, также, будет реализовывать другие мат. операции.
Согласен, что проще было бы создать
Цитата

один класс конвертации из десятич. в двоичную и обратно

и много ещё чего придумать в нём, но кто после этого будет, к примеру, разбираться в этом коде и уж тем более сопровождать его. Как мне кажется, с точки зрения стилистики С++, такой код будет нечитабельным. 
По крайней мере, так меня учили SoftWare Designer'ы 
PM MAIL   Вверх
Oleg_Ci
Дата 29.6.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Кстати, есть библиотечные функции для преоброзования десятичных чисел в любые с основанием от 2 до 32, т.е. двоичные, третичные и т.д...
В книге написано что itoa работает с int16, а программа с long пашет. 
Про библиотечные функции перевода двоичных чисел в десятичные не слышал.
Код

#include <iostream.h>
#include<stdlib.h>  // для itoa

// это для определения максимального значения типов данных
#include <limits.h>

using namespace std;

int main(int argc, char* argv[])
{
  unsigned long n = ULONG_MAX; // максимальное значение для 32 bit
  cout<<n<<endl;
  char c[65];
  itoa(n,c,2);      // работает с 32 bit !!!  (У меня)
  cout<<c<<endl<<endl;    //  выводим двоичное значение

  unsigned long long ll = _UI64_MAX; // max 64 bit ,или unsigned __int64
  cout<<ll<<endl;
  _i64toa( ll,c,2);    // переводим в двоичное
  cout<<c<<endl<<endl;

  cin.get();
  return 0;
}
Цитата
По крайней мере, так меня учили SoftWare Designer'ы 
А это что такое, и где находится и инете ?
Кстати, чтоб class CBinaryNumbers возвращал 32 бит десятич число то функции тоже объяви unsigned long а не просто long, а если 64 разряда надо то unsigned long long  или unsignt __int64. 
PM MAIL   Вверх
Kernigan
Дата 29.6.2006, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 18.6.2006

Репутация: нет
Всего: нет



Цитата
есть библиотечные функции для преоброзования десятичных чисел в любые с основанием от 2 до 32,

Реализовать перевод можно с использованием оснований от 2 до 36 ( 26 букв англ. алфавита и плюс 10 цифр). Как это выглядет я  нашел в, калькуляторе, в инете ( без кода, только прогу).


Твою версию класса я изменять не собираюсь.  В  этом варианте меня устраивает всё. И на базе этого его я реализую то, что показал ранее, перевод из 10->2 .

Что касается Softwsre Designer и Software Developer   Это  программисты( с солидным опытом), пишущие код на С++, они-то и  дали несколько рекомендаций о том, что не следует загружать класс лишними функциями. Это. как они считают, усложняет сопровождение кода и его читабельность.   
PM MAIL   Вверх
Kernigan
Дата 1.7.2006, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 18.6.2006

Репутация: нет
Всего: нет



Цитата

есть библиотечные функции для преоброзования десятичных чисел в любые с основанием от 2 до 32, т.е. двоичные, третичные и т.д...


При компиляции получил сообщение о том, что не найден прототип функции itoa и _i64toa, не определена константа _UI64_MAX . В библиотеке  #include <limits.h>
 
 есть константа максимального значения  unsigned int  UINT_MAX. 
Компилировал этот код в  KDevelop.

Переделал вышепреставленный код преобразования из 10->2 систему. Перевод осуществляется, но не получается обработать ошибку нажатия символа в десятичном числе.

Код

   #include<iostream>
   #include <string.h>
   #include <curses.h>


   using namespace std;

   class CDecimalNumbers {
   private:
        int v;                                    // weight of   
        int i;
        unsigned long dec;                        // decimal number
    
   public:
        int Error;
        string Errors;
        CDecimalNumbers(unsigned long dnum);        // initialize constructor
        CDecimalNumbers() {}; 
        int Errno(unsigned long dnum);
        long ShowDec();
        void ToBinary();
   };
   //=====================================================
   CDecimalNumbers::CDecimalNumbers(unsigned long dnum)
   {
    
        dec = dnum;
        v = 32768;
   } 
   //==================================================
   int CDecimalNumbers::Errno(unsigned long dnum)
   { 
     Error = 0;
     
     if (dnum > 65500 )
     {
    Errors ="Number mast be is smoller than it";
    Error = 1;
           
     }              
       
    return Error;
   }  
   //======================================================
  
   long CDecimalNumbers::ShowDec() {return dec;}
 
   //======================================================
   void CDecimalNumbers::ToBinary()
   {
    
     for ( i = 1; i <= 16; i ++)
     {
       if (dec >= v)             
       {
        cout << '1';             
        dec -= v; 
    
              
       }
       else
            cout << '0';
            v = v >> 1;
     }
   }
   //======================================    

   int main()
   {
    CDecimalNumbers dd;
    unsigned long Dec;
    char c;
 
    while (1)
    {
     cout << "Enter decimal number from 0 to 65500 : ";
     cout << "(Exit -> '1')  ";
     cin >> Dec;
  
     if (Dec == 1)
         break;
     
     CDecimalNumbers dd (Dec);
  
     if(dd.Errno(Dec) != 0)
     {
      cout << dd.Errors << endl << endl;
      continue;
     }  
    
     cout << "Decimal :" << dd.ShowDec() << endl;  
     cout << "Binary :";
     dd.ToBinary();  
             
    }
   return 0;
   }       

 
PM MAIL   Вверх
Oleg_Ci
  Дата 5.7.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Это снова я, если запоздал, то потому-что модем сломался.
Почему у тебя функции не идут, то я точно незнаю, я пришу программы на Borland C++ builder 6. И что такое KDevelop тоже непредставляю, не видел никогда.
Вобщем сочинил класс для перевода чисел из двоич. в десятич. и обратно, не так как тебе надо, но я уже это для себя старался(ради спортивного интереса).
Если что неправильно, то я не специалист вообще-то...
Код

#include<iostream>
#include <string.h>
#include <windows.h>
using namespace std;

class Convert
{
private:
    string str;                 // двоичное число, 32 разрядa
    unsigned long dec, v;   
    void ToDecimal();
    void ToBinary();
    string ErrStr[5];
    void ErrCls();
public:
    int Error;            // код ошибки
    string Errors();       // описание ошибки

    Convert();                    // null constructor
    unsigned long ShowDec();
    string ShowBin();
    int DecToBin(string &s, string longs);
    int BinToDec(unsigned long &l, string s);
};
 //=================================================================
Convert::Convert()
{
  ErrStr[0] = "OK";
  char c[70]="Ошибка ! Введённое бинарное число имеет больше 32 знаков !";
  AnsiToOem(c,c);  ErrStr[1] = c;
  strcpy(c,"Ошибка ! Десятичное число должно быть не более 4294967295");
  AnsiToOem(c,c);  ErrStr[3] = c;
  ErrCls();
}
//======================================
void Convert::ErrCls()
{
  Error = 0;
  char c[70]="Ошибка ! В бинарном числе присутствуют недобустимые знаки : ";
  AnsiToOem(c,c);  ErrStr[2] = c;
  strcpy(c, "Ошибка ! Введено не десятичное число, недопустимые символы : ");
  AnsiToOem(c,c);
  ErrStr[4] = c;
}
//====================================================
string Convert::Errors() { return ErrStr[Error];}
//=====================================================
void Convert::ToDecimal()
{
  dec = 0;
  v = 1;
  for ( int i=str.length()-1 ; i>=0; i-- )
  {
    if ( str[i] == '1')
    dec += v;
    v *= 2;
  }
}
 //================================================================
unsigned long Convert::ShowDec() { return dec; }
 //=================================================================
string Convert::ShowBin() { return str;}
//=========================================================
int Convert::BinToDec(unsigned long &l, string s)
{
  ErrCls();
  if(s.length()>32) {Error=1;}
  else
  {
  for ( unsigned int i=0; i<s.length(); i++ )
    if ( s[i] !='1' && s[i] != '0' )
      {Error=2; ErrStr[2]=ErrStr[2]+s[i]+" ";}
  }
  if ( Error )
    return Error;

  str = string(s,0,32);
  ToDecimal();
  l = dec;
  return Error;
}
//=====================================================
int Convert::DecToBin(string &b, string s)
{
  ErrCls();
  unsigned long long d=0, l=1; // 10 нулей

  for ( unsigned int i=0; i<s.length()-1; i++ )
    if ( s[i] > 57 || s[i] < 48 )
      {Error=4; ErrStr[4] = ErrStr[4] + s[i] + " ";}

  if ( !Error )
    for ( int i=s.length()-1; i>-1; i--, l*=10 )
    {  d += l*(s[i] - 48);   }    // перевод char -> число
  else
    return Error;              // или выход

  if ( d > 4294967295 )        // если больше 'max unsigned long'
    Error=3;

  if ( Error )
    return Error;

  dec = d;
  ToBinary();
  b = str;
  return Error;
}
//=================================================
void Convert::ToBinary()
{
  v = 32;
  str = "";
  string s;
  unsigned long d = dec;

  for ( int i=0; d>=1; i++ )
  {
    if ( d%2 )
      s += '1';
    else
      s += '0';
    d /= 2;
  }

  for ( int i=s.length()-1; i>-1; i-- )
    str += s[i];
}
//MAIN================== MAIN ==================MAIN

void bin()
{
  Convert bb;
  unsigned long Long;
  string Bin;

  while(1)
  {
    cout<<"Bin ('end'-exit) ->";
    cin>>Bin;
    if (Bin=="end") break;
    if(bb.BinToDec(Long,Bin)) { cout<<bb.Errors()<<endl<<endl; continue; }
    cout<<"Dec > "<<Long<<endl;
    cout<<"Bin > "<<bb.ShowBin()<<endl<<endl;
  }
}
//_________________________________________________
void dec()
{
  Convert bb;
  string Bin,Dec;

  while(1)
  {
    cout<<"Dec ('end'-exit) ->";
    cin>>Dec;
    if (Dec=="end") break;
    if(bb.DecToBin(Bin,Dec)) { cout<<bb.Errors()<<endl<<endl; continue; }
    cout<<"Bin > "<<Bin<<endl;
    cout<<"Dec > "<<bb.ShowDec()<<endl<<endl;
  }
}
//______________________________________________________
int main()
{
  char *c = "\nКакие числа вводить будем?\n 0 - выход\n 1 - бинарные\n 2 - десятичные\n-> ";
  AnsiToOem(c,c);
  char i;

  while(1)
  {
  cout<<c;
  cin>>i;
  if (i == '0')
      break;
  else if(i=='1')
      bin();
  else if(i=='2')
      dec();
  else cout<<"???"<<endl<<"->";
  }
  return 0;
}
 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0703 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.