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

Программа перевода числа из 10 СС в 2 СС - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 144, средняя оценка - 4.65
fs444
6 / 10 / 0
Регистрация: 18.08.2009
Сообщений: 480
15.02.2010, 15:36     Программа перевода числа из 10 СС в 2 СС #1
У Дейтлов есть задача:
Напишите программу, которая печатает таблицу двоичных, восьмеричных и шестнадцатеричных эквивалентов десятичных в диапазоне от 1 до 256.
Они предлагают следующие инструкции по переводу чисел:
10 СС -> 2 СС
Программа перевода числа из 10 СС в 2 СС

10 СС -> 8 СС
Программа перевода числа из 10 СС в 2 СС

10 СС -> 16 СС
Программа перевода числа из 10 СС в 2 СС

Я для пробы написал код, который переводит десятичную 10 в двоичную 1010. Код очень корявый и не выводит то, что мне надо. Подскажите, в ту ли сторону я иду (уже 3 дня разбираюсь, и никак)?
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
91
92
93
94
95
#include<iostream>
using std::cout;
using std::endl;
 
#include<windows>
 
int stepen(int chislo, int stepenChisla)
{
   int chisloVStepeni = 1;
 
   if (stepenChisla == 0)
   {
      chisloVStepeni = 1;
   }
   else
   {
      for (int i = 0; i < stepenChisla; i++)
      {
         chisloVStepeni *= chislo;
      }
   }
 
   return chisloVStepeni;
}
 
int main()
{
   int chisloV10SS; // число в 10 СС, которое будет преобразовано в 2 СС
   int maxStepen2 = 0; // число 2 в максимальной степени
   int s = 0; // значение степени (0...)
   int textMaxStepen2; // проверочное maxStepen2
   int i;
   int cifraChislaV2SS; // очередная цифра числа в 2СС (слева направо)
   int chisloV2SS = 0; // число в 2 СС, полученное прибавлением cifraChislaV2SS
   int ostChislaV10SS; // остаток от числа в 10 СС
   int j;
   int umenshStepen; // уменьшающаяся степень
   int vremOstChislaV10SS;  // хранит временный остаток
 
   for (chisloV10SS = 10; chisloV10SS < 11; chisloV10SS++)
   {
      cout << chisloV10SS << " v 10 CC = ";
 
      while (maxStepen2 < chisloV10SS)
      {
         maxStepen2 = stepen(2, s);
         textMaxStepen2 = stepen(2, (s+1));
 
         if (textMaxStepen2 > chisloV10SS)
         {
            break;
         }
 
         s++;
      }
 
      ostChislaV10SS = chisloV10SS;
      umenshStepen = s;
 
      for (i = 0; i < s; i++)
      {
         if (ostChislaV10SS >= stepen(2, umenshStepen))
         {
            cifraChislaV2SS = ostChislaV10SS / stepen(2, umenshStepen);
         }
 
         if ((cifraChislaV2SS > 0) || (ostChislaV10SS >= stepen(2, umenshStepen)))
         {
            cifraChislaV2SS = 0;
         }
 
         if (cifraChislaV2SS != 0)
         {
            cifraChislaV2SS *= stepen(10, umenshStepen);
         }
 
         chisloV2SS += cifraChislaV2SS;
 
         vremOstChislaV10SS -= stepen(2, umenshStepen);
 
         if (vremOstChislaV10SS > 0)
         {
            ostChislaV10SS -= stepen(2, umenshStepen);
         }
 
         umenshStepen--;
 
      }
 
      cout << chisloV2SS << " v 2 SS " <<endl;
   }
 
   system("pause");
   return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2010, 15:36     Программа перевода числа из 10 СС в 2 СС
Посмотрите здесь:

Программа для перевода данного натурального числа в N-ную систему счисления C++
C++ Си, программа перевода в другие СС
Программа перевода числа из десятичной системы в восмеричную C++
Программа перевода целого числа без знака в двоичную систему счисления C++
Программа перевода целого числа без знака в двоичную систему счисления C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.02.2010, 17:37     Программа перевода числа из 10 СС в 2 СС #2
fs444, извини, было лень разбираться в чужом коде, тем более, если ты утверждаешь, что он корявый. Вот моя программка, работает для целых неотрицательных десятичных чисел, проверял на калькуляторе. Алгоритм решения - способ, который проходят на уроке информатики (деление на 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
#include <iostream>
using namespace std;
 
int pow(int x, int y)
{
    int n=1;
    while(y--)
        n*=x;
    return n;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    int dec;//Число в десятичной СС
    int bin=0;//Искомое число в двоичной CC
    int i=0;//Разряд двоичного числа
    cout << "Введите число" << endl;
    cin >> dec;
    while(dec>1)
    {
        bin+=(dec%2)*pow(10, i);//Присваиваем i-тому разряду остаток от деления
        dec/=2;
        i++;
    }
    bin+=dec*pow(10, i);
    cout << "Число в двоичной СС:" << endl << bin << endl;
    system("pause");
    return 0;
}
ИМХО, попроще, чем у тебя.

Добавлено через 8 минут
Для вывода чисел в десятичной, восьмеричной и шестнадцатеричной СС используются, соответственно, манипуляторы потока вывода dec, oct, hex. Данная программа выведет введенное число сначала в шестнадцатеричной, потом в восьмеричной СС:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    int decs;//Число в десятичной СС
 
    cin >> decs;
    
    cout << hex << decs << endl << oct << decs << endl;
    system("pause");
    return 0;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.02.2010, 18:13     Программа перевода числа из 10 СС в 2 СС #3
fs444, много раз уже числа в двоичном виде выводили. На вскидку пара способов:
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
#include <iostream>
 
void binPrn(unsigned d){
    for ( int i = CHAR_BIT * sizeof(int) - 1; i >= 0; --i )
        std::cout.put( (char)(((d >> i) & 1) + '0') );
    std::cout << std::endl;
}
 
void recBinPrn(unsigned d){
    if ( d / 2 )
        recBinPrn(d / 2);
    std::cout.put((char)(d % 2 + '0'));
}
 
int main(){
    int d;
    
    while ( true ){
        std::cout << "Dec number: ";
        std::cin >> d;
        if ( !d )
            break;
        binPrn(d);
        recBinPrn(d);
        std::cout << std::endl;
    }
    return 0;
}

Цитата Сообщение от Nameless One Посмотреть сообщение
bin+=(dec%2)*pow(10, i);//Присваиваем i-тому разряду остаток от деления
то есть, если в dec старший бит установлен в единицу, в bin получим 32-значное десятичное число? Плохие новости - в переменную типа int помещается десятизначное десятичное число, и то в старшем разряде больше двойки быть не может...
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.02.2010, 18:17     Программа перевода числа из 10 СС в 2 СС #4
Цитата Сообщение от easybudda Посмотреть сообщение
то есть, если в dec старший бит установлен в единицу, в bin получим 32-значное десятичное число? Плохие новости - в переменную типа int помещается десятизначное десятичное число, и то в старшем разряде больше двойки быть не может...
Я плохо знаком с битовыми операциями, можно по-подробней? Если старший бит - единица, то это отрицательное число?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.02.2010, 18:29     Программа перевода числа из 10 СС в 2 СС #5
Цитата Сообщение от Nameless One Посмотреть сообщение
Я плохо знаком с битовыми операциями, можно по-подробней? Если старший бит - единица, то это отрицательное число?
Если переменная объявлена, как знаковая ( char, int, long), то да, при отрицательном значении старший бит устанавливается в единицу. Вернее число записывается в так называемом дополнительном коде - все биты инвертируются и добавляется единица. При объявлении беззнаковой переменной (unsigned char, unsigned int, unsigned long) старший бит никакого особого смысла не несёт - просто старший бит.

Цитата Сообщение от easybudda Посмотреть сообщение
в переменную типа int помещается десятизначное десятичное число
точнее в limits.h:
Код
#define UINT_MAX        0xffffffff      /* max value for an unsigned int */
#define INT_MAX         2147483647      /* max value for an int */
#define INT_MIN         (-2147483647-1) /* min value for an int */
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.02.2010, 18:34     Программа перевода числа из 10 СС в 2 СС #6
Тут ты прав, я и не претендовал на решение для отрицательных чисел:
Цитата Сообщение от Nameless One Посмотреть сообщение
Вот моя программка, работает для целых неотрицательных десятичных чисел
В принципе, эту проблему можно обойти, если рассматривать введенное значение по модулю, а потом добавить к полученному значению нужный знак. Тогда мой код будет работать и для отрицательных чисел
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.02.2010, 18:42     Программа перевода числа из 10 СС в 2 СС #7
Цитата Сообщение от Nameless One Посмотреть сообщение
В принципе, эту проблему можно обойти, если рассматривать введенное значение по модулю, а потом добавить к полученному значению нужный знак. Тогда мой код будет работать и для отрицательных чисел
Ну у меня он и так с отрицательными числами работает. Попробуй откомпилировать, запустить и -1 ввести
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.02.2010, 18:44     Программа перевода числа из 10 СС в 2 СС #8
Верю на слово

Добавлено через 26 секунд
Зато у меня нагляднее)))
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.02.2010, 18:45     Программа перевода числа из 10 СС в 2 СС #9
Цитата Сообщение от Nameless One Посмотреть сообщение
Вот моя программка, работает для целых неотрицательных десятичных чисел
2147483647 - тоже неотрицательное целое число
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.02.2010, 18:49     Программа перевода числа из 10 СС в 2 СС #10
Цитата Сообщение от easybudda Посмотреть сообщение
if ( !d )
break;
И для нуля тоже работает

Добавлено через 3 минуты
Цитата Сообщение от easybudda Посмотреть сообщение
2147483647 - тоже неотрицательное целое число
А если ты введешь, к примеру, 2^32, у тебя заработает?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.02.2010, 18:52     Программа перевода числа из 10 СС в 2 СС #11
Цитата Сообщение от Nameless One Посмотреть сообщение
И для нуля тоже работает
Вот это действительно важно! А у меня за то работает, пока 0 не введёшь - приятнее, запускать всё время программу не приходится

Добавлено через 2 минуты
Цитата Сообщение от Nameless One Посмотреть сообщение
А если ты введешь, к примеру, 2^32, у тебя заработает?
не-а, строго в пределах INT_MIN <= x <= INT_MAX
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.02.2010, 18:54     Программа перевода числа из 10 СС в 2 СС #12
Нууу....
А если нужно перевести рандомное целое от -5 до 5? Тогда твой способ не тянет на универсальность

Добавлено через 2 минуты
Цитата Сообщение от easybudda Посмотреть сообщение
не-а, строго в пределах INT_MIN <= x <= INT_MAX
Кстати, не знаешь, как можно произвести проверку на введенное число, ведь 2^32 даже в unsigned int не влезет?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.02.2010, 18:58     Программа перевода числа из 10 СС в 2 СС #13
Цитата Сообщение от Nameless One Посмотреть сообщение
А если нужно перевести рандомное целое от -5 до 5? Тогда твой способ не тянет на универсальность
С какого перепуга?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
void binPrn(unsigned d){
    for ( int i = CHAR_BIT * sizeof(int) - 1; i >= 0; --i )
        std::cout.put( (char)(((d >> i) & 1) + '0') );
    std::cout << std::endl;
}
 
int main(){
    
    for ( int i = -5; i < 6; ++i ){
        std::cout << "Dec: " << i << "\tBin: ";
        binPrn(i);
    }
    
    return 0;
}
пробуй!
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.02.2010, 19:03     Программа перевода числа из 10 СС в 2 СС #14
.
Я имел в виду if(!d)...
А вообще, по-моему, мы с тобой нафлудили...
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
16.02.2010, 23:55     Программа перевода числа из 10 СС в 2 СС #15
2-->10

C++
1
2
3
4
5
6
7
8
9
10
void DecToBin(unsigned int x){ 
   do 
      { 
        if (x%2==0)
        cout<<"0";
        else
        cout<<"1";
        x/=2;
      } while (x>=1);
}
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
17.02.2010, 00:34     Программа перевода числа из 10 СС в 2 СС #16
C++
1
2
3
4
5
6
7
void OutBin(int chislo)
{
     int i;
     for(i = 32; i >= 0; --i)
          std::cout<<((chislo >> i) & 1);
     std::cout<<std::endl;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.02.2010, 00:57     Программа перевода числа из 10 СС в 2 СС #17
Цитата Сообщение от M128K145 Посмотреть сообщение
for(i = 32; ...
Лишний ноль слева пририсует
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
17.02.2010, 01:09     Программа перевода числа из 10 СС в 2 СС #18
easybudda, кстати да, но это не суть важно, ведь главное алгоритм)
C++
1
2
3
4
5
6
7
void OutBin(int chislo)
{
     int i;
     for(i = 31; i >= 0; --i)
          std::cout<<((chislo >> i) & 1);
     std::cout<<std::endl;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.02.2010, 01:32     Программа перевода числа из 10 СС в 2 СС #19
M128K145, ага... Кстати, 13 сообщение в этой ветке чем-то напоминает...
Только я там перемудрил немного
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2010, 02:06     Программа перевода числа из 10 СС в 2 СС
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
17.02.2010, 02:06     Программа перевода числа из 10 СС в 2 СС #20
easybudda, хм... действительно, даже не заметил, я просто всегда так переводил. Где-то на форуме можно откопать аналогичный вариант перевода из двоичной в десятичную. Точно не помню в какой теме кому-то отвечал. Завтра поищу

Добавлено через 15 минут
чего-то так лень искать стало, вот весь код, немного сейчас конечно переделал в виде функций, но смысл остался
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
#include <iostream>
void BinDec(int* bin, int size)
{
    int rez(0), i;
    std::cout<<"\nДесятичное число:\n< ";
    for(i = size - 1; i >= 0; --i)
        rez += bin[i]<<i;
    std::cout<<rez<<std::endl;
}
int* DecBin(int chislo, int size)
{
    int i;
    int* bin = new int[size];
    std::cout<<"Двоичный код:\n< ";
    for(i = size - 1; i >= 0; --i)
    {
        if(!((i + 1) % 8))
            std::cout<<' ';
        std::cout<<(bin[i] = (chislo>>i)&1);
    }
    return bin;
}
int main()
{
    setlocale(LC_ALL, "Russian");
    int chislo, size(sizeof(chislo)*8);
    std::cout<<"Введите число:\n> ";
    std::cin>>chislo;
    BinDec(DecBin(chislo, size), size);
    system("pause");
    return EXIT_SUCCESS;
}
Yandex
Объявления
17.02.2010, 02:06     Программа перевода числа из 10 СС в 2 СС
Ответ Создать тему
Опции темы

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