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 :

code pour donner le jour de la semaine


Sujet :

C

  1. #1
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut code pour donner le jour de la semaine
    Bonjour à tous

    Je dois créer un code qui à partir d'une date ( jour, mois et année )
    donnera le jour (lundi, mardi,etc...)
    selon une formule
    nb=((13m-1)/5)+(an/4)+(s/4)+j-(2s)
    sachant que sur les divisions, on ne garde que l'entier
    et que sur le résultat nb (je cite le texte de l'enoncé ) :
    on prend le reste de nb par la division entière par 7

    m=mois, j=jour, a=année, s= la centaine d'année et an = l'année dans le siècle


    Donc j'en suis à coder les conditions pour éviter de saisir une date erronée
    comme par exemple le 33/15/99, ou le 31/11/2000 puisqu'il ne peut y avoir certain nombre de jours ou de mois qui doivent être saisie.


    je code étape par étape et actuellement je bute sur les mois qui ne doivent pas dépasser 30 jours car la ligne "if (m=4 || m=6 || m=9 || m=11)" pointe une erreur


    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
     
    #include <stdio.h>
    #include<math.h>
     
    int j, m, a, s, an;
    int main(void)
     
    {
    printf ("saisir le jour, le mois et l'annee.\n");
    scanf ("%d %d %d",&j, &m, &a);
     
    /*verification de la validiter du mois*/
    if (m>12)
    {
        printf ("veuillez saisir un mois valide\n");
    }
        if (j>31)
    {
            printf("veuillez saisir un jour valide\n");
     }
    if (m=4 || m=6 || m=9 || m=11)
         if (j>30)
        {
            printf("veuillez saisir une date valide\n");
    }
     
        return 0;
    }

    merci pour votre aide

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    A == B ?

    Il ne te manquerait pas des accolades sur ce if() d'ailleurs ?

    Pense à mieux indenter ton code et évite les variables globales quand ce n'est pas nécessaire. Et pense à nous donner l'erreur donnée par ton compilateur, c'est plus pratique pour t'aider

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    C'est parce que l'expression m=2 est une affectation, qui change m, et qui vaut 2 en tant que valeur.
    La bonne solution, c'est d'utiliser la comparaison m==2Active plus de warnings dans ton compilateur, il pourras t'aider mieux ainsi.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    par curiosité j'ai testé ton algo DayOfWeek mais marche pas

    (si ça t'intéresse j'ai trouvé celui-ci sur le net, ouai je suis vraiment curieux)

    Sinon pour la validité de la date il va aussi falloir faire le calcul des années bissextiles.

    edit : à noter que dans ta formule (comme dans celle citée au-dessus) il n'y a aucune division par un param, du coup si l'utilisateur veut connaitre le jour de la semaine du 32/13 mille-neuf-cent-cinquante-douze, grand bien lui fasse de savoir que c'est un vendredi.
    Plus je connais de langages, plus j'aime le C.

  5. #5
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    Merci à tous

    l'erreur est :
    Ivalue required as left operand of assignment
    effectivement la solution est bien dans le m==
    ça fonctionne

    maintenant je vais poursuivre..
    si quelqu'un à une piste à me donner pour les année bissextile je suis preneur

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    le lien de jopopmk me semble une bonne piste

    Sauf cas extrèmes, que tu peux completement négliger, les années bissextiles sont multiples de 4, sauf les multiples de 100 qui ne sont pas multiples de 400.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    Super,

    tout fonctionne

    j'ai enfin intégrer la différence entre "=" et "=="

    merci.

    Par contre, comment puis je allèger ce code et le rendre moins redondant sur la partie des contrôles de date ?

    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
     
    #include <stdio.h>
    #include<math.h>
     
    int j, m, a, s, an,  nb;
     
    void erreur()
    {
    printf ("veuillez saisir une date valide\n");
    return 0;
    }
     
    int main(void)
    {
    printf ("saisir le jour, le mois et l'annee.\n");
    scanf ("%d %d %d",&j, &m, &a);
     
    /**********verification de la validiter du mois************/
    if (j==0 ||m==0 ||a==0 || m>12 || j>31 )
    {
    printf ("veuillez saisir une date valide\n");
    return 0;
    ;
    }
     
    /* si les mois de 30 jours sont respecté */
    if (m==4 || m==6 || m==9 || m==11)
        if (j>30)
        {
            printf("veuillez saisir une date valide\n");
            return 0;
        }
     
     
    /* si la règle des 28 jours de février et du 29  eme jours pour l'année bissextille est respecté */
    if(a % 4 == 0 || a % 400 == 0)
         if (m==2 && j>29  )
        {
            printf("veuillez saisir une date valide\n");
            return 0;
        }
    if(a % 4 != 0 || a % 400 != 0)
        if (m==2 && j>28)
        {
            printf("veuillez saisir une date valide\n");
            return 0;
        }
     
    /*****************************************************************/
     
    /*calcul de nb*/
     
    if (m>=3)
        m = -2;
    else
    {
        m += 10;
        a--;
    }
     
    printf ("le mois est %d\n", m);
    printf ("l'annee est %d\n", a);
     
    s=a/100;
     
     
    an=a%100;
     
     
     
     
     
    nb=(((13*m-1)/5)+(an/4)+(s/4)+an+j-(2*s));
     
     
    nb=nb%7;
     
    if(nb<0)
        nb+=7;
     
     
    /*****************************************/
    /*declaration du jour de la semaine*/
     
    switch (nb) {
    case 0:
        printf("le jour de la semaine est dimanche\n");
        break;
    case 1:
        printf("le jour de la semaine est lundi\n");
        break;
    case 2:
        printf("le jour de la semaine est mardi\n");
        break;
    case 3:
        printf("le jour de la semaine est mercredi\n");
        break;
    case 4:
        printf("le jour de la semaine est jeudi\n");
        break;
    case 5:
        printf("le jour de la semaine est vendredi\n");
        break;
    case 6:
        printf("le jour de la semaine est samedi\n");
        break;
    default:
        break;
    }
       return 0;
    }

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En prime abord, pas vraiment, quasiment chaque paire d'instruction fait quelque chose de vraiment différent.

    Par contre, tu peux faire des fonctions pour découper en petites actions, et surtout retirer ces affreuses variables globales.

    On ne déclare jamais une variable hors d'une fonction (main(), par exemple).


    ps: comme toujours, jamais signifie "tant que tu ne peux pas expliquer pourquoi tu ne peux pas faire autrement"
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  9. #9
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    Citation Envoyé par leternel Voir le message
    On ne déclare jamais une variable hors d'une fonction (main(), par exemple).
    et surtout retirer ces affreuses variables globales.
    Ok, j'ai donc fait ceci, tu noteras que j'ai modifié j par jour, etc...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int main(int jour, int mois, int annee, int siecle, int dizaineannee, int valeurjour )
    c'est bien cela que tu voulais dire ?



    Citation Envoyé par leternel Voir le message
    Par contre, tu peux faire des fonctions pour découper en petites actions,
    la je ne comprend pas trop...
    je me demandais s'il était possible de remplasser le repetitif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {
    printf ("veuillez saisir une date valide\n");
    return 0;
    }
    à chaque erreur par une fonction, mais je ne vois pas comment la codé

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int jour, int mois, int annee, int siecle, int dizaineannee, int valeurjour )
    Ceci n'est pas ce que je proposais, et n'est d'ailleurs pas valide.

    main n'a que deux signatures valides pour la norme:
    int main(void) et int main(int arg_count, char** arguments)Il y a trois grandes sortes de variables:
    • les variables locales, déclarées dans le corps d'une fonction. Ce sont tes amies.
    • les arguments d'une fonctions, qui sont un contrat d'utilisation. Ce sont aussi des amies, mais un peu plus subtile.
    • les (affreuses) variables globales, ainsi nommées parce qu'elles ne sont pas locales.


    Voici un exemple:
    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
    #include <stdio.h>
     
    int globale_pas_belle;
    const int globale_moins_moche = 2;//moins moche, car constante.
     
    //NOTE 1
    int fonction(int argument);
     
    int main() {
        int locale1 = 1;
        int locale2 = fonction(locale1); //NOTE 1
     
        printf("terminé");
        return 0;
    }
     
    //NOTE 3
    int fonction(int original) {
        int b = original * original;
        return b - globale_moins_moche;
    }
    Ce programme déclare et définit deux variables globales, dont l'une est constante. D'ailleurs, globale_pas_belle n'est pas initialisée explicitement, ce qui n'est normalement pas bon signe.

    Puis vient la déclaration d'une fonction nommée "fonction" (vois comme le ; termine la déclaration). La variable argument définit un paramètre, qui devra être fourni.
    NOTE 1: le nom d'un argument n'a aucune valeur dans la déclaration d'une fonction. Il peut même être omis, si on veut.

    Vient ensuite la définition de la fonction main. Elle définit deux variables locales.
    NOTE 2: ceci est un appel de fonction, je ne t'apprends rien, normalement.
    Par contre, la subtilité, c'est que la valeur de locale2 est copiée pour être passée en paramètre (par valeur, donc).

    Après main vient la définition de la fonction "fonction".
    J'ai volontairement donné à l'argument un autre nom que dans la déclaration, pour te montrer que c'est possible. Il est assez rare de le faire.
    Elle déclare aussi une variable locale.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  11. #11
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    Merci,

    je saisie mieux pour les variables à ne pas indiquer en global.

    Reste les fonction que j'ai plus de mal à comprendre mais avec un peu de pratique...

  12. #12
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Une fonction c'est jamais qu'un bloc de code exécuté à la demande.
    l'avantage, c'est qu'un appel de fonction est une expression.

    Soit la fonction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int fonction(int original, int delta) {
        delta = delta+1;
        int b = original * original;
        return b - delta;
    }
    Supposons le programme suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main() {
        int alpha = 1;
        int beta = 2;
        printf("fonction(%d, %d) = %d", alpha, beta, fonction(alpha, beta) ) ;
    }
    Tout ce passe comme si le code écrit était
    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
    int main() {
        int alpha = 1;
        int beta = 2;
        //évaluation de "fonction(alpha, beta)"
        int __temp__;//préparation d'une case mémoire pour le résultat
        {
            //copie des arguments
            int original = alpha;
            int delta = beta;
            //corps de la fonction
            delta = delta+1;
            int b = original * original;
            __temp__ = b - delta;
        }
        //comme on sort de la fonction, toutes les variables intermédiaires disparaissent.
     
        printf("fonction(%d, %d) = %d", alpha, beta, __temp__ ) ;
    }
    En pratique, une fonction permet deux choses:
    1. nommer un bloc de code
    2. ne pas le recopier, tout en l'adaptant au besoin

    Cela rend le code plus clair, et plus concis.

    En fait dans ton code, tu déclares une fonction erreur(), mais tu ne l'utilise pas.
    C'est dommage. (d'ailleurs, tu devrais la nommer erreur_annee_invalide() ou annee_invalide() )
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  13. #13
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    encore merci
    tout cela mais bien utile

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Formule pour afficher le jour de la semaine
    Par moilou2 dans le forum Excel
    Réponses: 9
    Dernier message: 18/08/2017, 18h26
  2. Beug dans un code pour une mise à jour
    Par herroP dans le forum VB.NET
    Réponses: 5
    Dernier message: 23/05/2012, 19h26
  3. Code pour mettre a jour un sous-formulaire
    Par nianko dans le forum Access
    Réponses: 1
    Dernier message: 07/10/2010, 13h08
  4. code pour date du jour
    Par NicolasMO dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 04/09/2009, 20h15
  5. Réponses: 7
    Dernier message: 01/12/2007, 02h23

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