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 :

calcul d'heures et minutes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 29
    Par défaut calcul d'heures et minutes
    Bonjour, alors je voulais coder un programme avec des sous programmes qui calcule l'écart entre heure de début et heure de la fin en se servant de sous programme. Sauf que voilà je ne sais pas pourquoi il ne calcule pas correctement l'écart. Et aussi quand j'e=écris une heure de début supérieure à l'heure de la fin il m'affiche un message d'erreur (que j'ai codé) mais il me calcule tout de même après l'écart et bien sûr le calcul est faux.
    voilà le code
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include <stdio.h>
    #include <stdlib.h>
     
    int calculminute (int* m1, int* m2)
    {
        int minutes, heures;
        if (*m1<*m2)
            minutes=*m2-*m1;
            else minutes=(60-*m1)+*m2;
            return minutes;
    }
     
        int calculheure (int* h1, int* h2,int* m1, int* m2)
        {
            int heures;
            if (*m1<*m2)
            heures=*h2-*h1;
            else
            heures=(*h2-*h1)-1;
            return heures;
        }
     
    int main()
    {
     int min1, min2, heu1,heu2, heure, minute;
     printf("entrez heure de debut\n")   ;
     scanf("%d", &heu1);
     printf("\nentrez minute de debut");
     scanf("%d", &min1);
     printf("\nentrez heure de fin\n");
     scanf("%d", &heu2);
     printf("\nentrez minute de fin\n");
     scanf("%d", &min2);
     if (heu1>heu2)
     printf("Lheure de la fin doit etre superierure a lheure du debut");
     else
     {
     minute=calculminute(&min1,&min2);
     heure=calculheure(&min1,&min2,&heu1,&heu2);
     }
     printf("l'ecart entre heure de debut et heure de fin est de %d heure et %d minutes", heure, minute);
     return 0;
    }
    bien évidemment j'en mets des pointeurs partout, mais c'est parce que je ne comprends encore pas ce chapitre donc j'essaie de comprendre leur utilité et comment ils fonctionnement à fur et à mesure des exo.
    Merci

  2. #2
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Bonsoir,

    Losque vous utilisez calcul_heure() vous inversez les minutes et les heures, d'après le prototype de votre fonction, vous devez donner d'abord les heures.
    Ensuite les pointeurs sont utiles lorsqu'on veut modifier la valeur d'une variable par une fonction.
    Par exemple la fonction echange(a,b) doit pouvoir modifier la valeurs de ces paramètres, c'est pour cela qu'on passe des pointeurs à la fonction.
    Enfin vérifier votre condition sur la superiorite du temps 1 sur le temps 2.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zolafencer Voir le message
    bien évidemment j'en mets des pointeurs partout, mais c'est parce que je ne comprends encore pas ce chapitre donc j'essaie de comprendre leur utilité et comment ils fonctionnement à fur et à mesure des exo.
    On t'a déjà expliqué qu'un pointeur ne se justifiait que si la fonction doit modifier le contenu de la variable qu'on veut lui passer.
    Accessoirement, on utilise aussi un pointeur quand on manipule de gros éléments (tableaux, structures) car il est plus rapide de recopier l'adresse d'un gros truc que le gros truc lui-même...

    Citation Envoyé par zolafencer Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int calculminute (int* m1, int* m2)
    {
        int minutes, heures;
        if (*m1<*m2)
            minutes=*m2-*m1;
            else minutes=(60-*m1)+*m2;
            return minutes;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int calculminute1 (int m1, int m2)
    {
        return m2 - m1 + (m2 < m1 ?60 :0);
    }
    int calculminute2 (int m1, int m2)
    {
        return m2 < m1 ?m2 - m1 + 60 :m2 - m1;
    }
    int calculminute3 (int m1, int m2)
    {
        return (m2 - m1 + 60) % 60;
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre très actif
    Inscrit en
    Septembre 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 246
    Par défaut
    voici ma solution

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    void CalculEcart(int* H1, int* H2, int* M1, int* M2)
    {
        int ecart,heure,minute;
        ecart = (*H2*60 + *M2) - (*H1*60 + *M1);
     
        if(ecart > 60)
        {
            heure = *H2 - *H1;
            minute = ecart % 60;
        }
        else
        {
            heure = 0;
            minute = ecart;
        }
        printf("l'ecart entre heure de debut et heure de fin est de %d heure et %d minutes", heure, minute);
    }
     
     
    int main()
    {
     int min1, min2, heu1,heu2, heure, minute;
     printf("entrez heure de debut\n")   ;
     scanf("%d", &heu1);
     printf("\nentrez minute de debut\n");
     scanf("%d", &min1);
     printf("\nentrez heure de fin\n");
     scanf("%d", &heu2);
     printf("\nentrez minute de fin\n");
     scanf("%d", &min2);
     if ((heu2*60 + min2) - (heu1*60 + min1)>0)
     {
        CalculEcart(&heu1,&heu2,&min1,&min2);
     }
     else
     {
         printf("L'heure de la fin doit etre superierure a lheure du debut");
     }
     
     return 0;
    }

  5. #5
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Si cela peut t'aider j'avais une fonction pour formater un temps en secondes en jour heure minute seconde

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void displayTime( unsigned int *days, unsigned int *hours, unsigned int *minutes, unsigned int *secondes )
    {
        printf(" Temps formaté : %2ij %2ih %2im %2is", *days, *hours, *minutes, *secondes);
    }
     
    void formatTime( float time, unsigned int *days, unsigned int *hours, unsigned int *minutes, unsigned int *secondes )
    {
        *days     = (unsigned int)(time/86400);
        *hours    = (unsigned int)((time-*days*86000)/3600);
        *minutes  = (unsigned int)((time-*days*86000-*hours*3600)/60);
        *secondes = (unsigned int)(time-*days*86000-*hours*3600-*minutes*60);
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 29
    Par défaut
    @ Sve@r regarde mon code marche même si je mets des pointeurs, c'est pour ça je comprends toujours pas la différence et l'utilité entre avec et sans pointeurs.
    j'ai corrigé mon code tout en laissant le pointeur et il marche parfaitement.
    #include <stdio.h>
    #include <stdlib.h>

    int calculminute (int* m1, int* m2)
    {
    int minutes, heures;
    if (*m1<*m2)
    minutes=*m2-*m1;
    else minutes=(60-*m1)+*m2;
    return minutes;
    }

    int calculheure (int* h1, int* h2,int* m1, int* m2)
    {
    int heures;
    if (*m1<*m2)
    heures=*h2-*h1;
    else
    heures=(*h2-*h1)-1;
    return heures;
    }

    int main()
    {
    int min1, min2, heu1,heu2, heure, minute;
    printf("entrez heure de debut\n") ;
    scanf("%d", &heu1);
    printf("\nentrez minute de debut");
    scanf("%d", &min1);
    printf("\nentrez heure de fin\n");
    scanf("%d", &heu2);
    printf("\nentrez minute de fin\n");
    scanf("%d", &min2);
    if (heu1>heu2)
    {

    printf("Lheure de la fin doit etre superierure a lheure du debut");
    return 0;
    }
    else
    {
    minute=calculminute(&min1,&min2);
    heure=calculheure(&heu1,&heu2,&min1,&min2);
    }
    printf("l'ecart entre heure de debut et heure de fin est de %d heure et %d minutes", heure, minute);

    return 0;
    }
    après j'ai enlevé les pointeurs ça a marché aussi!!!

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zolafencer Voir le message
    @ Sve@r regarde mon code marche même si je mets des pointeurs, c'est pour ça je comprends toujours pas la différence et l'utilité entre avec et sans pointeurs.
    j'ai corrigé mon code tout en laissant le pointeur et il marche parfaitement.
    Alors déjà j'ai dit que les pointeurs étaient nécessaires dans tel ou tel cas. Mais cela n'interdit pas de les utiliser même si ce n'est pas nécessaire. Toutefois, je suis dubitatif quand tu dis que ton code marche "parfaitement"...

    Regarde cet exemple pris à partir de ta fonction "calculminute" mais sans pointeur
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int calculminute (int m1, int m2)
    {
        int minutes;
        if (m1<m2)
            minutes=m2-m1;
        else
            minutes=60-m1+m2;
        return minutes;
    }

    Et maintenant, je l'appelle le plus simplement du monde
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main()
    {
        printf("Le calcul entre 30 et 45 donne %d\n", calculminute(30, 45));
    }

    Et maintenant, prenons ta fonction telle quelle
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int calculminute (int *m1, int *m2)
    {
        int minutes;
        if (*m1<*m2)
            minutes=*m2-*m1;
        else
            minutes=60-*m1+*m2;
        return minutes;
    }
    Tu veux m'expliquer comment je fais pour appeler ta fonction avec mes valeurs 30 et 45 ???
    Hé oui, un pointeur se justifie si on a besoin que la fonction modifie des variables ce qui présuppose alors qu'on a au-moins des variables...

    Citation Envoyé par zolafencer Voir le message
    après j'ai enlevé les pointeurs ça a marché aussi!!!
    Oui, mais en dehors de mon exemple où tu te retrouves bien bloqué (te voilà obligé de créer deux variables uniquement pour pouvoir utiliser leurs adresses), c'est dangereux de passer par des pointeurs quand c'est inutile

    Regarde ces deux exemples

    Le premier, qui fait un calcul simple en passant par une copie du contenu de la variable
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int calcul(int x)
    {
        x=x+1;
        return x;
    }
     
    int main()
    {
        int var=10;
        printf("Ma variable vaut %d et le calcul donne %d\n", var, calcul(var));
        printf("Again: Ma variable vaut %d\n", var);
    }


    Et celui-ci, qui passe par une copie de l'adresse de la variable
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int calcul(int *pt)
    {
        *pt=*pt+1;
        return *pt;
    }
     
    int main()
    {
        int var=10;
        printf("Ma variable vaut %d et le calcul donne %d\n", var, calcul(&var));
        printf("Again: Ma variable vaut %d\n", var);
    }
    Dans les deux cas t'as modifié l'élément reçu (pour un besoin qui t'es propre et qu'on n'a pas à juger). Dans le premier, tu ne modifies que la copie qui peut alors devenir variable de travail mais la variable d'origine reste intègre.
    Dans le second cas, ben t'as modifié la variable d'origine. Etait-ce voulu ? C'est ce qu'on nomme un "effet de bord"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [AC-97] calcul d'heures en minutes
    Par yatmen dans le forum IHM
    Réponses: 3
    Dernier message: 14/02/2010, 08h00
  2. Conversion des heures en minutes
    Par lacrevette dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/02/2005, 17h50
  3. Probleme comparaison heure et minutes
    Par innosang dans le forum Bases de données
    Réponses: 5
    Dernier message: 13/05/2004, 08h40
  4. recuperer heure et minute de datetime
    Par nora_ora dans le forum Langage SQL
    Réponses: 4
    Dernier message: 08/10/2003, 12h47

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