перевод из одной системы счисления в другую

Тема в разделе "MS Visual C++", создана пользователем woka, 8 сен 2011.

  1. woka

    woka Гость

    ребята подскажите в чём дело. я хочу из одной системы счисления перевести в другую например :
    Код (C++):
    scanf("%o", &n); //8
    printf("\n%i",n);//10
    вводим восьмеричное а получаем десятичное но прога отказывается переводить. подскажите можно ли так переводить?
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Тебе надо переведенное значение на экран вывести или что?
     
  3. woka

    woka Гость

    да. я хочу ввести число а она мне его переведёт в разные системы и покажет как будет.
    я уже начал писать алгоритм чтобы по древним методам вручную переводить но всёже хочется разобраться почему сдесь не переводит
     
  4. vol4ek88

    vol4ek88 Гость

    Код (C++):
    #include

    main () /* преобразование шестнадцатеричного
    ** или восьмеричного целого к
    ** десятичному целому */

    {
    int numassigned, val;


    pintf("Enter hexadecimal or octal #, or 00
    to guit:n"
    );
    do
    { printf("# = ");
    numassigned = scanf("%i", &val);
    printf("Decimal # = %in", nal);
    }
    while (val && numassigned);

    /* конец цикла, если значение ввода равно 00, или если
    scanf не способна назначить поле */
    .

    }
    Тогда на выходе будет следующее.

    Enter hexadecimal or octal #, or 00 to guit:

    # = 0xf
    Decimal # = 15

    # = 0100

    Decimal # = 64

    # = 00

    Decimal # = 0.

    Добавлено: ахтунг! не работает. извините

    Добавлено: вот рабочий код


    Код (C++):
    #include <iostream>

    using namespace std;

    void main (void) {


    int numassigned, val;
    int nal;


    do
    { printf("# = ");
    numassigned = scanf("%i", &val);
    printf("Decimal # = %in", &nal);
    }
    while (val && numassigned);



    }
     
  5. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    woka, а ты вообще в курсе что в памяти компьютера числа храняться в двоичном коде, т.е. там не существует системы счисления!?
    Тип int не может хранить числа в разных системах счисления, он хранит только само число. В разных системах счисления ты его можешь увидеть только при выводе на экран.
    Не важно каким образом ты вводишь его с клавиатуры! Главное - как ты выводишь его на экран! Если в текстовый файл - то в файл!

    Код (C++):
    scanf( "%d", &i );  // тип [b]int[/b], число в десятичной системе счисления
    printf( "%d", i );  // тип [b]int[/b], число в десятичной системе счисления
    printf( "%x", i );  // тип [b]int[/b], число в шестнадцатиричной системе счисления
    printf( "%o", i );  // тип [b]int[/b], число в восмеричной системе счисления
     
  6. woka

    woka Гость

    да я в курсе. спосибо за ответ я это и делал но у меня что то какаята чуш вылазила на экран. сейчас нет робочего компа чтобы проверить что будет с этим кодом.

    vol4ek88, спосибо за алгоритм буду разбираться
     
  7. vol4ek88

    vol4ek88 Гость

    фигата какая-то. без цикла do-while напрочь отказывается работать

    Добавлено: #include

    int scanf(format-string[[, argument...]]);
    char *format-string. строка управления форматом.

    Описание.

    Функция scanf читает данные из стандартного потока stdin в
    место, определяемое аргументами arguments. Каждый аргумент должен
    быть указателем на значение с типом, который соответствует типу,
    заданному в строке формата. Строка формата управляет преобразава-
    ниями полей ввода. Эта строка может содержать следующее:

    "Пробельные" символы, т.е. символ пробела ' ', табуляции t,
    новой строки 'n'. Для функции scanf символом пробела определяет-
    ся считывание, но без запоминания, всех вводимых последующих сим-
    волов пробела вплоть до первого символа, не являющегося пробелом.

    При вводе один символ пробела в строке формата соответствует лю-
    бому числу, включая 0, или любой комбинации символов пробела.
    Любой символ управления, не являющийся пробелом и символом
    знака процента %. Тогда по этому символу для функции scanf опре-
    деляется считывание, но без запоминания соответствующих символов
    управления. Если следующий символ в не соответствует сим-
    волам управления, то scanf оканчивает свою работу.
    Спецификацию формата, введенную со знаком %. В этом случае
    scanf читает и преобразовывает введенные символы к значениям за-
    данного типа, причем значения определяются соответствующими аргу-
    ментами из списка аргументов.

    Строка формата читается слева направо. Символы вне специфи-
    кации формата предполагаются согласованными с последовательностью
    символов в потоке stdin; эти согласованные символы в stdin скани-
    руются, но не запоминаются. Если символ в stdin противоречит
    строке формата, scanf оканчивает свою работу. Этот конфликтующий
    символ остается в stdin, так как он не может быть прочитан. Когда
    встречается первая спецификация формата, тогда значение первого
    поля ввода преобразовывается в соответствии со спецификацией фор-
    мата и запоминается в месте, заданном первым аргументом. По вто-
    рой спецификации формата выполняется преобразование второго поля
    ввода и запоминание его по второму аргументу; и так до конца
    строки формата.
    Поле ввода ограничивается первым "пробельным" символом или
    первым символом, который не может преобразоваться по заданному
    формату, или случаем достижения поля width, которое идет первым.
    Если для выбранной спецификации формата задано больше аргу-
    ментов, чем требуется, то лишние аргументы игнорируются.
    Спецификация формата имеет следующую форму.

    %<.precision><{F:N:h:I}>.

    Каждое поле в формате спецификаций является отдельным сим-
    волом или числом, выражающим отдельную опцию формата. Символ
    type, появляющийся после последнего необязательного поля формата,
    определяет тип поля ввода как символьного, строкового или числен-
    ного.
    Простейший формат спецификации содержит только символ знака
    процента и символ типа (например, %S).
    Каждое поле спецификации формата описывается ниже.
    Если за знаком процента % следует символ, не являющийся
    символом управления форматом, то этот символ и идущие за ним сим-
    волы, вплоть до следующего знака %, трактуются как обычная после-
    довательность символов, т.е. последовательность, которая должна
    быть введена. Например, чтобы ввести символ знака %, используется
    комбинация %%.
    Звездочка (*), идущая за знаком %, подавляет назначение
    следующего поля ввода, задающегося как поле, определяемое типом
    type. Это поле сканируется, но не запоминается.
    Widht является положительным десятичным целым и управляет
    максимально возможным числом символов, считываемых из stdin. Пре-
    образовываются и запоминаются по соответствующему аргументу толь-
    ко те символы, которые не превышают width. Если в width встреча-
    ются "пробельные" символы, т.е. символы пробела, табуляции или

    новой строки, то по выбранному формату они не преобразовываются,
    пока не будет достигнут размер width.
    Необязательные префиксы F и N не учитывают принятое по
    умолчанию адресное соглашение используемых моделей памяти. F мо-
    жет быть префиксом к аргументу argument, указыващему на far-объ-
    ект; а N - на near-объект.
    Необязательный префикс l свидетельствует о том, что исполь-
    зуется версия long; а префикс h - указывает на использование вер-
    сии short. Соответствующий argument указывает на long или
    double-объект (при помощи префикса l) или на short-объект (при
    помощи префикса h). Модификаторы l и h могут использоваться вмес-
    те с типами символов d, i, o, x, u. Модификатор l также может ис-
    пользоваться с символами type e и f. Если определен любой другой
    type, модификаторы l и h игнорируются.

    Символы type и их значения описаны в таблице R.4.

    Таблица R.4

    Типы символов функции scanf

    СИМВОЛ ПРЕДПОЛАГАЕМЫЙ ТИП ТИП АРГУМЕНТА
    ВВОДА


    d десятичный целый указатель на int.

    D десятичный целый указатель на long.

    o восьмеричный целый указатель на int.

    O восьмеричный целый указатель на long.

    x шестнадцатеричный указатель на int.
    целый

    X шестнадцатеричный указатель на long.
    целый

    i десятичный, вось- указатель на int.
    меричный или шест-
    надцатеричный це-
    лый

    I десятичный, вось- указатель на long.
    меричный или шест-
    надцатеричный це-
    лый

    u беззнаковый деся- указатель на unsigned
    тичный целый int.

    U беззнаковый деся- указатель на unsigned
    тичный целый long.


    e значение с плава- указатель на float
    f ющей точкой, со-
    держащее необяза-
    тельный знак ("+",
    "-"), одну или
    больше десятичную
    цифру, обычно со-
    держащую десятич-
    ную точку и экспо-
    ненту ("е", "Е"),
    которая записы-
    вается за знаковым
    целым значением.

    c символьный. Симво- указатель на char
    лы пробела, табу-
    ляции или новой
    строки, так назы-
    ваемые "пробельные
    символы", которые
    обычно пропускают-
    ся, при задании
    этого типа считы-
    ваются. Для считы-
    вания следующего
    символа, не являю-
    щегося "пробель-
    ным", используется
    комбинация %1s.



    Добавлено: #include <cstdlib>
    #include <iostream>
    #include <cstdio>
    int main()
    {

    int numassigned, val;



    do
    { printf("# = ");
    numassigned = scanf("%i", &val);
    printf("Decimal # = %in", &val);
    }
    while (val && numassigned);

    }<pre><code class="cpp"></code></pre>

    какого-то черта работает только один раз. чтобы конвертировать другое число надо перезапускать программу. говнокод.
     
  8. vol4ek88

    vol4ek88 Гость

    всё работает


    #include <cstdlib>
    #include <iostream>
    #include <cstdio>
    int main()
    {

    int b;



    scanf("%d", &:);
    printf( "%x", b );

    system ("pause");

    }
     
  9. woka

    woka Гость

    а подскажите почему я не могу перевести таким образом в шеснадцатиричную систему? я использую модификаторы "х" и "а"
     
  10. vol4ek88

    vol4ek88 Гость

    Спецификаторы формата:
    %с символ
    %d целое десятичное число
    %i целое десятичное число
    %e десятичное число в виде x.xx e+xx
    %E десятичное число в виде x.xx E+xx
    %f десятичное число с плавающей запятой xx.xxxx
    %F десятичное число с плавающей запятой xx.xxxx
    %g %f или %e, что короче
    %G %F или %E, что короче
    %o восьмеричное число
    %s строка символов
    %u беззнаковое десятичное число
    %x шестнадцатеричное число
    %X шестнадцатеричное число
    %% символ %
    %p указатель
    %n указатель



    int b = 12358523;

    scanf("%d", &:);
    printf( "%x", b );
     
  11. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    vol4ek88, что-то мне подсказывает что запись: printf("Decimal # = %i\n", &val); выведет на экран адрес переменной а не ее значение. Ты так не считаешь?
     
  12. vol4ek88

    vol4ek88 Гость

    не заметил знак присвоения. пардон
     
  13. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Я про оператор &. Не знаю о каком знаке присвоения ты говоришь.
     
  14. vol4ek88

    vol4ek88 Гость

    об этом
     
  15. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Это не знак присвоения. Вот как выглядит знак присвоения: =
     
Загрузка...

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