Tri simultané sur 2 tableaux ?

Tri simultané sur 2 tableaux ? - Algo - Programmation

Marsh Posté le 17-08-2024 à 21:15:30    

Bonjour,
 
j'ai besoin d'aide car je bloque depuis quelques heures.
 
J'ai 2 tableaux : Start[4] et End[4] qui se correspondent au départ.
Start contient des heures de départ (j'ai  pris HHMM en le prenant comme un nombre)
End contient les heures de fin  
 
MAIS start[0] et End[0] vont de pairs, de même que start[1] avec End[1] ...
 
Evidemment avec un algo de tri, je peux trier Start MAIS je voudrais que les elements de End subissent le même tri.
 
Est-ce possible et si oui comment ?
 
Merci pour votre aide.
 
EXEMPLE :  
Start : 0600   0432    0512
End :   0653   0456    0536
 
Doit devenir
Start : 0432   0512   0600
End :  0456   0536   0512
 
 


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 17-08-2024 à 21:15:30   

Reply

Marsh Posté le 17-08-2024 à 21:34:39    

Faudrait nous donner le language, car la réponse dépendra fortement de ce point. En principe rien de compliqué.


---------------
matos à vendre
Reply

Marsh Posté le 17-08-2024 à 21:51:17    

Je code sous VSC pour un esp 32 en C++


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 17-08-2024 à 21:57:15    

C++ je sais pas faire, ça t'intéresse une sol' en C? Tes tableaux sont déclarés comment?


---------------
matos à vendre
Reply

Marsh Posté le 17-08-2024 à 22:09:09    

oui bien sur.
 
Les tableaux sont
 
int Start[70];  
int End[70];
 
Dans ces tableaux je considère qu'il y a 14 tableaux de 5 elements à trier.  
Bref, on juste considérer  
int Strat[5] et int End[5]
 
Car je sais extraire les 5 elements de chaque que je dois classer.
 
Merci.


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 17-08-2024 à 22:17:07    

Tu devrais déjà mettre ça au propre en utilisant un tableau à deux dimensions. La prochaine étape serait de définir un type de données custom (avec typedef struct ... ) pour avoir le temps start et end ensemble directement. Ensuite tu peux trier.
 
De manière générale il faut toujours refléchir comment bien structurer ses données pour se faciliter la vie / faire du code lisible / ...
 
Je peux t'aider mais je veux pas te faire tout, surtout que je dors debout déjà... :sleep:


---------------
matos à vendre
Reply

Marsh Posté le 17-08-2024 à 22:24:07    

mince, je pensais me réveiller demain avec ton code tout propre !!! :o  
 
Tu n'es pas gentil ... :o
 
Ok, je vais réfléchir à ton propos sur la structure...


Message édité par davidmarli le 17-08-2024 à 22:24:29

---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 17-08-2024 à 22:27:53    

Bon, ça m'aura fait un petit rappel de C (trop fait autre chose ces derniers temps...). Exemple compilable sur PC, à adapter bien sûr à tes besoins.

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. typedef struct
  4. {
  5.     unsigned int start;
  6.     unsigned int end;
  7. } start_end_time_t;
  8. int comp_ab(const void *a, const void *b)
  9. {
  10.     if(((start_end_time_t*)a)->start>((start_end_time_t*)b)->start)
  11.         return 1;
  12.     else if(((start_end_time_t*)a)->start<((start_end_time_t*)b)->start)
  13.         return -1;
  14.     else
  15.         return 0;
  16. }
  17. int main(void)
  18. {
  19.     start_end_time_t start_end_times[3];
  20.    
  21.     start_end_times[0].start=600;
  22.     start_end_times[0].end=653;
  23.     start_end_times[1].start=432;
  24.     start_end_times[1].end=456;
  25.     start_end_times[2].start=512;
  26.     start_end_times[2].end=536;
  27.    
  28.     qsort(start_end_times, 3, sizeof(start_end_time_t), &comp_ab);
  29.    
  30.     unsigned short i;
  31.     for(i=0; i<3; i++)
  32.     {
  33.         printf("[%02u] start %03u   end %03u\n", i, start_end_times[i].start, start_end_times[i].end);
  34.     }
  35.    
  36.     return 0;
  37. }


---------------
matos à vendre
Reply

Marsh Posté le 17-08-2024 à 22:28:57    

Ah oui, juste pour t'éviter des maux de tête: Les nombres avec un "0" au début sont considérés comme étant en OCTAL par le compilateur, comme "0x" pour l'hexa!


---------------
matos à vendre
Reply

Marsh Posté le 18-08-2024 à 10:36:17    

Merci bp.
Je regarde ça à tête reposée.
 
Déjà j'ai repris la structure en déclarant un tableau à 2 dimensions.


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 18-08-2024 à 10:36:17   

Reply

Marsh Posté le 01-09-2024 à 13:28:17    

Tu as réussi?


---------------
matos à vendre
Reply

Marsh Posté le 01-09-2024 à 14:04:30    

En C++, c'est plus concis, le tri se fait en une seule ligne.

Code :
  1. #include <algorithm>
  2. #include <iostream>
  3. struct start_end_time_t {
  4.     unsigned int  start;
  5.     unsigned int  end;
  6. };
  7. int main() {
  8.     start_end_time_t  start_end_times[3]{{600,653},{432,456},{512,536}};
  9.     std::sort( start_end_times.begin(), start_end_times.end(), [](auto&d,auto&e){return d.start<e.start;} );
  10. }

On devrait préférer std::array et depuis le C++20, on peut utiliser les ranges et/ou l'operateur<=>, c'est plus concis

Code :
  1. import std;
  2. struct start_end_time_t {
  3.     unsigned int  start;
  4.     unsigned int  end;
  5.     friend auto operator<=>(start_end_time_t,start_end_time_t) = default; // ordonnable sur 1er champ sinon second
  6. };
  7. int main() {
  8.     std::array  start_end_times{start_end_time_t{600,653},start_end_time_t{432,456},start_end_time_t{512,536}};
  9.     std::ranges::sort( start_end_times );
  10. }


Message édité par dalfab le 01-09-2024 à 14:12:13
Reply

Sujets relatifs:

Leave a Replay

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