Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[С/C++] Перевод чисел из системы счисления Х в сс Y

13K
28 февраля 2006 года
Sabbath
14 / / 28.02.2006
Привет народ! Можете помочь с алгоритмом или программой перевода чисел из P-итой системы счисления в Q-итую. Пожалуйста, очень нужно!
Страницы:
242
01 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Sabbath
Привет народ! Можете помочь с алгоритмом или программой перевода чисел из P-итой системы счисления в Q-итую. Пожалуйста, очень нужно!




Что такое Q и P системы? Известные системы счисления это: H(16), B(2), O( 8 ), D(10). Если нужен алгоритм перевода в этих системах могу написать.

929
01 марта 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by OlgaKr
Что такое Q и P системы? Известные системы счисления это: H(16), B(2), O( 8 ), D(10). Если нужен алгоритм перевода в этих системах могу написать.


Это только известные, а по идее они могут быть всякие: третичные, четвертичные и т.д.
Чел наверное и имел в виду перевод из любой СС в любую СС.

929
01 марта 2006 года
sp999
198 / / 31.01.2003
Самый простой способ: перевести из P-й СС в десятичную, а потом из десятичной в Q-ую.
242
01 марта 2006 года
Оlga
2.2K / / 04.02.2006
Q - основание СС - количество различных цифр употребляемых в СС ( от 0 до Q - 1)

Цитата:

Чтобы из любой СС перевести в десятичную СС :
x = An*Q^n + An-1*Q^(n-1) + ... + A1*Q^1 + A0*Q^0.+A(-1)*Q^(-1) + ... + A(-m)*Q^(-m)


Цитата:

Пример1: нужно перевести число (5Dh) в десятичную СС :
5Dh = 5h * 16^1 + Dh * 16^0 = 13d + 80d = 93d


Цитата:

Пример2: нужно перевести число (11011.11b) в десятичную СС :
11011.11b = 1*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 + 1*2^(-1) + 1*2^(-2) = 16 + 8 + 0 + 2 + 1 + 0.5 + 0.25 = (27.75)d


Цитата:

Чтобы из десятичной СС перевести в любую другую нужно это число делить на Q до тех пор пока не получим целую часть равной 0:
Пример: нужно перевести число (156d) в СС 8(oct, т.е. Q = ( 8 )):
156 / 8 = 19 (4) <- в скобках остаток
19 / 8 = 2 (3)
2 / 8 = 0 (2)

Получили что (156d) = (234o) - [COLOR=purple]читаем числа в скобках с низу вверх[/COLOR].

Это перевод целого числа.

292
01 марта 2006 года
Matush
726 / / 14.01.2004
функция itoa, если для С++
324
01 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by Matush
функция itoa, если для С++



itoa позволяет переводить числа только между 2, 8, 10, 16 СС

292
01 марта 2006 года
Matush
726 / / 14.01.2004
Цитата:
Originally posted by AndreySar
itoa позволяет переводить числа только между 2, 8, 10, 16 СС



А ВОТ И НЕТ

13K
01 марта 2006 года
Sabbath
14 / / 28.02.2006
Всем спасибо за участие, только проблема в одном осталась. Прога выводит число, обратном порядке, как от этого избавиться? Прилагаю файл
242
01 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Sabbath
Всем спасибо за участие, только проблема в одном осталась. Прога выводит число, обратном порядке, как от этого избавиться? Прилагаю файл


Код выложи. Хотя для тебя лучше если ошибку найдешь сам.
P.S.
Думаю проблема в следущем:
если при переводе программа обрабатывает данное число в два этапа:
1 - переводит в СС 10
2 - переводит в заданную СС
то на втором этапе результат выходит в обратном порядке и ты сразу его расспечатываешь, а нужно сохранить(в массиве например) и расспечатывать в правильном порядке после полного окончания этапа 2.

13K
01 марта 2006 года
Sabbath
14 / / 28.02.2006
Выкладываю код программы.
//-----------------------------------------------
#include <stdio.h>
#include <conio.h>
#include <vcl.h>
#include <math.h>
#include <string.h>
#pragma hdrstop

//------------------------------------------------
#pragma argsused
int CharToInt( char alpha )
{
for( int i = 'A' ; i < 'J' ; i++ )
if( alpha == i )
return i - 65 + 10 ;
return alpha - 48 ;
}

int ConvertToDec(char input[32] , int sinp )
{
int sum = 0 ;
for( int i = 0; i < strlen( input ) ; i++ )
sum += CharToInt(input) * pow( sinp , strlen(input)-i -1 );
return sum ;
}

void convertX( int input , int sout )
{
while( input != 0 )
{
printf( "%i " , input % sout);
input /= sout;
}
}

int main(int argc, char* argv[])
{


printf("Vvedite nachalnoe chislo: " );
char input[32] = "";
scanf("%s", &input);

printf("\nVvedite nachalnuiu codirovku: ");
int sinp;
scanf("%i", &sinp);

printf("\nVvedite conechnuiu codirovku: ");
int sout;
scanf("%i", &sout);

printf("\n\n=");


convertX( ConvertToDec(input , sinp) , sout );

getch();
return 0;
}
//------------------------------------------------
242
01 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Sabbath
Выкладываю код программы.
Код:
....

void convertX( int input , int sout )
{
while( input != 0 )
{
printf( "%i " , input % sout);
input /= sout;
}
}
....



... то на втором этапе результат выходит в обратном порядке и ты сразу его расспечатываешь, а нужно сохранить(в массиве например) и расспечатывать в правильном порядке после полного окончания этапа 2.

Расспечатыбай массив c КОНЦА а не сначала.

я же сразу написала в чём проблема. Внимательно перечитай все мои сообщения вклучая алгоритм перевода из СС в СС.

7.9K
02 марта 2006 года
uki_
122 / / 26.01.2006
Можно один безобидный вопрос???

Ваша прога может сделать перевод с 10 в 16???
242
02 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by uki_
Можно один безобидный вопрос???

Ваша прога может сделать перевод с 10 в 16???



Mожет. Eсли исправить ошибку (об ошибке читай выше), а лучше читай алгортм перевода (написано выше) и напиши свою программу.

7.9K
02 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by OlgaKr
Mожет. Eсли исправить ошибку (об ошибке читай выше), а лучше читай алгортм перевода (написано выше) и напиши свою программу.

Оля, Arad это в Пенсилвании?
Если да, то немношко странно. До этих пор я был уверенный, что там живут только румыни и венгры.

На счет программы.

Вывод осуществляется через printf( "%i " , input % sout);

Если sout = 16, тогда вместо A выводится 10, вместо B 11 итд.

Как минимум нужен был бы printf( "%x "...

242
02 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by uki_
Оля, Arad это в Пенсилвании?
Если да, то немношко странно. До этих пор я был уверенный, что там живут только румыни и венгры.


Ну допустим с геограгией у тебя проблемы, так же как и у меня. Ну это не страшно, google эту проблему решает быстро.

Цитата:
Originally posted by uki_

На счет программы.

Вывод осуществляется через printf( "%i " , input % sout);

Если sout = 16, тогда вместо A выводится 10, вместо B 11 итд.

Как минимум нужен был бы printf( "%x "...


%х читает только СС 16, а %i читает СС 10, 8 и 16 (если верить Дейтелу).

7.9K
02 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by OlgaKr
%х читает только СС 16, а %i читает СС 10, 8 и 16 (если верить Дейтелу).


%i это Signed decimal integer(MSDN). Т.е через него можно выводить системы числения от 2 до 10.

а x Unsigned hexadecimal integer, using “abcdef.”
т.е. выводит от 2 до 16.

242
02 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by uki_
%i это Signed decimal integer(MSDN). Т.е через него можно выводить системы числения от 2 до 10.

а x Unsigned hexadecimal integer, using “abcdef.”
т.е. выводит от 2 до 16.



Я имела ввиду функцию scanf а не printf, есть разница. Проверила в программе: действительно читает СС 10 и СС 16 (только перед числом нужно написать 0х) а считать СС 8 не получилось (писала перед числом 'о') но сейчас мне это неочень важно. А в printf действительно %i ввыводит только signed intenger.

А программа недорабона, думаю ты прав %х самый лучший вариант.

7.9K
02 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by OlgaKr
А программа недорабона, думаю ты прав %х самый лучший вариант.

Ну видишь, видишь. А то вчера ты меня уже к google отправляла. :)

Код:
#include <stdio.h>
#include <conio.h>
#include <vcl.h>
#include <math.h>
#include <string.h>
#pragma hdrstop

//------------------------------------------------
#pragma argsused

int CharToInt(char alpha)
{
  if(alpha<58 )
    return alpha - 48;
  else
    return alpha - 55;
}

int ConvertToDec(char *input , int sinp )
{
  int sum = 0;
  int pow = 1;
  for(int i = strlen(input)-1; i>=0; i--)
  {
    sum+=CharToInt(input) * pow;
    pow*=sinp;
  }
  return sum ;
}

char *convertX(int input, int sout, char *out)
{
  while(input!=0)
  {
    byte j = input%sout;
    input/=sout;
    out--;
    if(j<10)
      *out = 48 + j;
    else
      *out = 55 + j;
  }
  return out;
}

int main(int argc, char* argv[])
{
  printf("Vvedite iszhodnoe chislo: " );
  char input[32] = "";
  scanf("%s", &input);

  printf("\nVvedite nachalnuiu codirovku: ");
  int sinp;
  scanf("%i", &sinp);

  printf("\nVvedite conechnuiu codirovku: ");
  int sout;
  scanf("%i", &sout);

  printf("\n\n= ");

  char output[32];
  output[31] = 0;
  printf("%s", convertX(ConvertToDec(input, sinp), sout, output+31));

  printf("\n\nNazsmite ljubuju klavisu...");
  getch();
  return 0;
}
242
02 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by uki_

.......
char output[32];
output[31] = 0;
printf("%s", convertX(ConvertToDec(input, sinp), sout, output+31));

printf("\n\nNazsmite ljubuju klavisu...");
getch();
return 0;
}[/code]



Выглядит красиво, только одно но : ты работаешь с 4 байтами для сохранения результата. Все разряды заполняешь нулями и (если я не ошибаюсь) независимо от полученного результата распечатываешь всегда все 4 байта |=> печатаешь нули в старших разрядах когда результат < 1FFFFFFFh. Нехорошо:!!!:

7.9K
02 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by OlgaKr
Выглядит красиво, только одно но : ты работаешь с 4 байтами для сохранения результата. Все разряды заполняешь нулями и (если я не ошибаюсь) независимо от полученного результата распечатываешь всегда все 4 байта |=> печатаешь нули в старших разрядах когда результат < 1FFFFFFFh. Нехорошо:!!!:

:)
Результат записывается в char output[32];
Сперва в 31ю позицию пишется 0.

А в ф-ии convertX например при результате "170"

Сперва '0' пишется в 30-ю позицию, потом
'7' в 29-ю, '1' в 28-ю.
И возвращается указатель на 28ю позицию, что и выводится.

242
02 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by uki_
:)
Результат записывается в char output[32];
Сперва в 31ю позицию пишется 0.


то что в чарах сохраняется результат это очевидно. под 4 байтами имела ввиду разрядность числа которое можно отобразить в 32 символах но это я погaрячилось : если бинарное число выводить тогда действительно 4byte а в СС 16 это 16 byte, короче сработала реакция на число 32 и не подумала что в char сохраняем 1 значение но это не '0' или '1' а '0' ... 'F'.

Цитата:

char output[32];
 
Код:
output[31] = 0;
  printf("%s", convertX(ConvertToDec(input, sinp), sout, output+31));


Лучше объяцни зачем в 31-ю ячейку ноль отправляешь, я было подумала что это вроде того как int arr[32] = {0}; => забиваем во все ячейки нули.
P.S.А насчет указателя ошиблась(давно с ними неработала Слиха).:( I am sorry.

7.9K
03 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by OlgaKr
Лучше объяцни зачем в 31-ю ячейку ноль отправляешь, я было подумала что это вроде того как int arr[32] = {0}; => забиваем во все ячейки нули.

Это нулевой символ в конце строки(занимает 1 байт).

242
03 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by uki_
Это нулевой символ в конце строки(занимает 1 байт).



Я привыкла '\0' потому и не узнала. За что С люблу так это за многогранность. :)

252
03 марта 2006 года
koderAlex
1.4K / / 07.09.2005
интересно , а СС64 (бедные шумеры -) ) ваша прога сделать может ? :D
а что у вас за навязчивая идея - сначала в десятичную перевести ? в компе вроде двоичное представление чисел . ;)
да и вообще - обратное деление на основание СС может переводить из любой СС в любую .надо только сделать универсальное представление чисел штоб для любой СС подходила и научить прогу операции деления в этом представлении .
242
03 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by koderAlex
интересно , а СС64 (бедные шумеры -) ) ваша прога сделать может ? :D
а что у вас за навязчивая идея - сначала в десятичную перевести ? в компе вроде двоичное представление чисел . ;)
да и вообще - обратное деление на основание СС может переводить из любой СС в любую .надо только сделать универсальное представление чисел штоб для любой СС подходила и научить прогу операции деления в этом представлении .



Ну если ты такой умный научи студентов жизни, лично я буду благодарна. :)

Цитата:

а что у вас за навязчивая идея - сначала в десятичную перевести ? в компе вроде двоичное представление чисел . ;)


Рада буду увидеть как например из СС 2 ты напрямую перейдешь в СС 3, а то нас на ассемблере глупостям учили : перейти из СС в СС можно только если они связанные. Например Q = 2^n где n > 0, а Q основание СС.

324
03 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by OlgaKr

Рада буду увидеть как например из СС 2 ты напрямую перейдешь в СС 3, а то нас на ассемблере глупостям учили : перейти из СС в СС можно только если они связанные. Например Q = 2^n где n > 0, а Q основание СС.



Если они связанные, то переход действительно осуществляется через Q = 2^n, но как сказал koderAlex возможен непосредственный переход из одной СС счисления в другую. Переход через десятичную используется если только для удобства.

Например, надо перевести из 3 в 7. Как 3 связана с 10 и как 7 связана 10, также как и 3 с 7 - никак!!!

7.9K
03 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by koderAlex
интересно , а СС64 (бедные шумеры -) ) ваша прога сделать может ? :D

Конечно. Напр. 170(СС10)==2a(CC64)

Цитата:

а что у вас за навязчивая идея - сначала в десятичную перевести ? в компе вроде двоичное представление чисел . ;)

Где ты видишь перевод в десятичный? Так называемая ф-ия ConvertToDec переводит строковое представление числа в int.

Цитата:
да и вообще - обратное деление на основание СС может переводить из любой СС в любую .надо только сделать универсальное представление чисел штоб для любой СС подходила и научить прогу операции деления в этом представлении .

Универсальное представление уже "сделано" - это двоичная система счисления.

7.9K
03 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by AndreySar
Если они связанные, то переход действительно осуществляется через Q = 2^n, но как сказал koderAlex возможен непосредственный переход из одной СС счисления в другую. Переход через десятичную используется если только для удобства.

Например, надо перевести из 3 в 7. Как 3 связана с 10 и как 7 связана 10, также как и 3 с 7 - никак!!!

Нет в тех программах 10го представления. Есть только двоичное.

Нужно перевести число из CC3 в CC7.

Напр. 2222(СС3). Для этого его нужно делить на 21(СС3). Или перевести оба числа в int (80 и 7). Или написать программу символьного деления для любого CC. Минимум несколько сот операторов.
Мне интересно было бы посмотреть на эту прогу. Сможешь ее написать?

324
03 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by uki_

Напр. 2222(СС3). Для этого его нужно делить на 21(СС3). Или перевести оба числа в int (80 и 7). Или написать программу символьного деления для любого CC. Минимум несколько сот операторов.
Мне интересно было бы посмотреть на эту прогу. Сможешь ее написать?



Такую программу писал еще в студенческую пору на Borland C++ 3.11, постараюсь найти её и выложить, она как раз использует символьное деление вплоть до 36 СС (a-z, 0-9). Но можно будет расширить

7.9K
03 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by AndreySar
Такую программу писал еще в студенческую пору на Borland C++ 3.11, постараюсь найти её и выложить, она как раз использует символьное деление вплоть до 36 СС (a-z, 0-9). Но можно будет расширить

Ok. Ждемс...

242
03 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by AndreySar

...
Например, надо перевести из 3 в 7. Как 3 связана с 10 и как 7 связана 10, также как и 3 с 7 - никак!!!



Спасибо, дошло.

324
05 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by uki_
Ok. Ждемс...



Спешу вас растроить, т.к. программу я так и не нашел... :(
Но если она тебе очень нужна можно написать её еще раз

252
06 марта 2006 года
koderAlex
1.4K / / 07.09.2005
Цитата:
Originally posted by OlgaKr
Спасибо, дошло.


Ну вот . Теперь и учить уже не надо :(
А так хотелося :D .

242
06 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by koderAlex
Ну вот . Теперь и учить уже не надо :(
А так хотелося :D .



Ну если очень хочеться ты не тормози, можешь попробовать. Я всегдa готова перенять опыт от профессионалов дела, а не слова. ;)
Тут на форуме integral написал задачу "биты числа" ну очень интересно посмотреть как такую задачу решит настоящий програмист а не шумеры не... .

7.9K
06 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by OlgaKr
Тут на форуме integral написал задачу "биты числа" ну очень интересно посмотреть как такую задачу решит настоящий програмист а не шумеры не... .

Ко дну 8 Марта :)

Код:
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"

void float2char(double f, char *ch)
{
  int *i = (int *)&f;
  for(int j = 0; j<32; j++)
  {
    if(*i&0x80000000)
      *ch = '1';
    else
      *ch = '0';
    ch++;
    *i = (*i)<<1;
  }
  i++;
  for(j = 0; j<32; j++)
  {
    if(*i&0x80000000)
      *ch = '1';
    else
      *ch = '0';
    ch++;
    *i = (*i)<<1;
  }
  *ch = '\0';
}

int main(int argc, char* argv[])
{
  char ch[65];
  double f = 46565.78;
  float2char(f, ch);
  printf("%f = %s", f, ch);
  printf("\n\n nazsmite ljubuju klavisu...");
  getch();

  return 1;
}
242
07 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by uki_
Ко дну 8 Марта :)
Код:
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"

void float2char(double f, char *ch)
{
  int *i = (int *)&f;
  for(int j = 0; j<32; j++)
  {
    if(*i&0x80000000)
      *ch = '1';
    else
      *ch = '0';
    ch++;
    *i = (*i)<<1;
  }
  i++;
  for(j = 0; j<32; j++)
  {
    if(*i&0x80000000)
      *ch = '1';
    else
      *ch = '0';
    ch++;
    *i = (*i)<<1;
  }
  *ch = '\0';
}

int main(int argc, char* argv[])
{
  char ch[65];
  double f = 46565.78;
  float2char(f, ch);
  printf("%f = %s", f, ch);
  printf("\n\n nazsmite ljubuju klavisu...");
  getch();

  return 1;
}



Спасибо конечно за поздравление хотя вижу его уже не первый раз.;)

Если честно против битов ничего не имею но есть проблема : у меня в компьютере твоя программа Правильно не работает.
int *i = (int *)&f;
printf("%d\n\n",*i);
расспечатываю *i после твоего конверта и ничего хорошего не вижу. Проверь у себя , подставь double f = 1.0; и сообщи результаты пожалуйста в честь 8 марта. :}

P.S. моё предложение К KoderAlex в любом случае в силе!! не люблю голословщины страшно, а учиться люблю.:)

7.9K
07 марта 2006 года
uki_
122 / / 26.01.2006
Мда, я забыл, что в Intel обратный порядок...
Правильная прога
Код:
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"

void float2char(double f, char *ch)
{
  int *i = (int *)&f + 1;
  for(int j = 0; j<32; j++)
  {
    if((*i)&0x80000000)
      *ch = '1';
    else
      *ch = '0';
    ch++;
    *i = (*i)<<1;
  }
  i--;
  for(j = 0; j<32; j++)
  {
    if((*i)&0x80000000)
      *ch = '1';
    else
      *ch = '0';
    ch++;
    *i = (*i)<<1;
  }
  *ch = '\0';
}

int main(int argc, char* argv[])
{
  char ch[65];
  double f = 1;
  float2char(f, ch);
  printf("%f = %s", f, ch);
  printf("\n\n nazsmite ljubuju klavisu...");
  getch();

  return 1;
}
242
07 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by uki_
Ко дну 8 Марта :)
 
Код:
#include "stdafx.h"
  int *i = (int *)&f;



Мне кажется я тут интересный факт нашла :
double f = 46565.78;
printf("%d\n\n", f); |=> (-171798692)
Надо работать с unsigned intenger... .
хотя программе и это не помогает. Честно говоря о твоей операции convert (int *i = (int *)&f ) ничего сказать не могу.

7.9K
07 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by OlgaKr
Мне кажется я тут интересный факт нашла :
double f = 46565.78;
printf("%d\n\n", f); |=> (-171798692)
Надо работать с unsigned intenger... .
хотя программе и это не помогает. Честно говоря о твоей операции convert (int *i = (int *)&f ) ничего сказать не могу.

Выше правильная прога.

7.9K
07 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by OlgaKr
Хочешь сказать что этот вариант у тебя работает правильно??? У меня нет, или я что то не понимаю.

А ты знаешь как выглядит 1.0 с плавающей точкой и двойной точностью??? Если нет, запусти мою прогу. :)

Но можно проверить. Нужно изменить printf в main() на

printf("%.1f = %s %X%X", f, ch, *(int*)&f, *((int*)&f+1));

И она выведет 1.0 в СС16.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог