Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/114: Рейтинг темы: голосов - 114, средняя оценка - 4.56
 Аватар для Dimedrol
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4

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

05.09.2009, 19:19. Показов 23657. Ответов 39

Студворк — интернет-сервис помощи студентам
Нужно сделать программу для перевода числа в разные систему то есть вписываешь число и программа должна выдать следующий ответ (мы написали 1010):
Code
1
2
3
4
двоичная: ИСХОДНОЕ ЧИСЛО
десятичная: 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.09.2009, 19:19
Ответы с готовыми решениями:

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

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

Перевод чисел из 9 в 10 систему счисления
#include &lt;stdio.h&gt; #include &lt;windows.h&gt; int main(int argc , char * argv) { char s; unsigned i,n; printf(&quot;N: &quot;); ...

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

никто не мешает использовать и другие символы. В общем, разрядность СС ограничена только фантазией и удобством ее восприятия...
0
 Аватар для Dimedrol
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
07.09.2009, 00:23  [ТС]
В программу нужно подать один аргумент - 10-ричное число
А мне надо, чтобы я вписывал число с помощью scanf и програ переводила его в 2, 6, 8, 10, 16 , вписанное число также может являться 2, 6, 8, 10, 16 СС ...
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
07.09.2009, 10:42
Тогда тебе придется сначала указывать систему счисления до ввода числа, так как в общем случае автоматически определить систему счисления не представляется возможным.

Добавлено через 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 секунд
Пример запуска:
Code
1
2
3
4
5
6
7
8
9
> 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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
07.09.2009, 13:06
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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
07.09.2009, 14:16
Только сейчас заметил - там вместо восьмеричной шестиричная система нужна! Ну примерно всё так же, как с двоичной, функцию только малость изменить
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
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
07.09.2009, 14:31
Вот реализация 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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
07.09.2009, 14:39
Цитата Сообщение от odip Посмотреть сообщение
Но в VS и gcc эта функция и так есть.
Не-а! Нету в gcc ни в debian-овском 4.3.2, ни в cygwin-овском 3.4.4. А в VS и не такое встретить можно...
0
UNIX-way
 Аватар для Delphin_KKC
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,720
07.09.2009, 17:41
Цитата Сообщение от easybudda Посмотреть сообщение
Не-а! Нету в gcc ни в debian-овском 4.3.2, ни в cygwin-овском 3.4.4. А в VS и не такое встретить можно...
В DevCPP 4.9.9.2 есть.
Кроме того: http://ru.wikipedia.org/wiki/Itoa_(Си)
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
07.09.2009, 17:46
В mingw gcc 3.4.5 есть itoa().
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
07.09.2009, 18:15
Цитата Сообщение от odip Посмотреть сообщение
В mingw gcc 3.4.5 есть itoa().
А в gcc 3.4.6, который к FreeBSD 6.2 прилагается, опять нет. Короче лучше на её присутствие не закладываться. Опять же
itoa — часто используемая функция языка Си, не входящая в стандарт языка.
Так как функция itoa не имеет возможности проверить размер буфера, в который производит запись, то, в случае ошибки программиста, использование этой функции может привести к переполнению буфера и откроет возможность соответствующих атак.
ИМХО если действительно часто используется, и не только в учебных примерах, лучше свою написать с поправкой на замечание о безопасности...
0
UNIX-way
 Аватар для Delphin_KKC
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,720
07.09.2009, 19:32
Цитата Сообщение от easybudda Посмотреть сообщение
...лучше свою написать с поправкой на замечание о безопасности...
Так как функция itoa не входит в стандарт, наиболее правильным является использование стандартных функций:
sprintf(str, "%d", value); преобразует к десятичному виду.
sprintf(str, "%x", value); преобразует к шестнадцатиричному виду.
sprintf(str, "%o", value); преобразует к восьмеричному виду.
Имхо:
Вместо itoa рекомендуется использовать стандартную (ISO C99) функцию snprintf, так как она проверяет размер буфера и не производит запись за его пределами.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
07.09.2009, 19:40
А если основание нужно не 8/10/16? В задаче, кстати, шестиричная система присутствует (интересно, кому оно надо?), да и двоичные числа printf не печатает...
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
07.09.2009, 19:42
В задаче, кстати, шестиричная система присутствует (интересно, кому оно надо?)
Ха-ха-ха - насмешил
Дык все адреса памяти в 16-ричной системе даются
А если основание нужно не 8/10/16?
Так нужно сделать как я предложил - взять реализацию itoa() если компилятор не знает такой функции.
0
 Аватар для Dimedrol
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
07.09.2009, 19:54  [ТС]
easybudda, что то не так:
http://xmages.net/out.php/i473093_ss.JPG
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
07.09.2009, 19:55
Цитата Сообщение от odip Посмотреть сообщение
Ха-ха-ха - насмешил
Цитата Сообщение от dimjan4 Посмотреть сообщение
Нужно сделать программу для перевода числа в разные систему то есть вписываешь число и программа должна выдать следующий ответ (мы написали 1010):
двоичная: ИСХОДНОЕ ЧИСЛО
десятичная: 10
шестиричная: 12
шестнадцатеричная: A
Кстати, десятичное 10 при таком подходе будет 14, а не 12...

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

dimjan4, А Вы случайно long2bin на long2six не заменили? а то вот она бы как-раз 14 и выдавала... Условие задачи уточните, пожалуйста...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
07.09.2009, 22:36
Более общий вариант. 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
спасибо!!! крутой код!!!
0
 Аватар для we2seek
84 / 84 / 42
Регистрация: 25.01.2010
Сообщений: 386
13.07.2012, 13:57
Цитата Сообщение от easybudda Посмотреть сообщение
А цифра, эквивалентная десятичному числу 255 как в этой системе выглядит?
Так и будет - 255
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.07.2012, 13:57
Помогаю со студенческими работами здесь

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

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

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

Перевод чисел в Фибоначчиеву систему счисления
Представлением натурального числа N в Фибоначчиевой системе счисления называется набор целых значений-цифр (Dn, Dn-1, …, D2), для которого...

Перевод чисел в двоичную систему счисления
Помогите найти ошибку : #include&lt;iostream&gt; using namespace std; #include&lt;conio.h&gt; void inp(int n, int k=0, int i=0) { ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru