Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 114, средняя оценка - 4.65
Dimedrol
2368 / 939 / 129
Регистрация: 25.04.2009
Сообщений: 2,636
Записей в блоге: 4
#1

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

05.09.2009, 19:19. Просмотров 15096. Ответов 39

Нужно сделать программу для перевода числа в разные систему то есть вписываешь число и программа должна выдать следующий ответ (мы написали 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();
 
 
}

больше кодов в гугле не нашёл...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2009, 19:19
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перевод чисел в определённую систему (C++):

Перевод чисел из 10 в 15 систему счисления
Доброго времени суток. Нужно написать программу для перевода введенных с...

Перевод чисел из 10-й в 2-ю систему счисления
Всем привет. Нужна помощь в доработке след.программы: Программа переводит...

Перевод чисел из системы в систему
Подскажите пожалуйста, как переводить числа из одной степени счисления в...

Перевод чисел в восьмеричную систему счисления
Есть программа которая переводит число из 10сс в 8сс(по условию) Не проходит...

Перевод чисел в строке в двоичную систему
На планете Роботов очень не любят десятичную систему счисления, поэтому они...

Перевод чисел из двоичной в десятичную систему
Добрый день! Помогите с заданием. Есть файл в котором содержится двоичный код...

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

никто не мешает использовать и другие символы. В общем, разрядность СС ограничена только фантазией и удобством ее восприятия...
0
Dimedrol
2368 / 939 / 129
Регистрация: 25.04.2009
Сообщений: 2,636
Записей в блоге: 4
07.09.2009, 00:23  [ТС] #24
В программу нужно подать один аргумент - 10-ричное число
А мне надо, чтобы я вписывал число с помощью scanf и програ переводила его в 2, 6, 8, 10, 16 , вписанное число также может являться 2, 6, 8, 10, 16 СС ...
0
odip
Эксперт С++
7161 / 3219 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
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
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
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);
}
Пример работы:
Перевод чисел в определённую систему
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
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
0
odip
Эксперт С++
7161 / 3219 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
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);
}
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
07.09.2009, 14:39 #29
Цитата Сообщение от odip Посмотреть сообщение
Но в VS и gcc эта функция и так есть.
Не-а! Нету в gcc ни в debian-овском 4.3.2, ни в cygwin-овском 3.4.4. А в VS и не такое встретить можно...
0
Delphin_KKC
UNIX-way
710 / 494 / 49
Регистрация: 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_(Си)
0
odip
Эксперт С++
7161 / 3219 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
07.09.2009, 17:46 #31
В mingw gcc 3.4.5 есть itoa().
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
07.09.2009, 18:15 #32
Цитата Сообщение от odip Посмотреть сообщение
В mingw gcc 3.4.5 есть itoa().
А в gcc 3.4.6, который к FreeBSD 6.2 прилагается, опять нет. Короче лучше на её присутствие не закладываться. Опять же
itoa — часто используемая функция языка Си, не входящая в стандарт языка.
Так как функция itoa не имеет возможности проверить размер буфера, в который производит запись, то, в случае ошибки программиста, использование этой функции может привести к переполнению буфера и откроет возможность соответствующих атак.
ИМХО если действительно часто используется, и не только в учебных примерах, лучше свою написать с поправкой на замечание о безопасности...
0
Delphin_KKC
UNIX-way
710 / 494 / 49
Регистрация: 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, так как она проверяет размер буфера и не производит запись за его пределами.
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
07.09.2009, 19:40 #34
А если основание нужно не 8/10/16? В задаче, кстати, шестиричная система присутствует (интересно, кому оно надо?), да и двоичные числа printf не печатает...
0
odip
Эксперт С++
7161 / 3219 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
07.09.2009, 19:42 #35
В задаче, кстати, шестиричная система присутствует (интересно, кому оно надо?)
Ха-ха-ха - насмешил
Дык все адреса памяти в 16-ричной системе даются
А если основание нужно не 8/10/16?
Так нужно сделать как я предложил - взять реализацию itoa() если компилятор не знает такой функции.
0
Dimedrol
2368 / 939 / 129
Регистрация: 25.04.2009
Сообщений: 2,636
Записей в блоге: 4
07.09.2009, 19:54  [ТС] #36
easybudda, что то не так:
http://xmages.net/out.php/i473093_ss.JPG
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
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 и выдавала... Условие задачи уточните, пожалуйста...
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
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);
}
Перевод чисел в определённую систему
1
сашк
0 / 0 / 0
Регистрация: 08.11.2009
Сообщений: 111
04.03.2010, 19:57 #39
спасибо!!! крутой код!!!
0
we2seek
80 / 80 / 42
Регистрация: 25.01.2010
Сообщений: 385
13.07.2012, 13:57 #40
Цитата Сообщение от easybudda Посмотреть сообщение
А цифра, эквивалентная десятичному числу 255 как в этой системе выглядит?
Так и будет - 255
0
13.07.2012, 13:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2012, 13:57
Привет! Вот еще темы с решениями:

Перевод чисел в двоичную систему счисления
Помогите найти ошибку : #include&lt;iostream&gt; using namespace std;...

Перевод чисел в Фибоначчиеву систему счисления
Представлением натурального числа N в Фибоначчиевой системе счисления...

Перевод букв и чисел в двоичную систему счисления
Здравствуйте, как сделать на C++ перевод букв и чисел двоичную систему...

Перевод чисел из двоичной в десятичную систему счисления
Задача в курсаче... =( Помогите пожалуйста


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru