IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Fonction sum sans opérateur[]


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Février 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Février 2017
    Messages : 2
    Par défaut Fonction sum sans opérateur[]
    Réécrire ce programme en utilisant au plus les
    nouvelles possibilités du C++. Réécrire la fonction sum sans utiliser l'opérateur [].
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #define MAX 10
    typedef struct Duree {
    unsigned int h;
    unsigned int m;
    } Duree;
    Duree 
    sum(Duree* x, int n){
    int i;
    unsigned int somme_h=0, somme_m=0;
    Duree d;
    for(i=0; i<n; i++) {
    somme_h+=x[i].h;
    somme_m+=x[i].m;
    }
    somme_h+=somme_m/60;
    somme_m%=60;
    d.h=somme_h;
    d.m=somme_m;
    return d;
    }
    void exercice3(){
    Duree d;
    Duree tab[MAX];
    d=sum
    (tab,5);
    }

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Bonjour

    À priori, il faudrait utiliser l'arithmétique des pointeurs.
    (En C++, on préfère utiliser std::array, std::vector et les algorithmes de la bibliothèque standard.)

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Bonjour kaoula ch
    A part recopier l'énoncé de ton exercice, pourrais-tu nous parler? Nous sommes des gens.

    Je t'invite à relire notre charte, que tu as acceptée en t'inscrivant. Notamment, l'article IV-N.

    Nous voulons bien t'aider à résoudre ton problème, mais quel est-il précisément?
    Que n'arrives-tu à faire?


    Je t'invite à relire ton cours, ou une documentation du langage.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Si, vraiment, l'idée est d'utiliser au mieux les possibilités du C++, je te conseillerais déjà de réécrire ta structure Durée, car la syntaxe que tu as utilisée est spécifique au C : en C++, le simple fait de définir un type défini par l'utilisation (class, struct, union, enum) suffit à faire connaitre le type en question par le compilateur : il n'y a donc plus besoin de ce fameux typedef struct {} nomAlias;.

    tu en profiterais sans doute pour rajouter l'opérateur += comme donnée membre de ta structure, histoire de pouvoir écrire un code proche de duree1+=duree2; // duree1 représente maintenant la somme de duree1 + duree2Cet opérateur n'est sans doute pas indispensable en lui-même, mais cela te permettra de "retomber" sur une implémentation classique de l'opérateur + (sans affectation).
    Au final, ta structure Duree et les deux opérateurs dont je vient de parler pourraient ressembler à quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    struct Duree{
        unsigned int h;   //NOTA: size_t aurait été sympa ici
        unsigned int m; // IDEM
        Duree & operator +=(Duree const & other){
            h+=other.h;
            m+= other.m; 
            if(m > 60){   //a priori, on n'arrivera jamais au delà de 120... à moins qu'on ait déjà fait une connerie en définissant une des deux durées
                ++h;
                m-=60;
            }
        }
    };
    Duree operator = (Duree const & a, Duree const & b){ //oui, je sais, a pourrait être transmis par valeur
        duree tmp{a}; // merci au compilateur de nous fournir un constructeur de copie sans qu'on ne lui demande rien
        tmp+=b;
        return tmp;
     
    }
    Une fois que ce sera fait, ce qui te fera vraiment passer à du C++, c'est d'utiliser les collections "qui vont bien", comme, par exemple, la classe std::vector qui est accessible par simple incluson du fichier d'en-tête <vector>.

    C'est une classe permettant de maintenir "n'importe quel nombre" d'éléments (dont le type est clairement défini) de manière contigüe en mémoire, un peu à l'instar de ton tab[MAX], mais avec la limite arbiraire de MAX en moins, et qui a, en plus, le bon gout de connaitre en permanence le nombre d'éléments qu'elle contient (en plus de s'occuper de gérer la mémoire nécessaire à au maintien de tous ses éléments de manière transparente pour toi).

    Cela te permettra en outre de virer cet odieux define MAX qui, non seulement ne rime à rien (il ne faut jamais placer de limites arbitraires), mais dont, en plus, la limite serait bien mieux définie sous la forme d'une énumération ou, mieux encore, sous la forme d'une constante globale constexpr.

    On en profiterait pour introduire les range based loops, qui sont apparues avec C++11, si bien que, dans un premier temps, ta fonction somme pourrait ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Duree somme(std::vector<Duree> const & tab){
        Duree temp{0,0};
        for(auto const & it : tab){
            temp+=it;
        }
        return it;
    }
    Mais il y aurait encore mieux à faire, car la somme de plusieurs éléments est un algorithme tellement utilisé qu'il est directement fourni par la bibliothèque standard. Nous pourrions donc remplacer notre boucle par l'utilisation de cet algorithme et donner à notre fonction la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Duree somme(std::vector<Duree> const & tab){
        Duree temp{0,0};
        return std::accumulate(tab.begin(),tab.end(),temp);
    }
    Et quand tu en sera venu là, tu pourras dire que ta fonction utilise effectivement les possibilités du C++

    NOTA: on pourrait, d'ailleurs, encore aller "un cran plus loin" en définissant cette fonction sous la forme d'une fonction template, histoire qu'elle puisse s'adapter au différents conteneurs proposés par la bibliothèque standard... Mais je vais déjà te laisser assimiler tout cela avant d'aller plus loin
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. pb avec la fonction sum!
    Par ber_jp dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 28/08/2004, 22h22
  2. Réponses: 4
    Dernier message: 02/06/2004, 16h35
  3. Fonction 'SUM'
    Par X-Deus dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/06/2003, 08h22
  4. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48
  5. [VBA-E] Fonction sum() dans une cellule
    Par Gonzo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/12/2002, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo