Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1550 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Problème de programmation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de programmation

n°2050587
scariox
Posté le 20-01-2011 à 22:52:03  profilanswer
 

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;
}
}

mood
Publicité
Posté le 20-01-2011 à 22:52:03  profilanswer
 

n°2050589
scariox
Posté le 20-01-2011 à 22:58:30  profilanswer
 

merci d'avance

n°2050601
mr simon
Posté le 20-01-2011 à 23:47:30  profilanswer
 

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.

n°2050607
scariox
Posté le 21-01-2011 à 00:37:02  profilanswer
 

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

n°2050608
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 21-01-2011 à 00:39:14  profilanswer
 

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
n°2050652
gilou
Modérateur
Modzilla
Posté le 21-01-2011 à 10:32:30  profilanswer
 

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é!  --
n°2050664
gilou
Modérateur
Modzilla
Posté le 21-01-2011 à 10:48:46  profilanswer
 

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é!  --
n°2050841
gilou
Modérateur
Modzilla
Posté le 21-01-2011 à 16:00:25  profilanswer
 

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é!  --
n°2050859
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 21-01-2011 à 17:05:13  profilanswer
 

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
n°2050864
gilou
Modérateur
Modzilla
Posté le 21-01-2011 à 17:33:40  profilanswer
 

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é!  --
mood
Publicité
Posté le 21-01-2011 à 17:33:40  profilanswer
 

n°2050887
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 21-01-2011 à 20:10:21  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Problème de programmation

 

Sujets relatifs
problème de programmationprogrammation de GnomeCallerID gtk et c (gros probleme !)
probleme de programmation en CProblème programmation C++
[G TRouvé] A locker merci modoprobleme avec programmation csharp
probleme de programmationProbleme programmation en C jeu de la vie
Programmation C, problème :([Résolu] Problème Programmation MFC
Plus de sujets relatifs à : Problème de programmation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR