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

объединить преимущества кодов - C++

Восстановить пароль Регистрация
 
fantazer333
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 47
16.04.2012, 22:59     объединить преимущества кодов #1
Задание

Написать программу. Пользователь вводит положительное или отрицательное число. Перевести число в 2-ую систему счисления и вывести результат на экран.

Необходимо сделать максимально просто

нашел 2 кода

№1

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
int main()
{
    setlocale (LC_ALL, "Russian");
    int a, b=0, k=1;
    cout<<"Введите десятичное число: ";
    cin>>a;
    while (a) //пока а!=0
    {
        b+=a%2*k; //двоичное число = остаток от деления десятичного 
        //числа на 2 (это, думаю, понятно) * k (разряд) +то, что было в b
        a/=2; //само деление а на 2
        k*=10; //увеличение разряда
    }
    cout<<"Двоичное число: "<<b<<endl;
 
    return 0;
}

№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
#include <iostream>
#include <string>
 
using namespace std;
 
string dectobin(int num) // функция для перевода
{
    string result; // строка для результата
    for (; num!=0; num>>=1) // цикл со сдвигом вправо на 1 бит (работает быстрее чем деление на 2,
         //но также делит)
        result.insert(0, num&1 ? "1" : "0"); // вставка цифры в начало строки (1 если последний бит 1, 0 если 0)
    return result; // возврат результата
}
 
int main(int argc, char *argv[])
{
        // тут думаю понятно, ввод данных и вызов функции
    int num;
    cout<<"Enter number: ";
    cin>>num;
    cout<<dectobin(num);
    return 0;
}

Проблема в следующем, первый считает отрицательное, но если число будет большое то не справляется. Второй зависает когда вводят отрицательное.

Помогите совместить их чтобы в итоге код соответствовал заданию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
14004 / 8835 / 1234
Регистрация: 24.12.2010
Сообщений: 16,014
16.04.2012, 23:06     объединить преимущества кодов #2
C
1
2
3
if (num<0) { sign = -1; num = -num; }
else sign = 1;
......
Идея ясна?
fantazer333
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 47
16.04.2012, 23:22  [ТС]     объединить преимущества кодов #3
Идея в том чтобы при отрицательном числе в двоичное число просто подставлялся минус, так?

А зачем вводить переменную sign?

Я не могу сообразить куда вставить код сравнения отрицательного числа.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
16.04.2012, 23:30     объединить преимущества кодов #4
C
1
itoa( value, str, 2 );
Может быть проще?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
16.04.2012, 23:34     объединить преимущества кодов #5
Цитата Сообщение от lazybiz Посмотреть сообщение
Может быть проще?
Да, действительно, давайте всё программирование сведём к формошлёпству и библиотечным шаблонам, а о низкоуровневом программировании забудем. Всё равно до нас уже всё открыто.
fantazer333
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 47
16.04.2012, 23:36  [ТС]     объединить преимущества кодов #6
Не проще, то что вы написали для меня вообще темный лес, лучше подскажите куда цикл воткнуть на проверку
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
16.04.2012, 23:40     объединить преимущества кодов #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Да, действительно, давайте всё программирование сведём к формошлёпству и библиотечным шаблонам, а о низкоуровневом программировании забудем. Всё равно до нас уже всё открыто.
Почему бы и нет, никто не говорил что надо написать алгоритм перевода самому, в задании сказано "Необходимо сделать максимально просто".

Цитата Сообщение от fantazer333 Посмотреть сообщение
Не проще, то что вы написали для меня вообще темный лес
Стандартная функция сложнее в понимании чем рукописный алгоритм перевода? Сильно сомневаюсь...
fantazer333
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 47
16.04.2012, 23:47  [ТС]     объединить преимущества кодов #8
Цитата Сообщение от lazybiz Посмотреть сообщение
Почему бы и нет, никто не говорил что надо написать алгоритм перевода самому, в задании сказано "Необходимо сделать максимально просто".

Стандартная функция сложнее в понимании чем рукописный алгоритм перевода? Сильно сомневаюсь...
А можно тогда увидеть полный код программы с этой функцией чтоб визуально увидеть где она должна быть.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
16.04.2012, 23:51     объединить преимущества кодов #9
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* itoa example */
#include <stdio.h>
#include <stdlib.h>
 
int main ()
{
  int i;
  char buffer [33];
  printf ("Enter a number: ");
  scanf ("%d",&i);
  itoa (i,buffer,2);
  printf ("binary: %s\n",buffer);
  return 0;
}
Источник: http://www.cplusplus.com/reference/c.../cstdlib/itoa/
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
16.04.2012, 23:56     объединить преимущества кодов #10
Цитата Сообщение от lazybiz Посмотреть сообщение
Почему бы и нет, никто не говорил что надо написать алгоритм перевода самому, в задании сказано "Необходимо сделать максимально просто".
а если тебе нужна программа для работы под системой, для которой ещё не написаны эти библиотеки функций???
fantazer333
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 47
17.04.2012, 07:48  [ТС]     объединить преимущества кодов #11
Цитата Сообщение от lazybiz Посмотреть сообщение
Код C
/* itoa example */
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int i;
char buffer [33];
printf ("Enter a number: ");
scanf ("%d",&i);
itoa (i,buffer,2);
printf ("binary: %s\n",buffer);
return 0;
Что-то как-то не корректно она отображает отрицательные числа, добавляет кучу единиц в начало
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
17.04.2012, 08:16     объединить преимущества кодов #12
Цитата Сообщение от fantazer333 Посмотреть сообщение
Что-то как-то не корректно она отображает отрицательные числа, добавляет кучу единиц в начало
Как ты представляешь себе отрицательное число в двоичной системе счисления? -2 == -10 ?
Читай про представление чисел в ЭВМ. Можешь начать отсюда: http://www.al.cs.msu.su/static/class...rRepresent.pdf

P.S.: не знаю как у вас, но нас этому еще в школе учили.
fantazer333
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 47
17.04.2012, 09:47  [ТС]     объединить преимущества кодов #13
Я так понял что этот код переводит отрицательное число в дополнительное представление, а нужно чтобы в обратное.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2012, 09:51     объединить преимущества кодов
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
17.04.2012, 09:51     объединить преимущества кодов #14
В обратном представлении отрицательного числа в начале тоже куча единиц.

Дополнительный код отрицательных чисел.
Получается образованием обратного кода с последующим прибавлением
единицы к его младшему разряду.
Отними единицу и будет тебе обратный.
Yandex
Объявления
17.04.2012, 09:51     объединить преимущества кодов
Ответ Создать тему
Опции темы

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