Corrigés des exercices
Introduction à l’algorithmique
Exercice 1
Pour convertir un nombre binaire en décimal, doit-on :
-
Ajouter les nombres ?
-
Utiliser les puissances de 2 selon le poids ?
-
Convertir les groupes de 4 bits ?
-
Ajouter les nombres et diviser par 2 ?
Solution
Utiliser les puissances de 2 selon le poids.
Exercice 2
Quelle est la valeur maximale d’un nombre codé en 16 bits sans tenir compte du signe ? Indiquez comment calculer cette valeur et exprimez le résultat en décimal et en hexadécimal.
Solution
La taille maximale d’un nombre sur 16 bits est de 216-1. Ce résultat est facilement trouvable comme ceci :
1*215 + 1*214 + 1*213 + … + 1*20
Ce qui donne 65535, le nombre maximal pouvant être stocké dans 16 bits, et non 65536 (216).
Sa représentation hexadécimale est FFFF.
Exercice 3
Convertissez le nombre décimal 3407 en binaire et en hexadécimal.
Solution
3407-2048 = 1359, donc on a 1 fois 2048 dans 3407
1359-1024 = 335 donc 1
335-512 = -177 donc 0
335-256 = 79 donc 1
79-128 = -49 donc 0
79-64 = 15 donc 1
15-32 = -17 donc 0
15-16 = -1 donc 0
15-8 = 7 donc 1
7-4 = 3 donc 1
3-2 = 1 donc 1
1-1 = 0 donc 1
Le résultat est donc 1101 0100 1111, soit 12 bits.
En hexadécimal, on peut partir du résultat binaire et se rapporter au tableau de ce livre pour trouver : D4F.
Exercice 4
Quel est l’intrus parmi les langages...
Les variables et opérateurs
Exercice 1
Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ?
VAR
A,B:entiers
DEBUT
A
2
B
A+4
A
4
FIN
Solution
A
2
A=2, B n’a pas encore de valeur.
B
A+4
A=2, B=6.
A
4
A=4, B=6.
Exercice 2
Quelles seront les valeurs des variables A, B et C après exécution des instructions suivantes ?
VAR
A,B,C:entiers
DEBUT
A
1
B
3
C
A+B
A
5
C
B-A
FIN
Solution
A
1
A=1, B et C n’ont pas encore de valeur.
B
3
A=1, B=3, C n’a pas encore de valeur.
C
A+B
A=1, B=3, C=4.
A
5
A=5, B=3, C=4.
C
B-A
A=5, B=3, C=-2.
Exercice 3
Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ?
VAR
A,B:entiers
DEBUT
A
2
B
A+3
A
A+5
B
A-4
FIN
Solution
A
2
A=2, B n’a pas encore de valeur.
B
A+3
A=2, B=5.
A
A+5
A=7, B=5.
B
A-4
A=7, B=3.
Exercice 4
Quelles sont les valeurs de A et B à la fin du code suivant ? Adaptez l’algorithme pour échanger les valeurs de A et B.
VAR
A,B:entiers
DEBUT
A
1
B
3
A
B
B
A
FIN
Solution
A=3, B=3
VAR
A,B:entiers
DEBUT
A
1
B
3
C
A
A
B
B
C
FIN
A=3...
Tests et logique booléenne
Exercice 1
Écrire un algorithme qui lira au clavier trois noms communs, et qui dira s’ils sont dans l’ordre alphabétique.
Solution
VAR
a, b, c:chaîne
DEBUT
Afficher "1er nom ?"
Saisir a
Afficher "2ème nom ?"
Saisir b
Afficher "3ème nom ?"
Saisir c
Si a < b ET b < c Alors
Afficher "Les 3 noms sont dans l'ordre alphabétique"
Sinon
Afficher "Les 3 noms ne sont pas dans l'ordre alphabétique"
FinSi
Fin
Exercice 2
Écrire, avec des comparaisons, un algorithme qui lira au clavier les heures et les minutes, et qui affichera l’heure qu’il sera une minute plus tard. Par exemple, si l’utilisateur tape 20 puis 33, l’algorithme doit répondre :
"Dans une minute il sera 20 heure(s) 34 minute(s).
NB : on suppose que l’utilisateur entre une heure valide.
Solution
VAR
h, m:entier
DEBUT
Afficher "Heure ?"
Saisir h
Afficher "Minute ?"
Saisir m
m
m+1
Si m = 60 Alors
m
0
h
h + 1
FinSi
Si h = 24 Alors
h
0
FinSi
Afficher "Dans une minute il sera " + h + " heure(s) " + m + "minute(s)"
Fin
Dans l’instruction Afficher, le + sert à concaténer les chaînes de caractères ("Dans une minute il sera") et les variables (h ou bien m).
Exercice 3
Écrire le même algorithme, mais en utilisant deux variables booléennes pour vérifier si les minutes sont égales à 60 et les heures à 24, sans comparaisons dans les SI.
Solution
VAR
h, m:entier
boolH, boolM:booléens
DEBUT
Afficher "Heure ?"
Saisir h
Afficher "Minute ?"
Saisir m
m
m+1
boolM
m = 60
Si boolM Alors
m
0
h
h + 1
FinSi
boolH
h = 24
Si boolH Alors
h
0
FinSi
Afficher "Dans une minute il sera " + h + " heure(s) " + m + "minute(s)"
Fin
Exercice 4
Écrire un algorithme qui détermine la catégorie sportive d’un utilisateur en fonction de son âge :
18 à 19 ans : junior
20 à 22 ans : espoir
23 à 39 ans : sénior
40 ans et plus : vétéran
Écrire le programme PHP équivalent.
Solution
VAR
age:entier
DEBUT
Afficher "Age ?"
Saisir age
Si age>=40 Alors
Afficher "vétéran"
SinonSi age>=23 Alors
Afficher "sénior"
SinonSi age>=20 Alors
Afficher "espoir"
SinonSi age>=18 Alors
Afficher "junior"
FinSi
FIN
En PHP :
<html>
<head>
<title>catégorie sportive</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
if(!isset($_GET['age'])) {
?>
<form method="GET">
Entrez un age : <input type="text" size="4" name="age" /><br />
<input type="submit" name="OK" />
</form>
<?php
} else {
$age=$_GET['age'];
if($age>=40) echo "vétéran";
else if($age>=23) echo "sénior";
else if($age>=20) echo "espoir";
else if($age>=18) echo "junior";
}
?>
</body>
</html>
Exercice 5
Une compagnie d’assurance automobile doit appliquer une surprime suivant l’âge, le sexe et le nombre d’années de permis de la personne.
Les hommes de plus de 22 ans payent la surprime.
Les femmes entre 20 et 30 ans payent la surprime.
Les personnes ayant plus de cinq années de permis ne payent pas la surprime.
Écrire un algorithme qui détermine si la personne doit payer ou non la surprime.
Écrire le programme PHP équivalent.
Solution
VAR
age, year_number:entier
sexe:chaîne
DEBUT
Afficher "Age ?"
Saisir age
Afficher "Nombre d'années de permis ?"
Saisir year_number
Afficher "Sexe ?"
Saisir sexe
C1
sexe = "M" ET age > 22
C2
sexe = "F" ET (age > 20 ET age < 30)
C3
year_number < 5
Si (C1 ou C2) et C3 Alors
Afficher "surprime"
Sinon
Afficher "pas de surprime"
FinSi
FIN
En PHP :
<html>
<head>
...
Les boucles
Exercice 1
Écrire un algorithme qui demande un nombre de départ, et qui affiche ensuite la table de multiplication de ce nombre. Exemple avec le nombre 6 :
1+2+3+4+5+6 = 21
Écrire le programme PHP équivalent.
Solution
VAR
nombre, i, somme:entier
DEBUT
Afficher "Nombre ?"
Saisir nombre
somme = 0
Pour i De 1 à nombre Faire
somme = somme + i
FinPour
Afficher "La somme des entiers de 1 à " + nombre + " est égale à " +
somme
FIN
En PHP :
<html>
<head>
<title>somme</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
if(!isset($_GET['number'])) {
?>
<form method="GET"> Entrez un nombre : <input type="text" size="4" name="number" /><br />
<input type="submit" name="OK" />
</form>
<?php
} else {
$number=$_GET['number'];
$somme = 0;
for ($i=1;$i<=$number;$i++) {
$sum = $sum + $i;
}
echo "La somme des entiers de 1 à ".$number." est égale à ".$sum;
}
?>
</body>
</html>
Exercice 2
Écrire un algorithme qui demande un nombre de départ, et qui affiche ensuite la table de multiplication de ce nombre. Exemple avec le nombre 6 :
Table de 6 :
6 x 1 = 6
6 x 2 = 12
6 x 3 = 18
...
Écrire le programme PHP équivalent.
Solution
VAR
nombre, i:entier
DEBUT
Afficher "Nombre ?"
Saisir nombre
Ecrire "Table de "+n
Pour i De 1 à 10 Faire
Afficher N + " x " + i + " = " + n*i
FinPour
FIN
En PHP :
<html>
<head>
<title>multiplication</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
if(!isset($_GET['number'])) {
?>
<form method="GET">
Entrez un nombre : <input type="text" size="4" name="number" /><br />
<input type="submit" name="OK" />
</form>
<?php
} else {
$number=$_GET['number'];
echo "Table de ".$number."<br />";
for ($i=1;$i<=10;$i++) {
echo $number." X ".$i." = ".$number*$i."<br />";
}
}
?>
</body>
</html>
Exercice 3
Écrire un algorithme qui demande un nombre de départ, et qui affiche ensuite la factorielle de ce nombre. Exemple avec le nombre 7 :
1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040
Écrire l’algorithme avec la boucle Pour puis avec la boucle Tant Que.
Écrire le programme PHP équivalent.
Solution
Boucle Pour
VAR
nombre, i, facto:entier
DEBUT
Afficher "Nombre ?"
Saisir nombre
facto = 1
Pour i De 2 à nombre Faire
facto = facto * i
FinPour
Afficher "Factorielle de " + n + ":" + facto
FIN
Boucle Tant Que
VAR
nombre, i, facto:entier
DEBUT
Afficher "Nombre ?"
Saisir nombre
facto = 1
i = 1
Tant Que i<>nombre
i = i+1
facto = facto * i
FinTantQue
Afficher "Factorielle de " + n + ":" + facto
FIN
En PHP :
Boucle Pour
<html>
<head>
<title>factorielle</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
if(!isset($_GET['number'])) {
?>
<form method="GET">
Entrez un nombre : <input type="text" size="4" name="number" /><br />
<input type="submit" name="OK" />
</form> ...
Les tableaux et structures
Exercice 1
Créer un tableau contenant les chiffres de 1 à 10 et un autre tableau contenant les nombres de 11 à 20. Ensuite créer un autre tableau contenant la somme des deux premiers tableaux et afficher ses valeurs. Il faut utiliser les boucles pour créer ces tableaux.
Écrire le programme PHP équivalent.
Solution
VAR
tableau1:tableau[1..10] d'entiers
tableau2:tableau[1..10] d'entiers
tableauSomme:tableau[1..10] d'entiers
DEBUT
Pour i de 1 à 10 faire
tableau1[i]
i
FinPour
Pour i de 1 à 10 faire
Tableau2[i]
i+10
FinPour
Pour i de 1 à 10 faire
tableauSomme[i]
tableau1[i] + tableau2[i]
FinPour
Pour i de 1 à 10 faire
Afficher tableauSomme[i]
FinPour
FIN
En PHP :
<?php
$table1 = array();
$table2 = array();
$tableSum = array();
for ($i=1;$i<=10;$i++) { //tableau de 1 à 10
$table1[$i]=$i;
}
for ($i=1;$i<=10;$i++) { //tableau de 11 à 20
$table2[$i]=$i+10;
}
for ($i=1;$i<=10;$i++) { //tableau avec la somme des 2 autres tableaux
$tableSum[$i]=$table1[$i]+$table2[$i];
}
//affichage des valeurs de la somme des 2 autres tableaux
for ($i=1;$i<=10;$i++) {
echo $tableSum[$i]."<br />";
}
?>
Exercice 2
Soit deux tableaux :
-
Le tableau1 est composé des éléments 6,25,35 et 61.
-
Le tableau2 est composé des éléments 12,24 et 46.
Écrire l’algorithme permettant de calculer une valeur représentative de ces deux tableaux notée S. La valeur S se calcule en multipliant chaque valeur du tableau1 par celle du tableau2 et en additionnant le tout.
Dans cet exemple, la valeur S sera égale à :
12*6+12*25+12*35+12*61+24*6+24*25+24*35+24*61+46*6+46*25+46*35+46*61
Il faut bien entendu utiliser les boucles pour réaliser cet exercice.
Écrire le programme PHP équivalent.
Solution
VAR
tableau1:tableau[1..4]
{6,25,35,61} d'entiers
tableau2:tableau[1..3]
{12,24,46} d'entiers
somme, nb_tableau1, nb_tableau2:entier
DEBUT
somme
0
tableau1
4
nb_tableau2
3
Pour i de 1 à tableau1 faire
Pour j de 1 à tableau2 faire
somme
somme + tableau1[i] * tableau1[j]
FinPour
FinPour
Afficher " La valeur S est :", somme
FIN
En PHP :
<?php
$table1=array(6,25,35,61);
$table2=array(12,24,46);
$sum = 0; //initialisation de la variable $somme
$nb_table1=count($table1); //taille du tableau1
$nb_table2=count($table2); //taille du tableau2
for ($i=0;$i<=$nb_table1-1;$i++) {
for ($j=0;$j<=$nb_table2-1;$j++) {
$sum = $sum + $table1[$i] * $table2[$j];
}
}
echo "La valeur S est : ".$sum;
?>
Exercice 3
Voici un tableau à deux dimensions :
tab_personne:tableau[1..2][1..3] de chaîne
tab_caracteristique_dupont:tableau[1..3] de chaîne
tab_ caracteristique_durand:tableau[1..3] de chaîne
tab_caracteristique_dupont["prenom"]
"PAUL"
tab_caracteristique_dupont["profession"]
"ministre"
tab_caracteristique_dupont["age"]
"50"
tab_caracteristique_durand["prenom"]
"ROBERT "
tab_caracteristique_durand["profession"]
"agriculteur"
tab_caracteristique_durand["age"]
"45"
tab_personne["DUPONT"]
tab_caracteristique_dupont
tab_personne["DURAND"]
tab_caracteristique_durand
Et en PHP :
$tab_characteristic_dupont = array("prénom" => "PAUL","profession" =>
"ministre","age" => 50);
$tab_characteristic_durand = array("prénom" => "ROBERT","profession" =>
"agriculteur","age" => 45);
$tab_personn['DUPONT'] = $tab_characteristic_dupont;
$tab_personn['DURAND'] = $tab_characteristic_durand;
Créer le code permettant de générer ce tableau en HTML à l’aide des boucles.
![images/05RI01N.png](https://www.eni-training.com/download/11aca350-0156-4662-973f-8ccc6f1dffc9/images/05RI01N.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
Écrire le programme PHP équivalent.
Solution
Attention : dans ce cas, l’indice du tableau est une chaîne de caractères et on utilisera une boucle de type "Pour chaque" (Foreach) pour récupérer la clé du tableau.
VAR
tab_personne:tableau[1..2][1..3] de chaîne
tab_caracteristique_dupont:tableau[1..3] de chaîne
tab_ caracteristique_durand:tableau[1..3] de chaîne ...
Les sous-programmes
Exercice 1
Créer une fonction calculant la somme de valeurs passées en paramètre. Cette fonction aura le résultat comme premier paramètre par référence et le tableau de valeurs en deuxième paramètre. Appeler la fonction avec un tableau contenant les nombres 5,9,4 et 18. Écrire la solution en PHP.
Solution
<?php
// Fonction avec le résultat comme premier paramètre par référence
// et la somme des valeurs du tableau passé en deuxième paramètre.
function sum(&$result,$tab_values) {
$result = 0;
foreach ($tab_values as $val) {
$result += $val;
}
}
// appels
$table = [5,9,4,18];
sum($result,$table); // tableau passé en paramètre
echo 'somme($result,[5,9,4,18]) => ',$result,'<br />';
?>
Exercice 2
Créer un tableau contenant 10 chiffres aléatoires entre 1 à 100 puis trier celui-ci sans utiliser les méthodes de tri de tableau comme sort(). Il faudra créer une fonction pour échanger deux valeurs dans un tableau. Afficher ces valeurs séparées par une virgule. Écrire la solution en PHP.
Solution
<?php
$table1 = array();
//Fonction pour échanger la valeur dans un tableau
//Le tableau est passé par référence
function exchange(&$table, $i, $j)
{
$temp = $table[$i];
$table[$i] = $table[$j];
$table[$j] = $temp;
}
//remplissage d'un tableau de 10 valeurs aléatoires entre 1 et 100
for ($i=1;$i<=10;$i++) {
$table1[$i]=rand(1,100);
}
$length=10;
while($length>0)
{
// recherche de la plus grande valeur du tableau
$maximum = 1;
for($i=1; $i<=$length; $i++) {
if($table1[$i]>$table1[$maximum]) {
$maximum = $i;
}
}
//échange du maximum avec le dernier élément
exchange($table1, $maximum, $length);
// Traitement du reste du tableau
$length--;
}
//affichage du tableau
for ($i=1;$i<=10;$i++) { //tableau de 1 à 10
echo $table1[$i].",";
}
?>
Exercice 3
Créer une fonction pour afficher une phrase contenant de manière aléatoire un nombre quelconque de mots passés en paramètre. Chaque mot ne doit apparaître qu’une seule fois. La fonction prendra un tableau en paramètre. Écrire la solution en PHP.
Solution
<?php
function display($tab) {
$table_end = array(); //tableau contenant les mots
//à afficher aléatoirement
$j=0; //compteur de ce tableau
$number_elements = sizeof($tab);
while ($j < $number_elements) {
$random_key = array_rand($tab);
//si la valeur tirée aléatoirement est déjà présente dans
//le tableau de fin, décrément de $i pour recommencer
//à boucler une fois de plus.
if (! in_array($tab[$random_key],$table_end)) {
$table_end[$j] = $tab[$random_key];
$j++;
} ...
Les fichiers
Exercice 1
Écrire un programme en PHP permettant de créer un fichier texte s’il n’existe pas puis écrire dans ce fichier « date et heure courante : » suivi de la date du jour. En PHP, la date s’affiche avec la fonction date(’d.m.Y G:i:s’).
Solution
<?php
$ressource = fopen('log.txt', 'w+'); //création du fichier texte s'il
//n'existe pas.
if ($ressource) {
fputs($ressource, 'date et heure courante :');
fputs($ressource, date('d.m.Y G:i:s').PHP_EOL); //écriture de
//la date et de l'heure courantes
}
fclose($ressource);
?>
Exercice 2
Écrire un programme en PHP permettant de créer un fichier texte qui stocke le nombre de fois qu’une page a été vue.
Solution
Créer un fichier compteur.txt puis exécuter le code suivant :
<?php
$ressource = fopen('counter.txt', 'r+');
$nb_views = fgets($ressource); // Lecture de la première ligne contenant
// le nombre de pages vues
if ($nb_views == "") { //teste si le fichier ne contient pas encore
//de nombre
$nb_views...
Notions avancées
Exercice 1
Écrire en PHP l’algorithme de tri par fusion expliqué dans la section Exemples de tri.
Solution
Attention de bien passer le tableau par référence lors de l’appel de triFusion et de fusionner.
<?php
function sortMerge (&$tab, $begin, $end)
{
if($begin<$end)
{
$middle = round(($begin+$end)/2,0, PHP_ROUND_HALF_DOWN);
sortMerge($tab, $begin, $middle);
sortMerge($tab, $middle+1, $end);
merge($tab, $begin, $middle, $end);
}
}
function merge (&$tab, $begin, $middle, $end)
{
$tab_tempo = $tab; // tableau temporaire pour stocker
// les données triées.
$i1 = $begin; //indice dans la première moitié de tab_tempo
$i2 = $middle+1; // indice dans la deuxième moitié de tab_tempo
$i = $begin; //indice dans le tableau tab
while ($i1<= $middle && $i2 <= $end)
{
//Recherche de la plus petite tête de liste
if($tab_tempo[$i1] <= $tab_tempo[$i2])
{
$tab[$i] = $tab_tempo[$i1];
$i1++;
}
else
{
$tab[$i] = $tab_tempo[$i2];
$i2++;
}
$i++;
}
if ($i<=$end)
{
while($i1<=$middle) // le reste de la première moitié
{
$tab[$i]=$tab_tempo[$i1];
$i1++; ...
Une approche de l’objet
Exercice 1
Créer les cinq classes du schéma suivant en tenant compte de leur héritage. Toutes les méthodes sont publiques et les attributs sont privés.
![images/08RI03N.png](https://www.eni-training.com/download/11aca350-0156-4662-973f-8ccc6f1dffc9/images/08RI03N.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
Solution
Vehicle.class.php :
<?php
class Vehicle
{
// Déclaration des attributs
private string $color;
private int $weight;
//méthodes publiques
public function move()
{
} : void
public function add_person(float $weight_person)
{
} : void
}
?>
Four_wheels.class.php :
<?php
class Four_wheels extends Vehicle
{
// Déclaration des attributs
private int $number_door;
//méthode publique
public function repaint(string $color) : void
{
}
}
?>
Two_wheels.class.php :
<?php
class Two_wheels extends Vehicle
{
// Déclaration des attributs
private float $capacitycapacity;
//méthode publique
public function refuel(float $number_liter) : void
{
}
}
?>
Car.class.php :
<?php
class Car extends Four_wheels
{
// Déclaration des attributs
private int $number_snow_tire;
//méthodes publiques
public function add_snow_tire(int $number) : void
{
}
public function remove_snow_tire(int $number) : void
{
}
}
?>
Truck.class.php :
<?php
class Truck extends Four_wheels
{
// Déclaration des attributs
private float $length;
//méthodes publiques
public function add_trailer(float $length_trailer) : void
{
}
}
?>
Exercice 2 (suite du 1)
Créer les accesseurs de tous les attributs. Créer un constructeur dans la classe Vehicule prenant en paramètres la couleur et le poids. Modifier la méthode move() pour qu’elle affiche "Le véhicule roule". Modifier la méthode add_person(weight_person) pour qu’elle change le poids du véhicule en fonction du poids de la personne passé en paramètre.
Créer une page affichage.php créant un véhicule noir de 1500 kg. Le faire rouler.
Ajouter une personne de 70 kg et afficher le nouveau poids du véhicule.
Solution
Vehicule.class.php :
<?php
class Vehicle
{
// Déclaration des attributs
private...