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
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.
"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.
Citer : Posté le 09/05/2019 20:43 | #
Wow j'aurais pas pensé faire aussi petit Lephenixnoir
-Planétarium 2
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
(Et de toute façon, vous pouvez pas dire le contraire)
MultipliCasio
RDM Calculs
Back Mirror
A Switch To The Top C
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
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..
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.
(Et de toute façon, vous pouvez pas dire le contraire)
MultipliCasio
RDM Calculs
Back Mirror
A Switch To The Top C
Citer : Posté le 09/05/2019 21:12 | #
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.
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.
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.
(Et de toute façon, vous pouvez pas dire le contraire)
MultipliCasio
RDM Calculs
Back Mirror
A Switch To The Top C
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
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 !
(Et de toute façon, vous pouvez pas dire le contraire)
MultipliCasio
RDM Calculs
Back Mirror
A Switch To The Top C
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.
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 !
(Et de toute façon, vous pouvez pas dire le contraire)
MultipliCasio
RDM Calculs
Back Mirror
A Switch To The Top C
Citer : Posté le 09/05/2019 22:42 | #
Très joli avatar, soit dit en passant.
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".