joel: sa console montre qu'on saute pas de scanf, on les a tous, mais uniquement pour i==2
Hello,
voici, a mon avis, une liste de choses a revoir
-le typedef est inutile, il est un embarras et une source de confusion pour les débutants. la définition struct est bien suffisante, struct toto est un type tout a fait acceptable pour le compilateur.
-le passage en paramètres de structures est une chose tout a fait fonctionnelle, mais a éviter quand on débute, car elle s'accompagne de génération de code bien plus complexe que si on s'en passe.
-pour moi, ce code n'a qu'un but: t'éviter de parler de pointeurs et tableaux, alors que ceux ci sont une notion fondamentale et facile a utiliser dans ton cas.
-et surtout, il montre que tu n'as pas compris le but d'une boucle. Ce n'est pas une critique négative, c'est naturel quand on commence.
Une boucle sert a répéter un traitement PARFAITEMENT IDENTIQUE. Or ici, tu as un problème, car tes données doivent aller dans des endroits différents: personne 1 et personne deux. Tu as donc été obligé d'utiliser des IF pour différencier les traitements de ta boucle inutile.
Truc intéressant numero 1: ne pas confondre affectation (i=3) et test d'égalité (i==3) qui retourne 1 (vrai) si i vaut 3, et 0 (faux) sinon
Truc intéressant numéro 2: en C, une affectation (i=3) est aussi une expression qui vaut le résultat de l'affectation, ici 3
donc par exemple (i=3)+2 est "valable" et vaut 5
0 est compris comme FAUX, tout le reste (1,2,3...) est compris comme VRAI
Quand tu écris for(A;B;C) { instructions} en fait le compilateur le TRADUIT comme:
A
while(B)
{
instructions
C
}
Donc que se passe t il chez toi
on exécute A
i=0
test B: i=2
ce n est pas un test, mais une affectation, on met 2 dans i, le résultat est différent de zéro donc vrai, on exécute les instructions
instructions: on exécute le cas correspondant a i==2
on passe a C: i++
on recommence
on refait le test B: i=2
ce n est pas un test, mais une affectation, on met 2 dans i, le résultat est différent de zéro donc vrai, on exécute les instructions
instructions: on exécute le cas correspondant a i==2
on passe a C: i++
on recommence
etc
etc
etc
Donc tu as deux options:
-soit te passer de cette boucle, qui, honnêtement, ne sert a rien dans cette structure de programme
-soit construire un programme qui a besoin de cette boucle, avec des constructions plus utiles.
Etant donné que tu sembles très débutant, je suppose que c'est plutot l'option 1 qui te servira. Voici un programme corrigé dans cet objectif:
Code : Tout sélectionner
#include <stdio.h>
#include <stdlib.h>
#define NOMBRE_UTILISATEUR 2
struct Personne
{
char prenom[100];
char nom[100];
char adresse[200];
int age;
int sexe; //1 pour garson, 2 pour fille, 0 pour NB
};
void data_asker (struct Personne utilisateur1, struct Personne utilisateur2)
{
printf("Quel est votre nom utilisateur 1 ?\n");
scanf("%s", utilisateur1.nom);
printf("votre prénom ?\n");
scanf("%s", utilisateur1.prenom);
printf("votre adresse ?\n");
scanf("%s", utilisateur1.adresse);
printf("Votre âge ?\n");
scanf("%d", &utilisateur1.age);
printf("U1 OK\n");
printf("Quel est votre nom utilisateur 2 ?\n");
scanf("%s", utilisateur2.nom);
printf("votre prénom ?\n");
scanf("%s", utilisateur2.prenom);
printf("votre adresse ?\n");
scanf("%s", utilisateur2.adresse);
printf("Votre âge ?\n");
scanf("%d", &utilisateur2.age);
printf("U2 OK\n");
printf("L'utilisateur 1 s'appelle %s %s\n Il habite au %s\n Il a %d ans\n", utilisateur1.prenom, utilisateur1.nom, utilisateur1.adresse, utilisateur1.age);
printf("L'utilisateur 2 s'appelle %s %s\n Il habite au %s\n Il a %d ans\n", utilisateur2.prenom, utilisateur2.nom, utilisateur2.adresse, utilisateur2.age);
}
int main()
{
struct Personne utilisateur1, utilisateur2;
data_asker(utilisateur1, utilisateur2);
return 0;
}
Ce code est... probablement fonctionnel mais hautement inefficace. Pour ton objectif il te faut continuer par apprendre les tableaux et les pointeurs, c'est absolument indispensable si tu veux pouvoir gérer un nombre arbitraire d'éléments. J'attends ton retour!
(pour les autres: la notion d'objet est indépendante du langage, la "masquer" me semble irréaliste et très réducteur; de plus il ne faut pas oublier que tout algo est beaucoup plus facile a concevoir une fois que la structure de données a utiliser est claire... placer une fonction dans une structure, c'est pas du tout le sujet de ce topic a mon avis...)