Aller au contenu


Photo
- - - - -

[C] Problème de syntaxe.


  • Veuillez vous connecter pour répondre
9 réponses à ce sujet

#1 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 03 mai 2010 - 03:56

Bonjour à tous !

À l'école, on nous a demandé de réalisé un programme simple, en console, qui aurait pour objectif de dire "Bonjour Madame/Mademoiselle/Monsieur + Prénom" à la fin.
Il faut donc :
-Demander le prénom
-Demander le sexe (Madame/Mademoiselle ou Monsieur)
-Demander le statut, si personne féminine (Madame si mariée, Mademoiselle sinon)

Et c'est à peu prêt tout.
Mais ça ne marche pas...



#include
#include

char nom[20];
char sexe, statut;

int main()
{
printf("Nom ?\n");
scanf("%s", &nom);

printf("Mâle ou Femelle ? (M/F)\n");
scanf("%s", &sexe);


if (sexe == 'M')
{
printf("\nBonjour Monsieur %s .", nom);
}

else if (sexe == 'F')
{
printf("Etes-vous mariée ? (O/N)\n");
scanf("%s", &statut);

if (statut == 'O')
{
printf("\nBonjour Madame %s .", nom);
}

else
{
printf("\nBonjour Mademoiselle %s .", nom);
}
}

else
{
printf("\nvous êtes un extraterrestre!");
}

return 0;
}[/code]


Je pense que le problème est plutôt syntaxique, non ?

J'ai pas mal de questions auxquelles je n'ai pas su répondre...

- Est-ce que, pour le "if", il faut mettre "if (sexe == "M")" ou bien "if (sexe == 'M')" ?
- Est-ce que le "%s" est bien juste ? On m'a dit qu'on pouvait mettre "%c" quand ce n'était qu'une seule lettre ?
- ...


Merci d'avance à ceux qui jetteront un oeil ! ;)


Edit : Effectivement, j'avais oublié le message du compilateur, désolé.


-------------- Build: Debug in madame_monsieur ---------------

Compiling: main.c
/home/simon/Bureau/Code::Blocks/madame_monsieur/main.c: In function ‘main’:
/home/simon/Bureau/Code::Blocks/madame_monsieur/main.c:11: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[20]’
/home/simon/Bureau/Code::Blocks/madame_monsieur/main.c:17: warning: comparison between pointer and integer
/home/simon/Bureau/Code::Blocks/madame_monsieur/main.c:17: warning: comparison with string literal results in unspecified behavior
/home/simon/Bureau/Code::Blocks/madame_monsieur/main.c:22: warning: assignment makes integer from pointer without a cast
/home/simon/Bureau/Code::Blocks/madame_monsieur/main.c:22: warning: suggest parentheses around assignment used as truth value
/home/simon/Bureau/Code::Blocks/madame_monsieur/main.c:27: warning: assignment makes integer from pointer without a cast
/home/simon/Bureau/Code::Blocks/madame_monsieur/main.c:27: warning: suggest parentheses around assignment used as truth value
Linking console executable: bin/Debug/madame_monsieur
Output size is 9,06 KB
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 7 warnings


Petit supplément, quand je lance le programme, il me fait ça :
"Nom ?
Simon
Mâle ou Femelle ? (M/F)
M
Etes-vous mariée ? (O/N)
N

Bonjour Madame ."

#2 webshinra

webshinra

    Membre passionné

  • Membres
  • PipPipPip
  • 510 messages

Posté 03 mai 2010 - 04:04

ça pique les yeux;

alors; première chose, indente correctement else
#
{ printf("vous êtes un extraterrestre!"); }[/code] ça ne fait pas, regarde http://fr.wikipedia.org/wiki/Style_d%27indentation choisis un style qui te plait et reste y.

ensuite, tu déclare des variable hors du main, se qui signifie qu'elle sont globales ( et c'est mal ) tien compte de la portée.

sinon, pour une chaine de caractère, on utilise des guillemet double "", les guillemet simple servant uniquement pour les caractère individuel -je simplifie pour resté clair-.

sinon, si tu nous ne nous donne pas l'erreur que retourne ton compilateur on seras bien en peine de t'aidé.

#3 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise
  • Interests:Electronique / Informatique / Robotique / BD / et surtout les boissons fermentées au houblon

Posté 03 mai 2010 - 04:21

Hello à tous,



Je pense que ton erreur, Esprit, se trouve au niveau l'enregistrement de la variable sexe.



Ton code :


printf("Mâle ou Femelle ? (M/F)");

scanf("%s", &sexe);

[/code]



peut-être la correction :


printf("Mâle ou Femelle ? (M/F)");

scanf("%c", &sexe);

[/code]



Tu déclares une variable Char Sexe qui doit recevoir une chaîne de caractère, y va surement pas aimer.



ensuite effectivement lors de ton test, utilise les '' pour test un caractère et les "" pour tester une chaine de caractère.



Pour l'indentation de ton programme, je le ferai comme ceci :




#include

#include

#include



// déclaration de variable globale

char nom[20];

char sexe, statut;



// fonction principale

int main()

{

printf("Nom ?\n");

scanf("%s", &nom);



printf("Male ou Femelle ? (M/F)");

scanf("%s", &sexe);



if (sexe == "M")

{

printf("Bonjour Monsieur %s .", nom);

}

else if (sexe = "F")

{

printf("Etes-vous mariée ? (O/N)");

scanf("%s", &statut);



if (statut = "O")

{

printf("Bonjour Madame %s .", nom);

}

else

{

printf("Bonjour Mademoiselle %s .", nom);

}

}

else

{

printf("vous êtes un extraterrestre!");

}



return 0;



}// Fin du main

[/code]







Remarque : quand tu as qu'une seule instruction dans le if, tu n'est pas obligé de mettre les accolades



Tiens nous au courant

#4 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 03 mai 2010 - 04:31

J'ai corrigé l'indentation, j'ai aussi mis les variables à l'intérieur de la fonction main. Je ne connaissais pas ce problème de portée ? Ça veut dire ?
Je vais essayer de tester avec vos solutions. :-)

J'ai trouvé au moins 2 (types d') erreurs.

Erreurs :

Ça le fait pas d'oublier un "="... Pourtant je le sais bien !
Et vu que le sexe n'est qu'un seul caractère, je peux mettre " 'M' ".

Correction :


Bon, ça avance.
Maintenant il tient compte du sexe et du statut.

Par contre, il ne donne plus le prénom à la fin.

Il dit "Bonjour Madame/Mademoiselle/Mr ."
Sans mettre le prénom..


[edit : Philou, j'ai aussi oublié de dire ça :
Quand je mets "%c", le programme passe purement et simplement le test. Du coup "%s" c'était apparemment correct. ;)

#5 biohazard2

biohazard2

    Habitué

  • Membres
  • PipPip
  • 184 messages

Posté 03 mai 2010 - 08:39

Style K&R powaaa :D ! Plus sérieusement, indenter un code est très important, il faut que tu prennes cette habitude le plus vite possible. Tu verras, ton code n'en sera que plus lisible, surtout lorsque tu feras des programmes plus longs et plus compliqués.

Tu peux nous recoller exactement le code que tu essaies de compiler stp ?

#6 miky-mike

miky-mike

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 232 messages
  • Gender:Male
  • Location:Belgique

Posté 04 mai 2010 - 07:04

Alors j'ai pas regarder le code a fond (surtout que d'autre s'en occupe déjà) mais un chose qui est peut être conne mais utile, teste les valeurs de retour avec minuscule aussi ("m" et "M") .
Tu verras par la suite que les gens ne mette jamais ce qu'ils doivent mettre :D



#7 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 04 mai 2010 - 07:50

Pour l'indentation du code, je sais que c'est fort important. C'est parce que j'étais encore en plein chipotage et que j'ai changé pas mal de trucs entre temps que j'avais plus tout remis correctement mais en général je fais assez attention à ça. ;)





Le code actuel :



#include

#include



int main()

{

char nom[20];

char sexe, statut;



printf("Nom ?\n");

scanf("%s", nom);



printf("Mâle ou Femelle ? (M/F)\n");

scanf("%s", sexe);





if (sexe == 'M' || 'm')

{

printf("Bonjour Monsieur %s", nom);

}



else if (sexe == 'F' || 'f')

{

printf("Etes-vous mariée ? (O/N)\n");

scanf("%s", statut);



if (statut == 'O' || 'o')

{

printf("Bonjour Madame %s", nom);

}



else

{

printf("Bonjour Mademoiselle %s", nom);

}

}



else

{

printf("vous êtes un extraterrestre!");

}



return 0;

}[/code]



J'oubliais le message du compilateur :


-------------- Build: Debug in madame_monsieur ---------------

Compiling: main.c

/home/simon/Bureau/Code::Blocks/madame_monsieur/main.c: In function ‘main’:


/home/simon/Bureau/Code::Blocks/madame_monsieur/main.c:25: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’

/home/simon/Bureau/Code::Blocks/madame_monsieur/main.c:14: warning: ‘sexe’ is used uninitialized in this function[/color]

Linking console executable: bin/Debug/madame_monsieur

Output size is 8,99 KB


0 errors, 3 warnings[/color]






Je remarque que le problème vient des scanf.

D'où ces questions :



Quand je veux scanner une chaine de caractère (nom), est ce que je dois faire :


OU


(Est-ce qu'il faut mettre le "&" ?)



Et ensuite, quand je fais le "printf", est-ce que je dois, ou non, mettre le "&nom" à la fin ou est-ce que le "nom" suffit ?





J'ai quand même fait des recherches moi-même (j'avais déjà cherché avant mais là j'ai trouvé un truc concret !).

Voilà ce que j'ai trouvé : Sdz : La série de texte sécurisée (ou utilisation de fgets)



Est-ce que cela pourrait-être une solution ?

#8 MikeFr

MikeFr

    Membre occasionnel

  • Membres
  • Pip
  • 82 messages

Posté 04 mai 2010 - 08:49

Salut Esprit!

Alors pour répondre a ta question, quand tu fais un scanf : tu me le & et quand tu fais un printf : tu le met pas! ^^

En faites c'est un pointeur que tu passe au scanf, par exemple :
Tu as ta variable nom.
Quand tu fais scanf("%s", &nom) => tu lui dit "met le %s a l'adresse memoire suivante &nom"
Quand tu fais printf(nom) => tu lui dis juste "affiche ce qu'il y a dans nom"

Voila je sais pas si mes explications sont juste mais la je suis au boulot et je suis fatigué mdr!

Good Luck, Dude!

#9 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise
  • Interests:Electronique / Informatique / Robotique / BD / et surtout les boissons fermentées au houblon

Posté 04 mai 2010 - 08:54

Salut Esprit,



Alors j'ai testé ton programme... Effectivement il y a quelques petits soucis, mais pas bien grave.



D'abord, ce qui ne saute pas tout de suite au yeux, c'est que lorsque tu exécute ton cote (si il est juste), et qu'il fait tous les tests, il va sortir, donc tu n'a pas le temps de voir les opérations puisque qu'il n'y a pas de boucles ou d'attente utilisateurs. Ceci est du à l'instruction : return 0




return 0

[/code]



En C tu as la possibilité de mettre une pause, pour cela il faut faire appel à une fonction système, la voici :




system("pause");

return EXIT_SUCCESS;

[/code]



Avec ceci tu pourra voir ce qui est affiché. Mets ceci à la place de ton return 0.



ensuite pour tes fonctions de tests pour savoir le sexe, etc, tu es bien parti pour accepter les 2 écriture (majuscule / minuscule), il faut simplement mettre 2 tests dans le if... Voici ce que ca donne :


if ((sexe == 'M') || (sexe == 'm'))

{

blablbla;

}

[/code]



Voilà ce que j'ai déjà remarqué...



Bon courage





PS: effectivement, la fonction scanf() déconne un peu et je sais pas pourquoi, alors voila un petite astuce:


while(getchar() != '\n');

scanf("%c", &sexe);

[/code]



Voilà un début d'explication (fonction scanf) sur la fonction scanf, mais j'arrive toujours pas à comprendre pourquoi ca veut pas passer car si on mets qu'un nom, le buffeur doit se vider avec la fonction scanf ???



Si jamais, ton code tourne avec ces quelques petites corrections, je veux pas le balancer pour le moment car je pense qu'il n'y aurait aucun intérêt à du copier-coller, mais si vraiment bloqué... je te le mets à dispo. Tiens nous au courant.



#10 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique
  • Interests:La robotique !

Posté 04 mai 2010 - 05:36

Mon code marche ! ;)

Il y a certainement des améliorations à faire mais voilà la version actuelle.


#include
#include

int main()
{
char nom[20];
char sexe, statut;

printf("Nom ?\n");
scanf("%s", nom);

printf("Mâle ou Femelle ? (M/F)\n");

do
{
scanf("%c", &sexe);
} while ((sexe != 'M') && (sexe != 'm') && (sexe != 'F') && (sexe != 'f'));
/* On peut aussi mettre :
} while ((sexe == 'M') || (sexe == 'm') || (sexe == 'F') || (sexe == 'f'));
(De Morgan !)*/


if ((sexe == 'M') || (sexe == 'm'))
{
printf("Bonjour Monsieur %s.", nom);
}

else // if ((sexe == 'F') || (sexe == 'f'))
{
printf("Etes-vous mariée ? (O/N)\n");

do
{
scanf("%c", &statut);
} while ((statut != 'O') && (statut != 'o') && (statut != 'N') && (statut != 'n'));


if ((statut == 'O') || (statut == 'o'))
{
printf("Bonjour Madame %s.", nom);
}

else // if ((statut == 'N') || (statut == 'n'))
{
printf("Bonjour Mademoiselle %s.", nom);
}

}

return EXIT_SUCCESS;

}[/code]


[edit : Heureusement que je me suis relu, il restait des erreurs..

Merci à Webshinra du coup de main et du temps passé ce matin à essayer de me faire comprendre ce que j'aurais du apprendre en cours depuis septembre. :p




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users