Generiques et integer

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 26 nov. 2007 à 15:32
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 26 nov. 2007 à 20:58
Bonjour

je suis nouveau dans le monde du C#, pardonnez mes hesitations sur l'objet, le .net et autres choses qui me sont etrangeres...

je parcourais les blogs hier soir, et je suis tombe sur un post traitant du type "prix" sur sql server, je me suis dit que ca allait etre mon prochain code C#, car : ca met en oeuvre les generics et les overloadings d'operateurs (entre autre), donc ca me ferait le plus grand bien...

en Cpp, les templates permettraient de passer le nombre de decimales :

Prix<2> a=4.05, b(4), c; c=a+b;
Prix<2>::symbole('$');

std::cout << a;

par exemple...

en C#, j'ai cru lire qu'on ne pouvait pas utiliser de nombres au travers des generics, (ca m'embete un peu pour passer le nombre de decimales)

Si vous avez une solution autre que : prendre une variable statique (si on traite deux unites a 1 ou 3 decimales ca peut poser probleme) ou une variable private (ca ferait carement trop lourd) ca m'interesse :)

/**
* @author coucou747 <coucou747@hotmail.com>
* @see irc://cominweb.uni-irc.net/#programmation
*/

6 réponses

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
26 nov. 2007 à 16:15
j'ai meme mieux que ca :

Prix<2, '$'> a=4.05, b(4), c; c=a+b;
std::cout << a;

/**
* @author coucou747 <coucou747@hotmail.com>
* @see irc://cominweb.uni-irc.net/#programmation
*/
0
Miltiades Messages postés 233 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 25 octobre 2010
26 nov. 2007 à 16:38
j'ai peur qu'il n'y ai rien pour forcer le nombre de decimal lors du calcul, par contre si c'est l'affichage au format monetaire qui t'interesse, regarde ca:

http://msdn2.microsoft.com/fr-fr/library/system.globalization.numberformatinfo_members(VS.80).aspx

ca devrait t'interesser

Nul ne devient grand par la guerre...
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
26 nov. 2007 à 18:31
>> en C#, j'ai cru lire qu'on ne pouvait pas utiliser de nombres au travers des generics

Qu'entends tu exactement par "utiliser des nombres au travers de generics" ? Ca fait longtemps que je n'ai pas touché au templates C++, mais de mémoire les genercis C# sont plutot équivalent (la syntaxe est juste "plus propre" à mon gout).

En C#, le type "Currency" n'existe pas de base, en général on utilise à la place le type Decimal - et peux tout a fait manipuler utilsier le type Decimal, Integer ou autre avec les generics (et pour l'affichage, tout est expliqué dans le lien ci dessus de Miltiades).

<hr size="2" width="100%" />
Working as designed
www.nikoui.fr
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
26 nov. 2007 à 18:40
un exemple faisable en Cpp et apparement impossible en C# :

template <class T, int N, int P>
class Matrice{

ici, je fais une class pour gerer uniquement des matrices de taille N,P

apres avoir tape plusieurs classes templates, j'arrive a :

Matrice<Fraction, 4,3> d;

et tu vois, je ne passe pas QUE des classes comme parametres a ma template... je peux aussi passer un nombre qui sera "substitue" lors de la compilation de la meme maniere...

Si t'as du mal a voir l'interet d'une telle classe pour les prix, je peux te taper rapidement un exemple en Cpp, tu verras le code est court :)

J'ai aucun projet a realiser, c'est pour ca que le lien de miltiades ne me sert pas, je voulais m'entrainer en C#, l'interet de se detacher du Cpp c'est d'avoir une plus grande souplesse, on perd alors en vitesse d'execution, cependant, ici, il semble qu'on perde aussi en souplesse (remarque, en java c'est pire...) je me demandais donc si il y avait moyen de faire differement, peut-etre sans utiliser les templates, mais pour arriver a un resultat equivalent...

/**
* @author coucou747 <coucou747@hotmail.com>
* @see irc://cominweb.uni-irc.net/#programmation
*/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
26 nov. 2007 à 19:01
En effet ce genre de chose n'est pour l'instant pas faisable en C#. Par contre, je veux bien un petit exemple pour voir dans quel cas ça peut être utile :)
(et eventuellement te proposer une alternative en C# si c'est possible...)

<hr size="2" width="100%" />
Working as designed
www.nikoui.fr
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
26 nov. 2007 à 20:58
#include

template
class Prix{
    public:
        Prix(){
            centimes=0;
        };
        Prix(double a){
            centimes=(int)(a*N);
        }
        Prix<N,S>(int a){
            centimes=a*N;
        }
        int getInt(){
            return centimes/N;
        }
        int getPartCentimes(){
            return centimes%N;
        }
        int getCentimes(){
            return centimes;
        }
        void setCentimes(int a){
            centimes=a;
        }
        Prix<N,S> operator+(Prix<N,S> a) const{
            Prix<N,S> b;
            b.setCentimes(centimes+a.getCentimes());
            return b;
        }
    private:
        int centimes;
};

template
std::ostream& operator<< (std::ostream& o, Prix<N, S> p){
    int a=p.getPartCentimes();
    o << p.getInt() << S << a;
    if (a<10){
        o<< 0;
    }
    return o;
}

int main(){
    Prix<100, '$'> a, b(0.4), c;
    Prix<100, 'e'> d(5);
    a=4;
    c=a+b;
    std::cout << "a=" << a << "\n";
    std::cout << "b=" << b << "\n";
    std::cout << "c=" << c << "\n";
    std::cout << "d=" << d << "\n";
    return 0;
}

genre ici par exemple, t'as pas la possibilite de faire d=a+b; c'est pas possible, et c'est tant mieux....

c'est ce genre de contraintes que je recherche...
/**
* @author coucou747 <coucou747@hotmail.com>
* @see irc://cominweb.uni-irc.net/#programmation
*/
0
Rejoignez-nous