Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-01-2011, 22:40   #1
Cruain
Member
 
L'Avatar di Cruain
 
Iscritto dal: Feb 2009
Messaggi: 53
[Java] Cognome in codice fiscale,dove sbaglio?

Ciao a tutti!
E' da un paio d'ore, che sto sbattendo la testa su questa porzione di codice

Codice:
protected String estraiConsonanti(String cognome){
 do{
                for (int i=0;i<cognome.length();i++){
                    consExt=cognome.charAt(i);
                if(consExt!='A'&&consExt!='E'&&consExt!='I'&&consExt!='O'&&consExt!='U'){
                    consonantiEstratte=consonantiEstratte+consExt;
                    if(consonantiEstratte.length()==3){
                       continua=false;
                    }


                    }
                    }
 }while(continua);
    return consonantiEstratte;
}
In pratica, con il for scorre tutta la parola (lettera per lettera) contenuta in temp (di tipo String, mettiamo il caso che sia il cognome ="Allegato") passata come parametro.
Nella condizione in cui la lunghezza di temp è uguale a 3, dovrebbe modificare la condizione del do-while e pertanto interrompere l'esecuzione delle istruzioni contenute nel do-while.

Come posso risolvere? A me pare fatto bene, ma evidentemente non è così

Grazie mille!
__________________
HP Compaq 6710b-Intel Core 2 Duo @2,00Ghz-2Gb Ram-Intel X3100 358Mb-HDD Hitachi 120Gb

Ti piace la tecnologia? Smart Tech - Technology is our passion!

Ultima modifica di Cruain : 07-01-2011 alle 22:42.
Cruain è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 01:21   #2
AngeL)
Senior Member
 
L'Avatar di AngeL)
 
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
Codice:
protected String estraiConsonanti(String cognome){
 do{
                for (int i=0;i<cognome.length();i++){
                    consExt=cognome.charAt(i);
                if(consExt!='A'&&consExt!='E'&&consExt!='I'&&consExt!='O'&&consExt!='U'){
                    consonantiEstratte=consonantiEstratte+consExt;
                    if(consonantiEstratte.length()==3){
                       continua=false;
                    }


                    }
                    }
 }while(continua);
    return consonantiEstratte;
}
Ad occhio vedo un problemino qui: (Ricorda che 'A' =/= 'a' !)
Codice:
if(consExt!='A'&&consExt!='E'&&consExt!='I'&&consExt!='O'&&consExt!='U'&&consExt!='a'&&consExt!='e'&&consExt!='i'&&consExt!='o'&&consExt!='u')
E poi i cicli sono un po' incasinati...
Codice:
for(int i = 0; i < cognome.length(); i++) {
    if(cognome.charAt(i) != 'A' && /* . . . . */)
        consonantiEstratte += cognome.charAt(i);
    if(consonantiEstratte.length() == 3)
        break;
}
Oppure, sacrificando un po' di leggibilità
Codice:
for(int i = 0; i < cognome.length() && consonantiEstratte.length() < 3; i++)
    if(cognome.charAt(i) != 'A' && /* . . . . */)
        consonantiEstratte += cognome.charAt(i);
p.s. forse ho scritto qualche castroneria, vuoi per l'ora, vuoi perchè non ricordo bene bene la sintassi del java. Nel caso, chiedo perdono
AngeL) è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 10:21   #3
Cruain
Member
 
L'Avatar di Cruain
 
Iscritto dal: Feb 2009
Messaggi: 53
Ti ringrazio infinitamente per avermi risposto! Soprattutto a quell'orario... Per quanto riguarda:

Quote:
Originariamente inviato da AngeL) Guarda i messaggi
Ad occhio vedo un problemino qui: (Ricorda che 'A' =/= 'a' !)
Codice:
if(consExt!='A'&&consExt!='E'&&consExt!='I'&&consExt!='O'&&consExt!='U'&&consExt!='a'&&consExt!='e'&&consExt!='i'&&consExt!='o'&&consExt!='u')
In un altro metodo viene trasformato con un toUpperCase(); , quindi direi che vada bene.

Ora sistemo come mi hai detto te. Ti faccio sapere.
Grazie mille ancora!
__________________
HP Compaq 6710b-Intel Core 2 Duo @2,00Ghz-2Gb Ram-Intel X3100 358Mb-HDD Hitachi 120Gb

Ti piace la tecnologia? Smart Tech - Technology is our passion!
Cruain è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 11:15   #4
Cruain
Member
 
L'Avatar di Cruain
 
Iscritto dal: Feb 2009
Messaggi: 53
Ho risolto così:
Codice:
protected String estraiConsonanti(String cognome){

            for (int i=0;i<cognome.length();i++){
                    consExt=cognome.charAt(i);
                     if(consExt!='A'&&consExt!='E'&&consExt!='I'&&consExt!='O'&&consExt!='U'){
                    consonantiEstratte=consonantiEstratte+consExt;
                    if(consonantiEstratte.length()==3){
                       i=cognome.length()+1;


}
       }
            
 
    }
            return consonantiEstratte;
    }
Nel caso in cui le consonanti estratte sono 3, allora i assume una lunghezza più grande di 1 rispetto alla "lunghezza" del cognome. Questa condizione è sufficiente a rendere falsa la condizione nel for, è così si interrompe restituendomi solo le 3 consonanti cercate.
__________________
HP Compaq 6710b-Intel Core 2 Duo @2,00Ghz-2Gb Ram-Intel X3100 358Mb-HDD Hitachi 120Gb

Ti piace la tecnologia? Smart Tech - Technology is our passion!
Cruain è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 12:29   #5
AngeL)
Senior Member
 
L'Avatar di AngeL)
 
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
Quote:
Originariamente inviato da Cruain Guarda i messaggi
Nel caso in cui le consonanti estratte sono 3, allora i assume una lunghezza più grande di 1 rispetto alla "lunghezza" del cognome. Questa condizione è sufficiente a rendere falsa la condizione nel for, è così si interrompe restituendomi solo le 3 consonanti cercate.
Se proprio vuoi fare così, io renderei il codice più leggibile ed elegante con
Codice:
if(consonantiEstratte.length()==3)
    break;
AngeL) è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 12:41   #6
Cruain
Member
 
L'Avatar di Cruain
 
Iscritto dal: Feb 2009
Messaggi: 53
Quote:
Originariamente inviato da AngeL) Guarda i messaggi
Se proprio vuoi fare così, io renderei il codice più leggibile ed elegante con
Codice:
if(consonantiEstratte.length()==3)
    break;
Funzioni a meraviglia! Non sapevo si potesse usare il break, dentro all'if

Grazie mille per la risposta e buon Appetito!
__________________
HP Compaq 6710b-Intel Core 2 Duo @2,00Ghz-2Gb Ram-Intel X3100 358Mb-HDD Hitachi 120Gb

Ti piace la tecnologia? Smart Tech - Technology is our passion!
Cruain è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 13:34   #7
AngeL)
Senior Member
 
L'Avatar di AngeL)
 
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
Quote:
Originariamente inviato da Cruain Guarda i messaggi
Funzioni a meraviglia! Non sapevo si potesse usare il break, dentro all'if

Grazie mille per la risposta e buon Appetito!
Glad I could help!

p.s. è pericoloso augurarmi buon appetito: per "contorno" ho mangiato 1kg di funghi
AngeL) è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 13:36   #8
Cruain
Member
 
L'Avatar di Cruain
 
Iscritto dal: Feb 2009
Messaggi: 53
IO devo ancora mangiare... Ho una fame pazzesca !!
__________________
HP Compaq 6710b-Intel Core 2 Duo @2,00Ghz-2Gb Ram-Intel X3100 358Mb-HDD Hitachi 120Gb

Ti piace la tecnologia? Smart Tech - Technology is our passion!
Cruain è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 16:36   #9
jappilas
Senior Member
 
L'Avatar di jappilas
 
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4747
Quote:
Nel caso in cui le consonanti estratte sono 3, allora i assume una lunghezza più grande di 1 rispetto alla "lunghezza" del cognome. Questa condizione è sufficiente a rendere falsa la condizione nel for, è così si interrompe restituendomi solo le 3 consonanti cercate.
Quote:
Funzioni a meraviglia! Non sapevo si potesse usare il break, dentro all'if

mi spiace dirtelo, ma nel tuo codice hai commesso svariati errori , alcuni contingenti, altri concettuali
- la tua funzione modifica e ritorna un oggetto stringa non definito localmente - ma se si suppone che consonantiEstratte sia un attributo della classe, non ha senso ritornarlo (siccome lo stai già modificando, eventuali altri metodi di classe ne vedono il nuovo valore)
- un if produce una diramazione dipendente da valori di stato o di input che complica il programma nonchè il suo diagramma di flusso (*), quindi si usa per condizioni note solo a runtime ma non a priori, e si evita il più possibile per controlli impliciti - tu lo usi (complicandoti le cose e rendendo meno chiaro il codice - e meno male che è un caso semplice) per verificare a runtime una condizione che in realtà già conosci: per il codice fiscale si devono prendere esattamente 3 lettere per il nome (e 3 per il cognome), quindi il loop di estrazione va fatto non sulla lunghezza della stringa - e senza uscirne con un break - ma semplicemente da 1 a 3
- e d' altra parte per nomi / cognomi brevi o comunque con poche consonanti mi risulta si usino anche le vocali (tu invece non gestisci tale caso, altro errore) ...
considera "Aldo -> LDA": la prima lettera è una vocale, la scarti e passi alla seconda; la seconda è una consonante, la prendi e passi alla terza; la terza è di nuovo una consonante, la prendi e passi alla quarta; la quarta è una vocale, la scarti e passi alla quinta - ma la quinta non esiste quindi devi tornare alla prima, e considerare le vocali invece delle consonanti; ora, la prima è una vocale, la prendi e hai finito
un algoritmo generico dovrebbe poter essere implementato usando l' indice riferito alla stringa di ingresso, incrementato e poi "riavvolto" una volta finite le consonanti, e una flag (oppure l' indice sempre incrementato, usato come i%cognome.length(), e un check i>cognome.length() al posto della flag, ma è meno leggibile)

* azzarderei un altro suggerimento: quando scrivi del codice, prova a immaginare che qualcuno arrivi e ti chieda di mappare tutti i possibili stati e transizioni da cui il tuo programma è costituito, e di dimostrargli formalmente che tutti gli stati vengano correttamente attraversati in base alle condizioni di lavoro - quasi certamente inizierai a scrivere codice di qualità migliore in cui capirai da solo cosa non va, perchè tu per primo vorrai semplificare al massimo ...
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name
Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish
Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate

Ultima modifica di jappilas : 08-01-2011 alle 16:59.
jappilas è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 16:47   #10
Cruain
Member
 
L'Avatar di Cruain
 
Iscritto dal: Feb 2009
Messaggi: 53
Quote:
Originariamente inviato da jappilas Guarda i messaggi
- un if produce una diramazione dipendente da valori di stato o di input che complica il programma nonchè il suo diagramma di flusso (**), quindi
si usa per condizioni note solo a runtime ma non a priori, e si evita il più possibile per controlli impliciti - tu lo usi (complicandoti le cose e rendendo meno chiaro il codice - e meno male che è un caso semplice) per verificare a runtime una condizione che in realtà già conosci
Forse è meglio uno switch?


Quote:
Originariamente inviato da jappilas Guarda i messaggi
- e d' altra parte per nomi / cognomi brevi o comunque con poche consonanti mi risulta si usino anche le vocali (tu invece non gestisci tale caso, altro errore) ... considera "Aldo -> LDA":
la prima lettera è una vocale, la scarti e passi alla seconda
la seconda è una consonante, la prendi e passi alla terza
la terza è di nuovo una consonante, la prendi e passi alla quarta
la quarta è una vocale, la scarti e passi alla quinta - ma la quinta non esiste quindi devi tornare alla prima, e considerare le vocali invece delle consonanti
ora, la prima è una vocale, la prendi e hai finito
un algoritmo generico dovrebbe poter essere implementato usando l' indice riferito alla stringa di ingresso, incrementato e poi "riavvolto" una volta finite le consonanti, e una flag (oppure l' indice sempre incrementato, usato come i%cognome.length(), e un check i>cognome.length() al posto della flag, ma è meno leggibile)
Questa parte di codice che ho scritto sul forum, è solo una parte di codice della classe che mi genera il cognome. I cognomi brevi e quelli con meno con meno di 3 consonanti, vengono gestiti da un'altra parte

Grazie per i consigli jappilas !
__________________
HP Compaq 6710b-Intel Core 2 Duo @2,00Ghz-2Gb Ram-Intel X3100 358Mb-HDD Hitachi 120Gb

Ti piace la tecnologia? Smart Tech - Technology is our passion!
Cruain è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 18:08   #11
jappilas
Senior Member
 
L'Avatar di jappilas
 
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4747
io avrei fatto un semplice loop
Codice:
        for (int i=0; i<3; i++)
        {           
                codiceParziale += estraiProssimaConsonante(cognome);
        }
esterno, piu' una helper function che esamini il cognome lettera per lettera o che ritorni la successiva consonante, ad esempio (riciclando il controllo originale)
Codice:
    private char estraiProssimaConsonante(String cognome)
    {
        char lettera;
        do
        {
            lettera = cognome.charAt(indice);
            indice++;
        }       
        while (lettera =='A' || lettera == 'E' || lettera =='I' || lettera =='O' || lettera =='U');
        return lettera;
    }

questo approccio anche se un po' verboso, ha in realta' il vantaggio di rendere più gestibile il codice, spezzattandolo in "blocchi di complessità" individuali , e sopratutto di renderlo maggiormente testabile (se io volessi controllare il comportamento del mio programma tramite testcase di Junit in questo modo potrei esaminare sia il ciclo esterno sia le funzioni di estrazione - e l' eventuale gestione dei cognomi corti con ricerca delle vocali, essere aggiunta in secondo tempo partendo da codice scheletro già funzionante, aggiungendo una helper function e poco altro - nell' altro modo, no...
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name
Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish
Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate

Ultima modifica di jappilas : 09-01-2011 alle 13:20.
jappilas è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 18:18   #12
Cruain
Member
 
L'Avatar di Cruain
 
Iscritto dal: Feb 2009
Messaggi: 53
Grazie mille per i consigli jappilas! Magari, se riesco pechè non ho molto tempo,provo a darci un'occhitina applicando i tuoi suggerimenti.
Grazie ancora e buona serata!
__________________
HP Compaq 6710b-Intel Core 2 Duo @2,00Ghz-2Gb Ram-Intel X3100 358Mb-HDD Hitachi 120Gb

Ti piace la tecnologia? Smart Tech - Technology is our passion!
Cruain è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 18:25   #13
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
inb4IndexOutOfBoundsException
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 21:49   #14
jappilas
Senior Member
 
L'Avatar di jappilas
 
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4747
di nulla a presto
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
inb4IndexOutOfBoundsException
mi sembrava chiaro che quel codice fosse solo una "traccia" non da usare così com'è, ma necessitasse comunque di accorgimenti a cui accennavo al post 9 ...
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name
Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish
Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate

Ultima modifica di jappilas : 08-01-2011 alle 21:53.
jappilas è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 23:56   #15
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
ammetto di non aver letto nient'altro che il post 11
tuccio` è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
La Cina ha lanciato nuovamente lo spazio...
Blue Origin potrebbe realizzare il lande...
Artemis II: il prossimo Wet Dress Rehear...
Il nuovo HONOR 600 sta arrivando e avr&a...
La crisi delle memorie non coinvolger&ag...
Windows domina su Steam, ma molti utenti...
Per non incorrere in nuovi aumenti delle...
Cubi Z AI 8M visto da vicino, un mini-PC...
Datacenter nello Spazio, affascinante ma...
Social e minori, Butti apre al dibattito...
Tutte le offerte Amazon del weekend, sol...
Amazon spinge sull'usato garantito: 10% ...
TikTok rischia una maxi-multa in Europa:...
Bose su Amazon: QuietComfort SC over ear...
Scope elettriche super accessoriate in o...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:53.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v