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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.61
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
#1

Перевод систем счислений - C++

08.09.2010, 21:41. Просмотров 4426. Ответов 16
Метки нет (Все метки)

Надо написать программу которая будет переводить число из одной произвольной системы счисления в другую.

P. S. знаю, что таких задач по сети много, и даж есть на форуме, но мне они показались очень громоздкими, нам препод сказал делать по такой методики

к примеру есть число abc в n-ой с. с. мы его должны сначало перевести в N= a*n^2+b*n^1+c*n^0
а потом чтобы перевести в нужную нам с. с допустим q мы должны N разделить на q (нужную нам систему счисления) и остатки записать как число

я начала делать но у меня выходит проблема с компилятором мне выдает что, при pow: неодназначный вызов перегруженной функции

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 "stdafx.h"
#include "locale.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "math.h"
 
int _tmain()
{
    setlocale (LC_ALL, "Russian");
    const int u=50;
int t, w;
char k[u];
printf ("Введите исходное число :\n");
scanf ("%s", &k);
 
printf ("Введите систему счисления введеного числа :\n");
scanf("%d", &t);
 
printf ("Введите систему счисления в которую хотите перевести число введеное с клавиатуры :\n");
scanf ("%d", &w);
 
printf ("Число в новой системе счисления : %d \n",w);
 
int N, i;
 int e=strlen(k);
for ( i=0; i<(e-1); i++) – поменятоь наоборот от
{
  N=k[i]*pow(t,(e-1));
  ++i;
  e=(e-1)-i;
}
printf ("%d", N);
 
_getch();
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2010, 21:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевод систем счислений (C++):

Конвертер систем счислений из 10-й в 2 || 8 || 16 - C++
Неделю назад начал изучать язык C++, и пока знаю только базовые основы, ночью думал как себя протестировать, чтобы закрепить изученное, в...

перевод систем счисления - C++
1. Задание: Напишите программу перевода чисел из 2 системы в 10. 2.Задание: Напишите программу выполнения арифметических операций в...

Перевод систем счисления - C++
Здраствуйте, на входе имеется некое десятеричное число (примеры:1 / 2,8 / 0,123456) как перевести в другую систему счисления пробовал...

Перевод систем счисления - C++
Здравствуйте,помогите пожалуйста доработать программу перевода числа в разные системы счисления.Нужно чтобы заместо цифр 10 11 12 13 14...

Перевод систем счисления. - C++
Здравствуйте, сразу оговорюсь: занимаюсь программированием три дня. Я вот пытался сделать программу по переводу числа из 16-ричной системы...

перевод чисел из систем счисления - C++
Составить программу перевода чисел из десятичной системы счисления в систему с основанием: 12; 31; 3; и программу обратного перевода

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
08.09.2010, 21:45 #2
White Luna, используй преобразование типов аргументов.
0
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
08.09.2010, 21:46  [ТС] #3
Nameless One, можешь напомнить, это что такое
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
08.09.2010, 21:49 #4
C++
1
2
3
4
int x = 5;
double d1 = x; // Неявное преобразование типов
double d2 = (double)x; // Явное преобразование типов в стиле С
double d3 = static_cast<double>(x); // Явное преобразование типов в стиле С++
Тебе, если я не ошибаюсь, нужно преобразовывать аргументы к типу double.
0
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
08.09.2010, 21:52  [ТС] #5
Цитата Сообщение от Nameless One Посмотреть сообщение
[CPP]
ошибаюсь, нужно преобразовывать аргументы к типу double.
а для чего? *изв туплю сегодня сильно*
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
08.09.2010, 22:02 #6
Цитата Сообщение от White Luna Посмотреть сообщение
а для чего?
Для того, что у pow нет перегруженной версии с целочисленным основанием.
0
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
08.09.2010, 23:22  [ТС] #7
хм теперь он у меня считает но в ответ явно что то не то выводит
пример ввожу : число 5 в 10 с.с. перевести в 2. выдает -858993460, даж если на этом эпате проги должен выводится промежуточные результат N там не может быть такого большого числа
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
#include "stdafx.h"
#include "locale.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "math.h"
 
int _tmain()
{
        setlocale (LC_ALL, "Russian");
        const int u=50;
int t, w;
char k[u];
printf ("Введите исходное число :\n");
scanf ("%s", &k);
 
printf ("Введите систему счисления введеного числа :\n");
scanf("%d", &t);
 
printf ("Введите систему счисления в которую хотите перевести число введеное с клавиатуры :\n");
scanf ("%d", &w);
 
printf ("Число в новой системе счисления : %d \n",w);
 
int N, i;
 int e=strlen(k);
double d1 = t;
double d2 = e;
for ( i=0; i<(d2-1); i++) – поменятоь наоборот от
{
  N=k[i]*pow(d1,(d2-1));
  ++i;
  d2=(d2-1)-i;
}
printf ("%d", N);
 
_getch();
        return 0;
}
Добавлено через 1 час 10 минут
кто-нить может подсказать где в проге я допустила ошибку?
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.09.2010, 04:00 #8
Цитата Сообщение от White Luna
к примеру есть число abc в n-ой с. с. мы его должны сначало перевести в N= a*n^2+b*n^1+c*n^0
а потом чтобы перевести в нужную нам с. с допустим q мы должны N разделить на q (нужную нам систему счисления) и остатки записать как число
N равно abc и одного деления не хватит

это из десятичной в двоичную
число 5 в 101
число 16 в 10000
Код
5 | 2
4   2 | 2
1   2    1 | 2
    0    0   0
         1

16 | 2
16   8 | 2
 0   8   4 | 2
     0   4   2 | 2
         0   2   1 | 2
             0   0   0
                 1
Добавлено через 7 минут
Код
27 в 8ричной -> 2

N = 2 * 8^1 + 7 * 8^0 = 2 * 8 + 7 = 16 + 7 = 23 - это десятичная

23 | 2
22   11 | 2
 1   10   5 | 2
      1   4   2 | 2
          1   2   1 | 2
              0   0   0
                  1
                  
27(8) = 10111(2)
Python
1
2
3
4
5
>>> 0o27
23
>>> bin(0o27)
'0b10111'
>>>
Добавлено через 6 минут
Код
101(14) -> x(16)

N = 1 * 14^2 + 0 * 14^1 + 1 * 14^0 = 196 + 14 = 210 - десятичная

210 | 16
208   13 | 16
  2    0   0
      13
      
13 = D

101(14) = D2(16)
Добавлено через 5 минут
C++
1
for ( i=0; i<(d2-1); i++)
если ты хочешь выполнить цикл d2 раз, нужно писать

C++
1
for (i = 0; i < d2; i++)
Добавлено через 5 минут
C++
1
N=k[i]*pow(d1,(d2-1));
ты умножаешь символ '5' на степень, в результате умножается не пять на степень, а код символа '5' на степень

Python
1
2
3
4
5
6
7
8
9
>>> ord('5')
53
>>> hex(ord('5'))
'0x35'
>>> print("%c" % 0x35)
5
>>> print("%c" % 53)
5
>>>
Добавлено через 5 минут
то есть сначала тебе нужно перевести символ в число (и это может быть не только цифра, это могут быть буквы, а могут быть ещё символы), для этого задаётся структура

C
1
2
3
4
5
6
7
8
9
10
11
struct charnum {
    char ch[16];
    int num[16];
};
 
...
 
    struct charnum pattern = {
        "0123456789abcdef",
        { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
    };
вот, а дальше ты берёшь символ и переводишь его с помощью этой структуры в число, а потом число уже умножаешь
0
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
09.09.2010, 08:47  [ТС] #9
Цитата Сообщение от accept Посмотреть сообщение
Python
1
2
3
4
5
6
7
8
9
>>> ord('5')
53
>>> hex(ord('5'))
'0x35'
>>> print("%c" % 0x35)
5
>>> print("%c" % 53)
5
>>>
Добавлено через 5 минут
то есть сначала тебе нужно перевести символ в число (и это может быть не только цифра, это могут быть буквы, а могут быть ещё символы), для этого задаётся структура

C
1
2
3
4
5
6
7
8
9
10
11
struct charnum {
    char ch[16];
    int num[16];
};
 
...
 
    struct charnum pattern = {
        "0123456789abcdef",
        { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
    };
вот, а дальше ты берёшь символ и переводишь его с помощью этой структуры в число, а потом число уже умножаешь
а можешь показать куда мне в прогу нужно встатвить последнюю структуру и изменения символа на число
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
09.09.2010, 11:17 #10
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
87
88
89
90
//////////////////////////////////////////////////////////////////////////////
//  написать программу которая будет переводить число из одной произвольной 
//  системы счисления в другую.
//////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
 
typedef std::string  T_str;
//////////////////////////////////////////////////////////////////////////////
int symb_to_dig(char symb)
{
    if('0' <= symb && symb <= '9')
    {
        return symb - '0';
    }
    if('a' <= symb && symb <= 'z')
    {
        return symb - 'a' + 0xa;
    }
    return 0;
}
//////////////////////////////////////////////////////////////////////////////
char dig_to_symb(int dig)
{
    if(0 <= dig && dig <= 9)
    {
        return dig + '0';
    }
    const int lett_dig_a = 10;
    const int lett_dig_z = 'z' - 'a' + lett_dig_a;
    if(lett_dig_a <= dig && dig <= lett_dig_z)
    {
        return dig - lett_dig_a + 'a';
    }
    return '?';
}
//////////////////////////////////////////////////////////////////////////////
T_str  transform(T_str num_str, int begin_radix, int end_radix)
{    
    int val                   = 0;    
    int begin_radix_in_order  = 1;
 
    for(T_str::const_reverse_iterator  rev_dig_it = num_str.rbegin(); 
        rev_dig_it != num_str.rend(); ++rev_dig_it)
    {
        val += symb_to_dig(tolower(*rev_dig_it)) * begin_radix_in_order;
        begin_radix_in_order *= begin_radix;
    }
 
    T_str  res_str;
    while(val)
    {        
        res_str.insert(0, 1, dig_to_symb(val % end_radix));     
        val /= end_radix;
    }
    return  res_str;
}
//////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale("")); 
    for(;;)
    {
        std::cout << std::endl
                  << std::endl
                  << std::endl
                  << "Число в исходной системе счисления:   ";        
        T_str num_str;
        std::cin >> num_str;        
 
        int n1;
        do
        {
            std::cout << "Основание исходной системы счисления: ";        
            std::cin >> n1;    
        }while(n1 < 2);
 
        int n2;
        do
        {
            std::cout << "Основание целевой системы счисления:  ";    
            std::cin >> n2;    
        }while(n2 < 2);
 
        std::cout << std::endl
                  << "Число в целевой системе счисления:    "
                  << transform(num_str, n1, n2)
                  << std::endl;     
    }
}
1
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.09.2010, 11:33 #11
Цитата Сообщение от White Luna
а можешь показать куда мне в прогу нужно встатвить последнюю структуру и изменения символа на число
у тебя в проге не хватает функции, которая принимает запись в одной системе, подходящий чистый буфер для записи в другой системе (сначала можно без длин их делать, но длины нужны, чтобы не делать уязвимый код), потом исходная система счисления и конечная система счисления

структура нужна, чтобы отвязать символы от таблицы аски, потому что на системе, в которой может выполняться программа, может быть не аски (ascii) и там может не повезти и цифры могут быть в каком-нибудь другом порядке (а структура вшивает в программу фиксированный набор, однозначный)

структуру ты описываешь вверху, а определяешь внутри такой функции преобразования (вверху удобнее контролировать структуру, и расширять её, если нужно увеличить возможности)
0
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
09.09.2010, 14:55  [ТС] #12
easybudda, ссылки почему то не открываются, вернее не показывают прогу, а переходят на какой то поиск по крайней мере у ми

Добавлено через 1 минуту
Mr.X, есщл честно, то мне мало что понятно в проге, а в общем вообще понять не могу где там что

Добавлено через 34 минуты
Теперь вопрос такой почему у ми может не выводить в проге N это как бы последний вывод, а его прога как бы ни в каком виде не выводит

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
#include "stdafx.h"
#include "locale.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "math.h"
 
int _tmain()
{
        setlocale (LC_ALL, "Russian");
        const int u=50;
int t, w;
char k[u];
printf ("Введите исходное число :\n");
scanf ("%s", &k);
 
printf ("Введите систему счисления введеного числа :\n");
scanf("%d", &t);
 
printf ("Введите систему счисления в которую хотите перевести число введеное с клавиатуры :\n");
scanf ("%d", &w);
 
printf ("Число в новой системе счисления : %d \n",w);
 
int N, i;
 int e=strlen(k);
double d1 = t;
double d2 = e;
 
for ( i=0; i<(d2-1); i++) 
{
  N=k[i]*pow(d1,(d2-1));
  ++i;
  d1=(d2-1)-i;
}
scanf_s ("%d", N);
 
_getch();
        return 0;
}
0
easybudda
Модератор
Эксперт CЭксперт С++
9627 / 5575 / 947
Регистрация: 25.07.2009
Сообщений: 10,710
09.09.2010, 15:26 #13
Цитата Сообщение от White Luna Посмотреть сообщение
easybudda, ссылки почему то не открываются, вернее не показывают прогу, а переходят на какой то поиск по крайней мере у ми
Ага, не задалось что-то...
Перевод чисел в определённую систему
Перевод текста в произвольную систему счисления
0
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
09.09.2010, 15:51  [ТС] #14
easybudda, я посмотрела, но что то я их плохо понимаю
0
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
17.09.2010, 23:01  [ТС] #15
не понимаю
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2010, 23:01
Привет! Вот еще темы с ответами:

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

направьте на путь истинный) перевод систем счисления - C++
прошу помощи. как реализовать перевод из 10 сис.счисления в любую другую(по моему примеру)?вроде бы все должно идти верно.. в кнопке...

Система счислений - C++
составить программу для перевода чисел из одной системы счисления в другую

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.09.2010, 23:01
Ответ Создать тему
Опции темы

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