Go Down

Topic: [Résolu] Lettre Aleatoire (Read 660 times) previous topic - next topic

zeelevezozo

Finalement le Z se genre aucun probleme

Mon code final :
Code: [Select]
long nombre;
char alphabet[][8] = {  "A .-", "B -...", "C -.-.", "D -..", "E .", "F ..-.", "G --.", "H ....", "I ..", "J .---", "K -.-", "L .-..", "M --", "N -.", "O ---", "P .--.", "Q --.-", "R .-.", "S ...", "T -", "U ..-", "V ...-", "W .--", "X -..-", "Y -.--","Z --.." };

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(0));

  pinMode(2, OUTPUT);
  pinMode(3, INPUT);
}

void loop() {
  nombre = random(0, 26);
  char *lettre = alphabet[nombre];
  Serial.println(nombre);
  Serial.println(lettre);
  delay(1000);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print(lettre);
}







[code]

Cordialement,

kammo

On fait un randomseed pour avoir un vrai aléatoire
On fait un random por avoir une valeur aléatoire entre 65 et 90, c'est la correspondance ASCII pour a et z
Avec atoi() on doit pouvoir faire de ce qu'on obtient un 'vrai' caractère, donc une lettre
j'ai jamais fait, mais ça me paraît presque évident...

J'essaie, je poste si j'arrive à qch
Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

kammo

Voilà, hop, ca prend quelques lignes, pas de tableau, même pas de atoi()...
Evident...

Par contre je pense que les limites du random sont pas bonnes, m'en étais jamais servi...

Code: [Select]
byte RND;
void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(A0));
}

void loop() {
RND = random(25); //aléatoire de 0 à 25
Serial.print("rand");
Serial.print("\t");
Serial.println(RND);
RND=map(RND,0,25,65,90); //on en fait un aléatoire entre 65 et 90
Serial.print("map");
Serial.print("\t");
Serial.println(RND);
//RND=atoi(RND);
char Z = RND;
Serial.print("\t");
Serial.println(Z);
Serial.println("-----------");
delay(1000);
}
Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

kammo

J'ai oublié de virer la ligne //RND=atoi(RND);

Tu mets ça dans un arduino, tu lances le moniteur série (ctrl+M), et tu vois défiler des lettres.
Désolé le pc a planté deux fois entre les deux posts...
Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

kammo

*bravo kammo*
merci merci ...
Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

biggil

#20
May 20, 2018, 05:43 pm Last Edit: May 20, 2018, 05:45 pm by biggil
a) définir un tableau de chaînes de caractères

Code: [Select]

char alphabet[][7] = {  "A .-", "B -...",  /* A compléter */ , "Z --.." };

Pourquoi se prendre le chou avec des tableaux à 2 dimensions, avec toute l'ambiguité que ça entraîne ? C'est quoi cette dimension 7 ?
Voici comment je déclare un tableau de 26 chaînes de caractères :
Code: [Select]

const char* alphabet[26] = {  "A .-", "B -...",  /* A compléter */ , "Z --.." };

Ca donne un tableau unidimensionnel de 26 pointeurs, pointant vers les chaînes constantes conservées dans les DATAs du programme, sans se préoccuper de la longueur des chaînes.
La 1ere chaîne est désignée par alphabet[0], la seconde par alphabet[1], etc.
La déclaration de la dimension 26 est même optionelle.
Tout ça parce qu'une chaîne de caractères n'est pas un tableau, c'est ... une chaîne, quoi.

kammo

Tu trouves pas ma solution plus simple?
Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

supercc

@biggil, ma solution économise 4 octets de RAM ;-) Mais oui ta solution est plus simple (plus lisible, compréhensible, ...) je trouve ;-)

@kammo, je ne vois pas dans ta solution comment tu fais pour afficher le code morse associé à une lettre ?

kammo

L'algorithme pour les chiffres est très simple et on pourrait les faire à la volée.
J'ai pas l'impression que celui des lettres soit aussi simple.
A ce moment-là, soit un switch (j'aime bien pour la simplicité) soit un tableau.
Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

supercc

#24
May 20, 2018, 06:55 pm Last Edit: May 20, 2018, 06:56 pm by supercc
Dans ce cas précis, AMHA, le switch n'a que des inconvénients :
 * beaucoup plus de code
 * code peu performant. En effet, en moyenne 13 tests pour rien jusqu'à trouver le bon cas. Par exemple dans le cas du 'Z' le programme va faire 25 tests pour rien.

Avec le tableau, 2 lignes de codes : une pour la définition du tableau, et une pour l'accès à l'élément. AMHA, il n'y a pas mieux.

biggil

@biggil, ma solution économise 4 octets de RAM ;-)
ah bon, où ça donc ?

supercc

#26
May 20, 2018, 07:12 pm Last Edit: May 20, 2018, 07:32 pm by supercc
Avec ton tableau de pointeurs tu mémorises, en plus des chaînes, l'adresse de chacune d'elles (2 octets par adresse = 52 octets). Avec ma solution (matrice)  je n'ai pas ces pointeurs mémorisés, l'adresse d'une chaîne est calculée à l'exécution. Par contre comme j'impose la longueur 7 (la longueur de la plus longue chaîne puisque c'est une matrice) des octets sont "perdus" (réservés inutilement) pour toutes les chaînes de longueur inférieure à 7.

Du coup j'ai calculé (enfin demandé au programme de le faire) combien d'octets la solution "matrice" faisant perdre. Le résultat 48 octets. 52-48 = 4 ;-)

Bon, c'était pour rigoler car comme je l'ai dit la simplicité de ta solution vaut bien ces 4 octets ;-)

Par contre, si les éléments à mémoriser sont de longueur fixe alors là tes pointeurs mémorisés peuvent être considérés comme place mémoire perdue.

Exemple : si derrière chaque lettre au lieu d'associé un code morse de longueur variable on cherche a associer une donnée de longueur fixe (genre l'adresse d'une fonction a exécuter) on peut considérer la solution à base de matrice plus efficace en terme d'occupation mémoire.  

J-M-L

#27
May 20, 2018, 11:11 pm Last Edit: May 20, 2018, 11:11 pm by J-M-L
L'algorithme pour les chiffres est très simple et on pourrait les faire à la volée.
J'ai pas l'impression que celui des lettres soit aussi simple.
A ce moment-là, soit un switch (j'aime bien pour la simplicité) soit un tableau.
Vous êtes à côté du sujet.   Vous générez un nombre aléatoire mais vous n'avez pas la représentation morse

Pour générer un caractère aléatoire entre A (code ASCII 65) et Z (code ASCII 90) il suffit de générer un nombre entre 0 et 25 et ajouter 65 ou d'utiliser la version de random qui prend un min et Max  en param, puis un cast en fait alors un char. On n'a même pas besoin de connaître la valeur ASCII, on peut laisser le compilo se débrouiller

Code: [Select]
char lettre = (char) random('A', 'Z'+1); // +1 car la  valeur Max n'est jamais servie
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

Go Up