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


Автор: DESert 29.12.2005, 12:36
помогите плиз написать функцию
Код

void number(int x,int base)

которая переводит число x в систему исчесления base

у меня никак не получается smile
или идею подскажите
Добавлено @ 12:39
язык обычный Си

Автор: pablo 29.12.2005, 12:52
вам вот сюда: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vclrfHex_ios.asp

Автор: chaos 29.12.2005, 12:54
Цитата(pablo @ 29.12.2005, 12:52)
вам вот сюда: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vclrfHex_ios.asp

а если ему надо перевести в 7ую систему счисления smile
Добавлено @ 12:55
все что тебе надо:
понимать на пальцах как осуществляется перевод
Добавлено @ 12:56
это конечно если тебе надо переводить в нестандартную систему, а если только 10 8 и 16 то это раз плюнуть

Автор: DESert 29.12.2005, 13:03
проблема в том, что base < 201 !!!
то есть любое число до 201...
что с эти делать непонятно smile

Автор: Aleksandor 29.12.2005, 13:04
Ну не знаю smile Все данные для машины существуют в двоичной системе. Единственно различие что могут упакованными либо неупакованными, ну и порядок следования байтов может быть разный.

Если надо например перевести строку символов в память машины в виде числа то есть функция strtol. Обратное преобразование - ultoa

Или если переводим двоичное число х в систему кратную 2 то можно так-
в двоичную: если бит 0 пишем 0, если 1 то 1
в восьмеричную: соответственно каждые 3 бита это числа от 0 до 7
в 16ричную: каждые 4 бита - числа от 0 до F

Чтобы перевести в 10-ную нужно найти сумму произведений цифры на основание системы в степени на 1 меньшей порядка цифры.

например число 0101101 (двоичное) переводим в десятичное
2 в степени 0 = 1
2 в степени 2 = 4
2 в степени 3 = 8
2 в степени 5 = 32
итого 32+8+4+1 = 45 (десятичное)

А из десятичной можно перевести в любую другую-
Делишь с остатком число на основание нужной степени, потом результат ещё раз и т. д. пока не останется 0. Тогда все остатки записываешь в обратном порядке. Они и образуют число в нужной системе. Только нужно не забывать, что если основание больше 10, то цифра может быть больше 9, а значит заменяется на букву.


Автор: chaos 29.12.2005, 13:07
разберись как переводят 10->2 и 2->10
и ты сможешь написать функцию каторая переводит в любую систему!!!!

Автор: DESert 29.12.2005, 13:12
а можно ли из двоичной перевести в любую систему счсиления?
Добавлено @ 13:13
Цитата
разберись как переводят 10->2 и 2->10
и ты сможешь написать функцию каторая переводит в любую систему!!!!


так это понятно... но как из 2->n - ричную...
тут не могу сообразить

Автор: DESert 29.12.2005, 14:28
Подскжите!! в чём ошибка!!! smile
Код

void print_number(int x,int base)
{
    int ostatok[50];
    int chastnoe=0,i=0;
    
    printf("Perevod chisla %d v %d chislenia\n", x, base);
    printf("Result:  ");
    
    if (x<base) putchar(x);
    
    else
    {    
        do
        {
            chastnoe = x / base;
            
            ostatok[i] = x - base*chastnoe;
            
            x = chastnoe;
            
            i++;
            
            printf("%d\n",x);
        
        } while (x > base);
        
    
    ostatok[i] = x;
    while (i<0)
    {
        putchar(ostatok[i]);
        i--;
    }
    
    }
}

Автор: DESert 29.12.2005, 14:47
Код

putchar(x);


не рабоает... smile((

Автор: Exekutor 29.12.2005, 14:50
Цитата

chastnoe = x / base;


Цитата

int chastnoe=0


такого не может быть. Делай частное типа float

Автор: DESert 29.12.2005, 15:08
Цитата
такого не может быть. Делай частное типа float

как так не может быть?... просто целочисленно разделит
меня больше волнует putchat() с printf() всё работает хорошо, но по условию задачи нужно с putchar()
Добавлено @ 15:10
а в том коде я нашел ошибку

Автор: Exekutor 29.12.2005, 15:12
что говорит?
Добавлено @ 15:14
Цитата

            chastnoe = x / base;
           
            ostatok[i] = x - base*chastnoe;


у тебя получится ноль. Используй float

Цитата

            ostatok[i] = x - base*chastnoe;
           
            x = chastnoe;


или поменяй строчки местами

Добавлено @ 15:20
И потом - зачем тебе массив?

Автор: RomaRS 29.12.2005, 15:33
Цитата(Exekutor @ 29.12.2005, 15:12)
что говорит?
Добавлено @ 15:14
Цитата

            chastnoe = x / base;
           
            ostatok[i] = x - base*chastnoe;


у тебя получится ноль. Используй float

Цитата

            ostatok[i] = x - base*chastnoe;
           
            x = chastnoe;


или поменяй строчки местами

Добавлено @ 15:20
И потом - зачем тебе массив?

ИМХО
float в вычислениях использовать не стоит...
Лучше double, float только для хранения темповых данных.

Автор: Exekutor 29.12.2005, 15:39
Интересно, а что DESert думает делать если массива в 50 элементов ему не хватит? Почему бы не использовать одно переменную? Неисповедимы пути...

Автор: DESert 29.12.2005, 15:43
массив, чтобы там остатки от деления хранить, а потом в обратном порядке выводить...

Код

chastnoe = x / base;
ostatok[i] = x - base*chastnoe;


в chastnoe запишется результат целочисленного деления, что мне и надо
вторая трочка - остаток от деления x на base

кстати, эта функция переводит любое число в любую разрядность
вот что у меня работает:
Код

void print_number(int x,int base)
{
    int ostatok[50];
    int chastnoe=0,i=0,j=0;
    
    printf("Perevod chisla %d v %d chislenia\n", x, base);

    
    if (x<base) printf("%d",x);
    else
    {    
        do
        {
            chastnoe = x / base;
            ostatok[i] = x - base*chastnoe;
            printf("Ostatok:  %d\n",ostatok[i]);
            x = chastnoe;
            i++;
        } while (x > base);
        
    
    ostatok[i] = x;
    printf("REsult:  \n");
                for(j=i;j>=0;j--)
        printf("%d",ostatok[j]);
    }
}

а вот если поставить вместо printf() putchar(), то всё уже неправильно...
может быть знаете почему?
Добавлено @ 15:45
можно и одну переменную- не в этом вопрос совсем

Автор: Exekutor 29.12.2005, 15:50
Цитата

chastnoe = x / base;

может, это у меня что-то с мозгами, но мне кажется, что ты не получишь здесь остатка. Для получения целочисленного остатка от деления двух чисел в с++ имеется специальная функция, только я ее не помню... smile
Добавлено @ 15:54
может, putchar() надо передавать не один параметр? Я никогда ей не пользовался

Автор: DESert 29.12.2005, 16:22
Цитата
может, это у меня что-то с мозгами, но мне кажется, что ты не получишь здесь остатка. Для получения целочисленного остатка от деления двух чисел в с++ имеется специальная функция, только я ее не помню... 

здесь я не получу остатка:
Код

int x, base, chastnoe;
chastnoe = x / base;

а получю следующее:
пусть
x = 6
base = 4
то x/base = 1 , а остаток:
x - (x/base) * base = 6 - (6/4) *4 = 2 , где 6/4=1
только не говорите, что можно сократить 4-ки...

Цитата
может, putchar() надо передавать не один параметр? Я никогда ей не пользовался

putchar(int c), а выдает белиберду, вместо с

Автор: Void 29.12.2005, 17:51
Цитата(DESert @ 29.12.2005, 18:22)
putchar(int c), а выдает белиберду, вместо с

А что ты ожидаешь от этой функции, я не понял? Параметр c - это код символа, который она выведет в stdout.

Автор: DESert 29.12.2005, 17:57
я ожидаю, чтобы она выдала число, а не код..
т.е. putchar(3) выдаст на экран 3

Автор: Void 29.12.2005, 18:02
DESert
Ну так и пользуйся printf("%d", number), в чем проблема-то? Зачем жаловаться, что функция чего-то не делает, если она этого не должна делать smile

Автор: DESert 29.12.2005, 18:07
Цитата
DESert
Ну так и пользуйся printf("%d", number), в чем проблема-то? Зачем жаловаться, что функция чего-то не делает, если она этого не должна делать 

ну я ж не совсем того еще smile
если б можно было использовать printf(), то всё было бы отлично,
а по условию задачи нужен злополучный putchar()...
а как его использовать правильно не знаю smile

Автор: Void 29.12.2005, 18:27
DESert
ОК, тогда делаем так. base по условию меньше 201. Значит мы можем воспользоваться обозначением цифр в виде символов ASCII, как это обычно принято. При этом цифры 0..9 будут отображаться как обычно, а все что больше - как символы алфавита:
Код
void print_digit(int d) {
    if (d < 10) putchar('0' + d - 10);
    else putchar('A' + d);
}

Автор: Aleksandor 29.12.2005, 18:27
printf форматирует вывод, а putchar нет
если условия задачи позволяют можно сначала в буфер вывести, а из буфера уже putc
Код

   char *p, buffer[100];

   sprintf(buffer, "%d\n", number); 
   
   p=buffer;
   while( *p != '\0' )      ch = putchar( (int)(*p++) );



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