Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2010, 23:35   #1
Veselyn
Форумчанин
 
Аватар для Veselyn
 
Регистрация: 29.01.2009
Сообщений: 175
По умолчанию Перевод вещественного числа из 10 в 2 Систему счисления. [С++]

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


Код:
		 #include<stdio.h>
		  #include <tchar.h>
		   #include <conio.h>
   int main()
{
int ost, a, q, e, j, i, x, znak;
int c[23], exp[7];
j=0; i=0;
float number, y,b;
//   Ввод веществ. числа
   printf("Chislo \n");
   scanf("%f",&number);
//   Розделение целой и дромной части
x=(int)number;
y=number-x;
//   Вывод целой и дробной частей
printf("tselaya chast' = %d\n drobnaya chast=%lf ",x,y);
//---------------------------------------------
//   Ввод temp
	a=x;
	i=1;
//   Перевод целой части
	while(a/2!=0)
	  { ost=a%2;   //   Считаем остаток
		c[i]=ost;  //   Запоминаем остаток
		++i;       //   Считаем кол-во 2-ых разрядов
		a=a/2;     //   Готовим к следующему проходу цикла
	  }
//   Считаем экспоненту в 10-ой сист. счисл.
	q=23-(i+1);
	e=127+i;
//   Вывод всей мантиссы
	printf("\n Mantissa s neyavnym bitom = ");
	 for(i; i>=0; i--)
		printf("%d",c[i]);
}

//   Подготовка к переводу
	i=0;
	b=y;
//   Мантисса с неявным битом
	 while(i!=24)
	  b=b*2;

		 if(b>1)
			 { c[i]=1;
			   ++i;
			   b=b-1;
			 }
		  else
			 { c[i]=0;
			   ++i;
			 }
//   Подготовка к выводу мантиссы
	c[i]=1;
	i=0;
//   Вывод всей мантиссы
printf("\nMantissa = ");
	 for (i;i<=q; i++)
	 printf("%d",c[i]);
//---------------------------------------------
//    Перевод  экспоненты
	 while(e/2!=0)
	  { ost=e%2;
		exp[j]=ost;
		++j;
		e=e/2;
		if(j==8) break;
	  }
}
//   Подготовка к выводу экспоненты
exp[j]=1;
//   Вывод экспоненты
 for(j;j>=0;j--)
  printf("\nEXP = %d",exp[j]);
//---------------------------------------------
 //   Вычисление и вывод знака
	 if(number>0)
          { 
            printf("\n znak = 0\n");
            znak=0;
          }
	 else 
          {   printf("\n znak=1\n");
              znak=1;
          }
//---------------------------------------------
//   Вывод в нормализированном виде
 //   Вычисление и вывод знака
	 if(number>0) printf("0");
		else printf("1");
//   Подготовка к выводу экспоненты
	exp[j]=1;
//   Вывод экспоненты
  for(j;j>=0;j--)
	printf("%d",exp[j]);
//   Подготовка к выводу мантиссы
	c[i]=1;
	i=0;
//   Вывод всей мантиссы
	 for (i;i<=q; i++)
	 printf("%d",c[i]);

	return 0;
	getch();
}
Все люди делятся на 10 типов: те, кто понимают двоичную систему счисления и те, кто нет.

Последний раз редактировалось Rembo; 13.01.2010 в 19:31. Причина: дополнил
Veselyn вне форума Ответить с цитированием
Старый 12.01.2010, 23:41   #2
Namolem
Oo
Форумчанин
 
Аватар для Namolem
 
Регистрация: 10.10.2009
Сообщений: 350
По умолчанию

раз зависает, значит где-то бесконечный цикл. Закомментируйте все, потом по одному циклу подключайте
Namolem вне форума Ответить с цитированием
Старый 13.01.2010, 00:10   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ужасное форматирование кода
Сдаётся мне, Вы где-то не там закрывающую скобку поставили... Хотя особо не разбирался, но
Цитата:
Код:
while(i!=24) { b=b*2; if(b>1) { c[i]=1; ++i; b=b-1;}
else { c[i]=0;++i;}
c[i]=1; i=0;
это выглядит несколько странно
netrino вне форума Ответить с цитированием
Старый 13.01.2010, 17:48   #4
Veselyn
Форумчанин
 
Аватар для Veselyn
 
Регистрация: 29.01.2009
Сообщений: 175
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Ужасное форматирование кода
Согласен, исправил.
Пробовал закомментировать, как не одно... - так другое.
Помогите
Все люди делятся на 10 типов: те, кто понимают двоичную систему счисления и те, кто нет.

Последний раз редактировалось Veselyn; 13.01.2010 в 18:12.
Veselyn вне форума Ответить с цитированием
Старый 15.01.2010, 23:07   #5
Veselyn
Форумчанин
 
Аватар для Veselyn
 
Регистрация: 29.01.2009
Сообщений: 175
По умолчанию

Не хочу показаться назойливым, но
Сроки поджимают, а я зашел в тупик. Может кто подскажет, что не так как надо
Все люди делятся на 10 типов: те, кто понимают двоичную систему счисления и те, кто нет.
Veselyn вне форума Ответить с цитированием
Старый 16.01.2010, 00:33   #6
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

ну вижу явный бескоечный цикл
Код:
	 while(i!=24)
	  b=b*2;

		 if(b>1)
			 { c[i]=1;
			   ++i;
			   b=b-1;
			 }
		  else
			 { c[i]=0;
			   ++i;
			 }
подозреваю что нужно напсать чтото вроде этого

Код:
	 while(i!=24)
            {
	  b=b*2;

		 if(b>1)
			 { c[i]=1;
			   ++i;
			   b=b-1;
			 }
		  else
			 { c[i]=0;
			   ++i;
			 }
            }
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Старый 16.01.2010, 21:43   #7
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Кстати ещё вы тут както неправильно работаете с индексами массиввов.
Например вы обьявлеете массив int c[23] (т.е. в нём элементы c[0],c[1],c[2]...c[21],c[22]) а работаете с ним как буддто последний элемент в массиве c[24] (т.е. как буддто вы обьявли массив int c[25]).

Кроме того после цкла for(j;j>=0;j--) значение j будет равно -1 и вы затем выполняете exp[j]=1; т.е. вы обращаетесь к элементу exp[-1] этим вы портите данные в стеке совершенно не относящиеся к переменной exp. И результат в данном случае непредсказуем!

И вообще чтобы лучше вам помочь, неплохо было бы узнать что точно вы хотите получить? каке данные, сколько бит, какой формат и.т.п.
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Старый 16.01.2010, 23:42   #8
Veselyn
Форумчанин
 
Аватар для Veselyn
 
Регистрация: 29.01.2009
Сообщений: 175
По умолчанию

Спасибо что уделили внимание.
Программа должна переводить вещественное число с 10-ой сист. счисл. в 2-ю в нормализированном виде одинарной точности (с выводом знака(1 бит), экспоненты(8 бит) и мантиссы(23 бита(без не явного))
Все люди делятся на 10 типов: те, кто понимают двоичную систему счисления и те, кто нет.

Последний раз редактировалось Veselyn; 16.01.2010 в 23:45.
Veselyn вне форума Ответить с цитированием
Старый 17.01.2010, 00:20   #9
lamak
C++
Пользователь
 
Регистрация: 31.10.2009
Сообщений: 30
По умолчанию

Делал лабу в этом семестре, правда надо было вывести в 3-х форматах число, когда общее число бит равно 32, 64 и 80 (короткий длинный и расширенный форматы соответственно)
Может чем-то поможет, мой код:
Код:
#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <iomanip.h>
#include <math.h>
char s[30], por[30];
int l, len, len_por;
float n;

void func_perevod(float num) 
{
  float drob; 
  int k,i;
  itoa((int)num,s,2);
  l=strlen(s);
  drob=num-(int)num;
  for (i=l; i<(l+8); i++)
      { int z;    
        float k=drob*2;
        z=(int)k;
        if ( drob==0 ) 
        {s[i]='0'; s[i+1]='\0'; break;}
        else { 
              s[i]=z+'0';
                 drob=k-z; 
                   s[i+1]='\0'; }   
            }
   i=strlen(s); len=i;
     while (s[i]!='1')
      { s[i]='\0'; i--; }        
          }
          
void func_porjadoc(int num) 
{ itoa(num,por,2);
  len_por=strlen(por); }

 void sitka(int all,int rozm_r, int rozm_m)
  {int j,i,number[all]; 
   if (( len_por > rozm_r ) || ( l > rozm_m )) 
       cout<<"Overflow in this type!"<<endl;
   else
   { 
 if (n<0) number[0]=1;  
       else number[0]=0;
   if (all==80) i=0; 
      else i=1;
 for (j=rozm_r+1, i; j<=rozm_m; i++, j++ ) 
            number[j]=s[i]-'0';
        
 int p=l, p1;
    p1=pow(2,rozm_r-1)+p;
       func_porjadoc(p1);
 for (j=1, i=0; j<=rozm_r; j++, i++) 
      number[j]=por[i]-'0';
   
  for (j=0; j<all; j++)
      if (number[j]!=1) number[j]=0; 
  for(j=rozm_r+len; j<all; j++) 
      number[j]=0;   
  
  for (j=0; j<all; j++)        
  cout<<number[j];
  cout<<endl; 
   } 
      }


int main()
{cout<<"Input number: "; cin>>n;
 float n1=fabs(n);
 func_perevod(n1);
 sitka(32,8,23);
 sitka(64,11,52);
 sitka(80,15,64);
 getch();
      }
Верю в google...
lamak вне форума Ответить с цитированием
Старый 17.01.2010, 00:39   #10
Veselyn
Форумчанин
 
Аватар для Veselyn
 
Регистрация: 29.01.2009
Сообщений: 175
По умолчанию

Спасибо за помощь
Все люди делятся на 10 типов: те, кто понимают двоичную систему счисления и те, кто нет.
Veselyn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Консоль (Delphi) VadEr Помощь студентам 6 10.06.2009 19:16
Консоль в паскале XiN Общие вопросы Delphi 3 06.09.2008 21:57
Консоль и компаненты FAiver Общие вопросы Delphi 4 04.01.2008 13:29
Консоль MAcK Общие вопросы Delphi 4 19.12.2007 19:05