Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » Stockage de données
Programateur Hors ligne Membre Points: 222 Défis: 10 Message

Stockage de données

Posté le 15/07/2015 13:49

Bonjour !
Qui n'a jamais pleuré en créant une matrice remplie uniquement de 1 et de 0 ?
En utilisant deux variables pour indiquer les coordonnées d'un objet (A et B le plus souvent ) ?
La plupart du temps, nous, programmeurs utilisons plusieurs variables alors qu'une seule est suffisante. Nous le faisons car c'est plus clair et pour rendre moins lourd le programme.
Mais nous pouvons aussi nous amuser à exploiter au maximum la capacité d'une variable ! Cela sera surtout utile pour stocker des informations dans l'ordinateur de manière durable (partie II).

Dans une première partie, je donnerais deux astuces qui me plaisent pour stocker et lire rapidement deux chiffres différents dans une même variable, puis ensuite comment effectuer un "stockage de masse".



I) Le deux en un

A quoi peut servir de stocker deux informations dans la même variable ?

Le plus souvent pour les coordonnées; en deux dimensions, on a besoin d'une valeur en abscisse et d'une autre en ordonnée. A la place d'utiliser deux variables, pourquoi ne pas en utiliser une seule ?

1) Utilisation des nombres imaginaires
1) Utilisation des nombres imaginaires
Pour ce qui ne savent pas de quoi il choisit, c'est simple à comprendre . Les mathématiciens s'arrachaient les cheveux en tentant de faire des calculs avec des racines carrés de nombres négatifs. Prenez par exemple √-3; sachant qu'un carré est toujours positif, on se rend compte que ce nombre est... impossible !
Ils ont donc décidé de créer les nombres imaginaires, des nombres non réels. √-1 correspond à i. (√3)i correspond à √-3.
Ce qui est bien avec ces nombres, c'est qu'ils ne peuvent s'ajouter avec les nombres réels. Par exemple, 2+3i ne peut pas être simplifié. On peut donc stocker deux valeurs dans une variable !
Pour des coordonnées, on peut par exemple faire correspondre l'abscisse aux réels et l'ordonnée aux imaginaires. Si un personnage doit être en bas à gauche dans un mode non-graphique, on peut entrer ses coordonnées comme suit :
1+7i→A

Mais ensuite, pour séparer l'ordonnée de l'abscisse, comment faire?

En effet, ça peut sembler difficile. Heureusement, il existe des fonctions sur votre calculatrice pour ça ! J'ai nommé ImP, qui conserve uniquement la partie imaginaire d'une variable, et ReP, qui conserve uniquement la partie réelle d'une variable. Pour positionner mon personnage, je devrais écrire :
Locate ReP A, ImP A,"o"

(Pour trouver ImP et ReP : [OPTN][F3][F6]

Note : cette technique est utilisé entre autre par Ne0tux dans le superbe jeu arkenstone.
Je la recommande plus que celle qui va suivre. En effet, elle est très lisible est utilisée en mathématiques ! Néanmoins, la seconde est aussi intéressante.

2) Utilisation d'un nombre décimal
2) Utilisation d'un nombre décimal
C'est plus facile à comprendre ! Pour positionner un personnage en bas à gauche, on peut aussi écrire le nombre 1,7. On utilise la fonction Int pour récupérer l'abscisse, et Frac pour récupérer l'ordonnée. Int récupère la valeur entière d'un nombre, Frac la valeur fractionnaire.
Mais Frac 1,7 renvoie 0,7...

Ce n'est pas très gênant : on notera 10Frac1,7.
Le code ressemblera à ça :
1,7->A
Locate IntA,10FracA,"o"

Vous noterez qu'on peut combiner ces deux astuces pour faire un « quatre en un ».



II)Stockage de masse

Imaginons : Pour un morpion, j'utilise une matrice de 3x3 cases. Si personne n'a joué sur cette case, elle contient un 0, si le joueur 1 a joué, elle contient un 1, si le joueur 2 a joué, elle contient un 2.
Plutôt que d'utiliser cette matrice, comme toutes les matrices très lourde, pourquoi ne pas utiliser juste… une variable ?

1) Méthode moyennement poussée
1) Méthode moyennement poussée
Elle est plus intuitive ; chaque case correspond à une puissance de 10. Je m'explique : imaginons que la matrice ressemble à ça :

1 1 0
0 2 2
0 0 0

La variable contiendra le nombre : 1*10⁸+1*10⁷+0*10⁶… = 110022000
En fait, c'est la même méthode que l'utilisation d'un nombre décimal, elle est cependant à plus grand échelle mais plus difficile à utiliser. En effet, pour lire la nieme case, on utilise la longue formule :
MOD(Int(110022000/10^(n-1)),10)
.
(tiré du tutoriel très pratique : http://www.planet-casio.com/Fr/programmation/tutoriels.php?id=60)
Avec 9 cases, ça ne pose aucun problème. Mais une fois qu'un nombre dépasse 10^14, la calculatrice arrondis le résultat, si bien que le booléen (10^14=10^14 +1) est vrai. On a perdu une information, cette technique n'est plus suffisante. Il en faudra une plus poussée…
Je vous arrête tout de suite ; pourquoi ne pas utiliser les chaînes de caractères ?

En effet, cette technique va très bien avec ce genre de problème. Voici comment l'utiliser :
"110022000"→Str1
Exp(StrMid(Str1,A,1))

Ans contiendra la Aieme case.

On peut stocker 255 chiffres dans une chaîne de caractère, ce qui est énorme. Pas la peine d'utiliser directement un nombre. Cette deuxième partie serait-elle inutile ?
Elle ne l'est pas ; car si elle permet de stocker une grosse information de manière durable, elle ne peut pas stocker une suite de grosses informations de manière durable. Et si, à chaque fin de partie de morpion, je voulais stocker cette fin de partie ?
J'utiliserais une liste, outil le plus pratique pour stocker une suite de grosses informations. Si j'ai joué ma 78e partie, on aura Liste 1[78]=110022000.
Bien sûr, la liste 1 est très utilisé, et pour conserver ces informations on utilisera une liste peu utilisé. Pourquoi pas la liste 13 par exemple ?

2) Changer de base
2) Changer de base
Bon, récapitulons : j'espère vous avoir convaincu de l'avantage du stockage de nombres par rapport au stockage de texte. Vous venez de voir une méthode de stockage de nombre, que nous allons maintenant pousser.

Reprenez notre nombre 110022000. Vous le trouvez si bien que ça ? En fait, ce nombre est en base 3 ; chaque chiffre qui le compose est soit un 0, un 1 ou un 2. Vous vous rendez maintenant compte de l'espace perdu ? Nous devons tout de suite revenir en base 10 !
On transforme notre 1*10⁸+1*10⁷… en 1*3⁸+1*3⁷…
On obtient : 8964. Pas mal, comme réduction !
Et pour décortiquer ce 8964, comment faire?

Pour lire la nieme case, on fait :
MOD(Int(8964/3^(1+Int (ln 8964/ln 3)-n)),3)

Encore une fois, on peut combiner cette technique à celle des nombres imaginaires.


Voila, je ne pense pas que tout est dit sur le stockage de masse, mais c'est déjà pas mal
Si vous avez des questions, des suggestions, des remarques, des erreurs, n'hésitez pas à m'écrire !


1, 2, 3 Suivante
Lephenixnoir En ligne Administrateur Points: 19621 Défis: 142 Message

Citer : Posté le 15/07/2015 14:58 | #


À noter qu'un imaginaire prend toujours la place de deux réels (24 octets) dans la mémoire !

Et qu'à part la première astuce, toutes les autres ont tendance à bien ralentir le programme si on les utilise trop souvent...

Plutôt une bonne idée, comme tuto. Quoique pas excessivement accessible aux débutants, à mon avis.. ^^'
Breizh_craft En ligne Modérateur Points: 1087 Défis: 7 Message

Citer : Posté le 15/07/2015 15:00 | #


Il prends la place de 2 réel, mais on peut en stocker 52 au lieu de 26, c'est pas rien... et j'ai déjà utilisé la méthode du nombre décimal pour afficher des infos dynamiquement (même les programmes tout con de type trinôme ou pythagore, j'essaie de les faire jolis ).
Breizh.pm – Un adminsys qui aime les galettes.
Lephenixnoir En ligne Administrateur Points: 19621 Défis: 142 Message

Citer : Posté le 15/07/2015 15:05 | #


Breizh_craft a écrit :
Il prends la place de 2 réel, mais on peut en stocker 52 au lieu de 26, c'est pas rien...

Ah ben oui mais ça il l'a déjà souligné ; moi je me contente d'ajouter ce que je pense pouvoir être utile
Dark storm En ligne Membre d'honneur Points: 11373 Défis: 176 Message

Citer : Posté le 15/07/2015 17:37 | #


Il prends la place de 2 réel, mais on peut en stocker 52 au lieu de 26

Enfin, si tu veux t'as accès à 999 (*2 à *4 variables si on compresse) dans une unique liste, donc bon
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Ninestars Hors ligne Membre Points: 2316 Défis: 22 Message

Citer : Posté le 15/07/2015 17:39 | #


Enfin, si tu veux t'as accès à 999 (*2 à *4 variables si on compresse) dans une unique liste, donc bon
* 26 listes* 6 fichiers...
J'ai pas l'impression qu'on soit en manque de variables
Dark storm En ligne Membre d'honneur Points: 11373 Défis: 176 Message

Citer : Posté le 15/07/2015 17:40 | #


Enfin, après t'es en manque de place, parce que 24 * 999 * 26 * 6 = 3 740 256. Je savais pas qu'on avait 3,7 Mo de mémoire pour les variables
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Lephenixnoir En ligne Administrateur Points: 19621 Défis: 142 Message

Citer : Posté le 15/07/2015 17:41 | #


Dark storm a écrit :
Enfin, après t'es en manque de place, parce que 24 * 999 * 26 * 6 = 3 740 256. Je savais pas qu'on avait 3,7 Mo de mémoire pour les variables

C'est pour l'organisation

Conclusion : on a assez de variables pour remplir toute la mémoire. Donc, pourquoi s'embêter ?
Breizh_craft En ligne Modérateur Points: 1087 Défis: 7 Message

Citer : Posté le 15/07/2015 17:42 | #


En effet

Mais bon stocker des coordonnées dans une seule variable, peut s'avérer pratique, que ce soit dans une liste, une matrice, une variable entre A et Z (et r et θ)...
Breizh.pm – Un adminsys qui aime les galettes.
Lephenixnoir En ligne Administrateur Points: 19621 Défis: 142 Message

Citer : Posté le 15/07/2015 17:43 | #


D'ailleurs, je me demande pourquoi les algorithmes qui génèrent du Super DrawStat ne le mettent pas dans une seule liste...
Breizh_craft En ligne Modérateur Points: 1087 Défis: 7 Message

Citer : Posté le 15/07/2015 17:43 | #


Certains le font (dont un récemment il me semble).
Breizh.pm – Un adminsys qui aime les galettes.
Dark storm En ligne Membre d'honneur Points: 11373 Défis: 176 Message

Citer : Posté le 15/07/2015 17:44 | #


Celui de Ne0 met tout dans une unique liste il me semble

Ajouté le 15/07/2015 à 17:44 :
Quoi que, c'est du DrawStat, mais ça devrait être pareil au final.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Lephenixnoir En ligne Administrateur Points: 19621 Défis: 142 Message

Citer : Posté le 15/07/2015 17:46 | #


D'ailleurs, j'ai toujours pas compris comment il les compressait, ses listes...
Dark storm En ligne Membre d'honneur Points: 11373 Défis: 176 Message

Citer : Posté le 15/07/2015 17:48 | #


Moi non plus, mais il offre de quoi les afficher il me semble…
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Programateur Hors ligne Membre Points: 222 Défis: 10 Message

Citer : Posté le 15/07/2015 18:59 | #


Lephenixnoir a écrit :
Et qu'à part la première astuce, toutes les autres ont tendance à bien ralentir le programme si on les utilise trop souvent...

C'est très vrai... Mais pour moi, même si ces méthodes peuvent être pratiques, il est presque amusant d'essayer de stocker un max d'éléments dans une variable
J'ai besoin de votre participation ici :
94%
Cliquer pour enrouler
Lephenixnoir En ligne Administrateur Points: 19621 Défis: 142 Message

Citer : Posté le 15/07/2015 19:08 | #


Programateur a écrit :
C'est très vrai... Mais pour moi, même si ces méthodes peuvent être pratiques, il est presque amusant d'essayer de stocker un max d'éléments dans une variable

Bof... si on pouvais accéder aux bits eux-mêmes, on stockerait beaucoup plus d'informations
Dark storm En ligne Membre d'honneur Points: 11373 Défis: 176 Message

Citer : Posté le 15/07/2015 19:30 | #


On peut presque x)
Il suffit de tout stocker avec des puissances de
Enfin, après c'est un peu lent ><
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Dodormeur Hors ligne Ancien rédacteur Points: 3964 Défis: 82 Message

Citer : Posté le 15/07/2015 20:24 | #


Mais le problème, c'est qu'avec la représentation des nombres en Basic, c'est pas possible de travailler avec les bits, vu qu'ils sont en BCD (du coup la valeur représentative maximale qu'on peut stocker est 9 999 999 999 999 999 si je me souviens bien, et non pas un multiple de 2 :/ ) Du coup même avec des puissance de deux, c'est pas la peine d'essayer
Pokemon !!!!!! => pokemon stadium/battle

mes meilleurs jeux
Cliquer pour enrouler
un jeu avec des niveaux de gris mais compatible SH4 (mais en monochrome pour les SH4) => bomberman
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2

projets
Cliquer pour enrouler

pokemon
Cliquer pour enrouler



encodage des données de combat (sprite, attaques et nom)
   100%

systeme de combat
   100%

encodage des données de pokemon (niveau d'apprentisage et evolution)
   100%


moteur de la carte
   50%

level design
   1%

finition de pokemon jade
   42%

merci a tout le monde pour son soutien


projets que je soutiens
Cliquer pour enrouler
minecraft de limachi
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm (dont je connais le nom, mais pas vous ) Arcuz !
Lephenixnoir En ligne Administrateur Points: 19621 Défis: 142 Message

Citer : Posté le 15/07/2015 20:47 | #


Dodormeur a écrit :
Mais le problème, c'est qu'avec la représentation des nombres en Basic, c'est pas possible de travailler avec les bits, vu qu'ils sont en BCD

Quoi ? Oh que non

Une grosse structure.
Mgl64200 Hors ligne Membre Points: 649 Défis: 0 Message

Citer : Posté le 15/07/2015 20:49 | #


Bravo ! Je sais pas si tu as trouvé ça tout seul Programateur, mais ça va m'aider.
Toi t'es en train de lire ma signature là...
Programateur Hors ligne Membre Points: 222 Défis: 10 Message

Citer : Posté le 15/07/2015 21:11 | #


Mgl64200 a écrit :
Bravo ! Je sais pas si tu as trouvé ça tout seul Programateur, mais ça va m'aider.

En fait, j'ai travaillé sur un pendu qui enregistre les mots nouveaux dans un dictionnaire. C'est en voulant rendre le dictionnaire de plus en plus performant que je suis arrivé à ces techniques ! Mais j'avoue que sans tous les tutos de planet casio, j'aurais eu du mal !
J'ai voulu être honnête et je remercie particulièrement Ne0tux pour son astuce des nombres imaginaires, qui ouvrait la voie à une série d'astuce pour "gratter" de la place !
J'ai besoin de votre participation ici :
94%
Cliquer pour enrouler
1, 2, 3 Suivante

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
: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 - 2021 | Il y a 62 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