Algorithmes : Procédures et Fonctions en AP
Algorithmes : Procédures et Fonctions en AP
Début
est31 ←EstUnMoisDeTrenteEtUnJours(mois)
est30 ←EstUnMoisDeTrenteJours(mois)
Exercice VII : Cet exercice permet de compléter les procédures et fonctions de l’exercice Si (est31 = 1) alors
précédent Résultat 31
1- Créer une fonction qui permet de dire si un mois a 30 jours ou non. Cette fonction Sinon
renverra 1 si c’est le cas et 0 sinon. Si (est30 = 1) alors
1 2 3 4 5 6 7 8 9 10 11 12 Résultat 30
Sinon
Janv. Fév. Mars Avril Mai Juin Juil Aout Sept Oct Nov Dec // mois de février
31 28 ou 31 30 31 30 31 31 30 31 30 31 // regarder si bissextile
29 Si (EstUneAnneeBissextile(annee) = 1) alors
Résultat 29
Fonction EstUnMoisDeTrenteJours ( → mois : numérique) : Sinon
numérique Résultat 28
Début Fsi
Si (mois = 4 ou mois = 6 ou mois = 9 ou mois = 11) alors Fsi
Résultat 1 Fsi
Sinon Fin
Résultat 0 5- Ecrire un programme principal permettant à l’utilisateur d’entrer un numéro de mois
Fsi (entre 1 et 12) et une année (entre 1582 et 2003), qui seront ensuite passés en
Fin paramètres à la fonction Nombre_de_jours().
Il faut tester la validité des mois et années.
2- Créer une fonction qui permet de dire si un mois a 31 jours ou non. Cette fonction
renverra 1 si c’est le cas et 0 sinon.
Fonction EstUnMoisDeTrenteEtUnJours ( → mois : numérique) : INTRODUIRE LE TYPE CHAINE DE CARACTERES
numérique
Début Exercice VIII : On désire gérer un tableau contenant une liste de noms. Pour cela, on décide
Si (mois = 1 ou mois = 3 ou mois = 5 ou mois = 7 ou mois de répéter l’affichage d’un menu et l’exécution de la commande choisie par l’utilisateur. Le
= 8 ou mois = 10 ou mois = 12) alors
menu sera de la forme qui suit :
Résultat 1
Sinon Veuillez frapper :
Résultat 0 + la lettre V pour voir la liste
Fsi + La lettre S pour supprimer un nom de la liste
Fin + La lettre A pour ajouter un nom à la liste
3- Créer une fonction qui permet de dire si une année est bissextile ou non. Cette + La lettre pour rechercher si un nom est dans la liste
fonction renverra 1 si c’est le cas et 0 sinon. + La lettre T pour terminer.
Pour qu’une année soit bissextile, il suffit que l’année soit un nombre divisible par 4 et
non divisible par 100, ou alors qu’elle soit divisible par 400. Cette gestion exige d’abord qu’un même nom ne figure pas deux fois dans la liste, ensuite
Fonction EstUneAnneeBissextile ( → annee : numérique) :
numérique
qu’un nouveau nom soit ajouté, au début de la liste, à la fin de la liste, ou après un autre nom,
Début selon le choix de l’utilisateur.
On pourrait écrire un « gros » algorithme monolithique, mais pour que le programme Si Fin alors insérer en place N+1
principal soit le plus simple donc le plus clair possible, on y fera apparaître des appels de Si Après alors
procédures. Les écritures séparées de ces procédures mettront en évidence l’intérêt de Choisir après qui
nouvelles procédures et fonctions qui leur rendront des services identiques. On ne détaillera Si qui existe alors insérer après
pas les algorithmes des diverses procédures tant que le programme ne sera pas entièrement Sinon erreur
organisé.
Voir :
La première étape d’écriture des programmes offrant un menu est toujours très simple, dans le Passer toute la liste en revue avec un Répéter pour
style suivant :
Rechercher :
Tableau Liste [Nmax] : Chaînes de caractères Choisir le nom à rechercher
Variable N : numérique Si ce nom existe alors
Variable choix : caractère Ecrire « Présent »
Sinon
Début Ecrire « Absent »
N←0 On a fait apparaître l’intérêt d’une fonction Existe, d’une procédure Insérer, d’une fonction
Répéter Place donnant la place d’un nom dans la liste et aussi des procédures Erreur et LireNom.
Ecrire « Tapez : » Détaillons les maintenant.
Ecrire « V pour voir la liste »
Ecrire « S pour supprimer un nom de la liste » Procédure Erreur(→Message : chaîne de caractère)
Ecrire « A pour ajouter un nom au début de la liste » Début
Ecrire « Action impossible car », Message
Ecrire « R pour rechercher si un nom est dans la liste » Fin
Ecrire « T pour terminer »
Procédure LireNom (↔Nom : chaîne de caractères, → Question : chaîne
Lire choix de caractères)
Si Choix = ‘V’ alors Voir(T,N) Fsi Début
Ecrire Question
Si Choix = ‘S’ alors Supprimer (T,N) Fsi Lire Nom
Si Choix = ‘R’ alors Recherche (T,N) Fsi Fin
Si Choix = ‘A’ alors Ajouter (T,N) Fsi
Jusqu’à Choix = ‘T’ Procédure Insérer (↔tableau T[Nmax] : Chaînes de caractères, ↔N :
Fin numérique, → Qui : Chaîne de caractère, → Endroit : numérique)
On remarque qu’il n’est pas nécessaire dans la lecture de Choix que la réponse soit correcte Variable i : numérique
Début
(V, S, R, A ou T) car une autre réponse ne provoque l’exécution d’aucune procédure et la // faire éventuellement un trou pour loger le nouveau nom
boucle répéter fait afficher de nouveau le menu et effectuer une nouvelle lecture de la variable Répéter pour i = N en descendant jusqu’à Endroit faire
Choix. T[i+1] ← T[i] // boucle à faire absolument en descendant
FinPour
T[Endroit] ← Qui
Commençons par bâtir le cadre des procédures : N ← N + 1
Supprimer : Fin
Choisir le nom à supprimer
Si ce nom existe alors le supprimer Fonction Place (→tableau T[Nmax] : Chaîne de caractère, → N :
Sinon fournir un message d’erreur numérique, → Qui : chaîne de caractère) : numérique
Variable i : numérique
Début
Ajouter : // le résultats sera zéro si l’élément n’est pas trouvé
Choisir le nom à ajouter T[N+1] ← Qui // on utilise la méthode sentinelle
Si ce nom existe i ← 1
Alors Tant que T[i] ≠ Qui faire
fournir un message d’erreur i ← i + 1
FinTantque
Sinon Si i > N alors i ← 0 Fsi
Choisir Début, Fin, Après Résultat i
Si Début alors insérer en place 1 Fin
Erreur(« Ce nom n’est pas dans la liste »)
Fonction Existe (→ tableau T[Nmax] : Chaîne de caractère, ↔ N : Fsi
numérique, → Qui : Chaîne de caractère): numérique Fin
Début
Si Place (T, N, Qui) ≠ 0 alors Existe ← 1 Procédure Voir (→ tableau T[Nmax] : Chaîne de caractère, → N :
Sinon numérique)
Existe ← 0 Variable i : numérique
Fsi Début
Fin Ecrire « Liste des noms »
Répéter pour i = 1 à N faire
Procédure Ajouter (↔tableau T[Nmax] : Chaîne de caractère, ↔ N : Ecrire T[i]
numérique) FinPour
Variables Qui, Après : Chaînes de caractères Fin
Variable Mode : caractère
Début Exercice IX (Exercice Complémentaire) : Calcul de l’impôt sur le revenu
LireNom (Qui, « Qui voulez vous ajouter ?) Remarque : Pour les besoins de l’exercice, certains calculs ont été simplifiés.
Si Existe (T, N, Qui) = 1 alors
Erreur (« ce nom existe déjà)
Sinon Dans cet exercice, nous cherchons à simuler le calcul de l’impôt sur le revenu d’une famille
Répéter ayant des revenus salariés. Cette famille est caractérisée par le nombre d’adultes et le nombre
Ecrire « Début, Fin, ou après un autre (D,F,A) ?» d’enfants à charge. Les autres données prises en compte sont le salaire et les abattements.
Lire Mode Pour cela, on définit les fonctions ou procédures suivantes :
Jusqu’à (Mode = ‘D’ ou Mode = ‘F’ ou Mode = ‘A’
Si Mode = ‘D’ alors Insérer (T, N, Qui, 1) Fsi
Si Mode = ‘F’ alors Insérer (T, N, Qui, N+1) Fsi
1- Fonction qui calcule le revenu imposable RI
Si Mode = ‘A’ alors Pour cela, vous devez :
LireNom(Après, « Après Qui ? ») - Déduire du salaire 10 % pour frais professionnel (cet abattement est limité à un
Si Existe(T, N, Après) = 1 alors plafond de 77460F),
Insérer (T, N, Qui, Place(T, N, Après) - Ensuite déduire un abattement de 20 % (limité à un plafond de 141400F) pour
Sinon
Erreur (« Nom inconnu ») obtenir le revenu imposable.
Fsi 2- Fonction qui calcule le nombre de parts N qui est différent suivant qu’il s’agit d’une
Fsi famille à un seul adulte ou d’une famille ayant plus de deux enfants à charge. Pour un
Fsi adulte élevant seul ses enfants, les enfants comptent comme une part. Pour un couple
Fin
marié (adulte = 2) les deux premiers enfants comptent pour ½ part et au delà un enfant
Procédure rechercher (→tableau T[Nmax] : Chaîne de caractère, → N :
compte une part comme pour une personne seule.
numérique)
Variable Qui : chaîne de caractère Les deux fonctions précédentes servent à déterminer le quotient familial : QF = RI / N. Ce
Début quotient sert à déterminer la tranche d’imposition appropriée, de façon à appliquer la formule
LireNom(Qui, « Qui recherchez vous ? ») générale de calcul, qui est du type :
Si Existe(T, N, Qui) = 1 alors
Ecrire « Présent dans la liste » I = RI * Ti – Ki * N avec Ti et Ki donnés dans le tableau suivant.
Sinon
Ecrire « Inconnu dans la liste » Barème d’imposition pour la déclaration des revenus 1998
Fsi
Fin
Tranche Ti Abattement Ki
Procédure Supprimer ( ↔ tableau T[Nmax] : Chaîne de caractère, ↔ N : QF ≤ 26100 0 0
numérique) 26100 < QF ≤ 51340 0,105 2740,50
Variables Qui : Chaîne de caractères 51340 < QF ≤ 90370 0,24 9671,40
Variable i : numérique
Début 90370 < QF ≤ 146320 0,33 17804,70
LireNom(Qui, « Qui voulez vous supprimer ? ») 146320 < QF ≤ 238080 0,43 32436,70
Si Existe (T, N, Qui) = 1 alors 238080 < QF ≤ 293600 0,48 44340,70
N ← N – 1
Répéter pour i = Place (T, N, Qui) jusqu’à N faire QF > 293600 0,54 61956,70
T[i] ← T[i+1] 3- Procédure qui initialise un tableau (à deux dimensions) contenant le barème de
FinPour l’impôt
Sinon
4- Dans le programme principal, les données sont lues pour calculer le quotient
familial. Il faut ensuite rechercher la tranche correspondant au barème puis on calcule
l’impôt suivant la formule décrite ci-dessus.
PROGRAM PIMPOT ;
Var Revenu, Impot : real ;
Adulte, Enfant, i: integer ;
Bareme : ARRAY[1..7, 1..4] of real ;
QF : real ;
PROCEDURE LIRE_BAREME ;
Var i, j : integer ;
BEGIN
FOR i := 1 TO 7 DO
FOR j := 1 TO 4 DO
BEGIN
Writeln('Entrer la valeur se trouvant en ligne ', i, ' et en colonne ', j);
READLN(Bareme[i,j]) ;
END;
END ;
{Remarque sur la structure du tableau : la première colonne contient la
borne inférieure, la deuxième la borne supérieure, la troisième Ti et la
quatrième Ki }
(* programme principal *)
BEGIN
LIRE_BAREME ;
writeln(' Entrez le nombre d''adultes et d''enfants : ');
READLN(Adulte, Enfant) ;
WRITELN('Entrez le revenu de la famille : ');
READLN(Revenu) ;
QF := REVENU_IMPOSABLE / PARTS(Adulte, Enfant);
i := 1 ;
WHILE (QF > Bareme[i,2]) DO
i := i + 1 ;
Impot := Bareme[i,3] * REVENU_IMPOSABLE ;
Impot := Impot - Bareme[i,4] * PARTS(Adulte, Enfant);
WRITELN('IMPOT = ', Impot) ;
READLN;
END.