Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] перевод из десятичной в двоичную систему


Автор: Jolia 10.2.2008, 21:19
Всем здрасте)) Помогите, пожааалуйста. В общем дело в том, что надо написать код для перевода из десятичной в двоичную систему и обратно для типов char, int, long int, unsigned int, unsigned long int . Для long int я код написала, для остального - по аналогии. Проблема в обратном переводе из двоичной в десятичную: когда дописываю нужную часть, сразу неправильно начинает работать первая половина задания а вторая вообще не выводится...я уже не знаю что и делать то... вот код, посмотрите пожалуйста:

Код

#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

void main(void)
{long a=0, bb=0;
 char str[63];
 int i=0,k,tmp=0;
 clrscr();
 cout<<"‚ўҐ¤ЁвҐ зЁб«®: ";
 cin>>a;
 bb=a;
 while (bb!=0)
   {if ((abs(bb)%2)!=0)
      str[i]='1';
    else
      str[i]='0';
      ++i;
   bb=abs(bb)/2;
   };

   cout<<"—Ёб«® ў ¤ў®Ёз­®© бЁб⥬Ґ бзЁб«Ґ­Ёп: " ;
   for ( k=0;k<=63;k++)
   if(str[k]!='1')
   str[k]='0';
   strrev(str);
   cout<<endl;

   if (a<0)
   {for ( k=0;k<=63;k++)
     {if (str[k]!='1')
      str[k]='1';
      else
      str[k]='0';};

    for (i=63;i>=0;i--)
    {if (str[i]=='1')
    str[i]='0';
    else
    {str[i]='1';
    break;}}
   }
   cout<<str<<endl;
   getchar();
   tmp=0;
   for(i=63,k=0;i>=0;i--,k++)
   tmp=tmp+str[i]*pow(2,k);
   cout<<"‚ ¤ҐбпвЁз­®© бЁб⥬Ґ бзЁб«Ґ­Ёп: "<<tmp;
   getchar();

}


да и еще...кто знает как это все под чаровский тип сделать?

Автор: Optimus 11.2.2008, 20:22
При беглом просмотре заметил следующее:

Код

tmp=tmp+str[i]*pow(2,k);


здесь вы умножаете символ числа, а надо само число, делаем так
tmp = tmp + (str[i] - '0') * pow(2,k);

Код

for(i=63,k=0;i>=0;i--,k++)
здесь надо пройти цикл не до i >= 0, а до i > 0,
потому что в последней ячейке строки должен быть символ конец строки '\0',
но у вас программе я его не вижу, видима там лежит что то другое

да и еще, лучше заполнить строку нулями до ее заполнения, потому что в строке изначально могут быть единицы

Автор: Jolia 11.2.2008, 21:15
оой спасиб  smile - я исправила - вроде работает...только у меня теперь прямой перевод из десятичной в двоичную не фурычит - мне в массив из 64 символов заносится 66, причем 2 последних -буквы, неизведанно откуда взявшиеся..не подскажете чего делать? 

и если убрать кусок кода 
Код

tmp=0;
   for(i=63,k=0;i>=0;i--,k++)
   tmp=tmp+str[i]*pow(2,k);
   cout<<"‚ ¤ҐбпвЁз­®© бЁб⥬Ґ бзЁб«Ґ­Ёп: "<<tmp;
   getchar();

   то прямой перевод работает прямо круто... и в чем дело  не поймуууу(

Автор: Optimus 11.2.2008, 21:21
ну, если не фурычит перевод из десятичной в двоичную, 
значит вы что то изменили в первой части, что именно ?

Автор: Jolia 11.2.2008, 21:24
не  я ничего в первой половине не меняю

Автор: Optimus 11.2.2008, 22:33
изменил немного программу
Код

#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

void main(void)
{
  long a = 0;
  long bb = 0;
  const int N = 65;
  char str[N];
  int i = 0;
  int k;
  int tmp = 0;

  clrscr();
  cout << "‚ўҐ¤ЁвҐ зЁб«®: ";
  cin >> a;

  // zabivaem stroku simvolom '0'
  for ( i = 0; i < N - 1; ++i)
  {
    str[i] = '0';
  }

  str[N - 1] = '\0'; //  simvol konta stroki

  bb = a;
  i = 0;

  while (bb != 0)
  {
    if ((abs(bb) % 2) != 0)
      str[N - 2 - i] = '1'; // zapisovaem s konta

    ++i;
    bb = abs(bb) / 2;
   }

   cout << "—Ёб«® ў ¤ў®Ёз­®© бЁб⥬Ґ бзЁб«Ґ­Ёп: " << endl;
   cout << str << endl;
   getchar();

   tmp = 0;
   for ( i = N - 2, k = 0; i >= 0; i--, k++)
     tmp = tmp + (str[i] - '0') * pow(2,k);

   cout << "‚ ¤ҐбпвЁз­®© бЁб⥬Ґ бзЁб«Ґ­Ёп: " << tmp;
   getchar();

}

Автор: Jolia 11.2.2008, 22:44
СПАСИБО СПАСИБО СПАСИБО ОГРОМНОЕ!!!!!!!!!!!!!!!!!!!!!!!!!!! ПРЯМО СЛОВ НЕТ!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)