Aiuto per un programma a codici multipli con risposte multiple

Ciao ragazzi primo post e vorrei chiedervi una mano a fare un programmino che utilizzi display e tastierino.
In pratica nel programma deve essere richiesto un codice numerico. Vorrei inserire circa 20 codici numerici a 5 cifre diversi e per ognuno di loro ci deve essere in risposta un altro codice prestabilito. esempio. inserisco codice 12345 e in risposta nello schermo deve sempre apparire 56789, se inserisco 11111 dovra' sempre apparire 00000 e cosi' via per altre tot volte. Ovviamente se si inserisce un codice non presente nella lista dara' in risposta semplicemente "codice errato"
Con un codice singolo mi ero gia' fatto un programma che sbloccava una serratura tramite password e so che in questo caso bisogna usare degli array ma non mi riesce. Qualcuno gentilmente puo' spiegarmi come fare scrivendo un esempio?

Usi un array bidimensionale di 2 volte N elementi, nella prima riga i codici che ti aspetti e nella seconda le relative risposte ...

#define N  20
...
int mioArray[2][N] = { {chiave1, chiave2, ... chiaveN} , {risposta1, risposta2, ... rispostaN} };
...

... a quel punto, letto il codice lo cerchi in tutta la prima riga dell'array (ovvero da mioArray[0][0] a mioArray[0][N-1]) e, se lo trovi, diciamo con indice X (ovvero mioArray[0][X]), allora la risposta la prendi nella seconda riga dell'array ... mioArray[1][X].

Se invece arrivi in fondo e nella prima riga NON hai trovato il codice digitato, vuol dire che è un codice errato.

Guglielmo

Invece io avevo avuto idea alternativa
Ma poi non la ho esplorata completamente
Applico il codice in ingresso ad una funzione (di 'C') che esegue una funzione (matematica), per l'esattezza un polinomio (diofanteo) di grado N+2, dove N è il numero di possibili ingressi validi
Polinomio studiato di maniera che restituisca 0 per ingressi non validi e la risposta corretta per ingressi validi
È certo che un tale polinomio esista, trovarlo lo lascio fare alla regressione di Excel
Questo però sposterebbe la complessità dal dato al programma, l'opposto della buona programmazione
Peraltro la soluzione con array è proprio sparare sulla crocerossa, una semplice lista da scorrere...

Standardoil:
Invece io avevo avuto idea alternativa ....

... perché tu hai una mente contorta :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Guglielmo

Vero
infatti per me una tabella di valori rappresenta solo le radici di un polinomio, che nella mia mente 'vedo' rappresentato direttamente, oppure come tabella di radici, oppure ancora come singola 'ripetizione' di un fenomeno ciclico (e qui parte Fourier....ma difficile da rendere diofanteo) oppure come doppia tabella coefficiente-esponente
Non ho ancora imparato a 'ragionarla' come esponenziale complesso, magari 'da grande' ci riuscirò

gpb01:
Usi un array bidimensionale di 2 volte N elementi, nella prima riga i codici che ti aspetti e nella seconda le relative risposte ...

#define N  20

...
int mioArray[2][N] = { {chiave1, chiave2, ... chiaveN} , {risposta1, risposta2, ... rispostaN} };
...



... a quel punto, letto il codice lo cerchi in tutta la prima riga dell'array (*ovvero da mioArray[0][0] a mioArray[0][N-1]*) e, se lo trovi, diciamo con indice X (*ovvero mioArray[0][X]*), allora la risposta la prendi nella seconda riga dell'array ... mioArray[1][X].

Se invece arrivi in fondo e nella prima riga NON hai trovato il codice digitato, vuol dire che è un codice errato.

Guglielmo

Intanto grazie mille per avermi risposto, ho capito l'idea ma non riesco ad applicarla a questo

void loop(){

 lcd.setCursor(0,0);
 lcd.print("  PASSWORD...");

 customKey = customKeypad.getKey();
 if (customKey){
   Data[data_count] = customKey; 
   lcd.setCursor(data_count,1); 
   lcd.print(Data[data_count]); 
   data_count++; 
   }

 if(data_count == Password_Length-1){
   lcd.clear();

   if(!strcmp(Data, Master)){
     lcd.print(" Pass Corretta");
     }
   else{
     lcd.print("Pass Errata");
     delay(3000);
     }
   
   lcd.clear();
   clearData();  
 }
}

questo sarebbe il codice che confronta il codice scritto con la password salvata. penso che "if customkey" posso tenerlo cosi' che memorizza in una variabile quello che scrivo con il tastierino ma come dovrei scrivere l'if di confronto tra variabile e array?

nicolanoeri: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More ­> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

Chiedo scusa, modifica fatta

Standardoil:
Applico il codice in ingresso ad una funzione (di 'C') che esegue una funzione (matematica), per l'esattezza un polinomio (diofanteo) di grado N+2, dove N è il numero di possibili ingressi validi
Polinomio studiato di maniera che restituisca 0 per ingressi non validi e la risposta corretta per ingressi validi
È certo che un tale polinomio esista, trovarlo lo lascio fare alla regressione di Excel

Ad un ragazzo che ha iniziato da poco a programmare gli dai come soluzione l'implementazione di un polinomio da trovare con la regressione di Excel? Insomma, se uno ti chiede come si cucina il ragù gli consigli di studiare la termodinamica, un grande aiuto... :smiley:

Bah, sai, a parte che la mia era una provocazione, o meglio solo una battuta, Ma comunque anche lo OP come me è un elettrotecnico, proprio dai miei studi di elettrotecnica viene la mia conoscenza di polinomi e serie e sviluppi...
Comunque io ho consigliato una strada alternativa e funzionante, sottolineo funzionante, sono stato capace di indicarne una roadmap e quali erano i suoi limiti (della strada intendo)
adesso per cortesia: nel futuro ignorami, come io ignorero' volentieri te

Se i codici in ingresso rappresentano sempre un valore numerico, devi convertire la stringa Data in un numero intero con la funzione atoi() (o in un long con atol() se il codice puo' essere maggiore di 32767)

	int val = atoi(Data);

oppure

	long val = atol(Data);

e poi confrontarlo con le possibili password valide come ti ha suggerito @gpb01.

Se invece le password possono essere stringhe qualunque, puoi usare due array di stringhe, stringhePassword e stringheDisplay.

Nell'array stringhePassword metti le possibili password valide.
Nell'array stringheDisplay metti le corrispondenti stringhe da stampare, cioe' nella posizione i-esima metti la stringa da stampare corrispondente alla password i-esima.

Il valore NULL in stringhePassword e' usato per indicare la fine dell'array alla funzione cercaPassword e non deve avere una stringa corrispondente in stringheDisplay.

#define PASSWORD_NON_TROVATA -1

const char *stringhePassword[] = {
  "12345",
  "11111",
  NULL
};

const char *stringheDisplay[] = {
  "56789",
  "00000"
};

// cerca la password nell'array stringhePassword e restituisce l'indice corrispondente
// se non trova la password, restituisce l'indice non valido PASSWORD_NON_TROVATA

int cercaPassword(char *password)
{
  for (int i = 0; stringhePassword[i] != NULL; i++)
    if (strcmp(password, stringhePassword[i]) == 0)
      return (i);

  return (PASSWORD_NON_TROVATA);
}

void loop() {

  lcd.setCursor(0, 0);
  lcd.print("  PASSWORD...");

  customKey = customKeypad.getKey();
  if (customKey) {
    Data[data_count] = customKey;
    lcd.setCursor(data_count, 1);
    lcd.print(Data[data_count]);
    data_count++;
  }

  if (data_count == Password_Length - 1) {
    lcd.clear();

    int i = cercaPassword(Data);

    if (i != PASSWORD_NON_TROVATA) {
      lcd.print(stringheDisplay[i]);
    }
    else {
      lcd.print("Pass Errata");
      delay(3000);
    }

    lcd.clear();
    clearData();
  }
}