Консультация № 188987
19.03.2016, 08:01
0.00 руб.
0 2 2
Здравствуйте, уважаемые эксперты! Прошу вас помочь исправить ошибку в коде.
Написать функцию dectobin(str), преобразующую десятичную запись целого положительного числа, представленную строкой str, в строку, изображающую двоичную запись этого же числа. Возвращает указатель на двоичную запись.



Приложение:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <strings.h>
#include <assert.h>
#include <ctype.h>
#include <wchar.h>
char *dectobin(char*, char*);
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char *dec, *bin;
dec=(char*)malloc(100*sizeof(char));///выделяем память в куче
bin=(char*)malloc(100*sizeof(char));
printf("Введите десятичную запись числа: ");
gets(dec);
printf("Результат в двоичной: ");
puts(dectobin(dec,bin));
system("pause");
return 0;
}
char *dectobin(char* dec,char* bin){
int c=1;
int b=0;
int i;
sprintf(i,"%c",dec);
while (i!=0){
b=c*(i%2)+bin;
i=i/2;}
sprintf(bin,"%d", b);
return bin;
}

Обсуждение

давно
Посетитель
398702
3
19.03.2016, 10:16
общий
это ответ
Здравствуйте, fridge!
1) sprintf(i, "%c", dec); - как я понимаю хотите поместить число из dec в i. У sprintf прототип int sprintf(char *buf, const char *format, arg-list). Используйте int atoi(const char* str)
2) b = c*(i % 2) + bin; - не разыменован указатель, да и указатель не тот. Не понял, чего Вы хотели добиться таким образом. Попробуйте так *bin++ = c*(i % 2) + '0';
3) Нет завершающего нуль терминала в строке. Перед выводом не забудьте добавить.
4) sprintf(bin, "%d", b); - Строка находится не в цикле. Добавите только последний результат.
5) Если переводить число таким алгоритмом - его необходимо перевернуть.

Код:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
#include <wchar.h>
char *dectobin(char*, char*);
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char *dec, *bin;
dec = (char*)malloc(100 * sizeof(char));///выделяем память в куче
bin = (char*)malloc(100 * sizeof(char));
printf("Введите десятичную запись числа: ");
gets_s(dec,100);
printf("Результат в двоичной: ");
puts(dectobin(dec, bin));
system("pause");
return 0;
}

void reverse(char* begin, char* end)
{
char temp;
while (begin < end)
{
temp = *begin;
*begin = *end;
*end = temp;
begin++;
end--;
}
}

char *dectobin(char* dec, char* bin){
int c = 1;
char* bin_begin = bin;
int i = atoi(dec);
while (i != 0){
*bin++ = c*(i % 2) + '0';
i = i / 2;
}
*bin = '\0';
reverse(bin_begin, bin-1);
return (bin = bin_begin);
}
5
давно
Посетитель
7438
7205
19.03.2016, 13:33
общий
это ответ
Здравствуйте, fridge!
Альтернативный вариант:
1) без встроенных функций
2) используются беззнаковые целые
3) используется не деление на 2, а сдвиг
4) при формировании битовой строки сначала ищется старшая единица,
если число однобитное, то просто выведется последний бит.
(Зато отсутствует переворачивание строки)
Код:

char* dectobin(char* dec, char* bin)
{
int i, j;
unsigned int iDec;

for(iDec=0; *dec; dec++)
iDec = iDec*10+(*dec)-'0';

for(i=0; i<31; i++,iDec<<=1)
if(iDec & 0x80000000)
break;
for(j=0; i<32; i++,j++,iDec<<=1)
bin[j] = (iDec & 0x80000000)?'1':'0';
bin[j] = 0;
return bin;
}
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа