Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Problema molto semplice con i numeri e uno statement if/else

    Salve. Da qualche giorno sto seguendo un corso su Codecademy per imparare il JavaScript e dopo aver capito alcune cose ho deciso di cimentarmi con la stesura di uno script molto semplice.

    In pratica vorrei che l'utente scriva un numero tramite il prompt e poi scrivere il quadrato dello stesso numero scritto prima sotto un altro prompt. Sotto uno statement if/else se il quadrato del numero scritto prima corrisponde al numero scritto dopo, lo script dovrebbe dare l'alert "Bravo!". Al contrario restituire l'alert "Sbagliato".

    Il problema è che non lo fa! Mi da sempre l'alert "Sbagliato" anche se è giusto!
    Ho provato a correggere lo script ma mi sembra corretto. La funzione che effettua il quadrato del numero scritto prima funziona. Il problema, quindi è lo statement if/else che restituisce un valore false e quindi esegue il codice scritto nell'else.

    Ecco il codice:
    codice:
    var numero = prompt("Scrivi un numero");
    var quadrato = function(n){
    	var numeroQuadrato = n*n;
    	return numeroQuadrato;
    };
    var risultato = quadrato(numero);
    var risposta = prompt("Dimmi il quadrato del numero scritto");
    		
    //document.write(risultato + "
    " + risposta); // per il debug
    		
    if(risultato === risposta){
    	alert("Bravo!");
    } else {
    	alert("Sbagliato");
    }

  2. #2
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    l' errore e' nell' eccesso di zelo!

    l' operatore === valuta anche il tipo di valori confrontati
    quello che viene da un prompt e' per natura una stringa, se quella stringa e' un numero e la moltiplichi per se' stessa diventa un numero
    ma confrontato con una stringa non potra' mai essere uguale

    o usi == o rendi il valore del secondo prompt sicuramente un numero
    if(risultato === parseInt(risposta,10)){...}

    ciao

  3. #3
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    Originariamente inviato da Xinod
    o usi == o rendi il valore del secondo prompt sicuramente un numero
    if(risultato === parseInt(risposta,10)){...}
    Esatto. In questo caso dare:

    codice:
    if (risultato === parseFloat(risposta)) { … } // confronto due numeri
    oppure

    codice:
    if (risultato.toString() === risposta) { … } // confronto due stringhe
    implica lo stesso sforzo per l'interprete che dare:

    codice:
    if (risultato == risposta) { … } // confronto un numero con una stringa
    Ma tieni conto che ci sono casi in cui il doppio uguale (che converte in automatico) è più dispendioso del triplo uguale accompagnato da conversione manuale, perché l'interprete può trovarsi a dover fare diversi tentativi con prova ed errore prima di trovare la conversione giusta (primo valore nel formato del secondo? secondo valore nel formato del primo? non sempre la risposta coincide: e quello continua fin quando non trova un true o non finiscono le combinazioni).
    Quindi il consiglio che ti do è di usare sempre il triplo uguale con conversione manuale. Anche se in questo caso, come ti dicevo non fa nessuna differenza e puoi benissimo scegliere.
    Per non parlare poi dei casi in cui sai già che i due valori sono nello stesso formato: lì il triplo uguale è quasi un dovere.
    Possono sembrare quisquiglie. Ma ti assicuro che un'uguaglianza fatta in un modo piuttosto che in un altro può cambiare di parecchio il tempo di risposta se inserita in cicli molto grandi (te lo dice uno che ha lavorato a un gioco di scacchi in JavaScript)…

  4. #4
    Grazie mille siete stati molto esaurienti e mi avete spiegato per bene questa cosa con gli operatori che non ho ancora imparato, quindi grazie ancora. Spero di ritrovarmi un giorno a fare un gioco di scacchi come carlomarx. ^^

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.