1. Livres & vidéos
  2. Algorithmique
  3. Corrigé 1
Extrait - Algorithmique Entraînez-vous et améliorez votre pratique de la programmation (exemples en Java et Python) (2e édition)
Extraits du livre
Algorithmique Entraînez-vous et améliorez votre pratique de la programmation (exemples en Java et Python) (2e édition) Revenir à la page d'achat du livre

Corrigé 1

Prérequis

1.

a. et c. Une variable est un emplacement mémoire contenant une valeur dont l’accès se fait par le nom de la variable.

2.

La valeur d’une variable est modifiée pendant l’exécution du programme par une instruction d’affectation.

3.

a. Le type d’une variable définit l’ensemble des valeurs que peut prendre une variable. Par exemple, une variable de type short indique que ses valeurs sont des entiers compris entre -32 768 et 32 767.

4.

La valeur d’une variable peut changer lors de l’exécution d’un programme. Ce n’est pas le cas pour une constante.

5.

Une constante est utilisée pour associer un nom à une valeur qui ne varie pas au cours de l’exécution d’un programme. L’avantage d’une constante est qu’il est possible de modifier sa valeur à un seul endroit dans le code source. Pour que ce changement soit pris en compte, il est cependant nécessaire de recompiler.

6.

a., b., d., f. Les opérateurs, les parenthèses, les variables, les constantes mais aussi les appels de fonction ou les transtypages sont des éléments pouvant figurer dans une expression. 

7.

Une affectation sert à modifier le contenu d’une variable en lui donnant une nouvelle valeur. 

8.

Il s’agit des opérateurs qui sont compatibles avec son type. Si la variable...

Corrigé 1.1 : Affichage de 4/3

Le premier programme en Java qui vient à l’esprit se trouve à la suite. Cependant, il ne convient pas pour afficher la valeur de 4/3 en tant que nombre réel.

public class QuatreTiers { 
 
   public static void main(String[] args) {  
       System.out.println("Affichage de quatre tiers");  
       System.out.println(4/3); 
   } 
} 

En effet, la valeur affichée est un. La division est réalisée sur deux nombres entiers et calcule le quotient entier qui vaut un. En effet, 4/3 est égal à 1.3333, qui a pour valeur entière un.

Pour obtenir le résultat comme un nombre réel, il faut utiliser l’une des deux solutions présentées dans le programme ci-dessous.

public class QuatreTiers { 
    
   public static void main(String[] args) { 
       System.out.println("Affichage de quatre tiers"); 
       System.out.println((float)4/3); 
       System.out.println(4.0/3); 
   } 
} 

Il faut noter que la première solution renvoie un nombre réel de simple précision (type float) à la suite du transtypage. La seconde renvoie un nombre réel de double précision...

Corrigé 1.2 : Conversion de degrés en radians et vice versa

Le programme Java de conversion de degrés en radians est illustré à la suite. Il consiste à déclarer la variable angle, à inviter l’utilisateur à saisir l’angle en degrés, à lire le contenu de la variable angle au clavier, puis à afficher le résultat en le calculant dans le println.

import java.util.Scanner; 
public class ConversionDegreRadian { 
 
   public static void main(String[] args) { 
       Scanner reader = new Scanner(System.in); 
       double angle; 
       System.out.print("Entrez la valeur de l'angle en degrés : "); 
       angle = reader.nextDouble(); 
       System.out.println("La valeur de l'angle en radians  
est : " + angle/180*Math.PI); 
   } 
} 

Le programme Java de conversion de radians en degrés ressemble au précédent, hormis la conversion.

import java.util.Scanner; 
public class ConversionRadianDegre { 
 
   public static void main(String[] args) { 
       Scanner reader = new Scanner(System.in); 
       double angle; 
       System.out.print("Entrez...

Corrigé 1.3 : Calcul de la moyenne de quatre nombres entiers

Le programme Java de calcul de la moyenne utilise quatre variables de type entier pour stocker la valeur des nombres lus et une variable de type double pour stocker le résultat. Dans ce programme, la division sur les nombres réels est effectivement utilisée car le diviseur (4) est écrit sous la forme d’un nombre réel.

import java.util.Scanner; 
public class MoyenneQuatre { 
    
   public static void main(String[] args) { 
       Scanner reader = new Scanner(System.in); 
       int n1,n2,n3,n4; 
       double moyenne; 
       System.out.print("Entrez la valeur du premier nombre : "); 
       n1 = reader.nextInt(); 
       System.out.print("Entrez la valeur du deuxième nombre : "); 
       n2 = reader.nextInt(); 
       System.out.print("Entrez la valeur du troisième nombre : "); 
       n3 = reader.nextInt(); 
       System.out.print("Entrez la valeur du quatrième nombre : "); 
       n4 = reader.nextInt(); 
       // calcul de la moyenne 
     ...

Corrigé 1.4 : Somme des n premiers nombres entiers pairs

Le calcul de la somme s’effectue grâce à une boucle Pour pour laquelle il convient de spécifier la valeur initiale à 2, de la terminer à 2*n et de fixer le pas à 2.

Dans cette boucle, la valeur de i est ajoutée à la somme.

PROGRAMME SommeNombresPairs  
VAR 
       n, i, somme : entier  
DÉBUT 
       Lire n 
       somme  <- 0 
       Pour i De 2 à 2*n Pas 2 Faire  
             somme <- somme + i 
       FinPour  
       Écrire somme 
FIN 

Il est à noter aussi qu’il ne faut pas oublier d’initialiser la somme à 0. Le programme correspondant en Java se présente ainsi :

import java.util.Scanner; 
public class SommeNombresPairs { 
    
   public static void main(String[] args) { 
       Scanner reader = new Scanner(System.in); 
       int n,i; 
       long somme; 
       System.out.print("Donnez la valeur de n : "); 
       n = reader.nextInt(); 
       // calcul de la somme ...

Corrigé 1.5 : Livret d’épargne

L’algorithme utilise une boucle Pour, basée sur le nombre d’années, pour calculer le montant épargné après chaque année et l’afficher.

PROGRAMME LivretÉpargne  
VAR 
   montantInitial, intérêt, montantÉpargné : réel  
   nombreAnnées, i : entier 
DÉBUT 
   Lire montantInitial  
   Lire intérêt         
   Lire nombreAnnées  
   montantÉpargné <- montantInitial 
   Pour i De 1 à nombreAnnées Faire 
       montantÉpargné <- montantÉpargné * (l + intérêt / 100)  
       Écrire montantÉpargné 
   FinPour 
FIN 

Un point important est l’initialisation avant le début de la boucle de la variable montantÉpargné

Le programme correspondant en Java se présente ainsi :

import java.util.Scanner; 
public class LivretEpargne { 
    
   public static void main(String[] args) { 
       Scanner reader = new Scanner(System.in); 
       double montantInitial, interet, montantEpargne; ...

Corrigé 1.6 : Année bissextile

La première version de l’algorithme utilise des tests imbriqués. Le premier test vérifie si l’année est divisible par 400, auquel cas elle est forcément bissextile. Dans le cas contraire, le test se fait ensuite sur la division par 100. Si l’année est divisible par 100 (et donc ici pas par 400), elle n’est pas bissextile. Enfin, dans le dernier cas, l’année n’est divisible ni par 400 ni par 100, le test peut simplement se faire sur la division par 4.

PROGRAMME AnnéeBissextile  
VAR 
   année : entier  
DÉBUT 
   Lire année 
   Si année % 400 = 0 Alors 
       Écrire "l'année est bissextile"  
   Sinon 
       Si année % 100 = 0 Alors 
           Écrire "l'année n'est pas bissextile" 
       Sinon 
           Si année % 4 = 0 Alors 
               Écrire "l'année est bissextile"  
           Sinon 
               Écrire "l'année n'est pas bissextile" ...

Corrigé 1.7 : Calcul de l’impôt sur le bénéfice des sociétés luxembourgeoises

Nous étudions d’abord la première version, celle basée sur des imbrications de tests afin de déterminer la tranche d’imposition du bénéfice. Pour chacune de ces tranches, l’impôt sur les tranches inférieures est ajouté au calcul du pourcentage sur le montant du bénéfice restant à imposer.

PROGRAMME ImpôtBénéfice  
VAR 
   impôt : réel  
   bénéfice : entier 
DÉBUT 
   Lire bénéfice 
   Si bénéfice <= 10000 Alors  
       impôt <- 0.2 * bénéfice 
   Sinon  
       Si bénéfice < 15000 Alors 
           impôt <- 0.2*10000 + 0.26 * (bénéfice - 10000) 
       Sinon 
           impôt <- 0.2*10000 + 0.26*5000 +  
               0.22 * (bénéfice-15000)  
       FinSi 
   FinSi 
   Écrire impôt 
FIN 

Ainsi pour la dernière tranche, l’impôt est égal à 20 % de 10 000, 26 % de 5 000 et 22 % de la partie du bénéfice supérieure à 15 000 €. Dans la version donnée ci-dessus, aucune optimisation n’a été effectuée pour obtenir un résultat lisible. Une version plus optimisée est donnée ci-dessous.

PROGRAMME ImpôtBénéfice2  
VAR 
   impôt : réel  
   bénéfice...

Corrigé 1.8 : Produit des n premiers nombres entiers impairs

Le calcul du produit des n premiers nombres impairs avec une boucle Tant Que est réalisé en faisant varier une variable i de 3 à 2*n-1. Il est suffisant de démarrer à 3 (1 étant neutre pour la multiplication). Quant à 2*n-1, il s’agit bien du énième nombre impair (le premier est 1).

PROGRAMME ProduitNombresImpairsTantQue  
VAR 
   n, i, produit : entier  
DÉBUT 
   Lire n  
   produit <- 1 
   i <- 3 
   Tant Que i <= 2 * n - 1 Faire  
       produit <- produit * i 
       i <- i + 2 
   FinTantQue  
   Écrire produit 
FIN 

L’utilisation d’une boucle Répéter impose de passer au moins une fois dans le corps de la boucle. Il faut donc commencer la valeur de i à 1 (sinon il y aurait au moins une multiplication par 3 qui donnerait un résultat faux dans le cas où n vaut 1). Ici, la programmation avec la boucle Répéter est donc un tout petit peu moins efficace.

PROGRAMME ProduitNombresImpairsRépéter  
VAR 
   n, i, produit : entier  
DÉBUT         
   Lire n 
   produit <- 1 
   i...

Corrigé 1.9 : Calcul de la moyenne de n nombres entiers

Le premier algorithme lit la valeur de n puis celle des n valeurs. Cette saisie est réalisée par une boucle Pour dans laquelle la somme totale des valeurs est également calculée. Le calcul de la moyenne se fait ensuite simplement en divisant la somme par n.

PROGRAMME MoyenneNombresl  
VAR 
   n, i, somme, valeur : entier  
   moyenne : réel 
DÉBUT 
   Lire n  
   somme <- 0 
   Pour i De 1 à n Faire  
       Lire valeur 
       somme <- somme + valeur 
   FinPour 
   Écrire somme / n 
FIN 

Dans la seconde version, l’utilisateur doit saisir 0 pour terminer l’introduction des valeurs. La boucle Répéter Jusqu’à demande une valeur et l’ajoute à la somme (l’addition se fait aussi avec le 0). La division se fait par n-1, n étant égal au nombre de valeurs y compris le 0 final.

PROGRAMME MoyenneNombres2  
VAR 
   n, somme, valeur : entier  
   moyenne : réel 
DÉBUT 
   somme <- 0 
   n <- 0 
   Répéter 
       n <- n + 1 
       Lire valeur 
   ...

Corrigé 1.10 : Suite de Fibonacci

L’algorithme de calcul du énième terme de la suite de Fibonnaci est basé sur une boucle qui calcule tous les termes de la suite de 3 à n. Les variables terme et termePrécédent sont utilisées à chaque itération de la boucle pour calculer le nouveau terme. termePrécédent est affecté à la valeur de terme.

PROGRAMME Fibonacci  
VAR 
   somme, terme, termePrécédent, n, i : entier  
DÉBUT 
   Répéter 
       Lire n  
   Jusqu'à n >= l  
   Selon que : 
       n=l : Écrire "Le résultat vaut 1"  
       n=2 : Écrire "Le résultat vaut 1"  
   sinon : 
       DÉBUT 
           termePrécédent <- 1 
           terme <- 1 
           Pour i De 3 à n Faire 
               somme <- terme + termePrécédent 
               termePrécédent <- terme 
               terme <-...

Corrigé 1.11 : L’utilisateur devine un nombre pair

Comme indiqué dans l’énoncé, la description de la génération du nombre aléatoire n’est pas détaillée dans l’algorithme. Cette génération est indiquée par l’appel de la fonction nombrePairAléatoire

La suite est basée sur une boucle Répéter qui s’arrête quand l’utilisateur a trouvé le nombre. Cette boucle est appropriée car l’utilisateur doit au moins faire une tentative. Deux tests permettent d’indiquer à l’utilisateur s’il a saisi un nombre trop grand ou trop petit.

PROGRAMME UtilisateurDevine  
VAR 
   nombre, nombreLu, nbrTentatives : entier 
DÉBUT 
   nombre <- nombrePairAléatoire(0, 100) 
   nbrTentatives <- 0 
   Répéter 
       nbrTentatives nbrTentatives + 1
       Lire nombreLu         
       Si nombreLu > nombre Alors  
           Écrire "trop grand" 
       Sinon Si nombreLu < nombre Alors  
           Écrire "trop petit" 
       Jusqu'à nombre = nombreLu ...

Corrigé 1.12 : L’ordinateur devine un nombre pair

Dans cet exercice, l’ordinateur doit essayer de trouver un nombre pair compris entre 0 (borne inférieure) et 100 (borne supérieure). Pour réaliser cette tâche, il va proposer un nombre pair situé au milieu de cet intervalle. Si le nombre de l’utilisateur est plus grand, alors il va continuer avec un nouvel intervalle dont la borne supérieure est inchangée et dont la borne inférieure est égale au nombre proposé plus deux (qui est le premier nouveau nombre possible).

Si le nombre de l’utilisateur est plus petit, alors il va continuer avec un nouvel intervalle dont la borne inférieure est inchangée et dont la borne supérieure est égale au nombre proposé moins deux.

Pour calculer un nombre pair situé au milieu de l’intervalle, la somme des deux bornes est divisée par 4. Le résultat de cette division fournit un nombre entier qui est ensuite multiplié par 2, ce qui garantit d’obtenir un nombre pair. Si nous avions simplement divisé par 2, l’algorithme aurait aussi proposé des nombres impairs.

L’algorithme présenté utilise une boucle Répéter. En effet, étant donné que l’ordinateur fait au moins une proposition, celle-ci est donc la boucle la plus appropriée.

PROGRAMME OrdinateurDevine...

Corrigé 1.13 : Calcul du PGCD de deux nombres entiers positifs

L’algorithme de calcul du PGCD est indiqué ci-dessous.

Il est basé sur le calcul du reste de la division euclidienne de a par b. Tant que ce reste n’est pas nul, la valeur de b est affectée à a et le reste est affecté à b. Ainsi le calcul du reste correspond toujours au reste de la division entière de an-2 par an-1.

La valeur de b correspond à la valeur de an-1. Ainsi, cette variable est affichée car elle contient le PGCD des deux nombres lus au clavier.

PROGRAMME CalculPGCD  
VAR 
   a, b, reste : entier  
DÉBUT 
   Lire a  
   Lire b 
   reste <- a % b 
   Tant Que reste != 0 Faire 
       a <- b 
       b <- reste 
       reste <- a % b 
   FinTantQue  
   Écrire b 
FIN 

La traduction de l’algorithme en Java est indiquée ci-dessous.

import java.util.Scanner; 
public class CalculPGCD { 
 
   public static void main(String[] args) { 
       int a, b, reste; 
       Scanner reader = new Scanner(System.in); 
 
       System.out.print("Entrez le premier nombre entier strictement positif...