ФФФ
Гость
|
|
« : 20-11-2005 12:03 » |
|
такое задание в кадом байте длинного целого числа N поменять двоичные разряды в зеркальном порядке #include <stdio.h> #include <stdlib.h> #include <conio.h> void main(void) { char buffer[100]; int N; int i,tmp;
i=0; clrscr(); printf("Vvedute chuslo:\n\n"); scanf("%d",&N); itoa(N,buffer,2); printf("Dvouchnoe predstavlenue chusla:%s\n\n",buffer); tmp=0; printf("v zerkalnom poriadke"); while (buffer[i]!='\0') { tmp++; i++; } for (i=tmp;i>=0;i--)
{
printf("%c",buffer[i]); }
printf("\n");
}
скажите то ли я сделала,или я че то не догнала=) если не так подскажите как Finch :flowers:
|
|
« Последнее редактирование: 18-12-2007 21:42 от Алексей1153++ »
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #1 : 20-11-2005 13:32 » |
|
Как сказать. Ты переворачиваешь число полностью, но тебе, судя по заданию, надо перевернуть каждый байт числа. Все хорошо, если будет введено число <=255, т.к. это 1 байт. Если же ввести 300, то это уже 2 байта. Для числа 300 рассмотрим пример: двоичное представление: 100101100 , т.е. 2 байта |00000001|00101100| зеркальное отражеие твоей проги: 001101001 как должно быть, судя по заданию: |10000000|00110100| Т.е. тебе надо брать на рассмотрение в отдельности каждый байт числа. Для этого, очень удобно использовать указатели. Возьми указатель типа char (он как раз в 1 байт), присвой ему адрес переменной в которой будет твое число. Таким образом можешь рассмотреть один байт. Потом смести указатель на единицу и рассмотришь следующий байт и т.д., пока не рассмотришь столько байт, скоько тебе необходимо.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #2 : 20-11-2005 15:27 » |
|
Мда не читаю я внимательно задание Вот исправленное решение: #include <stdio.h>
void PrintBit(unsigned int a) { int len = sizeof(int)*8; unsigned int fl=1 << (len-1); while (len>0) { if ((len % 4) == 0) printf(" "); if ((a & fl) != 0) printf("1"); else printf("0"); len--; fl >>=1; } printf("\n"); }
int main() {
unsigned int a; printf("Vvedite chislo: "); scanf("%d",&a); unsigned int b=0; unsigned int temp=a; int len = sizeof(int); unsigned char *ta=(unsigned char *)&temp; unsigned char *tb=(unsigned char *)&b; int i; while (len>0) { i=8; while (i>0) { (*tb) <<=1; (*tb)+=((*ta) & 1); (*ta) >>=1; i--; } len--; ta++; tb++; } printf("Dvouchnoe predstavlenue chisla:\n"); printf("Do: "); PrintBit(a); printf("Posle: "); PrintBit(b); return 0; }
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
ФФФ
Гость
|
|
« Ответ #3 : 21-11-2005 06:04 » |
|
Nickdeforest thnxX Finch спасиб но ну так же прога не будет работать? #include <stdio.h>
void PrintBit(unsigned int a) { int len = sizeof(int)*8; unsigned int fl=1 << (len-1); while (len>0) { if ((len % 4) == 0) printf(" "); if ((a & fl) != 0) printf("1"); else printf("0"); len--; fl >>=1; } printf("\n"); }
int main() {
unsigned int a; unsigned int b=0; unsigned int temp=a; int len = sizeof(int); unsigned char *ta=(unsigned char *)&temp; unsigned char *tb=(unsigned char *)&b; int i; printf("Vvedite chislo: "); scanf("%d",&a); while (len>0) { i=8; while (i>0) { (*tb) <<=1; (*tb)+=((*ta) & 1); (*ta) >>=1; i--; } len--; ta++; tb++; } printf("Dvouchnoe predstavlenue chisla:\n"); printf("Do: "); PrintBit(a); printf("Posle: "); PrintBit(b); return 0; } двоичное представление то правильно, но вот зеркалка,ваще что то странное выводит?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #4 : 21-11-2005 16:34 » |
|
в кадом байте длинного целого числа N поменять двоичные разряды в зеркальном порядке
Тип int для 32 разрядных систем состоит из 4 байт. В твоем задании просят перевернуть именно каждый байт. Что программа и делает. В первоначальном варианте проги переворачивалось все число разом. Пример : Vvedute chuslo: 123654789 Dvouchnoe predstavlenue chisla: Do: 0000 0111 0101 1110 1101 0010 1000 0101 Posle: 1110 0000 0111 1010 0100 1011 1010 0001 Press any key to continue
Байт состояит из 8 битов. 1 байт 0000 0111 его зеркало 1110 0000 2 байт 0101 1110 его зеркало 0111 1010 3 байт 1101 0010 его зеркало 0100 1011 4 байт 1000 0101 его зеркало 1010 0001
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
ФФФ
Гость
|
|
« Ответ #5 : 22-11-2005 05:48 » |
|
Финч извини конечно что достаю но! Vvedute chuslo: 123654789 Dvouchnoe predstavlenue chisla: DO 1101 0010 1000 0101 POSLE 0100 0000 0001 1000 вот этот код #include <stdio.h>
void PrintBit(unsigned int a) { int len = sizeof(int)*8; unsigned int fl=1 << (len-1); while (len>0) { if ((len % 4) == 0) printf(" "); if ((a & fl) != 0) printf("1"); else printf("0"); len--; fl >>=1; } printf("\n"); }
int main() {
unsigned int a;
unsigned int b=0; unsigned int temp=a; int len = sizeof(int); unsigned char *ta=(unsigned char *)&temp; unsigned char *tb=(unsigned char *)&b; int i; printf("Vvedite chislo: "); scanf("%d",&a); while (len>0) { i=8; while (i>0) { (*tb) <<=1; (*tb)+=((*ta) & 1); (*ta) >>=1; i--; } len--; ta++; tb++; } printf("Dvouchnoe predstavlenue chisla:\n"); printf("Do: "); PrintBit(a); printf("Posle: "); PrintBit(b); return 0; } скажи ошибка может где?
|
|
|
Записан
|
|
|
|
Hooter
|
|
« Ответ #6 : 22-11-2005 07:47 » |
|
Ошибка в том, что scan для переменной a вызывается после того, как значение переменной a копируется в переменную temp: unsigned int a;
unsigned int b=0; unsigned int temp=a; ... printf("Vvedite chislo: "); scanf("%d",&a); // <== ошибка ...
скажи ошибка может где? А должно быть так: unsigned int a;
printf("Vvedite chislo: "); scanf("%d",&a); // <== вот сюда
unsigned int b=0; unsigned int temp=a; ...
|
|
|
Записан
|
|
|
|
ФФФ
Гость
|
|
« Ответ #7 : 22-11-2005 09:20 » |
|
так если так ошибка постоянно
declaration si now allowed here=((((((((((((((((((((((((((((((((((((((((((((((((((((((((
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #8 : 22-11-2005 09:40 » |
|
Альтернативный вариант. Вроде протестил, нормально работает. Предоставляется выбор #include "stdio.h" #include "conio.h" int main() { clrscr(); unsigned int x=0; unsigned int res_x=0; unsigned int temp=0;
printf("Input unsigned digit "); scanf("%d",&x); res_x=x; ////////////////////////////////////////////////////////// printf("binary :"); for(int i=0;i<sizeof(res_x)*8;i++) { temp=res_x; res_x<<=1; res_x>>=1; if(res_x==temp) printf("0"); else printf("1");
if((i+1)%8==0) printf("|");
res_x<<=1; } /////////////////////////////////////////////////////// res_x=x; printf("\nzerkalo:"); for(int j=sizeof(res_x);j>0;j--) { res_x=x; res_x>>=8*(j-1);
for(i=0;i<8;i++) { temp=res_x; res_x>>=1; res_x<<=1; if(res_x==temp) printf("0"); else printf("1");
if((i+1)%8==0) printf("|");
res_x>>=1; } }
return 1; }
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Hooter
|
|
« Ответ #9 : 22-11-2005 10:02 » |
|
так если так ошибка постоянно
declaration si now allowed here=((((((((((((((((((((((((((((((((((((((((((((((((((((((((
Это что, сообщение об ошибке? Ты пробовала просто скопировать текст программы Finch'а из его первого поста и попытаться откомпилировать?
|
|
« Последнее редактирование: 18-12-2007 21:45 от Алексей1153++ »
|
Записан
|
|
|
|
ФФФ
Гость
|
|
« Ответ #10 : 22-11-2005 10:23 » |
|
hooter конечно да эту ошибку дает
nikdeforest спасиб!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
Записан
|
|
|
|
Hooter
|
|
« Ответ #11 : 22-11-2005 10:48 » |
|
hooter конечно да эту ошибку дает
А ты не могла бы полностью привести текст сообщения компилятора? И номер строки, где возникает ошибка?
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #12 : 22-11-2005 10:56 » |
|
Кстати, правильность ответа не проверял, а вот то, что код Finch'a компилится - это 100%. ФФФ, выделяй код программы, что Finch написал. Копируй (ctrl+insert), открывай текстовый файл (в блокноте) и вставляй в него код программы (shift+insert) и сохраняй. Все будет ОК.
|
|
« Последнее редактирование: 18-12-2007 21:47 от Алексей1153++ »
|
Записан
|
ещё один вопрос ...
|
|
|
ФФФ
Гость
|
|
« Ответ #13 : 22-11-2005 11:03 » |
|
Nike так и сделала вот код мой,копия ФИнча #include <stdio.h> void PrintBit(unsigned int a) { int len = sizeof(int)*8; unsigned int fl=1 << (len-1); while (len>0) { if ((len % 4) == 0) printf(" "); if ((a & fl) != 0) printf("1"); else printf("0"); len--; fl >>=1; } printf("\n"); }
int main() {
unsigned int a; printf("Vvedite chislo: "); scanf("%d",&a); unsigned int b=0; unsigned int temp=a; int len = sizeof(int); unsigned char *ta=(unsigned char *)&temp; unsigned char *tb=(unsigned char *)&b; int i; while (len>0) { i=8; while (i>0) { (*tb) <<=1; (*tb)+=((*ta) & 1); (*ta) >>=1; i--; } len--; ta++; tb++; } printf("Dvouchnoe predstavlenue chisla:\n"); printf("Do: "); PrintBit(a); printf("Posle: "); PrintBit(b); return 0; }
ошибка в 24 строке Declaration is not allowed here
|
|
|
Записан
|
|
|
|
Hooter
|
|
« Ответ #14 : 22-11-2005 11:20 » |
|
Вот этот кусок unsigned int a; printf("Vvedite chislo: "); scanf("%d",&a); unsigned int b=0; unsigned int temp=a; int len = sizeof(int); unsigned char *ta=(unsigned char *)&temp; unsigned char *tb=(unsigned char *)&b; int i; while (len>0) {
попробуй заменить вот этим: unsigned int a; unsigned int b=0; unsigned int temp; int len = sizeof(int); unsigned char *ta=(unsigned char *)&temp; unsigned char *tb=(unsigned char *)&b; int i;
printf("Vvedite chislo: "); scanf("%d",&a); temp=a;
while (len>0) {
ЗЫ. Интересно, что код компилируется и под MSVC++ и под gcc. Что за компилятор ты используешь?
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #15 : 22-11-2005 11:20 » |
|
Ты не поверишь, но у меня скомпилился код (вставлял твой, котрый ты даешь в последнем посте). А мой скомпилился? Если нет, то наверное дело в компилятрое. Ты в чем работаешь?
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
ФФФ
Гость
|
|
« Ответ #16 : 22-11-2005 11:23 » |
|
у меня Borland C 3.1
твой компилится =))
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #17 : 22-11-2005 12:34 » |
|
Я пробовал на Turbo C++ 3.0 все было ОК. Насколько я знаю Turbo C++ и Borland C++ - это те же яйца только в профиль .
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
|