Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20

Discussione: aiuto problema java

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2015
    Messaggi
    49

    aiuto problema java

    Mi è stata assegnato questo compito: Dato un' array di record aventi i seguenti campi(cognome,nome,classe,residenza,data di nascita,indirizzo,telefono,codice fiscale).Ordinare l'array codice fiscale e una volta ordinato e dato in input.Bisogna effettuare la ricerca binaria e comunicare se è presente o meno.Io ho realizzato questo codice ma non capisco perchè non funziona se inserisco piu' codici fiscali,ma funziona solo con 1.Vi prego aiutatemi non so come fare.
    codice:
    
    
    
    
    
    
    
    
    
    
    
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package anagrafe;
    
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Scanner;
    
    
    /**
     *
     * @author user
     */
    public class Anagrafe {
    
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
       
    
    
    
    
    
    
    
    
    /**
     *
     * @author user
     */
    
    
    class Persona {
    
    
        String Codicefiscale;
        String Cognome;
        String Nome;
        int Classe;
        String Datadinascita;
        String Indirizzo;
        String Residenza;
        String Telefono;
    
    
    }
    
    
    
    
        /**
         * @param args the command line arguments
         */
        
        
          Scanner leggi = new Scanner(System.in);
            int n = 0;
            String Codicefiscale;
            String Cognome;
            String Nome;
            int Classe;
            String Datadinascita;
            String Indirizzo;
            String Residenza;
            String Telefono;
            int i;
            
            boolean x = false;
            do {
                System.out.println("Inserisci il numero di elementi dell'array");
                n = leggi.nextInt();
            } while (n <= 0);
            leggi.nextLine();
            Persona Arranag[] = new Persona[n];
            for (i = 0; i < n; i++) {
                Arranag[i] = new Persona();
            }
            i=0;
            while (i < n) {
    
    
                do {
                    System.out.println("Inserisci il codice fiscale");
                    Codicefiscale = leggi.nextLine();
                } while (Codicefiscale.compareTo("") == 0);
    
    
                do {
                    System.out.println("Inserisci il cognome");
                    Cognome = leggi.nextLine();
                } while (Cognome.compareTo("") == 0);
    
    
                do {
                    System.out.println("Inserisci il nome");
                    Nome = leggi.nextLine();
                } while (Nome.compareTo("") == 0);
    
    
                do {
                    System.out.println("Inserisci la classe");
                    Classe = leggi.nextInt();
                } while (Classe <= 0);
                leggi.nextLine();  
                do {
                    x = false;
                    System.out.println("Inserisci la data di nascita");
                    Datadinascita = leggi.nextLine();                
                    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/mm/yyyy");
                    try {
                        dateFormat.parse(Datadinascita);
                    } catch (ParseException e) {
                        x = true;
                    }
                } while (x == true);
    
    
                do {
                    System.out.println("Inserisci l'indirizzo");
                    Indirizzo = leggi.nextLine();
                } while (Indirizzo.compareTo("") == 0);
    
    
                do {
                    System.out.println("Inserisci la residenza");
                    Residenza = leggi.nextLine();
                } while (Residenza.compareTo("") == 0);
    
    
                do {
                    System.out.println("Inserisci il numero di telfono");
                    Telefono = leggi.nextLine();
                } while (Telefono.compareTo("") == 0);
                Persona temp = new Persona();
                temp.Classe = Classe;
                temp.Codicefiscale = Codicefiscale;
                temp.Cognome = Cognome;
                temp.Telefono = Telefono;
                temp.Datadinascita = Datadinascita;
                temp.Nome = Nome;
                temp.Residenza = Residenza;
                temp.Indirizzo = Indirizzo;
    
    
                boolean stop = false;
                for (int j = 0; j < i && stop == false; j++) {
                    System.out.println(Arranag[j].Codicefiscale+" "+j);
                    if (temp.Codicefiscale.compareTo(Arranag[j].Codicefiscale) == 0) {
                        stop = true;
                    } else {
                        if (temp.Codicefiscale.compareTo(Arranag[j].Codicefiscale) < 0) {
                            Persona scambio = temp;
                            temp = Arranag[j];
                            Arranag[j] = scambio;
                        }
                    }
                }
                if (stop == false) {
                    Arranag[i] = temp;
                    i++;
                    //incremento solo se i codice fiscale inserito non era già presente
                } else {
                    System.out.println("Codice fisclae già inserito, usare un altro codice.");
                    stop = true;
                }
            }
            
            do {
                System.out.println("Inserisci il codice fiscale da ricercare");
                Codicefiscale = leggi.nextLine();
            } while (Codicefiscale.compareTo("") == 0);
            boolean trovato = false;
            int media = 0;
            int inf = 0;
            int sup = n - 1;
            while (inf <= sup && trovato == false) {
                media = (inf + sup) / 2;
                if (Arranag[media].Codicefiscale.compareTo(Codicefiscale) == 0) {
                    trovato = true;
                } else {
                    if (Arranag[media].Codicefiscale.compareTo(Codicefiscale) < 0) {
                        sup = media - 1;
                    } else {
                        inf = media + 1;
                    }
                }
    
    
            }
            if (trovato == true) {
        int j;
                System.out.println("codice fiscale trovato"+Arranag[j].Codicefiscale);
            } else {
                System.out.println("codice fiscale non trovato");
            }
    
    
        }
    
    
    } }
        
    }
    Ultima modifica di LeleFT; 21-10-2015 a 18:16 Motivo: Aggiunti i tag CODE

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Potresti usare il tag CODE? Altrimenti è illeggibile...

    Cerca anche di usare le convenzioni Java per i nomi di classi, metodi e variabili. Per esempio:

    No Codicefiscale ma codiceFiscale, no Datadinascita ma dataDiNascita ecc. L'iniziale va maiuscola solo nei nomi delle classi.

    Parentesi,
    Indirizzo.compareTo("") == 0 lo puoi riscrivere indirizzo.isEmpty() e in if (variabile == false) è sufficiente if (!variabile)
    Ultima modifica di Alex'87; 21-10-2015 a 18:01
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120
    Oltre quello che ti ha già giustamente detto Alex aggiungerei un paio di cose:
    -cerca di evitare di mischiare i metodi di Scanner che leggono token (next(), nextInt(), etc.) con con nextLine(). I primi leggono solamente il token richiesto lasciando il resto nel buffer (ad esempio se inserisci un numero verrà letto solo il numero e il \n (a capo) rimarrà nel buffer) , questo significa che alla successiva lettura oltre al nuovo input ci sarà ancora qualche carattere della lettura precedente. Se ci fai caso, nel tuo programma, dopo alcuni inserimenti vedrai stampare alcuni caratteri e degli "a capo" dove non ci dovrebbero essere.
    Quindi o ripulisci il buffer dopo ogni lettura fatta con il nextInt() oppure usi sempre nextLine(), il quale legge tutti i caratteri della linea lasciando pulito il buffer, e converti il numero letto come stringa in un intero con Integer.ParseInt(miaStringaCheRappresentaUnNumero).

    -non creare un unico main gigantesco, cerca di suddividere i compiti che il tuo programma deve effettuare in classi/metodi
    Ad esempio devi prendere in input un array di persone quindi crea un metodo/classe che si occupi solo di quello; devi esegure una ricerca binaria su un array di persone quindi crea un metoso/classe che si coocupi di eseguire la ricerca.
    Scrivendo tutto nel main il tutto diventa molto complicato da leggere, modificare e debuggare.

    - questo pezzo di codice potrebbe darti problemi nel caso il numero di elementi di array sia elevato:
    codice:
     media = (inf + sup) / 2;
    tenendo presente che inf e sup sono due variabili di tipo int, potrebbe darsi che per un array molto grande la somma tra i due diventi più grande di quella che un int può contenere , generando così un overflow. Ma se sup e inf sono contenuti in un int allora il risultato della loro somma divisa per due è certamente contenibile in un int.
    Si può aggirare il problema lasciando andare in overflow la somma e correggendo la divisione per 2 usando uno schift binario con zero-extension; ovvero
    codice:
    media = (inf + sup)  >>> 1;

    Detto questo l'errore del tuo programma si trova nella ricerca binaria:
    devi trovare l'indice medio della porzione di array che stai esaminando, se l'elemento che si trova nell'indice medio è maggiore dell'elemento cercato allora devi considerare la porzione di array da inf a medio -1, se invece e maggiore devi considerare la porzione da mid a inf.
    Tu fai esattamente l'opposto

    Inoltre ti sarebbe comodo salvare l'indice dell'array della persona trovata (o non trovata) durante la ricerca binaria per poterla stampare alla fine del programma.
    Tu invece qui fai:
    codice:
                             if (trovato == true) {
                                 int j;
                                 System.out.println("codice fiscale trovato" + Arranag[j].Codicefiscale);
                             } else {
                                 System.out.println("codice fiscale non trovato");
                             }
    ma quel j lo usi senza inizializzarlo.
    Ultima modifica di Nikopol; 22-10-2015 a 02:27
    La Guida Galattica è infallibile.
    È la realtà, spesso, ad essere inesatta.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2015
    Messaggi
    49
    Scusami io sono alla prime armi ma non ho capito cosa devo aggiustare.Potresti farmi vedere cosa devo aggiungere o togliere

  5. #5
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120
    non ho capito cosa devo aggiustare.
    Te l'ho detto dove è l'errore ma ho scritto due volte maggiore invece che maggiore ... minore.
    Nella ricerca binaria devi controllare se l'elemento cercato è uguale, maggiore o minore dell'elemento in posizione media.
    Quindi:
    se è uguale allora hai trovato l'elemento e termini
    se è maggiore allora l'elemento, se è presente, allora si trova a destra di media, ovvero da nella porzione di array che va da media+1 a sup (inf =media+1)
    se è minore allora l'elemento si trova a sinistra, ovvero da inf a media - 1 (sup = media - 1).
    Tu invece di controllare se l'elemento cercato è >, <, = a quello di indice media, fai il controllo opposto ovvero controlli se l'elemento in posizione media è <, >, = a quello cercato; quindi se il compareTo restituisce > 0 allora l'elemento si trova a sinistra e se restituisce < 0 allora si trova destra.
    Dunque ti basta o invertire la comparazione (elementoCercato.compareTo(elementoMedio) ...) oppure invertire la condizione che usi per entrare nei rami dell'if-else
    La Guida Galattica è infallibile.
    È la realtà, spesso, ad essere inesatta.

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2015
    Messaggi
    49
    ma non ho capito come si scrive in java

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2015
    Messaggi
    49
    ho realizzato questo codice ma non capisco perchè non riesco a fare l'ordinamento tra i codici fiscali per esempio se un codice fiscale inizia con a verrà prima di uno che inizia con c.Però non riesco a farlo.

  8. #8
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120
    L'inserimento ordinato funziona. Come ti ho già detto, il problema è nella ricerca binaria.
    Non devi comparare il codice fiscale dell'elemento in posizione media con il codice fiscale che cerchi.
    Devi comparare il codice fiscale che cerchi con quello dell'elemento in poszione media.
    La Guida Galattica è infallibile.
    È la realtà, spesso, ad essere inesatta.

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2015
    Messaggi
    49
    ho provato così ma non funziona


    boolean trovato = false;
    int media = 0;
    int inf = 0;
    int sup = n - 1;
    while (inf <= sup && trovato == false) {
    media = (inf + sup) / 2;
    if (Codicefiscale.compareTo(Arranag[media].Codicefiscale) == 0) {
    trovato = true;
    } else {
    if (Codicefiscale.compareTo(Arranag[media].Codicefiscale) < 0) {
    sup = media + 1;
    } else {
    inf = media - 1;
    }
    }

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,281
    Quote Originariamente inviata da angelo98 Visualizza il messaggio
    if (Codicefiscale.compareTo(Arranag[media].Codicefiscale) < 0) {
    sup = media + 1;
    } else {
    inf = media - 1;
    }
    Prova a ragionare di più su questa parte.

    codice:
    inf                     sup
     |                       |
     |...........m...........|

    Se il valore cercato è inferiore a quello dell'elemento al punto "medio" ('m' nello schemino) ... secondo te il nuovo sup quale deve essere?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.