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 :

Problème pour Calendrier Annuel C++


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 7
    Par défaut Problème pour Calendrier Annuel C++
    Bonjour, j'ai un problème dans le codage d'un calendrier annuel en C++. Voila mon 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
    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
    #include <iostream>
    #include <string>
    #include <iomanip>
    #include <stdlib.h>
     
    using namespace std;
     
    int main()
    {
     
        int month;
        int row = 0;
        int column = 0;
        int weeknum;
        int startday;
      	bool nmonth;
    	int year,k,j,h;
    	int daysinyear=365;
    	int daymonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    	string months[12]={"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"};
    	string dates[18][28]{" "};//Mon tableau représentant tous l'année au complet avec des blancs partout.
     
    	cout << "Veuillez entrer l'annee pour laquelle vous voulez afficher un calendrier annuel: ";
    	cin >> year;
     
    	if(year%4==0&&year%100!=0||year%400==0)
    		{
    			daymonth[1] = 29;
    			daysinyear=366;
    		}
     
    	cout << endl <<endl;
     
    	for(int p=1; p!=12 ;p++)
    	{
    		month=p;
    		nmonth=true;
    		for (int i = 1; i <= daymonth[p-1]; i++)
    		{
    		    if(month == 1)
    		    	{
    		    		month = 13;
    		    		year--;
    		    	}
    		  	if (month == 2)
    		  		{
    			    	month = 14;
    			    	year--;
    		  		}
     
    			k = year % 100;
    			j = year / 100;
    			h = i + 13*(month+1)/5 + k + k/4 + j/4 + 5*j;
    			h = h % 7;
     
    			char tmp [33];//Buffer pour la conversion de la date en string pour le calendrier (string permet d'afficher des blancs)
     
     
    		  	if (nmonth=true)//Est-ce que nous avons débuté un nouveau mois?
    		  		{
    		  			startday = h;//Enregistrons donc le jour de la semaine du 1er
    				}
     
    		  	weeknum = (i - 1 + startday)/7;//Comme expliqué plus haut, permet de calculer le numéro de la semaine dans le mois
    			row = (p/4*6) + weeknum;//Calcul de rang, Division entière du mois donc 0 1 2 multiplié par 6 pour avoir l'espace pour mes 6 semaines/mois
    			column = (p%4*7) + h;//Calcul de la colonne, Modulo de mois donc 0 1 2 3 multiplié par 7 pour avoir l'espace pour mes 7 jours/semaine
    			itoa(i, tmp, 10);
    			dates[row][column] = tmp;
     
    			cout << "\nValeur de chaque variable: " << endl;
    			cout << tmp <<","<< h <<","<< p<<","<< weeknum <<","<< row <<","<< column;
    			nmonth=false;
    		}
    	}
     
     
     
    	int monthnamemod = 0;//Permet d'itérer par tranche de 4 dans l'array des noms de mois
        string week = "D  L  M  M  J  V  S     ";
        for (int i = 0; i < 18; i++)
        	{
       			if (i%6==0)//Si début d'une nouvelle rangée de 4 mois
       			{
    				cout<<left<<setw(24)<<endl<<months[monthnamemod * 4]<<setw(24)<<months[monthnamemod * 4+1]<<setw(24)<<months[monthnamemod * 4+2]<<setw(24)<<months[monthnamemod * 4+3]<<endl<<endl;   
    				monthnamemod++;
    				cout<<left<<setw(3)<<week<<setw(3)<<week<<setw(3)<<week<<setw(3)<<week<<endl;
    			}
     
    			for (int j = 0; j < 28; j++)
       			{
       				cout<<left<<setw(3)<<dates[i][j];	
    				if (j%7==6)//Si fin d'une semaine
    					{
    						cout<<left<<setw(3)<<"";
    					}
    			}
    			cout<<endl<<"";
       		}
    }
    Je sais , c'est un peu mal organisé pour l'instant, mais j'aimerais savoir comment régler mon problème pour que cela s'affiche correctement. Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 503
    Par défaut
    Code horriblement complexe, très vraisemblablement faux, pour pas grand chose :
    https://stackoverflow.com/questions/...for-given-date
    Tout ça pour un calendrier grégorien qui n'est qu'un des 2000 calendriers encore "utilisés" sur Terre.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 7
    Par défaut
    Je sais.. mais dans ce cas pouvez vous me montrer comment afficher un calendrier annuel en carré de 4x3 mois ?!

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 503
    Par défaut
    Une console, c'est pas fait pour ça.
    Si vous voulez une "vraie" IHM hostable dans une console, utilisez une bibliothèque adéquate, comme ncurse :
    http://arnaud-feltz.developpez.com/tutoriels/ncurses/

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je ne peux résister au plaisir de vous partager cette vidéo d'Eric Niebler, qui présente une manière très élégante de le faire avec les ranges :



    Par contre, je pense que je ne répond pas à la question initiale, car il s'agit là d'une méthode assez avancée qui de plus utilise la bibliothèque range V3... Mais pour les curieux, ça vaut le coup.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 7
    Par défaut
    En tout cas votre aide fut apprécié ...

  7. #7
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 54
    Par défaut
    Hello !

    Je n'ai pas vraiment pu regarder ton code en détail et je me dit qu'à l'heure d'aujourd'hui tu as pu trouver la solution seul mais je pense tout de même que tu devrais essayer d'organiser un peu mieux ton code au préalable, le documenter, faire des fonctions peut-être.

    Ça te permettrait d'y voir plus clair, d'analyser le code blocks par blocks (donc de rendre les choses plus claires dans ta tête) et ça permettrait à ceux du forum de t'aider plus efficacement.

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Sillimon Voir le message
    Hello !

    Je n'ai pas vraiment pu regarder ton code en détail et je me dit qu'à l'heure d'aujourd'hui tu as pu trouver la solution seul mais je pense tout de même que tu devrais essayer (1)d'organiser un peu mieux ton code au préalable, (3)le documenter, (2)faire des fonctions peut-être.

    Ça te permettrait d'y voir plus clair, d'analyser le code blocks par blocks (donc de rendre les choses plus claires dans ta tête) et ça permettrait à ceux du forum de t'aider plus efficacement.
    (1)et (2), très certainement... Mais (3)!!! quelle horreur!!! Le meilleur commentaire est celui que l'on ne doit pas écrire! (enfin, je présumes, peut-être à tord, que tu voulais bel et bien parler de commenter ton code)

    Bon, pour éviter que cette discussion ne dégénère en un débat qui a déjà cours ailleurs sur le forum, je vais préciser ma pensée:

    On peut généralement classer les commentaires en trois grosses catégories:
    1. les "cartouches", comme on en trouve souvent au début d'un fichier ou juste avant la déclaration d'une fonction ou d'une classe
    2. les commentaires "à visée pédagogique" et
    3. les commentaires qui paraphrasent le code ou qui évolueront en même temps que lui

    Je n'ai absolument rien contre les cartouches ou contre les commentaires à visée pédagogique pour autant qu'ils soient cohérent et bien rédigés.

    J'adore les cartouches car ils permettent de fournir des informations utile au développeur quant à l'usage (en plus de rappeler la licence, par exemple) qu'il peut faire de la notion qu'ils présentent voire servir à la génération automatique de documentation, ce qui poursuit le même objectif.

    De plus, l'utilisation que l'on fait d'un type de donnée ou d'une fonction est particulièrement stable: si on crée un nouveau type de donnée ou une fonction, c'est pour répondre à un besoin particulier. Or, une fois qu'il a été établi (et utilisé), ce besoin restera d'actualité au fil du temps. Ce ne sont donc pas des commentaires qui risquent d'évoluer parce que l'on a eu l'idée subite de changer un détail de l'implémentation du service rendu.

    Pour ce qui est des commentaires à visée pédagogique, je suis bien obligé d'admettre que la lecture et la compréhension de code n'est pas forcément une aptitude innée, et qu'ils présentent donc l'intérêt non négligeable de permettre à quelqu'un qui débute de comprendre par lui-même le code qu'il a devant les yeux, en attendant d'avoir acquis cette aptitude.

    Je dois d'ailleurs avouer que j'en fais moi-même un usage intensif sur les forums.

    Cependant, ils ne prennent sens que parce que l'on sait pertinemment que l'on s'adresse à quelqu'un de peu habitué. C'est donc un genre de commentaire qui a toute sa place sur un forum ou dans le code fourni en exemple par un professeur (voire, dans du code écrit par l'élève, dans un premier temps), mais il n'a en revanche rien à faire dans du "code de production" (comprenez : du code qui n'est pas destiné à être "directement jeté après usage").

    Mon exclamation portait donc sur la dernière catégorie de commentaires : ceux qui paraphrasent le code ou qui évolueront en même temps que le code.

    Si je refuse d'ajouter des commentaires qui évolueront en même temps que le code, c'est pour une raison bien simple : ceux qui feront évoluer le code après moi ne penseront jamais à faire évoluer mes commentaires (il se peut même aussi que j'oublie ou que je n'aie simplement pas le temps de le faire si je me charge de faire évoluer le code).

    Au fil des évolutions, on se retrouvera donc avec des commentaires qui sont complètement "désynchronisés" par rapport au code réel. Dans le meilleur des cas, le lecteur aura la présence d'esprit de se concentrer uniquement sur le code, mais dans le pire des cas (et malheureusement le plus fréquent, étant donné la nature humaine), il se concentrera sur les commentaires et ne jettera qu'un coup d'oeil à ce point distrait (si tant est qu'il le fasse) sur le code qu'il ne se rendra même pas compte que les commentaires ne correspondent pas. Or, le code est la seule chose qui importe, car c'est le code (et non les commentaires) qui permet au compilateur (ou à l'interpréteur) de dire au processeur ce qu'il doit faire.

    Enfin, de manière générale, si tu éprouves le besoin d'ajouter un commentaire dans ton code, c'est le plus souvent:
    1. parce qu'une fonction en fait trop et qu'elle devient trop longue. On souhaite alors placer des commentaires pour "savoir où l'on en est"
    2. parce qu'un nom (de fonction, de variable ou de type) ne correspond pas à l'usage qui en est fait. On souhaite alors placer des commentaires pour "savoir à quoi ca sert"
    3. parce que l'utilisation d'un nom (d'une variable, essentiellement) change "au fil du temps". On souhaite alors se souvenir de l'utilisation qui en est faite
    4. parce que du code n'a plus de raison d'être : on a décidé de "s'y prendre autrement" et la partie de code commentée n'est plus utilisée
    5. parce que tu as trop de paramètres à fournir à une fonction, et qu'il te faut un "aide mémoire" pour savoir dans quel ordre les fournir
    Si tu décides de rajouter un commentaire pour l'une de ces cinq raisons, tu dois te dire que tu le fais pour une mauvaise raison, car la bonne solution est (je garde le même ordre, bien sur)
    1. créer des fonctions plus petites, qui ne s'occupent à chaque fois que d'une seule chose particulière (SRP inside), qui ne prennent à chaque fois qu'un aspect particulier du problème en charge: On s'y retrouve bien plus facilement dans cinq fonctions de dix lignes que dans une seule fonctions de cinquante. Surtout si les noms de fonctions sont bien choisis (voir (2))
      1. choisir des noms qui correspondent à l'usage qui est fait (de la fonction, de la variable ou du type): plus le nom correspond à l'usage qui est fait de la chose, plus il est facile de comprendre ce qui est fait
      2. on n'est pas limité dans la taille des noms. De manière générale, plus un nom est court, plus la "portion de code" qui l'utilise doit être petite.
    2. respecter (1) et (2) t’aidera à corriger ce point. Si cela ne suffit pas, faire en sorte que chaque utilisation qui est faite d'une donnée utilise une donnée qui lui est propre: tu utilises une données pour trois raisons différentes:queston: tu devrais sans doute avoir trois variables différentes (SRP inside)
    3. supprime le "code mort". Du code qui n'a aucune raison d'être n'a aucune raison d'apparaître dans ton code. Il n'a que des défauts et aucun intérêt, dont ceux de distraire le lecteur et de "briser le flux de lecture"
    4. respecter (1) et (2) t’aidera à corriger ce point: des fonctions qui ne s'occupent que d'un aspect particulier du problème travaillent sur moins de données et ont donc sûrement besoin de moins de données extérieures. Si cela ne suffit pas, envisages la création d'une structure qui regroupe les paramètres dont tu as besoin: ce sera toujours plus facile à manipuler
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Calendrier annuel pour Excel
    Par forum dans le forum Contribuez
    Réponses: 22
    Dernier message: 24/06/2015, 13h04
  2. [SP-2010] Affichage Annuel pour calendrier SP
    Par Ethan73100 dans le forum SharePoint
    Réponses: 0
    Dernier message: 29/02/2012, 12h19
  3. [PHP 5.0] Cherche calendrier annuel pour location
    Par Georges974 dans le forum Langage
    Réponses: 0
    Dernier message: 15/01/2012, 05h24
  4. Réponses: 3
    Dernier message: 29/08/2003, 10h57
  5. Problème pour récupérer la clé primaire
    Par caramel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/04/2003, 13h57

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