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

Тема в разделе "C/C++/C#", создана пользователем Pront0, 11 ноя 2009.

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

    Pront0 Гость

    Всем доброе время суток)
    Есть задача:
    На входе строка с числом в шестнадцатиричной форме. Распознать строку в переменную типа 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 Гость

    вот, накатал, что-то вроде похожее и вроде работающее=)

    Код (Text):
    // 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 Гость

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

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