Stucture,pointeurs en c

Résolu
sdiri_med Messages postés 18 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 31 octobre 2010 - 7 nov. 2008 à 23:48
tarkos01 Messages postés 10 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 17 novembre 2008 - 17 nov. 2008 à 20:35
salut pr tou l'monde
qui peux m'aidé a resoudre se probléme en c ala base des structures & les pointeur  :
1 /  écrire un tableau de 20 éléments (etudiants).un etudiant et défini par son :
nom
prénom
spécialité
CIN =>un nbre  entier
NCE=>un nbre  entier
niveau=>chiane de caractéres
groupe=>un nbre entier
moyen général=>float
2 / saisir les 20 etudiant en utilisant un pointeur sur le tableau d'étudiants
3 / afficher les etudiants dont le nom commence par 'c'.
vrément c trés urgent pour moi d'une part pour amélioré mon note de test deuxiement en regardent le code source j'vai comprendre mieux cette partie en c 
merci bcp d'avence

7 réponses

tarkos01 Messages postés 10 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 17 novembre 2008
8 nov. 2008 à 02:15
Pour commencer je te conseillerai d'utiliser struct avec typedefcela va t'éviter de réécrire partout "struct".

exemple de définition d'une structure:

typedefstruct Nom_de_ta_structure Nom_de_ta_structure; /*(ce n'est pas une erreur il y a 2 fois le nom de la structure séparé par un espace terminé par un point virgule).*/
struct Nom_de_ta_structure {
         char nom[taille]; //à toi de fixer la taille du tableau
         char prenom[taille]; //idem
         long CIN;
         long NCE;
         ...
}; //il est importante de mettre le point virgule après l'accolade

 /*par contre il faut aussi initialiser toutes

déclaration interne à ta structure; faut le faire avec des boucles c'est plus rapide*/

/*mais si tu veux que ce soit manuel pour cet exemple il faut proceder comme ca*/
Nom_de_ta_structure Nom_de_ta_variable = {"","",0,0};/*2 guillement pour les char et 0 pour les nombres*/

/*tu déclare un tableau de 20 Nom_de_ta_structure*/
void fonction_exemple (void){
Nom_de_ta_structure tab[19];
tab[0] . nom = "chaîne nom";
tab[0].prenom = "chaîne prenom";
tab[0] . CIN = 100;
   ...
}

j'espers t'avoir deja aidé poru la comprehension de structures. corrigez s'il ya des erreurs merci.

TaRkOs
3
tarkos01 Messages postés 10 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 17 novembre 2008
16 nov. 2008 à 05:41
voila amigo en espérant que ca t'aide sous inux ca tourne sous windows je ne saurai pas te dire :)

/*Includes*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<float.h>

/*Protoypes: ils te permettent de rendre tes fonctions flexibles tu pourra mettre tes fonctions apres le main par exemple c'est pour dire o compilateur que cette fonction existe*/
void netoyer (void);
void lettrec (void);
int test (void);

/* Définition de structure, je vois que tu es un pro maintenant :p */

typedef struct etud etud;
struct etud
{
  long cin;
  long nce;
  long niveau;
  float moyenne;
  char groupe[100];
  char specialite[100];
  char prenom[50];
  char nom[50];
} ;

/*Code*/

int main (){
  lettrec ();
  // test();
  return 0;
}

/* Fonction qui va vider la mémoire temporaire car je vois que tu aime les scanf ;) , scanf laisse souvent des "parasites" dans la mémoire tampon tres souvent ca provoque des erreurs pour la suite du code alors faut vider le cache a cahque fois que tu utilise scanf il y a une fonction qui fait deja ca : fflush() */

void netoyer (void){
  char junk[80];
  gets(junk);
}

/*A éviter les variables globales*/

void lettrec (){
  int i;
  int a=0, b=0;
  char *temp, *temp_maj;
  etud *tab;
  if((tab = malloc (19*sizeof(etud)))==NULL)/* on test l'allocation mémoire. ceci est un tableau t'inquiete pas :)) */
    fprintf(stderr,"allocation mémoire échouée");

  for(i=0;i<=6;i++)
    
    {
      printf("donner le nom de l'etudiant %d \n",i);
      fgets(tab[i].nom,255, stdin);/*Pour les chaines de caracter je te conseil plutot d'utiliser fgets.*/
      printf("donner le prenom de l'etudiant %d\n",i);
      fgets(tab[i].prenom,255, stdin);
      printf("donner le cin de l'etudiant %d\n", i);
      scanf("%ld",&tab[i].cin);
      netoyer();/*permet de vider les parasite dans la memorie temporaire*/
      printf("donner le nce de l'etudiant %d\n", i);
      scanf("%ld",&tab[i].nce);
      netoyer();
      printf("donner le niveau de l'etudiant %d\n", i);
      scanf("%ld",&tab[i].niveau);
      netoyer();
      printf("donner la moyenne de l'etudiant %d\n", i);
      scanf("%lf",&tab[i].moyenne);
      netoyer();
      printf("donner le groupe de l'etudiant %d\n", i);
      fgets(tab[i].groupe,255, stdin);
      printf("donner la specialité de l'etudiant %d\n", i);
      fgets(tab[i].specialite,255, stdin);
      
    }
  printf ("\n Nom commençant par 'c': \n");
  for (i=0;i<=6;i++){
    temp_maj = strchr(tab[i].nom, 'C');
    temp = strchr(tab[i].nom, 'c');/*on cherche avec strchr le caracter c*/
    if(((a = (temp - tab[i].nom))==0)||((b = (temp_maj - tab[i].nom))==0))/*un peu compliqué on soustrait le depar de la chaine avec la position de la lettre c que renvoi strchr si cette valeur vaut 0 ca veut dire que c est la premiere lettre du prenom*/
    printf("\n %s position dans le tableau: %d\n\n",tab[i].nom, i);
  }
  free(tab);/*On libere l'espace mémoire alloué*/
 
}
3
sdiri_med Messages postés 18 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 31 octobre 2010
8 nov. 2008 à 02:30
vraimment vraimment merci bcp un trés bon travail est une bonne explication j'vé faire le max pour faire un code correcte 
0
sdiri_med Messages postés 18 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 31 octobre 2010
15 nov. 2008 à 20:55
salut les pro salut tarkos01


voila mon code "compilateur devc++ der version sous windows vista " svp de corrigé mes fauttes et de me guidé NOTE: ce qu'il m'interesse le plus est la partie de pointeur sur le tableau de 20 etudiants comment je peux le crée et le manipulé sur la struct merci bien d'avence.


#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct etud etud;
 struct etud
 {
        long cin;
        long nce;
        long niveau;
        float moyenne;
        char groupe[3];
        char specialite[15];
        char prenom[15];
        char nom[15];
        } ;
struct etud *tab[19];

 int i=0;
          void lettrec (etud tab[])
 {

   
     for(i=0;i<20;i++)
  
     {
                      printf("donner le nom de l'etudiant num \n",i);
                      scanf("%s",&tab[i].nom);
                      printf("donner le prenom de l'etudiant\n",i);
                      scanf("%s",&tab[i].prenom);
                      printf("donner le cin de l'etudiant\n");
                      scanf("%d",&tab[i].cin);
                      printf("donner le nce \n");
                      scanf("%d",&tab[i].nce);
                      printf("donner son niveau\n");
                      scanf("%d",&tab[i].niveau);
                      printf("donner la moyenne\n");
                      scanf("%f",&tab[i].moyenne);
                      printf("donner son groupe\n");
                      scanf("%s",&tab[i].groupe);
                      printf("donner son specialité\n");
                      scanf("%s",&tab[i].specialite);
      } 

 for (i=0;i<19;i++)
{

if (*(tab[i].nom) = 'c')
 {
  printf("%s",*tab[i].nom) ;
}
}

}

 main ()
 {
  void lettrec (etud tab[]);
 getch();
 return(0);
}
0

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

Posez votre question
tarkos01 Messages postés 10 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 17 novembre 2008
15 nov. 2008 à 22:47
Salut sdiri_med,

pour la déclaration de ton tableau tu n'a pas besoin de mettre l'étoile devant car etud tab[19] est deja un pointeur qui pointe vers 19 types de ta structure "etud"

 for (i=0;i<19;i++) >>> tu veux verifier les 20 or dans cette boucle il va verifier de 0 a 18 il faut que utlise <=   for(i=0;i<=19;i++)
{

"if (*(tab[i].nom) = 'c')    "  >>>  cette partie doit etre une comparaison => if (tab[i].nom == 'c') ... mais ca ne devrait pas fonctionner ca tu compare un caracter à une chaine de caracters. il faut que tu inclus la librairie "string" => #include <string>
tu fais ensuite une comparaison avec strbrk ou je ne sais plus quelle est la 2eme fonction qui permet de rechercher un caracter dans une chaine et tu fais un test pour savoir si c'est le premier caracter.

 {
  printf("%s",*tab[i].nom) ;
}
}
  void lettrec (etud tab[]); je suppose que c'est le prototype si c'est le cas il faut le mettre apres les includes.
getch() je vois pas ce que ca fait la

je me penche sur ton code et quand je finis de tester je t'écris.
0
tarkos01 Messages postés 10 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 17 novembre 2008
16 nov. 2008 à 05:45
arf j'ai oublié de changer dans les boucles for il faut mettre 19 au lieu de 6

a deux endroits

TaRkOs Le FéRoCe
0
tarkos01 Messages postés 10 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 17 novembre 2008
17 nov. 2008 à 20:35
et l'allocation doit etre également a 20 et non pas 19. la fonction test ne sert a rien tu peux l'enlever.

TaRkOs Le FéRoCe
0
Rejoignez-nous