Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : supprimer un element d'une matrice [ Divers / Débutant(e) ] (hoijir)

lundi 8 janvier 2007 à 01:26:32 | supprimer un element d'une matrice

hoijir

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


lundi 8 janvier 2007 à 19:24:21 | Re : supprimer un element d'une matrice

lacousine

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

lundi 8 janvier 2007 à 21:35:45 | Re : supprimer un element d'une matrice

SAKingdom

Membre Club
"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.

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++ (@++)


mardi 9 janvier 2007 à 01:15:10 | Re : supprimer un element d'une matrice

hoijir

merci bcp je vais essayer de le modifier.

 Merci bien




Cette discussion est classé dans : printf, do, while, scanf, note


Répondre à ce message

Sujets en rapport avec ce message

question sur le DO et WHILE fonction [ par Enishi ] Bonjour!J'ai commencer à utiliser Borland C++ Builder 6 et je n'arrive pas à faire fonctionner la fonction DO - WHILE.... D'après moi, j'utilise la ma Reprendre la main sur une erreur de SCANF [ par gollum ] voila : mon monceau de codec='n';printf("Entrer le coeff %d du terme %d \n",i,i);result = scanf("%f",&coef); while (result==0 && c=='n'){ printf("f pb programme très très simple [ par surfeurnet ] voila il s'agit d'un programme très simple qui ne fait pas d'erreurs à la compilation avec dev-cpp mais qui plante quand je l'exécute :#include char n Printf bizarre [ par x0s ] Bonjour Amis codeurs,J'ai un probleme avec cette petite fonction, je débute en c, merci de m'aider, voici le problème:#include /* Autor RAND : éviter de sortir un nombre déjà sorti... prob ! [ par did2604 ] Bonsoir,J'ai un problème assez spécial à vous exposer. Je me casse la tête dessus depuis 2h et pas moyen de trouver le bug. Voilà, j'utilise donc la f écriture de fichier [ par cobra176 ] je recherche le moyen d'écrire sur un fichier texte les lignes que j'ai recherche.  system("cls");printf("saisir le mot rechercher en respectant les m interface de jeu [ par cafou ] sltest ce que qu'elqu'un peut me propose une interphase graphique et des animations au jeu en language c si dessousmerci d'avance#include#include#incl Langage C (saisie de données sur fichier) [ par doggy59115 ] Bonjour à tous ! Je bloque sur mon programme en langage C. Je suis novice !Je dois créer un programme où l'on rentre : nom, prénom, ville, adresse, co do{.................}while(FALSE). [ par oudkaramla ] bonjour tout le mondej'ai un programme qui utilise la boucle do mais combiné avec false comme suitdo{................................}while(FALSE).je programme en C [ par graminach ] on a un pb pour la question 2b!le programme ne tourne pas en boucle et affiche meme en cas de valeur correcte erreurmerci d'avancehttp://www-ipst.u-st


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,577 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.