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

Тема в разделе "C/C++/C#", создана пользователем mike701, 22 сен 2011.

  1. mike701

    mike701 Гость

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


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

    Код для задания, если на входе строка с числом в десятичной форме по идее такой:
    Код (Text):
    #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;
    }
    вот что с ним надо сделать чтобы на входе было двоичное. а получалось шестнадцатеричное, восьмеричное и десятичное?
     
  2. Radik1983

    Radik1983 Гость

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

    mike701 Гость

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

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    А зачем тебе надо, чтобы программа узнавала что на входе число двоичное, если у тебя в условии сказано что вводится именно двоичное число?!
    Ты просто в ходе преобразования можешь проверять, являются ли цифры элементом двоичного числа или нет.
     
  5. mike701

    mike701 Гость

    проверка на дураков так называемая)
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Вот тебе ввод двоичного числа с проверкой.
    Код (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;
    }
     
  7. Azargan

    Azargan New Member

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36

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

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

    Azargan New Member

    Регистрация:
    2 окт 2009
    Сообщения:
    4
    Симпатии:
    0
    r04, прочитай пожалуйста начальное условие задачи. Там есть строка "На входе строка с числом в двоичной форме." При чем тут представление числа в памяти ЭВМ?. Если ты вводишь -00000001, то по моему мнению это двоичное число и должно обрабатываться программой. Точно так же и при -01010101.1101, так как это тоже число в двоичной системе счисления. А раз так, то и проверку эти два символа должны проходить, и обрабатываться исходя из контекста.
     
  10. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Ну это по твоему мнению, а по моему иначе.
    сам читай первый пост до просветления, там четко сказано:
    какой нахер "разделитель дробной части"?

    цитату выше тоже читаем до прояснения. Ищем плюсы, минусы, "разделители дробной части" и думаем над основанием СС числа -01.01
     
  11. Azargan

    Azargan New Member

    Регистрация:
    2 окт 2009
    Сообщения:
    4
    Симпатии:
    0
    r04, не нужно нервничать, нужно думать. А то, как зайти на Википедию узнал, а как прочитать дальше первого предложения - нет. В этой статье, немного дальше первого предложения, есть такой пример:
    Удивительно что в двоичной системе счисления есть точка, да?

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

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

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Azargan, какая нахрен точка? Как ты собираешься дробное число в тип int записывать? Как сказал r04, минус - это единица в старшем разряде, но в условии про знак ничего не сказано. Нужен будет знак, доделать будет не проблема.

    Ну ты напиши свой вариант решения, а мы тобой восхищаться будем, в чем проблема то!?)
     
Загрузка...

Поделиться этой страницей