Newsgroup: it.comp.lang.delphi
Titolo: Calcolo codice fiscale - Aggiornamenti

Ho cercato con Google e ho trovato l'algoritmo che qualcuno aveva prodotto
per il calcolo del codice fiscale.
Prima di tutto ringrazio l'autore, il cui nome mi sfugge al momento.
Secondariamente vorrei segnalare che il codice non funziona in caso di
cognomi e nomi doppi (esempio: Cognome "De Po" e nome "Luigi Ivo"). Niente
di complicato, per chi vuole usare l'algoritmo basta inserire anche lo
spazio nella lista delle vocali.
Grazie ancora a tutti.

spazio nella lista delle vocali.
????
Le vocali sono vocali, nessuno spazio incluso.
Un corretto algoritmo di calcolo del codice fiscale DEVE ignorare gli
spazi bianchi.
-- 
Andrea Laforgia
www.geocities.com/andrealaforgia
"640kb of memory should be enough for anyone." -- Bill Gates.

"Gabriele Boccone" ha scritto nel messaggio

Toh... abbiamo sei vocali ora... ;-))
Lo spazio non deve essere preso in considerazione: metterlo nell'elenco
delle vocali è un errore, indipendentemente dal risultato, che comunque in
alcuni casi potrebbe dare errore.
La cosa migliore per correggere l'algoritmo, sempre che funzioni così com'è,
è quella di eliminare tutti gli spazi intermedi ed i caratteri tipo
apostrofi come ad esempio in D'Elia (in sostanza elimini dal nome e dal
cognome tutti quei caratteri che non sono ne vocali ne consonanti) ed
effettuare il calcolo su quello che ti rimane.
Ciao.
Gianluca.

 effettuare il calcolo su quello che ti rimane.
In pratica l'algoritmo legge ogni carattere dal cognome e poi dal nome, se
e' una consonante lo mette nella lista delle consonanti, se e' una vocale lo
mette nella lista delle vocali, e altrimenti lo scarta. In base al numero di
consonanti trovate, poi compone il codice.
Unico caso che non ho voluto considerare (mi sembra semplicemente
impossibile): se il nome o il cognome sono costituiti da un solo carattere,
l'algoritmo si rifiuta di generare il codice.

questo IF.
Invece, il metodo che ho usato io, nello scrivere la funzione di
calcolo del codice fiscale, è stato il seguente:
function FiltraStringa(S: String; SetCar: TSetCaratteri): String;
var
  I: Integer;
  T: String;
begin
  T := '';
  for I := 1 to Length(S) do
  begin
    if S[I] in SetCar then
      T := T + S[I];
  end;
  Result := T;
end;
...
...
  Cognome := FiltraStringa(UpperCase(Trim(Cognome)), ['A'..'Z']);
  Nome := FiltraStringa(UpperCase(Trim(Nome)), ['A'..'Z']);
  ConsonantiCognome := FiltraStringa(Cognome, InsiemeConsonanti);
  ConsonantiNome := FiltraStringa(Nome, InsiemeConsonanti);
  VocaliCognome := FiltraStringa(Cognome, InsiemeVocali);
  VocaliNome := FiltraStringa(Nome, InsiemeVocali);
  CodiceCognome := Copy(ConsonantiCognome + VocaliCognome + 'XX', 
                        1, 3);
  CodiceNome := ConsonantiNome + VocaliNome + 'XX';
  if (Length(ConsonantiNome) > 3) then
    Delete(CodiceNome, 2, 1);
  CodiceNome := Copy(CodiceNome, 1, 3);
...


calcolo del codice fiscale, č stato il seguente:
<...>
Dimenticavo la cosa piů importante: i due insiemi (consonanti/vocali)
sono stati costruiti cosě:
type TSetCaratteri = set of Char;
const 
  InsiemeVocali: TSetCaratteri = ['A','E','I','O','U'];
  InsiemeConsonanti: TSetCaratteri = ['A'..'Z'] - InsiemeVocali;


|"Andrea Laforgia"
| <...>
| Dimenticavo la cosa più importante: i due insiemi (consonanti/vocali)
| sono stati costruiti così:
|
| type TSetCaratteri = set of Char;
|
| const
|   InsiemeVocali: TSetCaratteri = ['A','E','I','O','U'];
|   InsiemeConsonanti: TSetCaratteri = ['A'..'Z'] - InsiemeVocali;
|
| --
| Andrea Laforgia
Ciao, colevo solo ricordarvi che prima di scrivere un Algoritmo che calcoli
il CF bisognerebbe prima di tutto sapere come funziona la sua generazione!
Io me la sono studiata e il progarammino (con la funzione per il calcolo del
FC) l'ho fatto e mi sono studiato un po' come funzionava ... e prima di
tutto vorrei ricordarvi che il FiltraStringa( ... ) come lo usate voi è
sbagliato in quanto nella generazione della parte del nome bisogna applicare
delle differenti operazioni che per il calcolo della stringa per il cognome!
Ora non ricordo bene, ma nel nome andavano prese le prime 3 consonanti,
mentre nel cognome andavano prese (se c'erano) le 1a, 3a e 4a consonante! Se
erano di meno bisognava aggiungerci una 'X' .. ora sta a voi "studiare" ;-)
Ciao
..::[ Panz ]::..

erano di meno bisognava aggiungerci una 'X' .. ora sta a voi "studiare" ;-)
A me sembra che la funzione FiltraStringa funzioni benissimo (il mio
programma, a meno di variazioni da parte del Ministero, calcola
perfettamente i codici fiscali).  Se tu avessi osservato il codice piů
attentamente, ti saresti accorto che il mio sistema preleva i
caratteri esattamente nell'ordine voluto.


 sta a voi "studiare" ;-) 
Cognome
1a, 2a e 3a consonante. Se ha meno di 3 consonanti si prendono le vocali. 
Es:
Costante -> CST
Caso -> CSA
Se ha meno di tre lettere si mettono tante X quante ne servono per arrivare 
a tre lettere. Es:
Fo -> FOX
Nome:
1a, 3a e 4a consonante. Se ha 3 consonanti si prendono le prime tre 
consonanti, se ha meno di 3 consonanti si prendono le vocali. Es:
Costanza -> CTN
Carlo -> CRL
Mario -> MRA
Se ha meno di tre lettere si mettono tante X quante ne servono per arrivare 
a tre lettere. Es:
Jo -> JOX
-- 
Ciao,
   Stefano
Una volta che avete conosciuto il volo, camminerete sulla Terra guardando 
il cielo, perché là siete stati e là desiderate tornare (Leonardo da Vinci)

a tre lettere. Es:
  CodiceNome := ConsonantiNome + VocaliNome + 'XX';
  if (Length(ConsonantiNome) > 3) then Delete(CodiceNome, 2, 1);
  CodiceNome := Copy(CodiceNome, 1, 3);
-- 


   CodiceNome := Copy(CodiceNome, 1, 3);
8<----
Interessante... Io sono partito da un'altra ipotesi:
- Se devo fare tutto da zero, ci metto molto tempo. Ovviamente non sara'
immune agli errori.
- Se ne trovo uno gia' fatto, lo faccio girare, verifico tutti i casi
estremi, e correggo gli errori ci metto meno tempo.
Quindi ho preferito la seconda ipotesi, ho trovato il codice gia' scritto, e
l'ho corretto. Il codice, pur con qualche imperfezione, era molto leggibile
anche se faragginoso (sembrava una traduzione letterale dal COBOL al
pascal...), quinidi ho deciso che gli daro' una ripulita, senza cambiarlo
troppo, appena avro' tempo, e lo rispediro' al NG. Se qualcuno avra' lo
stesso mio problema, potra' risolverlo come ho fatto io...
Il codice che hai scritto puo' essere interessante, piu' elegante di quello
che ho usato io... ma non centra il problema principale: e' una funzione
cosi' comunemente utilizzata che non voglio predere tempo a riscriverla.
Delphi e i NG, secondo me, dovrebbero servire a non reinventare la ruota
ogni volta che voglio andare in bicicletta. Invece c'e' chi pensa che "se e'
stato difficile per me, lo deve essere anche per gli altri".
Perche' proprio il codice fiscale? Perche' le altre cose che mi potevano
servire si trovano facilmente in rete, e quando posso le cerco e le trovo
"gia' fatte", e non mi interessa se le ha fatte un americano, un tedesco o
un indiano... Invece questo e' molto diffuso, ma solo in Italia, quindi devo
restringere il mio campo di ricerca.
Ovviamente, quando avro' finito di utilizzarlo, faro' in modo che anche
altre persone possano utilizzarlo a loro volta...

altre persone possano utilizzarlo a loro volta...
Plaudo per questo bel modo di pensare "open".
Grazie :)
--
Morde. 
morde[at]programmer[.]net

ogni volta che voglio andare in bicicletta. 
Infatti, se tu avessi chiesto la routine di calcolo del codice
fiscale, io, tra i tanti, ti avrei risposto proponendoti il mio
codice, testato e funzionante.


 codice, testato e funzionante.
Non mi riferisco a te direttamente, ma poco tempo fa qualcuno aveva detto
esattamente il contrario, all'incirca cosi': "non ti scrivo la funzione per
il calcolo del codice fiscale, perche' ci ho messo del tempo a svilupparla,
e poi e' bene imparare a fare le cose da solo."
E poi, prima di chiedere nel NG guardo sempre su Google se qualcuno ha gia
risposto alla domanda... Se non avessi trovato il codice, avrei chiesto qui
(come faccio di solito)
Ti ringrazio comunque, per il momento applico la prima regola del
programmatore...

[ ... cut ... ]
| Se tu avessi osservato il codice più
| attentamente, ti saresti accorto che il mio sistema preleva i
| caratteri esattamente nell'ordine voluto.
|
| Andrea Laforgia
hai proprio ragione, ma avevo letto solo l'ultimo thread (quello con la
specifica di Consonanti e
Vocali) mentre avevo dato una "banale" lettura al post precedente ...
Mea Culpa ... scusate ...  : - (
..::[ Panz ]::..