1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

перевод чисел

Тема в разделе "Вопросы новичков и не только", создана пользователем Pront0, 11 ноя 2009.

Статус темы:
Закрыта.
  1. Pront0

    Pront0 Гость

    Репутация:
    0
    Всем доброе время суток)
    Есть задача:
    На входе строка с числом в шестнадцатиричной форме. Распознать строку в переменную типа int. На выходе строки с введенным числом в двоичной, восьмиричной и десятичной форме.

    Нужно решить ее на С (не плюсах).Туплю, не могу решить. На паскале делал все норм.
    Но тут проблема, вобщем вот код:

    [codebox]
    #include <stdio.h>
    #include <conio.h>

    //функция для перевода интежеровского 10ого в интежеровский 2ичный
    int dec_v_bin(int x) {
    int k,j,y,i;
    char Ch[32];

    for (i=0;i<32;i++) { /* заполняем массив Ch[] */
    y=x&1; //побитовое и, т.е. определяем 1 или ноль
    Ch=y; //затем записываем в массив
    x=x>>1; //сдвигаем
    };

    for(j=31;j>=0;j-=1) { /* Выводи массив Ch[] */
    if(Ch[j]!=0) {
    for (k=j;k>=0;k-=1) { //2 цикла которые переворачивают массив
    printf("%d",Ch[k]);
    };
    break;
    };
    };
    return 0;

    }

    //фунцкция перевода строки 16го формата в интежер 16го

    int Str2Int16(char* str)
    {
    int i,r,n = strlen(str);
    for(r=i=0;i<n;i++)
    {
    r*=16;
    if(str>='0'&& str<='9') r+=str-'0';
    if(str>='A'&& str<='F') r+=str-'A'+10;
    if(str>='a'&& str<='f') r+=str-'a'+10;
    }
    return r;
    }


    int main()
    {
    char s[30];
    int dec;
    printf("Enter hex->");
    scanf("%s",s); //вводим строку 16ое число
    dec=Str2Int16(s); //запоминаем в dec уже интежер 16го

    printf("Dec: %d\n",dec); //выводим в десятичной
    printf("Oct: %o\n",dec); //восбмиричной
    dec_v_bin(dec); //двоичной




    getch();
    return 0;
    }[/codebox]


    Этот код рабочий, это максимум что я смог.
    А нужно чтобы строки были на выходе, т.е. можно пользоваться только %s в printf е
    Т.е. последний строки должны выглядеть не так:
    [codebox]printf("Dec: %d\n",dec); //выводим в десятичной
    printf("Oct: %o\n",dec); //восбмиричной
    dec_v_bin(dec); //двоичной[/codebox]
    А:
    [codebox]printf("Dec: %s\n",.....); //выводим в десятичной
    printf("Oct: %s\n",...); //восбмиричной
    dec_v_bin(dec); //двоичной[/codebox]
    Да, и в фунцкции dec_v_bin(int x), тоже не printf("%d",Ch[k]); А printf("%s",Ch[k]);

    Помогите))
     
  2. Setry

    Setry Гость

    Репутация:
    0
    вот, накатал, что-то вроде похожее и вроде работающее=)

    Код:
    // main.c
    // На входе строка с числом в шестнадцатиричной форме. 
    // Распознать строку в переменную типа int. 
    // На выходе строки с введенным числом в двоичной, восьмиричной и десятичной форме.
    //
    #include<stdio.h>
    #include<locale.h>
    #include<ctype.h>
    #include<stdlib.h>
    #include<string.h>
    #define BUF 16
    #define ISGOOD(x)	(isdigit(x)||(x>='A'&&x<='F'))
    
    char*sErrors[]={
    "Не удалось получить число."	// 1
    "Не хватает размера буфера, для первода числа."	// 2
    };
    int merrno;
    
    int readNum(),gorner(char*,int);
    void merror(char*),unGorner(int,int,char*,int);
    
    int main()
    {
    int num;
    char bbuf[BUF],obuf[BUF],dbuf[BUF];
    setlocale(LC_ALL,"Russian");
    merrno=0;
    num=readNum();
    if(merrno)
    {
    merror("readNum");
    exit(merrno);
    }
    merrno=0;
    unGorner(num,2,bbuf,BUF);
    if(merrno)
    {
    merror("unGorner bbuf");
    exit(merrno);
    }
    unGorner(num,8,obuf,BUF);
    if(merrno)
    {
    merror("unGorner obuf");
    exit(merrno);
    }
    unGorner(num,10,dbuf,BUF);
    if(merrno)
    {
    merror("unGorner dbuf");
    exit(merrno);
    }
    printf("\nb: %s\no: %s\nd: %s\n",bbuf,obuf,dbuf);
    return 0;
    }
    
    int readNum()
    {
    int count,success;
    char buf[BUF],*b=NULL;
    for(count=0;count<3;count++)
    {
    printf("Введите число в шестнадцатиричной форме: ");
    scanf("%s",buf);
    b=buf-1;
    success=1;
    while(*++b)if(!ISGOOD(toupper(*b)))
    {
    printf("Введенно некоректное значение\n");
    success=0;
    break;
    }
    if(!success)continue;
    break;
    }
    if(count==3)
    {
    merrno=1;
    return -1;
    }
    return gorner(buf,16);
    }
    
    int gorner(char*num,int osn)
    {
    int n=0,t;
    char*b=num-1;
    while(*++b)
    {
    n=n*osn+(isdigit(*b)?*b-'0':*b-'A'+10);
    }
    return n;
    }
    
    void unGorner(int num,int osn,char*out,int l)
    {
    char*b=out,c;
    int t,i,j;
    while(num)
    {
    t=num%osn;
    *b++=t<10?t+'0':t+'A'-10;
    num/=osn;
    }
    *b=0;
    i=0;
    j=strlen(out)-1;
    while(i<j)out[i++]^=out[j--]^=out[i]^=out[j];
    }
    
    void merror(char*str)
    {
    printf("%s: %s\n",str,sErrors[merrno-1]);
    }
     
  3. Pront0

    Pront0 Гость

    Репутация:
    0
    огромное спасибо))))))))))))))
    выручил))))жаль плюсовать не могу(
     
Загрузка...
Статус темы:
Закрыта.

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