[Debutant] exo comprenant tableau et structure

exo comprenant tableau et structure [Debutant] - C - Programmation

Marsh Posté le 03-08-2004 à 20:50:38    

Bonjour,
 
Voila j'ai un exercice a faire. Celui consiste a mettre en ouevre, un programmen ou l on pourrais afficher et renseigner un carnet d adress.
Seul le nom, prenom, et numero telephonique est a renseigner.
La contrainte est d utiliser les tableaux ou les structure.
Si je viens poster, ici, c'est que nos supports de cours ne sont pas forcement tres complet. Et je suis venu ici lire pas mal de tuto, mais malgré cela, je trouve des difficulte a ecrire mon programme.
Voila ce que ca donne actuellement :
 

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. struct personne
  4. {
  5. char nom[20];
  6. char prenom[20];
  7. char tel[10];
  8. };
  9. int main()
  10. {
  11. printf("Combien de personne voulez-vous entrer dans la base : " );
  12. scanf("%d",&nombre_de_personne);
  13. }


 
Donc comme vous pouvez le voir c'est pas fameux, meme horrible.
Donc si vous pouvez m'orienter  :jap:


Message édité par bubblegum le 03-08-2004 à 20:51:46
Reply

Marsh Posté le 03-08-2004 à 20:50:38   

Reply

Marsh Posté le 03-08-2004 à 21:03:51    

Il te reste à créer un tableau assez grand dont les éléments sont de type "personne": personne tab[100] par exemple.
 
Ensuite, tu crées une fonction qui va demander à l'utilisateur de renseigner les champs nom, prénom et tel d'une personne (en vérifiant la longuer et la validité des valeurs entrées, et tu vas coller cet élément nouvellement créé dans une case de ton tableau.
Enfin, tu crées une fonction qui va afficher successivement tous les éléments du tableau.
A toi de jouer maintenant.


Message édité par el muchacho le 03-08-2004 à 21:04:34

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 03-08-2004 à 21:21:03    

Voila ce que ca donne maintenant :

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. struct personne
  5. {
  6.      char nom[20];
  7.      char prenom[20];
  8.      char num[10];
  9. };
  10.  
  11. int main()
  12. {
  13.     printf("Combien de personne voulez-vous entrer dans la base : " );
  14.      scanf("%d",&nombre_de_personne);
  15. }
  16. Char tab [100]
  17. printf("Entrer le nom de la personne :" );
  18. scanf("%s", nom);
  19. printf("Entrer le prenom de la personne :" );
  20. scanf("%s", nom);
  21. printf("Entrer le numero de telephone de la personne :" );
  22. scanf("%s", num);
  23. }


 
Parcontre de cette maniere, je sais aps comment vont s enregistrer les donnes ; si les variables sont bien incrementer dans le taleau.
Et je ne sais pas comment faire sortir les informations du tableau

Reply

Marsh Posté le 03-08-2004 à 22:35:28    

c'est n'imp. insère un fflush(stdout); entre tes printf et scanf

Reply

Marsh Posté le 03-08-2004 à 23:22:44    

je connais pas cette fonction ...


Message édité par bubblegum le 03-08-2004 à 23:22:51
Reply

Marsh Posté le 04-08-2004 à 10:02:00    

mais c'est quoi ce code enfin ? [:mlc]
je veux bien que tu débutes, mais y'a quand même des limites !
en vrac :
- aucune variable de type "personne" déclarée,
- variable "nombre_de_personnes" non déclarée,
- pas de controle de dépassement des buffers (nom, prenom, num),
- code en dehors du main,
- pas de fflush(stdout) après chaque printf,
- "Char" au lieu de "char",
- variable "nom" utilisée 2 fois,
- etc...
'serait bon de reprendre tes cours depuis le début :/


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 04-08-2004 à 18:06:27    

Pas de problème
 
Lorsque tu as créé ta structure "personne", tu as automatiquement créé un nouveau type (comme char, int, double, etc) qui se nomme "struct personne"
Tu peux donc maintenant te définir un tableau de par exemple 1000 éléments de ce type => struct personne annuaire[1000];
En décomposant cette ligne, tu as ici un tableau nommé "annuaire" comprenant 1000 éléments et chaque élément est de type "struct personne"
 
Ensuite, tu peux faire saisir le nombre d'éléments un peu comme tu avais fait et boucler pour remplir et/ou afficher
 
Ton programme pourrait donc être
 

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. struct personne
  4. {
  5. char nom[20];
  6. char prenom[20];
  7. char tel[10];
  8. };
  9. int main()
  10. {
  11. /* Je déclare les variables dont j'ai besoin */
  12. int nb, i;
  13. struct personne annuaire[1000];
  14. /* Je fais saisir mon nombre d'éléments */
  15. printf("Combien de personne voulez-vous entrer dans la base (pas plus de 1000 SVP): " );
  16. fflush(stdout);
  17. fflush(stdin);
  18. scanf("%d",&nb);
  19. /* Je fais saisir ma base */
  20. for (i=0; i < nb; i++)
  21. {
  22.  printf("Nom de la personne %d :", i + 1);
  23.  fflush(stdout);
  24.  fflush(stdin);
  25.  scanf("%s", annuaire[i].nom);
  26.  printf("Prénom de la personne %d :", i + 1);
  27.  fflush(stdout);
  28.  fflush(stdin);
  29.  scanf("%s", annuaire[i].prenom);
  30.  printf("Tel de la personne %d :", i + 1);
  31.  fflush(stdout);
  32.  fflush(stdin);
  33.  scanf("%s", annuaire[i].tel);
  34. }
  35. /* J'affiche ma base */
  36. for (i=0; i < nb; i++)
  37. {
  38.  printf("Nom de la personne %d: %s\n", i + 1, annuaire[i].nom);
  39.  printf("Prénom de la personne %d: %s\n", i + 1, annuaire[i].prenom);
  40.  printf("Tel de la personne %d: %s\n", i + 1, annuaire[i].tel);
  41. }
  42. }


 
Tu remarqueras que je boucle de 0 à "nb - 1" car, en C, un tableau commence à 0. Cependant, j'affiche le nombre "i + 1" pour avoir à l'écran un affichage "naturel"
 
Les "fflush" sont là pour vider les buffer lors d'une saisie.
1) Je vide le buffer écran (stdout) après mon "printf" comme cela, mon invite "entrez le machin..." s'affiche tout de suite. Sinon, elle ne s'affiche que lorsque le buffer est plein et tu as alors un décalage entre les questions et les réponses
2) Je vide le buffer clavier (stdin) avant chaque "scanf" comme cela, mon clavier est bien vide et je suis certain que la variable récupère bien ce que je tape et non un résidu d'une saisie précédente
 
Remarque: Il est assez usuel de faire commencer le nom de ses structures par la lettre "s_". Comme cela, on voit facilement qu'il s'agit d'une structure et on ne confond pas le nom de la structure avec le nom d'une variable => struct s_personne au lieu de "struct personne"
 
:hello:

Reply

Marsh Posté le 04-08-2004 à 18:29:25    

Sve@r a écrit :


2) Je vide le buffer clavier (stdin) avant chaque "scanf" comme cela, mon clavier est bien vide et je suis certain que la variable récupère bien ce que je tape et non un résidu d'une saisie précédente

mais bordel soit cohérent avec toi même, un coup tu flush pour forcer l'affichage à l'écran (finalisation des écritures en attente), un coup tu flush pour tout effacer .... aller, dégage ces flush(<flux entrant> )

Reply

Marsh Posté le 04-08-2004 à 18:48:13    

1) je fflush l'écran pour avoir tous mes affichages illico
2) je fflush le clavier pour qu'il soit vide avant la saisie
Ce ne sont pas les mêmes buffers !!!


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-08-2004 à 18:54:48    

tu vois, t'es pas cohérent. un coup tu veux être sur que le contenu du buffer est bien pris en compte, l'autre tu veux qu'ils soit foutu à la poubelle ...
 
 
fflush(<flux entrant> ) est un non-sens

Reply

Marsh Posté le 04-08-2004 à 18:54:48   

Reply

Marsh Posté le 04-08-2004 à 19:10:49    

Je prends en compte le buffer "écran", et je mets à la poubelle le buffer "clavier". Ce ne sont pas les mêmes buffers !!!


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-08-2004 à 19:17:48    

déjà tu ne fais rien du tout avec le buffer de stdin. et dailleurs, c'est confirmé, tu ne sais pas ce qu'est un buffer. si tu veux rajouter des instruction qui ne font rien, tu peux truffer ton code de ((void)0); ça sera aussi efficace que fflush(stdin);

Reply

Marsh Posté le 04-08-2004 à 19:22:49    

Je viens juste de rentrer, et j'ai de belles reponses.
 :jap:  
 
Je vais etudié tout ca !
 
et pour revoir els cours, sa va etre dur, car comme dit plus haut, pas tor de support, je me debrouille plus avec google.

Reply

Marsh Posté le 04-08-2004 à 19:28:52    

Taz a écrit :

déjà tu ne sais pas ce qu'est un buffer.


Je te l'accorde, je ne sais pas tout. D'ailleurs, qui peut se vanter de tout connaître en prog à part toi du haut de tes 21 ans ?


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-08-2004 à 19:34:11    

Sve@r a écrit :

Je te l'accorde, je ne sais pas tout. D'ailleurs, qui peut se vanter de tout connaître en prog à part toi du haut de tes 21 ans ?


Moi  :o

Reply

Marsh Posté le 04-08-2004 à 19:37:48    

t'as un "int main" mais tu renvoies rien... un petit return 0; a la fin serait de bon [:aloy]


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 04-08-2004 à 19:38:24    

Sve@r a écrit :

Je te l'accorde, je ne sais pas tout. D'ailleurs, qui peut se vanter de tout connaître en prog à part toi du haut de tes 21 ans ?


 
21 ans ? [:forummp3] sale n00b


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 04-08-2004 à 19:45:37    

BuBBleGuM a écrit :

[...]

Code :
  1. [...]
  2. struct personne
  3. {
  4. char nom[20];
  5. char prenom[20];
  6. char tel[10];
  7. };
  8. [...]


[...]

Est-ce que (par hasard) tu n'aurais pas oublié de tenir compte du fameux '\0' en fin de chaîne ?
 
Par exemple pour le numéro de téléphone tu as dû compter 10 chiffres. Dans ce cas il faut utiliser une chaîne de 10 + 1 caractères. Le dernier servant à indiquer la fin de la chaîne.


Message édité par darkoli le 04-08-2004 à 19:45:57

---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 04-08-2004 à 19:45:50    

Sve@r a écrit :

Je te l'accorde, je ne sais pas tout. D'ailleurs, qui peut se vanter de tout connaître en prog à part toi du haut de tes 21 ans ?

le problème ça n'est pas l'âge, c'est que tu m'expliques depuis une page ce que tu fais avec fflush() (que tu ne connaissais pas en début de topic) alors que tu ne sais même pas ce que fais fflush et sur quoi elle travaille. Si t'as des questions, pose les, mais arrête de raconter des bêtises.

Reply

Marsh Posté le 04-08-2004 à 20:07:08    

Le sujet initial était d'aider un débutant à programmer une saisie et affichage d'une structure. Evidemment, j'ai donné un exemple simple de code. je n'ai pas pris en compte si le nb dépassait 1000 et/ou si la saisie dépassait la zone de stockage...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-08-2004 à 20:16:57    

le truc c'est que tu débutes autant que lui. ne jamais utiliser scanf+%s ou gets. utilise fgets. fflush(stdin) est un non-sens. vive malloc

Reply

Marsh Posté le 04-08-2004 à 20:56:17    

pourquoi tu dis pas tout  simplement que fflush( <input stream> ) n'a pas de comportement decris dans le standard
 
c'est pas seulement une ligne inutile, ca peux en plus planter sur certain systemes
 
par contre sous windows (vc++), il est important de remarquer que fflush à un comportement definie pour un input stream, mais ce n'est pas standard
 
http://msdn.microsoft.com/library/ [...] fflush.asp

Reply

Marsh Posté le 04-08-2004 à 21:22:52    

ça a certainement un certain comportement quelque part, seulement cette façon de tout balancer, c'est complètement porc. il se passe quoi le jour ou tu appelles ton truc avec un  pipe, etc ... c'est cradingue, ça revient à dire 'saisissez autant que vous voulez, même si c'est valide, je jète tout, parce que je suis trop idiot pour manier plus d'une ligne à la fois'. quand je tombe sur un programme comme, je cherche meme pas. a.exe < random et vlan segfault. 'culé :o

Reply

Marsh Posté le 04-08-2004 à 21:42:23    

Taz au pouvoir !

Reply

Marsh Posté le 04-08-2004 à 21:43:50    

moi je suis ok avec ca

Reply

Marsh Posté le 05-08-2004 à 08:21:22    

WhatDe a écrit :

Taz au pouvoir !


 
 :lol:  :lol:  :lol:  :lol:  [:skylight]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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