Problème de programmation

Problème de programmation - C - Programmation

Marsh Posté le 20-01-2011 à 22:52:03    

Bonjour,
 
Pouvez vous me dire quel est le problème ?
 
 
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
 
{
    int dateentre = 0;
 
    printf ("entrez votre date de naissance sous la forme mmjj : " );
    scanf ("%d", &dateentre);
 
if (dateentre >= 0121 && dateentre <= 0218)
{
    printf ("Vous etes Verseau" );
    return = 0;
}
else if (dateentre >= 0219 && dateentre <= 0320)
{
    printf ("Vous etes Poisson" );
    return = 0;
}
else if (dateentre >= 0321 && dateentre <= 0420)
{
    printf ("Vous etes Belier" );
    return = 0.
}
else if (dateentre >= 0421 && dateentre <= 0521)
{
    printf ("Vous etes Taureau" );
    return = 0;
}
else if (dateentre >= 0522 && dateentre <= 0621)
{
    printf ("Vous etes Gemeaux" );
    return = 0;
}
else if (dateentre >= 0622 && dateentre <= 0722)
{
    printf ("Vous etes Cancer" );
    return = 0;
}
else if (dateentre >= 0723 && dateentre <= 0823)
{
    printf ("Vous etes Lion" );
    return = 0;
}
else if (dateentre >= 0824 && dateentre <= 0922)
{
    printf ("Vous etes Vierge" );
    return = 0;
}
else if (dateentre >= 0923 && dateentre <= 1022)
{
    printf ("Vous etes Balance" );
    return = 0;
}
else if (dateentre >= 1023 && dateentre <= 1122)
{
    printf ("Vous etes Scorpion" );
    return = 0;
}
else if (dateentre >= 1123 && dateentre <= 1221)
{
    printf ("Vous etes Sagittaire" );
    return = 0;
}
else if (dateentre >= 1222 && dateentre <= 0120)
{
    printf ("Vous etes Capricorne" );
    return = 0;
}
}

Reply

Marsh Posté le 20-01-2011 à 22:52:03   

Reply

Marsh Posté le 20-01-2011 à 22:58:30    

merci d'avance

Reply

Marsh Posté le 20-01-2011 à 23:47:30    

et c'est quoi ton probleme :D ?
 
Quand un entier commence par 0 (0121 par exemple), cela signifie qu'il est exprime en base octale, ce n'est pas ce que tu souhaites ici...
 
si ton user rentre "0121", ce sera automatiquement converti en 121.

Reply

Marsh Posté le 21-01-2011 à 00:37:02    

a ok merci il faut donc que je retire le zero en début de nombre ?

Reply

Marsh Posté le 21-01-2011 à 00:39:14    

Scanf c'est le mal pour ce genre de trucs :o


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 21-01-2011 à 10:32:30    

Citation :

else if (dateentre >= 1222 && dateentre <= 0120)


Doit pas y avoir beaucoup de Capricornes :whistle:  
Vu que tous les autres tests sont passés, à ce stade la, un

else if (dateentre >= 1222 || dateentre <= 0120)


devrait coller
A+,


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

Marsh Posté le 21-01-2011 à 10:48:46    

Bon, il y a divers autres problèmes, comme le fait qu'il n'y a pas de détection d'une date invalide.
 
Une question de style. Je me limite a deux blocs similaires pour l'exemple.

Citation :

if (dateentre >= 0121 && dateentre <= 0218)  
{  
    printf ("Vous etes Verseau" );  
    return = 0;  
}  
else if (dateentre >= 0219 && dateentre <= 0320)  
{  
    printf ("Vous etes Poisson" );  
    return = 0;  
}


Il faut choisir:
Soit

Code :
  1. if (dateentre >= 0121 && dateentre <= 0218)
  2.   {
  3.     printf ("Vous etes Verseau" );
  4.   }
  5. else if (dateentre >= 0219 && dateentre <= 0320)
  6.    {
  7.      printf ("Vous etes Poisson" );
  8.    } 
  9. return = 0;

 
Soit

Code :
  1. if (dateentre >= 0121 && dateentre <= 0218)
  2.   {
  3.     printf ("Vous etes Verseau" );
  4.     return = 0;
  5.   }
  6. if (dateentre >= 0219 && dateentre <= 0320)
  7.   {
  8.     printf ("Vous etes Poisson" );
  9.     return = 0;
  10.   }


 
Car sinon, il y a des instructions inutiles.
 
A+,


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

Marsh Posté le 21-01-2011 à 16:00:25    

Tiens, un truc du genre qui marche, à toi d'améliorer (tenir compte des années bissextiles, etc)
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. static struct {
  4.   char zName[11];
  5.   char zEndDay;
  6. } ZodiacData[13] = {
  7.   {"Capricorne", 20},  {"Verseau",    18},  {"Poisson",    20},
  8.   {"Belier",     20},  {"Taureau",    21},  {"Gemeaux",    21},
  9.   {"Cancer",     22},  {"Lion",       23},  {"Vierge",     22},
  10.   {"Balance",    22},  {"Scorpion",   22},  {"Sagittaire", 21},
  11.   {"Capricorne", 20}
  12. };
  13. #define M_JAN 1
  14. #define M_FEB 2
  15. #define M_MAR 3
  16. #define M_APR 4
  17. #define M_MAY 5
  18. #define M_JUN 6
  19. #define M_JUL 7
  20. #define M_AUG 8
  21. #define M_SEP 9
  22. #define M_OCT 10
  23. #define M_NOV 11
  24. #define M_DEC 12
  25. char isDateValid(int day, int month) {
  26.   char dayMax = 0;
  27.   if (day < 1 || day > 31 || month < 1 || month > 12)
  28.     return 0;
  29.   switch(month) {
  30.   case M_JAN: case M_MAR: case M_MAY: case M_JUL:
  31.   case M_AUG: case M_OCT: case M_DEC:
  32.     dayMax = 31;
  33.     break;
  34.   case M_APR: case M_JUN: case M_SEP: case M_NOV:
  35.     dayMax = 30;
  36.     break;
  37.   case M_FEB:
  38.     dayMax = 28;
  39.     break;
  40.   }
  41.   return ((day > dayMax)?0:1);
  42. }
  43. /* 13 ici car sign va varier de 0 à 12 puisque on a ZodiacData[13] */
  44. #define INVALID_DATE 13
  45. /* Algo très simple: Si on est avant la date de fin pour le mois,
  46.    On est au signe du début du mois, sinon on est au signe du mois suivant */
  47. char ComputeSign(int day, int month) {
  48.   if (isDateValid(day, month))
  49.     return((day <= ZodiacData[month-1].zEndDay)?(month-1):month);
  50.   else
  51.     return INVALID_DATE;
  52. }
  53. int GetUserInput(int *day, int *month) {
  54.   int dateentre, read;
  55.   printf ("entrez votre date de naissance sous la forme mmjj : " );
  56.   read = scanf ("%d", &dateentre);
  57.   if (read && read != EOF) {
  58.     *day = dateentre % 100;
  59.     *month = dateentre / 100;
  60.     return 1;
  61.   }
  62.   else {
  63.    printf ("Erreur: Entree invalide!\n" );
  64.    return 0; 
  65.   }
  66. }
  67. int main(int argc, char *argv[]){
  68.   char sign;
  69.   int day, month;
  70.   if (!GetUserInput(&day, &month)) {
  71.     return EXIT_FAILURE;
  72.   }
  73.   sign = ComputeSign(day, month);
  74.   if (sign == INVALID_DATE) {
  75.     printf ("Erreur: Date invalide: %d%d\n", month, day);
  76.     return EXIT_FAILURE;
  77.   }
  78.    
  79.   printf ("Vous etes %s\n", ZodiacData[sign].zName);
  80.   return EXIT_SUCCESS;
  81. }


Exemple écrit pour te donner une idée du type de structure de donnée que tu aurais pu employer, ce qui aurait donné un algo quasi immédiat pour en déduire le signe zodiacal.
 
A+,


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

Marsh Posté le 21-01-2011 à 17:05:13    

Nan mais gilou je pense que tu verses dans le délire là ... Il sait à peine faire quelques if, un include, un scanf et des return et toi tu lui balances des structures, des define, du pointeur, des ternaires, un switch case et du EXIT_FAILURE/SUCCESS
 
Le mec il va se suicider en voyant ton exemple :o


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 21-01-2011 à 17:33:40    

Alors que j'ai mis une belle structure de données qu'on en voit pas tous les jours des comme ça en C avec un beau tableau de struct anonyme  (parce nombre de clampins auraient fait ça en deux morceaux avec un typedef...)  :D  

Code :
  1. static struct {
  2.   char zName[11];
  3.   char zEndDay;
  4. } ZodiacData[13] = {
  5.   {"Capricorne", 20},  {"Verseau",    18},  {"Poisson",    20},
  6.   {"Belier",     20},  {"Taureau",    21},  {"Gemeaux",    21},
  7.   {"Cancer",     22},  {"Lion",       23},  {"Vierge",     22},
  8.   {"Balance",    22},  {"Scorpion",   22},  {"Sagittaire", 21},
  9.   {"Capricorne", 20}
  10. };


 
Et en plus j'avais simplifié (viré du code pour tester les années bissextiles) pensant qu'il aurait des difficultés avec:

Code :
  1. char isYearLeap(int year) {
  2.   return (((year%4)||((!(year%100))&&(year%400)))?0:1);
  3. }

:whistle:  
A+,

Message cité 1 fois
Message édité par gilou le 21-01-2011 à 19:49:01

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

Marsh Posté le 21-01-2011 à 17:33:40   

Reply

Marsh Posté le 21-01-2011 à 20:10:21    

gilou a écrit :

Alors que j'ai mis une belle structure de données qu'on en voit pas tous les jours des comme ça en C avec un beau tableau de struct anonyme  (parce nombre de clampins auraient fait ça en deux morceaux avec un typedef...)  :D  

Code :
  1. static struct {
  2.   char zName[11];
  3.   char zEndDay;
  4. } ZodiacData[13] = {
  5.   {"Capricorne", 20},  {"Verseau",    18},  {"Poisson",    20},
  6.   {"Belier",     20},  {"Taureau",    21},  {"Gemeaux",    21},
  7.   {"Cancer",     22},  {"Lion",       23},  {"Vierge",     22},
  8.   {"Balance",    22},  {"Scorpion",   22},  {"Sagittaire", 21},
  9.   {"Capricorne", 20}
  10. };


 
Et en plus j'avais simplifié (viré du code pour tester les années bissextiles) pensant qu'il aurait des difficultés avec:

Code :
  1. char isYearLeap(int year) {
  2.   return (((year%4)||((!(year%100))&&(year%400)))?0:1);
  3. }

:whistle:  
A+,


 
J'aurais fait avec un typedef, je connaissais pas cette structure (jeu de mots proof :o) [:cupra]
 
Mais oui le isYearLeap ça aurait été la cerise sur le gâtal :o


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Sujets relatifs:

Leave a Replay

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