Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    problema credo legato al casting

    ho creato questo codice che mi dovrebbe fare la domanda e tramite input da tastiera provare a dare la risposta esatta. in base alla risposta avrò una risposta se è esatta o sbagliata.
    codice:
    public class Domande {
    private final String PRIMA_DOMANDA = "Quanti scudetti ha vinto l'AS Roma?";
    private final String SECONDA_DOMANDA = "Quanti anni ha Lorella Cuccarini?";
    private final String TERZA_DOMANDA = "Quanto vive mediamente un gatto?";
    private final String QUARTA_DOMANDA = "Quanto è alto il grattacielo di Cesenatico?";
    private final String QUINTA_DOMANDA = "Quanti abitanti ha roma?";
    private final String SESTA_DOMANDA = "Quanto è la distanza minima all'incirca tra la terra e marte?";
    private final String SETTIMA_DOMANDA = "Quanti mondiali costruttori ha vinto la Ferrari?";
    private final String OTTAVA_DOMANDA = "Quanto è il record del salto in lungo?";
    public String getPRIMA_DOMANDA() {
        return PRIMA_DOMANDA;
    }
    public String getSECONDA_DOMANDA() {
        return SECONDA_DOMANDA;
    }
    public String getTERZA_DOMANDA() {
        return TERZA_DOMANDA;
    }
    public String getQUARTA_DOMANDA() {
        return QUARTA_DOMANDA;
    }
    public String getQUINTA_DOMANDA() {
        return QUINTA_DOMANDA;
    }
    public String getSESTA_DOMANDA() {
        return SESTA_DOMANDA;
    }
    public String getSETTIMA_DOMANDA() {
        return SETTIMA_DOMANDA;
    }
    public String getOTTAVA_DOMANDA() {
        return OTTAVA_DOMANDA;
    }
    }
    codice:
    public class RisposteDomandaA extends TestRisposta{
        private String risposta;
    public static final RisposteDomandaA RISPOSTA_UNO = new RisposteDomandaA ("4");
    public static final RisposteDomandaA RISPOSTA_DUE = new RisposteDomandaA ("5");
    public static final RisposteDomandaA RISPOSTA_TRE = new RisposteDomandaA ("3");
    public static final RisposteDomandaA RISPOSTA_QUATTRO = new RisposteDomandaA ("6");
    private RisposteDomandaA(String risposta) {
    this.risposta = risposta;
    }
    public String getRisposta() {
        return risposta;
    }
    }
    codice:
    import java.util.Scanner;
    
    public class TestRisposta {
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            Domande dom = new Domande();
            String stringa = "";
            //String uno = dom.getPRIMA_DOMANDA();
            System.out.println(dom.getPRIMA_DOMANDA());
            System.out.println("4\t"+"5\t\n"+"3\t"+"6\t");
            System.out.println("Digita la risposta esatta e premi enter, oppure scrivi \"fine\" per terminare il programma.");
            while(!(stringa = scanner.next()).equals("fine")) {
                try {
                    verificaRisposta(stringa);
                }catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            System.out.println("Fine programma!");
        }
        public static void verificaRisposta(String stringa){
            if(stringa =RisposteDomandaA.RISPOSTA_UNO) {
                System.out.println("Risposta errata!!!");
            } else if (stringa = RisposteDomandaA.RISPOSTA_DUE){
                System.out.println("Risposta errata!!!");
            }else if (stringa = RisposteDomandaA.RISPOSTA_TRE){
                System.out.println("Risposta esatta!!!");
        }else if (stringa = RisposteDomandaA.RISPOSTA_QUATTRO){
            System.out.println("Risposta errata!!!");
    }
        }
    }
    il problema è nella classe TestRisposta e precisamente negli if. se vedo l'errore mi dice:
    type mismatch:cannot convert from String to Boolean e cannot convert RisposteDomandaA to String.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Controlla tutte le if del metodo "verificaRisposta".
    Il confronto fra oggetti si fa usando il metodo equals(). Tu non solo non stai usando il metodo equals(), ma non stai nemmeno facendo un confronto: stai usando l'operatore "=" che serve a fare gli assegnamenti!


    codice:
    if(stringa = RisposteDomandaA.RISPOSTA_UNO)
    -----------^

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Per testare l'uguaglianza per gli oggetti si utilizza il metodo equals (stringa.equals(....)), tra l'altro sarebbe stato sbagliato anche nel caso i due operandi fossero stati tipi primitivi in quanto l'operatore di uguaglianza è "==" e non "=".

  4. #4
    grazie, mi sonon perso in un bicchiere d'acqua... è vero... l'errore del principiante ... ora non ho più errori..però ho un'altro problema. inserisco la risposta che è il valore scelto e non dà nessun risultato. perchè????

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Posta il codice modificato.
    Comunque, al posto del metodo next() di Scanner dovresti usare nextLine(), che rimuove i delimitatori...


    Ciao.
    Ultima modifica di LeleFT; 18-12-2014 a 18:02
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    il codice modificato è questo... riporto solo classe TestRisposta.

    codice:
    import java.util.Scanner;
    
    public class TestRisposta {
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            Domande dom = new Domande();
            String stringa = "";
            //String uno = dom.getPRIMA_DOMANDA();
            System.out.println(dom.getPRIMA_DOMANDA());
            System.out.println("4\t"+"5\t\n"+"3\t"+"6\t");
            System.out.println("Digita la risposta esatta e premi enter, oppure scrivi \"fine\" per terminare il programma.");
            while(!(stringa = scanner.next()).equals("fine")) {
                try {
                    verificaRisposta(stringa);
                }catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            System.out.println("Fine programma!");
        }
        public static void verificaRisposta (String stringa) throws Exception{
            if(stringa.equals(RisposteDomandaA.RISPOSTA_UNO)) {
                System.out.println("Risposta errata!!!");
            } else if (stringa.equals(RisposteDomandaA.RISPOSTA_DUE)){
                System.out.println("Risposta errata!!!");
            }else if (stringa.equals(RisposteDomandaA.RISPOSTA_TRE)){
                System.out.println("BRAVO!!! Hai indovinato!");
        }else if (stringa.equals(RisposteDomandaA.RISPOSTA_QUATTRO)){
            System.out.println("Risposta errata!!!");
    }
        }
    }

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    il problema è nella classe RisposteDomandeA. Se lo modifichi così funziona:
    codice:
    public class RisposteDomandaA extends TestRisposta{
        private String risposta;
    public static final String RISPOSTA_UNO = "4";
    public static final String RISPOSTA_DUE = "5";
    public static final String RISPOSTA_TRE = "3";
    public static final String RISPOSTA_QUATTRO = "6";
    private RisposteDomandaA(String risposta) {
    this.risposta = risposta;
    }
    public String getRisposta() {
        return risposta;
    }
    }
    Facendo come facevi prima andavi con l'equals a confrontare una stringa ed un oggetto RispostaDomandaA.

    Spero di non aver detto una sciocchezza.

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    codice:
    if(stringa.equals(RisposteDomandaA.RISPOSTA_UNO))

    L'oggetto "stringa" è di tipo String.
    L'oggetto RisposteDomandaA.RISPOSTA_UNO è di tipo RisposteDomandaA.

    L'equals fallirà sempre. Modificare:


    codice:
    if(stringa.equals(RisposteDomandaA.RISPOSTA_UNO.getRisposta()))

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    eggià...e pensare che lo sapevo... devo stare più attento grazie mille..ora funziona . però vorrei un chiarimento sul funzionamento di scanner.nextLine() grz. non conosco questo...

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Di default, Scanner considera delimitatore qualunque carattere WHITESPACE (qui la lista).
    Di conseguenza, se devi leggere una riga di testo che, potenzialmente, può contenere degli spazi, la next() "non fa ciò che ti aspetti".

    Al contrario, nextLine() restituisce l'intera linea: considera come delimitatori solo le interruzioni di linea (carrige-return e line-feed).

    Solitamente è più "naturale" prendere l'intera linea digitata dall'utente fino alla pressione del tasto INVIO e successivamente "normalizzarla".

    Nel tuo caso, essendo che devi leggere solamente un numero, il risultato non cambia... ma se l'utente, per errore, scrivesse qualcos'altro dopo il numero (separando con lo spazio), il programma proseguirebbe con la successiva lettura e non attenderebbe alcunchè dall'utente, acquisendo in input proprio la seconda parte della prima riga data in input. Questo, generalmente, è un comportamento indesiderato e può risultare fuorviante per l'utente.

    Ecco un veloce esempio:

    codice:
       public static void main(String[] args) throws Exception {
          Scanner sc = new Scanner( System.in );
          System.out.print("Digita qualcosa: ");
          String str = sc.next();
          System.out.println();
          System.out.println("Hai digitato: " + str);
          System.out.print("Digita ancora qualcos'altro: ");
          str = sc.next();
          System.out.println();
          System.out.println("La seconda volta hai digitato: " + str);
       }

    Esegui e prova a dare in input una frase (contenente degli spazi).

    Poi prova a sostituire le chiamate a next() con delle chiamate a nextLine() e osserva la differenza di comportamento.


    Ciao.
    Ultima modifica di LeleFT; 18-12-2014 a 18:46
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.