[Решено] Перевод из одной системы счисления в другую

  • Автор темы mike701
  • Дата начала
M

mike701

#1
Товарищи, в общем, задание следующее:
На входе строка с числом в двоичной форме. Распознать строку в переменную типа int. На выходе строки с введенным числом в восьмиричной, десятичной и шестнадцатиричной форме printf("%s",char *).


Я не могу понять, как сделать так, чтобы программа поняла, что на входе число именно в двоичной форме?

Код для задания, если на входе строка с числом в десятичной форме по идее такой:
Код:
#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 

int main() 
{ 
int i,k=1; 
char s1[30],s[30],buffer[33]; 
printf("Enter a number in dec: "); 
scanf("%s",&s); 
for (i=0;i<strlen(s);i++) if (!(s[i]>='0' && s[i]<='9')) 
{ 
if (i!=0) { 
printf("Input error. Digits have been cut.\n"); 
} else { 
printf("Input error"); 
k=0; 
} 
break; 
} else s1[i]=s[i]; 
if (k) 
{ 
itoa(atoi(s1),buffer,2); 
printf("BIN: %s\n",buffer); 
itoa(atoi(s1),buffer,8); 
printf("OCT: %s\n",buffer); 
itoa(atoi(s1),buffer,16); 
printf("HEX: %s\n",buffer); 
} 
printf("\nby HS"); 
getch(); 
return 0; 
}
вот что с ним надо сделать чтобы на входе было двоичное. а получалось шестнадцатеричное, восьмеричное и десятичное?
 
R

Radik1983

#2
Чем не устраивает функция strtol?
Это обратный аналог функции itoa.
Преобразует строку в число.
Если необходимо ручное преобразование посмотрите в википедии статью "позиционные системы счисления". Там одно формула для перевода из системы счисления с произвольным основанием в систем счисления с другим основанием.
 
M

mike701

#3
именно что требуется ручное преобразование)
спасибо, попробую почитать
 

lazybiz

Well-known member
03.11.2010
1 339
0
#4
А зачем тебе надо, чтобы программа узнавала что на входе число двоичное, если у тебя в условии сказано что вводится именно двоичное число?!
Ты просто в ходе преобразования можешь проверять, являются ли цифры элементом двоичного числа или нет.
 

lazybiz

Well-known member
03.11.2010
1 339
0
#6
Вот тебе ввод двоичного числа с проверкой.
C++:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
int		i, j;
char *	a = "10000001001";

for ( i = 0, j = 0; i < strlen( a ); i++ ) {
if ( a[i] >= '0' && a[i] <= '1' ) {
j += (int)(a[i] - '0') << i;
} else {
printf( "число не двоичное\n" );
exit( 1 );
}
}
printf( "j = %d\n", j );

return 0;
}
 

Azargan

New member
02.10.2009
4
0
#7
А как же знак '-' и разделитель дробной части? Или такие числа не являются двоичными? Да и условие я бы писал как ( a == '0' || a == '1' ), на мой взгляд так понятнее, да и небольшая оптимизация вычислений :)
 
R

rrrFer

#8
А как же знак '-' и разделитель дробной части? Или такие числа не являются двоичными? Да и условие я бы писал как ( a == '0' || a == '1' ), на мой взгляд так понятнее, да и небольшая оптимизация вычислений :)

"-"(минус) - это единица в старшем разряде. Про разделитель - прочитайте про форматы представления вещественных чисел в ЭВМ. Если использовать формат с фиксированной точкой - то точку хранить не надо. Если использовать формат с плавающей точкой - то число хранится в виде мантиссы и порядка(оба целый числа)
я бы писал как ( a == '0' || a == '1' )

еще лучше
Код:
( '0' == a[ i ] || '1' == a[ i ] )
а так, годное предложение, в половине случаев вторая половина условия вообще не будет вычисляться.
 

Azargan

New member
02.10.2009
4
0
#9
r04, прочитай пожалуйста начальное условие задачи. Там есть строка "На входе строка с числом в двоичной форме." При чем тут представление числа в памяти ЭВМ?. Если ты вводишь -00000001, то по моему мнению это двоичное число и должно обрабатываться программой. Точно так же и при -01010101.1101, так как это тоже число в двоичной системе счисления. А раз так, то и проверку эти два символа должны проходить, и обрабатываться исходя из контекста.
 
R

rrrFer

#10
Если ты вводишь -00000001, то по моему мнению это двоичное число и должно обрабатываться программой
Ну это по твоему мнению, а по моему иначе.
r04, прочитай пожалуйста начальное условие задачи. Там есть строка "На входе строка с числом в двоичной форме." При чем тут представление числа в памяти ЭВМ?.
сам читай первый пост до просветления, там четко сказано:
Распознать строку в переменную типа int
какой нахер "разделитель дробной части"?

Точно так же и при -01010101.1101, так как это тоже число в двоичной системе счисления
Двоичная система счисления — это позиционная система счисления с основанием 2. В этой системе счисления числа записываются с помощью двух символов (0 и 1).
цитату выше тоже читаем до прояснения. Ищем плюсы, минусы, "разделители дробной части" и думаем над основанием СС числа -01.01
 

Azargan

New member
02.10.2009
4
0
#11
r04, не нужно нервничать, нужно думать. А то, как зайти на Википедию узнал, а как прочитать дальше первого предложения - нет. В этой статье, немного дальше первого предложения, есть такой пример:
Преобразование дробных двоичных чисел в десятичные

Нужно перевести число 1011010.101 в десятичную систему. Запишем это число следующим образом:
Удивительно что в двоичной системе счисления есть точка, да?

По поводу того, что в переменную типа int, то это тоже не показатель. В задаче не уточняется что на входе должно быть целочисленное значение, может преобразование должно проводится по арифметическим правилам в пользу ближайшего целого или отбрасыванием дробной части?

Да и вообще, в программе лучше рассматривать все возможные варианты самому, а не полагаться на пользователя.
 

lazybiz

Well-known member
03.11.2010
1 339
0
#12
Azargan, какая нахрен точка? Как ты собираешься дробное число в тип int записывать? Как сказал r04, минус - это единица в старшем разряде, но в условии про знак ничего не сказано. Нужен будет знак, доделать будет не проблема.

Да и условие я бы писал как ( a == '0' || a == '1' )
Ну ты напиши свой вариант решения, а мы тобой восхищаться будем, в чем проблема то!?)