Форум программистов, компьютерный форум CyberForum.ru

Перевод чисел в определённую систему - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 114, средняя оценка - 4.65
Dimedrol
 Аватар для Dimedrol
2363 / 934 / 14
Регистрация: 25.04.2009
Сообщений: 2,636
Записей в блоге: 4
05.09.2009, 19:19     Перевод чисел в определённую систему #1
Нужно сделать программу для перевода числа в разные систему то есть вписываешь число и программа должна выдать следующий ответ (мы написали 1010):
Код
двоичная: ИСХОДНОЕ ЧИСЛО
десятичная: 10
шестиричная: 12
шестнадцатеричная: A
Видите, программа должна ещё и узнать в какой системе написанно это число...
Вот я нашёл некоторые коды...только не знаю как их всунуть в эту программу..,

из 2 в 10

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main () {
    char c;
    int result=0;
    cout<<Rus("Введи число:");
    while(scanf("%c",&c) ) {
        if( (c<'0') || (c > '1') ) break;
        result<<=1;
        result+=c-'0';
    };
    printf("\n%d",result);
    getch();
};


из 2 в 16

C++
1
2
3
4
5
6
7
8
void DecToBin (long num,char *bin)
{
int i,j;
char tmp[33];
 
for (i=0; num; num>>=1, i++)tmp[i] = (num&1)?('1'):('0');
for (j=0; j<i; j++) bin[j] = tmp[i-j-1];
}


Из 10 в 2

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void main(void)
{long a=0, bb=0;
 char str[63];
 int i=0,k,tmp=0;
 clrscr();
 cin>>a;
 bb=a;
 while (bb!=0)
   {if ((abs(bb)%2)!=0)
      str[i]='1';
    else
      str[i]='0';
      ++i;
   bb=abs(bb)/2;
   };
 
   for ( k=0;k<=63;k++)
   if(str[k]!='1')
   str[k]='0';
   strrev(str);
   cout<<endl;
 
   if (a<0)
   {for ( k=0;k<=63;k++)
     {if (str[k]!='1')
      str[k]='1';
      else
      str[k]='0';};
 
    for (i=63;i>=0;i--)
    {if (str[i]=='1')
    str[i]='0';
    else
    {str[i]='1';
    break;}}
   }
   cout<<str<<endl;
   getchar();
   tmp=0;
   for(i=63,k=0;i>=0;i--,k++)
   tmp=tmp+str[i]*pow(2,k);
   getchar();
 
 
}

больше кодов в гугле не нашёл...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
05.09.2009, 23:44     Перевод чисел в определённую систему #2
Цитата Сообщение от dimjan4 Посмотреть сообщение
из 2 в 16
C++
1
void DecToBin (long num,char *bin)
Что-то мне подсказывает, что это из десятичной в двоичную.
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
05.09.2009, 23:52     Перевод чисел в определённую систему #3
проблема в том, что число 1010, вообще говоря, может существовать и в 16ричной системе, поэтому "определить" систему прога не сможет для любых комбинаций входных данных
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
06.09.2009, 00:05     Перевод чисел в определённую систему #4
Цитата Сообщение от Lolcht0 Посмотреть сообщение
проблема в том, что число 1010, вообще говоря, может существовать и в 16ричной системе,
1. Любое число может существовать в любой системе счисления
2. Название функции говооит само за себя: ДесятичноеВДвоичную
3. Содержимое функции тоже говорит само за себя: применяется метод перевода десятичного числа в двоичную форму.
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
06.09.2009, 00:07     Перевод чисел в определённую систему #5
Monte-Cristo, я про то, что цифры 1 и 0 есть в любой системе, цифра 2 - только в троичной и далее, цифра F - только в 16чной и далее
Delphin_KKC
UNIX-way
 Аватар для Delphin_KKC
710 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
06.09.2009, 00:28     Перевод чисел в определённую систему #6
Любая цифра обязательно есть в "своей" системе и в более ёмкой системе. Но её может не быть в менее ёмких.
Например 7 есть в восьмеричной, десятичной, шестнадцатиричной и всех последующих системах счисления. Но этой цифры нет в троичной и двоичной системах.
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
06.09.2009, 00:31     Перевод чисел в определённую систему #7
а теперь угадайте, в какой системе это число 1010145F11

ответ
в 256-ричной
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.09.2009, 00:34     Перевод чисел в определённую систему #8
Цитата Сообщение от Lolcht0 Посмотреть сообщение
а теперь угадайте, в какой системе это число 1010145F11

ответ
в 256-ричной
А цифра, эквивалентная десятичному числу 255 как в этой системе выглядит?
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
06.09.2009, 00:38     Перевод чисел в определённую систему #9
проверь -
C++
1
cout<<(char)255<<endl;
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,215
Завершенные тесты: 1
06.09.2009, 00:52     Перевод чисел в определённую систему #10
Цитата Сообщение от Lolcht0 Посмотреть сообщение
256-ричная
Думаю, что такой СС нету макс это 36-ричная.

Вот небольшая моя функция конвертирующая число в любую до 36-ричную.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// ****************************************************************************
//
// Функция   : ss_dec2other()
// Описание  : конвертирут число в строковое представление указанной
//             системы счисления
// Автор     : [email]oleg.polivets@gmail.com[/email]
//                                  
char *ss_dec2other(
  /* IN  */ long chislo,  // число, которое будет переводится
  /* IN  */ char osn,     // основание CC, в которую будем переводить
  /* OUT */ char *out,    // указатель на буфер куда будет помещатся строка
  /* IN  */ int  out_len) // длина результирующего буфера
{                        
    char hash_table[] = "0123456789abcdefghijklmnopqrstuvwxyz";
    char ch; 
    int  len = 0;
 
    // проверяем основание, в которое будем конвертировать
    if (osn>1 && osn <37 && out_len>0)
    {
        // самый простой алг, который может вообще быть
        while (chislo >= osn && len < out_len-1)
        {
            out[len++]  = hash_table[(chislo % osn)];
            chislo     /= osn;
        }
        // последнее число
        if (chislo==osn)
            out[len++]  = hash_table[chislo-1];
        else
            out[len++]  = hash_table[chislo];
        // разворачиваем выходную строку        
        for (int i = 0, j = len / 2; i < j; i++)
        {
            ch           = out[i];
            out[i]       = out[len-i-1];
            out[len-i-1] = ch;
        }
    }
    // завершающий ноль
    out[len]  = '\0';
 
    return out;
} // ss_dec2other()
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,215
Завершенные тесты: 1
06.09.2009, 01:13     Перевод чисел в определённую систему #11
2Lolcht0
Если бы было дествительно так, как Вы говорите, то например, для двоичной CC использовались бы цифры с ASCII кодами 0x00 и 0x01, а для шестнадцатирично использовались бы цифры 0x00, 0x01 ... 0x0f. Но, как все знают, для двоичной СС используются цифры с ASCII кодами 0x30 и 0x31, а для шестнадцатеричной 0x30 ... 0x39, 0x41 ... 0x46.

Добавлено через 7 минут
Цитата Сообщение от Lolcht0 Посмотреть сообщение
проблема в том, что число 1010, вообще говоря, может существовать и в 16ричной системе, поэтому "определить" систему прога не сможет для любых комбинаций входных данных
Тут я с Вами полностью согласен. Разработка программы, с такими требованиями (на данный момент может автор и поправит чего-нибудь, что он забыл написать в задании) невыполнима, как раз из-за неодназначности, о которой Вы говорите. Обязательно, должно указываться основания СС исходного числа.
Dimedrol
 Аватар для Dimedrol
2363 / 934 / 14
Регистрация: 25.04.2009
Сообщений: 2,636
Записей в блоге: 4
06.09.2009, 10:58  [ТС]     Перевод чисел в определённую систему #12
polivets, до меня чот не доходит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#include <conio.h>
#include<iostream.h>
#include<math.h>
#include<windows.h>
 
                                 
char *ss_dec2other(
  /* IN  */ long chislo,  // число, которое будет переводится
  /* IN  */ char osn,     // основание CC, в которую будем переводить
  /* OUT */ char *out,    // указатель на буфер куда будет помещатся строка
  /* IN  */ int  out_len) // длина результирующего буфера
{                        
    char hash_table[] = "0123456789abcdefghijklmnopqrstuvwxyz";
    char ch; 
    int  len = 0;
 
    // проверяем основание, в которое будем конвертировать
    if (osn>1 && osn <37 && out_len>0)
    {
        // самый простой алг, который может вообще быть
        while (chislo >= osn && len < out_len-1)
        {
            out[len++]  = hash_table[(chislo % osn)];
            chislo     /= osn;
        }
        // последнее число
        if (chislo==osn)
            out[len++]  = hash_table[chislo-1];
        else
            out[len++]  = hash_table[chislo];
        // разворачиваем выходную строку        
        for (int i = 0, j = len / 2; i < j; i++)
        {
            ch           = out[i];
            out[i]       = out[len-i-1];
            out[len-i-1] = ch;
        }
    }
    // завершающий ноль
    out[len]  = '\0';
 
    return out;
}
char bufRus[256];
char* Rus(const char* text) {
      CharToOem(text, bufRus);
      return bufRus;
      }      
int main () {
    char c;
    char ss;
    cout<<Rus("Введи число:");
    scanf("%c",&c))
   cout<<Rus("Введи CC:");
    scanf("%ss",&ss))
        ss_dec2other(с,ss,);
    getch();
};
Вот как с этим поступить:
C++
1
2
  /* OUT */ char *out,    // указатель на буфер куда будет помещатся строка
  /* IN  */ int  out_len) // длина результирующего буфера
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
06.09.2009, 11:09     Перевод чисел в определённую систему #13
Цитата Сообщение от dimjan4 Посмотреть сообщение
Вот как с этим поступить:
заменить /* OUT */, /* IN */
на

C++
1
2
3
4
5
6
7
#define IN
#define OUT
char *ss_dec2other(
  IN long chislo,  // число, которое будет переводится
  IN char osn,     // основание CC, в которую будем переводить
  OUT char *out,    // указатель на буфер куда будет помещатся строка
  IN int  out_len)
так красивей
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
06.09.2009, 11:16     Перевод чисел в определённую систему #14
polivets, кто мешает определить цифры как угодно? можно воспользоваться ascii, можно кодировать одну цифру 2мя символами, можно использовать греческий алфавит... я выбрал так, потому что мне так захотелось, и все)) и никто не в силах мне помешать
Dimedrol
 Аватар для Dimedrol
2363 / 934 / 14
Регистрация: 25.04.2009
Сообщений: 2,636
Записей в блоге: 4
06.09.2009, 12:05  [ТС]     Перевод чисел в определённую систему #15
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <conio.h>
#include<iostream.h>
#include<math.h>
#include<windows.h>
#define IN
#define OUT
                                 
char *ss_dec2other(
  /* IN  */ long chislo,  // число, которое будет переводится
  /* IN  */ char osn,     // основание CC, в которую будем переводить
  /* OUT */ char *out,    // указатель на буфер куда будет помещатся строка
  /* IN  */ int  out_len) // длина результирующего буфера
{                        
    char hash_table[] = "0123456789abcdefghijklmnopqrstuvwxyz";
    char ch; 
    int  len = 0;
 
    // проверяем основание, в которое будем конвертировать
    if (osn>1 && osn <37 && out_len>0)
    {
        // самый простой алг, который может вообще быть
        while (chislo >= osn && len < out_len-1)
        {
            out[len++]  = hash_table[(chislo % osn)];
            chislo     /= osn;
        }
        // последнее число
        if (chislo==osn)
            out[len++]  = hash_table[chislo-1];
        else
            out[len++]  = hash_table[chislo];
        // разворачиваем выходную строку        
        for (int i = 0, j = len / 2; i < j; i++)
        {
            ch           = out[i];
            out[i]       = out[len-i-1];
            out[len-i-1] = ch;
        }
    }
    // завершающий ноль
    out[len]  = '\0';
 
    return out;
}
char bufRus[256];
char* Rus(const char* text) {
      CharToOem(text, bufRus);
      return bufRus;
      }      
int main () {
    long c;
    char ss;
    int result=0;
    cout<<Rus("Введи число:");
    scanf("%c",&c))
    cout<<Rus("Введи CC:");
    scanf("%ss",&ss))
        char *ss_dec2other(
  IN long c,  // число, которое будет переводится
  IN char ss,     // основание CC, в которую будем переводить
  OUT char *out,    // указатель на буфер куда будет помещатся строка
  IN int  out_len)
    getch();
};

Не идёт...в чём проблема?
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,215
Завершенные тесты: 1
06.09.2009, 12:32     Перевод чисел в определённую систему #16
совсем забыл...
пример использования моей функции
C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
// ...
int main ()
{
    char buffer[1024];
    printf("%s\n", ss_dec2other(2,    16, buffer, sizeof(buffer)));
    printf("%s\n", ss_dec2other(20,   8,  buffer, sizeof(buffer)));
    printf("%s\n", ss_dec2other(256,  2,  buffer, sizeof(buffer)));
    printf("%s\n", ss_dec2other(1024, 16, buffer, sizeof(buffer)));
    return 0;
}
Добавлено через 10 минут
Цитата Сообщение от Lolcht0 Посмотреть сообщение
кто мешает определить цифры как угодно? можно воспользоваться ascii, можно кодировать одну цифру 2мя символами, можно использовать греческий алфавит... я выбрал так, потому что мне так захотелось, и все)) и никто не в силах мне помешать
Даже и не собираюсь Вам мешать... но тут дело в другом - нужно, чтобы вас понимали, т.е. опираться на общепринятые стандарты. А стандарт состоит в том, что для цифр СС используются алфавиты 0..9 с добавлением символов латинского алфавита (a..z), а больше пока ничего не придумали. Да и СС с основаниями > 16 живут в основном, в умах кибернетиков, и не имеют какой-либо прикладной направленности.

Кстати, если не доверяете моему авторитету, то может поверете Puporev'у. У нас в разделе Pascal, тоже была полемика на данный счет (воспользуйтесь поиском) и почитайте, что он пишет по данному поводу.

Добавлено через 9 минут

Не по теме:

Цитата Сообщение от zim22 Посмотреть сообщение
так красивей
Дело вкуса. Я задокументировал свою функцию в стиле WinAPI, просто потому-что так постоянно пользуюсь. Думаю, тем кто работат с WinAPI, так привычнее, да и понятней, что за параметры приходят в функцию. IMHO новичка может сбить столку схема, которую вы предлагаете. Да и бывалого программиста, если #define IN не будет под глазами. Когда я гляжу на такой код у меня возникает в мозгу, что IN переопределяет какой-то из квалификаторов памяти переменной. И нужно будет потратить N-ое количество времени, чтобы разобраться, что на самом деле, она ничего переопределяет (опять же если define где-то в инклудах).

Dimedrol
 Аватар для Dimedrol
2363 / 934 / 14
Регистрация: 25.04.2009
Сообщений: 2,636
Записей в блоге: 4
06.09.2009, 12:36  [ТС]     Перевод чисел в определённую систему #17
Теперь проблема в следующем:
Пишу число 10 (в двоичной системе счисления 1010)
Выводит мне огромное число (хотя использует только 1 и 0 )
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <windows.h>
char bufRus[256];
char* Rus(const char* text) {
      CharToOem(text, bufRus);
      return bufRus;
      }                                     
// ****************************************************************************
//
// Функция   : ss_dec2other()
// Описание  : конвертирут число в строковое представление указанной
//             системы счисления
// Автор     : [email]oleg.polivets@gmail.com[/email]
//                                  
char *ss_dec2other(
  /* IN  */ long chislo,  // число, которое будет переводится
  /* IN  */ char osn,     // основание CC, в которую будем переводить
  /* OUT */ char *out,    // указатель на буфер куда будет помещатся строка
  /* IN  */ int  out_len) // длина результирующего буфера
{                        
    char hash_table[] = "0123456789abcdefghijklmnopqrstuvwxyz";
    char ch; 
    int  len = 0;
 
    // проверяем основание, в которое будем конвертировать
    if (osn>1 && osn <37 && out_len>0)
    {
        // самый простой алг, который может вообще быть
        while (chislo >= osn && len < out_len-1)
        {
            out[len++]  = hash_table[(chislo % osn)];
            chislo     /= osn;
        }
        // последнее число
        if (chislo==osn)
            out[len++]  = hash_table[chislo-1];
        else
            out[len++]  = hash_table[chislo];
        // разворачиваем выходную строку        
        for (int i = 0, j = len / 2; i < j; i++)
        {
            ch           = out[i];
            out[i]       = out[len-i-1];
            out[len-i-1] = ch;
        }
    }
    // завершающий ноль
    out[len]  = '\0';
 
    return out;
} // ss_dec2other()
  
 
   int main ()
{
       long c;
       printf (Rus("Введи число для преобразования:"));
       scanf("%c",&c);
        char buffer[1024];
        printf(Rus("Двоичная система счисления: "));
        printf("%s\n", ss_dec2other(c,    2, buffer, sizeof(buffer)));
        system ("PAUSE");
}
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
06.09.2009, 17:41     Перевод чисел в определённую систему #18
Очевидно что в двоичной системе запись числа 1010 будет длиннее в цифрах чем "1010", то есть 4 цифры. Должно быть 10 цифр в 2-ой системе.
Dimedrol
 Аватар для Dimedrol
2363 / 934 / 14
Регистрация: 25.04.2009
Сообщений: 2,636
Записей в блоге: 4
06.09.2009, 18:47  [ТС]     Перевод чисел в определённую систему #19
Там выводит 22 цифры:
1000101111111100110001 вместо 1010, это из-за поля ввода....
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2009, 19:05     Перевод чисел в определённую систему
Еще ссылки по теме:

Перевод чисел в Фибоначчиеву систему счисления C++
C++ Перевод чисел из файла в римскую систему счисления
Как реализовать перевод чисел в другую систему счисления? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
06.09.2009, 19:05     Перевод чисел в определённую систему #20
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
 
int main( int argc, char *argv[] ) {
 
int val;
char buf[80];
 
argc--;
argv++;
 
if ( argc != 1 ) { exit( 2 ); }
val= atoi( argv[0] );
 
printf( "base=%02d value=%s\n", 2, itoa( val, buf, 2 ) );
printf( "base=%02d value=%s\n", 10, itoa( val, buf, 10 ) );
printf( "base=%02d value=%s\n", 16, itoa( val, buf, 16 ) );
 
return 0;
 
} /* main() */
Вывод
Код
> to2_10_16.exe 1010
base=02 value=1111110010
base=10 value=1010
base=16 value=3f2
Yandex
Объявления
06.09.2009, 19:05     Перевод чисел в определённую систему
Ответ Создать тему

Метки
перевод, системы счисления
Опции темы

Текущее время: 01:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru