recherche dans tableau

recherche dans tableau - Ada - Programmation

Marsh Posté le 20-04-2005 à 18:40:56    

Bonjour,
 
J'ai un souci avec un code de recherche dans un tableau, j'e sais rechercher une valeur dans un tableau d'enregistrements mais là je coince sur un code :
J'ai deux soustypes
Soustype N_N Is integer range 1 .. 5;
P_P is integer range 1 .. 4
jai un type tab is array( N : N_N, P : P_P) return integer
 
Après résultats de mon prog qui marche à l'afichage, j'obtiens,
 
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
25 26 27 28 29
 
je veux trouver la valeur de I pour la valeur du tableau correspondant à 23
par exemple, moi je sais en regardant mon tableau que ce sera 4 mais ,j'arrive pas à trouver le code qui fait cela, en ada, je coince un peu...
Merci à vous  :wahoo:

Reply

Marsh Posté le 20-04-2005 à 18:40:56   

Reply

Marsh Posté le 20-04-2005 à 23:09:26    

La logique en vb, voudrait que je fasse la chose suivante,
Tant que pas tab <> 23 faire
I = I+1
J = J+1
Fin tant que
N = I
Nombre valeur'pos = I
 voilà mais il faut peut etre faire une umbrication supplémentaire, je sais pas, je continue de chercher .
si vous avez une solution, elle sera la bienvenue.
merci

Reply

Marsh Posté le 21-04-2005 à 09:10:10    

J'aurais bien une tite idée... soit tu le fait à la barbare, et tu mets deux boucle For, une pour les lignes et une pour les colonnes. Mais c'est pas propre.
 
Sinon tu peux le faire avec deux boucles while genre....
 
 

Code :
  1. GLOBAL :
  2. while (Index_ligne < tab'last) loop
  3.    while (Index_col < tab'last) loop
  4.       exit GLOBAL when tab = 23;
  5.       Index_col := index_col + 1;
  6.    end loop;
  7.    Index_ligne := index_ligne + 1;
  8. end loop GLOBAL;


 
une fois fini tu auras ses coordonnées dans index_ligne et index_colonne (normalement), j'ai pas testé....
 
bon courage


Message édité par babar9160 le 21-04-2005 à 09:17:34
Reply

Marsh Posté le 21-04-2005 à 09:32:43    

merci babar, je vais essayer tout de suite,

Reply

Marsh Posté le 21-04-2005 à 09:43:52    

Bien entendu, je t'ai pas tout écrit... mais ça devrait t'aider.
;)

Reply

Marsh Posté le 21-04-2005 à 12:35:07    

Bonjour babar,
 
il semblerait que je rencontre des problèmes pour référencer
mon index ligne et mon index col,
Ma fonction :
Function Trouve( Tab : Mois_Complet; N_C : Nombre_Cherche) Return Integer Is
      N : Integer;
      I : Natural;
      J : Natural;
      Begin
         While I < Tab'Last Loop
            While J < Tab'Last Loop
               Exit when Tab(I,J) = N_C;
               J :=J +1;
               N :=I;
            End Loop;
            I :=I +1;
         End Loop;  
         Return N;
   End Trouve_Jour;
J'ai aussi essayé avec deux boucles for, code qui à le mérite de compiler sans erreurs, mais la fonction plante avec un raise const err ;
Merci pour ta réponse,

Reply

Marsh Posté le 21-04-2005 à 13:32:56    

Déjà penses bien à mettre les labels pour la boucle principal, sinon il sortira juste de la boucle J quand tu fais exit when...
 
Ensuite je te conseillerais de ne faire l'affectation qu'une fois le nombre trouvé, pas à chaque tour de ta deuxième boucle.
 
Enfin les tableaux en Ada commence à 1 donc tu peux aller jusqu'à Last... je l'avais pas mis dans le code d'avant...
et faut aussi initialiser les variables, c'est mieux pour pouvoir faire des opérations dessus.
 
En gros :

Code :
  1. Function Trouve( Tab : Mois_Complet; N_C : Nombre_Cherche) Return Integer Is
  2.       N : Integer := 0;
  3.       I : Natural := 1;
  4.       J : Natural := 1;
  5.       Begin
  6.       GLOBAL :
  7.          While I <= Tab'Last Loop
  8.             While J <= Tab'Last Loop
  9.                Exit GLOBAL when Tab(I,J) = N_C;
  10.                J :=J + 1;
  11.                
  12.             End Loop;
  13.             I :=I + 1;
  14.          End Loop GLOBAL; 
  15.          N := I;
  16.          Return N;
  17.    End Trouve_Jour;


Après je réponds pitet pas complétement à ta question... mais bon j'essaie de t'aider. ;)


Message édité par babar9160 le 21-04-2005 à 13:33:40
Reply

Marsh Posté le 21-04-2005 à 15:23:59    

Et si tu mettais plutôt :

Code :
  1. While I <= N_N'Last Loop 
  2.              While J <= P_P'Last Loop


Au passage, les puristes te diront qu'il vaut mieux déclarer I et N de type N_N et j de type P_P, et de remplacer I := I + 1 par I := N_N'succ(I);
 
Pour ma part, j'aurais plutôt opté pour un code du genre :

Code :
  1. GLOBAL:
  2.    for I in N_N'range loop
  3.       for J in P_P'range loop
  4.          N := I;
  5.          exit GLOBAL when Tab(I,J) = N_C;
  6.       end loop;
  7.    end loop GLOBAL;

Reply

Marsh Posté le 21-04-2005 à 15:35:53    

oui, en fait j'ai résumé un peu l'énoncé du ploblème,
il faut savoir que mon tableau s'organize autour de trois types différents.
le premier est
Soustype N_N Is integer range 1 .. 5;
le deusieme est en fait de type énumèré
comme  
type P_P is (toto, tata, titi, tutu );
avec une déclaration de type Io.enumeration
qui fonctionne tres bien
un troisieme soutype Nb_N is integer range "dans l'exemple" 10..29;
et mon type tableau
Type tab is array (N: N_N, P: P_P) of Nb_N;
s'est probalement pour celà que je rencontre encore des pbs.
merci à toi pour tes explications.

Reply

Marsh Posté le 21-04-2005 à 15:40:56    

il est vrai que c'est simple avec les deux boucles for, mais j'aime pas trop ça ;)
 
Sinon c'est plus propre comme tu l'a dis avec des index typés comme ceux du tableaux ...
 
Pour ma défense, ça ne fait que 2 mois que je fais de l'Ada :o
Mais bon...
 
Sur ce, j'espère que ton pbm sera vite résolu labidouille ;)


Message édité par babar9160 le 21-04-2005 à 15:41:09
Reply

Marsh Posté le 21-04-2005 à 15:40:56   

Reply

Marsh Posté le 22-04-2005 à 10:35:17    

merci pour tes explications !

Reply

Sujets relatifs:

Leave a Replay

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