Noméro de jours de l'année a partir d'une date

Noméro de jours de l'année a partir d'une date - C++ - Programmation

Marsh Posté le 12-02-2011 à 12:46:38    

Bonjours,
je suis débutant en programmation et j'ai un programme a écrire, mais j'ai tout essayer et je n'arrive pas à le faire fonctionner...
J'implore donc l'aide de quelqu'un!
 
Voici le sujet:
Programmez une fonction qui prend en argument un numéro de jour (entier entre 1 et 31), de mois (entier entre 1 et 12) et renvoie le numéro de jour dans l’année (entre 1 et 366). On utilisera pour cela un tableau contenant le nombre de jours de chaque mois.
Facultatif : modifiez votre fonction pour qu’elle gère les années bissextiles (tous les 4 ans, sauf les multiples de 100 qui ne sont pas multiples de 400).
 
et voici ce que j'ai réussi a faire:
 

Code :
  1. // le nombre de jour dans l annee
  2. // jour.mois.annee?
  3. # include <iostream>
  4. using namespace std;
  5. // À 13 entrées dans l index = Mois pouvant etre utilise
  6. int jour_dans_mois [2][13] = {
  7. {0,31,28,31,30,31,30,31,31,30,31,30,31},
  8. {0,31,29,31,30,31,30,31,31,30,31,30,31}
  9. } ;
  10. int jour_dans_annee (int j, int m, int s)
  11. {
  12. int i;
  13. // le jour j le nombre de jour
  14. // mois precedent
  15. for (i=1 ; i<m; i ++){
  16. j += jour_dans_mois [s][i];
  17. }
  18. return j ;
  19. }
  20. int
  21. main ()
  22. {
  23. int jour ,mois ,annee ;
  24. cout << "Entrer: jour " << endl;
  25. cin >> jour;
  26. cout << "Entrer: mois " << endl;
  27. cin >> mois;
  28. cout << "Entrer:  annee" << endl;
  29. cin >> annee;
  30. // Entrer > 0 et mois <= 12 ?
  31. // autrement date non valide
  32. if ((jour>0)&&(annee>0) &&(mois>0 )&&(mois<=12 )) {
  33. // Annee bissextil?
  34. int Annee_bissextil =
  35. ((annee%4 == 0)&&(annee%100 != 0 )||
  36. (annee%400 == 0));
  37. // a le mois ’jour’ jours?
  38. // autrement date non valide
  39. if (jour <= jour_dans_mois[Annee_bissextil][mois]){
  40. cout <<"le " <<jour << "." << mois << "."
  41. << annee << " est le "
  42. << jour_dans_annee (mois ,jour ,Annee_bissextil)
  43. << ". jour de l'annee. " << endl;
  44. return 0 ;
  45. }
  46. }
  47. cout << "le " <<jour<< "." << mois << "."
  48. << annee << " n est pas une date valide."
  49. <<endl;
  50. return 0 ;
  51. }


 
Merci d'avance pour votre aide !


Message édité par gilou le 12-02-2011 à 15:39:29
Reply

Marsh Posté le 12-02-2011 à 12:46:38   

Reply

Marsh Posté le 12-02-2011 à 15:34:12    

C'est pas mal ce que tu as fait, mais pas la peine de créer une entrée initiale inutile, et autant utiliser la table pour avoir le nb de jours déjà écoulés les mois précédents, plutôt que tout recalculer à chaque fois.
Tiens, partant de ton code, j'ai écrit rapidement ceci pour illustrer mes propos:

Code :
  1. #include <iostream>
  2. using namespace std;
  3. static unsigned short tabledate [2][12][2] = {
  4.   // année standard nb de jours du mois, nb de jours écoulés avant le mois
  5.   {{31,0},{28,31},{31,59},{30,90},{31,120},{30,151},{31,181},{31,212},{30,242},{31,273},{30,304},{31,334}},
  6.   // année bissextile nb de jours du mois, nb de jours écoulés avant le mois
  7.   {{31,0},{29,31},{31,60},{30,91},{31,121},{30,152},{31,182},{31,213},{30,243},{31,274},{30,305},{31,335}}
  8. };
  9. inline int isBissextil(int annee) {
  10.   return (((annee%4 == 0) && ((annee%100 != 0 )|| (annee%400 == 0)))?1:0);
  11. }
  12. unsigned short nbJours (int jour, int mois, int annee) {
  13.   return (tabledate[isBissextil(annee)][--mois][1] + jour);
  14. }
  15. bool validDayAndMonth(int jour, int mois, int annee) {
  16.   if (mois < 1 || mois > 12)  {
  17.     cerr << "Valeur mois " << mois << " incorrecte";
  18.     return false;
  19.   }
  20.   if (jour < 1 || jour > tabledate[isBissextil(annee)][--mois][0]) {
  21.     cerr << "Valeur jour " << jour << " incorrecte";
  22.     return false;
  23.   }
  24.   return true;
  25. }
  26. bool validUserInput(int& jour, int& mois, int& annee) {
  27.   cout << "Entrer: jour " << endl;
  28.   cin >> jour;
  29.   if (cin) {
  30.     cout << "Entrer: mois " << endl;
  31.     cin >> mois;
  32.     if (cin) {
  33.       cout << "Entrer: annee " << endl;
  34.       cin >> annee;
  35.       if (cin) {
  36.         return true;
  37.       }
  38.     }
  39.   }
  40.   return false;
  41. }
  42. int main ()
  43. {
  44.   int jour, mois, annee;
  45.   // recuperation de l'input utilisateur
  46.   if (validUserInput(jour, mois, annee)) {
  47.   // a ce stade, on a verifie une date numerique en entree
  48.     if (validDayAndMonth(jour, mois, annee)) {
  49.       // a ce stade, on a verifie une date valide   
  50.       cout << nbJours(jour, mois, annee) << endl;
  51.       return 0;
  52.     }
  53.   }
  54.   else {
  55.     cerr << "valeur incorrecte!" << endl;
  56.   }
  57.   return 1;
  58. }


 
A+,


Message édité par gilou le 12-02-2011 à 16:32:36

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-02-2011 à 17:10:39    

Merci beaucoup pour tes conseils!
ton programme m'a permis de comprendre certains trucks!
 
J'ai juste un autre souci, j'ais fais un autre programme, la compilation ne me donne aucune erreur mais en l'executant  il y a un beug windows et je ne comprend pas pourquoi.
 voici le sujet :
Exercice 2. Tri de tableaux.
On cherche à trier dans l’ordre croissant les éléments d’un tableau d’entiers. Il existe de très nombreuses méthodes de tri. Voici celle dite du “tri à bulles” : tant que le tableau n’est pas trié, on le parcourt du premier au dernier indice en échangeant les éléments consécutifs qui sont dans le mauvais ordre. Si, lors d’une passe, aucune paire d’éléments n’a été échangée, alors le tableau est trié.
Testez votre tri sur quelques tableaux d’un millier d’éléments :
– un tableau déjà ordonné,
– un tableau dans l’ordre décroissant,
– un tableau initialisé aléatoirement ; on pourra utiliser pour cela la fonction standard rand() (disponible après un #include <stdlib.h> ) qui renvoie un nouveau nombre au hasard à chaque appel.
Il y deux manières de tester votre tri :
– écrire une fonction d’affichage du tableau et laisser l’utilisateur vérifier de visu,
– écrire une fonction qui vérifie automatiquement que le tableau est bien trié en comparant les couples d’éléments consécutifs.
Note culturelle : dans la pratique, c’est la méthode dite du “tri rapide” qui est employée. Elle est plus complexe à programmer mais, comme son nom l’indique, plus rapide.
 
 
et voici ce que j'ai fais:
 

Code :
  1. #include<stdio.h>
  2. #include<iostream>
  3. int
  4. main()
  5. {
  6.   int i,n,c,j;
  7.   int T[n];
  8.   printf("entrer le nombre de valeurs a classer : " );
  9.   scanf("%d",&n);
  10.   for (i=1;i<=n;i++) {
  11.     printf("T[%d]= ",i);
  12.     scanf("%d",&T[i]);
  13.   }
  14.   for (j=1;j<=n;j++) {
  15.     for (i=1;i<n;i++) {
  16.       if (T[i]<T[i+1]) {
  17.         c=T[i];
  18.         T[i]=T[i+1];
  19.         T[i+1]=c;
  20.       }
  21.     }
  22.   }
  23.   for (i=1;i<=n;i++) {
  24.     //affichage
  25.     printf("T[%d]=%d \n",i,T[i]);
  26.   }
  27.   return 0;
  28. }


 
Merci d'avance pour tes conseils éclérés
a+


Message édité par gilou le 13-02-2011 à 17:26:22
Reply

Marsh Posté le 13-02-2011 à 17:37:58    

Citation :

 int T[n];


Ça ne peut pas marcher, puisque la valeur de n n'est pas connue à ce stade. Ça ne devrait même pas compiler.
 
Plusieurs remarques.
Il faut choisir: soit on fait du C, soit on fait du C++.
Si on fait du C++, on utilise les entrées sorties C++ et non pas celles du C (même si ça marche avec).
Donc ici:
#include<stdio.h> inutile, si on utilise plutôt
#include <iostream>
using namespace std; et si on remplace les printf et scanf par cout et cin.
 
Plutôt que de tout faire dans main, il est bien plus judicieux de faire quelque chose de modulaire:
- Une procédure de création et remplissage du tableau
- Une procédure de tri de tableau
- Une procédure d'affichage du tableau
 
De plus, quand on parcours un tableau,  
for (i=1;i<=n;i++) { ...quelque chose avec T[i] }
ça ne marche pas, puisque l'indice pour un tableau varie de 0 à n-1 et non de 1 à n .
 
D'autre part, la boucle de tri est surement fausse, puisque l'on a:
for (j=1;j<=n;j++) {
en boucle principale et que j n'est plus jamais utilisé ensuite.
 
A+,
 
 
 
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-02-2011 à 19:08:02    

Merci beaucoup pour cette rapide reponse !
Je pense y arriver avec ces conseils.
 
a+

Reply

Marsh Posté le 13-02-2011 à 21:51:56    

Bon, au cas ou ça peut en intéresser d'autres, une solution purement C++ utilisant des conteneurs standards (au vu de l'énoncé, c'est plus du code a la C avec des tableaux qui est attendu dans son exercice, donc c'est pas une solution prête à l'emploi pour l'auteur du topic)
 

Code :
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. void remplir(vector<int>& entiers)
  6. {
  7.   int tmp;
  8.   cout << "Veuillez donner des nombres entiers, separes par un espace," << endl;
  9.   cout << "pour finir, entrez autre chose qu'un nombre entier." << endl;
  10.   cout << "Valeurs: ";
  11.   // boucle pour récupérer les valeurs
  12.   while (cin >> tmp)
  13.     entiers.push_back(tmp);
  14. }
  15. void imprimer(const vector<int>& entiers)
  16. {
  17.   // liste pas vide?
  18.   if (entiers.size() != 0) {
  19.     cout << "Liste: ";
  20.     // utilisation d'un itérateur standard pour parcourir la liste
  21.     for (vector<int>::const_iterator it = entiers.begin(); it != entiers.end(); it++) {
  22.       cout << *it << " ";
  23.     }
  24.   }
  25.   else {
  26.     cout << "Liste vide!";
  27.   }
  28.   cout << endl;
  29. }
  30. void sort_bulle(vector<int>& entiers) {
  31.   if (entiers.size() < 2)  // pas de tri si pas au moins 2 elements
  32.     return;
  33.   // un tri bulle, ca se fait en 2 boucles, une comparaison et un échange
  34.   for (vector<int>::iterator it = entiers.begin(); it != entiers.end(); it++) {
  35.     for (vector<int>::iterator jt = it+1; jt != entiers.end(); jt++) {
  36.       if (*it > *jt)
  37.         swap(*it, *jt);
  38.     }
  39.   }
  40. }
  41. void main ()
  42. {
  43.   // tableau dynamique standard du c++  
  44.   vector<int> nombres;
  45.   remplir(nombres);
  46.   // sort(nombres.begin(), nombres.end());
  47.   sort_bulle(nombres);
  48.   imprimer(nombres);
  49. }


 
A+,


Message édité par gilou le 13-02-2011 à 22:02:25

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed