IUP2 : TP informatique 3

les tableaux statiques et dynamiques

Question 1 : saisie et affichage d'un tableau statique

Soit le programme principal :
typedef float * tableau;

-------------------------

void main(void)
{
 char rep;
 int nb=0;
 float tab[100];
 puts("combien d'éléments ?");
 scanf("%d",&nb);
 do
 {
  puts("Saisie, Affiche, Moyenne, Quitter ?");
  printf("%c\n",rep=toupper(getch()));
  switch (rep)
  {
   case 'S':saisie(tab,nb);break;
   case 'A':affiche(tab,nb);break;
   case 'M':moyenne(tab,nb);
  }
 }while (rep!='Q'); 
}
écrire les fonctions saisie, affiche et moyenne.

2) passer en tableau dynamique

en ne modifiant que le programme principal

3) supression d'une valeur

permettre de supprimer une valeur dans le tableau (on gère deux variables : nb et dim), nb donne le nombre de valeurs réellement dans le tableau, alors que dim est la taille du tableau telle qu'il a été dimensionné (par malloc). On a donc toujours nb<=dim.
void enleve(tableau t, int *nb)
{
 int lequel, i;
 puts("lequel?");
 scanf("%d",&lequel);
 for(i=lequel+1;i<(*nb);i++)t[i-1]=t[i];
 (*nb)--;
}

4) Ajout d'une valeur

Permettre d'ajouter une valeur (et si nécessaire agrandir le tableau, de 10% par exemple)

je donne au bout d'un moment :

tableau agrandit(tableau tab, int *dim, int nb)
{
 tableau grdtab;
 int d,i;
 d=((*dim)*11/10+1;
 grdtab=malloc(d*sizeof(float));
 for(i=0;i<nb;i++) grdtab[i]=tab[i];
 free(tab);
 *dim=d;
 return(grdtab);
}

Solution complète

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

typedef float * tableau;

void saisie(tableau tab,int a)
   {
    int i;
    printf("\nC'est parti pour la saisie des %d valeurs\n",a);
    for (i=0;i<a;i++)
      {
      printf("position %d : donnez la valeur : ",i+1);
      scanf("%f",&(tab[i]));
      }
   }

void affiche(tableau tab,int a, int dim)
   {
     int i;
     printf("\nle tableau contient %d valeurs, pour une dimension de %d",a,dim);
     printf("\nvaleurs du tableau : ");
     for (i=0;i<a;i++) printf ("\n\tposition %d : %f",i+1,tab[i]);
   }

void moyenne(tableau tab,int a)
   {
     int i;
     float s=0,m;
     for (i=0;i<a;i++) s=s+tab[i];
     m=s/a;
     printf("\nLa moyenne vaut %f",m);
   }

int enlever(tableau tab,int b)
    {
      int i,g;
      printf("\nquelle est la position de la valeur à enlever ? ");
      scanf("%d",&g);
      for (i=g-1;i<b;i++) tab[i]=tab[i+1];
      return (b-1);
    }

void rajouter(tableau *tab,int *nb,int *dim)
    {
      tableau gros;
      int i,g;
      float val;
      if(*nb>=*dim)
	{
	(*dim)=(11*(*dim))/10+1;
	gros=malloc((*dim)*sizeof(float));
	for(i=0;i<*nb;i++)gros[i]=(*tab)[i];
	free(*tab);
	*tab=gros;
	}
      printf("\nQuelle valeur voulez-vous ajouter ? ");
      scanf("%f",&val);
      printf("En quelle position voulez-vous l'ajouter (entre 1 et %d) ? ",*nb+1);
      scanf("%d",&g);
      for (i=*nb;i>g-1;i--) (*tab)[i]=(*tab)[i-1];
      (*tab)[g-1]=val;
      (*nb)++;
    }



void main(void)
   {
     tableau tab,tab1; char rep; int nb,dim,i;
     printf ("\nCombien de valeurs ? ");
     scanf ("%d",&nb);
     dim=nb;
     tab=malloc(nb*sizeof(float));
     do
	{
	  printf ("\nSaisie,Affichage,Moyenne,Enlever,Rajouter,Quitter?");
	  rep=toupper(getche());
	  switch (rep)
	     {
	       case 'S': saisie (tab,nb);break;
	       case 'A': affiche (tab,nb,dim);break;
	       case 'M': moyenne (tab,nb);break;
	       case 'E': nb=enlever (tab,nb);break;
	       case 'R': rajouter(&tab,&nb,&dim);
	     }
	}
     while (rep!='Q');
     puts("\n ---- salut ----");
   }


Patrick TRAU,ULP - IPST 2/12/97