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:
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.codice:media = (inf + sup) / 2;
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:
ma quel j lo usi senza inizializzarlo.codice:if (trovato == true) { int j; System.out.println("codice fiscale trovato" + Arranag[j].Codicefiscale); } else { System.out.println("codice fiscale non trovato"); }