Algorithmique/Exercices et solutions
Exercices et quelques solutions
[modifier | modifier le wikicode]Dans un premier temps, par facilité, la numérotation des solutions correspond à celle de la version pdf imprimable de septembre 2015.
Résolution collective d'exercices
[modifier | modifier le wikicode]ATTENTION tous les algorithmes proposés ci-dessous n'ont pas nécessairement été relus ni corrigés, ni par un enseignant ni même parfois par des étudiants ayant un œil assez critique.
Le lecteur DOIT donc considérer qu'il s'agit d'une première version et est invité à apporter des explications et des améliorations lorsque ceci est pertinent.
Il convient en particulier souvent de compléter l'algorithme par une précision des données, des inconnues ou de l'objectif puis de la méthode de résolution avec un schéma ou une (des) phrase(s) d'explication.
Ceci est un recueil de propositions de solutions par des étudiants, pour des étudiants. Ceci n'est intéressant QUE et SI les étudiants font avant la lecture de la solution, un essai personnel, peut-être en groupe, de résolution active.
Ex 4.14
[modifier | modifier le wikicode]heure (entier) \ minutes (entier) - totalSecondes (entier) = heure * 3600 + minutes * 60 + secondes secondes (entier) /
module conversionHMS2secondes() // hms2sec() // autre nom plus court heures : entier minutes : entier secondes : entier totalSecondes : entier totalSecondes <= heures * 3600 + minutes * 60 + secondes fin_module
Ex 4.11 : allureEnKmparHeure()
[modifier | modifier le wikicode]heure (entier) \ min (entier) - allure = heure + min / 60 + sec / 3600 (réel) sec (entier) / vitesse = 1/ allure (réel) module allureEnkmparHeure() heure : entier min : entier sec : entier allure, vitesse : réel allure <= heure + min / 60 + sec / 3600 vitesse <= 1/ allure fin_module
Ex 5.10 : prixTTC()
[modifier | modifier le wikicode]D:- Un prix HTVA - La TVA : 21% du prix HTVA I: Prix TTC module prixTTC() prixHTVA, TVA, prixTTC : réel TVA <- 21 prixTTC <- prixHTVA+(prixHTVA/100*TVA) fin_module
Ex 5.2
[modifier | modifier le wikicode]D: nombre1 (réel) nombre2 (réel) I: moyenne (réel) R: moyenne <--- (nombre1 + nombre2) / 2 algorithme moyenne(nombre1+nombre2 : réels) --->réel retourner (nombre1 +nombre2) / 2 fin algorithme
Ex 5.3
[modifier | modifier le wikicode]Données : * baseTriangle(réel) * hauteurTriangle (réel) Inconnues ou objectif : surfaceTriangle (réel) Résolution : surfaceTriangle <---(baseTriangle * hauteurTriangle) /2 algorithme surfaceTriangle(baseTriangle, hauteurTriangle :réels) --->réel retourner (baseTriangle * hauteurTriangle) / 2 fin algorithme
Ex 6.5
[modifier | modifier le wikicode]algorithme max(nb1, nb2 : réels) -->réel
max: réel
si nb1>nb2alors
max ←nb1
sinon
max ←nb2
fin si
retourner max
fin algorithme
Ex 6.6
[modifier | modifier le wikicode]algorithme salaireNet (salaireBrut, retenue speciale : réels) -->réel
salaireNet:réel
si salaireBrut > 1200 alors
salaireNet ←(salaireBrut – (salaireBrut-1200)*15%)
fin si
fin algorithme
Ex 6.7
[modifier | modifier le wikicode]à discuter et corriger car pas tout à fait correct
algorithme fonctionSyracuse (n:entier) -->réel
f(x) : réel
si n MOD 2 = 0 alors
f(x) ← n/2
sinon
f(x) ← (3n +1)
fin si
retourner f(x)
fin algorithme
j'ai une autre version, maintenant faut savoir si elle est juste ou pas.(hamza, de A322)
algorithme fonctionSyracus (n:entier)-->réel
résultat:réel
si nb1 = pair alors
nb1<--n/2
sinon nb1<--3n+1
fin si
retourner résultat
fin algorithme
Ex 6.8
[modifier | modifier le wikicode]algorithme tarifReduit (droit :booléen)->réel ok ←7 si ok sinon ok ←8 fin si retourner ok
fin algorithme
autre version: par (hamza de A322)
algorithme tarifReduit (tarif:entier)-->boolean
ok--> boolean
ok<--a une tarif réduit
si ok <-- age<18ans alors
ok=vrai
sinon
ok <-- age>18ans alors
ok=faux
fin si
retourner ok
fin algorithme
Ex 6.9
[modifier | modifier le wikicode]algorithme maximumDe3Nombre (nb1,nb2,nb3->entier)->entier
maximum<--entier
si nb1>nb2 alors
max<--nb1
sinon si nb2<nb3 alors
max<--nb3
sinon
max<--nb2
fin si
retourner le maximum
fin algorithme
Ex 6.10
[modifier | modifier le wikicode] algorithme signeNombre( nb:entier)
si (nb = 0) alors
afficher “ Le nombre est nul”
sinon si (nb >0) alors
afficher “ Le nombre est positif”
sinon
afficher “ Le nombre est negatif”
fin si
fin algorithme
autre solution
algorithme signeNombre( nb:entier) => entier
// retourne +1 si positif, -1 si négatif, 0 si nul
resultat : entier
si (nb = 0) alors
résultat ← 0
sinon si (nb >0) alors
résultat ← +1
sinon
résultat ← -1
fin si
retourner résultat
fin algorithme
autre solution
algorithme signeNombre( nb:entier)
// affiche positif, négatif ou nul
resultat : chaine
si (nb = 0) alors
résultat ← "nul"
sinon si (nb >0) alors
résultat ← "positif"
sinon
résultat ← "négatif"
fin si
afficher résultat
fin algorithme
Ex 6.11
[modifier | modifier le wikicode]Énoncé
[modifier | modifier le wikicode]- Écrire une fonction à paramétrage qui détermine la factorielle d'un entier positif
- Se servir de la question 1 pour déterminer la valeur de l'expression n!/p!(n-p)!
Solution
[modifier | modifier le wikicode]Schéma
[modifier | modifier le wikicode]Code
[modifier | modifier le wikicode] algorithme typeTriangle(longeur1, longeur2, longeur3 :réels) → chaine
résultat : chaine
si (longeur1 = longeur2) ET (longeur1 = longeur3) alors
résultat ←”équilateral”
sinon
si (longeur1 = longeur2) OU (longeur2 = longeur3) OU (longeur1 = longeur3) alors
résultat ← ”isocele”
sinon
résultat ← ”scalène"
fin si
fin_si
retourner résultat
fin_algorithme
Ex 6.12
[modifier | modifier le wikicode]Énoncé
[modifier | modifier le wikicode]Dés identiques : Écrire un algorithme qui lance trois dés et indique si on a obtenu 3 dés de valeur identique, 2 ou aucun.
Solution
[modifier | modifier le wikicode]à discuter et corriger car pas tout à fait correct
algorithme tripleDés() → chaîne
hasard1, hasard2, hasard3 : entiers
hasard1 ←hasard(6)
hasard2 ←hasard(6)
hasard3 ←hasard(6)
si (hasard1 = hasard2)ET (hasard1 = hasard3) alors
retourner (" 3 dés identique")
sinon
si (hasard1 = hasard2) OU (hasard1 = hasard3) OU (hasard2 = hasard3) alors
retourner ("2 dés identique")
sinon
retourner ("aucun dés identique")
fin_si
fin_si
fin algorithme
Ex 6.8
[modifier | modifier le wikicode] algorithme tarifReduit (reduction: boolean) -->entier
prix: entier;
ok ←reduction;
si ok alors
prix ←7
sinon
prix ←8
fin_si
retourner prix
fin algorithme
Ex 6.13
[modifier | modifier le wikicode]algorithme gradeEtudiant (moyenne:réel) → chaine
si (moyenne < 50 %) alors
grade ← ”pas reussi”
sinon si ( moyenne < 60%) alors
grade ← ”réussi”
sinon si ( moyenne <70%) alors
grade ← ”satisfaction” alors
sinon si ( moyenne < 80%) alors
grade ← ”distinction”
sinon si ( moyenne < 90%) alors
grade ← ”une grande distinction”
sinon ( moyenne <= 100%)
grade ← ”la plus grande distinction”
fin si
retourner grade
fin algorithme
Ex 6.14
[modifier | modifier le wikicode]Énoncé
[modifier | modifier le wikicode]Écrire un algorithme qui retourne le numéro du jour de la semaine reçu en paramètre Ex: 1 pour lundi, 2 pour mardi, ...
Solution
[modifier | modifier le wikicode]algorithme NrJour (jour:chaine) → entier
nrJour: entier
si jour = lundi alors
nrJour ← 1
sinon si jour = mardi alors
nrJour ← 2
sinon si jour = mercredi alors
nrJour ← 3
sinon si jour = jeudi alors
nrJour ←4
sinon si jour = vendredi alors
nrJour ←5
sinon si jour = samedi alors
nrJour ←6
sinon jour = dimanche alors
nrJour ←7
fin_si
retourner nrJour
fin algorithme
Ex 6.14
[modifier | modifier le wikicode]Énoncé
[modifier | modifier le wikicode]Écrire un algorithme qui retourne le numéro du jour de la semaine reçu en paramètre Ex: 1 pour lundi, 2 pour mardi, ...
Solution
[modifier | modifier le wikicode]algorithme NrJour (jour:chaine) → entier
nrJour: entier
selon que jour vaut
"lundi" :
nrJour ← 1
"mardi" :
nrJour ← 2
"mercredi" :
nrJour ← 3
"jeudi" :
nrJour ← 4
"vendredi" :
nrJour ← 5
"samedi" :
nrJour ← 6
"dimanche":
nrJour ← 7
fin_selon_que
retourner nrJour
fin_algorithme
Ex 6.15
[modifier | modifier le wikicode]algorithme tirerUneCarte ( Piocher, Signe: entiers) Piocher ← hasard(13) Signe ← hasard(4) selon que Piocher vaut
1: Piocher ← "As"
2: Piocher ← "Deux"
3: Piocher ← "Trois"
4: Piocher ← "Quatre"
5: Piocher ← "Cinq"
6: Piocher ← "Six"
7: Piocher ← "Sept"
8: Piocher ← "Huit"
9: Piocher ← "Neuf"
10: Piocher ← "Dix"
11: Piocher ← "Valet"
12: Piocher ← "Dame"
13: Piocher ← "Roi"
fin selon que
selon que Signe vaut
1: Signe ← "Cœur"
2: Signe ← "Pique"
3: Signe ← "Carreau"
4: Signe ← "Trèfle"
fin selon que
afficher (Piocher,"de",Signe)
fin algorithme
Ex 6.16
[modifier | modifier le wikicode]algorithme nbJourMois (nrMois: entier,) → entier
nrMois(1,2,3,4,5,6,7,8,9,10,11,12) ←(Jan, Fev, Mar,Avr, Mai, Juin,Juil, Aout, Sept, Oct, Nov, Dec)
nbJourMois ←28,30,31
selon que nrMois vaut 1,3,5,7,8,10,12 nbJourMois ←31
selon que nrMois vaut 4,6,9,11 nbJourMois ←30
selon que nrMois vaut 2 nbJourMois ←28
fin selon que
retourner nbJourMois
fin algorithme
Ex 6.18
[modifier | modifier le wikicode]algorithme reussirGen1 (cote1, cote2, cote3 : réels) -->boolean
ok : cote1>=50% ET cote2 >=50% ET cote3 >=50%
moyenneAA = (cote1/20 + cote2/20 + cote3/20)/3
si ok alors
afficher “Reussi”
si ok alors
afficher moyenneAA
sinon
afficher "Raté"
fin si
fin algorithme
Ex 6.20
[modifier | modifier le wikicode]algorithme prixPhotocopies (nbPhotocopies : réel) → réel
prixPhotocopies: réel // euro
si nbPhotocopies <= 10 alors
prixPhotocopies ←10*0.10
si nbPhotocopies <= 30 alors
prixPhotocopies ←(10*0.10) + (30-10)*0.09
si nbPhotocopies > 30 alors
prixPhotocopies ←(10*0.10) +(10*0.10) + (30-10)*0.09 +(nbPhotocopies – 30)*0.08
fin si
retourner prixPhotocopies
fin algorithme
Ex 6.21
[modifier | modifier le wikicode]? où est l'explication de la méthode ?
algorithme stationementAlternatif (nrJour, nrMaison: entier) → boolean
si nrJour >=1 ET nrJour <=15
si nrMaison MOD 2 =0 alors
returner Faux
si nrMaison MOD 2 = 1 alors
returner Vrai
sinon si nrJour >15 ET <=(28,30,31)
si nrMaison MOD 2 = 0 alors
retourner Vrai
si nrMaison MOD 2 = 1 alors
retourner Faux
fin si
fin algorithme