'>

Application exemple - V1 de C sharp

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 (chiffres 2004 pour revenus 2003) :
• 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.
• s'il a au moins trois enfants, il a une demi part de plus
• on calcule son revenu imposable R=0.72*S où S est son salaire annuel
• on calcule son coefficient familial QF=R/nbParts
• on calcule son impôt I. Considérons le tableau suivant :
4262 0 0
8382 0.0683 291.09
14753 0.1914 1322.92
23888 0.2826 2668.39
38868 0.3738 4846.98
47932 0.4262 6883.66
0 0.4809 9505.54
Chaque ligne a 3 champs. Pour calculer l'impôt I, on recherche la première ligne où QF<=champ1. Par exemple, si QF=5000 on
trouvera la ligne
8382 0.0683 291.09
L'impôt I est alors égal à 0.0683*R - 291.09*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.4809 9505.54
ce qui donne l'impôt I=0.4809*R - 9505.54*nbParts.
Le programme C# correspondant est le suivant :
1. using System;
2.
3. namespace Chap1 {
4. class Impots {
5. static void Main(string[] args) {
6. // tableaux de données nécessaires au calcul de l'impôt
7. decimal[] limites = { 4962M, 8382M, 14753M, 23888M, 38868M, 47932M, 0M };
8. decimal[] coeffR = { 0M, 0.068M, 0.191M, 0.283M, 0.374M, 0.426M, 0.481M };
9. decimal[] coeffN = { 0M, 291.09M, 1322.92M, 2668.39M, 4846.98M, 6883.66M, 9505.54M };
10.
11. // on récupère le statut marital
12. bool OK = false;
13. string reponse = null;
14. while (!OK) {
15. Console.Write("Etes-vous marié(e) (O/N) ? ");
16. reponse = Console.ReadLine().Trim().ToLower();
17. if (reponse != "o" && reponse != "n")
18. Console.Error.WriteLine("Réponse incorrecte. Recommencez");
19. else OK = true;
20. }//while
21. bool marie = reponse == "o";
22.
23. // nombre d'enfants
24. OK = false;
25. int nbEnfants = 0;
26. while (!OK) {
27. Console.Write("Nombre d'enfants : ");
28. try {
29. nbEnfants = int.Parse(Console.ReadLine());
30. OK = nbEnfants >= 0;
31. } catch {
32. }// try
33. if (!OK) {
34. Console.WriteLine("Réponse incorrecte. Recommencez");
35. }
36. }// while
37.
38. // salaire
39. OK = false;
40. int salaire = 0;
41. while (!OK) {
42. Console.Write("Salaire annuel : ");
43. try {
44. salaire = int.Parse(Console.ReadLine());
45. OK = salaire >= 0;
46. } catch {
47. }// try
48. if (!OK) {
49. Console.WriteLine("Réponse incorrecte. Recommencez");
50. }
51. }// while
52.
53. // calcul du nombre de parts
54. decimal nbParts;
55. if (marie) nbParts = (decimal)nbEnfants / 2 + 2;
56. else nbParts = (decimal)nbEnfants / 2 + 1;
57. if (nbEnfants >= 3) nbParts += 0.5M;
58.
59. // revenu imposable
60. decimal revenu = 0.72M * salaire;
61.
62. // quotient familial
63. decimal QF = revenu / nbParts;
64.
65. // recherche de la tranche d'impots correspondant à QF
66. int i;
67. int nbTranches = limites.Length;
68. limites[nbTranches - 1] = QF;
69. i = 0;
70. while (QF > limites[i]) i++;
71. // l'impôt
72. int impots = (int)(coeffR[i] * revenu - coeffN[i] * nbParts);
73.
74. // on affiche le résultat
75. Console.WriteLine("Impôt à payer : {0} euros", impots);
76. }
77. }
78.}

• lignes 7-9 : les valeurs numériques sont suffixées par M (Money) pour qu'elles soient de type decimal.
• ligne 16 :
• Console.ReadLine() rend la chaîne C1 tapée au clavier
• C1.Trim() enlève les espaces de début et fin de C1 - rend une chaîne C2
• C2.ToLower() rend la chaîne C3 qui est la chaîne C2 transformée en minuscules.
• ligne 21 : le booléen marie reçoit la valeur true ou false de la relation reponse=="o"
• ligne 29 : la chaîne tapée au clavier est transformée en type int. Si la transformation échoue, une exception est lancée.
• ligne 30 : le booléen OK reçoit la valeur true ou false de la relation nbEnfants>=0
• lignes 55-56 : on ne peut écrire simplement nbEnfants/2. Si nbEnfants était égal à 3, on aurait 3/2, une division entière qui
donnerait 1 et non 1.5. Aussi, écrit-on (decimal)nbEnfants pour rendre réel l'un des opérandes de la division et avoir ainsi
une division entre réels.
Voici des exemples d'exécution :
Etes-vous marié(e) (O/N) ? o
Nombre d'enfants : 2
Salaire annuel : 60000
Impôt à payer : 4282 euros
Etes-vous marié(e) (O/N) ? oui
Réponse incorrecte. Recommencez
Etes-vous marié(e) (O/N) ? o
Nombre d'enfants : trois
Réponse incorrecte. Recommencez
Nombre d'enfants : 3
Salaire annuel : 60000 euros
Réponse incorrecte. Recommencez
Salaire annuel : 60000
Impôt à payer : 2959 euros


Publié par Drupal french Study