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
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 !

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
peux tu nous dire ce que donne montre l'execution stp?
0
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
0
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
ok je vois
peux-tu nous mettre TOUT ton code, parce que là je vois pas trop comment je peux t'aider :)
0
salut,
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]);  
  }  
 }  
}  


0

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
#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");

}
0
Utilisateur anonyme
30 avril 2013 à 14:57
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.
0
Utilisateur anonyme
30 avril 2013 à 15:02
je ne peux pas tester mais c'est un peu plus clair :

#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.
0
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
je l'ai testé, ça marche pas, même problème ! :(
0
Utilisateur anonyme
30 avril 2013 à 17:02
perso je ne suis pas fan de
 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);
...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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(...);
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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).
#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;

}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 mai 2013 à 16:06
Et voilà 2, 3 trucs corrigés :
#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.
0