Aide pour deux programmes en langage C

Fermé
TheFullMetal - 17 oct. 2008 à 17:18
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 1 nov. 2008 à 10:40
Bonjour,

Alors, voilà je sollicite votre aide pour deux programmes que je n'arrive pas à boucler : /

Commençons par le 1er :

Je dois coder en C un prog qui permet à l'utilisateur de saisir une grille de mots croiser dont le nombre de lignes et de colonnes sont fixées par l'utilisateur or je bloque sur l'utilisation des pointeurs :


void choix ligne ( int *x, int*y) // x nombre de ligne , y nombre de colonnes
{
printf("choisissez le nombre de lignes\n");
scanf("%i",&x);
printf("choisissez le nombre de colonnes\n");
scanf("%i",&y)
}
void saisie ( char t[x][y] ) //
{
int i;
int j;
printf ("saisie de la grille\n");
for (i=0;i<x;i++)
{
for (j=0;j<y;j++)
{
printf("ecrire le charactére de la ligne %i et de la case %i\n",i,j);
gets(&t[i][j]);
}
}
}
void affichage ( char t[x][y] )
{
int i;
int j;
for (i=0;i<x;i++)
{
for (j=0;j<y;j++)
{
printf("%c\n",t[i][j]);
}
}
}
void main ()
{
int i;
int t[x][y];d
saisie (t);
affichage (t);
}

donc je ne vois pas comment utiliser les nombres entrer par l'utilisateur pour définir mes deux tableaux .

==========================================================================================
Quand au 2nd programme il s'agit d'un sondage .

Il y a 50 titres et 150 personnes sondés.

Quand l'utilisateur rentre le numéros d'un titre je dois afficher le nombre de foi ou x personnes l'ont choisie en 1er choix et ensuite faire un trie entre les hommes , les femmes ( âgés de plus ou,de moins de 20 ans )

Sondage de personne
typedef struct personne
{
char sexe;
int age;
char nom[20];
char prenom[20];
int choix[5];
} tpersonne;
void saisie (tpersonne t[150])
{
int i;
int j;
for (i=0;i<150;i++)
{
printf("votre nom?\n");
gets (t[i].nom);
printf("votre prenom?\n");
gets (t[i].prenom);
printf("votre sexe?\n");
gets (t[i].sexe);
printf("votre age?\n");
scanf("%i",&t[i].age);
for (j=0;i<5;j++)
{
printf("quelle est votre choix?\n");
scanf("%i",&t[i].choix);
}
}
}
float titreposition ( tpersonne t[150], int titre, int position)
{
int i;
int cpt=0;
for (i=0;i<150;i++)
{
if ( t[i].choix[position-1]=titre)
{
cpt=cpt+1;
}
}
return cpt;
}
void calculpop (tpersonne t[150] , int t1[50] )
{
int i;
int j;
const int point[]={1,2,3,4,5};
for (i=0;i<50;i++)
{
t1[i]=0;
}
for (i=0;i<150;i++)
{
for(j=0;j<5;j++)
{
titre==t[i].choix[j];
t[titre-1]=t[titre-1]+point[j];
}
}
void top3 ( int pop[150], int pop3[3] )
{
int i;
int j;
for (i=0;i<2;i++)
{
pop3[i]=indiceplusgrand(pop);
pop[i][pop3]=0;
}
}
float indinceplusgrand ( int pop[150] )
{
int i;
int imax=0;
for (i=0;i<150;i++)
{
if (pop[i]>pop[imax])
{
imax=i;
}
}
return imax;
}
void main ()
{
tpersonne sond[150];
int pop[50];
int top3[3];
int position;
saisie (sond);
calculpop (sond,pop);
top3 (sond,top3);
printf("Recherche d'un titre en position donnée\n");
printf("entrez un titre");
scanf("%i",&titre);
printf("entrez la position du tire\n");
scanf("%i",&position);
printf("le titre %i",titre," à été cité %i", titreposition(sond,titre,pop),"en position %i",position);

Je ne voit pas mes erreurs :/
c'est pourquoi je vous remercie pour votre aide qui est la bienvenus :)
A voir également:

18 réponses

guillaume_74 Messages postés 111 Date d'inscription samedi 18 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 22
19 oct. 2008 à 22:43
pour le premier programme pour l'utilisation des pointeurs....
lorsque tu mets ma_fonction(int * bob){}
ca veut dire que la valeur de bob est une adresse mémoire qui sera envoyer en paramètre:
ma_fonction(&variable);
donc pas besoin de mettre scanf("%i",&bob)
parceque le & en gros, veut dire qu'on va écrire a l'adresse bob, comme on a déja l'adresse... on met directement bob

scanf("%i",bob);
si tu mets &bob, tu vas écrire a l'adresse du pointeur... c'est pas terrible ;)
1
oupsman Messages postés 316 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 10
17 oct. 2008 à 20:07
Pour ton premier programme :

1/ Les noms de fonctions ne doivent jamais comporter d'espace, tu peux utiliser à la place le tiret '-' (de la touche 6) ou l'underscore '_' (de la touche 8). Par exemple int nom_de_ma_fonction(.....);

2/ Essaies de donner des noms significatifs à tes variables, par exemple dans ta fonction void choix-ligne(int *x, int *y); il seraît plus judicieux d'écrire void choix-ligne(int *nligne, int * ncolonne);

Sinon c'est vrai que tu as un problème avec tes pointeurs, mais je vais essayer de compiler ton programme ensuite je reviendrai te donner des nouvelles. à +
0
oupsman Messages postés 316 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 10
18 oct. 2008 à 11:42
Voici une version qui marche pour ton premier programme, j'ai fais quelques changements auxquels tu peux réfléchir et adapter selon tes besoins :

1/ L'utilisation de la fonction gets(...) est déconseillé donc j'ai remplacé par scanf(...). Faire man gets pour en savoir la raison.

2/ #define indice_max 100 en dessous de #include<stdio.h> est une definition d'une variable qui sera à portée dans tout le programme que ce soit dans le main ou dans les autres fonctions hors du main.

Voici ma version :

#include<stdio.h>
#define indice_max 100

/**************************************************/
void ChoixLigne(int *nligne, int *ncolonne){ /* x nombre de ligne , y nombre de colonnes */
     printf("choisissez le nombre de lignes\n");
     scanf(" %d", nligne);
     printf("choisissez le nombre de colonnes\n");
     scanf(" %d", ncolonne);
}
/**************************************************/
/*NB : ton numero de ligne et colonne commence bien par Zero or l'utilisateur va peut-etre penser que ça commence par Un, donc j'ai changé le commentaire en disant a l'utilisateur d'entrer par l'exemple le caractere dans la case [1][1] mais dans le  programme, il le place dans la case [0][0]*/
void Saisie(char t[indice_max][indice_max], int ligne, int colonne){
   int i, j;
   printf ("Saisie de caracteres dans la grille\n");
   for(i=0 ; i<ligne ; i++){
       for (j=0 ; j<colonne ;  j++){
            printf("Ecrire le caractere de la ligne %d et de la colonne %d\n", i+1, j+1);
            scanf(" %c", &t[i][j]);
       }
   }
}
/****************************************************/

void Affichage(char t[indice_max][indice_max], int nligne, int ncolonne){
      int i, j;
      for(i=0 ; i<nligne ; i++){
           for(j=0 ; j<ncolonne ; j++){
                printf("%c ", t[i][j]);
           }
           printf("\n");
      }
}
/***************************************************/

int main(){
  int ligne, colonne;
  char t[indice_max][indice_max];
  ChoixLigne(&ligne, &colonne);
  Saisie(t, ligne, colonne);
  printf("\nVoici la grille :\n");
  Affichage(t, ligne, colonne);
  return 0;
}
/****************************************************/</gras>
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
21 oct. 2008 à 16:56
il vaudrais mieux mettre t en char** et le dimensionner correctement, sinon gare aux erreurs de débordement (ou alors controler la taille des lignes et des colonnes).
De plus, #define indice_max 100 ne défini pas une variable, mais une macro ! Qui dit macro dit remplacement dans le texte. à éviter au maximum ! Il vaux mieux faire un const int indice_max=100;
Des heures de recherches après une telle définition m'ont apris à les éviter comme la peste.
Par exemple, dans les méandre de windows.h il y a #define IN. Dans mon programme je fait "int IN;" et la compilation me renvois des erreurs bizarres.
0
TheFullMetal > Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023
21 oct. 2008 à 17:05
Merci pour ta réponse aussi rapide Char Sniper néanmoins je débute en programmation et je ne comprend
pas le : char** , que signifie t-il ?

PS: l'utilisation de la constante const int indice_max=100 se fait en déclaration de variable ? si oui dans le main ou dans chaque action ?
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298 > TheFullMetal
22 oct. 2008 à 08:43
disons que si tu débute en C, tu peux mettre de coté le char** pendant encore quelques temps (mais pas trop) il s'agît de la déclaration d'un pointeur sur un tableau à deux dimensions. L'intéret c'est que ce tableau soit de taille variable et que tu n'as pas à lui fixer une taille a priori. Le problème de ce genre de tableau, c'est qu'il faut lui allouer et libérer la mémoire. Ce genre d'opération est très commune en C, il faudra que tu y viennes un jour.

const int indice_max=100; se fait en déclaration de variable. Là comme ça remplace un #define le plus logique c'est de la mettre en tête de fichier dans la porté globale. Il faut savoir qu'en C une variable a une certaine durée de vie fonction de sa porté. La porté globale a la durée de vie du programme.
0
TheFullMetal
19 oct. 2008 à 10:40
Je te remercie je vais essayer sa demain :)
0
oupsman Messages postés 316 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 10
19 oct. 2008 à 22:21
Pour ton deuxième programme j'ai pas trop de temps pour corriger car tu ne mets aucun commentaire sur le rôle de tes fonctions.

Donc je ne peux corriger car même si je le fais, ça pourraît ne pas correspondre aux résultats que tu attends.

Alors soit tu expliques en détail ce que tu veux faire et je te corrige point par point, soit tu commentes bien tes fonctions ainsi que le résultat que tu attends.

à+
0

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

Posez votre question
TheFullMetal
19 oct. 2008 à 22:27
Oups, désoler j'ai poster mon programme trop vite et je me rend compte que je ne suis pas très compréhensible :/

Demain je commente les fonctions qui me posent problème et je décrie leurs rôles plus en détaille ;)
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
19 oct. 2008 à 22:28
et quand tu poste utilise aussi les balise code ( a coté du souligné) pour indenter car sinon c'est illisible...
0
TheFullMetal
21 oct. 2008 à 16:40
Merci pour l'aide je viens d'essayer , c'est bon ça marche nickel :)

Maintenant c'est pour le second que sa bloque pas mal : /

=============================================================================================

Description :

il s'agit ici de réaliser un sondage sous forme d'enregistrement regroupant :

-le nom

-le prénom

-l'âge

-le sexe

-le choix ( 5 titres parmi 50 ( les titres sont représentés par des numéros )

de la personne sondé

Ensuite de classer les titres celons leurs popularités et d'afficher le top 3.

Et finalement de permettre à l'utilisateur de savoir pour un titre donné sa position ainsi que le nom , le prénom , l'âge et le sexe des personnes qui l'ont choisie en 1er choix.


============================================================================================

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define Npers 150
#define Nc 5
#define Nbc 20
char s[150];

//Sondage de personne 


typedef struct personne // enregistrement du sondage avec Sexe, Age, Nom, Prénom et Choix sous forme de tableau
{

char sexe[20];
int age;
char nom[20];
char prenom[20];
int choix[5];
} tpersonne;
void saisie (tpersonne t[], int n) // Saisie du sondage 
{
int i;
int j;
for (i=0;i<n;i++)
 {
  printf("votre nom?\n");
  gets (t[i].nom);
  printf("votre prenom?\n");
  gets (t[i].prenom);
  printf("votre sexe?\n");
  gets (t[i].sexe);
  printf("votre age?\n");
  scanf("%i",&t[i].age); // /!\ ici il faudra choisir la 1er lettre par exemple si on rentre masculin il faudra juste lire m
  for (j=0;j<5;j++)
  {
   printf("quelle est votre choix?\n");
   scanf("%i",&t[j].choix);
  }
 gets(s);
 }
}
float titreposition ( tpersonne t[], int titre, int position, int n) // pour savoir combien de fois tel titre a été cité en tel dans le sondage
{
int i;
int cpt=0;
for (i=0;i<n;i++)
 {
  if ( t[i].choix[position-1]=titre)
  {
   cpt=cpt+1;
  }
 }
return cpt;
}
void calculpop (tpersonne t[] , int t1[50], int n  ) // Classement des titres les plus cités
{
int i;
int j;
int titre;
const int point[4]={1,2,3,4,5};
for (i=0;i<50;i++)
{
 t1[i]=0;
}
for (i=0;i<n;i++)
{
 for(j=0;j<5;j++)
 {
  titre==t[i].choix[j];
  t1[titre-1]=t1[titre-1]+point[j];
 }
}
}
float indiceplusgrand ( int pop[], int n) // Classe les titres du plus cités au moin cités
{
int i;
int imax=0;
for (i=0;i<n;i++)
 {
  if (pop[i]>pop[imax])
  {
   imax=i;
  }
 }
return imax;
}
void top3 ( int pop[], int pop3[3], int n ) // top 3 des titres du sondage
{
int i;
int j;
for (i=0;i<n;i++)
{
 pop3[i]=indiceplusgrand(pop);
 pop[i][pop3]=0;
 }
}

void main () // Action principale
{
int pop[50];
int pop3[3];
int position;
int titre;
int nb;
tpersonne*sond;
lib=(tpersonne*)malloc(nb*sizeof(tpersonne);
saisie (sond,nb);
calculpop (sond,pop,nb);
top3 (sond,pop3,nb);
printf("Recherche d'un titre en position donnée\n");
printf("entrez un titre");
scanf("%i",&titre);
printf("entrez la position du titre\n");
scanf("%i",&position);
printf("le titre %i",titre," à été cité %i", titreposition(sond,titre,pop,nb),"en position %i",position);
free (sond);



===========================================================================================

-Il manque la fonction d'affichage du nom, prénom des personnes ayant pris en 1er choix un des titres choisis par l'utilisateur

-De plus j 'aimerais que par exemple si lors de la saisie l'utilisateur tape "18" dans le nom ou inversement "toto" pour l'âge lui dire : "erreur veuillez recommencer"


Enfin merci d'avance ;)
0
oupsman Messages postés 316 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 10
21 oct. 2008 à 18:08
Salut,

D'abord dans ta fonction float titreposition ( tpersonne t[], int titre, int position, int n); tu dois retourner un float comme valeur de retour alors que dans cette fonction tu as déclaré int cpt; et à la fin tu fais return cpt;

Correction : soit tu déclares float titreposition ( tpersonne t[], int titre, int position, int n); et dans ce cas il faut aussi déclarer float cpt; dans la fonction. Soit tu déclares int titreposition ( tpersonne t[], int titre, int position, int n); càd que tu retournes un int au lieu de float.



Deuxièmement j'ai débogué ton programme et voici la version (TOUT CE QUE J'AI MODIFIÉ, TU PEUX VOIR EN COMMENTAIRE MES MODIFICATIONS DE CORRECTION AVEC EXPLICATION).

Troisièmement je vois que tu utilises encore la fonction gets(...);, je t'ai expliqué que cette fonction est déconseillé (faire man gets dans un terminal et tu comprendras, il s'agit d'un risque de dépassement du buffer).

Et dernièrement je vois que tu commences déjà à utiliser malloc(...); . C'est pour la gestion dynamique de la mémoire donc tu peux déjà virer l'utilisation des tableaux dans ta structure personne. càd au lieu de faire par exemple char nom[20]; il siffit de déclarer char * nom; ensuite tu utilises malloc pour allouer le nom.
Tu fais pareil pour tout ce qui est tabeau et utiliser des pointeurs indéfinis à la place.

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define Npers 150
#define Nc 5
#define Nbc 20
char s[150];

/*Sondage de personne */

/************************************************************************************/
typedef struct personne /* enregistrement du sondage avec Sexe, Age, Nom, Prénom et Choix sous forme de tableau*/
{
char sexe[20];
int age;
char nom[20];
char prenom[20];
int choix[5];
} tpersonne;

/*************************************************************************************/
void saisie (tpersonne t[], int n) /* Saisie du sondage  */
{
int i;
int j;
for (i=0;i<n;i++)
 {
  printf("votre nom?\n");
  gets (t[i].nom);
  printf("votre prenom?\n");
  gets (t[i].prenom);
  printf("votre sexe?\n");
  gets (t[i].sexe);
  printf("votre age?\n");
  scanf("%i",&t[i].age); /* /!\ ici il faudra choisir la 1er lettre par exemple si on rentre masculin il faudra juste lire m */
  for (j=0;j<5;j++)
  {
   printf("quelle est votre choix?\n");
   scanf("%i",t[j].choix); /*ICI TU AS ECRIS &t[i].choix ET J'AI CORRIGÉ*/
  }
 gets(s);
 }
}

/*********************************************************************/
float titreposition ( tpersonne t[], int titre, int position, int n) /* pour savoir combien de fois tel titre a été cité en tel dans le sondage */
{
int i;
int cpt=0;
for (i=0;i<n;i++)
 {
  if (t[i].choix[position-1] == titre) /*ICI TU AS MIS '=' AU LIEU DE '==' c'est un test et non une affectation*/
  {
   cpt=cpt+1;
  }
 }
return cpt;
}

/************************************************************/
void calculpop (tpersonne t[] , int t1[50], int n  ) /* Classement des titres les plus cités*/
{
int i;
int j;
int titre;
const int point[5]={1,2,3,4,5}; /*ICI TU AS DECLARÉ const int point[4]={1,2,3,4,5}; j'ai corrigé car tu déclare un tableau de 4 éléments alors que tu effectes 5 éléménts dans ce tableu donc un dépassement*/
for (i=0;i<50;i++)
{
 t1[i]=0;
}
for (i=0;i<n;i++)
{
 for(j=0;j<5;j++)
 {
  titre=t[i].choix[j]; /*ICI TU AS ÉCRIS titre==t[i].choix[j]; au lieu de titre=t[i].choix[j];   TU AS CONFONDU UN TEST AVEC UNE AFFECTATION*/
  t1[titre-1]=t1[titre-1]+point[j];
 }
}
}

/********************************************************************/
float indiceplusgrand(int pop[], int n) /* Classe les titres du plus cités au moin cités*/
{
int i;
int imax=0;
for (i=0;i<n;i++)
 {
  if (pop[i]>pop[imax])
  {
   imax=i;
  }
 }
return imax;
}

/*******************************************************************/
void top3 ( int pop[], int pop3[3], int n ) /* top 3 des titres du sondage*/
{
int i;
/*int j;*/ /*ICI LA VARIABLE j NE SERT A RIEN CAR TU NE L'UTILISE PAS donc je l'ai mis en commentaire*/
for (i=0;i<n;i++)
{
pop3[i]=indiceplusgrand(pop, n); /*ICI TU AS ECRIS pop3[i]=indiceplusgrand(pop); AU LIEU DE pop3[i]=indiceplusgrand(pop, n); LA FONCTION indiceplus grand prend 2 parametres et toit tu n'as mis qu'un seul donc j'ai rajouté n*/
 pop[i][pop3]=0;
 }
}
/**********************************************************/
int main () /* Action principale*/
{
int pop[50];
int pop3[3];
int position;
int titre;
int nb;
tpersonne * lib; /*TU AS OUBLIÉ DE DÉCLARER lib donc je l'ai rajouté*/
tpersonne * sond; 
lib=(tpersonne*)malloc(nb*sizeof(tpersonne));/*ICI TU AS OBLIÉ DE FERMER UNE PARENTHESE*/
saisie (sond,nb);
calculpop (sond,pop,nb);
top3 (sond,pop3,nb); /*ICI LA FONCTION top3 PREND EN PREMIER PARAMETRE UN TYPE tpersonne ALORS QUE NORMALEMENT CETTE FOCNTION DOIT PRENDRE EN PREMIER PARAMETRE UN TYPE int DONC IL FAUT CORRIGER*/
printf("Recherche d'un titre en position donnée\n");
printf("entrez un titre");
scanf("%i",&titre);
printf("entrez la position du titre\n");
scanf("%i",&position);
printf("le titre %i",titre," à été cité %i", titreposition(sond,titre,pop,nb),"en position %i",position);
return 0;
}

NB : TON PROGRAMME CONTIENT ENCORE PLUSIEURS BUGS CAR IL FAUT D'ABORD QUE TU MODIFIES TA STRUCTURE COMME JE L'AI EXPLIQUÉ ET ENSUITE ALLOUER CHAQUE POINTEUR.
0
TheFullMetal
21 oct. 2008 à 22:11
Merci pour ton aide oupsman :)

Donc l'enregistrement donne finalement :

   typedef struct personne // enregistrement du sondage avec Sexe, Age, Nom, Prénom et Choix sous forme de tableau
{
  char * sexe[]; // je laisse les [] pour me repérer etant encore néophyte avec les pointeurs pour ne pas confondre
  int  age;
  char * nom[];
  char * prenom[];
  int *  choix[]; // Si je sais que le sondé doit faire son choix parmis 5 titres , le  int *  choix[] je peut le remplacer par int choix[5] ?
} tpersonne;


Mais apres j'ai des doutes.
- dans mon Main , que dois-je faire ? car l'ordinateur ne c'est pas combien de charactére contient nom[], prenom[]
Dois-je faire ceci :
nt main () // Action principale
{
int pop[50];
int pop3[3];
int position;
int titre;
int nb;
tpersonne * lib; 
tpersonne * sond; 
tpersonne * nom;
tpersonne * prenom;
lib=(tpersonne*)malloc(nb*sizeof(tpersonne))


=====================================================================

PS 1 :Au risque de mettre une énorme erreur je m'en excuse c'est la 1er fois que j'utilise pointeurs & tableaux.

PS 2 : Je sais que ce n'est pas possible mais, par exemple :
Lors de la saisie des données du sondé par l'utilisateur celui-ci se trompe et tape "toto" dans la saisie de l'âge du sondé comment traduire en C :

void saisie (tpersonne t[], int n) // Saisie du sondage 
{
int i;
int j;
for (i=0;i<n;i++)
 {
  printf("votre nom?\n");
  gets (t[i].nom);
  printf("votre prenom?\n");
  gets (t[i].prenom);
  printf("votre sexe?\n");
  gets (t[i].sexe);
  printf("votre age?\n");
  si t[i].age différent d'un entier alors écrire ( " erreur veuillez retaper l'âge du sondé )
  scanf("%i",&t[i].age); 
  for (j=0;j<5;j++)
  {
   printf("quelle est votre choix?\n");
   scanf("%i",&t[j].choix);
  }
 gets(s);
 }
0
oupsman Messages postés 316 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 10
22 oct. 2008 à 11:10
Salut,

Par définition c'est quoi un tableau ? Un tableau n'est autre qu'un pointeur sur le premier élémént du tableau, autrement dit, si on déclare un pointeur sur un entier avec int * n;, c'est l'équivalent de int n[0];, n est une variable qui contient l'adresse d'un entier.

Donc pour ta structure tu peux faire ceci :

 typedef struct personne{
      char sexe];
      int  age;
     char * nom;
     char * prenom;
     int *  choix;
 } tpersonne;


Voici ce que tu dois faire pour travaille dans le propre pour créér une personne :

1) Je créé une personne en l'allouant dans la mémoire  :
   
   /*cette fonction créé une personne et renvoi l'adresse de la personne créée*/
   tpersonne * AllouePersonne(){
       tpersonne * la_personne_allouee;/*pointeur sur une personne*/
       la_personne_allouee = (tpersonne *)malloc(sizeof(tpersonne));    
 
       if(la_personne_allouee == NULL){/*si on n'a pas assez de mémoire sur la machine, je retourne NULL*/
           printf("\nImpossible d'allouer en memoire le type personne\n");
           return NULL;
       }/*c'est juste pour tester si l'allocation s'est bien déroulée, si pas de problème on continue l'étape suivante*/ 
       
       return la_personne_allouee; 
  }

  La fonction précédente ne retourne que l'adresse de la personne allouée, or dans la structure tpersonne on a encore des pointeurs tels que char * nom; char * prenom; DONC IL FAUT AUSSI LES ALLOUER EN MEMOIRE, CE QUI FAIT L'ALLOCATION DYNAMIQUE CONTRAIREMENT AU TABLEAU dans lequel on connait déjà à l'avance la taille du tableau. Ce n'est pas pratique car tu ne connais pas à l'avance le nombre de caractère du nom ou du prénom que l'utilisateur va saisir au clavier.

La solution est simple : 

Tu créés une fonction char * Saisie_Nom() :

     char * Saisie_Nom(){
             char nom_tmp[30];/**tableau temporaire pour mette le nom saisi par l'utilisateur*/
             int nbr_caractere; /*nombre de caracteres du nom qui sera saisi par l'utilisateur*/
             char * nom_a_renvoyer; /*le nom qu'on va renvoyer par la fonction*/
             
            printf("\nSaisir le nom de la personne :\n");
            scanf("%s", nom_tmp);
            nbr_caractere = strlen(nom_tmp);
            nom = Alloue_Nom(nbr_caractere);  /*le code de cette cfonction est juste en dessous*/        
            return nom;
     }

     char *  Alloue_Nom(int nbr_caractere){
           char * nom;
           nom = (char *)malloc(sizeof(char * nbr_caractere));/*NB : dans sizeof(... ) c'est une multiplication et non un pointeur càd  la taille d'un char multipliée par le nombre de caracteres*/ 
          return nom;
    }


2/ Tu fais pareil pour tout ce qui est nécessaire à allouer, par exemple le prenom, le choix ... etc
Et c'est à la fin que tu utilises toutes ces petites fonctions pour créér le type tpersonne
0
guillaume_74 Messages postés 111 Date d'inscription samedi 18 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 22
21 oct. 2008 à 23:06
tu peux regarder si le code ascii est bon:
je sais que ce n'est pas LA solution^^ mais ça doit marcher.
do{
printf("votre age?\n");
char tmp[3];
int j=0;
scanf("%s",tmp);
for(j;j<3;j++)
if(tmp[j]<48 && tmp[j]>57)
printf("c'est pas un chiifre");
en fait je fais nimp^^ mais c'est une piste lol

bref.... je suis fatigué^^ pas la motivation de réfléchir d'avantage, mais je ferai un truc du genre, et ensuite je le casterai pour le mettre dans la structure, bonne soirée ;)
0
TheFullMetal
23 oct. 2008 à 21:21
petit up pour signaler que le topique n'est pas mort mais, je fût pas mal pris ces derniers jous donc je regarderais plus en détaille vos aides demai.
0
TheFullMetal
24 oct. 2008 à 16:49
donc finalement si je récapitule bien, j'ai ceci :


typedef struct personne

{	char sexe;
	int  age;
	char * nom;
	char * prenom;
	int *  choix;
} tpersonne;

//=======================================================================================
{
    tpersonne * la_personne_allouee;
    la_personne_allouee = (tpersonne *)malloc(sizeof(tpersonne));    
       if(la_personne_allouee == NULL)
       {
        printf("\nImpossible d'allouer en memoire le type personne\n");
        return NULL;
       }
   return la_personne_allouee; 
}
 
 char * Saisie_Nom()
{
             char nom_tmp[30];
             int nbr_caractere; 
             char * nom_a_renvoyer; 
             
            printf("\nSaisir le nom de la personne :\n");
            scanf("%s", nom_tmp);
            nbr_caractere = strlen(nom_tmp);
            nom = Alloue_Nom(nbr_caractere);          
            return nom;
     }

 char *  Alloue_Nom(int nbr_caractere){
           char * nom;
           nom = (char *)malloc(sizeof(char * nbr_caractere));
          return nom;
}

//======================================================================================

char * Saisie_Prenom()
{
             char prenom_tmp[30];
             int nbr_caractere; 
             char * prenom_a_renvoyer; 
             
            printf("\nSaisir le prenom de la personne :\n");
            scanf("%s", prenom_tmp);
            nbr_caractere = strlen(prenom_tmp);
            prenom = Alloue_Prenom(nbr_caractere);          
            return prenom;
     }

 char *  Alloue_Prenom(int nbr_caractere){
           char * prenom;
           prenom = (char *)malloc(sizeof(char * nbr_caractere));
          return prenom;
}

//========================================================================================================================================

char * Saisie_Age()
{
             int age_tmp[30];
             int nbr_chiffre; 
             int * age_a_renvoyer; 
             
            printf("\nSaisir l'âge de la personne :\n");
            scanf("%s", age_tmp);
            nbr_chiffre = strlen(age_tmp);
            age = Alloue_Age(nbr_chiffre);          
            return nom;
     }

 char *  Alloue_Age(int nbr_caractere){
           int * age;
           age = (char *)malloc(sizeof(int * nbr_chiffre));
          return age;
}

//========================================================================================================================================

char * Saisie_Sexe()
{
             char sexe_tmp[30];
             int nbr_caractere; 
             char * sexe_a_renvoyer; 
             
            printf("\nSaisir le sexe de la personne :\n");
            scanf("%s", sexe_tmp);
            nbr_caractere = strlen(sexe_tmp);
            sexe = Alloue_Nom(nbr_caractere);          
            return sexe;
     }

 char *  Alloue_Sexe(int nbr_caractere){
           char * sexe;
           sexe = (char *)malloc(sizeof(char * nbr_caractere));
          return sexe;
}

//========================================================================================================================================

char * Saisie_Choix()
{
             int choix_tmp[30];
             int nbr_chiffre; 
             int * choix_a_renvoyer; 
             
            printf("\nSaisir le choix de la personne :\n");
            scanf("%s", choix_tmp);
            nbr_chiffre = strlen(choix_tmp);
            choix = Alloue_Choix(nbr_chiffre);          
            return choix;
     }

 char *  Alloue_Choix(int nbr_caractere){
           int * choix;
           choix = (char *)malloc(sizeof(int * nbr_chiffre));
          return choix;

}

//========================================================================================================================================
void saisie (tpersonne t[], int n) 
{
int i;
int j;
for (i=0;i<n;i++)
 {
  printf("votre nom?\n");
  gets (t[i].nom);
  printf("votre prenom?\n");
  gets (t[i].prenom);
  printf("votre sexe?\n");
  gets (t[i].sexe);
  printf("votre age?\n");
  scanf("%i",&t[i].age); 
  for (j=0;j<5;j++)
  {
   printf("quelle est votre choix?\n");
   scanf("%i",t[j].choix);
  }
 gets(s);
 }
}
//========================================================================================================================================

float titreposition ( tpersonne t[], int titre, int position, int n) /* pour savoir combien de fois tel titre a été cité en tel dans le sondage */
{
int i;
int cpt=0;
for (i=0;i<n;i++)
 {
  if (t[i].choix[position-1] == titre) 
  {
   cpt=cpt+1;
  }
 }
return cpt;
}

//========================================================================================================================================

void calculpop (tpersonne t[] , int t1[50], int n  ) /* Classement des titres les plus cités*/
{
int i;
int j;
int titre;
const int point[5]={1,2,3,4,5};
for (i=0;i<50;i++)
{
 t1[i]=0;
}
for (i=0;i<n;i++)
{
 for(j=0;j<5;j++)
 {
  titre=t[i].choix[j]; 
  t1[titre-1]=t1[titre-1]+point[j];
 }
}
}

//========================================================================================================================================

float indiceplusgrand(int pop[], int n) /* Classe les titres du plus cités au moin cités*/
{
int i;
int imax=0;
for (i=0;i<n;i++)
 {
  if (pop[i]>pop[imax])
  {
   imax=i;
  }
 }
return imax;
}

//========================================================================================================================================

void top3 ( int pop[], int pop3[3], int n ) /* top 3 des titres du sondage*/
{
int i;
for (i=0;i<n;i++)
{
pop3[i]=indiceplusgrand(pop, n);
 pop[i][pop3]=0;
 }
}
//========================================================================================================================================
int main () /* Action principale*/
{
int pop[50];
int pop3[3];
int position;
int titre;
int nb;
tpersonne * lib; 
tpersonne * sond; 
lib=(tpersonne*)malloc(nb*sizeof(tpersonne));
saisie (sond,nb);
calculpop (sond,pop,nb);
top3 (sond,pop3,nb);
printf("Recherche d'un titre en position donnée\n");
printf("entrez un titre");
scanf("%i",&titre);
printf("entrez la position du titre\n");
scanf("%i",&position);
printf("le titre %i",titre," à été cité %i", titreposition(sond,titre,pop,nb),"en position %i",position);
return 0;
}


Malheureusement lorsque je compile j'ai encore des erreurs de compilation notamment de déclaration ;(
0
TheFullMetal
25 oct. 2008 à 19:26
petit up :)
0
TheFullMetal
29 oct. 2008 à 19:20
up :)
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
30 oct. 2008 à 08:26
ça va toi !
Mets nous les erreurs au lieu des faire des "up". Tu peux au moins faire cet effort. C'est pas à nous de copier ton programme et de voir où il plante.
0
TheFullMetal
31 oct. 2008 à 11:25
@ Char Sniper :
Oui je suis désolé , je me suis un peu comporter comme un boulet je m'en excuse .

Alors, je ne vais pas vous mentir mais, je suis un peu perdu. C'est la première fois que j'utilise des pointeurs je suis un peu, voir beaucoup, dépassé .

J'ai essayé de corriger quelque erreur néanmoins je suis vite bloqué .

***************************************************************************************************

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct personne

{	char sexe;
	int  age;
	char * nom;
	char * prenom;
	int *  choix;
} tpersonne;

//=====================================================================
 tpersonne * AllouePersonne()
{
    tpersonne * la_personne_allouee;
    la_personne_allouee = (tpersonne *)malloc(sizeof(tpersonne));    
       if(la_personne_allouee == NULL)
       {
        printf("\nImpossible d'allouer en memoire le type personne\n");
        return NULL;
       }
   return la_personne_allouee; 
}
  char *  Alloue_Nom(int nbr_caractere){
           char * nom;
           nom = (char *)malloc(sizeof(char) * nbr_caractere);
          return nom;
}

 char * Saisie_Nom()
{
             char nom_tmp[30];
             int nbr_caractere; 
             char * nom_a_renvoyer; 
            printf("\nSaisir le nom de la personne :\n");
            scanf("%s", nom_tmp);
            nbr_caractere = strlen(nom_tmp);
            nom = Alloue_Nom(nbr_caractere);          
            return nom_a_renvoyer;
     }


//======================================================================================

 char *  Alloue_Prenom(int nbr_caractere)
{
           char * prenom;
           prenom = (char *)malloc(sizeof(char) * nbr_caractere);
          return prenom;
}

char * Saisie_Prenom()
{
             char prenom_tmp[30];
             int nbr_caractere; 
             char * prenom_a_renvoyer; 
             
            printf("\nSaisir le prenom de la personne :\n");
            scanf("%s", prenom_tmp);
            nbr_caractere = strlen(prenom_tmp);
            prenom = Alloue_Prenom(nbr_caractere);          
            return prenom_a_renvoyer;
     }



//========================================================================================================================================
 char *  Alloue_Age(int nbr_caractere){
           int * age;
           age = (char *)malloc(sizeof(int) * nbr_chiffre);
          return age;
}
char * Saisie_Age()
{
             int age_tmp[30];
             int nbr_chiffre; 
             int * age_a_renvoyer; 
             
            printf("\nSaisir l'âge de la personne :\n");
            scanf("%s", age_tmp);
            nbr_chiffre = strlen(age_tmp);
            age = Alloue_Age(nbr_chiffre);          
            return age_a_renvoyer;
     }

//========================================================================================================================================

 char *  Alloue_Sexe(int nbr_caractere){
           char * sexe;
           sexe = (char *)malloc(sizeof(char) * nbr_caractere);
          return sexe;
}

char * Saisie_Sexe()
{
             char sexe_tmp[30];
             int nbr_caractere; 
             char * sexe_a_renvoyer; 
             
            printf("\nSaisir le sexe de la personne :\n");
            scanf("%s", sexe_tmp);
            nbr_caractere = strlen(sexe_tmp);
            sexe = Alloue_Nom(nbr_caractere);          
            return sexe_a_renvoyer;
     }



//========================================================================================================================================

 char *  Alloue_Choix(int nbr_caractere){
           int * choix;
           choix = (char *)malloc(sizeof(int) * nbr_chiffre);
          return choix;

}

char * Saisie_Choix()
{
             int choix_tmp[30];
             int nbr_chiffre; 
             int * choix_a_renvoyer; 
             
            printf("\nSaisir le choix de la personne :\n");
            scanf("%s", choix_tmp);
            nbr_chiffre = strlen(choix_tmp);
            choix = Alloue_Choix(nbr_chiffre);          
            return choix_a_renvoyer;
     }


//========================================================================================================================================
void saisie (tpersonne t[], int n) 
{
int i;
int j;
for (i=0;i<n;i++)
 {
  printf("votre nom?\n");
  gets (t[i].nom);
  printf("votre prenom?\n");
  gets (t[i].prenom);
  printf("votre sexe?\n");
  gets (t[i].sexe);
  printf("votre age?\n");
  scanf("%i",&t[i].age); 
  for (j=0;j<5;j++)
  {
   printf("quelle est votre choix?\n");
   scanf("%i",t[j].choix);
  }
 gets(s);
 }
}

//========================================================================================================================================

float titreposition ( tpersonne t[], int titre, int position, int n) /* pour savoir combien de fois tel titre a été cité en tel dans le sondage */
{
int i;
int cpt=0;
for (i=0;i<n;i++)
 {
  if (t[i].choix[position-1] == titre) 
  {
   cpt=cpt+1;
  }
 }
return cpt;
}

//========================================================================================================================================

void calculpop (tpersonne t[] , int t1[50], int n  ) /* Classement des titres les plus cités*/
{
int i;
int j;
int titre;
const int point[5]={1,2,3,4,5};
for (i=0;i<50;i++)
{
 t1[i]=0;
}
for (i=0;i<n;i++)
{
 for(j=0;j<5;j++)
 {
  titre=t[i].choix[j]; 
  t1[titre-1]=t1[titre-1]+point[j];
 }
}
}

//========================================================================================================================================

float indiceplusgrand(int pop[], int n) /* Classe les titres du plus cités au moin cités*/
{
int i;
int imax=0;
for (i=0;i<n;i++)
 {
  if (pop[i]>pop[imax])
  {
   imax=i;
  }
 }
return imax;
}

//========================================================================================================================================

void top3 ( int pop[], int pop3[3], int n ) /* top 3 des titres du sondage*/
{
int i;
for (i=0;i<n;i++)
{
pop3[i]=indiceplusgrand(pop, n);
 pop[i][pop3]=0;
 }
}
//========================================================================================================================================
void main () /* Action principale*/
{
int pop[50];
int pop3[3];
int position;
int titre;
int nb;
tpersonne * lib; 
tpersonne * sond; 
lib=(tpersonne*)malloc(nb*sizeof(tpersonne));
calculpop (sond,pop,nb);
saisie (sond,nb);
top3 (sond,pop3,nb);
printf("Recherche d'un titre en position donnée\n");
printf("entrez un titre");
scanf("%i",&titre);
printf("entrez la position du titre\n");
scanf("%i",&position);
printf("le titre %i",titre," à été cité %i", titreposition(sond,titre,pop,nb),"en position %i",position);
return 0;
}


========================================================================

Et voilà mon rapport d'erreur :

Compilateur: Default compiler
Exécution de  gcc.exe...
gcc.exe "C:\Dev-Cpp\SansNom1.c" -o "C:\Dev-Cpp\SansNom1.exe"    -I"C:\Dev-Cpp\include"   -L"C:\Dev-Cpp\lib" 
C:\Dev-Cpp\SansNom1.c: In function `Saisie_Nom':
C:\Dev-Cpp\SansNom1.c:40: error: `nom' undeclared (first use in this function)
C:\Dev-Cpp\SansNom1.c:40: error: (Each undeclared identifier is reported only once
C:\Dev-Cpp\SansNom1.c:40: error: for each function it appears in.)

C:\Dev-Cpp\SansNom1.c: In function `Saisie_Prenom':
C:\Dev-Cpp\SansNom1.c:60: error: `prenom' undeclared (first use in this function)
C:\Dev-Cpp\SansNom1.c: In function `Alloue_Age':
C:\Dev-Cpp\SansNom1.c:68: error: `nbr_chiffre' undeclared (first use in this function)
C:\Dev-Cpp\SansNom1.c:68: warning: assignment from incompatible pointer type

C:\Dev-Cpp\SansNom1.c:69: warning: return from incompatible pointer type
C:\Dev-Cpp\SansNom1.c: In function `Saisie_Age':
C:\Dev-Cpp\SansNom1.c:79: warning: passing arg 1 of `strlen' from incompatible pointer type
C:\Dev-Cpp\SansNom1.c:80: error: `age' undeclared (first use in this function)
C:\Dev-Cpp\SansNom1.c:81: warning: return from incompatible pointer type
C:\Dev-Cpp\SansNom1.c: In function `Saisie_Sexe':
C:\Dev-Cpp\SansNom1.c:102: error: `sexe' undeclared (first use in this function)
C:\Dev-Cpp\SansNom1.c: In function `Alloue_Choix':
C:\Dev-Cpp\SansNom1.c:111: error: `nbr_chiffre' undeclared (first use in this function)
C:\Dev-Cpp\SansNom1.c:111: warning: assignment from incompatible pointer type
C:\Dev-Cpp\SansNom1.c:112: warning: return from incompatible pointer type
C:\Dev-Cpp\SansNom1.c: In function `Saisie_Choix':
C:\Dev-Cpp\SansNom1.c:124: warning: passing arg 1 of `strlen' from incompatible pointer type
C:\Dev-Cpp\SansNom1.c:125: error: `choix' undeclared (first use in this function)
C:\Dev-Cpp\SansNom1.c:126: warning: return from incompatible pointer type
C:\Dev-Cpp\SansNom1.c: In function `main':
C:\Dev-Cpp\SansNom1.c:210: warning: passing arg 1 of `top3' from incompatible pointer type
C:\Dev-Cpp\SansNom1.c:216: warning: passing arg 3 of `titreposition' makes integer from pointer without a cast
C:\Dev-Cpp\SansNom1.c:217: warning: `return' with a value, in function returning void
C:\Dev-Cpp\SansNom1.c:200: warning: return type of 'main' is not `int'

Exécution terminée


donc Nombres D'erreurs : 9 ! ; /



1) Ce sont des erreurs récurrentes pour chacunes de met fonctions " char * Nom_de_la_fonction "

===> error: ''exemple' undeclared (first use in this function)

2) Autres erreurs : "warning: return from incompatible pointer type" malheureusement je ne sais les résoudre .


Alors, voilà si quelqu'un peut m'aider à résoudre mes erreurs et me les expliquer il est le bienvenu :)
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
31 oct. 2008 à 14:59
ben les message sont plutot claire vu que nous on a pas les numeros de ligne indique quel ligne renvoie l'erreur plutot que de donner seulement le numero...

dans Saisie_nom ça serait plutot
nom_a_renvoyer = Alloue_Nom(nbr_caractere);
dans Saisie_Prenom c'est pareil c'est plutot
prenom_a_renvoyer = Alloue_Prenom(nbr_caractere);
ensuite dans Alloue_Age tu a passé en parametre int nbr_caractere au lieu de int nbr_chiffre
ensuite quand tu fais ton malloc tu fais pas le bon casting age est int * et pas un char * donc ça donne
age = (int *) malloc(sizeof(int) * nbr_chiffre);
pareil pour le type de retour de ta fonction Alloue_Age c'est un int * et pas une char * donc change l'en tete
int * Alloue_Age(int nbr_chiffre)
ensuite la fonction strlen() elle prend en parametre un char * donc faut que tu changes ta declaration
char * age_tmp[30];
bon ensuite c'est toujours les meme erreur c'est plutot
age_a_renvoyer = Alloue_Age(nbr_chiffre);
ta fonction elle retourne un int * donc l'en tete c'est
int * Saisie_Age()
ensuite t'as un peu les meme erreur pour Saisie_Sexe, Alloue_Choix et Saisie_Choix
ensuite dans ta fonction top3 le premier parametre c'est un int* et tu lui envoie un tpersonne * faut faire un choix...
pareil pour titreposition le 3eme argument tu lui envoie un int * alor qu'il attend un int
et si tu fais un return 0 a la fin du main l'en tete du main doit etre
int main()

voila corrige deja toute ces erreurs et voit ce que ça donne...
0
TheFullMetal
31 oct. 2008 à 20:06
Voilà j'ai apporter les corrections se qui donne :
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
char s[150];

typedef struct personne

{	char sexe;
	int  age;
	char * nom;
	char * prenom;
	int *  choix;
} tpersonne;

//=====================================================================
 tpersonne * AllouePersonne()
{
    tpersonne * la_personne_allouee;
    la_personne_allouee = (tpersonne *)malloc(sizeof(tpersonne));    
       if(la_personne_allouee == NULL)
       {
        printf("\nImpossible d'allouer en memoire le type personne\n");
        return NULL;
       }
   return la_personne_allouee; 
}
  char *  Alloue_Nom(int nbr_caractere){
           char * nom;
           nom = (char *)malloc(sizeof(char) * nbr_caractere);
          return nom;
}

 char * Saisie_Nom()
{
             char nom_tmp[30];
             int nbr_caractere; 
             char * nom_a_renvoyer; 
            printf("\nSaisir le nom de la personne :\n");
            scanf("%s", nom_tmp);
            nbr_caractere = strlen(nom_tmp);
            nom_a_renvoyer = Alloue_Nom(nbr_caractere);          
            return nom_a_renvoyer;
     }



//======================================================================================

 char *  Alloue_Prenom(int nbr_caractere)
{
           char * prenom;
           prenom = (char *)malloc(sizeof(char) * nbr_caractere);
          return prenom;
}

char * Saisie_Prenom()
{
             char prenom_tmp[30];
             int nbr_caractere; 
             char * prenom_a_renvoyer; 
             
            printf("\nSaisir le prenom de la personne :\n");
            scanf("%s", prenom_tmp);
            nbr_caractere = strlen(prenom_tmp);
            prenom_a_renvoyer = Alloue_Prenom(nbr_caractere);          
            return prenom_a_renvoyer;
     }



//========================================================================================================================================
 int *  Alloue_Age(int nbr_chiffre){
           int * age;
           age = (int *)malloc(sizeof(int) * nbr_chiffre);
          return age;
}
int * Saisie_Age()
{
             char age_tmp[30];
             int nbr_chiffre; 
             int * age_a_renvoyer; 
             
            printf("\nSaisir l'âge de la personne :\n");
            scanf("%s", age_tmp);
            nbr_chiffre = strlen(age_tmp);
            age_a_renvoyer = Alloue_Age(nbr_chiffre);          
            return age_a_renvoyer;
     }

//========================================================================================================================================

 char *  Alloue_Sexe(int nbr_caractere){
           char * sexe;
           sexe = (char *)malloc(sizeof(char) * nbr_caractere);
          return sexe;
}

char * Saisie_Sexe()
{
             char sexe_tmp[30];
             int nbr_caractere; 
             char * sexe_a_renvoyer; 
             
            printf("\nSaisir le sexe de la personne :\n");
            scanf("%s", sexe_tmp);
            nbr_caractere = strlen(sexe_tmp);
            sexe_a_renvoyer = Alloue_Nom(nbr_caractere);          
            return sexe_a_renvoyer;
     }



//========================================================================================================================================

 int *  Alloue_Choix(int nbr_caractere){
           int * choix;
           choix = (int *)malloc(sizeof(int) * nbr_caractere);
          return choix;

}

int * Saisie_Choix()
{
             char choix_tmp[30];
             int nbr_chiffre; 
             int * choix_a_renvoyer; 
             
            printf("\nSaisir le choix de la personne :\n");
            scanf("%s", choix_tmp);
            nbr_chiffre = strlen(choix_tmp);
            choix_a_renvoyer = Alloue_Choix(nbr_chiffre);          
            return choix_a_renvoyer;
     }


//========================================================================================================================================
void saisie (tpersonne t[], int n) 
{
int i;
int j;
for (i=0;i<n;i++);{
  gets (t[i].nom);
  printf("votre prenom?\n");
  gets (t[i].prenom);
  printf("votre sexe?\n");
  gets (t[i].sexe);
  printf("votre age?\n");
  scanf("%i",&t[i].age); 
  for (j=0;j<5;j++)
  {
   printf("quelle est votre choix?\n");
   scanf("%i",t[j].choix);
  }
 gets(s);
 }
}

//========================================================================================================================================

float titreposition ( tpersonne t[], int titre, int position, int n) /* pour savoir combien de fois tel titre a été cité en tel dans le sondage */
{
int i;
int cpt=0;
for (i=0;i<n;i++)
 {
  if (t[i].choix[position-1] == titre) 
  {
   cpt=cpt+1;
  }
 }
return cpt;
}

//========================================================================================================================================

void calculpop (tpersonne t[] , int t1[50], int n  ) /* Classement des titres les plus cités*/
{
int i;
int j;
int titre;
const int point[5]={1,2,3,4,5};
for (i=0;i<50;i++)
{
 t1[i]=0;
}
for (i=0;i<n;i++)
{
 for(j=0;j<5;j++)
 {
  titre=t[i].choix[j]; 
  t1[titre-1]=t1[titre-1]+point[j];
 }
}
}

//========================================================================================================================================

float indiceplusgrand(int pop[], int n) /* Classe les titres du plus cités au moin cités*/
{
int i;
int imax=0;
for (i=0;i<n;i++)
 {
  if (pop[i]>pop[imax])
  {
   imax=i;
  }
 }
return imax;
}

//========================================================================================================================================

void top3 ( int pop[], int pop3[3], int n ) /* top 3 des titres du sondage*/
{
int i;
for (i=0;i<n;i++)
{
pop3[i]=indiceplusgrand(pop, n);
 pop[i][pop3]=0;
 }
}
//========================================================================================================================================
int main () /* Action principale*/
{
int pop[50];
int pop3[3];
int position;
int titre;
int nb;
tpersonne * lib; 
tpersonne * sond; 
lib=(tpersonne*)malloc(nb*sizeof(tpersonne));
calculpop (sond,pop,nb);
saisie (sond,nb);
top3 (sond,pop3,nb);
printf("Recherche d'un titre en position donnée\n");
printf("entrez un titre");
scanf("%i",&titre);
printf("entrez la position du titre\n");
scanf("%i",&position);
printf("le titre %i",titre," à été cité %i", titreposition(sond,titre,pop,nb),"en position %i",position);
return 0;
}



Mon log de compilation m'indique 0 erreurs :)

Néanmoins il reste quelque Warning :

Compilateur: Default compiler
Exécution de  gcc.exe...
gcc.exe "C:\Dev-Cpp\SansNom1.c" -o "C:\Dev-Cpp\SansNom1.exe"    -I"C:\Dev-Cpp\include"   -L"C:\Dev-Cpp\lib" 
C:\Dev-Cpp\SansNom1.c: In function `saisie':
C:\Dev-Cpp\SansNom1.c:150: warning: passing arg 1 of `gets' makes pointer from integer without a cast

C:\Dev-Cpp\SansNom1.c: In function `main':
C:\Dev-Cpp\SansNom1.c:240: warning: passing arg 1 of `top3' from incompatible pointer type

C:\Dev-Cpp\SansNom1.c:246: warning: passing arg 3 of `titreposition' makes integer from pointer without a cast

Exécution terminée
Compilation OK


***************************************************************************************
1) |C:\Dev-Cpp\SansNom1.c:150: warning: passing arg 1 of `gets' makes pointer from integer without a cast |

void saisie (tpersonne t[], int n) 
{
int i;
int j;
for (i=0;i<n;i++);{
  gets (t[i].nom);
  printf("votre prenom?\n");
  gets (t[i].prenom);
  printf("votre sexe?\n");
  gets (t[i].sexe);  // LIGNE 150 
  printf("votre age?\n");
  scanf("%i",&t[i].age); 
  for (j=0;j<5;j++)
  {
   printf("quelle est votre choix?\n");
   scanf("%i",t[j].choix);
  }
 gets(s);
 }
}



2 ) C:\Dev-Cpp\SansNom1.c:240: warning: passing arg 1 of `top3' from incompatible pointer type
C:\Dev-Cpp\SansNom1.c:246: warning: passing arg 3 of `titreposition' makes integer from pointer without a cast

int main () /* Action principale*/
{
int pop[50];
int pop3[3];
int position;
int titre;
int nb;
tpersonne * lib; 
tpersonne * sond; 
lib=(tpersonne*)malloc(nb*sizeof(tpersonne));
calculpop (sond,pop,nb);
saisie (sond,nb);
top3 (sond,pop3,nb); // LIGNE 240
printf("Recherche d'un titre en position donnée\n");
printf("entrez un titre");
scanf("%i",&titre);
printf("entrez la position du titre\n");
scanf("%i",&position);
printf("le titre %i",titre," à été cité %i", titreposition(sond,titre,pop,nb),"en position %i",position); // LIGNE 246
return 0;
}


ensuite dans ta fonction top3 le premier parametre c'est un int* et tu lui envoie un tpersonne * faut faire un choix... 


Je ne vois pas ce que tu veux dire , parce que si je met
void top3 ( tpersonne pop[], int pop3[3], int n )

sa ne marche pas.
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
31 oct. 2008 à 22:48
le premier warning c'est parce que gets() prend en parametre un char * et toi tu lui donne un char il faudrait plutot que tu utilises fgetc() pour stocker le
sexe t[i].sexe=fgetc(stdin);
le deuxieme je vois pas trop ce que tu veux faire mais je pense que tu dois lui passer pop et pas sond donc tu garde ton en tete et tu fais
top3(pop,pop3,nb);
pour le derniere le troisieme arguments passer n'est pas le bon tu dois lui envoyer position
titreposition(sond,titre,position,nb)
0
TheFullMetal
1 nov. 2008 à 10:33
le deuxieme je vois pas trop ce que tu veux faire mais je pense que tu dois lui passer pop et pas sond donc tu garde ton en tete et tu fais

top3(pop,pop3,nb);

 C'est bon , les paramètres sont les bons.

Par contre, je ne connais pas la fonction "fgetc" , est-ce la même chose que getchar ?

Quand je remplace  <code>gets (t[i].sexe);
par
fgetc (t[i].sexe);
j'ai toujours le même message d'erreur.
Si j'essaye avec
getchar (t[i].sexe);
il me dit qu'il y a trop d'arguments .
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
1 nov. 2008 à 10:40
Salut,

il me dit qu'il y a trop d'arguments .
C'est normal puisque le prototype de la fonction getchar est le suivant
int getchar(void);
Donc getchar lit depuis l'entrée standard.

Quelques variantes
getchar
  printf("votre sexe?\n");
  t[i].sexe = getchar();
fgetc
  printf("votre sexe?\n");
  t[i].sexe= fgetc(STDIN);
getc
  printf("votre sexe?\n");
  t[i].sexe= getc(STDIN);


0