Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2015, 19:26   #1
AlexeyI
Пользователь
 
Регистрация: 03.10.2015
Сообщений: 17
По умолчанию Перевод системы счисления

Здравствуйте.
Помогите пожалуйста дополнить программу перевода из 8 в 10 систему счисления.
У меня есть программа перевода из 10 в 4:

Код:
#include <iostream>
#include <math.h>
using namespace std;
 
int main()
{double Number, b, c;
int a, d, i, j=0, k;
int A[10], B[100];
cin>>Number; //Число, которое нужно перевести
a=int (Number); //Целая часть
b=Number-a;
c=b; //Дробная часть
for(i=0;i<9;i++)
{
    c=c*4;  A[j]=int (c); j++; if(c==0) i=9;  c=c-int (c);//Перевод дробной части
}
 
i=0;
while (a!=0)
{
    B[i]=fmod(a,4); i++; a=a/4; //Перевод целой части
}
for(k=i-1;k>-1;k--)
{
    cout<<B[k];
}
cout<<".";
for(i=0;i<j-1;i++)
{
   cout<<A[i];
}
    return 0;
}
Т.е вводим 8 -> 10 -> 4.

Заранее благодарен.

Последний раз редактировалось AlexeyI; 04.10.2015 в 19:29.
AlexeyI вне форума Ответить с цитированием
Старый 04.10.2015, 19:30   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Могу я предложить такое: http://www.programmersforum.ru/showp...4&postcount=36
?
Или принципиально твой код нужен?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.10.2015, 19:35   #3
AlexeyI
Пользователь
 
Регистрация: 03.10.2015
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Могу я предложить такое: http://www.programmersforum.ru/showp...4&postcount=36
?
Или принципиально твой код нужен?
Отличный код =)))
Но, к сожалению, как я понял, он не переводит дробные числа. Можно ли как-то это реализовать?
Буду очень благодарен

Вот, у меня есть код, полностью рабочий, но я не смогу его объяснить, помогите пожалуйста разобраться:

Код:
#include <iostream>
#include <cmath>

const char alpha[16]="0123456789ABCDE";

using namespace std;

int val_char(char s, int osn)
  { for (int val=0; val < osn; val++)
	  if (s==alpha[val]) return val;

	  return -1;
  }

//---------------------------------------------------------------------------
int ret_str_dig (float *N, int osn, char* str)
 { int x = 0;
   bool minus = false, flag_point=false;
   float r = 0, base = 1;

  if (*str=='\0') return 0;

  char *str1 = str;
  if (*str1=='-') { minus = true; str1++;}

  for (;*str1!='\0';str1++)
	  {
		 if ((!flag_point)&&(*str1=='.')) {
		   flag_point = true;
		   continue;}

		 x = val_char(*str1,osn);
		 if (x>=0)
		  { if (flag_point) {base = base/osn; r = r + base * x;}
            else r = (r * osn + x);}
		 else return 0;
	  }

  if (minus) *N = - r;
  else *N = r;

  return 1;
 }

void ret_dig_to_str (float N, int osn, char *main_string)
{  int i=49,j=0, modd, k;
   float x;
   int u;
   char str[50], str_after_point[50];

///// целая часть //////////////////////////
	 u=abs((int)N);
	 for (;(i>0)&&(u!=0);i--) {modd=u%osn; str[i]=alpha[modd]; u=(int)u/osn;}

	 if (u>0) {str[i]='e'; goto return_back;}
     if (N<0) {str[i]='-'; u=abs(u);i--;}

////// дробная часть ///////////////////////
     if (N!=(int)(N))
	  { x=N-(int)(N); x=abs(x);
		for (;(j<i)&&(x!=0);j++){x*=osn; str_after_point[j]=alpha[(int)x]; x-=(int)x;}
      }
////////////////////////////////////////////

return_back:
   i++;
   for (modd=0, k=i; k<50; k++,modd++) main_string[modd]=str[k];

   if (N!=(int)N)
    { main_string[modd]='.'; modd++;
      for (k=0; k<j; k++, modd++) main_string[modd]=str_after_point[k];
    }

    main_string[modd] = '\0';
}

int main()
{ float x=0;
  char local_output[60];
  char inp[20];
  int n;

double t;
  cout<<"Vvedite v 16 sisteme s4isleniya"<<endl;
  cin>>inp;
  if (ret_str_dig (&x, 16, inp)==0){cout<<"Error in x"; return 0;}
  ret_dig_to_str (x, 8, local_output);
  cout<<endl<<local_output<<endl;


  cout<<"Vvedite v 8 sisteme s4isleniya"<<endl;
  cin>>inp;
  if (ret_str_dig (&x, 8, inp)==0){cout<<"Error in x"; return 0;}
  ret_dig_to_str (x, 4, local_output);
  cout<<endl<<local_output;

    return 0;
}

Последний раз редактировалось Stilet; 04.10.2015 в 21:45.
AlexeyI вне форума Ответить с цитированием
Старый 04.10.2015, 21:47   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ужс какой...
А что значит "дробные числа"?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.10.2015, 22:30   #5
AlexeyI
Пользователь
 
Регистрация: 03.10.2015
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ужс какой...
А что значит "дробные числа"?
Т.е числа с плавающей точкой.

Код:
int val_char(char s, int osn)
  { for (int val=0; val < osn; val++)
	  if (s==alpha[val]) return val;

	  return -1;
  }

//---------------------------------------------------------------------------
int ret_str_dig (float *N, int osn, char* str)
 { int x = 0;
   bool minus = false, flag_point=false;
   float r = 0, base = 1;

  if (*str=='\0') return 0;

  char *str1 = str;
  if (*str1=='-') { minus = true; str1++;}

  for (;*str1!='\0';str1++)
	  {
		 if ((!flag_point)&&(*str1=='.')) {
		   flag_point = true;
		   continue;}

		 x = val_char(*str1,osn);
		 if (x>=0)
		  { if (flag_point) {base = base/osn; r = r + base * x;}
            else r = (r * osn + x);}
		 else return 0;
	  }

  if (minus) *N = - r;
  else *N = r;

  return 1;
Я не понимаю эту часть кода, помогите пожалуйста закомментировать.
Думаю это легче и быстрее =)

Последний раз редактировалось AlexeyI; 04.10.2015 в 22:40.
AlexeyI вне форума Ответить с цитированием
Старый 05.10.2015, 05:48   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Да, причём здесь код? Накодить можно всего туеву хучу, а результат будет - нулевой.
Вот, знакомьтесь - Перельман.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 05.10.2015, 10:24   #7
AlexeyI
Пользователь
 
Регистрация: 03.10.2015
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Да, причём здесь код? Накодить можно всего туеву хучу, а результат будет - нулевой.
Вот, знакомьтесь - Перельман.
Однако, вы, ошибаетесь. Понять суть программы, тот как она работает - хороший жизненный опыт, и т.к, я новичок, в этом нет ничего зазорного.
А книги я и так читаю...
Не хотите помогать - не надо. Зачем же так категорично?
AlexeyI вне форума Ответить с цитированием
Старый 05.10.2015, 11:11   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Понять суть программы, тот как она работает - хороший жизненный опыт
Хороший жизненный опыт - это понять, почему эту программу не стоит пытаться понять. На сие есть отличный термин - индокод. Я потому и предложил свой вариант, что твое разбирать - сам черт ногу сломит (без обид).
Эх-х-х... Короче. Если бы я решал твою задачу, это выглядело бы примерно так:
Код:
char s[255],a[100],b[100];
cin.getline(&s,255);
sscanf(s,"%s.%s",&a,&b);
char* q=ConvertCC(a,8,10);
char* w=ConvertCC(b,8,10);
cout<<q<<'.'<<w<<endl;
delete [] q;
delete [] w;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.10.2015, 11:40   #9
AlexeyI
Пользователь
 
Регистрация: 03.10.2015
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Эх-х-х... Короче. Если бы я решал твою задачу, это выглядело бы примерно так:
Код:
char s[255],a[100],b[100];
cin.getline(&s,255);
sscanf(s,"%s.%s",&a,&b);
char* q=ConvertCC(a,8,10);
char* w=ConvertCC(b,8,10);
cout<<q<<'.'<<w<<endl;
delete [] q;
delete [] w;
Большое спасибо.

Код:
#include <iostream>
#include <math.h>
using namespace std;

int main()
{double Number, b, c;
 char s[255],ch[100],dr[100];

int a, d, i, j=0, k;

int A[10], B[100];

cin.getline(&s,255);

sscanf(s,"%s.%s",&ch,&dr);

char* q=(ch,8,10);//Целая часть

char* w=(dr,8,10);//Дробная часть

for(i=0;i<9;i++)
{
    w=w*4;  A[j]=int (w); j++; if(w==0) i=9;  w=w-int (w);//Перевод дробной части
}

i=0;
while (a!=0)
{
    B[i]=fmod(q,4); i++; q=q/4; //Перевод целой части
}
for(k=i-1;k>-1;k--)
{
    cout<<B[k];
}
cout<<".";
for(i=0;i<j-1;i++)
{
   cout<<A[i];
}
    return 0;
}
Но, при попытке соединить программы, вылетает куча ошибок:

||=== Build: Debug in perevod (compiler: GNU GCC Compiler) ===|
main.cpp||In function 'int main()':|
main.cpp|13|error: no matching function for call to 'std::basic_istream<char>::getline( char (*)[255], int)'|
main.cpp|13|note: candidates are:|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\g cc\mingw32\4.7.1\include\c++\istrea m|616|note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(std::basic_istrea m<_CharT, _Traits>::char_type*, std::streamsize, std::basic_istream<_CharT, _Traits>::char_type) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::char_type = char; std::streamsize = int]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\g cc\mingw32\4.7.1\include\c++\istrea m|616|note: candidate expects 3 arguments, 2 provided|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\g cc\mingw32\4.7.1\include\c++\istrea m|425|note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::getline(std::basic_istrea m<_CharT, _Traits>::char_type*, std::streamsize) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>; std::basic_istream<_CharT, _Traits>::char_type = char; std::streamsize = int]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\g cc\mingw32\4.7.1\include\c++\istrea m|425|note: no known conversion for argument 1 from 'char (*)[255]' to 'std::basic_istream<char>::char_typ e* {aka char*}'|
main.cpp|15|error: 'sscanf' was not declared in this scope|
main.cpp|17|warning: left operand of comma operator has no effect [-Wunused-value]|
main.cpp|17|warning: right operand of comma operator has no effect [-Wunused-value]|
main.cpp|17|error: invalid conversion from 'int' to 'char*' [-fpermissive]|
main.cpp|19|warning: left operand of comma operator has no effect [-Wunused-value]|
main.cpp|19|warning: right operand of comma operator has no effect [-Wunused-value]|
main.cpp|19|error: invalid conversion from 'int' to 'char*' [-fpermissive]|
main.cpp|23|error: invalid operands of types 'char*' and 'int' to binary 'operator*'|
main.cpp|29|error: cannot convert 'char*' to 'double' for argument '1' to 'double fmod(double, double)'|
main.cpp|29|error: invalid operands of types 'char*' and 'int' to binary 'operator/'|
main.cpp|6|warning: unused variable 'Number' [-Wunused-variable]|
main.cpp|6|warning: unused variable 'b' [-Wunused-variable]|
main.cpp|6|warning: unused variable 'c' [-Wunused-variable]|
main.cpp|9|warning: unused variable 'd' [-Wunused-variable]|
||=== Build failed: 7 error(s), 8 warning(s) (0 minute(s), 0 second(s)) ===|
AlexeyI вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неправильный перевод из 8-ой системы счисления в 16-ую Starget-93 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 13.11.2012 09:00
Перевод из 16-ой системы счисления в 10-ю. Си Nice Plant Общие вопросы C/C++ 2 29.04.2012 09:08
перевод из 5 в 10 системы счисления и обратно vrtp Общие вопросы C/C++ 7 25.12.2011 23:04
Перевод из 10 в другие системы счисления. dixonich Помощь студентам 13 11.04.2011 18:13
Перевод в разные системы счисления Наташенька Общие вопросы C/C++ 2 21.12.2008 11:34