Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Indovina il numero

  1. #1

    Indovina il numero

    Salve a tutti, senza chiedervi direttamente il codice ( l'esercizio risulterebbe abbastanza inutile )
    volevo chiedervi qualche consiglio su dove e cosa sbaglio.

    La consegna sarebbe la seguente:

    Utilizzando solo ciclo for, o while, if, switch, enumerazioni bisogna indovinare un numero positivo formato da 5 cifre. Il programma dovrà inoltre ritornare il numero di cifre corrette e la loro somma.
    Esempio: se il numero segreto fosse 45678 e io inserisco 46679 il programma ritornerebbe 3 e 17

    codice:
    package gioconumeri;
    
    import java.util.Scanner;
    
    
    public class GiocoNumeri {
        
        public static void main(String[] args) {
            
            Scanner tastiera = new Scanner(System.in);
        
            int div = 10;
            int vite = 5;
            int somma = 0;
            int count = 0;
            int modConfr = 0;
            
            System.out.println("Inserisci un numero di 5 cifre: ");
            int confronto = tastiera.nextInt();
            
            while(vite > 0 || (base - modConfr) == 0){
                
                modConfr = confronto % div;
                int modBase = base % div;
                
                int differenza = modBase - modConfr;
                
                if(differenza == 0)
                {
                    System.out.println(modBase);
                    System.out.println(modConfr);
                    System.out.println("La seguente cifra e' corretta: " + differenza);
                    somma = somma + differenza;
                    div *= 10;
                }
                
                else
                {
                    System.out.println("Hai perso una vita, ritenta");
                    confronto = tastiera.nextInt();
                    vite--;
                }
                
            }
            
        }
        
    }
    il mio codice,per quel poco che ho notato, non funziona in quanto:
    A) c'è sicuramente qualche problema logico
    B) una volta sbagliata una cifra il programma non va più avanti (e questo e' per ovviamente dell'else che blocca), ma non sto riuscendo a trovare valide alternative. Esempio: se il numero segreto fosse 45678 e io inserisco 46679 alla prima cifra si bloccherebbe senza verificare il resto. (Magari sarebbe giusto togliere lo scanner, dico bene ? )
    C) credo di aver messo troppe variabili :|
    Ultima modifica di ScorpionWhale; 24-10-2015 a 22:26

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Si l'impostazione del problema è un po' confusionaria, soprattutto il confronto dentro il ciclo.
    Intanto ti conviene usare un metodo che faccia il confronto e restituisca un valore booleano che vale true solo se il numero è esatto, altrimenti false.
    In questo caso potrebbe sembrare superfluo, ma è sempre una buona idea creare metodi che si occupano di un singolo compito e non "intasare" il main con tutto, soprattutto quando il codice è molto lungo.


    Dentro il ciclo io quindi farei qualcosa del genere:


    codice:
    while(vite>0)
    	{
    		System.out.println("Ti restano ancora "+vite+" vite.Prova a indovinare il numero di 5 cifre > ");
    		int confronto=tastiera.nextInt();
    		if(numeriUguali(base,confronto))
    		{
    			System.out.printl("Complimenti hai indovinato!");
    			return;
    		}
    		else vite--;
    	}

    Cioè leggi il numero all'inizio del ciclo, poi richiami la funzione che ti dice se i due numeri sono uguali (a proposito nel tuo codice usi la variabile base e non si capisce da dove l'hai tirata fuori, sarebbe una buona idea che fosse un numero di 5 cifre generato casualmente).


    Nella funzione che confronta l'uguaglianza dei numeri, in caso il numero non sia corretto, stampi anche il numero di cifre corrette e la loro somma.


    Poi tu hai fatto un sacco di casino nel confrontare le cifre con l'operatore % , se posso consigliarti io leggerei il numero come stringa (quindi usando nextLine() e non nextInt()) , ovviamente assicurandomi che la stringa sia di lunghezza 5 e che sia effettivamente un numero.
    Poi confronti una cifra alla volta utilizzando la funzione substring della classe String e convertendo il carattere letto in numero usando Integer.parseInt(laTuaCifraLetta).


    E' difficile dire di più senza scrivere l'intero codice, intanto dimmi se questo ti può essere utile

  3. #3
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Si l'impostazione del problema è un po' confusionaria, soprattutto il confronto dentro il ciclo.
    Intanto ti conviene usare un metodo che faccia il confronto e restituisca un valore booleano che vale true solo se il numero è esatto, altrimenti false.
    In questo caso potrebbe sembrare superfluo, ma è sempre una buona idea creare metodi che si occupano di un singolo compito e non "intasare" il main con tutto, soprattutto quando il codice è molto lungo.


    Dentro il ciclo io quindi farei qualcosa del genere:


    codice:
    while(vite>0)
        {
            System.out.println("Ti restano ancora "+vite+" vite.Prova a indovinare il numero di 5 cifre > ");
            int confronto=tastiera.nextInt();
            if(numeriUguali(base,confronto))
            {
                System.out.printl("Complimenti hai indovinato!");
                return;
            }
            else vite--;
        }

    Cioè leggi il numero all'inizio del ciclo, poi richiami la funzione che ti dice se i due numeri sono uguali (a proposito nel tuo codice usi la variabile base e non si capisce da dove l'hai tirata fuori, sarebbe una buona idea che fosse un numero di 5 cifre generato casualmente).


    Nella funzione che confronta l'uguaglianza dei numeri, in caso il numero non sia corretto, stampi anche il numero di cifre corrette e la loro somma.


    Poi tu hai fatto un sacco di casino nel confrontare le cifre con l'operatore % , se posso consigliarti io leggerei il numero come stringa (quindi usando nextLine() e non nextInt()) , ovviamente assicurandomi che la stringa sia di lunghezza 5 e che sia effettivamente un numero.
    Poi confronti una cifra alla volta utilizzando la funzione substring della classe String e convertendo il carattere letto in numero usando Integer.parseInt(laTuaCifraLetta).


    E' difficile dire di più senza scrivere l'intero codice, intanto dimmi se questo ti può essere utile
    Ti ringrazio calorosomente per la risposta. Concordo sul confusionario, ma non posso utilizzare funzioni o metodi: ciò che posso utilizzare si ferma a ciò che ho scritto, per quanto possa essere estremamente antiestetico...

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ok il mio era un consiglio generale, sicuramente in seguito inizierai ad usare i metodi.
    In questo caso la questione è solo di eleganza e pulizia del codice, visto che il metodo viene richiamato solo una volta all'interno del ciclo, se dovessi usarlo più volte ovviamente sarebbe da pazzi riscrivere tutto .

    Non ho capito però se hai delle limitazioni anche su come effettuare il controllo: io consigliavo di usare il confronto carattere per carattere considerando la stringa letta e non il numero per vedere l'uguaglianza dei due numeri.

    Se non puoi fare nemmeno questo e devi fare il confronto solo con gli operatori allora devi fare un ciclo interno in cui confronti cifra per cifra, visto che per ora se la cifra delle unità è diversa chiedi subito un altro numero.
    Inoltre se differenza è uguale a 0 non ha senso fare

    somma = somma + differenza;

    devi aggiungere modBase altrimenti somma rimane sempre uguale.Inoltre sempre dentro quell' if devi anche incrementare il contatore delle cifre uguali.
    Prova a sistemare un po' il tutto, poi chiedi pure se ci sono altri dubbi

  5. #5
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Ok il mio era un consiglio generale, sicuramente in seguito inizierai ad usare i metodi.
    In questo caso la questione è solo di eleganza e pulizia del codice, visto che il metodo viene richiamato solo una volta all'interno del ciclo, se dovessi usarlo più volte ovviamente sarebbe da pazzi riscrivere tutto .

    Non ho capito però se hai delle limitazioni anche su come effettuare il controllo: io consigliavo di usare il confronto carattere per carattere considerando la stringa letta e non il numero per vedere l'uguaglianza dei due numeri.

    Se non puoi fare nemmeno questo e devi fare il confronto solo con gli operatori allora devi fare un ciclo interno in cui confronti cifra per cifra, visto che per ora se la cifra delle unità è diversa chiedi subito un altro numero.
    Inoltre se differenza è uguale a 0 non ha senso fare

    somma = somma + differenza;

    devi aggiungere modBase altrimenti somma rimane sempre uguale.Inoltre sempre dentro quell' if devi anche incrementare il contatore delle cifre uguali.
    Prova a sistemare un po' il tutto, poi chiedi pure se ci sono altri dubbi

    Allora per quanto riguardo l'espressione
    codice:
    somma = somma + differenza
    hai completamente ragione. Per quanto riguarda la trasformazione in caratteri, c'avevo pensato anche io ( e mi fa veramente piacere leggere la tua risposta), ma non avendo a disposizione funzioni come integer.parseInt() avevo abbandonato l'idea(anche se substring si può utilizzare). Più che altro il problema veniva la somma delle due cifre, una volta prese come caratteri.

    Non so se può essere d'aiuto, ma per quanto riguarda le stringhe queste sono le funzioni fino ad ora affrontate:

    substring
    concat
    equals
    equalsIgnoreCase
    indexOf
    length
    lastindexOf
    toLowerCase
    charAt
    toUpperCase
    compareTo
    replace
    substring(inizio, fine)
    trim

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ti basta la penultima funzione scritta: substring(inizio, fine).
    In pratica dopo aver letto il numero inserito da tastiera hai bisogno di fare un ciclo in cui controlli cifra per cifra l'uguaglianza o meno della cifra esatta con quella del numero tentato.
    Per prendere una singola cifra se stai ciclando con un contatore chiamato i basta eseguire l'istruzione:

    codice:
    String cifra=numeroInserito.substring(i,i+1);
    Questo nel caso in cui numeroInserito sia una stringa ovviamente.
    Dopo per riconvertire la stringa in numero (per trovare la somma delle cifre esatte se la cifra è uguale a quella del numero da indovinare) basta eseguire quest'altra istruzione:

    codice:
    somma+=Integer.parseInt(cifra);


    Comunque ho risolto il problema anche usando l'operatore % : non è immediato ma si può fare

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.