Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 114, средняя оценка - 4.65
Dimedrol
2367 / 938 / 14
Регистрация: 25.04.2009
Сообщений: 2,636
Записей в блоге: 4
#1

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

05.09.2009, 19:19. Просмотров 15033. Ответов 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-й в 2-ю систему счисления - C++
Всем привет. Нужна помощь в доработке след.программы: Программа переводит числа из 10-й в 2-ю систему счисления. При вводе...

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

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

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

Перевод чисел из двоичной в десятичную систему - C++
Добрый день! Помогите с заданием. Есть файл в котором содержится двоичный код к примеру (0110100001101001) Надо сделать программу...

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

39
schdub
3009 / 1354 / 264
Регистрация: 19.01.2009
Сообщений: 3,583
Завершенные тесты: 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 где-то в инклудах).

0
Dimedrol
2367 / 938 / 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");
}
0
odip
Эксперт С++
7161 / 3223 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
06.09.2009, 17:41 #18
Очевидно что в двоичной системе запись числа 1010 будет длиннее в цифрах чем "1010", то есть 4 цифры. Должно быть 10 цифр в 2-ой системе.
0
Dimedrol
2367 / 938 / 14
Регистрация: 25.04.2009
Сообщений: 2,636
Записей в блоге: 4
06.09.2009, 18:47  [ТС] #19
Там выводит 22 цифры:
1000101111111100110001 вместо 1010, это из-за поля ввода....
0
odip
Эксперт С++
7161 / 3223 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
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
0
Dimedrol
2367 / 938 / 14
Регистрация: 25.04.2009
Сообщений: 2,636
Записей в блоге: 4
06.09.2009, 22:02  [ТС] #21
У меня ничего не выводит...я думаю из-за
C++
1
if ( argc != 1 ) { exit( 2 ); }
0
odip
Эксперт С++
7161 / 3223 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
06.09.2009, 22:03 #22
В программу нужно подать один аргумент - 10-ричное число
0
logiC
16 / 16 / 2
Регистрация: 06.06.2009
Сообщений: 50
06.09.2009, 23:14 #23
Цитата Сообщение от polivets Посмотреть сообщение
Цитата:
Сообщение от Lolcht0 Посмотреть сообщение
256-ричная
Думаю, что такой СС нету макс это 36-ричная.
Ты это так решил, потому что количество цифр + кол-во латинских букв = 36?)))

никто не мешает использовать и другие символы. В общем, разрядность СС ограничена только фантазией и удобством ее восприятия...
0
Dimedrol
2367 / 938 / 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 СС ...
0
odip
Эксперт С++
7161 / 3223 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
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Эксперт С++
10003 / 5926 / 998
Регистрация: 25.07.2009
Сообщений: 11,175
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Эксперт С++
10003 / 5926 / 998
Регистрация: 25.07.2009
Сообщений: 11,175
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 / 3223 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
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Эксперт С++
10003 / 5926 / 998
Регистрация: 25.07.2009
Сообщений: 11,175
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 / 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_(Си)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2009, 17:41
Привет! Вот еще темы с ответами:

Перевод чисел из файла в римскую систему счисления - C++
Во входном файле in.txt заданы целые числа в диапазоне от 1 до 3999, например: 112 24 9 3517 438 56 Вывести те же числа в...

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

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

перевод чисел из двоичной в десятичную систему счисления - C++
перевод чисел из двоичной в десятичную систему счисления:help:


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

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

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