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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.65
Masha_She
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 31
#1

Необходимо вывести двоичное представление числа на экран. - C++

16.02.2014, 13:12. Просмотров 4017. Ответов 20
Метки нет (Все метки)

Собственно само задание..
Код вроде вполне правильный, но все же не работает((
Не могу понять в чем проблема..
Прошу руку помощи))

С клавиатуры вводится целое число. Необходимо вывести его двоичное представление на экран.
Программа должна поддерживать все целочисленные типы данных языка реализации (char, int, long int, unsigned int, unsigned long int для языка C/C++, integer, byte, word, shorting, longint для Pascal/Delphi).
Отрицательные числа выводятся в дополнительном коде.
Необходимо также решить обратную задачу: преобразовать двоичное число в десятичный вид.
Замечания:
1. Дополнительный код образуется из прямого путем инверсии бит и прибавления единицы:
Пример: -5: 5 = 00000101, -5 = not(5)+1 = 11111010+1 = 11111011
2. Запрещается использовать для машинно-зависимые методы и библиотеки языков программирования.
1. В качестве одного из вариантов решения предлагается следующие алгоритм на псевдоязыке:

Код
program Translate1;
s : string;
begin
 enter(a);
 s:=’’;
 while a<>0 do
   if  (abs(a) mod 2) then s:=’1’+s else s:=’0’+s;
   a:=abs(a) div 2;
 end while;
 if a<0 then
  mind:=0;
  for i:=1 to 8 do
    k:=val(s[8-i+1])+1+mind;
    s[8-i+1]:=k;
    if k=2 then begin
      s[8-i+1]:=’0’; mind:=1;
    endif  
    if k=3 then begin
      s[8-i+1]:=’1’; mind:=1;
    endif  
  endfor
 endif
end;
где div и mod  - операции целочисленного деления и деления по модулю соответственно.
 
program Translate1;
s : string;
begin
 enter(a);
 s:=’’;
 while a<>0 do
   if  (abs(a) shr 1) and (1 shl (sizeof(a)+1) + 1) then s:=’1’+s else s:=’0’+s;
   a:=abs(a) shr 2;
 end while;
 if a<0 then
  mind:=0;
  for i:=1 to 8 do
    k:=val(s[8-i+1])+1+mind;
    s[8-i+1]:=k;
    if k=2 then begin
      s[8-i+1]:=’0’; mind:=1;
    endif  
    if k=3 then begin
      s[8-i+1]:=’1’; mind:=1;
    endif  
  endfor
 endif
end;
где shr и sizeof - операции сдвига вправо и определения размера типа в битах соответственно.

А вод и код:
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
96
97
98
99
100
101
102
103
104
105
106
#include"stdafx.h"
#include<iostream>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
using namespace std;
int main(void)
{ 
char *end; //указатель на последний символ строки
char str[32];
int k;
char str2[10];//строка с наибольшим числом
 
for (int i = 0; i <= 31; ++i)
str[k] = '0';
cout << "Vvedite desiatichnoe chislo:\n";
cin >> str2;
if (str2[0]=='-')
{
long int bb=strtol(str2,&end,10);//строку str2 по основанию 10, т.е. переводим в десят систему
k=31;
while (bb != 0)
{
if ((bb % 2) != 0)
str[k] = '1';
--k;
bb = bb / 2;
}
 
for ( k=0;k<=31;k++)
{
if (str[k]!='1')
str[k]='1';
else
str[k]='0';
};
 
for (int i=31;i>=0;i--)
{
if (str[k]=='1')
str[k]='0';
else
{str[k]='1';
break;}
}
 
}
else
{ unsigned long int bb=strtoul(str2,&end,10);
k=31;
while (bb != 0)
{
if ((bb % 2) != 0)
str[k] = '1';
--k;
bb = bb / 2;
}
};
cout << "Chislo v desiatichnoi sisteme schislenia: "<<endl;
for (int i=0;i<=31;i++)
cout<<str[k];
cout<<endl;
 
{char str3[32];
char str[32];
long tmp = 0;//отрицательное
unsigned long int ptr=0;//положительное
for (int i = 0; i <= 31; ++i)
str[k] = '0';
cout<<"Vvedite chislo v dvoichnoi sisteme schislenia:\n"<<endl;;
cout<<"********************************"<<endl;
cout<<"\n";
cin>>str3;
{int k=0;
for(int i=31,k=strlen(str3)-1;i>=0;i--,k--)//весь массив заполняем нулями
{str[k]=str3[k];//а введенное число заносим в конец
if (k==0)
break;}
 
cout<<"Chislo v desiatichnoi sisteme (polo)I(itel'noe):\n";
for ( int i = 31, k = 0; i >= 0; i--, k++)
ptr= ptr + (str[k] - '0') * pow(2,k);//переводим двоичное число в положительное десятичное
cout<<ptr<<"\n"<<endl; //через степень числа 2
 
for ( k=0;k<=31;k++)
{
if (str[k]!='1')//инвертируем введенное двоичное число
str[k]='1';//0 меняем на 1 и наоборот
else
str[k]='0';
}
 
for (int i = 31, k = 0; i >= 0; i--, k++)
tmp = tmp + (str[k] - '0') * pow(2,k);
tmp=(tmp+1)*(-1); //прибавляем единицу по правилу
 
if (tmp<0)
{cout<<"Chislo v desiatichnoi sisteme(otricatel'noe):\n";
cout<<tmp<<endl;}}} //выводим отрицательное число
 
 
getchar();
system("pause");
}
Добавлено через 11 часов 47 минут
прошу Вас о помощи
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2014, 13:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Необходимо вывести двоичное представление числа на экран. (C++):

Двоичное представление числа - C++
Введите целое положительное N и выведите его двоичное представление. Ниже представлен код, но он выводит число на оборот (то есть если...

Вывести на экран шестнадцатеричное представление натурального числа - C++
Всем доброго времени суток. Задание: Вывести на экран шестнадцатеричное представление данного натурального числа. Сама...

Получить двоичное строковое представление целого неотрицательного числа - C++
Помогите пожалуйста с программой, очень надо. Описать функцию DecToBin(N) строкового типа, возвращающую строковое представление...

Определить, является ли симметричным двоичное представление длинного целого числа - C++
Обработку двоичного числа делать без преобразование к строковому массиву, только сдвигами и битовыми операциями (&amp;, | и т.д.) ...

Получить двоичное представление числа р в виде последовательности нулей и единиц - C++
Дано натуральное число р. Получить двоичное представление числа р в виде последовательности а0, ...,аn нулей и единиц такой, что р=аn∙2n+…+...

Двоичное представление - C++
Народ! Помогите пожалуйста! Каким образом работает эта функция? void BinOut(unsigned char* Buf,int len){ int i,j; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Alex566
240 / 152 / 18
Регистрация: 03.04.2013
Сообщений: 317
18.02.2014, 01:48 #16
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну тогда сделайте так:
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
96
97
98
99
100
101
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <locale>
using namespace std;
 
int main(void)
{
    setlocale(0, "");
    char *end; //указатель на последний символ строки
    char str[32];
    int k;
    char str2[10];//строка с наибольшим числом
 
    for (int i = 0; i <= 31; ++i)
        str[i] = '0';
    cout << "Введите десятичное число: ";
    cin >> str2;
    if (str2[0] == '-')
    {
        long int bb = strtol(str2, &end, 10);//строку str2 по основанию 10, т.е. переводим в десят систему
        k = 31;
        while (bb != 0)
        {
            if ((bb % 2) != 0)
                str[k] = '1';
            --k;
            bb = bb / 2;
        }
 
        for (k = 0; k <= 31; k++)
        {
            if (str[k] != '1')
                str[k] = '1';
            else
                str[k] = '0';
        };
 
        for (int i = 31; i >= 0; i--)
        {
            if (str[i] == '1')
                str[i] = '0';
            else
            {
                str[i] = '1';
                break;
            }
        }
 
    }
    else
    {
        unsigned long int bb = strtoul(str2, &end, 10);
        k = 31;
        while (bb != 0)
        {
            if ((bb % 2) != 0)
                str[k] = '1';
            --k;
            bb = bb / 2;
        }
    };
    cout << "Число в двоичной системе исчисления: ";
    for (int i = 0; i <= 31; i++)
        cout << str[i];
    char str3[32];
    long tmp = 0;//отрицательное
    unsigned long int ptr = 0;//положительное
    for (int i = 0; i <= 31; ++i)
        str[i] = '0';
    cout << endl << "Введите чиcло в двоичной системе исчисления: ";
    cin >> str3;
    for (int i = 31, k = strlen(str3) - 1; i >= 0 && k >= 0; i--, k--)//весь массив заполняем нулями
        str[i] = str3[k];//а введенное число заносим в конец
    for (int i = 31, k = 0; i >= 0; i--, k++)
        ptr = ptr + (str[i] - '0') * pow(2, k);//переводим двоичное число в положительное десятичное
    for (k = 0; k <= 31; k++)
    {
        if (str[k] != '1')//инвертируем введенное двоичное число
            str[k] = '1';//0 меняем на 1 и наоборот
        else
            str[k] = '0';
    }
 
    for (int i = 31, k = 0; i >= 0; i--, k++)
        tmp = tmp + (str[i] - '0') * pow(2, k);
    tmp = (tmp + 1)*(-1); //прибавляем единицу по правилу
 
    if (tmp<0)
    {
        cout << "Число в десятичной системе исчисления (отрицательное): ";
        cout << tmp << endl;
    }
    else
    {
        cout << "Число в десятичной системе исчисления (положительное): ";
        cout << ptr << endl; 
    }
     //выводим отрицательное число
    system("pause");
}
Добавлено через 1 минуту
Первый бит знаковый, все стольные числовые.
Masha_She
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 31
18.02.2014, 01:53  [ТС] #17
Alex566, последний вопрос) Можно каким-либо образом не писать все 32 знака. Например,
11111111111111111111111111111111
а написать например 1111???
Alex566
240 / 152 / 18
Регистрация: 03.04.2013
Сообщений: 317
18.02.2014, 02:03 #18
Цитата Сообщение от Masha_She Посмотреть сообщение
Alex566, последний вопрос) Можно каким-либо образом не писать все 32 знака. Например,
11111111111111111111111111111111
а написать например 1111???
Все остальные знаки примет за нули. Самый первый - знаковый бит.
Откуда у вас эта программа?
Masha_She
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 31
18.02.2014, 02:38  [ТС] #19
Alex566, тоесть никак нельзя поменять на 1111?
Alex566
240 / 152 / 18
Регистрация: 03.04.2013
Сообщений: 317
18.02.2014, 02:40 #20
Цитата Сообщение от Masha_She Посмотреть сообщение
Alex566, тоесть никак нельзя поменять на 1111?
В смысле ограничить в 4 символа? И сделать максимальным числом 7?
Masha_She
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 31
18.02.2014, 02:43  [ТС] #21
Цитата Сообщение от Alex566 Посмотреть сообщение
В смысле ограничить в 4 символа? И сделать максимальным числом 7?
да.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2014, 02:43
Привет! Вот еще темы с ответами:

двоичное представление - C++
пользователь вводит с клавиатуры 2 беззнаковых длинных целых числа a, b. Вывести на консоль слагаемые и их сумму a+b в двоичной системе. ...

Двоичное представление double - C++
Есть программа, которая переводит число DOUBLE в двоичный код по стандарту IEEE 754, но выводит его в обратном порядке. Почему? union...

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

Двоичное представление области памяти - C++
Здравствуйте. В одной из лабораторных работ требуется взять готовые функции из методички и, в принципе, только посмотреть, какой результат...


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

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

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