Supprimer un element d'une matrice

hoijir Messages postés 2 Date d'inscription jeudi 18 août 2005 Statut Membre Dernière intervention 9 janvier 2007 - 8 janv. 2007 à 01:26
hoijir Messages postés 2 Date d'inscription jeudi 18 août 2005 Statut Membre Dernière intervention 9 janvier 2007 - 9 janv. 2007 à 01:15
salut ,voila mon petit programme, j'ai un probleme avec la suppression en case 5, est ce quelqu'un peut m'aider?

#include<stdio.h>
#define dim 20


main()
{
int n, t[dim][4], i, choix, x, d, l=0, a, y, j, z, tmp,p;
 do
 {
 printf("\n\n\t\t\t Menu \n\n");
 printf("\t\t1-creation de la table\n");
 printf("\t\t2-inserer\n");
 printf("\t\t3-modifier\n");
 printf("\t\t4-afficher\n");
 printf("\t\t0-Quitter\n\n");




 printf("\t\tChoiix 1-->4 :");
 scanf("%d",&choix);


 switch(choix)
 {
  case 1:
   do
    {
    printf("\n\n\nEntrer le nombre des entregistrements:");
    scanf("%d",&n);
    }
   while (n>dim && n<=0);


  for (i=1; i<=n; i++)
   {
    printf("\n\nL'element %d:\n",i);
    do
    {
    printf("le num:");
    scanf("%d",&t[i][1]);
    }
    while(t[i][1]<0);
   do
    {
    printf("la 1er note:");
    scanf("%d",&t[i][2]);
    }
    while(t[i][2]>20 || t[i][2]<0);
    do
    {
    printf("la 2eme note:");
    scanf("%d",&t[i][3]);
    }
    while(t[i][3]>20 || t[i][3]<0);
    t[i][4]=i+1;
   }
        d=1;l=n+1;t[n][4]=0;
        for (i=l;i<=dim;i++)
        {t[i][4]=i+1;}
        t[dim][4]=0;
  break;


  case 2:
            do
    {
    printf("le num:");
    scanf("%d",&a);
    }
    while(a<0);
    if(a<t[d][1])
    {
                 t[l][1]=a;
                do
                 {
                 printf("la 1er note:");
                 scanf("%d",&t[l][2]);
                 }
                 while(t[l][2]>20 || t[l][2]<0);
                 do
                 {
                 printf("la 2eme note:");
                 scanf("%d",&t[l][3]);
                 }
                 while(t[l][3]>20 || t[l][3]<0);
                 y=l;
                 l=t[l][4];
                 t[y][4]=d;
                 d=y;
    }
    else
    {
        j=z;
        z=d;
        while(a>t[z][1] && z!=0)
        {
            j=z;
            z=t[z][4];
        }
        if(a==t[z][1])
        {
            printf("deja existe");
        }
        else
        {
        //if (z!=0)
        //{
            t[l][1]=a;
                    do
                     {
                     printf("la 1er note:");
                     scanf("%d",&t[l][2]);
                     }
                     while(t[l][2]>20 || t[l][2]<0);
                     do
                     {
                     printf("la 2eme note:");
                     scanf("%d",&t[l][3]);
                     }
                     while(t[l][3]>20 || t[l][3]<0);
                     y=l;
                     l=t[l][4];
                     t[y][4]=z;
                     t[j][4]=y;
                //}
        }
    }
  break;


  case 3:
   printf("\n\nEntrer l'element a modifie:");
   scanf("%d",&x);
            for (i=1;i<l;i++)
            {
                if (x==i)
    {
     printf("\n\nL'element %d:\n",i);
     do
      {
      printf("la 1er note:");
      scanf("%d",&t[i][2]);
      }
      while(t[i][2]>20 || t[i][2]<0);
      do
      {
      printf("la 2eme note:");
      scanf("%d",&t[i][3]);
      }
      while(t[i][3]>20 || t[i][3]<0);
                }
            }
  break;


  case 4:
  i=d;
        while(i!=0)
  {
                printf("\n\nL'element %d:\n",i);
                printf("le num est:%d\n",t[i][1]);
                printf("la 1er note est:%d\n",t[i][2]);
                printf("la 2eme note est:%d\n",t[i][3]);
                printf("l'adresse suivante est:%d\n\n",t[i][4]);
                i=t[i][4];
  }
  printf("\nle 1er element se trouve a l'indice:%d\n\n",d);
  printf("\nle 1e nouveau element sera ajouter a l'indice:%d\n\n",l);
  break;


  case 5:
  printf("\n\nentrer l'element a supprime:");
        scanf("%d",&x);
        for(i=1;i<l;i++)
            if(i==x)
            {
                while(i<l)
                {
                    t[x][1]=t[x+1][1];
                    t[x][2]=t[x+1][2];
                    t[x][3]=t[x+1][3];
                    t[x][4]=t[x+1][4];
                    i=i+1;
                }


            }


  break;
 }
 printf("\n\n\t\t***************************\n\n");
 }
 while (choix!=0);
}




 



 Merci bien

3 réponses

cs_lacousine Messages postés 58 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 13 juillet 2007
8 janv. 2007 à 19:24
Premièrement, je vois une erreur dans le traitement de ton tableau. Tu dépasses les bornes. Un tableau commence à 0 et fini à X-1

exemple un tableau : t[4] .... ca commence à 0 et fini à 3
et pour un tableau à 2 dimensions c'est la même chose.
4X4 =       t[4][4] .... ca commence à 0 et fini à 3 pour la ligne et 0 à 3 pour la colonne.

col 0, col 1, col 2, col 3
   0 ,    0 ,      0 ,     0        ===> ligne 0
   0 ,    0 ,      0 ,     0        ===> ligne 1
   0 ,    0 ,      0 ,     0        ===> ligne 2
   0 ,    0 ,      0 ,     0        ===> ligne 3

dans ton Case 5 , tu écris ceci :
 while(i<l)
                {
                    t[x][1]=t[x+1][1];
                    t[x][2]=t[x+1][2];
                    t[x][3]=t[x+1][3];
                    t[x][4]=t[x+1][4];
                    i=i+1;
                }
jespère que tu es conscient que cette ligne ci te cause des problèmes :   t[x][4]=t[x+1][4];

tu as débordement des bornes de ton tableau. Voici 2 facon correcte d'écrire le meme algo :

while(i<l)
                {
                    t[x][0]=t[x+1][0];
                    t[x][1]=t[x+1][1];
                    t[x][2]=t[x+1][2];
                    t[x][3]=t[x+1][3];
                    i=i+1;
                }

ou

while(i<l)
                {
                    t[x][1-1]=t[x+1][1-1];
                    t[x][2-1]=t[x+1][2-1];
                    t[x][3-1]=t[x+1][3-1];
                    t[x][4-1]=t[x+1][4-1];
                    i=i+1;
                }

De plus, la ligne suivante devrait etre changer : for(i=1;i<l;i++) pour for(i=0; i<0; i++), afin de débuter ta recherche à la première case de ton tableau qui est  : t[0][0] et non  t[1][1]. Pour une matrice 4X4, tu devrais avoir les cases suivantes :

t[0][0] , t[0][1], t[0][2], t[0][3]
t[1][0] , t[1][1], t[1][2], t[1][3]
t[2][0] , t[2][1], t[2][2], t[2][3]
t[3][0] , t[3][1], t[3][2], t[3][3]

Je ne sais pas c'est comment tu vois la suppression d'un élément dans ton tableau et le but de ton programme, mais il y a plusieurs facon de voir la destruction. Pour faire simple, tu pourrais mettre une valeur arbritraire dans ton tableau ex: -99 si tu prévois ne jamais avoir de donnée négative dans ton tableau. Tu pourrais faire : t[0][0] = -99 et lorsque tu affiches tes données tu fais une validation.. if t[0][0] > 0 alors affiche les données.

Parcontre si tu vois ton programme comme une file de donnée, exemple : t[80]
1- tu demandes quel élément à supprimer
2- tu parcours ton tableau jusqu'à l'élement X-1
3- tu copies l'élément X+1 dans X-1, tout en vérifiant pour ne pas dépasser ton tableau... donc X+1 doit être plus petit que 80. ( dans cette exemple )
4- il reste à penser ce que tu écris dans les cases qui doivent etre effacer. à moins que tu t'en fou et te garde un compteur qui indique combien d'élément tu dois avoir au total dans ta file. ( matrice ).

Il faudrait que tu expliques ce que tu veux faire et ou tu es rendu après avoir fait tes modifications de code. Ciaooooo amuse toi bien.

Mieux vaut être blonde et poser des questions que de rester ignorante !!!!
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
8 janv. 2007 à 21:35
"De plus, la ligne suivante devrait etre changer : for(i= 1;i<l;i++) pour for(i=0; i<0; i++) "

Ne sera jamais vrai. i est initialisé à 0 mais la boucle quitte sitôt que i egal ou est supérieur à 0.

[auteurdetail.aspx?ID =565641 hoijir] >> Il faudrait te replonger dans un livre de C. Plusieurs sections sont inutiles et d'autres à refaire complètement.
Essais de bien comprendre les sections du livre traitent des tableaux et des itérations.
C'est le meilleur conseil que je peux te donner.

Bonne continuation.
C++ (@++)<!--
0
hoijir Messages postés 2 Date d'inscription jeudi 18 août 2005 Statut Membre Dernière intervention 9 janvier 2007
9 janv. 2007 à 01:15
merci bcp je vais essayer de le modifier.

 Merci bien
0
Rejoignez-nous