Coincé au TP n°1

Le problème exposé dans ce sujet a été résolu.

En effet, j’ai étrangement l’impression de confondre le mois présent et le mois passé.

Voici un code fonctionnel :

  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
#include <stdio.h>
#include <stdbool.h>

int main (void)
{
    unsigned jour, mois, annee;
    int nb_jours;
    bool bis_1, bis_2;
    
    printf("Entrez une date (jj/mm/aaaa) : ");
    scanf("%u/%u/%u", &jour, &mois, &annee);
    
    bis_1 = annee % 4 == 0 && (annee % 100 != 0 || annee % 400 == 0);
    bis_2 = annee % 4 == 0;
    
    nb_jours = 365 * (annee - 1);
    
    if (annee > 1582)
    {
        nb_jours += (annee - 1)/4;
        nb_jours -= (annee - 1)/100;
        nb_jours += (annee - 1)/400;
        nb_jours += 2;
    }
    else
    {
        nb_jours += (annee - 1)/4;
    }
    
    nb_jours += 31 * (mois - 1);
    
    switch (mois)
    {
        case 3:
        case 4:
            if (annee > 1582)
            {
                nb_jours -= (bis_1) ? 2 : 3;
            }
            else
            {
                nb_jours -= (bis_2) ? 2 : 3;
            }
            break;
        case 5:
        case 6:
            if (annee > 1582)
            {
                nb_jours -= (bis_1) ? 3 : 4;
            }
            else
            {
                nb_jours -= (bis_2) ? 3 : 4;
            }
            break;
        case 7:
        case 8:
        case 9:
            if (annee > 1582)
            {
                nb_jours -= (bis_1) ? 4 : 5;
            }
            else
            {
                nb_jours -= (bis_2) ? 4 : 5;
            }
            break;
        case 10:
        case 11:
            if (annee > 1582)
            {
                nb_jours -= (bis_1) ? 5 : 6;
            }
            else
            {
                nb_jours -= (bis_2) ? 5 : 6;
            }
            break;
        case 12:
            if (annee > 1582)
            {
                nb_jours -= (bis_1) ? 7 : 8;
            }
            else
            {
                nb_jours -= (bis_2) ? 7 : 8;
            }
            break; 
    }
    
    nb_jours += (jour - 1);
    
    switch (nb_jours % 7)
    {
        case 0:
            printf("C'est un samedi\n");
            break;
        case 1:
            printf("C'est un dimanche\n");
            break;
        case 2:
            printf("C'est un lundi\n");
            break;
        case 3:
            printf("C'est un mardi\n");
            break;
        case 4:
            printf("C'est un mercredi\n");
            break;
        case 5:
            printf("C'est un jeudi\n");
            break;
        case 6:
            printf("C'est un vendredi\n");
            break;
        default:
            printf("Faille cosmique...\n");
            break;
    }
    
    return 0;
}

EDIT : Ah oui, dans la correction vous utilisez une technique particulière avec le switch, ce qui allège le code.

+0 -0

Aussi, si je me permet de faire une petite remarque : j’avais pas compris la partie sur l’incrémentation/décrémentation au chapitre 5.

J’ai du regarder sur un autre forum pour comprendre. Et quand je relis le passage en question, j’ai toujours du mal à saisir :

Le résultat des deux paires d’opérateurs est le même : la variable variable est incrémentée ou décrémentée, à une différence près : le résultat de l’opération. Dans le premier cas (opérateur préfixé) ce sera la valeur de la variable augmentée ou diminuée d’une unité et dans l’autre (opérateur suffixé) ce sera la valeur de la variable.

J’aurai plutôt écrit que lorsqu’on écrit x = i++ pour x et i deux variables, alors x prend la valeur de i puis i est augmenté de 1. Et lorsqu’on écrit x = ++i, x prend la valeur de i + 1 et i est augmenté de 1.

+0 -0

Peut-être que le plus simple serait d’écrire deux fonctions prefix(int n) et postfix(int n) qui décrieraient ce que ++n et n++ font ?

tleb

De ce côté, je ne pense pas que cela serait spécialement plus explicite.

Aussi, si je me permet de faire une petite remarque : j’avais pas compris la partie sur l’incrémentation/décrémentation au chapitre 5.

J’ai du regarder sur un autre forum pour comprendre. Et quand je relis le passage en question, j’ai toujours du mal à saisir :

Le résultat des deux paires d’opérateurs est le même : la variable variable est incrémentée ou décrémentée, à une différence près : le résultat de l’opération. Dans le premier cas (opérateur préfixé) ce sera la valeur de la variable augmentée ou diminuée d’une unité et dans l’autre (opérateur suffixé) ce sera la valeur de la variable.

J’aurai plutôt écrit que lorsqu’on écrit x = i++ pour x et i deux variables, alors x prend la valeur de i puis i est augmenté de 1. Et lorsqu’on écrit x = ++i, x prend la valeur de i + 1 et i est augmenté de 1.

Ozmox

Mmm… Je vais voir si je peux rendre ce passage plus explicite.

+0 -0

Cela te paraît-il plus clair comme suit ?

Le résultat des deux paires d’opérateurs est le même : la variable variable est incrémentée ou décrémentée, à une différence près : le résultat de l’opération.

  1. Dans le cas de l’opérateur préfixé (--variable ou ++variable), le résultat sera la valeur de la variable augmentée ou diminuée d’une unité.
  2. Dans le cas de l’opérateur suffixé (variable-- ou variable++), le résultat sera la valeur de la variable.

Illustration !

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <stdio.h>

int main(void)
{
    int x = 1;
    int y = 1;
    int a = x++;
    int b = ++y;

    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("x = %d\n", x);
    printf("y = %d\n", y);
    return 0;
}
1
2
3
4
a = 1
b = 2
x = 2
y = 2

Comme vous pouvez le constater, la valeur de l’expression x++ est 1 alors que la valeur de l’expression ++y est 2. Cela étant, dans les deux cas, les variables x et y ont bien été incrémentées.

+0 -0

Comme ça je comprend, à part peut-être quand tu écrit au tout début "à une différence près : le résultat de l’opération".

J’ai du mal à voir de quoi tu parle par "résultat de l’opération". Mais c’est moi qui beug là, peut-être pas tout le monde.

Comme ça je comprend […].

Ozmox

Ok, dans ce cas, je garde pour publication.

J’ai du mal à voir de quoi tu parle par "résultat de l’opération". Mais c’est moi qui beug là, peut-être pas tout le monde.

Ozmox

En fait, cette phrase parle bien d’opérateurs comme + ou -. Du coup, tout comme 1 + 1 ou 2 - 5 ont un résultat, var++ en a un également.

+0 -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