Показать сообщение отдельно
Старый 09.12.2009, 03:31   #3
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Помогите решить задачку

Первое:
я так и невпёр в приматскую шуточку:
как разбить float на два числа о0 я понимаю разбить int - это факторизация.
Для флоата нам досточно узнать число знаков после запятой (1.23 = 123/100)
Попытки поколдовать с последовательным сдвигом FP путём умножения на 10 и вычисления разницы между floor() и получившимся числом проваливаются из-за точности.
Т.е. я хотел бы так:
1.23 преобразуем:
0 1.23-1=0.23 далее
1 12.3-12=0.3 далее
2 123-123=0 готово //хрен!

Прочитал ТЗ ещё раз. Собственно индусоидность кода нигде не фиксируется (как и используемые функции СИ++). Нахреначил говнокодище.
	char t[30];
	sprintf(t,"%f",x);
	char* ptr=strstr(t,".");
	int n=ptr-(char*)t;
	int m;
	for(m=strlen(t)-1;m>n;m--){
		if(t[m]!='0')break;
	}
	int d=m-n;
	this->up=x*pow(10,d);
	this->down=pow(10,d);
единственное что напрягает - во всех ли платформах юзается точка как десятичный разделитель?

Второе:
Дробное число. Числитель и знаменатель - 10 бит целые.
Это чо-чо? Битовые поля что-ли?
	short up:10;
	short down:10;
Проблема перемещается в функцию вывода - необходимо выковрять 10 значащих бит из 16-битного слова. Просто замаскировать их не вышло - хрен его знает как оргнизовал это дело компилятор (или же надо круить rfc для шортов?), но ождиаемый эффект конструкция &1023 не дала.
Потому я просто забил =\

Вот что вышло в итоге:

файл NUMBER.h
#ifndef _NUMBER_H_
#define _NUMBER_H_

class NUMBER{
private:
	short up;
	short down;
public:
	NUMBER(float x);
	NUMBER(int Up,int Down);
	NUMBER operator+(const NUMBER &x);
	NUMBER operator-(const NUMBER &x);
	NUMBER operator*(const NUMBER &x);
	NUMBER operator*(int x);
	void PRINT();
};
#endif
файл NUMBER.cpp
#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include"NUMBER.h"


NUMBER::NUMBER(int Up,int Down){
	this->down=Down;
	this->up=Up;
}


NUMBER::NUMBER(float x){
	char t[30];
	sprintf(t,"%f",x);
	char* ptr=strstr(t,".");
	int n=ptr-(char*)t;
	int m;
	for(m=strlen(t)-1;m>n;m--){
		if(t[m]!='0')break;
	}
	int d=m-n;
	this->up=x*pow(10,d);
	this->down=pow(10,d);	
}

void NUMBER::PRINT(){
	cout<<(this->up)<<" / "<<(this->down)<<endl;
}

NUMBER NUMBER::operator +(const NUMBER &x){
	return NUMBER(x.up*this->down+this->up*x.down,x.down*this->down);
}

NUMBER NUMBER::operator -(const NUMBER &x){
	return NUMBER(x.up*this->down-this->up*x.down,x.down*this->down);
}

NUMBER NUMBER::operator *(const NUMBER &x){
	return NUMBER(x.up*this->up,x.down*this->down);
}

NUMBER NUMBER::operator *(int x){
	return NUMBER(x*this->up,this->down);
}
файл main.cpp
#include<iostream.h>
#include<math.h>
#include<conio.h>
#include"NUMBER.h"

void main(){
	NUMBER Q(1.3);
	Q.PRINT();
	NUMBER R=Q*2;
	R.PRINT();
	NUMBER T(6,5);
	T.PRINT();
	NUMBER Z=R-T*2;
	Z.PRINT();
	NUMBER F=Z+T;
	F.PRINT();

	getch();

}
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
ABTOMAT (09.12.2009), Harter (06.01.2010), Randomize (09.12.2009), Reizel (06.01.2010)