Primo codice, utilizzo dell'ereditarietà e polimorfismo

di il
46 risposte

Primo codice, utilizzo dell'ereditarietà e polimorfismo

Ciao ragazzi, sono nuovo e di un saluto a tutti...
Sto sviluppando il mio primo applicativo java, ho dei dubbi?
1 da un input controllare se ho un numero o un alfanumerico
2 in base al numero capire che tipo di dato è, se double, float long ecc...
Grazie, un saluto a tutti

PS. Sto provando a prepararmi da solo per SCJP ci sono simulatori di test, chi l'ha già superato in cosa consiste?

46 Risposte

  • Re: Primo codice, utilizzo dell'ereditarietà e polimorfismo

    Ciao Michele,

    Secondo me ti conviene assegnare il valore scritto dall'utente ad una variabile di tipo String in modo da evitare qualsiasi tipo di problema. Dopo per capire se è stato inserito un numero intero, un numero decimale o un alfanumerico prova a fare in questo modo.
    
    String input = new String("input");
    double number;
    int intero;
    try {
           number = Double.parseDouble(input.trim());
           intero = (int) number;
           if(number != intero) {
               intero =-1;
           }
    } catch(ParseException e) {
           number = -1;
    }
    
    if(number!=-1) {
          if(intero!=-1) {
                  //è un numero intero
          } else {
                 //è un numero decimale
          }
    } else {
         //non è un numero
    }  
    
  • Re: Primo codice, utilizzo dell'ereditarietà e polimorfismo

    francescoposa ha scritto:


    
    String input = new String("input");
    double number;
    int intero;
    try {
           number = Double.parseDouble(input.trim());
           intero = (int) number;
           if(number != intero) {
               intero =-1;
           }
    } catch(ParseException e) {
           number = -1;
    }
    
    if(number!=-1) {
          if(intero!=-1) {
                  //è un numero intero
          } else {
                 //è un numero decimale
          }
    } else {
         //non è un numero
    }  
    
    In questo codice c'è ben poco che ha senso .....
  • Re: Primo codice, utilizzo dell'ereditarietà e polimorfismo

    Perché? Ho solo sbagliato l'eccezione da prendere in considerazione.. Ho scritto il codice senza compilarlo. Quello corretto è questo.
    
    Scanner sc = new Scanner(System.in);
    String input = sc.nextLine();
    double number;
    int intero;
    
    try {
    	number = Double.parseDouble(input.trim());
    	intero = (int) number;
    	if(number != intero) {
    		intero =-1;
    	}
    } catch(NumberFormatException e) {
    	number = -1;
    	intero = -1;
    }
    
    if(number!=-1) {
    	if(intero!=-1) {
                    //è un numero intero
    		System.out.println("Intero");
    	} else {
    	         //è un numero decimale
    	         System.out.println("Decimale");
    	}
    } else {
                //non è un numero
    	    System.out.println("Stringa");
    }  
    
  • Re: Primo codice, utilizzo dell'ereditarietà e polimorfismo

    Perfetto è un codice semplice quando te lo dicono gli altri
    comunque sto imparando e spero bene
    vorrei con un'unica classe vedere di fare il colpaccio
    capire se sono bits 01 un intero o un numero con virgola
    e di conseguenza
    convertire da binario a intero o con virgola
    o viceversa da numero intero o con virgola in binario

    dopodicché devo passare da un tipo ad un altro vedendo come si modifica il binario

    perché quando si fa il casting da short a byte per esempio 8 bits vengono tagliati ed esempio
    11111111 che é 255 in short
    diventa 00000001 in byte perchè si fa il complemento a due e diventa -1 in byte

    Ed il tutto mi serve per fare pratica e magari far vedere che ci so fare, e magari magari... lavorare facendo quello che ho sempre amato a quando avevo 10 anni, la programmazione
  • Re: Primo codice, utilizzo dell'ereditarietà e polimorfismo

    Bene sono contento che ti sia servito. Però voglio darti due indicazioni:

    1. Il codice che ho scritto funziona bene per tutti i valori tranne che per -1 (perciò ti consiglio di usare delle variabili booleane per vedere se è intero decimale o stringa)

    2. Per vedere se sono dei bit puoi usare un semplice controllo (se 1 allora, altrimenti se 0 allora, altromenti)

    3. Provaci, se hai problemi, scrivi!
  • Re: Primo codice, utilizzo dell'ereditarietà e polimorfismo

    C'e' un errore concettuale: a meno che tu non decida di trattare SOLO numeri diversi da -1, -1 e' un numero valido!
    Come ti ha fatto correttamente notare @francescoposa, dovresti usare delle variabili booleane!

    Comunque, c'e' un'altra strada (che poi e' quella usata da PHP, Python, ecc, e dai compilatori Java, C, C++, ecc) per sapere se una stringa e un intero o un numero con virgola.

    E cioe' di vedere quali caratteri sono usati nella stringa.

    In pratica:

    si chiamano digit (o cifra) i caratteri 0,1,...9

    digit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9


    ora che cosa e' un intero? Una sequenza di digit eventualmente con un segno davanti

    integer :: = sign? digit+


    dove il segno puo' essere un '+' o un '-'

    sign ::= - | +


    Cosa e' un numero con la virgola? Un numero che contiene un punto decimale. Per semplificare, diciamo che ci deve SEMPRE essere almeno una cifra prima del punto!
    Quindi, anche se in Java '.5' e' valido, per il momento diciamo che sia accettabile SOLO '0.5'.
    Inoltre, scarta anche il caso di numeri con esponente, come '3.14e-3' (puoi sempre aggiungerli dopo)

    real ::= sign? digit+ '.' digit*


    Ed ora, che cosa vuol dire '|' ed i vari '+', '*' e '?' ?

    A | B indica la regola A OPPURE la regola B

    A B indica la regola A seguita dalla regola B

    A? indica che A puo' essere ripetuta 0 o 1 volta

    A* indica che A puo' essere ripetuta 0 o piu' volte (1, 2, 3,...)

    A+ indica che A puo' essere ripetuta 1 o piu' volte (2, 3,... )


    Quello che ho descritto e' la sintassi per dei numeri interi e con virgola

    E l'insieme delle regole si chiama grammatica

    Quindi, per controllare se una stringa e' un numero, devi controllare se la sequenza di caratteri che compongono la stringa soddisfano le regole indicate.

    Ed e' quello che fa Integer.parseInt, e Double.parseDouble (anche se prendono in considerazione molti piu' formati )

    Ora, se sai farlo, bene, se no, non preoccuperti: questo e' un algoritmo abbastanza sofisticato che viene insegnato all'universita' e fa parte del corso che insegna a realizzare i compilatori!

    Ti ho descritto questo algoritmo solo per farti capire che non c'e' nulla di misterioso su come funzionano certe cose, e di cose da imparare ce ne sono decisamente parecchie
  • Re: Primo codice, utilizzo dell'ereditarietà e polimorfismo

    Mocca!!!
    Complimenti!!! e scusami il termine ma una spiegazione così difficile ma allo stesso tempo fatta bene mi fa capire
    1) che amo questa materia
    2) che sono un pivellino
    3) che sei davvero bravo e ti ringrazio x la disponibilità
  • Re: Primo codice, utilizzo dell'ereditarietà e polimorfismo

    Migliorabile ottima spiegazione!
    Comunque avevo specificato il problema del numero -1 e come soluzione avevo proposto l'utilizzo di variabili booleane.
  • Re: Primo codice, utilizzo dell'ereditarietà e polimorfismo

    La cosa spaventosa è perdermi nel codice cambiando idea come il vento...
    Comunque pensavo fosse più semplice, invece è tutt'altro che semplice:
    devo leggere una stringa e analizzarla; capendo se è un numero binario, decimale o esadecimale
    numero con virgola o senza... e poi una volta capito il mio input convertirlo nei formati restanti...

    BELLA ROGNA.... Ma credo che un programmino del genere possa essere un buon biglietto da visita per riuscire ad entrare in un team di programmatori e realizzare software con loro...
  • Re: Primo codice, utilizzo dell'ereditarietà e polimorfismo

    Devo inserire una stringa e poi devo confrontarla con una serie di caratteri;
    vedere se è intero o decimale
    se è positivo o negativo
    e poi vedere se contiene
    cifre esadecimali
    cifre decimali
    cifre binari

    e quindi come risutato farmi dire tutto

    e magari in seguito farò la conversione da nei vari formati

    Ho letto un qualcosa tipo
    String.contain(charsequence); ma devo capire come funziona ...
  • Re: Primo codice, utilizzo dell'ereditarietà e polimorfismo

    Michele Genchi ha scritto:


    Comunque pensavo fosse più semplice, invece è tutt'altro che semplice:
    devo leggere una stringa e analizzarla; capendo se è un numero binario, decimale o esadecimale
    numero con virgola o senza...
    Non è difficilissimo, nel senso che la logica è molto "lineare" e basta analizzare ciascun carattere uno dopo l'altro e tenersi dei "flag" che indicano cosa hai trovato.

    Michele Genchi ha scritto:


    e poi una volta capito il mio input convertirlo nei formati restanti...
    Quali "formati"??

    Michele Genchi ha scritto:


    Ma credo che un programmino del genere possa essere un buon biglietto da visita per riuscire ad entrare in un team di programmatori e realizzare software con loro...
    Per lavoro "vero", serve ben altro che saper riconoscere il contenuto di una stringa. Come esercizio "didattico" invece va ovviamente bene.

    Michele Genchi ha scritto:


    Ho letto un qualcosa tipo
    String.contain(charsequence); ma devo capire come funziona ...
    contains non ti serve affatto per l'analisi della stringa. Nel senso che non è nella stringa in input che devi "cercare" se contiene qualcosa.
  • Re: Primo codice, utilizzo dell'ereditarietà e polimorfismo

    francescoposa ha scritto:


    migliorabile ottima spiegazione!
    Comunque avevo specificato il problema del numero -1 e come soluzione avevo proposto l'utilizzo di variabili booleane.
    Infatti, e' la soluzione corretta!
    Ed hai ragione, mi sono dimenticato di citarti!
  • Re: Primo codice, utilizzo dell'ereditarietà e polimorfismo

    Michele Genchi ha scritto:


    Devo inserire una stringa e poi devo confrontarla con una serie di caratteri;
    vedere se è intero o decimale
    se è positivo o negativo
    e poi vedere se contiene
    cifre esadecimali
    cifre decimali
    cifre binari
    ...
    Non basta!

    Ad esempio:

    100

    e' un numero binario, decimale o esadecimale?

    Nota che:
    1) i numeri decimali possono usare le cifre usate ANCHE nei numeri binari
    2) i numeri esadecimali possono usare le cifre usate ANCHE nei numeri decimali ED ANCHE le cifre usate nei numeri binari!!!!

    Quindi: come fai a distinguere se e' un intero scritto in binario, decimale o esadecimale (e ti mancherebbe pure l'ottale )?

    Altra domanda: dove c'e' scritto che non puoi rappresentare anche un numero con la virgola in binario, decimale o esadecimale (o ottale)?

    Ulteriore domanda: ma perche' limitarsi a binario, decimale o esadecimale (e ottale)?
    Perche' non usare qualunque numero maggiore di 1 come base? Ad esempio 64?

    Il 64 non e' un numero a caso Ti capitera' di usarlo spesso nel tuo lavoro .
    Oppure il 3! Anche questo non e' un numero a caso! Viene usato negli odierni SSD!

    Ma si puo' fare di meglio:
    1) perche' una base sola (2, 8, 10, 16)? Perche' non molte?
    2) perche' solo numeri positivi?

    Mentre il caso 2) non mi risulta usato in pratica, il caso 1) lo usi quotidianamente!
  • Re: Primo codice, utilizzo dell'ereditarietà e polimorfismo

    Allora superiamo l'ostacolo presentato, ovvero se è 100?
    Può essere tanto binario, quanto esadecimale. Giustissimo!!! Ma nelle calcolatrici ho il pulsante bin, DEC ecc, magari nella mia prevedo un pulsante dove possa decidere la base 2,3,8,16,64 o x...
    Una volta che so cosa mi aspetto in ingresso posso:
    1) disabilitare i tasti
    2) controllare carattere x carattere durante l'input
    3) verificare la stringa una volta inserita
Devi accedere o registrarti per scrivere nel forum
46 risposte