Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

Répondre

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de cette opération? 3+7=

Retour

Résumé de la discussion (messages les plus récents en premier)

yoshi
05-10-2017 16:44:51

Bonsoir,

J'ai encore gratté quelques lignes...


1   VARIABLES
2     heured EST_DU_TYPE NOMBRE
3     heuref EST_DU_TYPE NOMBRE
4     diff EST_DU_TYPE NOMBRE
5     fin_t EST_DU_TYPE NOMBRE
6     deb_t EST_DU_TYPE NOMBRE
7     Duree EST_DU_TYPE CHAINE
8   DEBUT_ALGORITHME
9     heured PREND_LA_VALEUR 215551
10    heuref PREND_LA_VALEUR 223527
11    deb_t PREND_LA_VALEUR 0
12    fin_t PREND_LA_VALEUR 0
13    diff PREND_LA_VALEUR heuref%100-heured%100
14    SI (diff<0) ALORS
15      DEBUT_SI
16      diff PREND_LA_VALEUR diff+60
17      heuref PREND_LA_VALEUR heuref-100
18      FIN_SI
19    Duree PREND_LA_VALEUR diff.toString()+" s"
20    deb_t PREND_LA_VALEUR floor((heured%10000)/100)
21    fin_t PREND_LA_VALEUR floor((heuref%10000)/100)
22    diff PREND_LA_VALEUR fin_t-deb_t
23    SI (diff<0) ALORS
24      DEBUT_SI
25      diff PREND_LA_VALEUR diff+60
26      heuref PREND_LA_VALEUR heuref-10000
27      FIN_SI
28    Duree PREND_LA_VALEUR diff.toString()+" min "+Duree
29    deb_t PREND_LA_VALEUR floor(heured/10000)
30    fin_t PREND_LA_VALEUR floor(heuref/10000)
31    diff PREND_LA_VALEUR fin_t-deb_t
32    Duree PREND_LA_VALEUR diff.toString()+" h "+Duree
33    AFFICHER "Duree de ce tri : "
34    AFFICHER Duree
35  FIN_ALGORITHME

Je construis pas à pas une chaîne nommée durée, que j'afficherai en bloc à la fin des calculs.
diff est la différence qui change à chaque fois
diff.toString() permet de transformer un nombre en une chaîne ce qui permet de concaténer la chaine "36" avec la chaîne " s" --> "36 s"

Après diff devient diff =39 (ce sont des min), je vais donc faire diff.toString() qui donne "39" qui sera concaténée avec " min " et Duree dans cet ordre, qui donne une nouvelle chaîne Duree...
Avec l'exemple choisi j'écris :
Duree = diff.toString()+" min "+Duree
ce qui donne
Duree <-- "39" + " min " + "36 s"
Et Duree vaut à cet instant "39 min 39 s"
Et je procède à l'identique avec les heures entières...

Pigé ?

N-B : je pourrais condenser plusieurs fois 2 lignes en 1 seule, je gagnerais encore des lignes MAIs cela deviebdrait moins "évident" à lire et comprendre quand on n'a pas trop l'habitude de programmer...

@+

yoshi
05-10-2017 13:19:19

Re,

Tu veux dire la technique du compteur de changements ?
Je pense aussi que, le chrono n'existant pas en AlgoBox,  c'est ce qu'il a de plus simple : ça n'empêche que tu peux t'instruire...
J'ai trouvé à raccourcir le prog AlgoBox :


1   VARIABLES
2     heured EST_DU_TYPE NOMBRE
3     heuref EST_DU_TYPE NOMBRE
4     diff EST_DU_TYPE NOMBRE
5     diff_s EST_DU_TYPE NOMBRE
6     diff_m EST_DU_TYPE NOMBRE
7     fin_t EST_DU_TYPE NOMBRE
8     deb_t EST_DU_TYPE NOMBRE
9   DEBUT_ALGORITHME
10    heured PREND_LA_VALEUR 215551
11    heuref PREND_LA_VALEUR 223527
12    deb_t PREND_LA_VALEUR 0
13    fin_t PREND_LA_VALEUR 0
14    diff_s PREND_LA_VALEUR 0
15    diff_s PREND_LA_VALEUR heuref%100-heured%100
16    SI (diff_s<0) ALORS
17      DEBUT_SI
18      diff_s PREND_LA_VALEUR diff_s+60
19      heuref PREND_LA_VALEUR heuref-100
20      FIN_SI
21    deb_t PREND_LA_VALEUR floor((heured%10000)/100)
22    fin_t PREND_LA_VALEUR floor((heuref%10000)/100)
23    diff_m PREND_LA_VALEUR fin_t-deb_t
24    SI (diff_m<0) ALORS
25      DEBUT_SI
26      diff_m PREND_LA_VALEUR diff_m+60
27      heuref PREND_LA_VALEUR heuref-10000
28      FIN_SI
29    deb_t PREND_LA_VALEUR floor(heured/10000)
30    fin_t PREND_LA_VALEUR floor(heuref/10000)
31    diff PREND_LA_VALEUR fin_t-deb_t
32    AFFICHER "Durée de ce tri : "
33    AFFICHER diff
34    AFFICHER " h "
35    AFFICHER diff_m
36    AFFICHER " min "
37    AFFICHER diff_s
38    AFFICHER " s"
39  FIN_ALGORITHME

Ce qui me chiffonne quand même, c'est que tu as utilisé le mot chronomètre dans l'énoncé dans post #1...

@+

Kinito
05-10-2017 12:54:18

MERCI BEAUCOUP j'ai utiliser la première méthode je pense que sa suffira.

yoshi
05-10-2017 09:53:47

Salut,

C'est normal, tu ne soustrais pas deux nombres mais deux chaînes de caractères, il faudrait les traiter...
Mais je me suis aperçu qu'on ne peut pas convertir la chaine "27" en le nombre 27 (on pourrait, mais il faudrait écrire un programme spécial) !
En Python, et bien d'autres langages, si.
Si tu additionnes deux nombres 22+28 =50
Si tu additionnes deux chaines : "22"+"28", tu obtiens la chaîne "2228"..
Tu ne peux les soustraire ni les multiplier...

Je te propose donc de rentrer l'heure comme un nombre à 6 chiffres.
heured=215548
heuref=223527
Le résultat de la soustraction serait incohérent...
Il faut traiter séparément les nombres formés dizaines et unités, milliers et centaines et le reste...
Je viens de le
faire en Python.
Puis j'ai transcrit avec AlgoBox :

1   VARIABLES
2     heured EST_DU_TYPE NOMBRE
3     heuref EST_DU_TYPE NOMBRE
4     Duree EST_DU_TYPE NOMBRE
5     diff EST_DU_TYPE NOMBRE
6     mind EST_DU_TYPE NOMBRE
7     minf EST_DU_TYPE NOMBRE
8     hrsd EST_DU_TYPE NOMBRE
9     hrsf EST_DU_TYPE NOMBRE
10    diff_s EST_DU_TYPE NOMBRE
11    diff_m EST_DU_TYPE NOMBRE
12  DEBUT_ALGORITHME
13    heured PREND_LA_VALEUR 215551
14    heuref PREND_LA_VALEUR 223527
15    mind PREND_LA_VALEUR 0
16    minf PREND_LA_VALEUR 0
17    hrsd PREND_LA_VALEUR 0
18    hrsf PREND_LA_VALEUR 0
19    Duree PREND_LA_VALEUR 0
20    diff_s PREND_LA_VALEUR 0
21    diff_s PREND_LA_VALEUR heuref%100-heured%100
22    SI (diff_s<0) ALORS
23      DEBUT_SI
24      diff_s PREND_LA_VALEUR diff_s+60
25      heuref PREND_LA_VALEUR heuref-100
26      FIN_SI
27    Duree PREND_LA_VALEUR diff_s
28    mind PREND_LA_VALEUR floor((heured%10000)/100)
29    minf PREND_LA_VALEUR floor((heuref%10000)/100)
30    diff_m PREND_LA_VALEUR minf-mind
31    SI (diff_m<0) ALORS
32      DEBUT_SI
33      diff_m PREND_LA_VALEUR diff_m+60
34      heuref PREND_LA_VALEUR heuref-10000
35      FIN_SI
36    Duree PREND_LA_VALEUR Duree+diff*100
37    hrsd PREND_LA_VALEUR floor(heured/10000)
38    hrsf PREND_LA_VALEUR floor(heuref/10000)
39    diff PREND_LA_VALEUR hrsf-hrsd
40    Duree PREND_LA_VALEUR Duree+diff*10000
41    AFFICHER "Duree de ce tri : "
42    AFFICHER diff
43    AFFICHER " h "
44    AFFICHER diff_m
45    AFFICHER " min "
46    AFFICHER diff_s
47    AFFICHER " s"
48  FIN_ALGORITHME
 

C'est quand même horriblement long : je ne peux pas faire mieux avec AlgoBox...
Sortie :

***Algorithme lancé***
Duree de ce tri : 0 h 39 min 36 s
***Algorithme terminé***

Explications
D'abord Ligne 13 et 14 por toi ce serait
LIRE heured5 - 1 = 64
LMI
LLIRE heuref

Après, ce sont des calculs en h min s...
Rappel de la méthode à la main et application info

   22  35  27
-  21  55  51

27- 48 impossible donc je fais 87 - 48 : rajout de 60 s
Et on fait 35 - 1 = 34 parce que les 60 s rajoutées,  c'est 1 min que je retire aux min.
L'opération devient :
   22  34  87
-  21  55  51
=            36

Informatiquement, je fais 27 - 51 = -24
Je teste : si différence négative (c'est le cas), je rajoute 60  -24+60 = 36
27 et 54 sont les restes respectifs des divisions de 223527 et 215551 par 100 : d'où le %

Je continue :
à la main
34 - 55 impossible j'ajoute 60 min et j'enlève 1 h au h
Et je fais 94-55 =39 et 22-1 =21
L'opération devient :
   21  94  87
-  21  55  51
=      39  36
Informatiquement, là, Algobox devient limité : il ne connait pas le quotient entier...
Pour isoler le 34 et le 55 je suis obligé de chercher les restes dans la division par 10000 :
223427 % 10000 =3427
puis de diviser par 100:
3427/100 = 34,27
et enfin d'en prendre la partie entière floor() : 34 que j'affecte à minf
D'où le floor((heuref%10000)/100)
idem pour 215551...
Je soustrais alors les min et j'affecte le le résultat à diff_m
Si diff =_m <0
j'ajoute 60 à diff_m et je soustrais 10000 à heuref

Comme j'ai décidé de modifier l'affichage final entretemps :
La ligne 4 est inutile
La ligne 19 est inutile
La ligne 27 est inutile
La ligne 36 est inutile
La ligne 40 est inutile

Je les ai laissées pour te donner une idée de la reconstitution de la durée finale...

Questions ?

@+

Kinito
05-10-2017 05:19:34

voici l'algo :
FONCTIONS_UTILISEES
VARIABLES
  A EST_DU_TYPE LISTE
  I EST_DU_TYPE NOMBRE
  N EST_DU_TYPE NOMBRE
  M EST_DU_TYPE NOMBRE
  T EST_DU_TYPE NOMBRE
  P EST_DU_TYPE LISTE
  W EST_DU_TYPE NOMBRE
  Z EST_DU_TYPE NOMBRE
  T EST_DU_TYPE NOMBRE
  heure EST_DU_TYPE CHAINE
  heure2 EST_DU_TYPE CHAINE
  Heure_définitive EST_DU_TYPE CHAINE
DEBUT_ALGORITHME
  AFFICHER "Saisir le nombre de termes :"
  LIRE N
  AFFICHER "Saisir la valeur maximal :"
  LIRE Z
  LIRE heure
  POUR I ALLANT_DE 1 A N
    DEBUT_POUR
    A I PREND_LA_VALEUR ALGOBOX_ALEA_ENT(1,Z)
    AFFICHER* A I
    FIN_POUR
  POUR M ALLANT_DE 1 A Z
    DEBUT_POUR
    P[M] PREND_LA_VALEUR 0
    POUR I ALLANT_DE 0 A N
      DEBUT_POUR
      SI (A I==M) ALORS
        DEBUT_SI
        P[M] PREND_LA_VALEUR P[M]+1
        FIN_SI
      FIN_POUR
    AFFICHER "Nombre de "
    AFFICHER M
    AFFICHER " : "
    AFFICHER* P[M]
    FIN_POUR
  LIRE heure2
  AFFICHER "Temps pour effectuer algorithme : "
  Heure_définitive PREND_LA_VALEUR heure2-heure
  AFFICHER* Heure_définitive
FIN_ALGORITHME


Quand je fait fonctionner l'algo il me met :
Temps pour effectuer algorithme :     
Et rien ne s'affiche
peut tu me venir en aide ?

Kinito
04-10-2017 19:21:50
Kinito a écrit :

Oui je suis d’accord sur ce que tu m’explique mais le soucis c’est que quand je mes heures_debut (chaîne) admettons 21:16:46 et en heure_fin(chaîne) 21:16:55 puis quand je mes heure_fin-heure_debut il ne m’affiche rien je te prendrait un screen de mon algo avant que je ne part en cours

Kinito
04-10-2017 19:18:36

Oui je suis d’accord sur ce que tu m’explique mais le soucis c’est que quand je mes heures_debut (chaîne) admettons 21:16:46 et en heure_fin(chaîne) 21:16:55 puis quand je mes heure_fin-heure_debut il ne m’affiche rien

yoshi
04-10-2017 17:29:37

Salut,

Je ne suis pas expliqué suffisamment clairement :
Tu déclares des variables chaîne puis quant l'instruction LIRE attend que tu rentre cette chaîne, tu la rentre en tapant par exemple :
19:23:45 puis Entrée...
Et pour être le plus juste possible
tu regardes ta montre ou une pendule, il est mettons 19 h 23 min 0 s, tu tapes 19:23:45, tu gardes le doigt prêt à appuyer sur Entrée et tu guettes la trotteuse :
dès qu'elle arrive à 19 h 23 min 45 s hop tu appuies !
Le temps de réflexe doit être de quelques dixièmes de s...

Est-ce que ton prof a vérifié que AlgoBox était capable de gérer le temps ? Je programme en Python et là la réponse est oui : c'est même très très simple... En langage C et C++ par ex aussi...

@+

[EDIT]Réflexions faites, système valable pour l'heure de début...
Pour l'heure de fin de tri, il faudra avoir un œil sur le chrono et un œil sur le déroulement du programme (comme ça, après, tu loucheras ^_^) : il faut pouvoir repérer au plus vite, la demande de l'heure de fin : après peu importe le temps que tu mets pour la rentrer, le système est en pause...

Kinito
04-10-2017 16:55:38

Merci de ta réponse, mais comment tu fait pour déclarer une chaîne sous format hh:mm:ss ?

yoshi
04-10-2017 14:33:27

Bonjour,

Bonne question.
Apparemment, Algobox ne gère aucun chronomètre en interne...
Pour vérifier, j'ai cherché, cherché et rien trouvé...
Je peux te proposer de contourner la difficulté de 2 façons
1. Introduire un compteur différent dans chaque tri et qui s'incrémente de 1 à chaque déplacement (pas très fiable)
2. a) Au début du 1er tri, introduire LIRE heure1_debut (déclarée comme variable chaîne) sous format hh:mm:ss
    b) Lorsque le tri est fini, introduire LIRE heure1_fin (déclarée comme variable chaîne) sous format hh:mm:ss
    Puis idem en début et fin du tri2 et du tri3.
    Il te faudrait alors créer une fonction qui à partir des chaînes debut et fin fasse le traitement fin-debut et donne un résultat...

Sinon, je ne sais pas et ne demande qu'à savoir !

@+

Kinito
04-10-2017 13:02:29

Bonjour, je dois faire 3 algo sur algobox les algo sont des tri j'ai pris le tri a panier, le tri a bulle, et le tri par sélection, mais le prof nous a demander de mettre des chronomètres sur chacun des tri afin de savoir quel tri est le plus rapide.
Ma question est donc : Comment fait-on pour mettre un chronomètre sur Algobox ?
Merci pour les future réponse

Cordialement,
                                                                                                                                                                                                     Kinito

Pied de page des forums