Author Topic: Creare una sorta di "goto" uscendo da un if-else  (Read 5645 times)

Offline Gas75

Creare una sorta di "goto" uscendo da un if-else
« on: January 14, 2017, 11:03:15 PM »
Salve,
sto sviluppando un progettino/programmino matematico in Java, piuttosto essenziale e che già funziona tranne quando viene immesso un valore matematicamente non accettabile. :-\ Mi spiego meglio. :)

Tramite la classe Scanner ricevo in input tre valori di tipo int, r, i e g.
Ho bisogno di controllare che g sia un valore strettamente positivo prima di eseguire tutte le operazioni che portano all'output. Chiaramente potrei risolvere chiedendo da subito g e poi, se positiva chiedere anche r e i:
Code: You are not allowed to view links. Register or Login
if (g > 0) {
System.out.print("Immetti r: ");
int r = input.nextInt();
System.out.print("Immetti i: ");
int i = input.nextInt();
// tutto il resto del codice
} else {
System.out.print("Valore di g non valido!");
}
Purtroppo sono vincolato, per la natura stessa di come viene generalmente impostato il problema matematico, a richiedere i dati in quell'ordine, per cui il controllo dev'essere fatto dopo l'immissione dell'ultimo valore che è quello da controllare.
Un "goto" tipico del Basic sarebbe l'ideale ma in Java, mi pare, non esiste una classe del genere.
Qualche idea a riguardo?
« Last Edit: January 15, 2017, 01:27:58 AM by davenull »
Ci sono 10 tipi di persone: chi conosce il codice binario e chi no.
 

Offline davenull

  • Administrator
  • Sr. Member
  • *****
  • Posts: 321
  • Thanked: 13 times
  • Gender: Male
  • JonixLug Co-Founder & Administrator
    • View Profile
    • davenull's blog
Re:Creare una sorta di "goto" uscendo da un if-else
« Reply #1 on: January 15, 2017, 01:35:52 AM »
ho eliminato la dicitura "java" dal titolo del tuo topic creando immediatamente la sezione adeguata. purtroppo non conosco il java e non posso aiutarti, lo iniziai a studiare anni fa quando era ancora della sun, poi è passata ad oracle (non vedo di buon occhio la oracle) e l'ho abbandonato come linguaggio. segnalo la tua richiesta di aiuto a tetsuya che conosce molto bene il java, sia per android che per x86!!! :)
E-Mail: [email protected]
Website: You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login
 

Offline devilicecream

Re:Creare una sorta di "goto" uscendo da un if-else
« Reply #2 on: January 15, 2017, 02:33:10 AM »
Secondo il mitico Dijkstra, il goto è un comando che non bisognerebbe mai utilizzare, perchè porta a diversi punti di uscita negli algoritmi e genera facilmente "spaghetti code".
Gli amici Bohm e Jacopini hanno inoltre dimostrato un teorema secondo cui qualunque programma scritto utilizzando il goto è riscrivibile senza di esso.
Nel tuo caso è abbastanza semplice:

Code: You are not allowed to view links. Register or Login
int isGValid = 0;
while (!isGValid) {
    System.out.print("Immetti r: ");
    int r = input.nextInt();
    System.out.print("Immetti i: ");
    int i = input.nextInt();
    System.out.print("Immetti g: ");
    int g = input.nextInt();
    if (g > 0) {
        isGValid = 1;
        // Tutto il resto del codice
    } else {
        System.out.print("Valore di g non valido!");
    }
}

 

Offline davenull

  • Administrator
  • Sr. Member
  • *****
  • Posts: 321
  • Thanked: 13 times
  • Gender: Male
  • JonixLug Co-Founder & Administrator
    • View Profile
    • davenull's blog
Re:Creare una sorta di "goto" uscendo da un if-else
« Reply #3 on: January 15, 2017, 05:25:29 AM »
nel mio caso creo tanti piccoli sottoprogrammi che fanno cose diverse, e si richiamano tra loro. in questo modo evito il goto ed il cosiddetto spaghetti code, infatti il mio codice è leggibilissimo e stracommentato!!! :D
i commenti sono fondamentali, specialmente se crei un progetto, lo abbandoni e lo riprendi dopo anni. non ti ricordi più cosa ti frullava nella testa quando hai creato il progetto, e soprattutto non è facilmente leggibile e modificabile nel caso in cui lo devi passare ad altri!!! giusto walter???
io sono del parere che puoi scrivere il miglior programma al mondo, ma se non è ben commentato è da cestinare!!!
E-Mail: [email protected]
Website: You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login
 

Offline Gas75

Re:Creare una sorta di "goto" uscendo da un if-else
« Reply #4 on: January 15, 2017, 12:38:39 PM »
You are not allowed to view links. Register or Login
Secondo il mitico Dijkstra, il goto è un comando che non bisognerebbe mai utilizzare, perchè porta a diversi punti di uscita negli algoritmi e genera facilmente "spaghetti code".
Gli amici Bohm e Jacopini hanno inoltre dimostrato un teorema secondo cui qualunque programma scritto utilizzando il goto è riscrivibile senza di esso.
Nel tuo caso è abbastanza semplice:

Code: You are not allowed to view links. Register or Login
int isGValid = 0;
while (!isGValid) {
    System.out.print("Immetti r: ");
    int r = input.nextInt();
    System.out.print("Immetti i: ");
    int i = input.nextInt();
    System.out.print("Immetti g: ");
    int g = input.nextInt();
    if (g > 0) {
        isGValid = 1;
        // Tutto il resto del codice
    } else {
        System.out.print("Valore di g non valido!");
    }
}
Grazie, funzionicchia ;D ma va usato un boolean al posto di un int come "valore di controllo" isGValid...
Non va bene perché mi chiede daccapo anche i primi due valori mentre a me serve che torni soltanto su g. Per questo cercavo un "goto", che sinceramente a me non ha mai rappresentato problemi, tutt'ora lo sfrutto per dei programmini sulla mia calcolatrice. Forse perché sono programmi semplici, ma mi riesce più facile controllare dei "salti" di codice che scrivere un programma "saltando" da un .java all'altro!
Ci sono 10 tipi di persone: chi conosce il codice binario e chi no.
 

Offline lynx

Re:Creare una sorta di "goto" uscendo da un if-else
« Reply #5 on: January 15, 2017, 01:54:23 PM »
quoto devilicecream per il goto
Perché non puoi usare booleani? Per via della calcolatrice?
Se no, fai come ha scritto davenull.
 

Offline Gas75

Re:Creare una sorta di "goto" uscendo da un if-else
« Reply #6 on: January 15, 2017, 02:59:56 PM »
You are not allowed to view links. Register or Login
Perché non puoi usare booleani? Per via della calcolatrice?
No, il contrario: non posso fare !dato, se dato è un int, funziona soltanto coi booleani.
Ci sono 10 tipi di persone: chi conosce il codice binario e chi no.
 

Offline lynx

Re:Creare una sorta di "goto" uscendo da un if-else
« Reply #7 on: January 15, 2017, 03:52:44 PM »
Ah ok, quindi il while va bene, ma devi usare le classi per verificare solo g e poter continuare senza uscire e riavviare lo script, un po come ha detto davenull. Non c'è bisogno di fare + scripts in diversi files.
 

Offline davenull

  • Administrator
  • Sr. Member
  • *****
  • Posts: 321
  • Thanked: 13 times
  • Gender: Male
  • JonixLug Co-Founder & Administrator
    • View Profile
    • davenull's blog
Re:Creare una sorta di "goto" uscendo da un if-else
« Reply #8 on: January 15, 2017, 05:25:21 PM »
You are not allowed to view links. Register or Login
Ah ok, quindi il while va bene, ma devi usare le classi per verificare solo g e poter continuare senza uscire e riavviare lo script, un po come ha detto davenull. Non c'è bisogno di fare + scripts in diversi files.

esatto, crea un sottoprogramma apposito.
con i sottoprogrammi diventa tutto più leggibile e facile da gestire!!!
E-Mail: [email protected]
Website: You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login
 

Offline Gas75

Re:Creare una sorta di "goto" uscendo da un if-else
« Reply #9 on: January 16, 2017, 10:28:13 AM »
Ok, vediamo cosa riesco a combinare... :D
Grazie.
Ci sono 10 tipi di persone: chi conosce il codice binario e chi no.
 

Offline devilicecream

Re:Creare una sorta di "goto" uscendo da un if-else
« Reply #10 on: January 16, 2017, 11:10:28 AM »
D'accordissimo con davenull e dario sul fatto di fare programmi modulari e object-oriented, quindi divisi in classi.
Se il problema però è solo di non chiedere da capo i primi due dati, basta letteralmente spostare la riga del while 4 righe più sotto, dopo aver salvato il valore di i ma prima di chiedere g.
Come utilizzare i cicli al posto dei goto per evitare algoritmi non strutturati è una delle basi della programmazione moderna!
Hai mai letto documentazione o un libro sugli algoritmi di base e le loro implementazioni?
 
The following users thanked this post: Gas75

Offline Gas75

Re:Creare una sorta di "goto" uscendo da un if-else
« Reply #11 on: January 16, 2017, 12:59:23 PM »
You are not allowed to view links. Register or Login
Hai mai letto documentazione o un libro sugli algoritmi di base e le loro implementazioni?[/size]
Ho fatto un corso di Java "base", ma era troppo teorico e con poche applicazioni pratiche per focalizzare i concetti, almeno per come sono sempre stato abituato a studiare... :-\

In merito al problema di partenza, occorre controllare anche i valori di r e di i, in questo caso che siano interi (g deve invece essere intero e positivo).
Ho quindi scritto una cosa del genere:
Code: You are not allowed to view links. Register or Login
rText = String.valueOf(r);
        if (rText.indexOf(".") > 0) {
            throw new ErroreInput();
        }
per verificare la presenza del punto decimale nel dato di input, ma per qualche ragione non viene eseguita la classe per gestire l'errore, cioè sia così che non controllando nulla, se a r assegno 5.1, la console mi restituisce sempre gli stessi errori.
Chiaramente rText è stata dichiarata in apertura di classe, e nella riga del Main c'è throws ErroreInput.
Ci sono 10 tipi di persone: chi conosce il codice binario e chi no.
 

Offline devilicecream

Re:Creare una sorta di "goto" uscendo da un if-else
« Reply #12 on: January 16, 2017, 09:50:58 PM »
Non so bene come java gestisca la input.nextInt(), ma sicuramente se il valore di ritorno lo metti in un int non è possibile che ci sia un valore floating point li dentro!
Se vuoi che sia possibile avere r, i e g come floating point devi utilizzare delle variabili float, e una funzione diversa da input.nextInt() per prenderli dallo standard input.
Per quanto riguarda la verifica che fai, anche avendo i valori come floating point stai facendo una cosa assurda ed inefficiente: indipendentemente dal cast da int a stringa, che come efficienza varia da linguaggio a linguaggio, quando vai a cercare il punto nella stringa stai sicuramente eseguendo un algoritmo O(n), dove n è la lunghezza della stringa.
Questo è incredibilmente più inefficiente di fare un semplice modulo 1 (var % 1) per ottenere la parte decimale e poi semplicemente verificare che questa sia uguale a 0.


Io credo che più che focalizzarti su un corso per un linguaggio specifico, dovresti guardare prima gli algoritmi di base, magari con esempi in linguaggio C. Saranno argomenti molto teorici all'inizio, ma ti assicuro che una volta imparati bene ti serviranno per qualunque linguaggio e applicazione andrai a sviluppare in futuro.
 
The following users thanked this post: Gas75

Offline devilicecream

Re:Creare una sorta di "goto" uscendo da un if-else
« Reply #13 on: January 16, 2017, 10:02:36 PM »
Un'altra cosa, stai utilizzando un debugger per fare inspection a runtime delle variabili nello stack? Se usi Eclipse basta lanciare il programma con "Debug" invece che "Run" e dovrebbe attaccarti automaticamente il processo al debugger.
Poi basta usare dei breakpoint dove avvengono le cose "strane" per vedere in quel momento quali sono i valori contenuti nelle variabili.
Se avessi usato il debugger sicuramente ti saresti accorto che anche se dai a r il valore 5.1, nella variabile verrà inserito il valore 5, perchè essendo un intero non supporta i valori decimali.
 

Offline davenull

  • Administrator
  • Sr. Member
  • *****
  • Posts: 321
  • Thanked: 13 times
  • Gender: Male
  • JonixLug Co-Founder & Administrator
    • View Profile
    • davenull's blog
Re:Creare una sorta di "goto" uscendo da un if-else
« Reply #14 on: January 17, 2017, 05:59:39 AM »
non esiste uno stepper in modo da capire in che punto preciso genera l'errore?
E-Mail: [email protected]
Website: You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login
 

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40