begin process at 2012 05 29 08:56:38
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Héritage


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Héritage

dimanche 9 août 2009 à 14:36:11 | Héritage

laurentdav

Bonjour,

Je définis une classe normale héritée de la classe uniforme (méthode de Box-Muller).
J'ai un message d'erreur à la fin que je ne comprends pas:

ex2.cpp:183: error: new types may not be defined in a return type
ex2.cpp:183: note: (perhaps a semicolon is missing after the definition of 'Normale')
ex2.cpp:183: error: return type specification for constructor invalid

Le code est le suivant:



Code C/C++ :
#include <fstream>


#include <iostream>

#include <cstdlib>

#include <cmath>

using namespace std;


class Uniforme

{

friend ostream& operator<<(ostream& os, const Uniforme& uniforme);


public:


Uniforme();

Uniforme(const int nomb);

Uniforme(const Uniforme& uniforme);


virtual ~Uniforme();

void get_MomentsUpTo2();

void Sauve();


int _nombre;

double * _var;
};



Uniforme::Uniforme()

: _nombre(0), _var(new double[1])

{

_var[0] = 0;

}



Uniforme::Uniforme(const int nomb):_nombre(nomb),_var(new double[nomb])

{


for (int k=0;k<_nombre;k++)
{

double tir = drand48();

_var[k] = tir;
}

}



Uniforme::Uniforme(const Uniforme& uniforme)

{


_nombre = uniforme._nombre;

_var = new double[_nombre];

for (int i=0;i<_nombre;i++)


_var[i] = uniforme._var[i];

}



Uniforme::~Uniforme()

{

delete [] _var;

}


ostream&

operator<<(ostream& os, const Uniforme& uniforme)

{
for (int i=0;i<uniforme._nombre;i++)


os << uniforme._var[i]<<endl;

return os;

}

void Uniforme::Sauve()

{

ofstream fic("result.dat");

for (int i=0;i<_nombre;i++)


fic << _var[i]<<endl;


}


void Uniforme::get_MomentsUpTo2()

{
double m=0.;
double variance=0.;

for (int i=0;i<_nombre;i++)
{
m+=_var[i];
variance+=_var[i]*_var[i];
}


m=m/_nombre;
variance=1./(_nombre)*variance - ( double (_nombre)/(_nombre - 1))*m*m;

cout<<"La moyenne est: "<<m<<endl;
cout<<"La variance est: "<<variance<<endl;




}


class Normale : private Uniforme

{

public:


Normale();

Normale(const int nomb, const double m, const double sig);

Normale(const Normale& normale);

virtual ~Normale();


void get_momentsUpTo2();

private:

double * _nvar;
int _nnombre;
double _moyenne;
double _sigma;

}


Normale::Normale()

: _nnombre(0),_moyenne(0),_sigma(0), _nvar(new double[1]),Uniforme()

{

_nvar[0] = 0;

}



Normale::Normale(const int nomb, const double m, const double sig):_nnombre(nomb),_moyenne(m),_sigma(sig),_nvar(new double[nomb]),Uniforme(nomb)

{

if (!(_nnombre%2)) // Si _nnombre est pair
{
for(int i=0;i<_nnombre;i+2)
{ double Z1=sqrt(-2*log(_var[i]))*cos(2*M_PI*_var[i+1]);
double Z2=sqrt(-2*log(_var[i]))*sin(2*M_PI*_var[i+1]);
_nvar[i]=_sigma *Z1+_moyenne;
_nvar[i+1]=_sigma *Z2+_moyenne;

}

}

else //Si _nnombre est impair

for(int k=0;k<_nnombre - 2;k+2)
{ double Z1=sqrt(-2*log(_var[k]))*cos(2*M_PI*_var[k+1]);
double Z2=sqrt(-2*log(_var[k]))*sin(2*M_PI*_var[k+1]);
_nvar[k]=_sigma *Z1+_moyenne;
_nvar[k+1]=_sigma *Z2+_moyenne;

}





}



Normale::Normale(const Normale& normale)

{


_nnombre = normale._nnombre;

_nvar = new double[_nnombre];

_moyenne=normale._moyenne;

_sigma=normale._sigma;


for (int i=0;i<_nnombre;i++)


_nvar[i] = normale._nvar[i];

}


void Normale::get_momentsUpTo2()

{
double m=0.;
double variance=0.;

for (int i=0;i<_nnombre;i++)
{
m+=_nvar[i];
variance+=_nvar[i]*_nvar[i];
}


m=m/_nnombre;
variance=1./(_nnombre)*variance - ( double (_nnombre)/(_nnombre - 1))*m*m;

cout<<"La moyenne est: "<<m<<endl;
cout<<"La variance est: "<<variance<<endl;




}




Normale::~Normale()

{

delete [] _nvar;

}



int main()

{

srand48(103);


Uniforme u1(10000.);

cout<<u1;

u1.get_MomentsUpTo2();

Normale n1(10000.,0,1);

n1.get_momentsUpTo2();


return 0;

}


Je vous remercie par avance.

dimanche 9 août 2009 à 15:16:16 | Re : Héritage

laurentdav

Il manquait un ; après la définition de la loi Normale. Cependant, mon code ne fonctionne pas.
Si quelqu'un a une idée...Je le remercie par avance.

dimanche 9 août 2009 à 15:25:46 | Re : Héritage

juju12

ex2.cpp:183: note: (perhaps a semicolon is missing after the definition of 'Normale')

ca aide de lire les messages d'erreurs en entier, je t'assure...



Je remarque ceci, dans la méthode de tirage de la VA :

for(int i=0;i<_nnombre;i+2)
i+2 ne fait rien du tout, remplace par i+=2;

de même en-dessous.


Sinon, je ne vois pas trop l'intérêt de faire hériter Normale de Uniforme; ce sont deux lois différentes. Bien sûr, ça t'évite de recoder la méthode de tirage uniforme (encore que tu pouvais le faire dans une fonction annexe), mais niveau exécution bof bof... Enfin, tu fais comme tu veux.



Cette discussion est classée dans : var, double, normale, uniforme, nnombre


Répondre à ce message

Sujets en rapport avec ce message

Pointeur et référence [ par kawazaki ] Bonjour je commence a programmer en c++ je voudrais comprendre quand j'utilise les pointeurs et les références ainsi que les déclarations:*var**var&va long double et VC++ [ par omi ] J'ai un leger probleme avec visual C++ 7.0 .N'y a t'il pas un moyen de lui faire accepter les long double car il les prend pour des double normaux cad Affichage décimal [ par couriousous ] Hello!Comment afficher une variable long double avec toutes ses décimales SANS la convertire au format double (perte de précision)???Merci! CONVERSION DOUBLE CHAR [ par DeAtHCrAsH ] Salut,J'ai un ptit pb... Je suis debutant et j'ai un ptit prob...Je veux utiliser la fonction atof mais quand je compile ca me dit : undeclared identi conversion double en string [ par bouba ] Bonjour, je réalise une fonction qui doit calculer le nombre de caractères d'un doubleexemple:-7.56 -> 5 caractèreExiste t'il une fonction qui fasse c PROBLEME DE CONCATENATION [ par 24Karas ] PROBLEME DE CONCATENATION------------------------probleme :Je veux concaténer 2 chaines mais ça foireà l'exécution. Si vous savez pourquoi dîtes le mo PB valeur maximale variables [ par chmod777 ] voila, j'ai une boucle for qui doit se terminer lorsque la variable compteur atteint 208.827.064.576 le probleme c'est qu'avec une variable de type in double pointeur, récursivité dans les arbres binaires ordonnés [ par alfred289 ] float-->char* ou double-->char* [ par tavernier ] Help !Comment puis-je faire pour transformer mon float, ou mon double en char * ?Merci d'avanceJulien (Militant 4NT! M!Cr0$0FT depuis toujours!) double --> char[] [ par coockiesch ] Hello.Je cherche à passer un double dans une chaine de caractères. J'au utilisé "sprintf(char[], "%f", double)" mais elle ne revoie pas toutes les déc


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,608 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales