Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Строки


Автор: Ursa 17.3.2012, 16:14
Здесь идёт преобразования из двоичной в 16теричную систему,помогите пожалуйста сделать,чтобы из 10тиричной в восьмиричную.
Код:

Код

#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[])
{
    printf("Vvedite v stroku chislo v 2-noi sisteme schislenia: ");
    char s[51], strout[15];
    int tmp=0;
    gets(s);
    int len=0;
    for (int i=0; s[i]!=0; i++) {
        len++;
    }
    int x=len-len/4*4, i=0, n=0, z;
    if(x==0) {x=4;}
    while (s[i]!=0) {
         for(int j=4-x; j<4; j++){
             switch (s[i]) {
                 case '0': {z=0; break;}
                 case '1': {z=1; break;}
             }
             tmp += z*pow(10,fabs(j-3));
             i++;
         }
         x=4;
         switch (tmp){
             case 0: {strout[n]='0';break;}
             case 1: {strout[n]='1';break;}
             case 10: {strout[n]='2';break;}
             case 11: {strout[n]='3';break;}
             case 100: {strout[n]='4';break;}
             case 101: {strout[n]='5';break;}
             case 110: {strout[n]='6';break;}
             case 111: {strout[n]='7';break;}
             case 1000: {strout[n]='8';break;}
             case 1001: {strout[n]='9';break;}
             case 1010: {strout[n]='A';break;}
             case 1011: {strout[n]='B';break;}
             case 1100: {strout[n]='C';break;}
             case 1101: {strout[n]='D';break;}
             case 1110: {strout[n]='E';break;}
             case 1111: {strout[n]='F';break;}
         }
        n++;
        tmp=0;
    }
        
    strout[n]=0;
    printf("Eto chislo v 16-noi sisteme schislenia: ");
    puts(strout);
    
    return 0;
}


Автор: Cheloveck 17.3.2012, 17:25
Цитата(Ursa @  17.3.2012,  17:14 Найти цитируемый пост)
Здесь идёт преобразования из двоичной в 16теричную систему

Нет, здесь идёт бред сивой кобылы.

Автор: Ursa 17.3.2012, 18:47
Цитата(Cheloveck @ 17.3.2012,  17:25)
Цитата(Ursa @  17.3.2012,  17:14 Найти цитируемый пост)
Здесь идёт преобразования из двоичной в 16теричную систему

Нет, здесь идёт бред сивой кобылы.

Почему? Всё работает.

Автор: Randajad 17.3.2012, 19:34
Потому что писал человек ума недалекого.

#include <stdio.h>

int convert(long long n, char p) {
   int ret = 0;
   for(int k = 1; n; n /= 10, k *= p)
      ret += (n % 10) * k;
   return ret;
}

int main() {
   long long n;
   scanf("%lld", &n);
   printf("\nres %d", convert(n, 8));
}

Так лучше. convert() переводит из любой системы число и возвращает десятичное. Первый параметр - число. Второй - система отсчета. Для перевода из десятичной в какую-либо другую и в строку - itoa. А еще можно (s)scanf, (s)printf с %o, %d, %x.

Автор: Ursa 17.3.2012, 20:14
Я это как бы понимаю,но так получается не по условию задания. 

Автор: borisbn 17.3.2012, 23:33
Цитата(Randajad @  17.3.2012,  19:34 Найти цитируемый пост)
 convert() переводит из любой системы число и возвращает десятичное

Ерунду (мягко говоря) написал. Число - оно и в Африке число. Посмотри на свои руки. Сколько там пальцев? От того, как ты отображаешь это количество - 12(oct), A(hex), 1010(bin) - оно не изменится (хирургию сейчас не рассматриваем).
Можно говорить только о строковом представлении числа (нет не так - ЧИСЛА) в какой-то системе исчисления.

Ursa, ты ж уже задавал(а) http://forum.vingrad.ru/topic-348624.html. Тебе там уже http://forum.vingrad.ru/index.php?showtopic=348624&view=findpost&p=2469833

Добавлено через 4 минуты и 3 секунды
Ursa, и ещё. ИМХО такого рода вопросы стОит задавать в http://forum.vingrad.ru/forum/forum-471.html, а не в общих вопросах в общих вопросах

Автор: volatile 17.3.2012, 23:44
Цитата(borisbn @  17.3.2012,  23:33 Найти цитируемый пост)
Тебе там уже ответили 

borisbn, там слишком круто написано. Нужно написать в стиле первого сообщения. Чтобы ни у кого не возникло сомнений в авторстве   smile 

Автор: borisbn 17.3.2012, 23:58
volatile,  smile 
Не смотрел первое сообщение. После того, как Вы обратили внимание, глянул... Вполне себе приличный неработающий индокод. Интересно, если б нужно было бы преобразовать в base64 - было бы 64 case'а?

Автор: Randajad 18.3.2012, 10:22
Это был как вариант с консольным приложением-переводчиком чисел из разных систем счисления. Задачу свою оно выполняет. Что не так-то? Почему должны быть строки? С ними и работать медленнее.
base64 - кодирование информации, к сведению.

Автор: borisbn 18.3.2012, 10:50
Randajad, повторю - числа не могут быть в какой-либо системе исчисления. Числа - это количество. А вот представление числа/количества может быть в любой системе исчисления.
Цитата(Randajad @  18.3.2012,  10:22 Найти цитируемый пост)
Что не так-то?

Попробуй своей функцией преобразовать в 16-тиричную систему и всё поймёшь

Цитата(Randajad @  18.3.2012,  10:22 Найти цитируемый пост)
base64 - кодирование информации, к сведению.

с какого перепугу? HEX тогда тоже кодирование?
Цитата
Base64 буквально означает — позиционная система счисления с основанием 64

http://ru.wikipedia.org/wiki/Base64

Автор: Randajad 18.3.2012, 12:08
:С
Действительно, как-то про что-то более 10 не подумал.

Ну тогда:

Код

int convert(const char *str, char base) {
   int ret = 0;
   for(int k = 1; *str; k *= base, str++) {
      char c = *str;
      if(c >= '0' && c <= '9')
         c -= '0';
      else if(c >= 'a' && c <= 'z')
         c -= 'a' - 10;
      else if(c >= 'A' && c <= 'Z')
         c -= 'A' - 10;
         
     ret += c * k;   
   }
   
   return ret; 
}

Автор: borisbn 18.3.2012, 12:14
Цитата(Randajad @  18.3.2012,  12:08 Найти цитируемый пост)
c -= 'a' - 10;

- 10 то зачем ? наверное, ты хотел + 10  smile 
и строка на входе должна быть перевёрнутая

Автор: Randajad 18.3.2012, 12:23
Пардон.
Вот так лучше!

Код

int convert(const char *str, char base) {
   int ret = 0;
   for(; *str; str++) {
      char c = *str;
      if(c >= '0' && c <= '9')
         c -= '0';
      else if(c >= 'a' && c <= 'z')
         c -= 'a' - 10;
      else /// A..Z
         c -= 'A' - 10;
     
     ret *= base;    
     ret += c;   
   }
   
   return ret; 
}


Именно - 10. Потому что c = c - 'a' + 10 будет именно как c -= 'a' - 10. smile

Автор: Ursa 18.3.2012, 19:43
Спасибо всем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)