[C] tableau [Debutant]

tableau [Debutant] [C] - C - Programmation

Marsh Posté le 22-01-2005 à 19:18:59    

pour un exo il faut que j'arrive, entre autre, a saisir un tableau (2D) d'entier,sachant que chaque entier ne doit apparaitre qu'une seule fois dans le tableau.
 
J'ai fait le prog pour un tableau à 1D mais je me demande si ca fait pas un peut "usine à gaz" :sarcastic:  
surtout que maintenant je doit le transformer pour un tableau 2D, c'est pas gagné...

Code :
  1. #include <conio.c>
  2. #include <stdio.h>
  3. main()
  4. {
  5.     int x,y,v=0,t,tab[5],temp;
  6.     for (x=0;x<6;x++)
  7.     {
  8.         do
  9.         {
  10.             gotoxy(5+2*x,5);
  11.             scanf("%d",&temp);
  12.             if(x==0)
  13.             {
  14.                 tab[0]=temp;
  15.                 v=0;
  16.             }
  17.             else
  18.             {
  19.                 y=-1;
  20.                 do
  21.                 {
  22.                     y=y+1;
  23.                     if (temp==tab[y])
  24.                     {
  25.                         v=1;
  26.                         t=1;
  27.                     }
  28.                     else
  29.                     {
  30.                         v=0;
  31.                         t=0;
  32.                     }
  33.                  if(y==x-1)
  34.                  {
  35.                      t=1;
  36.                  }
  37.           }       
  38.              while(t!=1);
  39.           } 
  40.         }
  41.         while(v==1);
  42.         tab[x]=temp;
  43.     }
  44.     for (x=0;x<6;x++)
  45.     {
  46.         gotoxy(5+2*x,8);
  47.         printf("%d",tab[x]);
  48.     }
  49.     getch();
  50. }


voila.. je me demandais si il existe une solution un peut moins lourde qui faciliterai la convertion pour les tableaux 2D

Reply

Marsh Posté le 22-01-2005 à 19:18:59   

Reply

Marsh Posté le 22-01-2005 à 20:16:48    

:heink:
il doit manquer un passage dans tes explications...
l'utilité du biniou exactement ?
dans quel contexte ?

Reply

Marsh Posté le 22-01-2005 à 22:59:20    

Salut,
 
Je suis intéressé aussi. Mais je ne comprends pas non plus tes explications. Et pourquoi utilises-tu un fichier conio.c ?

Reply

Marsh Posté le 23-01-2005 à 00:30:59    

ok je vous met une partie du sujet ca devrai etre plus claire  :)  
 
Ecrire un programe capable d'effectuer diverses opérations sur un tableau 2D
* la saisie du nbr de ligne (<8) et de colonnes (<8) de ce tableau
* La saisie d'un tableau d'entiers. Pas de saisie multiple d'un même entier (tout entier ne doit apparaître qu'une seul fois dans le tableau ...)
* [...]
 
comme je m'embrouillai pas mal a tenter de faire le 2eme point avec un tableau 2D (tab[8][8] par exemple) j'ai fait le prog si dessus avec un tableau 1D (tab[8] par ex), mais modifier ce programme pour le faire coller avec le sujet est un peut plus compliqué que prévu  :pt1cable:  
. C'est pour ca que j'aimerai savoir si il est possible de trouver une solution plus simple...
 

Citation :


Je suis intéressé aussi. Mais je ne comprends pas non plus tes explications. Et pourquoi utilises-tu un fichier conio.c ?


 
ben c'est une habitude d'apeler conio et stdio  [:sinclaire]  meme si y en a pas forcement besoin, mais dans ce cas on a besoin de conio.c ...

Reply

Marsh Posté le 23-01-2005 à 00:43:06    

Il faut inclure des .h  
De plus conio n'est pas portable

Reply

Marsh Posté le 23-01-2005 à 01:05:25    

fafounet a écrit :

Il faut inclure des .h  
De plus conio n'est pas portable


 
je me sert de Dev-C++ 4.9.9.0 qui utilise conio.c et non conio.h...
et pour se qui est de la portabilité, j'ai pas encore le niveau pour en tenir compte  [:figti]

Reply

Marsh Posté le 23-01-2005 à 10:46:57    

hotcat a écrit :

pour un exo il faut que j'arrive, entre autre, a saisir un tableau (2D) d'entier,sachant que chaque entier ne doit apparaitre qu'une seule fois dans le tableau.
 
J'ai fait le prog pour un tableau à 1D mais je me demande si ca fait pas un peut "usine à gaz" :sarcastic:  
surtout que maintenant je doit le transformer pour un tableau 2D, c'est pas gagné...
 
voila.. je me demandais si il existe une solution un peut moins lourde qui faciliterai la conversion pour les tableaux 2D


Des commentaires sur ton code:


/* -ed-
 * Erreur de conception. On ne doit pas inclure de .c.
 * Il faut inclure le .h et ajouter le .c au projet.
 
 #include <conio.c>
 */
#define USE_CONIO 0 /* 0 | 1 */
 
#if USE_CONIO
 #include <conio.h>
#endif
/* -ed-
 * Il n'est pas prudent de melanger les fonctions de gestion directe
 * de l'ecran (conio) et les fonctions flux (stdio), surtout si ca concerne
 * les entrees. As-tu vraiment besoin de conio ?
 */
#include <stdio.h>
 
/* -ed- forme naive...
   main()
 */
int main (void)
{
/* -ed-
 * comme je ne comprend rien a ton code, (noms de variables esoteriques)
 * je tente un 'refactoring' en utilisant le principe de la reduction de
 * la portee des variables au strict minimum.
 *
 * D'autre part, j'evite la pollution par 'conio' dans un premier temps.
 */
   int tab[5];
   {
      int x;
      for (x = 0; x < 6; x++)
      {
         int v = 0;
         int temp;
         
         do
         {
            int y;
            int t;
#if USE_CONIO
            gotoxy (5 + 2 * x, 5);
#endif
            scanf ("%d", &temp);
            (void) getchar ();
 
 
/* apparament, ceci est une recherche de doublon...
 * Effectivement, ca parait bien complique.
 *
 * Du dois travailler une demarche algoritmique.
 
 * Redaction textuelle du probleme :
 
 - initialiser le tableau (par exemple tout a 0)
 - Saisir un entier
 - Verifier que cet entier n'est pas deja dans le tableau
 - Si il y est deja, resaisir.
 - Ranger la valeur dans le tableau
 
 * Traduction en langage algorithmique
 
 * MAIN
 *  DEFINE ARRAY 'tab' OF 5 INTEGER
 *
 *  FOR i = 0 TO 4
 *    tab[i] := 0
 *  NEXT i
 *
 *  DO
 *     GET n
 *  WHILE is_in (tab, n)
 *
 *    tab[i] := 0
 * END
 *
 * FUNCTION is_in (tab, n)
 *
 *  found := FALSE
 *  FOR i = 0 TO 4
 *    IF n = tab[i]
 *       found := TRUE
 *    ENDIF
 *  NEXT i
 *
 *  RETURN found
 * END FUNCTION
 
 On voit donc qu'il est plus clair de faire une fonction.
 
*/
            if (x == 0)
            {
               tab[0] = temp;
               v = 0;
            }
            else
            {
               y = -1;
               do
               {
                  y = y + 1;
 
                  if (temp == tab[y])
                  {
                     v = 1;
                     t = 1;
                  }
                  else
                  {
                     v = 0;
                     t = 0;
                  }
                  if (y == x - 1)
                  {
                     t = 1;
                  }
               }
               while (t != 1);
            }
         }
         while (v == 1);
 
         tab[x] = temp;
      }
   }
   
   {
      int x;
      for (x = 0; x < 6; x++)
      {
#if USE_CONIO
         gotoxy (5 + 2 * x, 8);
#endif
         printf ("%d", tab[x]);
      }
      printf ("\n" );
   }
#if USE_CONIO
   getch ();
#else
   (void) getchar ();
#endif
 
/* -ed- puisque main() retourne int... */
   return 0;
}


Message édité par Emmanuel Delahaye le 23-01-2005 à 10:47:49

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-01-2005 à 11:19:56    

ed > su tu fait du C, tu peux pas declarer des variables au milieu d'une fonction ;)


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 23-01-2005 à 11:23:31    

KangOl a écrit :

ed > su tu fait du C, tu peux pas declarer des variables au milieu d'une fonction ;)

en C99, si


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 23-01-2005 à 12:05:52    

a bon !


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 23-01-2005 à 12:05:52   

Reply

Marsh Posté le 23-01-2005 à 12:06:27    

Même si on n'est pas en C99, on peut déclarer des variables en début de bloc.

Reply

Marsh Posté le 23-01-2005 à 12:08:13    

http://www.montefiore.ulg.ac.be/~p [...] ndards.php
 

Citation :


La déclaration de variables n'est plus limitée au début d'un bloc, vous permettant de déclarer une variable juste avant son utilisation.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 23-01-2005 à 12:10:54    

* FUNCTION is_in (tab, n)  
 *  
 *  found := FALSE  
 *  FOR i = 0 TO 4  
 *    IF n = tab[i]  
 *       found := TRUE  
 *    ENDIF  
 *  NEXT i  
 *  
 *  RETURN found  
 * END FUNCTION
 
=> ca sert a rien de continuer a parcourir si on l'a trouvé


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 23-01-2005 à 12:10:55    

ha bin on en apprend tous les jour ici !


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 23-01-2005 à 13:53:06    

KangOl a écrit :

ed > su tu fait du C, tu peux pas declarer des variables au milieu d'une fonction ;)


1- Je n'ai pas fait ça, j'ai défini des variables en debut de bloc, ce qui a toujours été possible en C.
2 - Ce que tu dis est permi en C99, mais je ne le fais pas pour des questions de clarté et de portablilité.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-01-2005 à 13:53:43    

KangOl a écrit :

ha bin on en apprend tous les jour ici !


C'est fait pour!


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-01-2005 à 13:54:48    

blackgoddess a écrit :

* FUNCTION is_in (tab, n)  
 *  
 *  found := FALSE  
 *  FOR i = 0 TO 4  
 *    IF n = tab[i]  
 *       found := TRUE  
 *    ENDIF  
 *  NEXT i  
 *  
 *  RETURN found  
 * END FUNCTION
 
=> ca sert a rien de continuer a parcourir si on l'a trouvé


Oui. Mais on peut laisser le questionneur améliorer l'algo et le code...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-01-2005 à 14:05:41    

bon, j'ai essayé de transcrire l'algo...

Code :
  1. #include<conio.c>
  2. #include<stdio.h>
  3. int tab[5],i,n,found,x;
  4. int main(void)
  5. {
  6.     for(i=0;i<6;i++)
  7.     {
  8.         tab[i]=0;
  9.     }
  10.    
  11.     for(x=0;x<6;x++)
  12.     {
  13.        
  14.         do
  15.         {
  16.             scanf("%d",n);
  17.             found=is_in (tab,n);
  18.      }
  19.      while(found==1);
  20.    
  21.      tab[x]=n;
  22. }
  23. }
  24. int is_in (int tab,int n)
  25. {
  26.     found=0;
  27.     for(i=0;i<6;i++)
  28.     {
  29.         if (tab[i]==n)
  30.         {
  31.             found=1;
  32.         }
  33.     }
  34.     return(found);
  35. }


 
...mais j'arrive pas a voir l'erreure dans la fonction (subscripted value is neither array nor pointer)
 
en tt cas merci pour l'aide !

Reply

Marsh Posté le 23-01-2005 à 14:22:38    

1/ variable globale :/
2/ mauvais parametres a la fonction is_in :o


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 23-01-2005 à 14:37:51    

3/ conio.h
4/ return found = 1;

Reply

Marsh Posté le 23-01-2005 à 14:47:03    

hotcat a écrit :

bon, j'ai essayé de transcrire l'algo...
<...>
...mais j'arrive pas a voir l'erreure dans la fonction (subscripted value is neither array nor pointer)


Beaucoup de fautes... Version corrigée et améliorée (mais améliorable). Pose des questions si tu ne comprends pas.


#include <stdio.h>
 
int is_in (int tab[], int nb_elem, int n)
{
   int found = 0;
   int i;
 
   for (i = 0; !found && i < nb_elem; i++)
   {
      if (tab[i] == n)
      {
         found = 1;
      }
   }
 
   return found;
}
 
 
int main (void)
{
#define N 5
   int tab[N], i, n;
 
   for (i = 0; i < N; i++)
   {
      tab[i] = 0;
   }
 
   for (i = 0; i < N; i++)
   {
      int found;
      do
      {
         scanf ("%d", &n);
         (void) getchar ();
         found = is_in (tab, N, n);
 
         if (found)
         {
            printf ("Doublon\n" );
         }
      }
      while (found);
 
      tab[i] = n;
   }
   return 0;
}


Message édité par Emmanuel Delahaye le 23-01-2005 à 15:20:31

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-01-2005 à 14:49:28    

hotcat a écrit :

bon, j'ai essayé de transcrire l'algo...


<conio.h> on t'a dit :o


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 23-01-2005 à 14:51:43    

Citation :

1/ variable globale :/  


c'est tres pratique les variables globales...  :o  
 

Citation :

2/ mauvais parametres a la fonction is_in :o


je vois pas...  
 

Citation :

3/ conio.h  


Dev-C++ ne connais par conio.h, uniquement conio.c  [:sinclaire]  
 

Citation :

4/ return found = 1;


pareil, je vois pas où est le probleme :??:

Reply

Marsh Posté le 23-01-2005 à 14:57:21    

hotcat a écrit :

Citation :

1/ variable globale :/  


c'est tres pratique les variables globales...  :o  


c'est très crade aussi, à éviter ! de toutes façons, on arrive toujours à s'en passer
 

hotcat a écrit :


Citation :

3/ conio.h  


Dev-C++ ne connais par conio.h, uniquement conio.c  [:sinclaire]


bien sur que si...
qu'est ce qui te fait dire ça ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 23-01-2005 à 15:03:08    

hotcat a écrit :


Citation :

1/ variable globale :/

 
c'est tres pratique les variables globales...  :o  


Non, et c'est dangereux pour de multiples raisons.
 

Citation :


Citation :

2/ mauvais parametres a la fonction is_in :o


je vois pas...  


 
http://mapage.noos.fr/emdel/notes.htm#param_tab
 

Citation :


Citation :

3/ conio.h


Dev-C++ ne connais par conio.h, uniquement conio.c


 
Il se trouve dans dev-cpp/include. Si il n'y est pas, il faut réinstaller le package 'conio'.


Message édité par Emmanuel Delahaye le 23-01-2005 à 15:18:38

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-01-2005 à 15:12:15    

Citation :


Citation :

4/ return found = 1;
 
pareil, je vois pas où est le probleme :??:


 
Moi non plus!


 

Code :
  1. int is_in (int tab[], int nb_elem, int n)
  2. {
  3.    int found = 0;
  4.    int i;
  5.    for (i = 0; i < nb_elem; i++)
  6.    {
  7.       if (tab[i] == n)
  8.       {
  9.          return found = 1; /* return 1; l'interet de found la dedans ...*/
  10.       }
  11.    }
  12.    return found; /* return 0; */
  13. }

Reply

Marsh Posté le 23-01-2005 à 15:17:21    

[citation=959963,0,26]

Code :
  1. int is_in (int tab[], int nb_elem, int n)
  2. {
  3.    int found = 0;
  4.    int i;
  5.    for (i = 0; i < nb_elem; i++)
  6.    {
  7.       if (tab[i] == n)
  8.       {
  9.          return found = 1; /* return 1; l'interet de found la dedans ...*/
  10.       }
  11.    }
  12.    return found; /* return 0; */
  13. }

[/citation]
Exact. J'en était resté à mon algo...
Je corrige ma correction!


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-01-2005 à 15:36:20    

ok je voi ou etait le probleme :/
 
y a juste  

Code :
  1. do
  2.       {
  3.          scanf ("%d", &n);
  4.          (void) getchar ();
  5.          found = is_in (tab, N, n);
  6.          if (found) //je vois pas trop comment ca marche...
  7.          {
  8.             printf ("Doublon\n" );
  9.          }
  10.       }
  11.       while (found); //mm probleme que le if


 

Reply

Marsh Posté le 23-01-2005 à 16:01:24    

hotcat a écrit :

ok je voi ou etait le probleme :/
 
y a juste  

Code :
  1. do
  2.       {
  3.          scanf ("%d", &n);
  4.          (void) getchar ();
  5.          found = is_in (tab, N, n);
  6.          if (found) //je vois pas trop comment ca marche...
  7.          {
  8.             printf ("Doublon\n" );
  9.          }
  10.       }
  11.       while (found); //mm probleme que le if



 
La fonction is_in() retourne une valeur 0 ou 1. Cette valeur est stockée dans found (0 = not found, 1 = found)
 
if/while (found) est équivalent à if/while (found != 0)
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-01-2005 à 16:07:03    

Emmanuel Delahaye a écrit :


if/while (found) est équivalent à if/while (found != 0)


 
ok je savais pas
 
merci a tous pour votre aide :jap:  
 
y me reste plus qu'a faire la meme chose pour un tableau a 2D  ;)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed