Bien programmer en langage C
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
-20%
Le deal à ne pas rater :
Pack Gigabyte Ecran PC Gamer 27″ LED M27Q (rev2.0) + Radeon RX 6950 ...
749 € 939 €
Voir le deal

Tableaux Uni-dimensionels Creux ! HELP SVP!

2 participants

Aller en bas

Tableaux Uni-dimensionels Creux ! HELP SVP! Empty Tableaux Uni-dimensionels Creux ! HELP SVP!

Message  zemzm Mar 15 Juin 2010 - 6:36

Bonjour tout le monde.

j'ai essayé de résoudre un exercice sur les tableaux représentés par une structure. je vous soumis l'exo et ma correction. merci de me dire ce que vous en pensez. Cette exo me trouble car je ne sais vraiment pas si ma solution est bonne ou complètement fausse. Merci pour votre aide.


Dans cette exercice, on nous propose de définir des fonctions permettant de compresser des tableaux et des fonctions permettant de manipuler ces tableaux.

La compression élimine les '0' (zéro) continus dans un tableau afin d'économiser de l'espace mémoire.
Le tableau compressé sera représenté par une structure nommée "creux" . elle contient trois informations :
une tableau d'indice ind et un tableau de valeurs réelles Val, et un entier nb.

Les règles pour créer un tableau compressé C à partir d'un tableau T sont les suivantes:

-- Pour le tableau d'indices, C.ind[p]=i si T[i] est le (p+1)ème élément de T différent de 0 (C.ind [0] étant le 1er élément de T différent de 0).
-- Pour le tableau de valeurs val, C.val[p] = T[i].
-- nb est le nombre d'élément non nuls du tableau T.


Exemple: soit le Tableau T = |0|1.6|0| 9|7|
La structure Creuse lui correspondant sera :
pour le tableau d 'indice C.ind = |1|3|4|.
Pour le tableau de Valeurs C.val = |1.6|9|7|.


Questions:

Q1) Déclarez lz type Struct creux.Les tableaux val et ind sont alloués dynamiquement .

Q2) Faites une fonction struct creux *new(int n). qui alloue dynamiquement une structure creuse où les tableaux ind et val seront de taille n.Cette fonction retourne un pointeur vers cette structure.


Q3) Faites une fonction struct creux *initialise(float T[N]) , qui, à partir d'un tableau T, crée dynamiquement la structure creuse correspondante et initialise celle ci à l'aide du tableau T. Cette fonction retourne un pointeur vers cette structure.

Mes Réponses: :
Code:

#include <stdio.h>

typedef struct creux
{
  int *ind;
  float *val;                  // Q1
  int nb;

}
Creux;

Creux *new (int n)              //Q2
{
  Creux *C;

  if (C == NULL)
      printf ("ALLOCATION MEMOIRE ECHOUEE !");
  else
  {
      C->ind = malloc (n * sizeof (int));
      C->val = malloc (n * sizeof (float));
  }
  return C;
}

Creux *Initialise (float T[taille], int taille) //Q3
{
  int i;
  Creux *C;

  C = new (taille);
  C.nb = 0;
  For (i = 0;
        i < taille;
        i++)
  {
      if (T[i] != 0)
      {
        C.nb++;                // on incrémente le nombre de valeur non nulles
        C->(ind + i) = C.nb;  // on range ici, dans le tableau inb, le num des indices des valeures non nulles
        C->val = T[(ind + i)]; //on rempli le tableau C.val des valeur non nulles de T[].

        printf ("les valeures du tabeleau compressées sont: %d\n",
                C->(val + i));
      }
  }
}
merci pour vos réponses.


Dernière édition par -ed- le Mar 15 Juin 2010 - 14:02, édité 2 fois (Raison : Mise en forme du code)

zemzm

Messages : 3
Date d'inscription : 08/03/2010

Revenir en haut Aller en bas

Tableaux Uni-dimensionels Creux ! HELP SVP! Empty Re: Tableaux Uni-dimensionels Creux ! HELP SVP!

Message  -ed- Mar 15 Juin 2010 - 13:56

<Étude en cours ...>

Il y a déjà pas mal d'erreurs dans le code ...
Code:


-------------- Build: Debug in hello ---------------

Compiling: main.c
Linking console executable: bin\Debug\hello.exe
C:\dev\hello\main.c: In function 'new':
C:\dev\hello\main.c:21: warning: implicit declaration of function 'malloc'
C:\dev\hello\main.c:21: warning: incompatible implicit declaration of built-in function 'malloc'
C:\dev\hello\main.c: At top level:
C:\dev\hello\main.c:29: error: 'taille' undeclared here (not in a function)
C:\dev\hello\main.c: In function 'Initialise':
C:\dev\hello\main.c:35: error: request for member 'nb' in something not a structure or union
C:\dev\hello\main.c:36: warning: implicit declaration of function 'For'
C:\dev\hello\main.c:36: error: expected ')' before ';' token
C:\dev\hello\main.c:39: error: expected ';' before '{' token
C:\dev\hello\main.c:29: warning: unused parameter 'T'
Process terminated with status 1 (0 minutes, 3 seconds)
4 errors, 4 warnings
Éviter l'identificateur 'new' qui est réservé en C++ (peut créer une confusion si le programme est lié à une application C++). Je propose 'create'.

Manque <stdlib.h> pour malloc() ...

Ceci compile, mais je n'ai pas du tout l'impression que ça fasse ce que tu veux ...
Code:

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
  int *ind;
  float *val;                  /* Q1 */
  int nb;

}
Creux;

Creux *create (int n)              /* Q2 */
{
  Creux *C = malloc (sizeof *C);

  if (C == NULL)
  {
      printf ("ALLOCATION MEMOIRE ECHOUEE !");
  }
  else
  {
      C->ind = malloc (n * sizeof (int));
      C->val = malloc (n * sizeof (float));
  }

  return C;
}

Creux *Initialise (float T[], int taille) /* Q3 */
{
  int i;
  Creux *C;

  C = create (taille);
  C->nb = 0;
  for (i = 0;
        i < taille;
        i++)
  {
      if (T[i] != 0)
      {
        C->nb++;              /* on incrémente le nombre de valeur non nulles */
        C->ind[i] = C->nb;  /* on range ici, dans le tableau inb, le num des indices des valeures non nulles */
        C->val[i] = T[C->ind[i]]; /* on rempli le tableau C.val des valeur non nulles de T[]. */

        printf ("les valeurs du tableau compressé sont : %d\n",
                C->val[i]);

      }
  }

  return C;
}

void display(Creux *c)
{
}

int main (void)
{
  float T[] = {1,0,0,2,0,3,4,0,0,0,5,6,7};

  Creux *c = Initialise (T, sizeof T / sizeof *T);

  display(c);

  return 0;

}
Il faudrait une fonction qui affiche le contenu du tableau compressé, une qui l'expanse et une qui affiche le contenu expansé ...
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

Tableaux Uni-dimensionels Creux ! HELP SVP! Empty merci pour ta réponse .

Message  zemzm Mer 16 Juin 2010 - 21:26

bonsoir -ed,
je tiens a te remercie pour ta réponse. en effet ta solution marche bien. je l'ai arrangé un peu et cela donne.
Code:
#include <stdio.h>
#include <stdlib.h>


typedef struct creux
{
int *ind;
float *val;
int nb;

}Creux;



Creux *new_creux(int n)
{
Creux *C;
   
   C= malloc(sizeof(Creux));
      
        if(C==NULL)
            {printf("//!\\ERREUR D'ALLOCATION DU CREUX //!\\ \n");}
        
             else{
         
                C->ind= malloc(n* sizeof (int));
               
                C->val= malloc(n* sizeof (float));
                
                 }   

      if ((C->ind==NULL)||(C->val==NULL))
       {printf("//!\\ERREUR D'ALLOCATION DES DEUX TABLEAUX IND ET VAL //!\\ \n");}
        

      
return C;
      

}
   
   
   
Creux *Initialise(float *T, int taille)

 {
int i;
Creux *C;
   
 C=new_creux(taille);
   
    for (i=0;i < taille;i++)
     {
        if(T[i]!=0)
          {
         
          C->ind[i]=i;// on range ici, dans le tableau inb, le num des indices des valeures non nulles
         
          C->val[i]=T[i];//on rempli le tableau C.val des valeur non nulles de T[].
         
          C->nb+=1;    // on incrémente le nombre de valeur non nulles
           printf("les valeur du tableau creux : %f\n ",C->val[i]);
          
          }
      }   
return C;   

}
   
int main()
{
 Creux *C1;
 float tab[5]= {0,5,0,4,6};
 int i;
 int taille=5;
   C1=new_creux(taille);
   C1=Initialise(tab,taille);   
 
      printf("les valeures non nulles est de : %d\n ",C1->nb);
         
free(C1);   
return 0;   
   }   

*****************
j'ai compilé ce programme et et cela compile et cela donne bien le résultat attendu.
bonne soirée à toi.

zemzm

Messages : 3
Date d'inscription : 08/03/2010

Revenir en haut Aller en bas

Tableaux Uni-dimensionels Creux ! HELP SVP! Empty Re: Tableaux Uni-dimensionels Creux ! HELP SVP!

Message  -ed- Mer 16 Juin 2010 - 21:44

Dans main(),
Code:
C1 = new_creux (taille);
ne sert a rien, c'est déjà fait dans Initialise() (ou alors il faut modifier l'interface et le comportement de Initialise()).

Comme déjà signalé, il manque des fonctions d'affichage pour prouver le bon fonctionnement.
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

Tableaux Uni-dimensionels Creux ! HELP SVP! Empty Re: Tableaux Uni-dimensionels Creux ! HELP SVP!

Message  Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Ne ratez plus aucun deal !
Abonnez-vous pour recevoir par notification une sélection des meilleurs deals chaque jour.
IgnorerAutoriser