C - TP Jour de la semaine

a marqué ce sujet comme résolu.

Bonjour !

Après avoir suivi le cours d’OpenClassroom je me suis mis au cours de zestes de savoir pour me perfectionner étant donner que celui d’OC date un peu. Actuellement, je refais les TP pour apprendre les nouvelles notions ou approfondissements que propose ce site. J’essaye de faire le Tp Jour de la semaine (https://zestedesavoir.com/tutoriels/755/le-langage-c-1/1042_les-bases-du-langage-c/5023_tp-determiner-le-jour-de-la-semaine/#1-objectif) , je suis à la 2éme étape mais mon programme ne m’affiche des fois pas la bonne date … Comment faire ? Mon code :

  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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]) {

    unsigned date = 0 ;
    unsigned mois = 0 ;

    int nbrMSeparateToJan = 0 ;
    int numJour = 0 ;

    static const char lundi[9] = "Lundi", mardi[9] = "Mardi", mercredi[9] = "Mercredi", jeudi[9] = "Jeudi", vendredi[9] = "Vendredi", samedi[9] = "Samedi", dimanche[9] = "Dimanche" ;

    do {

        printf ("\n\nEntrez une date (jj/m) : \n") ;

        scanf ("%u/%u", &date, &mois) ;

        if (date > 31) {

        printf ("\nUn mois ne peux pas faire plus de 31 jours !") ;

        }

        if (mois > 12 || mois < 1) printf ("\nIl y a 12 mois dans une année !") ;

    } while (date > 31 && mois > 12 || mois < 1) ;

        switch (mois) { 

            case 1 : 

            nbrMSeparateToJan = 31 ;

            break ;

            case 2 :

            nbrMSeparateToJan = 28 * 2 ; 

            break ;

            case 3 : 

            nbrMSeparateToJan = 31 * 3 ;

            break ;

            case 4 :

            nbrMSeparateToJan = 30 * 4 ;

            break ;

            case 5 :

            nbrMSeparateToJan = 31 * 5 ;

            break ;

            case 6 :

            nbrMSeparateToJan = 30 * 6 ;

            break ;

            case 7 : 

            nbrMSeparateToJan = 31 * 7 ;

            break ;

            case 8 :

            nbrMSeparateToJan = 31 * 8 ;

            break ;

            case 9 :

            nbrMSeparateToJan = 30 * 9 ;

            break ;

            case 10 :

            nbrMSeparateToJan = 31 * 10 ;

            break ;

            case 11 :

            nbrMSeparateToJan = 30 * 11 ;

            break ;

            case 12 :

            nbrMSeparateToJan = 31 * 12 ;

            break ;

        }

    if (mois > 2) nbrMSeparateToJan = nbrMSeparateToJan - 3 ;

    numJour = (nbrMSeparateToJan + (date - 1)) % 7 ;

    switch (numJour) {

        case 0 :

        printf ("\nC'est un %s ! \n\n", samedi) ;

        break ;

        case 1 :

        printf ("\nC'est un %s ! \n\n", dimanche) ;

        break ;

        case 2 :

        printf ("\nC'est un %s ! \n\n", lundi) ;

        break ;

        case 3 :

        printf ("\nC'est un %s ! \n\n", mardi) ;

        break ;

        case 4 :

        printf ("\nC'est un %s ! \n\n", mercredi) ;

        break ;

        case 5 :

        printf ("\nC'est un %s ! \n\n", jeudi) ;

        break ;

        case 6 :

        printf ("\nC'est un %s ! \n\n", vendredi) ;

        break ;

    }

   return 0 ;

}

Cordialement et Merci d’avance !

+0 -0

Hum, je pense que tu n’y es pas.

L’idée ici est d’utiliser des tableaux afin d’éviter les répétitions.

Par exemple le tableau :

1
   char* jours[] = {"Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"};

Puis ensuite :

1
    printf("Ce jour est un %s", jours[i]); // Avec i de 0 à 6

Pareil pour les jours de chaque mois, un tableau avec [31,30, …].

+2 -0

D’après ton instruction :

1
numJour = (nbrMSeparateToJan + (date - 1)) % 7 ;

J’en déduis que nbrMSeparateToJan est censé contenir le nombre de jours entre le 1er janvier et le 1er du mois choisi, c’est ça ?

Parce que si c’est ça, d’une part la valeur affectée à cette variable est incorrecte. Pourquoi multiplier le nombre de jours du mois par le numéro du mois ? Ca n’est pas la bonne formule. Par ex si tu prends le mois de mars tu donnes 28*2 = 56 alors qu’en vrai c’est 31+28 soit 59 : il faudrait plutôt ajouter le nombre de jours de chaque mois précédant le mois choisi. Tu peux faire une fonction pour le calculer, ou bien hardcoder les valeurs associées à chaque mois. Et pourquoi enlever 3 jours si le mois > 2 ? Peut-être que je n’ai pas compris ce que nbrMSeparateToJan est censé contenir, le nom de la variable porte un peu à confusion, M pour mois alors que c’est des jours (si c’est effectivement des jours) ? ^^

D’autre part, si nbrMSeparateToJan contient le nombre de jours depuis le 1er janvier, le switch final est aussi incorrect, non ? Si ton modulo 7 vaut 0, ça signifie que la date saisie est le même jour de la semaine que le 1er janvier. D’après ton code ça implique que le 1er janvier est un samedi, or cette année c’est un dimanche.

Salut !

Tu as bien compris la fonction de la variable, je pense que mon erreur est ma multiplication à la place de l’addition le -3 c’est pour enlever les jours en trop de février mais j’ai l’impression qu’il doit manquer quelque chose… Après pour le reste je verrais après ta confirmation si du coup c’est bon avec mes explications et après correction des autres erreurs si il y en a

J’ai compris ta manière de faire, avec la multiplication et le -3. Tu peux le faire comme ça, tu dois aussi prendre en compte qu’il y a des mois de 30 et des mois de 31 jours. Du coup il faudrait faire quelque chose du style soustraire le nombre de mois divisé par deux. Genre si t’es en juillet il y a six mois avant, donc trois mois de 30 jours seulement donc tu enlèves trois jours, ainsi que 3 pour février. Mais c’est compliqué. Tu vas te heurter au problème de l’irrégularité juillet-août, enfin bref… J’ai pigé ton raisonnement, mais c’est vraiment plus simple de faire des additions. ;) Et comme l’a dit ache, essaye au maximum de rassembler des données dans des tableaux, typiquement le nombre de jours pour chaque mois, ça te permettra de faire ce que tu veux en très peu de lignes de code.

Salut,

@Jupiter41 : je vois que tu emploies les tableaux et les boucles dans ton exemple. En soit, cela n’est pas un problème, mais tu t’ajoutes une difficulté non nécessaire pour réaliser ce TP. En effet, il a été pensé pour être réalisé à l’aide des notions présentées jusque là et tout particulièrement les conditions et les sélections.

Si tu as un peu de mal à ce stade, je t’invite donc à te restreindre à ces notions et à ne pas hésiter à consulter les corrections à chaque étape du TP. ;)

@ache et @Society: juste pour dire, à ce stade du cours, ni les tableaux, ni les fonctions, ni les boucles n’ont été présentées. En soit, comme je l’ai dit, il n’y a rien de gênant à les employer, mais ce n’est pas l’objectif premier de ce TP.

+1 -0

Sans boucle et sans tableau … (҂⌣̀_⌣́)",

Le seul moyen de faire un truc à peu près propre c’est d’enchainer les "case" en cascade (sans break) pour sommer les jours …).

Et pour vérifier la validité de l’entrée, je ne vois rien de mieux que à très peu près la même chose mais avec des break. ¯_(ツ)_/¯

+1 -0

Sans boucle et sans tableau … (҂⌣̀_⌣́)"

ache

Bah faut bien faire des TPs avec ce qu’on a vu jusque là. :p

Le seul moyen de faire un truc à peu près propre c’est d’enchainer les "case" en cascade (sans break) pour sommer les jours …).

ache

En effet et c’est ce qui est proposé dans le TP. ;)

Et pour vérifier la validité de l’entrée, je ne vois rien de mieux que à très peu près la même chose mais avec des break. ¯_(ツ)_/¯

ache

Les vérifications ne sont expliquées et employées qu’à partir de la fin de la première partie (chaque chose en son temps ^^ ).

+0 -0

Ok, sans boucle et sans tableau effectivement il faut faire un switch pour gérer les mois, et un switch pour afficher le jour de la semaine.

Effectivement dans le premier switch on peut omettre les breaks pour taper un peu moins de code, mais on peut aussi faire avec. :)

Merci beaucoup pour vos réponse ! Je vais surement sauter ce tp du coup vu que je mélange les notions "simples" apprise avant le TP avec les notions en plus que j’ai ^^. Je le referrais surement à la fin pour faire un code assez court avec des tableaux etc…

Je vais surement sauter ce tp du coup vu que je mélange les notions "simples" apprise avant le TP avec les notions en plus que j’ai ^^.

Jupiter41

J’aurais plutôt tendance à te conseiller de le réaliser en employant uniquement les notions présentées jusque là dans le cours, mais c’est comme tu le sens.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte