Receuil D'exercices
Receuil D'exercices
Receuil D'exercices
SUPPORT DE COURS
Chef de Travaux
Pour pouvoir exécuter un programme sur un ordinateur, on doit généralement passer au travers des
étapes de développement suivantes :
*.obj
liaison avec autres programmes
objets, si nécessaire
Utilisation du programme
Énoncé du problème : Demander un nom et compter combien de fois il apparaît dans une liste.
compteur 0
Définition : Un algorithme numérique est une séquence finie d’étapes -- où l’ordre des
instructions est essentiel -- menant invariablement à l’obtention d’un résultat précis. Chaque étape
est construite en évaluant une condition ou une expression entière ou réelle.
Tout algorithme numérique -- peu importe la langue de programmation utilisée -- peut être totalement
déterminé avec quatre règles très simples.
Règle #1 : On peut déclarer des variables avec un nom et possiblement une valeur initiale.
Toute variable doit être déclarée avant d’être utilisée dans une expression. Voici trois exemples de
déclarations -- avec et sans initialisation --. Je me sers ici de l’opérateur = pour réaliser l’initialisation :
Soit un réel x
Une instruction d’assignation -- distincte de la déclaration -- permet de donner une valeur à une
variable. Par exemple :
x 2 * sin(3.89) //version pseudo-code
n = 5; //version langage C
Règle #2 : Toute expression construite avec des fonctions, des variables et des valeurs littérales
sera évaluée pour donner une valeur réelle ou entière.
Cette règle cache une profonde réalité : Les langues informatiques les plus utilisées sont régulées par
des standards nationaux (ANSI) ou internationaux (ISO) qui forcent la présence :
d’opérations naturelles sur les entiers et sur les réels. Pensons à +, – , * , / ,modulo, etc. ;
Si l’expression conditionnelle est vraie, alors le bloc d’instructions VRAI est exécuté. Sinon, le bloc
d’instructions FAUX est exécuté (ou rien n’est exécuté en absence de la clause SINON). Il est donc
impossible que le bloc d’instructions VRAI et le bloc d’instructions FAUX soient exécutés
simultanément. Le programme continue ensuite avec l’instruction suivant le FINSI. Prenez note que
la partie SINON est facultative -- donc traditionnellement mise entre crochets dans les diagrammes
syntaxiques de l’informatique -- et n’est utilisée par le programmeur qu’au besoin de l’algorithme.
L’expression conditionnelle est évaluée. Si elle est vraie alors le bloc d’instructions TANTQUE est
exécuté et on retourne à l’évaluation de l’expression conditionnelle. Sinon, le programme continue
avec l’instruction suivant le FINTANTQUE.
Donc pour qu’un algorithme -- qui doit se faire avec un nombre fini d’opérations -- puisse contenir un
TANTQUE et exécuter son groupe d’instructions, ce groupe d’instructions doit pouvoir ramener
ultimement à FAUX la valeur de vérité de l’expression conditionnelle. Sinon on obtient une itération
sans fin (boucle infinie) : rappelez-vous le à chaque écriture de boucle !
1.3 Le langage « C » :
#include<stdio.h>
void main(void)
Dissection du programme :
#include< … >
#define … …
void main(void)
Instructions exécutables;
EXEMPLE1.CPP
#include <stdio.h>
#include <stdlib.h> /* pour la fonction system() */
void main(void)
{ int a,
b,
somme;
Règle #1 : On peut déclarer des variables avec un nom et possiblement une valeur initiale.
Toutes les variables du programme doivent être déclarées dans ce même programme. Les déclarations
de variables doivent venir en début de tout bloc de code avant les instructions. Une variable est
normalement accessible à partir de sa déclaration jusqu’à la fin du bloc contenant cette déclaration.
On peut donner une valeur initiale correcte à la variable lors de sa déclaration, ceci s’appelle
l’initialisation de la variable (on se sert de l’opérateur = ). On peut ensuite donner à la variable une
nouvelle valeur dans une instruction nommée l’assignation (en utilisant toujours l’opérateur = ).
int a, b, somme;
Le type standard int (integer) indique que a, b, et somme peuvent seulement contenir des valeurs
numériques entières (0, 1, 2, 4, -1, -10, etc.). Pour la déclaration de réels, remplacez int par le type
double.
int i = 1;
Les variables pouces, pieds n’ont pas été initialisées, leurs valeurs sont inconnues.
Règle #2 : Toute expression construite avec des fonctions, des variables et des valeurs littérales
sera évaluée pour donner une valeur réelle ou entière.
Avec les entiers et les réels, on construit des expressions en utilisant le groupe des opérateurs naturels
( + , - , * , /, etc. ) qui correspondent à votre intuition. Mais en C, la division / de deux entiers donne la
division entière et le modulo de deux entiers s’obtient avec l’opérateur %. Les opérateurs binaires de
comparaisons ( < , > , <= , >= , == , != ) donnent des valeurs booléennes (vrai/faux). Un groupe de
fonctions naturelles mathématiques (sin(), cos(), etc.) est disponibles à partir de la librairie standard
math.h.
SINON instructions_V;
FAIRE (bloc d’instructions) }
FINSI
else {
instructions_F;
Si la condition donne VRAI (ou ≠ 0), alors le bloc instructions_V sera exécuté ;
Si la condition donne FAUX (ou = 0), alors le bloc instructions_F sera exécuté ;
L’indentation -- décalage vers la droite -- est obligatoire dans le cadre de notre cours.
L’indentation -- décalage vers la droite -- est obligatoire dans le cadre de notre cours.
Syntaxe générale :
printf("chaîne de contrôle", arguments);
La chaîne de contrôle indique quoi écrire à l’écran et avec quel « format ». Les arguments sont les
valeurs qui seront affichées avec la chaîne de contrôle.
Exemple :
arguments de la chaîne
La chaîne de contrôle utilise les 5 arguments (un, 2, 3.5, G, O) pour compléter le message.
Symboles et ponctuations :
%lf comme un réel (type double) avec un point décimal (eg. 10.000000)
Exemples d’utilisations :
Affichage de texte.
Pour afficher un texte, il suffit de l’écrire entre guillemets dans le premier paramètre.
Voici un exemple :
printf("Mon premier affichage!");
Prenez note que c’est à vous qu’incombe la responsabilité de donner le bon format, sinon le
résultat risque d’être surprenant -- testez-le vous verrez.
Écran : Valeurs:_1.0_2.00_3.000
Écran : Valeurs:____4.0___5.00__6.000
NOTE IMPORTANTE : Si la valeur réelle à afficher contient plus de décimales que le nombre
demandé, le format %f va arrondir à la dernière décimale affichée.
Donc, printf("%.3f", 3.56789); Affichera 3.568
Vous en serez surpris, mais la fonction printf retourne un entier correspondant au nombre de caractères
effectivement imprimés -- vous pourrez récupérer ce nombre dans une variable si vous le désirez.
Syntaxe générale :
scanf("chaîne de contrôle", variables);
La chaîne de contrôle contient seulement des codes de formats. Les autres arguments doivent être que
des noms de variables précédées de l’opérateur d’adresse &.
Va lire une valeur entière décimale à partir du clavier, et va placer la valeur dans la variable x.
Va lire 1 seul caractère dans lettre_prenom, 1 caractère dans lettre_nom, et un entier dans age.
L’entrée de l’âge devra être précédée d’un espace, comme ceci ; ET_33
%s lire comme une chaîne de caractères (ou string) jusqu’au premier espace
La fonction scanf renvoie un entier qui indique le nombre de lectures qui ont été effectuées avec
succès. Ceci permet de valider si les lectures de données ont été effectuées sans erreur.
Si l’utilisateur tape ; ET 33
La valeur renvoyée dans nb sera 3, car les 3 lectures ont été bonnes (la saisie est valide).
#include <stdlib.h>
scanf("%lf", &rayon);
system("pause"); /* pause-écran */
PAYES.CPP :
#include <stdio.h>
#include <stdlib.h>
void main(void)
scanf("%f", &heures);
scanf("%f", &taux);
else
system("pause"); /* pause-écran */
GRADE.C :
/*
*/
#include <stdio.h>
#include <stdlib.h>
#define PASSING_SCORE 70
int main()
printf("Score? ");
n = scanf("%i", &next_score);
while (n == 1)
score_count = score_count + 1;
pass_count = pass_count + 1;
else
fail_count = fail_count + 1;
printf("Score? ");
n = scanf("%i", &next_score);
if (score_count == 0)
avg_score = 0;
else
return EXIT_SUCCESS;
RECEUIL D’EXERCICES
1. Les Variables
Exercice 1.1
Quelles seront les valeurs des variables A et B, après exécution des instructions suivantes ?
Variables A, B en Entier
Début
A←1
B←A+3
A←3
Fin
Exercice 1.2
Quelles seront les valeurs des variables A, B et C après exécution des instructions suivantes ?
Variables A, B, C en Entier
Début
A←5
B←3
C←A+B
A←2
C←B–A
Fin
Exercice 1.3
Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ?
Variables A, B en Entier
Début
A←5
B←A+4
A←A+1
B←A–4
Fin
Exercice 1.4
Quelles seront les valeurs des variables A, B et C après exécution des instructions suivantes ?
Variables A, B, C en Entier
Début
A←3
B ← 10
C←A+B
B←A+B
A←C
Fin
Luc LUMANJI Page 21
Concepteur de système d’information
Chef de Travaux
2022 - 2023
Introduction aux Algorithmes et au Langage C
BAC1 TOUS
Exercice 1.5
Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ?
Variables A, B en Entier
Début
A←5
B←2
A←B
B←A
Fin
Moralité : les deux dernières instructions permettent-elles d’échanger les deux valeurs de B et
A ? Si l’on inverse les deux dernières instructions, cela change-t-il quelque chose ?
Exercice 1.6
Plus difficile, mais c’est un classique absolu, qu’il faut absolument maîtriser : écrire un
algorithme permettant d’échanger les valeurs de deux variables A et B, et ce quel que soit leur
contenu préalable.
Exercice 1.7
Une variante du précédent : on dispose de trois variables A, B et C. Ecrivez un algorithme
transférant à B la valeur de A, à C la valeur de B et à A la valeur de C (toujours quels que
soient les contenus préalables de ces variables).
Exercice 1.8
Que produit l’algorithme suivant ?
Variables A, B, C en Caractères
Début
A ← "423"
B ← "12"
C←A+B
Fin
Exercice 1.9
Que produit l’algorithme suivant ?
Variables A, B, C en Caractères
Début
A ← "423"
B ← "12"
C←A&B
Fin
2. Lecture et Ecriture
Exercice 2.1
Quel résultat produit le programme suivant ?
Variables val, double numériques
Début
Val ← 231
Double ← Val * 2
Ecrire Val
Ecrire Double
Fin
Exercice 2.2
Ecrire un programme qui demande un nombre à l’utilisateur, puis qui calcule et affiche le
carré de ce nombre.
Exercice 2.3
Ecrire un programme qui lit le prix HT d’un article, le nombre d’articles et le taux de TVA, et
qui fournit le prix total TTC correspondant. Faire en sorte que des libellés apparaissent
clairement.
Exercice 2.4
Ecrire un algorithme utilisant des variables de type chaîne de caractères, et affichant quatre
variantes possibles de la célèbre « belle marquise, vos beaux yeux me font mourir d’amour ».
On ne se soucie pas de la ponctuation, ni des majuscules.
3. Les Tests
Exercice 3.1
Ecrire un algorithme qui demande un nombre à l’utilisateur, et l’informe ensuite si ce nombre
est positif ou négatif (on laisse de côté le cas où le nombre vaut zéro).
Exercice 4.2
Cet algorithme est destiné à prédire l'avenir, et il doit être infaillible !
Il lira au clavier l’heure et les minutes, et il affichera l’heure qu’il sera une minute plus tard.
Par exemple, si l'utilisateur tape 21 puis 32, l'algorithme doit répondre :
"Dans une minute, il sera 21 heure(s) 33".
NB : on suppose que l'utilisateur entre une heure valide. Pas besoin donc de la vérifier.
Exercice 4.3
De même que le précédent, cet algorithme doit demander une heure et en afficher une autre.
Mais cette fois, il doit gérer également les secondes, et afficher l'heure qu'il sera une seconde
plus tard.
Par exemple, si l'utilisateur tape 21, puis 32, puis 8, l'algorithme doit répondre : "Dans une
seconde, il sera 21 heure(s), 32 minute(s) et 9 seconde(s)".
NB : là encore, on suppose que l'utilisateur entre une date valide.
Exercice 4.4
Un magasin de reprographie facture 0,10 E les dix premières photocopies, 0,09 E les vingt
suivantes et 0,08 E au-delà. Ecrivez un algorithme qui demande à l’utilisateur le nombre de
photocopies effectuées et qui affiche la facture correspondante.
Exercice 4.5
Les habitants de Zorglub paient l’impôt selon les règles suivantes :
les hommes de plus de 20 ans paient l’impôt
les femmes paient l’impôt si elles ont entre 18 et 35 ans
les autres ne paient pas d’impôt
Le programme demandera donc l’âge et le sexe du Zorglubien, et se prononcera donc ensuite
sur le fait que l’habitant est imposable.
Exercice 4.6
Les élections législatives, en Guignolerie Septentrionale, obéissent à la règle suivante :
lorsque l'un des candidats obtient plus de 50% des suffrages, il est élu dès le premier tour.
En cas de deuxième tour, peuvent participer uniquement les candidats ayant obtenu au moins
12,5% des voix au premier tour.
Vous devez écrire un algorithme qui permet la saisie des scores de quatre candidats au
premier tour. Cet algorithme traitera ensuite le candidat numéro 1 (et uniquement lui) : il dira
s'il est élu, battu, s'il se trouve en ballottage favorable (il participe au second tour en étant
arrivé en tête à l'issue du premier tour) ou défavorable (il participe au second tour sans avoir
été en tête au premier tour).
Exercice 4.7
Une compagnie d'assurance automobile propose à ses clients quatre familles de tarifs
identifiables par une couleur, du moins au plus onéreux : tarifs bleu, vert, orange et rouge. Le
tarif dépend de la situation du conducteur :
Un conducteur de moins de 25 ans et titulaire du permis depuis moins de deux ans, se voit
attribuer le tarif rouge, si toutefois il n'a jamais été responsable d'accident. Sinon, la
compagnie refuse de l'assurer.
Un conducteur de moins de 25 ans et titulaire du permis depuis plus de deux ans, ou de plus
de 25 ans mais titulaire du permis depuis moins de deux ans a le droit au tarif orange s'il n'a
jamais provoqué d'accident, au tarif rouge pour un accident, sinon il est refusé.
Un conducteur de plus de 25 ans titulaire du permis depuis plus de deux ans bénéficie du tarif
vert s'il n'est à l'origine d'aucun accident et du tarif orange pour un accident, du tarif rouge
pour deux accidents, et refusé au-delà.
De plus, pour encourager la fidélité des clients acceptés, la compagnie propose un contrat de
la couleur immédiatement la plus avantageuse s'il est entré dans la maison depuis plus de cinq
ans. Ainsi, s'il satisfait à cette exigence, un client normalement "vert" devient "bleu", un client
normalement "orange" devient "vert", et le "rouge" devient orange.
Ecrire l'algorithme permettant de saisir les données nécessaires (sans contrôle de saisie) et de
traiter ce problème. Avant de se lancer à corps perdu dans cet exercice, on pourra réfléchir un
peu et s'apercevoir qu'il est plus simple qu'il n'en a l'air (cela s'appelle faire une analyse !)
Exercice 4.8
Ecrivez un algorithme qui a près avoir demandé un numéro de jour, de mois et d'année à
l'utilisateur, renvoie s'il s'agit ou non d'une date valide.
Cet exercice est certes d’un manque d’originalité affligeant, mais après tout, en algorithmique
comme ailleurs, il faut connaître ses classiques ! Et quand on a fait cela une fois dans sa vie,
on apprécie pleinement l’existence d’un type numérique « date » dans certains langages…).
Il n'est sans doute pas inutile de rappeler rapidement que le mois de février compte 28 jours,
sauf si l’année est bissextile, auquel cas il en compte 29. L’année est bissextile si elle est
divisible par quatre. Toutefois, les années divisibles par 100 ne sont pas bissextiles, mais les
années divisibles par 400 le sont. Ouf !
Un dernier petit détail : vous ne savez pas, pour l’instant, exprimer correctement en pseudo-
code l’idée qu’un nombre A est divisible par un nombre B. Aussi, vous vous contenterez
d’écrire en bons télégraphistes que A divisible par B se dit « A dp B ».
5. Les Boucles
Exercice 5.1
Exercice 5.3
Ecrire un algorithme qui demande un nombre de départ, et qui ensuite affiche les dix
nombres suivants. Par exemple, si l'utilisateur entre le nombre 17, le programme affichera les
nombres de 18 à 27.
Exercice 5.4
Ecrire un algorithme qui demande un nombre de départ, et qui ensuite écrit la table de
multiplication de ce nombre, présentée comme suit (cas où l'utilisateur entre le nombre 7) :
Table de 7 :
7x1=7
7 x 2 = 14
7 x 3 = 21
…
7 x 10 = 70
Exercice 5.5
Ecrire un algorithme qui demande un nombre de départ, et qui calcule la somme des entiers
jusqu’à ce nombre. Par exemple, si l’on entre 5, le programme doit calculer :
1 + 2 + 3 + 4 + 5 = 15
NB : on souhaite afficher uniquement le résultat, pas la décomposition du calcul.
Exercice 5.6
Ecrire un algorithme qui demande un nombre de départ, et qui calcule sa factorielle.
NB : la factorielle de 8, notée 8 !, vaut
1x2x3x4x5x6x7x8
Exercice 5.7
Ecrire un algorithme qui demande successivement 20 nombres à l’utilisateur, et qui lui dise
ensuite quel était le plus grand parmi ces 20 nombres :
Entrez le nombre numéro 1 : 12
Entrez le nombre numéro 2 : 14
Etc.
Entrez le nombre numéro 20 : 6
Le plus grand de ces nombres est : 14
Modifiez ensuite l’algorithme pour que le programme affiche de surcroît en quelle position
avait été saisie ce nombre :
C’était le nombre numéro 2
Exercice 5.8
Réécrire l’algorithme précédent, mais cette fois-ci on ne connaît pas d’avance combien
l’utilisateur souhaite saisir de nombres. La saisie des nombres s’arrête lorsque l’utilisateur
entre un zéro.
Exercice 5.9
Lire la suite des prix (en euros entiers et terminée par zéro) des achats d’un client. Calculer la
somme qu’il doit, lire la somme qu’il paye, et simuler la remise de la monnaie en affichant les
textes "10 Euros", "5 Euros" et "1 Euro" autant de fois qu’il y a de coupures de chaque sorte à
rendre.
Exercice 5.10
Écrire un algorithme qui permette de connaître ses chances de gagner au tiercé, quarté, quinté
et autres impôts volontaires.
On demande à l’utilisateur le nombre de chevaux partants, et le nombre de chevaux joués.
Les deux messages affichés devront être :
X et Y nous sont donnés par la formule suivante, si n est le nombre de chevaux partants et p
le nombre de chevaux joués (on rappelle que le signe ! signifie "factorielle", comme dans
l'exercice 5.6 ci-dessus) :
X = n ! / (n - p) !
Y = n ! / (p ! * (n – p) !)
NB : cet algorithme peut être écrit d’une manière simple, mais relativement peu performante.
Ses performances peuvent être singulièrement augmentées par une petite astuce. Vous
commencerez par écrire la manière la plus simple, puis vous identifierez le problème, et
écrirez une deuxième version permettant de le résoudre.
Bibliographie
[1] Jean-Jacques Girardot et Marc Roelens. Structures de données et Algorithmes en C.
Accessible par la page http://kiwi.emse.fr/POLE/SDA/, septembre 2005.
[2] Christian Rolland. LATEX 2", guide pratique. Addison-Wesley, France, Juin 1995.
[3] J-P. Ramis et A. Warusfel, Mathématiques tout-en-un pour la licence, niveau L1, Dunod,
2006
[4] M. Marchand, Outils mathématiques pour l’informaticien, De Boeck, 2005 (2e édition)
[5] J. Vélu, Méthodes mathématiques pour l’informatique, Dunod, 2005 (4e édition)