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

<?php
/*
CLAUDIO CARDINALE 4AI
dato un file con i campi cognome, nome, data di nascita, sesso, comune di nascita
calcolare codice fiscale
*/

//acquisizione dati
$f = @fopen(dirname(__FILE__)."/dati", "r") or die("errore nell'apertura del file\n");
list($cognome, $nome, $data, $sesso, $comune) = explode("-", fgets($f));
$comune = str_replace("\n", "", $comune);
fclose($f);

$cod = "";
$cod .= calcola_cognome($cognome);
$cod .= calcola_nome($nome);
$cod .= calcola_data_e_sesso($data, $sesso);
$cod .= calcola_comune($comune);
$cod .= calcola_controllo($cod);

print "codice fiscale : ".$cod."\n";

//calcolo del cognome
function calcola_cognome($cognome){
	$cognome = strtoupper($cognome);
	$cognome = str_replace(" ", "", $cognome);
	$vocali = array();
	$str = "";
	
	for($i=0; $i<strlen($cognome) && strlen($str)<3; $i++)
		if(vocale($cognome[$i]))
			$vocali[] = $cognome[$i];
		else
			$str .= $cognome[$i];
	
	if(strlen($str)<3)
		for($i = 0; $i<count($vocali) && strlen($str)<3; $i++)
			$str .= $vocali[$i];
	
	if(strlen($str)<3)
		while(strlen($str)<3)
			$str .= "X";
	
	return $str;
}

//calcolo del nome
function calcola_nome($nome){
	$nome = strtoupper($nome);
	$nome = str_replace(" ", "", $nome);
	$consonanti = array();
	$vocali = array();
	$str = "";
	
	for($i=0; $i<strlen($nome); $i++)
		if(vocale($nome[$i]))
			$vocali[] = $nome[$i];
		else
			$consonanti[] = $nome[$i];
	if(count($consonanti)>=4)
		$str = $consonanti[0].$consonanti[2].$consonanti[3];
	else
		for($i = 0; $i<3 && $i<count($consonanti); $i++)
			$str .= $consonanti[$i];
	
	if(strlen($str)<3)
		for($i = 0; $i<count($vocali) && strlen($str)<3; $i++)
			$str .= $vocali[$i];
	
	if(strlen($str)<3)
		while(strlen($str)<3)
			$str .= "X";
	
	return $str;
}

//calcolo della data di nascita e del sesso
function calcola_data_e_sesso ($data, $sesso){
	$data = explode("/", $data);
	$sesso = strtoupper($sesso);
	$str = "";
	
	//anno
	$str .= $data[2][2].$data[2][3];
	
	//mese
	$str .= mese($data[1]);
	
	//giorno e sesso
	if($sesso=="F")
		$str .= ($data[0]+40);
	else
		$str .= $data[0];
	
	return $str;
}

//calcolo del codice del comune
function calcola_comune($comune){
	$comune = strtoupper($comune);
	$f = @fopen(dirname(__FILE__)."/comuni", "r") or die("errore nell'apertura del file comuni\n");;
	
	fgets($f);
	$flag = 0;
	while(!$flag && ($str=fgets($f))!=""){
		$str = explode(";", $str);
		if(trim($str[0]) ==  "\"".trim($comune)."\"")
			$flag = 1;
	}
	
	fclose($f);
	
	if($flag)
		return substr(trim($str[2]), 1, -1);
	else
		return "ERRR";
}

//calcolo del carattere di controllo
function calcola_controllo($cod){
	//inizializzazioni
	$caratteri_p = array();
	$caratteri_d = array();
	$somma_p = 0;
	$somma_d = 0;
	$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);
	$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);
	
	//divisione caratteri pari/dispari
	for($i=0; $i<15; $i++)
		if($i%2)
			$caratteri_p[] = $cod[$i];
		else
			$caratteri_d[] = $cod[$i];
	
	//conversioni
	for($i=0; $i<count($caratteri_p); $i++)
		$somma_p += converti($caratteri_p[$i], $valori_p);
	
	for($i=0; $i<count($caratteri_d); $i++)
		$somma_d += converti($caratteri_d[$i], $valori_d);
	$somma = $somma_p+$somma_d;
	
	//ritorno
	return chr(65+$somma%26);
}

//controllo se è una vocale
function vocale($lettera){
	$lettera = strtoupper($lettera);
	if($lettera == "A" || $lettera == "E" || $lettera == "I" || $lettera == "O" || $lettera == "U")
		return true;
	return false;
}

//ritorno il valore letterale del mese
function mese($mese){
	$lettere = array("A", "B", "C", "D", "E", "H", "L", "M", "P", "R", "S", "T");
	return $lettere[$mese-1];
}

//conversione dei caratteri in base a dei valori passati come parametro
function converti($val, $valori){
	$val_v= $val;
	$val = strtoupper($val);
	ord($val);
	if(!is_numeric($val))
		$val = 10+ord($val)-65;
	
	return $valori[$val];
}
?>

torna



Copyright © 2004-2024 thecsea.it (Claudio Cardinale - [email protected])! Tutti i diritti riservati. - contattaci