OVH Cloud OVH Cloud

[encore une question de debutant sur les tableau et structure]

38 réponses
Avatar
babar
Malgres la bonne dizaine de message qui traite le sujet ici, j'ose quand
meme demander un peu d aide parce que je ne comprend pas pourquoi mon
code ne marche pas.

merci de bien vouloir regarder ce code et me signaler ce qui vous semble
incorrect.

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

typedef struct Matrice{
char valeur[50][25];
int effectif;
int teffectif[50];
}mat;

int ch_id(mat matrice,char id[10]); // permet de donné la ligne de
chaque element du tableau ( ref par id de 9 caractere)
char mget(mat matrice,char id[10],int pos);// permet de recup 1 caractere
void mput(mat *matrice,char id[10],int pos,char chput);// permet de
mettre 1 caractere
void mmget(mat matrice,char id[10],int pos1, int pos2, char
resultat[pos2-pos1]);//permet de recup une chaine de caractere
void mmput(mat *matrice,char id[10],int pos1,int pos2,char
chput[pos2-pos1]);//permet de mettre une chaine de caractere
void mnewline(mat *matrice, char id[10]);//permet de construire une ligne
void mdelline(mat *matrice, char id[10]);//permet de detruire une ligne
void mprintline(mat matrice, char id[10]);//permet d affiché une ligne
void mid(char id[10]);//permet d entrée une id

int main()
{
int i,choix,pos1,pos2;
char id[10],temp[10];
mat test;
test.effectif=0;
for (i=0;i<=50;i++)test.teffectif[i]=0;

printf(" Bienvenue dans le programme d\' edition de tableau\n Menu
: \n \n");
printf(" 1. Lire une ligne\n");
printf(" 2. Cree une ligne\n 3. Lire un element d une ligne \n 4.
Lire une chaine d une ligne\n");
printf(" 5. Ecrire un caractere dans une ligne a une position
precise\n");
printf(" 6. Ecrire une chaine de caractere ds une ligne a une
position precise \n");
printf(" 7. Effacer une ligne\n 8. Quitter\n");

choix=0;

while (choix!=8){
printf("Votre choix :");
scanf("%d",&choix);
switch (choix){
case 1 :
printf("Lire une ligne.\n");
mid(id);
mprintline(test,id);
break;
case 2 :
printf("Creer une ligne.\n");
mid(id);
mnewline(&test,id);
break;
case 3 :
printf("Lire un element.\n");
mid(id);
printf("Position de l element : ");
scanf("%d",&pos1);
temp[0]=mget(test,id,pos1);
printf("%c -- a ete recuperer.\n",*temp);
break;
case 4 :
printf("Lire une chaine.\n");
mid(id);
printf("Borne -- max 10 : ");
scanf("%d %d",&pos1,&pos2);
mmget(test,id,pos1,pos2,temp);
printf("%s -- a ete recuperer.\n",*temp);
break;
case 5 :
printf("Ecrire un caractere.\n");
mid(id);
printf("Position de l element : ");
scanf("%d",&pos1);
printf("Entrer le caractere :");
scanf("%c",&temp);
mput(&test,id,pos1,*temp);
printf("%s -- a ete recuperer.\n",temp);
break;
case 6 :
printf("Ecrire une chaine de caractere.\n");
mid(id);
printf("Borne -- max 10 : ");
scanf("%d %d",&pos1,&pos2);
printf("Entrer la chaine : ");
scanf("%s",&temp);
mmput(&test,id,pos1,pos2,temp);
printf("%s -- a ete recuperer.\n",temp);
break;
case 7 :
printf("Effacer une ligne");
mid(id);
mdelline(&test,id);
break;
case 8 :
printf("Merci et a bientot");
break;
}
if (choix!=8){
printf(" 1. Lire une ligne\n");
printf(" 2. Cree une ligne\n 3. Lire un element
d une ligne \n 4. Lire une chaine d une ligne\n");
printf(" 5. Ecrire un caractere dans une ligne
a une position precise\n");
printf(" 6. Ecrire une chaine de caractere ds
une ligne a une position precise \n");
printf(" 7. Effacer une ligne\n 8. Quitter\n");
}
}

return 0;
}

void mid(char id[10]){
printf("Entrer l'id ( 9 caracteres ) : ");
scanf("%s",&id);

}

char mget(mat matrice,char id[10],int pos){
int ligne;
ligne=ch_id(matrice,id);
return matrice.valeur[ligne][pos];
}

void mput(mat *matrice,char id[10],int pos,char chput){
int ligne;
ligne=ch_id(*matrice,id);
(*matrice).valeur[ligne][pos]=chput;
if (pos-(*matrice).teffectif[ligne]>=0)
(*matrice).teffectif[ligne]=(*matrice).teffectif[ligne]+pos-(*matrice).teffectif[ligne]+1;

}

void mmget(mat matrice,char id[10],int pos1, int pos2, char
resultat[pos2-pos1]){
int ligne;
ligne=ch_id(matrice,id);
strncpy(resultat,&matrice.valeur[ligne][pos1],pos2-pos1);
}

void mmput(mat *matrice,char id[10],int pos1,int pos2,char
chput[pos2-pos1]){
int ligne,i;
ligne=ch_id(*matrice,id);
for(i=pos1;i<=pos2;i++) (*matrice).valeur[ligne][i]=chput[i-pos1];
if (pos2-(*matrice).teffectif[ligne]>=0)
(*matrice).teffectif[ligne]=(*matrice).teffectif[ligne]+pos2-(*matrice).teffectif[ligne]+1;

}

void mnewline(mat *matrice, char id[10]){
strcpy((*matrice).valeur[(*matrice).effectif],id);
(*matrice).valeur[(*matrice).effectif][9]='\0';
(*matrice).effectif++;
(*matrice).teffectif[(*matrice).effectif-1]=10;

}

void mdelline(mat *matrice, char id[10]){
int ligne,i;
ligne=ch_id(*matrice,id);
for(i=ligne+1;i<=(*matrice).effectif-1;i++)
strcpy((*matrice).valeur[i-1],(*matrice).valeur[i]);
(*matrice).effectif--;
for(i=ligne+1;i<=(*matrice).effectif-1;i++)
(*matrice).teffectif[i-1]=(*matrice).teffectif[i];

}

void mprintline(mat matrice, char id[10]){
int ligne;
ligne=ch_id(matrice,id);
printf("%s \n",matrice.valeur[ligne]);

}

int ch_id(mat matrice,char id[10])
{
int i,j;
for (j=0;j<=matrice.effectif;j++){
i=0;
while (strcmp(&matrice.valeur[j][i],&id[i])==0 && i<=9) i++;
if (i==10) break;
}

return j;
}

10 réponses

1 2 3 4
Avatar
babar
Le menu fonctionne,
Attention quand même, c'est bugué, lisez les autres messages (Marc

Boyer). Bah, que je me trompe ne peux déranger un babar ...

Pas de souci de se coté je me trompe moi meme assez souvent :)



Avatar
Harpo
babar wrote:

int main()
{
int i,choix,pos1,pos2;
char id[10],temp[10];
mat test;
test.effectif=0;
for (i=0;i<P;i++)test.teffectif[i]=0;


Manque ');' à la fin de la ligne.

(...)


je reconnais que le 50 devrai etre 49, mais je ne vois pas ou le );
est manquant


Il ne l'est pas en effet, j'ai mal lu la ligne, je ne suis pas un
compilateur...
Il faut dire qu'elle est très difficile à lire, tu sembles ne pas aimer
les gens qui auraient à maintenir ton code, quelque chose de plus
lisible et correct serait :
for (i=0; i < 50; i++) {
test.teffectif[i] = 0;
}
bien qu'il y ait plus simple et plus concis.



case 4 :
printf("Lire une chaine.n");
mid(id);
printf("Borne -- max 10 : ");
scanf("%d %d",&pos1,&pos2);
mmget(test,id,pos1,pos2,temp);
printf("%s -- a ete recuperer.n",*temp);


temp est défini comme 'char temp[10]' *temp est donc un char, or %s
demande une chaîne.
Etc...

je demande l affichage du tableau de caractere entier, il me semblait

que c'etait le moyen de le faire.


Il ne me semble pas que cela le soit.

ce programme se compile


Pas chez moi.

et s exécute correctement


Je ne suis pas allé jusque là.

en affichant bien le
mot et la premiere lettre du mot

Je pense qu'il faut lire les messages du compilateur qui doit dire à
peu près la même chose que moi.

l autre programme se compile aussi sans erreur le probleme est

ailleur, lorsque je demande de lire une ligne il me renvoi rien ou
(null).


Y'a donc un problème.

--
http://harpo.free.fr/



Avatar
Emmanuel Delahaye
Malgres la bonne dizaine de message qui traite le sujet ici, j'ose quand
meme demander un peu d aide parce que je ne comprend pas pourquoi mon
code ne marche pas.

merci de bien vouloir regarder ce code et me signaler ce qui vous semble
incorrect.


Ca déjà...

Compiling: main.c
main.c: In function `main_':
main.c:65: warning: format argument is not a pointer (arg 2)
main.c:73: warning: char format, different type arg (arg 2)
main.c:74: warning: passing arg 4 of `mput' with different width due to
prototype
main.c:83: warning: char format, different type arg (arg 2)
main.c: In function `mid':
main.c:110: warning: char format, pointer arg (arg 2)
main.c: In function `mmget':
main.c:131: warning: passing arg 3 of `strncpy' as unsigned due to prototype
main.c:176:2: warning: no newline at end of file
main.c: In function `mid':
main.c:128: error: prior parameter's size depends on 'pos2'
main.c:128: error: prior parameter's size depends on 'pos1'
main.c:134: error: prior parameter's size depends on 'pos2'
main.c:134: error: prior parameter's size depends on 'pos1'
Process terminated with status 1 (0 minutes, 0 seconds)
4 errors, 7 warnings

--
A+

Emmanuel Delahaye

Avatar
Harpo
Emmanuel Delahaye wrote:

Process terminated with status 1 (0 minutes, 0 seconds)


Il ne perd pas son temps, lui !

--
http://harpo.free.fr/

Avatar
Emmanuel Delahaye
for (i=0;i<P;i++)test.teffectif[i]=0;


Manque ');' à la fin de la ligne.


Hé hé... Non ! Indentation à la barbare !

for (i = 0; i <= 50; i++)
test.teffectif[i] = 0;

Là, c'est mieux comme ça ?

--
A+

Emmanuel Delahaye


Avatar
Emmanuel Delahaye
#include <stdio.h>

int main()
{
char entree[50];
printf("entré un mot :");
scanf("%s",&entree);


Faux. "%s" attend l'adresse d'un char, pas celle d'un tableau de 50 char.

scanf("%s", entree);

l autre programme se compile aussi sans erreur le probleme est ailleur,
lorsque je demande de lire une ligne il me renvoi rien ou (null).


Alors élève le niveau de diagnostic de ton compilateur. Le mien a crié
tellement fort que je suis devenu sourd..

--
A+

Emmanuel Delahaye

Avatar
Emmanuel Delahaye
printf("Votre choix :");
fflush(stdin);


N'existe pas. fflush() n'est défini que pour les flux sortants.

choix = getc(stdin);


Non. fgets().

{
char s[3];
fgets (s, sizeof s, stdin);
choix = *s;
}

http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers

--
A+

Emmanuel Delahaye

Avatar
Harpo
Emmanuel Delahaye wrote:

for (i=0;i<P;i++)test.teffectif[i]=0;


Manque ');' à la fin de la ligne.


Hé hé... Non ! Indentation à la barbare !


Oui, bon... j'ai été offusqué!

--
http://harpo.free.fr/



Avatar
Harpo
Emmanuel Delahaye wrote:

Alors élève le niveau de diagnostic de ton compilateur.


C'est une réponse diplomatique.
Je dirais : 'change de compilateur', il n'est pas normal qu'un
compilateur compile un code grossièrement erroné sans signaler
d'erreur.

--
http://harpo.free.fr/

Avatar
Pierre Maurette
Emmanuel Delahaye wrote:

Alors élève le niveau de diagnostic de ton compilateur.


C'est une réponse diplomatique.
Je dirais : 'change de compilateur', il n'est pas normal qu'un
compilateur compile un code grossièrement erroné sans signaler
d'erreur.
Le code initial proposé par babar compile sans warning sous gcc 3.4.4

de code::blocks, sous XP x64, avec les paramètres proposés par défaut
par l'IDE. Après un simple copié-collé, et une seule ligne à remettre
d'un seul tenant.
Pas d'autre outil pour tester, j'ai cassé de la bécane.

--
Pierre Maurette


1 2 3 4