Seuls les membres ayant 30 points peuvent parler sur le chat.

Forum Casio - Autres questions


Index du Forum » Autres questions » Optimisation Algorithme
Tituya En ligne Rédacteur Points: 802 Défis: 16 Message

Optimisation Algorithme

Posté le 09/05/2019 20:33

Bonjour bonjour !
Alors déjà, lorsque je parle d'algorithme, je parle au sens propre des choses, soit un programme rédigé en français Donc je sais que ce n'est pas le forum adapté, mais je pense que vous pouvez quand meme m'aider

Le but de l'algo est de convertir un "nombre" hexadecimal de 4 caractères : genre A31D = 41757

Bref ! Mon algo fonctionne parfaitement actuellement, mais je le trouve particulièrement moche... Et je ne trouve pas d'autre solution....

Voila la partie à optimiser :
Cliquez pour découvrir
Cliquez pour recouvrir

Pour boucle De 1 à 4 Pas 1 Faire
  |    |  Crayon Bleu
  |    |  Effacer
  |    |  Brosse Cyan
  |    |  Afficher "Veuillez saisir si vous avez une lettre ou un chiffre."
  |    |  Afficher " "
  |    |  Afficher "1-Lettre"
  |    |  Afficher "2-Chiffre"
Remarque : je fais la difference entre les deux car je souhaite avec à marquer la lettre
Remarque : plutot que son chiffre correspondant ( A plutot que 10 )
  |    |  Crayon Noir
  |    |  Brosse Blanc
  |    |  Saisir choix1
  |    |  Si choix1 = 1
  |    |    |  Saisir lettre
Remarque : Maintenant , je regarde la lettre inscrite puis stocke sa valeur dans une Variable
  |    |    |  Si lettre = "A"
  |    |    |    |  Si boucle = 1
  |    |    |    |    |  num1 := 10
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 2
  |    |    |    |    |  num2 := 10
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 3
  |    |    |    |    |  num3 := 10
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 4
  |    |    |    |    |  num4 := 10
  |    |    |    |  FinSi
  |    |    |  FinSi
  |    |    |  Si lettre = "B"
  |    |    |    |  Si boucle = 1
  |    |    |    |    |  num1 := 11
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 2
  |    |    |    |    |  num2 := 11
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 3
  |    |    |    |    |  num3 := 11
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 4
  |    |    |    |    |  num4 := 11
  |    |    |    |  FinSi
  |    |    |  FinSi
  |    |    |  Si lettre = "C"
  |    |    |    |  Si boucle = 1
  |    |    |    |    |  num1 := 12
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 2
  |    |    |    |    |  num2 := 12
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 3
  |    |    |    |    |  num3 := 12
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 4
  |    |    |    |    |  num4 := 12
  |    |    |    |  FinSi
  |    |    |  FinSi
  |    |    |  Si lettre = "D"
  |    |    |    |  Si boucle = 1
  |    |    |    |    |  num1 := 13
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 2
  |    |    |    |    |  num2 := 13
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 3
  |    |    |    |    |  num3 := 13
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 4
  |    |    |    |    |  num4 := 13
  |    |    |    |  FinSi
  |    |    |  FinSi
  |    |    |  Si lettre = "E"
  |    |    |    |  Si boucle = 1
  |    |    |    |    |  num1 := 14
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 2
  |    |    |    |    |  num2 := 14
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 3
  |    |    |    |    |  num3 := 14
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 4
  |    |    |    |    |  num4 := 14
  |    |    |    |  FinSi
  |    |    |  FinSi
  |    |    |  Si lettre = "F"
  |    |    |    |  Si boucle = 1
  |    |    |    |    |  num1 := 15
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 2
  |    |    |    |    |  num2 := 15
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 3
  |    |    |    |    |  num3 := 15
  |    |    |    |  FinSi
  |    |    |    |  Si boucle = 4
  |    |    |    |    |  num4 := 15
  |    |    |    |  FinSi
  |    |    |  FinSi
  |    |  Sinon
Remarque : Si c'est un chiffre
  |    |    |  Saisir Chiffre
Remarque : la Variable "plus" sert d'indications De Nouveau Caractère
  |    |    |  Si plus = 1
  |    |    |    |  num1 := Chiffre
  |    |    |  FinSi
  |    |    |  Si plus = 2
  |    |    |    |  num2 := Chiffre
  |    |    |  FinSi
  |    |    |  Si plus = 3
  |    |    |    |  num3 := Chiffre
  |    |    |  FinSi
  |    |    |  Si plus = 4
  |    |    |    |  num4 := Chiffre
  |    |    |  FinSi
  |    |  FinSi
Remarque : quand la conversion du premier chiffre / lettre , je passe au second
Remarque : grace a la Variable "plus"
  |    |  plus := plus + 1

| FinPour


Ca parait compliquer comme ça, mais vous pouvez me donner des exemples de programmes Casio le faisant, et je pourrais les adapter assez facilement ! Le seul probleme c'est que sur casio, les lettres sont aussi des variables, donc c'est beaucoup plus simple de verifier quelle lettre est appuyée ! Ici je dois faire un chaine de caractère, regarder quelle lettre c'est, pour ensuite associer une autre variable à la valeur qu'il faut.

Avez vous une idée plus propre ?
Merci


Lephenixnoir Hors ligne Administrateur Points: 17447 Défis: 142 Message

Citer : Posté le 09/05/2019 20:41 | #


D'abord 0xa31d fait 41757... pas 41755 !

Voici une version en Basic qui marche avec toutes les tailles d'entrées.

?→Str 1
"0123456789ABCDEF"→Str 2
0→X

For 1→I To StrLen(Str 1)
16X+StrSrc(Str 2, StrMid(Str 1, I, 1))-1→X
Next

X

Edit : modifié le progamme pour supprimer une variable.
Disperseur Hors ligne Membre Points: 1736 Défis: 1 Message

Citer : Posté le 09/05/2019 20:43 | #


Wow j'aurais pas pensé faire aussi petit Lephenixnoir
Mes meilleurs jeux
N'hésitez pas, notez !

Jeux BasicCasio / CBasicCasio:
-World Tank War II
-Apollo 11
-GeoGraph ! Élu Jeu du Mois de Mars 2019 !
Jeux C:
-Planétarium 2 ! Chef d'Oeuvre !


√(2+2-2+2-2+2+2-2-2-2) = 0
Tituya En ligne Rédacteur Points: 802 Défis: 16 Message

Citer : Posté le 09/05/2019 20:45 | #


Faute de frappe dans le nombre Mon algo me donnait bien ça ! je vais check si je peux le refaire en algorithme ! ça parait très compact !

Edit, je ne comprend pas vraiment comment fonctionne le programme Basic ... Je n'ai jamais utilisé de Str auparavant, je vais me pencher dessus plus profondément pour voir
Casio VS Nokia 3310 ? Qui gagne ?



Imperosol Hors ligne Membre Points: 86 Défis: 2 Message

Citer : Posté le 09/05/2019 20:55 | #


Déjà, pour commencer, pourquoi convertir seulement un nombre de 4 chiffres ?
Tu pourrais demander à l'utilisateur de rentrer son nombre hexadécimal, qui serait alors stocké dans un str. Tu prends les caractères de ce str l'un après l'autre, et tu les convertis un à un en nombre décimaux, sans convertir les chiffres déjà entre 1 et 10.

De plus, je ne comprends pas pourquoi tu mets quatre étapes identiques dans ta boucle de conversion. Plutôt que de faire quatre variables num1, num2, num3 et num4, Prends une variable "num" et ta variable "nombre". Comme ça, au lieu de mettre quatre lignes pour A, B, C, D, E et F, tu en mets une seule, et tu ajoutes num à la puissance 10 correspondante non pas après la fin des quatre passages dans la boucle, mais à la fin de chaque passage.

Enfin, A31D en base 16, ça fait 41757 en base 10, pas 41755
Tituya En ligne Rédacteur Points: 802 Défis: 16 Message

Citer : Posté le 09/05/2019 21:10 | #


Le prof m'a demandé de convertir des nombres de 4 chiffres, il s'en foutait d'avoir plus, en gros il souhaite que nous convertissions jusqu'à 9999 en décimal. Et sachant que FFFF = 65535, je crois que je suis large non ?
Je ne sais pas si il y a des str pour le logiciel que j'utilise. "pratiquer l'algorithmique"

Num1, 2, 3 et 4 servent au final à différencier la valeur pour convertir à la fin, je stocke donc dans la 1ere, puis dès que l'on passe à la deuxieme, je stocke dans une deuxieme variable etc..

Imperosol a écrit :
Prends une variable "num" et ta variable "nombre". Comme ça, au lieu de mettre quatre lignes pour A, B, C, D, E et F, tu en mets une seule, et tu ajoutes num à la puissance 10 correspondante non pas après la fin des quatre passages dans la boucle, mais à la fin de chaque passage.

Je n'ai pas compris ce passage désolé

Je précise que nous n'avons jamais utilisé ce logiciel avec le prof, et que la dernière fois que je l'ai utilisé c’était pour les TPE plus tôt dans l'année, pour faire un truc totalement différent de ça.
Casio VS Nokia 3310 ? Qui gagne ?



Lephenixnoir Hors ligne Administrateur Points: 17447 Défis: 142 Message

Citer : Posté le 09/05/2019 21:12 | #


Num1, 2, 3 et 4 servent au final à différencier la valeur pour convertir à la fin, je stocke donc dans la 1ere, puis dès que l'on passe à la deuxieme, je stocke dans une deuxieme variable etc..

Tu peux tout stocker dans le même nombre, comme je l'ai en écrivant 16X+Y→X (où Y est un chiffre entre 0 et 15), ce qui décale X vers la gauche puis ajoute un nouveau chiffre. Si seul le résultat final t'intéresse, c'est plus simple.
Imperosol Hors ligne Membre Points: 86 Défis: 2 Message

Citer : Posté le 09/05/2019 21:43 | #


Bon, commençons par l'histoire des num1, num 2, etc.
Ce que je veux dire, c'est que tu utilises quatre variables différentes alors qu'une seule suffit. Dans ton programme, tu fais une boucle à quatre passages. Au premier passage, num1 prend une valeur, au deuxième passage, num2 prend une valeur, etc. A la fin des quatre passages dans ta boucle, tu te retrouves avec quatre variables différentes auxquelles tu as assigné une valeur de la même manière pour chacune. C'est seulement après ça que tu additionnes les quatre variables pour obtenir la variable finale.
Pour optimiser un peu, tu devrais additionner en fin de chaque passage, pas après la boucle.
En gros :

0→nombre //c'est dans cette variable qu'on stockera le nombre final
For 1→N To 4
  "Chiffre ou lettre (1=lettre, 2=chiffre)"?→A
   If A=1
     Then
          "Taper lettre" ?→str1
          If str1="A"
          Then
               num=10
          IfEnd
          If str1="B"
          Then
          //et ainsi de suite pour chaque caractère
          IfEnd
     IfEnd
     If A=2
     Then
          "Taper chiffre"?→B
          B→num
     IfEnd
          
     nombre+num*16^(4-N)→nombre //on ajoute num au nombre avec la puissance de 16 correspondante.
Next


J'ai rajouté des indentations de manière artificielle pour que ce soit plus clair, elles ne seront pas dans ton programme casio.

Ajouté le 09/05/2019 à 21:46 :
Mais si tu veux vraiment optimiser, prends le programme de Lephenixnoir, qui est clairement une excellente optimisation. Ce que je te donne, c'est juste pour expliquer mon idée.
Tituya En ligne Rédacteur Points: 802 Défis: 16 Message

Citer : Posté le 09/05/2019 21:47 | #


pas bete ça, je n'y avais pas penser, je vais essayer de le faire pour voir si c'est plus propre.

Ajouté le 09/05/2019 à 21:49 :
Je vais d'abbord essayer ta methode pour voir l'optimisation faite, le principe c'est que je puisse l'expliquer facilement, et pour le moment celui de Lephenixnoir est plus complexe.
Casio VS Nokia 3310 ? Qui gagne ?



Imperosol Hors ligne Membre Points: 86 Défis: 2 Message

Citer : Posté le 09/05/2019 21:55 | #


En réalité, le programme de Lephenixnoir n'est pas si compliqué, il est juste, disons, un peu barbare à l'oeil nu. Il nécessite seulement de savoir comment fonctionnent les fonctions d'opérations sur les strings de ta calculatrice.
Pour ça, les cours de planet-casio sont très bien faits : https://www.planet-casio.com/Fr/programmation/string.php https://www.planet-casio.com/Fr/programmation/string2.php
Tituya En ligne Rédacteur Points: 802 Défis: 16 Message

Citer : Posté le 09/05/2019 22:08 | #


Bon, j'ai fini ta version en 36 lignes, contrairement aux 126 d'avant, c'est vraiment mieux ! Maintenant, il faut que j'essaye la version de lephenixnoir Merci pour ça déjà !

Ajouté le 09/05/2019 à 22:12 :
EDIT je ne pense pas que ça soit possible sur le logiciel que j'utilise, en casio ok grace aux strings, mais je n'ai aucun moyen de décortiquer une chaine de caractère avec ce logiciel... Je fini donc sur une optimisation de 90 lignes ! ce qui est déja énorme !
Merci !
Casio VS Nokia 3310 ? Qui gagne ?



Lephenixnoir Hors ligne Administrateur Points: 17447 Défis: 142 Message

Citer : Posté le 09/05/2019 22:13 | #


Peu importe ton format d'entrée en fin de compte, la logique de mon exemple sert à transformer les caractères individuels en leur valeur, mais si tu as un autre type de stockage tu peux l'adapter facilement.
Tituya En ligne Rédacteur Points: 802 Défis: 16 Message

Citer : Posté le 09/05/2019 22:21 | #


Je vais me contenter de ça Merci quand même, ce projet ne sera même pas noté et est à rendre dans 3 semaines, je l'ai déjà fini
Fallait faire : conversion decimal - binaire / hexa. Et hexa/binaire - decimal !

Casio VS Nokia 3310 ? Qui gagne ?



Lephenixnoir Hors ligne Administrateur Points: 17447 Défis: 142 Message

Citer : Posté le 09/05/2019 22:42 | #


Très joli avatar, soit dit en passant.
Imperosol Hors ligne Membre Points: 86 Défis: 2 Message

Citer : Posté le 09/05/2019 23:09 | #


Est-ce que ton logiciel permet de traiter des tableaux. Si c'est le cas, tu peux contourner le problème, sachant qu'un string est un peu comme un tableau de caractères.
Sinon, tant pis.
Mais j'ai l'impression que tu n'auras pas ce problème tout court, parce que, en me basant sur ce que je vois, ton logiciel fait sans doute une définition automatique du type de la variable saisie. Ainsi, ton programme dans le logiciel algorithme utilise le type "caractère" (ou "char", comme dans la plupart des langages).
Quand tu dis, dans ton programme, Saisir lettre, c'est strictement équivalent à "Saisir lettre"?→Str1, à la différence près que, en Basic Casio, la variable déclarée ne pourra être qu'un string (ou un char, soit un str à un seul caractère), alors qu'en algorithmique comme tu as, le type de la variable dépendra de la façon dont l'utilisateur la déclare. Avec guillemets, c'est un char, sans guillemets, c'est un int.
Tu n'as donc aucun problème.
La seule différence sera que, au lieu d'écrire If Str1="A", tu écriras : Si lettre = "A".

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
Pour coloriser votre code, cliquez ici.
Sinon cliquez sur le bouton ci-dessous.
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2020 | Il y a 76 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd