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

Перевод десятичного числа во внутреннее представление - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
doomer74
1 / 1 / 0
Регистрация: 01.12.2011
Сообщений: 51
20.04.2012, 20:11     Перевод десятичного числа во внутреннее представление #1
Всем привет. Сделал программу перевода десятичного числа во внутреннее представление. Число лежит в диапазоне от -128 до 127 (тип char). Также реализован циклический сдвиг вправо и влево.
Препод попросил исправить следующий недочет:
Вывести в функции output массив char* по %s без всяких циклов. Для этого записывать в массив char* символы '0' и '1' в функции
dvoichperevod (не забытьпро '\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
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
#include <conio.h>
#include <clocale>
#include <stdio.h>
#include <stdlib.h>
 
void dvoichperevod(char *binnumber, char decnumber) // Функция, в которой десятичное число переводится во внутреннее двоичное представление. 
                                                    // decnumber - десятичное число. binnumber - массив, в который записываются полученные в результате сдвига decnumber
                                                    // вправо и побитового умножения на 1 цифры: 0 или 1
{
        for (int i = 0; i < sizeof(decnumber)*8; i++) 
            binnumber[i] = (decnumber >> sizeof(decnumber)*8-1-i) & 1; // Цикл, в котором записываются в массив binnumber цифры 0 или 1
}
 
char leftsdvig(unsigned char chislo, int domg) // Функция сдвига влево. domg - введенное число, являющееся количеством разрядов, на которое следует произвести 
                                               // циклический сдвиг влево. chislo - число, над которым производится операциия сдвига
{
        int dbit = sizeof(chislo)*8;
        return chislo << domg % dbit | chislo >> dbit - domg % dbit;
}
 
char rightsdvig(unsigned char chislo, int domg) // Функция сдвига вправо. domg - введенное число, являющееся количеством разрядов, на которое следует произвести 
                                                // циклический сдвиг вправо. chislo - число, над которым производится операция сдвига
{
        int dbit = sizeof(chislo)*8;
        return chislo >> domg % dbit | chislo << dbit - domg % dbit;
}
 
int scanfik() // Функция ввода переменных
{
    int a = 0, chr = 0;
    while (!chr || (a < -128) || (a > 127))
        {
                chr = scanf("%d", &a);
                fflush(stdin); // Сброс буфера ввода
        }
    return a; // Возвращает значение введенной переменной
}
 
void output(char *n, int bitr) // Функция вывода результата в консоль
{
                int m = 0;
                while (m < bitr*8)
                    printf("%d", n[m++]);
                printf("\n\n");
}
 
void main() // Тело основной программы
{
 setlocale(LC_CTYPE, "rus");
 char dvoich[8], chooser = 0,  result;
 int number = 0 ;
 
 printf(" Введите десятичное число в диапазоне от -128 до 127: ");
 number = scanfik(); // Введённое десятичное число в функции scanfik() присваивается переменной number
 dvoichperevod(dvoich, number); // Вызов функции, переводящей введенное число во внутреннее двоичное представление
 printf(" Двоичное представление числа: ");
 output(dvoich, 1); // Вывод в консоль двоичного представления числа
 
 printf(" Выберите, какой циклический сдвиг вы желаете произвести: \n");
 printf(" Клавиша '1' - Произвести циклический сдвиг числа влево\n");
 printf(" Клавиша '2' - Произвести циклический сдвиг числа вправо\n");
 printf("\n Клавиша '3' - выход из программы");
 
 do
 {
    chooser = _getch(); // Присваиваем переменной choose функцию _getch(), считывающую введенный символ
    switch(chooser) // Перебираем значения введенной переменной
    {
    case '1': printf(" \n Введите число разрядов для сдвига влево: ");
              result = leftsdvig(number, scanfik()); // Присваивание переменной result результата работы функции сдвига влево
              break;
    case '2': printf(" Введите число разрядов для сдвига вправо: ");
              result = rightsdvig(number, scanfik()); // Присваивание переменной result результата работы функции сдвига вправо
              break;
    case '3': exit(1);
    default: printf("\n Такого пункта нет\n"); // Если будут нажаты другие клавиши, в консоль будет выведено соответствующее сообщение
             break;
    }
 
 dvoichperevod(dvoich, result); // Вызов функции, переводящей введенное число во внутреннее двоичное представление
 printf(" \n Число в двоичном представлении: ");
 output(dvoich, 1); // Вызов функции, выводящей число в консоль
 printf(" Число в десятичной системе счисления: ");
 printf("%d", result);
 printf(" \n\n Нажмите клавишу '3' для выхода из программы\n");
 printf(" Нажмите клавишу '1', если желаете снова сделать циклический сдвиг влево\n");
 printf(" Нажмите клавишу '2', если желаете снова сделать циклический сдвиг вправо\n");
 }
 while (chooser != '3');
 _getch();
 }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.04.2012, 20:18     Перевод десятичного числа во внутреннее представление #2
по-моему никак. У тебя же char форматируется при выводе как %d, а не %с
, то есть выводятся десятичные числа, а не символы.
Если ты сделаешь %s - будет выведен весь массив(если\0 в конце добавить), но выглядеть он будет, как строка символов, а не число.
doomer74
1 / 1 / 0
Регистрация: 01.12.2011
Сообщений: 51
20.04.2012, 20:52  [ТС]     Перевод десятичного числа во внутреннее представление #3
Ну вот как я понял, надо реализовать запись char строки в массив char непосредственно в функции перевода. Потом уже тупо этот массив вывести не с форматированием %d в цикле, а просто как строку... Но как.

Добавлено через 30 минут
Что же, совсем никто не поможет? Может быть, можно как-то реализовать с помощью функции strcpy ?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.04.2012, 21:14     Перевод десятичного числа во внутреннее представление #4
ты должен понимать разницу между числами и символами.
unsigned char c= '0' ; c= '1'
и c=0; c= 1 - это разные вещи
твоя функция void dvoichperevod(char *binnumber, char decnumber)
записывает в char именно 0 / 1 без кавычек.
массив таких чисел через %s не вывести.
doomer74
1 / 1 / 0
Регистрация: 01.12.2011
Сообщений: 51
20.04.2012, 21:18  [ТС]     Перевод десятичного числа во внутреннее представление #5
Это я понимаю. Но мне как мне это вот понимание применить?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.04.2012, 21:22     Перевод десятичного числа во внутреннее представление #6
ну для начала определись символы в массиве ты хочешь двигать или биты в байтах числа
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2012, 21:24     Перевод десятичного числа во внутреннее представление
Еще ссылки по теме:

Перевод десятичного числа в двоичное C++
C++ Внутреннее представление числа в памяти
Перевод длинного десятичного числа в шестнадцатиричное C++

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

Или воспользуйтесь поиском по форуму:
doomer74
1 / 1 / 0
Регистрация: 01.12.2011
Сообщений: 51
20.04.2012, 21:24  [ТС]     Перевод десятичного числа во внутреннее представление #7
Наверное, придется символы двигать. Раз такое требование.
Иначе я не знаю, как сделать, чтобы функция возвращала значение числа, и при этом в функции output выводился массив символов.
Yandex
Объявления
20.04.2012, 21:24     Перевод десятичного числа во внутреннее представление
Ответ Создать тему
Опции темы

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