Cours recueil d’exemples PHP, tutoriel & guide de travaux pratiques en pdf.
Exercice d’application – IMPOTS
Le problème
On se propose d’écrire un programme permettant de calculer l’impôt d’un contribuable. On se place dans le cas simplifié d’un contribuable n’ayant que son seul salaire à déclarer :
• on calcule le nombre de parts du salarié nbParts=nbEnfants/2 +1 s’il n’est pas marié, nbEnfants/2+2 s’il est marié, où nbEnfants est son nombre d’enfants. • on calcule son revenu imposable R=0.72*S où S est son salaire annuel • on calcule son coefficient familial Q=R/N on calcule son impôt I d’après les données suivantes
12620.0 0 0 13190 0.05 631 15640 0.1 1290.5 24740 0.15 2072.5 31810 0.2 3309.5 39970 0.25 4900 48360 0.3 6898.5 55790 0.35 9316.5 92970 0.4 12106 127860 0.45 16754.5 151250 0.50 23147.5 172040 0.55 30710 195000 0.60 39312 0 0.65 49062 Chaque ligne a 3 champs. Pour calculer l’impôt I, on recherche la première ligne où QF<=champ1. Par exemple, si QF=30000 on trouvera la ligne
24740 0.15 2072.5
L’impôt I est alors égal à 0.15*R – 2072.5*nbParts. Si QF est tel que la relation QF<=champ1 n’est jamais vérifiée, alors ce sont les coefficients de la dernière ligne qui sont utilisés. Ici :
0 0.65 49062 ce qui donne l’impôt I=0.65*R – 49062*nbParts. 2.2 Ve r si on ave c table au x
<? // définition des constantes $DATA= »data.txt »; $RESULTATS= »résultats.txt »; $limites=array(12620,13190,15640,24740,31810,39970,48360,55790,92970,127860,151250,172040,19 5000); $coeffR=array(« 0″, »0,05″, »0,1″, »0,15″, »0,2″, »0,25″, »0,3″, »0,35″, »0,4″, »0,45″, »0,5″, »0,55″, »0 ,6″, »0,65 »); $coeffN=array(« 0″, »631″, »1290,5″, »272,5″, »3309,5″, »4900″, »6898,5″, »9316,5″, »12106″, »16754,5″ , »23147,5″, »30710″, »39312″, »49062″); // lecture des données $data=@fopen($DATA, »r »); if(! $data){ print « Impossible d’ouvrir en lecture le fichier des données [$DATA]\n »; exit; }
// ouverture fichier des résultats $résultats=@fopen($RESULTATS, »w »); if(! $résultats){
print « Impossible de créer le fichier des résultats [$RESULTATS]\n »; exit;
} // on exploite la ligne courante du fichier des données while($ligne=fgets($data,100)){
// on enlève l’éventuelle marque de fin de ligne $ligne=cutNewLineChar($ligne); // on récupère les 3 champs marié:enfants:salaire qui forment $ligne list($marié,$enfants,$salaire)=explode(« , »,$ligne);
// on calcule l’impôt $impôt=calculImpots($marié,$enfants,$salaire,$limites,$coeffR,$coeffN); // on inscrit le résultat fputs($résultats, »$marié:$enfants:$salaire:$impôt\n »); // donnée suivante }
// while
// on ferme les fichiers fclose($data); fclose($résultats);
// fin exit;
// ————————————————————————-
function cutNewLinechar($ligne){ // on supprime la marque de fin de ligne de $ligne si elle existe $L=strlen($ligne); // longueur ligne while(substr($ligne,$L-1,1)== »\n » or substr($ligne,$L-1,1)== »\r »){ $ligne=substr($ligne,0,$L-1); $L–; } // fin return($ligne); }
//cutNewLineChar
// ————————————————————————-
function calculImpots($marié,$enfants,$salaire,$limites,$coeffR,$coeffN){
// $marié : oui, non
// $enfants : nombre d’enfants
// $salaire : salaire annuel
// $limites, $coeffR, $coeffN : les tableaux des données permettant le calcul de l’impôt
// nombre de parts $marié=strToLower($marié); if($marié== »oui ») $nbParts=$enfants/2+2; else $nbParts=$enfants/2+1; // une 1/2 part de plus si au moins 3 enfants if($enfants>=3) $nbParts+= »0,5″;
// revenu imposable $revenuImposable= »0,72″*$salaire;
// quotient familial $quotient=$revenuImposable/$nbParts;
// est mis à la fin du tableau limites pour arrêter la boucle qui suit array_push($limites,$quotient); print « [$marié,$enfants,$salaire,$nbParts,$revenuImposable,$quotient]\n »;
// calcul de l’impôt $i=0; while($quotient>$limites[$i]) $i++; print « [$i,$coeffR[$i],$coeffN[$i]]\n »;
// du fait qu’on a placé $quotient à la fin du tableau $limites, la boucle précédente
// ne peut déborder du tableau $limites // maintenant on peut calculer l’impôt return floor($revenuImposable*$coeffR[$i]-$nbParts*$coeffN[$i]);
}
//calculImpots ?> Le fichier des données data.txt :
oui,2,200000 non,2,200000 oui,3,200000 non,3,200000 oui,5,50000 non,0,3000000