Rechercher : dans
Par :

En C Tableau à 2 dimmensions des caracteres

Dernière réponse le 16 fév 2006 à 09:33:15 Themahg, le 10 fév 2006 à 00:13:39 
 Signaler ce message aux modérateurs

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]);
}
}
}

Meilleures réponses pour « en C Tableau à 2 dimmensions des caracteres » dans :
Langage C - Les chaînes de caractères Voir Qu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...
Les variables en C++ VoirLes variables en C++ 1. Les différents types de variables 1.1 bool 1.2 char 1.3 unsigned short int 1.4 short int 1.5 unsigned long int 1.6 long int 1.7 int (16 bits) 1.8 int (32 bits) 1.9 unsigned int (16 bits) 1.10 unsigned int (32...
Langage C - Les tableaux VoirType de données complexes Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes...
Les tableaux en langage C++ VoirType de données complexes Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...

1

agnesN7, le 10 fév 2006 à 11:40:28

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 :

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

Répondre à agnesN7

2

ThemahG, le 10 fév 2006 à 22:06:03

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];
}

Répondre à ThemahG

3

agnesN7, le 15 fév 2006 à 21:46:07

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.

Répondre à agnesN7

4

 mamiemando, le 16 fév 2006 à 09:33:15

Quelques corrections :
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

Répondre à mamiemando