forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   перевод Float или Double в Int или другое целое. (http://forum.boolean.name/showthread.php?t=688)

Платон 17.02.2006 13:39

сабж. Чето ненашел таких функций. Самому писать что-ли? :dontknow:

Платон 17.02.2006 13:58

Вопрос вдогонку:

есть два класса, и в обоих есть методы параметрами которых являются указатели на эти классы. Как мне описать эти методы?
Например
Код:

class A
{
 * * public:
 * * float ax;

 * * void method(B *x);
};

class B
{
 * * public:
 * * float bx;

 * * void method(A *x);
}

Как видно, в классе A описан метод с параметром указателем на класс B, что вызовет ошибку так как класс B декларирован позже. Как быть?

Платон 17.02.2006 14:16

Еще один вопрос:)
Как перемножить не две, а три или больше матриц? Так же как и две - "строка на столбец" первых двух, а потом "строка на столбец" получившейся матрицы и третьей и т.д?

Платон 17.02.2006 16:41

Первый вопрос закрыт, интересует больше второй вопрос.

Maxus 17.02.2006 16:53

Цитата:

Originally posted by Платон@17.2.2006, 14:16
Еще один вопрос:)
Как перемножить не две, а три или больше матриц? Так же как и две -* "строка на столбец" первых двух, а потом "строка на столбец" получившейся матрицы и третьей и т.д?

Очень просто:
Код:

include "d3dx8math.h"
include "D3d8types.h"

D3DMATRIX m1
D3DMATRIX m2
D3DMATRIX m3
D3DMATRIX m4

D3DXMatrixMultiply(m3,m1,m2)
D3DXMatrixMultiply(m4,m3,m4)

И в m4 получаем результат перемножения 4-х матриц.

Платон 17.02.2006 17:08

Нет Maxus, мне нужно ручное перемножение матриц. С подключеными модулями и я смогу перемножить :)
Вобщем сделал последовательное перемножение, пофиг на этот вопрос.

Остался самый интересный - второй.
Может с помощью прототипа как-нибудь?

impersonalis 17.02.2006 17:56

1)преобразование типов:
Код:

float a;
int x=int(a);
//или просто int x=a;

;
и по аналогии.
2) матрицы перемножать последователно в строгом порядке: 1 на 2, результат 12 на 3 и т.д.
примерно так
Код:

//created by impersonalis
//b00lean team (http://community.boolean.name/)

//библиотека матриц


template <class abstr>
class matrix{
private:
        unsigned StringSize;
        unsigned CSize;
        abstr *buffer;
public:
        matrix<abstr> (unsigned size,unsigned size2=0);//стандартный конструктор
        matrix<abstr> (unsigned NS,unsigned NC,const matrix &M);//минор (0,0,X - полностью копирует матрицу Х в создаваемую)
        matrix<abstr> (char filename[]);//загрузка из файла
        matrix<abstr> ();//дефолтный конструктор
        ~matrix();//деструктор
        void in(unsigned SNumber,unsigned CNumber,abstr Z);//ввод
        abstr out(unsigned SNumber,unsigned CNumber)const;//вывод
        abstr determinant()const;//определитель
        abstr Ajk(unsigned NS,unsigned NC)const;//(-1)^(j+k)*|Minor|
        void transp(const matrix &M);//транспонирование
        bool invert(const matrix &M);//инвертирование
        abstr IstrJcol(const matrix &M,unsigned I,unsigned J)const;//перемножение строка*столбец
        void operator*(abstr Z);//умножение на коэффициент
        void MNOG(const matrix &M1,const matrix &M2);//пермножение матриц

        friend ostream & operator <<(ostream &out,const matrix &M);//вывод матрицы в поток в формате HTML-4 как таблицы
        void ShowMessage();//генерация виндозной форточки с матрицей
};

template <class abstr>
matrix<abstr>::matrix(unsigned size,unsigned size2){
        StringSize=size;
        CSize=size2;
        if (CSize==0){CSize=StringSize;}
        unsigned index=(CSize-1)*StringSize+StringSize;
        buffer=new abstr[index];
}

template <class abstr>
abstr matrix<abstr>::IstrJcol(const matrix &M,unsigned I,unsigned J)const{
        abstr z=0;
        for(unsigned k=1;k<=StringSize;k++){
 abstr az=out(I,k);
 abstr bz=M.out(k,J);
 z=z+az*bz;
        }
        return z;
}

template <class abstr>
void matrix<abstr>::MNOG(const matrix &M1,const matrix &M2){
        //самодомножение a=a*b
        if(&M1==this){
 
 matrix <abstr>E(0,0,M1);
 MNOG(E,M2);
 return;
        }
        //самодомножение a=c*a
        if(&M2==this){
 
 matrix <abstr>E(0,0,M2);
 MNOG(M1,E);
 return;
        }

        if(StringSize+CSize!=0){
 delete []buffer;
        }
//       
        StringSize=M2.StringSize;
        CSize=M1.CSize;
        unsigned index=(CSize-1)*StringSize+StringSize;
        buffer=new abstr[index];
//
        for(unsigned i=1;i<=M1.CSize;i++){
 for(unsigned j=1;j<=M2.StringSize;j++){
        in(i,j,M1.IstrJcol(M2,i,j));
 }
        }
}


impersonalis 17.02.2006 18:01

Цитата:

Может с помощью прототипа как-нибудь?

именно!
Код:

class B;
//class A;

class A
{
 * *public:
 * *float ax;

 * *void method(B *x);
};

class B
{
 * *public:
 * *float bx;

 * *void method(A *x);
};

void main(){
}

должно работать

impersonalis 17.02.2006 18:22

Куда более интересно преобразование чисел в строку и обратно. Для этого юзаем фунЕции:
Код:

//целые числа
itoa(исходное_число,строка_приёмник,основание_системы);
x=atoi(строка_с_числом);
//дробные:
функции перевода в строку не нашёл
x=atof(строка_с_числом);

;
Эти функции хранятся в stdlib.h
Реализацию dtoa накодил кое-как сам (есть ещё один алгоритм, но он "таинственным" образом переполняет стек; вариант ниже более устойчив):
Код:

short get_byte(double x,int p,int R){
        x=fabs(x);
        int n=R-p+1;
        short a;
        if(p>0)
 *a=int((x-int(x/pow(10,n))*pow(10,n))/pow(10,n-1 ));
        else if(p<0)
 *a=int(x*pow(10,-p))%10;
        else
 *a=-1;
        return a;
}

short get_Rlen(double x){
        char a[20];
        itoa(x,a,10);
        return strlen(a)-(x<0?1:0);
}

void dtoa(double x,char t[],int z=10,int omega=5){
        short R=get_Rlen(x);
        char b[2];
        int i;
        int j=0;
        if(x<0){
 *x=fabs(x);
 *t[0]='-';
 *j++;
        }
        for(i=1;i<=R;i++){
 *short p=get_byte(x,i,R);
 *itoa(p,b,10);
 *b[1]=0;
 *t[j]=b[0];
 *j++;
        }
        t[j]='.';
        j++;
        for(i=-1;i>=-omega;i--){
 *short p=get_byte(x,i,R);
 *itoa(p,b,10);
 *b[1]=0;
 *t[j]=b[0];
 *j++;
        }
        t[j]=0;
}

void dtoa(double x,char t[],int z=10,int omega=5)
работает по аналогии со встроенными функциями:
x - входное_число
t - строка-приёмник
z - добавлено для совместимости ( так быстрее править код, к примеру itoa на dtoa)
omega- точность

Платон 17.02.2006 18:57

:blink:
Спасибо большое impersonalis :super:
Но я все равно в твоем коде неразберусь :??
У меня все попроще :))

impersonalis 17.02.2006 19:11

Всегда пожалуйста =)


Часовой пояс GMT +4, время: 03:29.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot