Newsgroup: it.comp.lang.delphi
Titolo: funziona ma in modo errato

Ciao... ho fatto alcune prove e a dir la verità la routine funziona ma
sbagliava il calcolo dei primi 6 caratteri...lo modificata e funziona in
modo corretto...anche se bisogna mettere un controllo sui parametri passati
in modo da controllare che non siano null...
P.s. se vi serve il file DBF con i codici di tutti i comuni d'Italia
...ditemelo
Ciao
Function GetCodiceFiscale(const nome,cognome:string;const
nascita:Tdate;const sesso,comune:string):string;
const vocali:set of char=['A','E','I','O','U'];
      mesi:string='ABCDEHLMPRST';
      CRCN:array[1..10 ]of byte=(1,0,5,7,9,13,15,17,19,21);
      CRCL:array[1..26 ]of
byte=(1,0,5,7,9,13,15,17,19,21,2,4,18,20,11,3,6,8,12,14,16,10,22,25,24,23);
var
    a,m,d:word;
    somma,c,z,k,x,y,w:integer;
    x1,y1,z1,k1: Array of String;
    s,L,Nom,Cog:String;
begin
SetLength(x1,15);
SetLength(y1,15);
SetLength(z1,15);
SetLength(k1,15);
Result := '';
z := 0;
k := 0;
x := 0;
y := 0;
 Nom:=UpperCase(Trim(Nome));
 while Pos(#32,Nom) <> 0 do
   Delete(Nom,Pos(#32,Nom),1);
 Cog:=UpperCase(Trim(Cognome));
 while Pos(#32,Cog) <> 0 do
   Delete(Cog,Pos(#32,Cog),1);
For w := 1 to Length(Nom) do
 begin
  L := Copy(Nom,w,1);
  IF L[1] in['A'..'Z'] then
    begin
     IF (not(L[1] in vocali)) Then
       begin
        Inc(z,1);
        x1[z] := L;
       end
     Else
       begin
        Inc(k,1);
        y1[k] := L;
       end;
    end;
 End;
For w := 1 to Length(Cog) do
 begin
  L := Copy(Cog,w,1);
  IF L[1] in['A'..'Z'] then
    begin
     IF (not(L[1] in vocali)) Then
       begin
        Inc(x,1);
        z1[x] := L;
       end
     Else
       begin
        Inc(y,1);
        k1[y] := L;
       end;
    end;
 end;
Nom := '';
Cog := '';
IF x >= 3 Then
  Cog := z1[1] + z1[2] + z1[3];
IF x = 2 Then
  Cog := z1[1] + z1[2] + k1[1];
IF (x = 1) and (y >= 2) Then
  Cog := z1[1] + k1[1] + k1[2];
IF (x = 1) and (y = 1) Then
  Cog := z1[1] + k1[1] + 'X';
IF (x = 0) and (y = 2) Then
  Cog := x1[1] + k1[2] + 'X';
IF z >= 4 Then
  Nom := x1[1] + x1[3] + x1[4];
IF z = 3 Then
  Nom := x1[1] + x1[2] + x1[3];
IF z = 2 Then
  Nom := x1[1] + x1[2] + y1[1];
IF (z = 1) and (k >= 2) Then
  Nom := x1[1] + y1[1] + y1[2];
IF (z = 1) and (k = 1) Then
  Nom := x1[1] + y1[1] + 'X';
IF (z = 0) and (k = 2) Then
  Nom := y1[1] + y1[2] + 'X';
Result := Cog + Nom;
DecodeDate(nascita,a,m,d);
IF sesso = 'F' then inc(d,40);
s := IntToStr(d);
IF Length(s) = 1 then s := '0' + s;
result := result + copy(IntToStr(a),3,2) + mesi[m] + s + comune;
// del carattere di controllo
somma := 0;
for c:=1 to length(result) do
  IF not (odd(c)) then
   begin
    IF result[c] in['A'..'Z'] then Inc(somma,Ord(result[c]) - 65)
     Else Inc(somma, Ord(result[c]) - 48)
   end
  Else
   IF result[c] in['A'..'Z'] then Inc(somma, CRCL[Ord(result[c]) - 64])
    Else Inc(somma, CRCN[Ord(result[c]) - 47]);
result := result + Chr(65 +(somma mod 26));
end;


Mai pensato di scrivere qualche rebus per la Settimana Enigmistica? :=)
Prova a dare nomi più significativi alle variabili, cerca di rendere il
tutto più leggibile.
Se hai modificato questo codice nel modo in cui penso io... sono contento di
non doverlo mantenere io !
Scherzi a parte, guarda che c'è un problema enorme in quel codice.
Ed il problema è che non si capisce al volo.
E questo rende tutto molto più problematico.
Se vuoi un consiglio, cerca di scrivere codice più chiaro.
Io stesso non so aiutarti perché non ho idea di cosa stai cercando di fare.
Sto creando un pò di codice per vedere se è quello che vuoi fare.
Ciao !
Andrea


Non so tu, ma se ripenso la codice che scrivevo 20 anni orsono mi
metto le mani nei capelli, col tempo e l'esperienza e' migliorato.
Adesso credo di scrivere buon codice ma certo non grazie agli insulti
e le ironie degli altri. Sono atteggiamenti come i tuoi che tengono
lontane tante persone dai gruppi di discussione.
Massimo.
-- 
"Ciao Rex, che cavolo di situazione eh? Due dentro, due fuori, puo' succedere di tutto!"


Non so tu, ma se ripenso la codice che scrivevo 20 anni orsono mi



Vedi, ci possono essere diversi approcci di fronte a qualcuno che
posta del codice non esattamente allo stato dell'arte, uno e' quello
di darci un'occhiata, accorgersi che e' un caos e decidere di avere
altro di piu' importante da fare e lasciare perdere, un altro quello
di cercare di far capire che alcune (o molte) cose non vanno, che non
si chiamano le variabili a1, a2, pippo e zippo che ci vuole piu'
logica e la rava e la fava e un altro ancora quello di iniziare un
pistolotto dicendo che non si fa cosi', che fa schifo, che io l'avrei
scritto molto meglio, che io sono piu' bravo, continuiamo a
programmare cosi' che va bene, eccetera.
Probabilmente si e' trattato solo di un malinteso dovuto a
un'eccessiva enfasi in quello che hai scritto e al solito problema
della difficolta' di rendere le sfumature con lo scritto, fatto e' che
l'impressione che ho avuto e' stata del terzo tipo (pistolotto).
Comunque, per quanto mi riguarda, nessun problema. :)
Poi che l'autore non ti abbia risposto non mi stupisce piu' di tanto:
quando mai qualcuno in questo NG risponde se non le solite 10 persone?
Per gli altri it.comp.lang.delphi e' null'altro che un help-desk.
Ma questo e' un altro discorso...
Ciao,
