Форум программистов, компьютерный форум 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();
 
 
}

больше кодов в гугле не нашёл...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dimedrol
 Аватар для Dimedrol
2363 / 934 / 14
Регистрация: 25.04.2009
Сообщений: 2,636
Записей в блоге: 4
06.09.2009, 22:02  [ТС]     Перевод чисел в определённую систему #21
У меня ничего не выводит...я думаю из-за
C++
1
if ( argc != 1 ) { exit( 2 ); }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
06.09.2009, 22:03     Перевод чисел в определённую систему #22
В программу нужно подать один аргумент - 10-ричное число
logiC
16 / 16 / 2
Регистрация: 06.06.2009
Сообщений: 50
06.09.2009, 23:14     Перевод чисел в определённую систему #23
Цитата Сообщение от polivets Посмотреть сообщение
Цитата:
Сообщение от Lolcht0 Посмотреть сообщение
256-ричная
Думаю, что такой СС нету макс это 36-ричная.
Ты это так решил, потому что количество цифр + кол-во латинских букв = 36?)))

никто не мешает использовать и другие символы. В общем, разрядность СС ограничена только фантазией и удобством ее восприятия...
Dimedrol
 Аватар для Dimedrol
2363 / 934 / 14
Регистрация: 25.04.2009
Сообщений: 2,636
Записей в блоге: 4
07.09.2009, 00:23  [ТС]     Перевод чисел в определённую систему #24
В программу нужно подать один аргумент - 10-ричное число
А мне надо, чтобы я вписывал число с помощью scanf и програ переводила его в 2, 6, 8, 10, 16 , вписанное число также может являться 2, 6, 8, 10, 16 СС ...
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
07.09.2009, 10:42     Перевод чисел в определённую систему #25
Тогда тебе придется сначала указывать систему счисления до ввода числа, так как в общем случае автоматически определить систему счисления не представляется возможным.

Добавлено через 14 минут
Вот программа
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
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_BASE
 
int base_arr[]= {
    2, 6, 8, 10, 16
};
 
#define MAX_BASE_INDEX  (sizeof(base_arr)/sizeof(base_arr[0]))
 
 
int main( int argc, char *argv[] ) {
 
int i;
int base;
long val;
char *endptr;
char buf[80];
 
 
argc--; argv++;
 
if ( argc != 2 ) {
    fprintf( stderr, "Usage: XtoX base number\n" );
    exit( 2 );
}
base= atoi( argv[0] );
if ( base<2 || base>36 ) {
    fprintf( stderr, "Invalid base: |%s|\n", argv[0] );
    exit( 1 );
}
val= strtol( argv[1], &endptr, base );
if ( *endptr != '\0' ) {
    fprintf( stderr, "Invalid number: |%s|\n", argv[1] );
    exit( 1 );
}
 
printf( "Input\n" "base=%-2d value=%s\n" "\n", base, itoa( val, buf, base ) );
for ( i= 0; i<MAX_BASE_INDEX; i++ ) {
    printf( "base=%-2d value=%s\n", base_arr[i], itoa( val, buf, base_arr[i] ) );
}
 
return 0;
 
} /* main() */
Добавлено через 38 секунд
Пример запуска:
Код
> XtoX.exe 10 1010
Input
base=10 value=1010

base=2  value=1111110010
base=6  value=4402
base=8  value=1762
base=10 value=1010
base=16 value=3f2
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
07.09.2009, 13:06     Перевод чисел в определённую систему #26
odip, Это хорошо, когда itoa есть. Стандартом вроде бы не описана.

dimjan4, Вот на С вариант, но опять же основание числа вводить прийдётся через пробел в буквенном виде (для наглядности):
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
 
/* перевод чисел в разные системы счисления */
 
/* int2bin - представление числа в виде строки */
char *long2bin(unsigned long int d, char *s){
    int first, last;
    char c;
    char *p = s;
    while ( d > 0 ){
        *p++ = d % 2 + '0';
        d /=  2;
    }
    *p = 0;
    for ( first = 0, last = (strlen(s) - 1); first < last; first++, last--){
        c = s[first];
        s[first] = s[last];
        s[last] = c;
    }
    return(s);
}
 
 
int main(){
    char buf[BUFSIZ];
    char strval[sizeof(long)*CHAR_BIT + 1]; /* максимальная длинна long в двоичном виде с завершающим нулём */
    char bas;
    long int d;
    
    while ( 1 ){
        printf("Enter some number followed by space separated basis (b o d x), or q to quit:\n");
        fgets(buf, BUFSIZ, stdin);
        if ( *buf == 'q' )
            break;
        if ( sscanf(buf, "%s %c", &strval, &bas) != 2 )
            continue;
        switch ( bas ){
            case 'b' :
                d = strtol(strval, NULL, 2);
                break;
            case 'o' :
                d = strtol(strval, NULL, 8);
                break;
            case 'd' :
                d = strtol(strval, NULL, 10);
                break;
            case 'x' :
                d = strtol(strval, NULL, 16);
                break;
            default :
                printf("Invalid basis value!\n");
                exit(1);
                break;
        }
        printf("Bin: %s\nOct: %#lo\nDec: %ld\nHex: %#lx\n", long2bin(d, buf), d, d, d);
    }
    
    return(0);
}
Пример работы:
Перевод чисел в определённую систему
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
07.09.2009, 14:16     Перевод чисел в определённую систему #27
Только сейчас заметил - там вместо восьмеричной шестиричная система нужна! Ну примерно всё так же, как с двоичной, функцию только малость изменить
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char *long2six(unsigned long int d, char *s){
    int first, last;
    char c;
    char *p = s;
    while ( d > 0 ){
        *p++ = d % 6 + '0';
        d /=  6;
    }
    *p = 0;
    for ( first = 0, last = (strlen(s) - 1); first < last; first++, last--){
        c = s[first];
        s[first] = s[last];
        s[last] = c;
    }
    return(s);
}
И, видимо, ещё один буфер приделать для printf
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
07.09.2009, 14:31     Перевод чисел в определённую систему #28
Вот реализация itoa().
Но в VS и gcc эта функция и так есть.
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
#include <stdio.h>
#include <stdlib.h>
 
/**
 * Ansi C "itoa" based on Kernighan & Ritchie's "Ansi C"
 * with slight modification to optimize for specific architecture:
 */
void strreverse(char* begin, char* end) {
    char aux;
    while(end>begin)
        aux=*end, *end--=*begin, *begin++=aux;
}
    
void my_itoa(int value, char* str, int base) {
    static char num[] = "0123456789abcdefghijklmnopqrstuvwxyz";
    char* wstr=str;
    int sign;
    div_t res;
 
    // Validate base
    if (base<2 || base>35){ *wstr='\0'; return; }
 
    // Take care of sign
    if ((sign=value) < 0) value = -value;
 
    // Conversion. Number is reversed.
    do {
        res = div(value,base);
        *wstr++ = num[res.rem];
    }while( (value=res.quot) != 0);
    
    if(sign<0) *wstr++='-';
    *wstr='\0';
 
    // Reverse string
    strreverse(str,wstr-1);
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
07.09.2009, 14:39     Перевод чисел в определённую систему #29
Цитата Сообщение от odip Посмотреть сообщение
Но в VS и gcc эта функция и так есть.
Не-а! Нету в gcc ни в debian-овском 4.3.2, ни в cygwin-овском 3.4.4. А в VS и не такое встретить можно...
Delphin_KKC
UNIX-way
 Аватар для Delphin_KKC
710 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
07.09.2009, 17:41     Перевод чисел в определённую систему #30
Цитата Сообщение от easybudda Посмотреть сообщение
Не-а! Нету в gcc ни в debian-овском 4.3.2, ни в cygwin-овском 3.4.4. А в VS и не такое встретить можно...
В DevCPP 4.9.9.2 есть.
Кроме того: http://ru.wikipedia.org/wiki/Itoa_(Си)
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
07.09.2009, 17:46     Перевод чисел в определённую систему #31
В mingw gcc 3.4.5 есть itoa().
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
07.09.2009, 18:15     Перевод чисел в определённую систему #32
Цитата Сообщение от odip Посмотреть сообщение
В mingw gcc 3.4.5 есть itoa().
А в gcc 3.4.6, который к FreeBSD 6.2 прилагается, опять нет. Короче лучше на её присутствие не закладываться. Опять же
itoa — часто используемая функция языка Си, не входящая в стандарт языка.
Так как функция itoa не имеет возможности проверить размер буфера, в который производит запись, то, в случае ошибки программиста, использование этой функции может привести к переполнению буфера и откроет возможность соответствующих атак.
ИМХО если действительно часто используется, и не только в учебных примерах, лучше свою написать с поправкой на замечание о безопасности...
Delphin_KKC
UNIX-way
 Аватар для Delphin_KKC
710 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
07.09.2009, 19:32     Перевод чисел в определённую систему #33
Цитата Сообщение от easybudda Посмотреть сообщение
...лучше свою написать с поправкой на замечание о безопасности...
Так как функция itoa не входит в стандарт, наиболее правильным является использование стандартных функций:
sprintf(str, "%d", value); преобразует к десятичному виду.
sprintf(str, "%x", value); преобразует к шестнадцатиричному виду.
sprintf(str, "%o", value); преобразует к восьмеричному виду.
Имхо:
Вместо itoa рекомендуется использовать стандартную (ISO C99) функцию snprintf, так как она проверяет размер буфера и не производит запись за его пределами.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
07.09.2009, 19:40     Перевод чисел в определённую систему #34
А если основание нужно не 8/10/16? В задаче, кстати, шестиричная система присутствует (интересно, кому оно надо?), да и двоичные числа printf не печатает...
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
07.09.2009, 19:42     Перевод чисел в определённую систему #35
В задаче, кстати, шестиричная система присутствует (интересно, кому оно надо?)
Ха-ха-ха - насмешил
Дык все адреса памяти в 16-ричной системе даются
А если основание нужно не 8/10/16?
Так нужно сделать как я предложил - взять реализацию itoa() если компилятор не знает такой функции.
Dimedrol
 Аватар для Dimedrol
2363 / 934 / 14
Регистрация: 25.04.2009
Сообщений: 2,636
Записей в блоге: 4
07.09.2009, 19:54  [ТС]     Перевод чисел в определённую систему #36
easybudda, что то не так:
http://xmages.net/out.php/i473093_ss.JPG
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
07.09.2009, 19:55     Перевод чисел в определённую систему #37
Цитата Сообщение от odip Посмотреть сообщение
Ха-ха-ха - насмешил
Цитата Сообщение от dimjan4 Посмотреть сообщение
Нужно сделать программу для перевода числа в разные систему то есть вписываешь число и программа должна выдать следующий ответ (мы написали 1010):
двоичная: ИСХОДНОЕ ЧИСЛО
десятичная: 10
шестиричная: 12
шестнадцатеричная: A
Кстати, десятичное 10 при таком подходе будет 14, а не 12...

Цитата Сообщение от odip Посмотреть сообщение
Так нужно сделать как я предложил - взять реализацию itoa() если компилятор не знает такой функции.
Цитата Сообщение от easybudda Посмотреть сообщение
Так как функция itoa не имеет возможности проверить размер буфера...
Цитата Сообщение от dimjan4 Посмотреть сообщение
easybudda, что то не так:
Странно... Специально отсюда свой же код скопировал, скомпилил, и вот:
Перевод чисел в определённую системуМало того, на двух компах с разными gcc проверил...

dimjan4, А Вы случайно long2bin на long2six не заменили? а то вот она бы как-раз 14 и выдавала... Условие задачи уточните, пожалуйста...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
07.09.2009, 22:36     Перевод чисел в определённую систему #38
Более общий вариант. main переделывать "красиво" было лень, сделал, чтобы наверняка работала. И восьмеричную систему на шестеричную менять не стал - а то и в правду смешно.
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
 
/* revstr - строка наоборот */
char *revstr(char *s){
    char *h = s; /* head */
    char *t = h + strlen(s) - 1; /* tail */
    char c;
    
    while ( h < t ){
        c = *h;
        *h = *t;
        *t = c;
        h++;
        t--;
    }
    
    return(s);
}
 
/* возвращает в buf строку не длиннее len - 1 символов, представляющую число val в CC с основанием base, или NULL при неудаче */
char *itoan(char *buf, int len, unsigned int val, int base){
    static char num[] = "0123456789abcdefghijklmnopqrstuvwxyz";
    char *str = buf;
 
    if ( (base < 2) || (base > 35) )
        return(NULL);
    
    while ( val ){
        if ( --len < 1 )
            return(NULL);
        *buf++ = num[val % base];
        val /= base;
    }
    *buf = '\0';
    return(revstr(str));
}
        
    
    
 
int main(){
        char buf[BUFSIZ];
        char binval[sizeof(long)*CHAR_BIT + 1]; /* максимальная длинна long в двоичном виде с завершающим нулём */
        char octval[sizeof(long)*CHAR_BIT + 1];
        char decval[sizeof(long)*CHAR_BIT + 1];
        char hexval[sizeof(long)*CHAR_BIT + 1];
        char strval[sizeof(long)*CHAR_BIT + 1];
        char bas;
        long int d;
        
        while ( 1 ){
                printf("Enter some number followed by space separated basis (b o d x), or q to quit:\n");
                fgets(buf, BUFSIZ, stdin);
                if ( *buf == 'q' )
                        break;
                if ( sscanf(buf, "%s %c", &strval, &bas) != 2 )
                        continue;
                switch ( bas ){
                        case 'b' :
                                d = strtol(strval, NULL, 2);
                                break;
                        case 'o' :
                                d = strtol(strval, NULL, 8);
                                break;
                        case 'd' :
                                d = strtol(strval, NULL, 10);
                                break;
                        case 'x' :
                                d = strtol(strval, NULL, 16);
                                break;
                        default :
                                printf("Invalid basis value!\n");
                                exit(1);
                                break;
                }
                printf("Bin: %s\nOct: 0%s\nDec: %s\nHex: 0x%s\n", itoan(binval, sizeof(binval), (int)d, 2),
                                                                itoan(octval, sizeof(octval), (int)d, 8),
                                                                itoan(decval, sizeof(decval), (int)d, 10),
                                                                itoan(hexval, sizeof(hexval), (int)d, 16) );
        }
        
        return(0);
}
Перевод чисел в определённую систему
сашк
0 / 0 / 0
Регистрация: 08.11.2009
Сообщений: 111
04.03.2010, 19:57     Перевод чисел в определённую систему #39
спасибо!!! крутой код!!!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2012, 13:57     Перевод чисел в определённую систему
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
we2seek
 Аватар для we2seek
56 / 56 / 12
Регистрация: 25.01.2010
Сообщений: 288
13.07.2012, 13:57     Перевод чисел в определённую систему #40
Цитата Сообщение от easybudda Посмотреть сообщение
А цифра, эквивалентная десятичному числу 255 как в этой системе выглядит?
Так и будет - 255
Yandex
Объявления
13.07.2012, 13:57     Перевод чисел в определённую систему
Ответ Создать тему

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

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