Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Tutto e di + - lettura tasto invio come carattere
Forum - Tutto e di + - lettura tasto invio come carattere

Avatar
DVD_DAVIDE (Normal User)
Newbie


Messaggi: 2
Iscritto: 06/02/2020

Segnala al moderatore
Postato alle 14:53
Giovedì, 06/02/2020
Ciao a tutti, ho fatto un programma e c'è un blocco per l'uscita o il replay di questo. Per il replay l'utente deve digitare r/R, ma vorrei che potesse uscire semplicemente digitando il tasto invio. Ho provato a digitare 'cin;' ma il programma lo salta semplicemente ed anche dichiarando la variabile void non funziona. Come posso fare?
Grazie,
Davide

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 16:15
Giovedì, 06/02/2020
Puoi mettere insieme una funzione int conferma_uscita( void ); che restituisca 1 (per "vero") se viene digitato direttamente invio, 0 (per "falso") se viene digitato 'r' o 'R' seguito direttamente da invio, e che non ritorna proprio se viene digitata qualsiasi altra cosa. In caso l'immissione non fosse tra le due indicate come valide, la funzione potrebbe continuare a chiedere ostinatamente se si desidera lasciare il programma o ripeterne l'esecuzione.

Codice sorgente - presumibilmente Python

  1. Il programma e' in esecuzione.
  2.  
  3. Ripeto l'esecuzione del programma?  r
  4.  
  5. Il programma e' in esecuzione.
  6.  
  7. Ripeto l'esecuzione del programma?  R
  8.  
  9. Il programma e' in esecuzione.
  10.  
  11. Ripeto l'esecuzione del programma?  rt
  12. Non ho capito. Ripeto l'esecuzione del programma?  gre2
  13. Non ho capito. Ripeto l'esecuzione del programma?  r
  14.  
  15. Il programma e' in esecuzione.
  16.  
  17. Ripeto l'esecuzione del programma?
  18.  
  19. Process returned 0 (0x0)   execution time : 24.119 s
  20. Press any key to continue.



(N.B. anche se non si può leggere dal testo, all'ultima domanda ha fatto seguito l'uscita perche' ho inserito direttamente invio.)

Nel mio programma di test, main() ha questo semplicissimo aspetto:

Codice sorgente - presumibilmente C#

  1. int main() {
  2.     do {
  3.         printf( "\nIl programma e' in esecuzione.\n\n" );
  4.     } while( !conferma_uscita() );
  5.  
  6.     return 0;
  7. }



ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
DVD_DAVIDE (Normal User)
Newbie


Messaggi: 2
Iscritto: 06/02/2020

Segnala al moderatore
Postato alle 18:48
Giovedì, 06/02/2020
Testo quotato

Postato originariamente da AldoBaldo:
che restituisca 1 (per "vero";) se viene digitato direttamente invio,


Ecco. Io volevo sapere se c'è un modo per far considerare il 'direttamente invio' al compilatore come carattere e poterlo utilizzare di conseguenza.

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 20:24
Giovedì, 06/02/2020
Per quel che ne so... ni.

Il tasto invio è quello che viene usato per chiudere una sequenza di input, per cui è sempre presente al termine di ogni immissione. Questo vale per getchar(), come per gets(), come per fgets()... C'è però il modo di sfruttare questa caratteristica per i tuoi scopi, "lavorandoci un po' intorno".

Considera, per esempio, l'uso di getchar(). Se uno scrive in console "ciao" e preme invio, usando c come variabile per ricevere l'input, quello che arriva al suo programma è:

Codice sorgente - presumibilmente Delphi

  1. c = getchar(); // in c c'e' 'c'
  2. c = getchar(); // in c c'e' 'i'
  3. c = getchar(); // in c c'e' 'a'
  4. c = getchar(); // in c c'e' 'o'
  5. c = getchar(); // in c c'e' '\n'



Dunque, basta che tu riceva l'input carattere per carattere fino a quando ti arriva '\n' e agisca di conseguenza.
Se '\n' ti arriva subito, significa che non è stato inserito niente prima che venisse premuto invio.

In altre parole, se uno "batte" subito invio senza avere inserito niente prima, quello che arriva al programma è:

Codice sorgente - presumibilmente Tutto e di +

  1. c = getchar(); // in c c'e' '\n'


Ultima modifica effettuata da AldoBaldo il 06/02/2020 alle 20:41


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote