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 :

Calendrien grégorien ! programme qui affiche le jour pour une date donnée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Par défaut Calendrien grégorien ! programme qui affiche le jour pour une date donnée
    Bonjour à tous,
    voilà quelque temps que je bosse sur mon devoir qui me demande d'écrire un programme qui affiche le jour d'une date saisie par l'utilisateur.
    Alors là, j'ai réussi à écrire un petit truc qui fonctionne, mais avec énormément d'imperfections.
    J'ai utilisé la documentation du site "http://www.univ-rouen.fr/LMRS/Vulgar...rier/jour.html" pour écrire mon programme.
    Le truc qui me plais pas, est que le programme calcul quand même si la date saisie est fausse
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
        /*Déclaration des variables*/
        int j,jsauv,c,m,msauv,a,asauv,abi;
     
     
        //Saisie de la date par l'utilisateur
        printf("Veuillez saisir la date : le jour(jj), le mois(mm) et l'année(aaaa)\n");
     
     
     
        printf("\nVeuillez saisir le jour : ");
        scanf("%d",&j);
        while((j<1)||(j>31))
        jsauv=j;
        printf("\nVeuillez saisir le mois : ");
        scanf("%d",&m);
        while((m<1)||(m>12))
        msauv=m;
        printf("\nVeuillez saisir l'année : ");
        scanf("%d",&a);
        asauv=a;
        if(a%4==0||a%400==0)
        {
            printf("\n%d est une annee bissextile, Attention le mois de Février comporte 29 jours\n",asauv);
            abi=1;
        }
    		else
    		{
    			if(a%100 != 0)
    				printf("\n%d n'est pas une annee bissextile, Attention le mois de Février comporte 28 jours\n",asauv);
    				abi=0;
    		}
    		if((abi==1)&&(j>29))
     
            printf("\n ERREUR, cette date n'existe pas");
     
            else
            {
                if((abi=0)&&(j>28))
                printf("\n ERREUR, cette date n'existe pas");
     
            }
     
     
     
     
     
        c=(14-m)/12;
        a=a-c;
        m=m+12*c-2;
        //j = ( jour + a + a/4 - a/100 + a/400 + 31m/12 ) mod 7
     
        j=(j+a+a/4-a/100+a/400+((31*m)/12))%7;
        switch(j)
        {
            case 0:
            printf("le %d/%d/%d est un Dimanche",jsauv,msauv,asauv);
            break;
            case 1:
            printf("le %d/%d/%d est un Lundi",jsauv,msauv,asauv);
            break;
            case 2:
            printf("le %d/%d/%d est un Mardi",jsauv,msauv,asauv);
            break;
            case 3:
            printf("le %d/%d/%d est un Mercredi",jsauv,msauv,asauv);
            break;
            case 4:
            printf("le %d/%d/%d est un Jeudi",jsauv,msauv,asauv);
            break;
            case 5:
            printf("le %d/%d/%d est un Vendredi",jsauv,msauv,asauv);
            break;
            case 6:
            printf("le %d/%d/%d est un Samedi",jsauv,msauv,asauv);
            break;
     
        }
     
     
     
    }
    En gros j'aimerai épurer ce programme, et qu'il affiche juste le nécessaire, et aussi qu'il demande de ressaisir lorsqu'une donnée saisie est fausse.
    l'instruction "while" est-elle bien appropriée. Si c'est l'instruction appropriée, quelle est la syntaxe correct pour que ça redemande la saisie si l'entrée saisie est fausse.
    Et aussi il affiche n'importe quoi ! jsauv et msauv ont une valeur complètement loufoque?

    MERCI de l'aide que vous m'apporterez.

  2. #2
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 785
    Par défaut
    Bonsoir,

    Quelques rapides remarques:

    1) Le calendrier grégorien n'a été utilisé qu'à partir de 15 octobre 1582, il faudrait donc que la date fournie par l'utilisateur soit >= à celle-la, sinon tout calcul effectué sera faux.

    2) Lors de l'entrée des variables, si l'utilisateur donne, par exemple, un jour >31 ou <1, ton programme va boucler sur l'assignation jsauv=j ! Ceci est valable aussi pour le mois et l'année. Faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    do scanf("%d",&j);
    while((j<1)||(j>31));
    serait plus approprié.

    3) Tu ne vérifies pas dans ton programme que, pour le mois donné par l'utilisateur, le nombre de jours ne soit pas dépassé. Exemple: 31 jour pour avril. Il faudrait peut-être que tu déclares un tableau nombreDeJourParMois[12] et que tu fasses ce test.

    4) Même si tu détectes une erreur et que tu l'affiches, ton programme calcule un jour...

    Voilà déjà un petit aperçu.

    Cordialement,

    Edgar.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Par défaut
    Cool Merci Edgarjacobs, voilà déjà des pistes pour améliorer ce programme, y'a du boulot encore. Merci

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Ca, ça n'a pas trop de sens si a%400==0 est vrai, je vois mal comment a%4==0 pourrait être faux.
    De même dans le cas où cette condition est fausse tu teste si a%100 != 0 alors que ça ne peut être que vrai puisque un nombre divisible par cent est forcément divisible par 4.

    Petit rappel de la règle : bissextile si (a%4==0 && a%100 != 0) || a%400==0

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Par défaut
    Pourquoi y bug comme ça mon programme:
    déjà je comprend pas pourquoi l'instruction while ne fonctionne pas comme il faut. Ai-je commis une erreur dans la syntaxe ? Ensuite Quelle instruction existe pour renvoyer à la saisie d'une valeur si une erreur a été commise. Enfin pouvez m'aider à mettre les instructions dans un ordre peut être plus logique pour l'enchaînement des instructions. j'avais pensé à d'abord saisir l'année afin de déterminer si l'année est bissextile ou pas et donc inclure une condition supplémentaire si le jour saisie est le 28 ou 29 Février?

    Merci de votre aide , et passez tous une bonne soirée.
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
        /*Déclaration des variables*/
        int j,jsauv,c,m,msauv,a,asauv,abi;
     
     
        //Saisie de la date par l'utilisateur
        //15 octobre 1582
        printf("Veuillez saisir la date : le jour(jj), le mois(mm) et l'année(aaaa)\n");
     
     
        printf("\nVeuillez saisir le jour : ");
        scanf("%d",&j);
        while((j<1)||(j>31));
     
     
     
        printf("\nVeuillez saisir le mois : ");
        scanf("%d",&m);
        switch(m)
        {
            case 1:printf("Janvier 31 jours");
            break;
            case 2:printf("Février 28 jours ou 29 (si année bisextile) ");
            break;
            case 3:printf("Mars 31 jours");
            break;
            case 4:printf("Avril 30 jours");
            break;
            case 5:printf("Mai 31 jours");
            break;
            case 6:printf("Juin 30 jours");
            break;
            case 7:printf("Juillet 31 jours");
            break;
            case 8:printf("Août 31 jours");
            break;
            case 9:printf("Septembre 30 jours");
            break;
            case 10:printf("Octobre 31 jours");
            break;
            case 11:printf("Novembre 30 jours");
            break;
            case 12:printf("Décembre 31 jours");
            break;
        }
        while((m<1)||(m>12));
     
        printf("\nVeuillez saisir l'année : ");
        scanf("%d",&a);
     
        if((a%4==0 && a%100 != 0) || a%400==0)
        {
            printf("\n%d est une annee bissextile, Attention le mois de Février comporte 29 jours\n",asauv);
            abi=1;
        }
    		else
    		{
    			if(a%100 != 0)
    				printf("\n%d n'est pas une annee bissextile, Attention le mois de Février comporte 28 jours\n",asauv);
    				abi=0;
    		}
    		if((abi==1)&&(j>29)||(j<1))
     
            printf("\n ERREUR, cette date n'existe pas");
     
            else
            {
                if((abi=0)&&(j>28)||(j<1))
                printf("\n ERREUR, cette date n'existe pas");
     
            }
     
     
     
     
        jsauv=j;msauv=m;asauv=a;
        c=(14-m)/12;
        a=a-c;
        m=m+12*c-2;
        //j = ( jour + a + a/4 - a/100 + a/400 + 31m/12 ) mod 7
     
        j=(j+a+a/4-a/100+a/400+((31*m)/12))%7;
        switch(j)
        {
            case 0:
            printf("le %d/%d/%d est un Dimanche",jsauv,msauv,asauv);
            break;
            case 1:
            printf("le %d/%d/%d est un Lundi",jsauv,msauv,asauv);
            break;
            case 2:
            printf("le %d/%d/%d est un Mardi",jsauv,msauv,asauv);
            break;
            case 3:
            printf("le %d/%d/%d est un Mercredi",jsauv,msauv,asauv);
            break;
            case 4:
            printf("le %d/%d/%d est un Jeudi",jsauv,msauv,asauv);
            break;
            case 5:
            printf("le %d/%d/%d est un Vendredi",jsauv,msauv,asauv);
            break;
            case 6:
            printf("le %d/%d/%d est un Samedi",jsauv,msauv,asauv);
            break;
     
        }
     
     
     
    }

  6. #6
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 785
    Par défaut
    Pourquoi ne demandes-tu pas à l'utilisateur d'entrer une date sous forme d'un string (genre jj/mm/aaaa), que tu analyseras ensuite à ton aise? Tu pourras alors commencer par vérifier si l'année est bissextile ou non, pour ajuster le nombre de jours du mois de février, et ensuite tu pourras vérifier que le nombre de jours entré sois >0 et <=au nombre de jours du mois.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    début: entrée de la date
    si année<1582 -> erreur, on recommence au début
    si année bissextile, jour[février]=29 sinon jour[février]=28
    m=mois entré
    si m<1 ou m>12 -> erreur, on recommence au début
    si année=1582 et m<10 -> erreur, on recommence au début
    j=jour entré
    si j<1 ou j>jour[m] -> erreur, on recommence au début
    si année=1582 et m=10 et j<15 -> erreur, on recommence au début
    Tout est ok, on peut procéder au calcul du jour de la semaine
    Cela te permettra aussi d'afficher un message d'erreur pour chaque type de faute.

    Pour ce qui est du while, as-tu lu ma première réponse?

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Citation Envoyé par sk8trasher Voir le message
    Pourquoi y bug comme ça mon programme:
    déjà je comprend pas pourquoi l'instruction while ne fonctionne pas comme il faut. Ai-je commis une erreur dans la syntaxe ?
    Non, la syntaxe est parfaite
    tu lui dit de rien faire et il ne fait rien mais comme tu lui dit de ne rien faire tant que la valeur de "j" n'est pas entre 1 et 31 et que tu ne modifie pas la valeur de "j", il ne fait rien éternellement (enfin jusqu'à ce que tu l'arrêtes)

    Citation Envoyé par sk8trasher Voir le message
    Ensuite Quelle instruction existe pour renvoyer à la saisie d'une valeur si une erreur a été commise.
    Il n'y a pas vraiment d'instruction toute faite, mais c'est pas bien compliqué à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        while((j<1)||(j>31))
        {
          printf("\nSaisie impossible, veuillez resaisir le jour : ");
          scanf("%d",&j);
        }
    Citation Envoyé par sk8trasher Voir le message
    Enfin pouvez m'aider à mettre les instructions dans un ordre peut être plus logique pour l'enchaînement des instructions. j'avais pensé à d'abord saisir l'année afin de déterminer si l'année est bissextile ou pas et donc inclure une condition supplémentaire si le jour saisie est le 28 ou 29 Février?
    C'est sûr qu'avertir l'utilisateur du nombre de jours dans un mois alors qu'il a déjà tapé le jour du mois ça na pas grand intéret.
    Le post d'edgarjacobs devrait te fournir une bonne base de travail à ce sujet.

    Pour finir un petit conseil pour faire joli : évite de multiplier les "switch", par exemple si tu déclares
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* nomjour[]={"Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"};
    le dernier "switch" peut être remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("\nle %d/%d/%d est un %s",jsauv,msauv,asauv,nomjour[j]);

Discussions similaires

  1. [Turbo Pascal] Programme qui affiche le jour à partir d'une date
    Par rafikadel dans le forum Turbo Pascal
    Réponses: 22
    Dernier message: 27/03/2020, 19h33
  2. jour de la semaine pour une date donnée
    Par laurentSc dans le forum Langage
    Réponses: 2
    Dernier message: 17/03/2012, 23h58
  3. Réponses: 2
    Dernier message: 20/01/2009, 13h31
  4. fonction qui retourne le jour d'une date
    Par yucf_miagiste dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 24/08/2007, 08h41
  5. Réponses: 3
    Dernier message: 18/10/2005, 15h34

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