Aide débutant programmation en c

gentleman76 - Modifié par Whismeril le 21/07/2014 à 21:30
 gentleman76 - 23 juil. 2014 à 02:54
Bonjour,

Alors voila, j'ai voulu commence à apprendre a programmer en langage C j'ai commence il y a deux jours. Et j'essaie de crée un programme simple seul, afin de me perfectionner. Il y a un point sur le quel je n'arrive pas à me débrouiller :
j'aimerais que l'utilisateur et les choix d'entrer deux type de demande:
soit :
scanf("%d %d %d", &jour, &mois, &annee);

ou
 scanf(" %s, prenom)

Ce que j'ai reussi avec la fonction :
scanf("%d %d %d", &jour, &mois, &annee) || scanf(" %s, prenom)


Cependant par la suite, je voudrais que si cette personne est rentrée un prenom, il s'affiche une unique phrase:
 printf('' vous vous appelez donc %s, vous ete ne un .... ", prenom) 

ou si il rentre une date : que sa affiche
printf(" vous etes donc ne le %d %d %d, jour, mois, annee)


j'ai donc essayer avec la fonction if...else :
if(scanf("%s", prenom))
{
    printf("Vous vous appelez donc %s\n", prenom);
}
else
{
    printf("Vous etes donc nes le %d %d %d\n", age, mois, annee);
}

Mais dans ce la la console me demande de rentrée un prénom ET une date avant de pouvoir continuer. De plus les deux message s'affiche.
C'est pourquoi je vient vers vous pour savoir quand je pourrait remédier à se problème.
Merci d'avance, un très grand novice en programmation.

14 réponses

jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
21 juil. 2014 à 19:30
Merci de bien vouloir utiliser la coloration syntaxique (les balises de code) lorsque tu postes du code sur le forum.
Explications disponibles ici :
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
0
NB : De plus par la suite j'aimerais que si cette personne rentre un prenom, que le programme identifie le prenom et lui assimile une date pré-enregistrer.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
21 juil. 2014 à 21:34
Bonsoir, je ne faits pas de C et n'ai donc pas de réponse à ta question.

Mais à la phrase
'ai voulu commence à apprendre a programmer en langage C j'ai commence il y a deux jours.
je réponds: "Commence par le début alors!"
Voici un tuto pour débuter
http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-c

0
je sais, je me sert du site du zero pour apprendre comme bien d'autre site. Malgré tous je n'aime pas trop le site du zero depuis sa refonte, je prefere le tutoriel à ca 1er generation . ( j'avais commence à apprendre il y a quelque année mais j'ai vite arreter étant trop jeune).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
21 juil. 2014 à 21:42
Ha je te l'accorde depuis la refonte c'est plus pareil.
0
du coup je m'en sert, en lisant entre les lignes si on veut et j'apprend les fonction en les intégrant au fur et à mesure dans mon programme
Ca me permet de voir et comprendre plus facilement un programme . ( meme les programme fournie sur internet je les comprend plus facilement comme ça )
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
21 juil. 2014 à 21:55
Il n'empêche qu'en général, leur tutos sont bien faits parce qu'ils abordent les bases une à une.

J'ai fait comme toi au début, mais à un moment je me suis trouvé face à un mur parce que je n'avais pas les bases.
Du coup, il m'a fallut tout reprendre depuis le début, et je pense que c'est plus dur quand on a déjà de mauvaises habitudes.
Et en plus je me suis rendu compte que mes programmes étaient mal codés, et j'ai du tout refaire, finalement j'ai perdu beaucoup de temps et d'énergie.
0
Je pense pas que se soit une perte de temps et d'energie mais plus une expérience, ca ta permis une meilleur compréhension aussi je pense. après je te crois également :D
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
22 juil. 2014 à 18:20
Bonjour.

Pour répondre à la question:
scanf est une fonction qui renvoie le nombre d'entrées correctement lues.
(Attention, ça ne renvoie pas un booléen en mode "ok, pas ok").

Donc il te suffit juste de vérifier si tu as réussi à lire ou non autant d'entrées qu'attendu.
Exemple:
#include <stdio.h>

int main(void)
{
  char prenom[32] = {0};
  int jour = 0;
  int mois = 0;
  int annee = 0;
  int got = 0;

  got = scanf("%d %d %d", &jour, &mois, &annee);
  /* Si got < 0 alors erreur avec scanf, je ne le gère pas ici pour simplifier. Voir la doc de scanf. */
  if (got == 3)
  {
    printf("Vous etes donc nes le %d %d %d\n", jour, mois, annee);
    return 0;
  }

  got = scanf("%s", prenom);
  if (got == 1)
  {
    printf("Vous vous appelez donc %s\n", prenom);
    return 0;
  }

  printf("Impossible de recuperer une entree !\n");

  return 1;
}


Je te donne la solution "technique", mais le vrai problème n'est pas là.
Tu as un problème de "conception". C'est-à-dire que demander un prénom *si* on échoue à demander une date de naissance, est une mauvaise façon de faire (l'inverse est vrai aussi).
Si tu veux demander un prénom et une date, tu demandes les deux, à la suite, tout simplement, ou bien alors tu ajoutes un menu pour demander à l'utilisateur s'il veut entrer l'un ou l'autre.

PS: if...else n'est pas une fonction mais une structure de contrôle.
__________________________________________________________________________________________________
Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
Je te remercie de ta reponse et de tes conseil, et les donc suivie j'ai donc fait un menu qui me parrait clair :

void menu(){
printf("menu\n-------\n");
printf("1:Choisir un prenom\n");
printf("2:Choisir une date\n");
printf("3: sortie\n");
}

int main()
{
int choix, fin=1, prenom, date;
menu();
while(fin){
printf("quel est votre choix : \n");
scanf("%d", &choix);
switch(choix){
case 1: {prenom; printf("vous avez donc choisis prenom\n", prenom);} break;
case 2: {date; printf("vous avez donc choisis une datee\n", date);} break;
case 3: return 0;break;
default : {printf("ce choix n'existe pas ! \n");}
}
}

}
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 23/07/2014 à 00:17
Quelques mini-soucis/conseils à ajouter à ton code:
- En C (contrairement au C++), une fonction ne prenant pas d'argument s'écrit func(void) et non func(). En C, func() veut dire: je ne connais pas le nombre d'arguments, et func(void) veut dire: aucun argument. Je ne vais pas rentrer dans le détail, mais je te conseille d'être rigoureux et d'utiliser la bonne forme.
- Tu peux mettre le break dans les { } (ou pas, c'est toi qui choisi, ce n'est pas un souci, mais c'est important de se rendre compte que break n'est pas "local" à un scope. Traduction :p, tu peux mettre ton break où tu veux, il "cassera" la première boucle ou le premier switch qu'il rencontrera en "remontant").
- Pas besoin de break dans le cas 3, puisque tu as un "return", qui est débranchant. Le break est donc décoratif pour ce cas. Je mettrais, dans la logique, plutôt fin = 0 à la place du "return 0". Ce qui te fait quitter la boucle de manière un peu plus naturelle. Néanmoins, ce n'est pas faux pour autant.
- Les { } ne sont pas nécessaires pour un "case" (même si en mettre à des avantages, que tu verras par la suite). C'est considéré comme une bonne pratique d'en mettre.
- Attention, la fonction main retourne un entier, il faut donc faire un "return 0" à la fin de ta fonction. Dans la plupart des systèmes, ce numéro est un code de retour spécifiant si le programme s'est exécuté avec succès (0 voulant dire: pas d'erreur). Ne pas ignorer cette valeur, c'est potentiellement utilisé.
- Au niveau design de code, je laisserais le menu "écrire" et "poser" la question.
- Ceci: "Je suis une phrase", est équivalent à ceci: "Je" " suis" " u" "ne phr" "ase". Donc pas la peine de faire plein de printf pour revenir à la ligne.

Voici un aperçu (attention, non testé !):
#include <stdio.h>

int menu(void)
{
  int choix = 0;
  printf("menu\n-------\n"
         "1: Choisir un prenom\n"
         "2: Choisir une date\n"
         "3: Sortie\n"
         "Quel est votre choix:\n");
  scanf("%d", &choix);
  return choix;
}

int main(void)
{
    int fin = 1;
    char prenom[32] = {0};
    int date = 0;

    while (fin)
    {
       switch (menu())
       {
          case 1:
            scanf("%s", prenom);
            printf("vous avez donc choisis %s\n", prenom);
            break;
          case 2:
            scanf("%d", date);
            printf("Vous avez donc choisis une date %d\n", date);
            break;
          case 3:
            fin = 0;
            break;
          default:
            printf("Ce choix n'existe pas ! \n");
        }
    }

  return 0;
}


__________________________________________________________________________________________________
Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
Merci beaucoup pour t'es conseil, le code est beaucoup plus lisible de cette facon.

PS : j'aurais une derniere question. J'ai cherche grace à la bibliothéque time.h mais sans succès. Une manière de faire la difference entre la date rentré par l'utilisateur avec la date actuelle
sans pour autant que l'utilisateur est besoin de rentrée la date actuelle lui meme
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
23 juil. 2014 à 00:23
http://en.wikipedia.org/wiki/C_date_and_time_functions
Ou dans ton moteur de rechere préféré: "exemple date en C".

Pour "juste" afficher une date: "ctime", pour comparer une date avec une autre "difftime" (on ne le fait pas "à la main").
Attention, manier des dates est bien plus difficile que tu ne l'imagines. Je t'invite à ne pas trop t'attarder dessus, si tu n'as pas encore de solides bases en C.

__________________________________________________________________________________________________
Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
j'avais trouver difftime " pour comparer une date mais impossible de la faire marcher ^^, et j'ai utiliser "ctime" comme un ajout dans le menu pour plus de "beauté ".
mais j'avoue que la manipulation des dates sont hors de ma portée car j'ai du mal a comprendre. L'expérience me manque
0
Rejoignez-nous