Prolème Procédure Remplir Tableau
faresk93
Messages postés
18
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
salam alaykom,
Voilà ma procédure :
----------
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]);
}
}
}
--------------
Ceci fonctionne mais pas vraiment,
les valeurs ne sont pas attribués aux éléments du tableaux, l'exécution me montre des choses très bizarres !
De l'aide !
Voilà ma procédure :
----------
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]);
}
}
}
--------------
Ceci fonctionne mais pas vraiment,
les valeurs ne sont pas attribués aux éléments du tableaux, l'exécution me montre des choses très bizarres !
De l'aide !
A voir également:
- Procedure remplir
- Organigramme a remplir word - Guide
- Comment remplir un document pdf - Guide
- Procédure de frigo vide - Forum Vos droits sur internet
- Le point d'entrée de procédure eventsetinformation est introuvable advapi32.dll - Forum Windows
- Fiche de paie à remplir gratuit excel ✓ - Forum compta / gestion
7 réponses
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 :)
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#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.
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.
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); ...
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(...);
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; }
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.