logo Thecsea.it



Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License



scolastica » esercizi » quarta superiore » php

Testo dell'esercizio

dato un file con i campi cognome, nome, data di nascita, sesso, comune di nascita
calcolare codice fiscale

mostra soluzione

001<?php
002/*
003CLAUDIO CARDINALE 4AI
004dato un file con i campi cognome, nome, data di nascita, sesso, comune di nascita
005calcolare codice fiscale
006*/
007 
008//acquisizione dati
009$f = @fopen(dirname(__FILE__)."/dati", "r") or die("errore nell'apertura del file\n");
010list($cognome, $nome, $data, $sesso, $comune) = explode("-", fgets($f));
011$comune = str_replace("\n", "", $comune);
012fclose($f);
013 
014$cod = "";
015$cod .= calcola_cognome($cognome);
016$cod .= calcola_nome($nome);
017$cod .= calcola_data_e_sesso($data, $sesso);
018$cod .= calcola_comune($comune);
019$cod .= calcola_controllo($cod);
020 
021print "codice fiscale : ".$cod."\n";
022 
023//calcolo del cognome
024function calcola_cognome($cognome){
025    $cognome = strtoupper($cognome);
026    $cognome = str_replace(" ", "", $cognome);
027    $vocali = array();
028    $str = "";
029     
030    for($i=0; $i<strlen($cognome) && strlen($str)<3; $i++)
031        if(vocale($cognome[$i]))
032            $vocali[] = $cognome[$i];
033        else
034            $str .= $cognome[$i];
035     
036    if(strlen($str)<3)
037        for($i = 0; $i<count($vocali) && strlen($str)<3; $i++)
038            $str .= $vocali[$i];
039     
040    if(strlen($str)<3)
041        while(strlen($str)<3)
042            $str .= "X";
043     
044    return $str;
045}
046 
047//calcolo del nome
048function calcola_nome($nome){
049    $nome = strtoupper($nome);
050    $nome = str_replace(" ", "", $nome);
051    $consonanti = array();
052    $vocali = array();
053    $str = "";
054     
055    for($i=0; $i<strlen($nome); $i++)
056        if(vocale($nome[$i]))
057            $vocali[] = $nome[$i];
058        else
059            $consonanti[] = $nome[$i];
060    if(count($consonanti)>=4)
061        $str = $consonanti[0].$consonanti[2].$consonanti[3];
062    else
063        for($i = 0; $i<3 && $i<count($consonanti); $i++)
064            $str .= $consonanti[$i];
065     
066    if(strlen($str)<3)
067        for($i = 0; $i<count($vocali) && strlen($str)<3; $i++)
068            $str .= $vocali[$i];
069     
070    if(strlen($str)<3)
071        while(strlen($str)<3)
072            $str .= "X";
073     
074    return $str;
075}
076 
077//calcolo della data di nascita e del sesso
078function calcola_data_e_sesso ($data, $sesso){
079    $data = explode("/", $data);
080    $sesso = strtoupper($sesso);
081    $str = "";
082     
083    //anno
084    $str .= $data[2][2].$data[2][3];
085     
086    //mese
087    $str .= mese($data[1]);
088     
089    //giorno e sesso
090    if($sesso=="F")
091        $str .= ($data[0]+40);
092    else
093        $str .= $data[0];
094     
095    return $str;
096}
097 
098//calcolo del codice del comune
099function calcola_comune($comune){
100    $comune = strtoupper($comune);
101    $f = @fopen(dirname(__FILE__)."/comuni", "r") or die("errore nell'apertura del file comuni\n");;
102     
103    fgets($f);
104    $flag = 0;
105    while(!$flag && ($str=fgets($f))!=""){
106        $str = explode(";", $str);
107        if(trim($str[0]) ==  "\"".trim($comune)."\"")
108            $flag = 1;
109    }
110     
111    fclose($f);
112     
113    if($flag)
114        return substr(trim($str[2]), 1, -1);
115    else
116        return "ERRR";
117}
118 
119//calcolo del carattere di controllo
120function calcola_controllo($cod){
121    //inizializzazioni
122    $caratteri_p = array();
123    $caratteri_d = array();
124    $somma_p = 0;
125    $somma_d = 0;
126    $valori_p = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25);
127    $valori_d = array(1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 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);
128     
129    //divisione caratteri pari/dispari
130    for($i=0; $i<15; $i++)
131        if($i%2)
132            $caratteri_p[] = $cod[$i];
133        else
134            $caratteri_d[] = $cod[$i];
135     
136    //conversioni
137    for($i=0; $i<count($caratteri_p); $i++)
138        $somma_p += converti($caratteri_p[$i], $valori_p);
139     
140    for($i=0; $i<count($caratteri_d); $i++)
141        $somma_d += converti($caratteri_d[$i], $valori_d);
142    $somma = $somma_p+$somma_d;
143     
144    //ritorno
145    return chr(65+$somma%26);
146}
147 
148//controllo se è una vocale
149function vocale($lettera){
150    $lettera = strtoupper($lettera);
151    if($lettera == "A" || $lettera == "E" || $lettera == "I" || $lettera == "O" || $lettera == "U")
152        return true;
153    return false;
154}
155 
156//ritorno il valore letterale del mese
157function mese($mese){
158    $lettere = array("A", "B", "C", "D", "E", "H", "L", "M", "P", "R", "S", "T");
159    return $lettere[$mese-1];
160}
161 
162//conversione dei caratteri in base a dei valori passati come parametro
163function converti($val, $valori){
164    $val_v= $val;
165    $val = strtoupper($val);
166    ord($val);
167    if(!is_numeric($val))
168        $val = 10+ord($val)-65;
169     
170    return $valori[$val];
171}
172?>

torna



Copyright © 2004-2025 thecsea.it (Claudio Cardinale - cardi@thecsea.it)! Tutti i diritti riservati. - contattaci