En C Tableau à 2 dimmensions des caracteres
voici une partie du code, ma fonction bloque, dites moi quoi faire pour que ça tourne bien!
merci
char* cree_tableau(MEMBRE *pkarate, char data[][41],int nmembre)
{
int i,j,ncomax=41;
char tmp[41];
// sauvegarde dans un tableau temporaire
for(i=0;i<nmembre;i++)
{
tmp[i]=pkarate->categorie;
strncpy(&tmp[i+1],pkarate->nom,strlen(pkarate->nom+1));
strcat(&tmp[strlen(pkarate->nom)],pkarate->prenom);
}
for(i=0;i<nmembre;i++)
{
for(j=0;j<ncomax;j++)
{
strcpy((&data[i][j]),&tmp[i]);
}
pkarate++;
}
return &data[0][0];
// aff
for(i=0;i<nmembre;i++)
{
for(j=0;j<41;j++)
{
printf(" %c %s ",data[i][j],data[i][j]);
}
}
}
merci
char* cree_tableau(MEMBRE *pkarate, char data[][41],int nmembre)
{
int i,j,ncomax=41;
char tmp[41];
// sauvegarde dans un tableau temporaire
for(i=0;i<nmembre;i++)
{
tmp[i]=pkarate->categorie;
strncpy(&tmp[i+1],pkarate->nom,strlen(pkarate->nom+1));
strcat(&tmp[strlen(pkarate->nom)],pkarate->prenom);
}
for(i=0;i<nmembre;i++)
{
for(j=0;j<ncomax;j++)
{
strcpy((&data[i][j]),&tmp[i]);
}
pkarate++;
}
return &data[0][0];
// aff
for(i=0;i<nmembre;i++)
{
for(j=0;j<41;j++)
{
printf(" %c %s ",data[i][j],data[i][j]);
}
}
}
A voir également:
- En C Tableau à 2 dimmensions des caracteres
- Tableau word - Guide
- Supercopier 2 - Télécharger - Gestion de fichiers
- Tableau ascii - Guide
- Trier un tableau excel - Guide
- Tableau croisé dynamique - Guide
4 réponses
mmh, je suis pas convaincue que tu puisses définir un tableau à deux dimensions comme ça.. En C, un tableau, c'est de l'espace mémoire que tu réserves (lors de la déclaration) et que tu remplis ensuite par l'opérateur [] (cf ce très bon tutoriel : http://chgi.developpez.com/pointeur/). Donc quand tu veux appeler data[i][j], tu essaies de lire à l'adresse pointée par (data[i] + j), or data[i] n'est pas un pointeur...
Le mieux dans ton cas, c'est de définir une structure dans laquelle tu stockeras les deux données nom et catégorie et que tu rempliras au fur et à mesure :
dans un .h (que tu inclueras à ton main), tu définis ta structure :
ensuite, tu peux t'en servir dans ton main :
Je te garantis pas à 100% le code ci-dessus, vu que je n'ai pas de compilateur C sous la main, mais ça devrait être un truc dans ce genre. Si tu as des pbs avec les notions de base du C, regarde dans les tutoriels ou la FAQ de ce site : www.developpez.com
bon courage,
Agnès
Le mieux dans ton cas, c'est de définir une structure dans laquelle tu stockeras les deux données nom et catégorie et que tu rempliras au fur et à mesure :
dans un .h (que tu inclueras à ton main), tu définis ta structure :
typedef struct tableau //définition de ta structure (appelée tableau) {char nom; char categorie; }
ensuite, tu peux t'en servir dans ton main :
tableau donnees []; //définition du tableau "données" à remplir donnees[i].nom = toto; // on met "toto" dans le champ "nom" de donnees[i] donnees[i].categorie = shotokai;// on met "shotokai" dans le champ "categorie" de donnees[i]
Je te garantis pas à 100% le code ci-dessus, vu que je n'ai pas de compilateur C sous la main, mais ça devrait être un truc dans ce genre. Si tu as des pbs avec les notions de base du C, regarde dans les tutoriels ou la FAQ de ce site : www.developpez.com
bon courage,
Agnès
vous n'avez peut être pas compris la partie de mon code, je vous envoie tout mon code si dessous, pour que vous voyer là ou il ya le probleme qui bloque mon prog! merci de me repondre je compte sur vous
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
typedef struct membre {
char categorie;
char nom[20];
char prenom[20];
char adrese[60];
int niveau;
int cotisation;
}MEMBRE;
int encod_memb(membre *,int );
void affich_memb(membre *,int);
char* cree_tableau(membre*,char[][41] ,int);
void aff_index(char[][41],int [],int);
int* indexation(char[][41],int[] ,int,int);
int tri_insertion(int[],int);
void main()
{
//declaration et initialisation
MEMBRE karate[10],*pkarate;
int nmembre=0,i=0,a;
int nadulte=0;
int nenfant=0;
int indexe[10],*pindexe;
char data[10][41],*pdata;
pkarate=&karate[0];
pdata=&data[0][0];
pindexe=&indexe[0];
printf("\n\tGESTION D'UN CLUB DE KARATE \n");
printf("\n\t=========================== \n");
do
{
a=encod_memb(&karate[i],i); /* Encoder jusqu'a ce que la fct<-0 et i=10 */
pdata=cree_tableau(pkarate,data,nmembre);
if(a!=0)
{
i++;
nmembre=i;
if(pkarate->categorie=='A')
{
nadulte=nadulte+1;
}
else
if(pkarate->categorie=='E')
{
nenfant=nenfant+1;
}
}
}
while(nmembre<10 && a!=0);
{
}
/* Mis a jour du nbre d'element
nenfant=*pnenfant; /* Mis a jour du nbre d'enfant
nadulte=*pnadulte; /* Mis a jour du nbre d'adulte */
affich_memb(pkarate,nmembre);
pindexe=indexation(data,indexe,nadulte,nenfant);
aff_index(data,indexe,nmembre);
printf("\n");
printf("\n");
}
// _______________________fct encod_memb___________________________________
int encod_memb(MEMBRE *pkarate ,int i)
{
int a,c;
printf("\n \n\tEncoder le membre n° %d ",i+1);
printf("\n\tEncoder LA CATEGORIE du membre n° %d:",i+1);
fflush(stdin);
pkarate->categorie=toupper(getchar());
// verifier le nbre d'enfant ou adulte
if(pkarate->categorie=='\n')
{
a=0;
return a;
}
printf("\n\tEncoder LE NOM du membre n° %d:",i+1);
fflush(stdin);
gets(pkarate->nom);
printf("\n\tEncoder LE PRENOM du membre n° %d:",i+1);
fflush(stdin);
gets(pkarate->prenom);
printf("\n\tEncoder L'ADDRESSE du membre n° %d:",i+1);
fflush(stdin);
gets(pkarate->adrese);
printf("\n\tEncoder LE NIVEAU du membre ( 1,2,3 ? ) n° %d:",i+1);
fflush(stdin);
scanf("%d",&c);
pkarate->niveau=c;
// verification de la cotisation
if(pkarate->categorie=='A')
{
if( pkarate->niveau==1)
{
pkarate->cotisation=20;
}
else
if( pkarate->niveau==2)
{
pkarate->cotisation=22;
}
else
{
pkarate->cotisation=24;
}
}
else
if(pkarate->categorie=='E' )
{
if( pkarate->niveau==1)
{
pkarate->cotisation=10;
}
else
if( pkarate->niveau==2)
{
pkarate->cotisation=12;
}
else
{
pkarate->cotisation=14;
}
}
//verification de la touche Enter
if(pkarate->categorie!='\n')
{
a=1;
}
else
{
a=0;
}
return a;
}
////////////////////////////////////////////////////// creation du tableau
char* cree_tableau(MEMBRE *pkarate, char data[][41],int nmembre)
{
int i,j,ncomax=41;
char tmp[41];
// sauvegarde dans un vecteur temporaire
for(i=0;i<nmembre;i++)
{
tmp[i]=pkarate->categorie;
strncpy(&tmp[i+1],pkarate->nom,strlen(pkarate->nom+1));
strcat(&tmp[strlen(pkarate->nom)],pkarate->prenom);
pkarate++;
}
for(i=0;i<nmembre;i++)
{
for(j=0;j<ncomax;j++)
{
strcpy((&data[i][j]),&tmp[i]);
}
pkarate++;
}
return &data[0][0];
// aff
for(i=0;i<nmembre;i++)
{
for(j=0;j<41;j++)
{
printf(" %c %s ",data[i][j],data[i][j]);
}
}
}
//////////////////////////////// INDEXATION/////////////////////////////////////
int* indexation(char data[][41],int indexe[],int nadulte,int nenfant)
{
int i,j,n;
n=nadulte+nenfant;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(data[i][j]>=data[i+1][j])
{
if(strcmp(&data[i][j+1],&data[i+1][j+1])<=0)
{
indexe[i]=i;
}
else
{
indexe[i]=i+1;
}
indexe[i]=(indexe,nadulte);
}
else
{
if(strcmp(&data[i][j+1],&data[i+1][j+1])<=0)
{
indexe[nenfant]=i;
}
else
{
indexe[nenfant]=i+1;
}
indexe[i]=(indexe,nenfant);
}
}
}
return indexe;
}
////////////////////////////////// affiche index /////////////////////////////////
void aff_index(char data[][41],int indexe[],int nmembre)
{
int i,j;
for(i=0;i<nmembre;i++)
{
for(j=0;j<1;j++)
{
printf(" %c %s %s ",data,data[indexe[i]][j]);
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////
void affich_memb( membre *pkarate,int nmembre)
{
int i=0;
while(i<nmembre)
{
printf("\n %c ",pkarate->categorie);
printf("\n %s ",pkarate->nom);
printf("\n %s ",pkarate->prenom);
printf("\n %s ",pkarate->adrese);
printf("\n %d ",pkarate->niveau);
printf("\n %d ",pkarate->cotisation);
i++;pkarate++;
}
}
//=================================================================================================
int tri_insertion(int indexe[],int nmembre)
{
int i,j=0,res;
for(j=1;j<nmembre;j++)
{
i=j-1;
res=indexe[j];
while(indexe[i]>res)
{
indexe[i+1]=indexe[i];
i=i-1;
}
indexe[i+1]=res;
return indexe[i];
}
return indexe[j];
}
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
typedef struct membre {
char categorie;
char nom[20];
char prenom[20];
char adrese[60];
int niveau;
int cotisation;
}MEMBRE;
int encod_memb(membre *,int );
void affich_memb(membre *,int);
char* cree_tableau(membre*,char[][41] ,int);
void aff_index(char[][41],int [],int);
int* indexation(char[][41],int[] ,int,int);
int tri_insertion(int[],int);
void main()
{
//declaration et initialisation
MEMBRE karate[10],*pkarate;
int nmembre=0,i=0,a;
int nadulte=0;
int nenfant=0;
int indexe[10],*pindexe;
char data[10][41],*pdata;
pkarate=&karate[0];
pdata=&data[0][0];
pindexe=&indexe[0];
printf("\n\tGESTION D'UN CLUB DE KARATE \n");
printf("\n\t=========================== \n");
do
{
a=encod_memb(&karate[i],i); /* Encoder jusqu'a ce que la fct<-0 et i=10 */
pdata=cree_tableau(pkarate,data,nmembre);
if(a!=0)
{
i++;
nmembre=i;
if(pkarate->categorie=='A')
{
nadulte=nadulte+1;
}
else
if(pkarate->categorie=='E')
{
nenfant=nenfant+1;
}
}
}
while(nmembre<10 && a!=0);
{
}
/* Mis a jour du nbre d'element
nenfant=*pnenfant; /* Mis a jour du nbre d'enfant
nadulte=*pnadulte; /* Mis a jour du nbre d'adulte */
affich_memb(pkarate,nmembre);
pindexe=indexation(data,indexe,nadulte,nenfant);
aff_index(data,indexe,nmembre);
printf("\n");
printf("\n");
}
// _______________________fct encod_memb___________________________________
int encod_memb(MEMBRE *pkarate ,int i)
{
int a,c;
printf("\n \n\tEncoder le membre n° %d ",i+1);
printf("\n\tEncoder LA CATEGORIE du membre n° %d:",i+1);
fflush(stdin);
pkarate->categorie=toupper(getchar());
// verifier le nbre d'enfant ou adulte
if(pkarate->categorie=='\n')
{
a=0;
return a;
}
printf("\n\tEncoder LE NOM du membre n° %d:",i+1);
fflush(stdin);
gets(pkarate->nom);
printf("\n\tEncoder LE PRENOM du membre n° %d:",i+1);
fflush(stdin);
gets(pkarate->prenom);
printf("\n\tEncoder L'ADDRESSE du membre n° %d:",i+1);
fflush(stdin);
gets(pkarate->adrese);
printf("\n\tEncoder LE NIVEAU du membre ( 1,2,3 ? ) n° %d:",i+1);
fflush(stdin);
scanf("%d",&c);
pkarate->niveau=c;
// verification de la cotisation
if(pkarate->categorie=='A')
{
if( pkarate->niveau==1)
{
pkarate->cotisation=20;
}
else
if( pkarate->niveau==2)
{
pkarate->cotisation=22;
}
else
{
pkarate->cotisation=24;
}
}
else
if(pkarate->categorie=='E' )
{
if( pkarate->niveau==1)
{
pkarate->cotisation=10;
}
else
if( pkarate->niveau==2)
{
pkarate->cotisation=12;
}
else
{
pkarate->cotisation=14;
}
}
//verification de la touche Enter
if(pkarate->categorie!='\n')
{
a=1;
}
else
{
a=0;
}
return a;
}
////////////////////////////////////////////////////// creation du tableau
char* cree_tableau(MEMBRE *pkarate, char data[][41],int nmembre)
{
int i,j,ncomax=41;
char tmp[41];
// sauvegarde dans un vecteur temporaire
for(i=0;i<nmembre;i++)
{
tmp[i]=pkarate->categorie;
strncpy(&tmp[i+1],pkarate->nom,strlen(pkarate->nom+1));
strcat(&tmp[strlen(pkarate->nom)],pkarate->prenom);
pkarate++;
}
for(i=0;i<nmembre;i++)
{
for(j=0;j<ncomax;j++)
{
strcpy((&data[i][j]),&tmp[i]);
}
pkarate++;
}
return &data[0][0];
// aff
for(i=0;i<nmembre;i++)
{
for(j=0;j<41;j++)
{
printf(" %c %s ",data[i][j],data[i][j]);
}
}
}
//////////////////////////////// INDEXATION/////////////////////////////////////
int* indexation(char data[][41],int indexe[],int nadulte,int nenfant)
{
int i,j,n;
n=nadulte+nenfant;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(data[i][j]>=data[i+1][j])
{
if(strcmp(&data[i][j+1],&data[i+1][j+1])<=0)
{
indexe[i]=i;
}
else
{
indexe[i]=i+1;
}
indexe[i]=(indexe,nadulte);
}
else
{
if(strcmp(&data[i][j+1],&data[i+1][j+1])<=0)
{
indexe[nenfant]=i;
}
else
{
indexe[nenfant]=i+1;
}
indexe[i]=(indexe,nenfant);
}
}
}
return indexe;
}
////////////////////////////////// affiche index /////////////////////////////////
void aff_index(char data[][41],int indexe[],int nmembre)
{
int i,j;
for(i=0;i<nmembre;i++)
{
for(j=0;j<1;j++)
{
printf(" %c %s %s ",data,data[indexe[i]][j]);
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////
void affich_memb( membre *pkarate,int nmembre)
{
int i=0;
while(i<nmembre)
{
printf("\n %c ",pkarate->categorie);
printf("\n %s ",pkarate->nom);
printf("\n %s ",pkarate->prenom);
printf("\n %s ",pkarate->adrese);
printf("\n %d ",pkarate->niveau);
printf("\n %d ",pkarate->cotisation);
i++;pkarate++;
}
}
//=================================================================================================
int tri_insertion(int indexe[],int nmembre)
{
int i,j=0,res;
for(j=1;j<nmembre;j++)
{
i=j-1;
res=indexe[j];
while(indexe[i]>res)
{
indexe[i+1]=indexe[i];
i=i-1;
}
indexe[i+1]=res;
return indexe[i];
}
return indexe[j];
}
En effet, ce n'est pas tout à fait ce que vous devez faire, mais c'est l'esprit il me semble?
Avez-vous revu votre cours sur les tableaux (notamment grâce au tutoriel que je vous ai indiqué)?
Si vous me dites où le compilateur bloque et quel(s) message(s) d'erreur et avertissement(s) il affiche, ça m'aidera beaucoup plus que d'avoir votre code. Les avertissements et messages d'erreur sont rarement sortis de nulle part et aident beaucoup à débugger.
Avez-vous revu votre cours sur les tableaux (notamment grâce au tutoriel que je vous ai indiqué)?
Si vous me dites où le compilateur bloque et quel(s) message(s) d'erreur et avertissement(s) il affiche, ça m'aidera beaucoup plus que d'avoir votre code. Les avertissements et messages d'erreur sont rarement sortis de nulle part et aident beaucoup à débugger.
Quelques corrections :
1- changer MEMBRE par membre
2- changer void main par int main
3- changer :
par :
4- rajouter à la fin du main :
5- mettre la fonction main en dernière position ça fait mieux :p
6- remplacer
par
7- remplacer
par (data[i][j] est un char, pas un char *)
Ce passage me semble bizarre que veux tu faire d'ailleurs ?
8- remplacer
indexe[i]=(indexe,nadulte);
par (cette écriture n'a aucun sens en C)
indexe[i]=nadulte;
9 - remplacer
par exemple par : (data ne peut être afficher directement, il faut faire une boucle)
Après ça déjà ça devrait commencer à compiler. Le compilateur suggère d'éviter d'utiliser fgets, et en effet tu devrais plutôt utiliser scanf. Après pour ce qui est de l'éxecution je ne sais pas ce que ça donne...
Bonne chance
1- changer MEMBRE par membre
2- changer void main par int main
3- changer :
/* Mis a jour du nbre d'element nenfant=*pnenfant; /* Mis a jour du nbre d'enfant nadulte=*pnadulte; /* Mis a jour du nbre d'adulte */
par :
/* Mis a jour du nbre d'element nenfant=*pnenfant; //Mis a jour du nbre d'enfant nadulte=*pnadulte; //Mis a jour du nbre d'adulte */
4- rajouter à la fin du main :
return 0;
5- mettre la fonction main en dernière position ça fait mieux :p
6- remplacer
#include <conio.h>
par
#include <ctype.h>
7- remplacer
printf(" %c %s ",data[i][j],data[i][j]);
par (data[i][j] est un char, pas un char *)
printf(" %c %c ",data[i][j],data[i][j]);
Ce passage me semble bizarre que veux tu faire d'ailleurs ?
8- remplacer
indexe[i]=(indexe,nadulte);
par (cette écriture n'a aucun sens en C)
indexe[i]=nadulte;
9 - remplacer
printf(" %c %c %s ",data,data[indexe[i]][j])
par exemple par : (data ne peut être afficher directement, il faut faire une boucle)
printf("data %c ",data[indexe[i]][j])
Après ça déjà ça devrait commencer à compiler. Le compilateur suggère d'éviter d'utiliser fgets, et en effet tu devrais plutôt utiliser scanf. Après pour ce qui est de l'éxecution je ne sais pas ce que ça donne...
Bonne chance