Prolème Procédure Remplir Tableau
Fermé
faresk93
Messages postés
18
Date d'inscription
mardi 12 février 2013
Statut
Membre
Dernière intervention
10 février 2014
-
30 avril 2013 à 13:08
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 1 mai 2013 à 16:06
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 1 mai 2013 à 16:06
A voir également:
- Procedure remplir
- Organigramme a remplir word - Guide
- Remplir et signer pdf - Guide
- Comment remplir un chèque bnp - Télécharger - Comptabilité & Facturation
- Excel remplir automatiquement une cellule en fonction d'une autre ✓ - Forum Excel
- Le point d'entree de procedure est introuvable kernel32 dll ✓ - Forum Windows
7 réponses
kronkool
Messages postés
104
Date d'inscription
mardi 26 février 2013
Statut
Membre
Dernière intervention
12 septembre 2013
26
30 avril 2013 à 13:12
30 avril 2013 à 13:12
peux tu nous dire ce que donne montre l'execution stp?
faresk93
Messages postés
18
Date d'inscription
mardi 12 février 2013
Statut
Membre
Dernière intervention
10 février 2014
Modifié par faresk93 le 30/04/2013 à 13:45
Modifié par faresk93 le 30/04/2013 à 13:45
kronkool
Messages postés
104
Date d'inscription
mardi 26 février 2013
Statut
Membre
Dernière intervention
12 septembre 2013
26
30 avril 2013 à 13:51
30 avril 2013 à 13:51
ok je vois
peux-tu nous mettre TOUT ton code, parce que là je vois pas trop comment je peux t'aider :)
peux-tu nous mettre TOUT ton code, parce que là je vois pas trop comment je peux t'aider :)
Utilisateur anonyme
Modifié par nagashima le 30/04/2013 à 13:57
Modifié par nagashima le 30/04/2013 à 13:57
salut,
ce que je ne comprends pas c'est
et ensuite les scanf avec le while ... si le but est de faire saisir le nombre de colonnes et de lignes par l'utilisateur, essaye peu être :
ce que je ne comprends pas c'est
tab[l][c]
et ensuite les scanf avec le while ... si le but est de faire saisir le nombre de colonnes et de lignes par l'utilisateur, essaye peu être :
void SaisirTab(int ** tab) { int l = 0; int c = 0; do { printf("\n Lignes : "); scanf("%d",&l); printf("\n Colonnes : "); scanf("%d",&c); } while ((l<=0)&&(c<=0)); tab = (int **)malloc ( sizeof(int *) * l); /* Allocation 2e dimension */ for (int i = 0 ; i < l ; i++){ tab[i] = (int *)malloc (sizeof(int) * c); } for(i=0;i<l;i++) { for(j=0;j<c;j++) { printf("\n T[%d][%d] = ",i,j); scanf("%d",&tab[i][j]); } } }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
faresk93
Messages postés
18
Date d'inscription
mardi 12 février 2013
Statut
Membre
Dernière intervention
10 février 2014
30 avril 2013 à 14:44
30 avril 2013 à 14:44
#include<stdio.h> #include<conio.h> #include<stdlib.h> int l,c,i,j; void SaisirTab(int tab[l][c]) { do { printf("\n Lignes : "); scanf("%d",&l); printf("\n Colonnes : "); scanf("%d",&c); } while ((l<=0)&&(c<=0)); for(i=0;i<l;i++) { for(j=0;j<c;j++) { printf("\n T[%d][%d] = ",i,j); scanf("%d",&tab[i][j]); } } } void RemplirTab(int tab[l][c]) { for(i=0;i<l;i++) { for(j=0;j<c;j++) printf("%d \t",tab[i][j]); printf("\n"); } } float SommeTab(int tab[l][c]) { float s=0; for(i=0;i<l;i++) { for(j=0;j<c;j++) s+=tab[i][j]; } return s; } void main() { int tab[l][c]; float p1,p2; printf("\n Fares Khiary\n\n"); SaisirTab(tab); printf(" ----------\n"); RemplirTab(tab); p1=SommeTab(tab); p2=p1/(l*c); printf("\nLa somme des elements du tableau est %f\n",p1); printf("\nLa moyenne des elements du tableau est %f\n",p2); getch(); system("exit"); }
2 choses :
- au départ l et c ne sont pas défini (ils existent car énuméré, mais ne valent rien), donc tu récupère les valeurs qui se trouvent à ce moment dans la mémoire (regarde ici : https://www.commentcamarche.net/contents/196-langage-c-les-types-de-donnees ) , ton tableau est initialiser aléatoirement et tu veux inscrire des données dedans. c'est incohérent
- ensuite, je me répète," int tab[l][c] " n'est pas valable, ici tu passe un paramètre de type tableau à deux dimensions qui soit est initialisé (allocation) avant, soit qui sera initialisé dans ta fonction, mais là tu lui donne 2 variables non initalisé mais seulement déclaré.
Et c'est pour ces raisons que tu te retrouve avec des choses complètement farfelues, tu ne maîtrise pas la portée de tes donnés, ni la gestion de tes variables.
- au départ l et c ne sont pas défini (ils existent car énuméré, mais ne valent rien), donc tu récupère les valeurs qui se trouvent à ce moment dans la mémoire (regarde ici : https://www.commentcamarche.net/contents/196-langage-c-les-types-de-donnees ) , ton tableau est initialiser aléatoirement et tu veux inscrire des données dedans. c'est incohérent
- ensuite, je me répète," int tab[l][c] " n'est pas valable, ici tu passe un paramètre de type tableau à deux dimensions qui soit est initialisé (allocation) avant, soit qui sera initialisé dans ta fonction, mais là tu lui donne 2 variables non initalisé mais seulement déclaré.
Et c'est pour ces raisons que tu te retrouve avec des choses complètement farfelues, tu ne maîtrise pas la portée de tes donnés, ni la gestion de tes variables.
Utilisateur anonyme
30 avril 2013 à 15:02
30 avril 2013 à 15:02
je ne peux pas tester mais c'est un peu plus clair :
encore un point, tu retourne un float mais en fait la valeur est un entier (signé serai un plus mais osef). le float te sera utile au niveau de ta division, mais n'oublie pas de caster les éléments de ton calcul sinon les valeurs seront arrondies.
#include<stdio.h> #include<conio.h> #include<stdlib.h> int l,c,i,j; void SaisirTab(int ** tab) { int l = 0; int c = 0; do { printf("\n Lignes : "); scanf("%d",&l); printf("\n Colonnes : "); scanf("%d",&c); } while ((l<=0)&&(c<=0)); tab = (int **)malloc ( sizeof(int *) * l); /* Allocation 2e dimension */ for (int i = 0 ; i < l ; i++){ tab[i] = (int *)malloc (sizeof(int) * c); } for(i=0;i<l;i++) { for(j=0;j<c;j++) { printf("\n T[%d][%d] = ",i,j); scanf("%d",&tab[i][j]); } } } void RemplirTab(int ** tab) { for(i=0;i<l;i++) { for(j=0;j<c;j++) printf("%d \t",tab[i][j]); printf("\n"); } } float SommeTab(int ** tab) { float s=0; for(i=0;i<l;i++) { for(j=0;j<c;j++) s+=tab[i][j]; } return s; } void main() { int ** tab; float p1,p2; printf("\n Fares Khiary\n\n"); SaisirTab(tab); printf(" ----------\n"); RemplirTab(tab); p1=SommeTab(tab); p2=p1/(l*c); printf("\nLa somme des elements du tableau est %f\n",p1); printf("\nLa moyenne des elements du tableau est %f\n",p2); getch(); system("exit"); }
encore un point, tu retourne un float mais en fait la valeur est un entier (signé serai un plus mais osef). le float te sera utile au niveau de ta division, mais n'oublie pas de caster les éléments de ton calcul sinon les valeurs seront arrondies.
faresk93
Messages postés
18
Date d'inscription
mardi 12 février 2013
Statut
Membre
Dernière intervention
10 février 2014
30 avril 2013 à 16:51
30 avril 2013 à 16:51
je l'ai testé, ça marche pas, même problème ! :(
perso je ne suis pas fan de
mais plutot
mais pas sûr que ca change quoi que ce soit, par contre j'ai juste un mauvais souvenir pour le passage de tableau en paramètre si tu veux le conserver en mémoire, essaye peu-être de faire :
et dans ton main :
for(i=0;i<l;i++) { for(j=0;j<c;j++) { printf("\n T[%d][%d] = ",i,j); scanf("%d",&tab[i][j]); } }
mais plutot
int res = 0; for(i=0;i<l;i++) { for(j=0;j<c;j++) { printf("\n T[%d][%d] = ",i,j); scanf("%d",&res); tab[i][j] = res; } }
mais pas sûr que ca change quoi que ce soit, par contre j'ai juste un mauvais souvenir pour le passage de tableau en paramètre si tu veux le conserver en mémoire, essaye peu-être de faire :
int ** SaisirTab() { int l = 0; int c = 0; do { printf("\n Lignes : "); scanf("%d",&l); printf("\n Colonnes : "); scanf("%d",&c); } while ((l<=0)&&(c<=0)); int ** tab = (int **)malloc ( sizeof(int *) * l); /* Allocation 2e dimension */ for (int i = 0 ; i < l ; i++){ tab[i] = (int *)malloc (sizeof(int) * c); } for(i=0;i<l;i++) { for(j=0;j<c;j++) { printf("\n T[%d][%d] = ",i,j); scanf("%d",&tab[i][j]); } } return tab; }
et dans ton main :
... int ** tab = SaisirTab(tab); ...
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
1 mai 2013 à 11:07
1 mai 2013 à 11:07
perso je ne suis pas fan de
int res = 0;
for(i=0;i<l;i++)
{
for(j=0;j<c;j++)
{
printf("\n T[%d][%d] = ",i,j);
scanf("%d",&res);
tab[i][j] = res;
}
}
Bof, inutile de créer une variable temporaire. Peut-être une question d'habitude, mais scanf("%d",&tab[i][j]); est tout aussi joli. De plus, si tu crées une variable temporaire, il vaut mieux réduire sa portée. Donc le déclarer dans les boucles for.
Juste pour info : int ** tab = (int **)malloc ( sizeof(int *) * l);
Le cast est inutile et même déconseillé : int **tab=malloc(...);
int res = 0;
for(i=0;i<l;i++)
{
for(j=0;j<c;j++)
{
printf("\n T[%d][%d] = ",i,j);
scanf("%d",&res);
tab[i][j] = res;
}
}
Bof, inutile de créer une variable temporaire. Peut-être une question d'habitude, mais scanf("%d",&tab[i][j]); est tout aussi joli. De plus, si tu crées une variable temporaire, il vaut mieux réduire sa portée. Donc le déclarer dans les boucles for.
Juste pour info : int ** tab = (int **)malloc ( sizeof(int *) * l);
Le cast est inutile et même déconseillé : int **tab=malloc(...);
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
1 mai 2013 à 11:41
1 mai 2013 à 11:41
Et voici mes remarques :
void main() n'existe pas : c'est int main (void)
#include <conio.h> : non standard -> à supprimer.
int l,c,i,j; : variables globales fortement déconseillées -> à supprimer.
Dans le main() :
int tab[l][c]; -> l et c valent 0 dans ton cas. Soit tu fais int tab[10][5]; soit int tab[L][C]; avec #define L 10 et #define C 5 soit une allocation dynamique : int **tab;
Vu la structure de ton programme, le plus simple serait de l'allocation dynamique dans RemplirTab(). Cependant RemplirTab est une fonction de remplissage comme son nom l'indique et il est préférable de réaliser l'allocation avant.
Et plutôt que mettre des noms de variable l et c, mets plutôt ligne et colonne. C'est plus clair et c'est une bonne habitude à prendre.
float p1, p2; -> Vaut mieux des doubles.
getch(); -> Pas standard. Mets tout simplement : system("pause");
system("exit"); -> plutôt : exit(nombre); Mais comme on est dans le main : return 0;
Dans SaisirTab() :
while ((l<=0)&&(c<=0)); -> C'est plutôt ||.
Dans RemplirTab() :
void RemplirTab(int tab[l][c]) -> Plutôt : RemplirTab(int **tab) car allocation dynamique. Et même RemplirTab(int c, int l, int **tab) car pas de variables globales.
printf("\n"); -> Il vaut mieux le mettre dans la 1ère boucle for pour avoir un affichage matricielle.
J'ai pas eu le temps de tout relire.
Mais voici le code avec plein de corrections pour repartir sur de bonnes bases (même si tout n'est pas parfait).
void main() n'existe pas : c'est int main (void)
#include <conio.h> : non standard -> à supprimer.
int l,c,i,j; : variables globales fortement déconseillées -> à supprimer.
Dans le main() :
int tab[l][c]; -> l et c valent 0 dans ton cas. Soit tu fais int tab[10][5]; soit int tab[L][C]; avec #define L 10 et #define C 5 soit une allocation dynamique : int **tab;
Vu la structure de ton programme, le plus simple serait de l'allocation dynamique dans RemplirTab(). Cependant RemplirTab est une fonction de remplissage comme son nom l'indique et il est préférable de réaliser l'allocation avant.
Et plutôt que mettre des noms de variable l et c, mets plutôt ligne et colonne. C'est plus clair et c'est une bonne habitude à prendre.
float p1, p2; -> Vaut mieux des doubles.
getch(); -> Pas standard. Mets tout simplement : system("pause");
system("exit"); -> plutôt : exit(nombre); Mais comme on est dans le main : return 0;
Dans SaisirTab() :
while ((l<=0)&&(c<=0)); -> C'est plutôt ||.
Dans RemplirTab() :
void RemplirTab(int tab[l][c]) -> Plutôt : RemplirTab(int **tab) car allocation dynamique. Et même RemplirTab(int c, int l, int **tab) car pas de variables globales.
printf("\n"); -> Il vaut mieux le mettre dans la 1ère boucle for pour avoir un affichage matricielle.
J'ai pas eu le temps de tout relire.
Mais voici le code avec plein de corrections pour repartir sur de bonnes bases (même si tout n'est pas parfait).
#include<stdio.h> #include<stdlib.h> int **SaisirTab(int *l, int *c) { int **tab; int i, j; do { printf("\n Lignes : "); scanf("%d",l); printf("\n Colonnes : "); scanf("%d",c); } while ((*l<=0)||(*c<=0)); for(i=0;i<*l;i++) { tab=malloc(*l*sizeof(int*)); for(j=0;j<*c;j++) { tab[i]=malloc(*c*sizeof(int)); printf("\n T[%d][%d] = ",i,j); scanf("%d",&tab[i][j]); } } return tab; } void RemplirTab(int l, int c, int **tab) { int i, j; for(i=0;i<l;i++) { for(j=0;j<c;j++) printf("%d \t",tab[i][j]); } printf("\n"); } float SommeTab(int l, int c, int **tab) { int i, j; float s=0; for(i=0;i<l;i++) { for(j=0;j<c;j++) s+=tab[i][j]; } return s; } int main(void) { int l,c; int **tab; float p1,p2; printf("\n Fares Khiary\n\n"); tab=SaisirTab(&l, &c); printf(" ----------\n"); RemplirTab(l, c, tab); p1=SommeTab(l,c, tab); p2=p1/(l*c); printf("\nLa somme des elements du tableau est %f\n",p1); printf("\nLa moyenne des elements du tableau est %f\n",p2); /*free() à utiliser*/ system("pause"); return 0; }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
1 mai 2013 à 16:06
1 mai 2013 à 16:06
Et voilà 2, 3 trucs corrigés :
Je te laisse implémenter les free() à titre d'exercice. Mais le programme devrait déjà fonctionner.
#include <stdio.h> #include <stdlib.h> int **SaisirTab(int *l, int *c) { int **tab; int i, j; do { printf("\n Lignes : "); scanf("%d",l); printf("\n Colonnes : "); scanf("%d",c); } while ((*l<=0)||(*c<=0)); tab=malloc(*l*sizeof(int*)); for(i=0;i<*l;i++) { tab[i]=malloc(*c*sizeof(int*)); for(j=0;j<*c;j++) { printf("\n T[%d][%d] = ",i,j); scanf("%d",&tab[i][j]); } } return tab; } void RemplirTab(int l, int c, int **tab) { int i, j; for(i=0;i<l;i++) { for(j=0;j<c;j++) printf("%d \t",tab[i][j]); printf("\n"); } } float SommeTab(int l, int c, int **tab) { int i, j; float s=0; for(i=0;i<l;i++) { for(j=0;j<c;j++) s+=tab[i][j]; } return s; } int main(void) { int l,c; int **tab; float p1,p2; printf("\n Fares Khiary\n\n"); tab=SaisirTab(&l, &c); printf(" ----------\n"); RemplirTab(l, c, tab); p1=SommeTab(l,c, tab); p2=p1/(l*c); printf("\nLa somme des elements du tableau est %f\n",p1); printf("\nLa moyenne des elements du tableau est %f\n",p2); /*free() à utiliser*/ system("pause"); return 0; }
Je te laisse implémenter les free() à titre d'exercice. Mais le programme devrait déjà fonctionner.