Académique Documents
Professionnel Documents
Culture Documents
l’informatique
chocolat (6 p)
Ingrédients :
250g de chocolat, 125g de beurre, 6 œufs, 50 g de sucre, café
Etapes :
Si chocolat a dessert
faire fondre le chocolat avec 2 cuillères d'eau
Sinon
Faire tièdir le chocolat liquide au micro-onde
Ajouter le beurre, laisser refroidir puis ajouter les jaunes
Ajouter le sucre et comme parfum un peu de café
Battre les blancs jusqu’à former une neige uniforme
Ajouter au mélange.
A partir des ingrédients (données en entrée), appliquer la recette (les
étapes) va produire une mousse au chocolat (le résultat).
Traitement différé
bancaireValF
= (ValIni * (1+interet/100) )* (1+interet/100)… 30 fois
Interet = 4% si valeur<10000 et 5% si >=10000
Algorithme InteretsBanquairesVariables
%Calcul des interets qnnee qpres qnnee
Lexique : ValIni entier // Entrée
ValF entier //Auxiliaire
Action : +, *, /, lire ,ecrire
Début
Commentaires
Lire ValIni //Demander ValIni a l’utilisateur
Faire 30 fois :
Si ValF<10000 Alors
ValF ← ValF *1.04
Sinon
ValF ← ValF *1.05
Ecrire “a la fin des 30 ans vous avez : “, ValF, “ euros”
Fin
Calculer
les intérêts d’un
Algorithme InteretsBanquairesVariables
prêt
bancaire
%Calcul du carré d'un entier
Lexique : ValIni entier // Entrée
ValF entier //Auxiliaire
Action : +, *, /, lire ,ecrire
Début
Lire ValIni //Demander ValIni a l’utilisateur
Faire 30 fois :
Si ValF<10000 Alors
ValF ← ValF *1.04
Interactions
Sinon
ValF ← ValF *1.05
Ecrire “a la fin des 30 ans vous avez : “, ValF, “ euros”
Fin
Pour aller plus loin …
Poursuite de l’analyse
Les valeurs intermédiaires permettraient à l’utilisateur de voir
qu’au bout de x années il est a 9998,4 euros et qu’en ajoutant
quelques euros a sa mise initiale il bénéficie du taux de 5%
plus vite
Calculer
les intérêts d’un prêt
Algorithme InteretsBanquairesVariables
bancaire
%Calcul du carré d'un entier
Lexique : ValIni entier // Entrée
ValF entier //Auxiliaire
Action : +, *, /, lire ,ecrire
Début
Lire ValIni //Demander ValIni a l’utilisateur
Faire 30 fois :
Si ValF<10000 Alors Dans la boucle Faire mais
ValF ← ValF *1.04 en dehors du siAlorsSinon
Sinon
ValF ← ValF *1.05
Ecrire “nouvelle valeur :”,ValF
Ecrire “a la fin des 30 ans vous avez : “, ValF, “ euros”
Fin
Pour aller plus loin …
Poursuite de l’analyse
Mais comment afficher le nombre d’années en face de chaque
valeur intermédiaire ?
Calculer
les intérêts d’un prêt
Algorithme InteretsBanquairesVariables
bancaire
%Calcul du carré d'un entier
Lexique : ValIni entier // Entrée
ValF, A entier //Auxiliaire
Action : +, *, /, lire ,ecrire
Début
Lire ValIni //Demander ValIni a l’utilisateur
A ← 2008
Faire 30 fois :
Si ValF<10000 Alors Dans la boucle Faire mais
ValF ← ValF *1.04 en dehors du siAlorsSinnon
Sinon
ValF ← ValF *1.05
A ← A+1
Ecrire “en “, A, “la nouvelle valeur est ”,ValF, “ euros“
Ecrire “a la fin des 30 ans vous avez : “, ValF, “ euros”
Fin
Variable (ICI)
Analyse
N est un carré parfait si il existe un entier J dont le carré
vaut N. (16 en est un, 23 non !)
Algorithme
Algorithme Test-Carré-Parfait
Lexique :
N entier
Réponse booléen
Actions : + , * , , =
Auxiliaire : I, J entier
(* voir page suivante *)
Tester si N est un carré parfait
Attention:
Début
toute la subtilité
1. I←0
Répéter
est dans
2. J←I*I
3. I←I+1
4. jusqu’à J N
5a. Si J = N
5b alors Reponse ← Vrai
5c sinon Reponse ← Faux
Finsi
Fin
Algorithme = Abstraction de séquences
Test du carré parfait (N=7)
deInstruction
calculExpression évaluée Valeur de i Valeur de J Valeur de
réponse
1 0
2 I*I 0
3 I+1 1
4 J7?
2 I*I 1
3 I+1 2
4 J7?
2 I*I 4
3 I+1 3
4 J7?
2 I*I 9
3 I+1 4
4 J7?
5 J=N
5c faux Faux
Instruction conditionnelle
0 0 0 0 0 0 0 0 1 1 1 1
0 1 0 0 0 0 1 1 0 1 1 1
1 0 0 0 1 1 0 0 0 0 1 1
1 1 0 1 0 1 0 1 1 1 0 1
Algèbre de Boole et Logique
Utiliser faux et vrai (ou F et V) à la place de 0 et 1
Renommer l'addition, la multiplication et la
complémentation par ou, et et non respectivement appelée
disjonction, conjonction et négation.
x y ou et Non (x)
F F F F V
F V V F V
V F V F F
V V V V F
Condition et Expression
booléenne
Expression booléenne élémentaire par l'exemple
(J < 7) est une expression booléenne élémentaire.
J est de type entier, 7 est un entier et la comparaison < est un opérateur de
N x N dans { F, V }.
(Réponse) est une expression booléenne élémentaire.
Réponse est de type booléen.
(Lettre = `a`) est une expression booléenne élémentaire si la
variable Lettre est de type caractère.
Remarque
Les mêmes symboles (=, <, etc.) sont utilisés pour la comparaison
d'entiers, de caractères, de booléens.
Condition et Expression
booléenne
Expression booléenne élémentaire par l'exemple
(J < 7 et J > 4) est une expression booléenne.
C'est la conjonction de deux expressions booléennes élémentaires.
Elle est évaluée à vraie si la valeur de la variable J appartient
à ]4,7[.
Considérons les variables cv pour la couleur de ma voiture,
mv pour la marque et div pour l'immatriculation
(département).
Que signifie l'expression ci-dessous ?
(cv = blanc et mv = peugeot) ou
((cv = noir) et (div=75 ou div=92 ou div = 93 ou div = 94) )
Algèbre de Boole (suite)
Théorème de De Morgan
non (a ou b) (non a) et (non b)
non (a et b) (non a) ou (non b)
Exemple
Quel est le contraire de “le prof porte un pantalon bleu OU il
porte un pull beige” ?
Si un étudiant soutient une telle affirmation, par quelle
affirmation pouvait vous soutenir exactement l’inverse ?
Le prof ne porte pas un pantalon bleu
ET
Le prof ne porte pas un pull beige
Algorithmique
/C
L’algorithmique sert a réfléchir a l’algorithme
Trouver les bonnes variables
Imbriquer les boucles dans le bon sens
Enchainer les si-alors sinon dans le bon ordre
Etc.
Le langage C sert a laisser un programme formel
Pour tester l’utilisation des variables, la syntaxe
Tester le programme avec des valeurs concrètes
Se convaincre de la justesse de l’algorithme
Donner le code source de votre programme pour convaincre vos utilisateurs (open
source)
Langage de programmation C
main() { //entête
const type nom = valeur ; // bloc déclaration
type nom-variable ;
Syntaxe
nom-variable est un identificateur :
les caractères sont les lettres (A..Z,a..z) et les chiffres 0..9 et le
soulignement (pas de caractères spéciaux, pas de blancs) mais ne
commencent pas par un chiffre
ne commence pas par un chiffre
minuscules et majuscules sont différentes fred≠Fred
longueur maximum = 31 (plus de caractères sont tolérés, mais ils
sont ignorés)
Déclarer une variable sert à
désigner un récipient par son nom
spécifier le domaine des valeurs que peut «contenir » cette
variable
Types
Généralités
Un type est un nom pour un ensemble de valeurs. Un type est
muni d'opérateurs. Donc :
Déclarer une variable sert aussi à connaître les opérateurs
applicables à (la valeur de) la variable
Avertissement
Les compilateurs C ne peuvent détecter certaines erreurs
de typage.
Exemple
un caractère (lettre de l’alphabet, chiffres) sera représenté par un
entier de type char (8 bits) : la lettre ‘a’ sera représentée par
l’entier 97 !
Une erreur flagrante de typage ( 4 * ‘a’) ne sera pas détectée !
Les types entiers
Pour manipuler les entiers, C propose 6 types (Table ci-dessous).
D’autres existent.
Les opérations sur les entiers sont l’addition +, la soustraction -, la
multiplication *, la division / et les comparaisons (==, !=, >; >=,
etc.)
scanf("FORMAT", &nom-variable);
Permet de saisir (lire) des données tapées au clavier
FORMAT permet de spécifier le type de la variable lue. Par exemple, "%d"
pour un entier, "%f" pour un réel…
( d = décimal, f = floating point )
L'exécution de l'instruction ci-dessus
Attend que l'utilisateur tape une valeur au clavier
Cette valeur est affectée à la variable (idem au pluriel)
La variable doit avoir été declarée (avec le bon type) (const)
Exemple
int I= 234 ;
scanf ("%d",&I) ;
Si l'utilisateur tape 33, la valeur de la variable I est 33 après exécution des
deux instructions.
Instructions d’entrée-sortie
Exemple
scanf ("%d %d %d", &I, &J, &N)
si l'utilisateur tape 33 44 22, la valeur de la
variable I est 33, celle de J est 44 et celle de N est
22 après exécution.
Avertissement
Si la valeur saisie n'est pas du type de la variable
alors une erreur d'exécution se produit.
Si la valeur n'est pas saisie, alors l'exécution du
programme attend !
Instructions d’entrée-sortie
if (condition) instruction1;
if (condition) instruction1; else instruction2;
if (…); instruction1; EST TOUJOURS EXECUTE A CAUSE DU ;
Exemple
N = 5; I=2;
if (N= =I*I) printf ("L'entier %d est un carre parfait", N);
else printf("L'entier %d n'est pas un carre parfait", N);
Un bloc d'instructions est une liste d'instructions encadrée par les mots clé
{ et }
Exemple
N=5;
if (N % 2 = =0) printf("%d est pair", N);
% est le
else {
N = N-1 ;
reste de la
}
printf ("%d est pair", N); division
entière
Affichage à l'écran : 4 est pair
Reste de la division entière
switch (expression) {
case expression-constante : bloc-instruction 1; break;
case expression-constante : bloc-instruction 2; break;
...
case expression-constante : bloc-instruction n; break;
default : bloc-instruction; break;
}
le cas default est facultatif.
Pas de break signifie que les 2 cas sont traités ensemble
L'instruction break provoque une sortie immédiate du switch
Conditionnelle
Exemple
N=5
switch (N%2) {
case 1 : printf ("%d est impair", N) ; break;
case 0 : printf ("%d est pair", N) ; break;
}
Exemple
switch (C) {
case ‘0’ : case ‘2’ : case ‘4’ : case ‘6’ : case ‘8’ :
printf("%d est le code d’un chiffre pair" , C); break;
case ‘1’ : case ‘3’ : case ‘5’ : case ‘7’ : case ‘9’ :
printf("%d est le code d’un chiffre impair", C); break;
default :
printf ("%d n’est pas le code d’un chiffre, c’est %c", C, C);
}
Itération
Itération : tant que
Tant que (expression)
Instructions
fin tant que
Attention
Initialiser les variables testées dans l’expression
Modifier les variables dans la boucle pour qu’elle s’arrête.
Attention
Initialiser les variables testées dans l’expression avant le « répéter »
Modifier les variables dans la boucle pour qu’elle s’arrête.
On exécute des instructions avant de tester l’expression
Exemple
Main () {
scanf("%d", &N);
Res = 1;
do {
Res = Res * N ;
N = N -1 ; // N est modifié
} while (N > 0) ; // N est testé
printf("%d \n", Res);
}
Simulation de l'exécution
pour la saisie de 0 et pour la saisie de 5
Itération - for
Remarque générale
pour l'itération for, on peut mettre plusieurs autres variantes pour les
expressions expr1, expr2 et expr3.
Programmation de Test-Carré-
Parfait
Rappel de l'algorithme
Début
1. I←0
Répéter
2. J←I*I
3. I←I+1
4. jusqu’à J N
5a. Si J = N alors Reponse ← Vrai
5b. Sinon Reponse ← Faux
Finsi
Fin
Programme Test-Carré-Parfait
main(){ // Test-Carré-Parfait
...
I = 0; // initialisation de I
do {
J=0;
for (k=1; k <= I; k = k + 1) {
J = J + I; // calcul de J=I*I par additions successives
}
I = I+1; // incrémentation de I
}
while (J<N);
...
Définition
Le type tableau permet de représenter des fonctions à
domaine fini
A chaque valeur d'un indice, le tableau associe une valeur ou
élément de tableau.
Exemple
On peut représenter les N entiers premiers par :
main (){
...
const int N = 10;
int Tprem[N];
Tableaux mono-dimensionnels
0 1 2 3 4 5 6 7 8 9
1 11 2 3 19 5 13 17 23 7
Utilisation
Le programme Tableau est un exemple simple qui affiche sur
l'écran tous les éléments du tableau des nombres premiers Tprem
main() {
const int N = 10;
int Tprem [N];
Tprem[0] = 1;
Tprem[1] = 2; … Tprem[9] = 2 ; // pas Tprem[10] !!!
int i;
for (i= 0; i < N; i = i +1)
printf("%d \n", Tprem[i]);
}
Tableaux mono-dimensionnels
Utilisation (suite)
Le programme TabCar compte et affiche le nombre de 'a' dans le
tableau Tcar
main(){ // programme TabCar
const int N = 100;
char Tcar [N];
int i, Nba;
Nba = 0;
for (i= 0; i < N; i = i +1)
if (Tcar[i] == 'a')
Nba = Nba + 1;
printf("le nombre de a est : %d", Nba);
}
Tableaux mono-dimensionnels
Utilisation (suite)
Le programme PremCar vérifie et affiche si 'a' est présent dans le tableau Tcar
i = 0;
while ((i < N) && (Tcar[i] != 'a')) i = i + 1;
if (i == N) printf("a n'est pas dans le tableau ");
else printf("a est dans le tableau à la pos %d " , i);
}
Tableaux multi-dimensionnels
Définition
A chaque valeur d'un couple d’indice, le tableau
associe une valeur ou élément de tableau.
Exemple
On peut représenter les N*M entiers par :
const int N = 3;
const int M = 4;
int Matrice[N] [M];
Tableaux multi-dimensionnels
0 1 2 3 4 5 6 7 8 9
0 1 3 2 3 5 9 11 8 0 1
1 3 5 8 1 4 9 34 8 2 7
2 4 5 6 7 8 9 4 3 25 5
3 7 4 3 7 5 7 8 5 9 3
4 8 5 33 4 1 2 5 4 6 12
Utilisation
Le programme Tableau2 est un exemple simple qui affiche sur l'écran tous les éléments du tableau
des nombres Tprem
main() {
const int N = 10;
const int M = 10;
int Matrice [N][M];
Matrice [0][0] = 1;
Matrice [1][0] = 2; … Matrice [9][0] = 2 ; // pas Tprem[10] !!!
Matrice [1][9] = 2; … Matrice [9][9] = 5 ; // pas Tprem[10] !!!
int i;
for (i= 0; i < N; i = i +1) {
for (j= 0; j < M; j = j +1) {
printf("%d ", Matrice [i][j]);
}
printf("\n”);
}
}
Exemple d’analyse
action NOM
{ DESCRIPTION DE L’ACTION}
Données : LES DONNES EN ENTRÉE
Résultats : LE OU LES DONNES RETOURNEES
Début
…
INSTRUCTIONS (construisant la valeur des données
retournées)
…
Fin
Exemple
action div
{ les variables résultats q et r sont respectivement calculées
comme le quotient et le reste de la division entière }
Données : a, b : entier;
Résultats : q, r : entier;
Début
q ←0;
tant que a≥b faire
a ← a-b;
Appel :
q ← q+1;
fin tant que
r ← a;
Fin div (125, 37, x, y);
Algorithmique
return (a – b);
return (b – a);
}
Paramètres d’une fonction
/* déclaration de maFonction */
int maFonction(int val);
void autreFonction() {
/* maFonction est accessible ici */
}
Prototype dede fonction
Il est recommandé déclarer une fonction sous forme de prototype qui
spécifie:
le type de la valeur de retour
le nom de la fonction
le type des paramètres de la fonction
Ex:
int maFonction(int par1, float par2);
/* maFonction retourne une valeur de type int, et prend deux paramètres de
type int et float */
}
/* ici b et c se réfèrent aux variables locales à main */
/* a se réfère à la variable globale */
}
Qualité d'un programme
jeu de tests
séquence 1.2.3.4.5.6.7.8 valeurs test : ...
séquence 1.2.4.6.8 valeurs test : ...
séquence 1.2.3.4.6.8 valeurs test : ...
séquence 1.2.4.5.6.8 valeurs test : ...
... ...
séquence 1.2.4.6.7.6.8 valeurs test : ...
séquence 1.2.3.4.5.6.7.6.8 valeurs test : ...
... ...
Test des conditions
Jeu de tests
séquence 1.2 valeurs test de I : 0
Ne pas négliger la valeur test 36 pour I afin que le bloc1
soit testé pour les deux valeurs 0 et 36 qui rendent la
condition vraie.
Règle générale
Générer les tests qui permettent d'explorer toute la table de
vérité d'une expression booléenne à partir des conditions
élémentaires.
Complexité et coûts des
algorithmes
Un problème peut avoir une solution mais pas de
solution algorithmique (on ne sait pas construire
la solution).
calcul du coût
cas le pire = compter le nombre maximal d'opérations
élémentaires effectuées par une exécution (la pire)
moyenne = considérer toutes les exécutions possibles, pour
chacune compter le nombre ...
Algorithme d'Euclide
Algorithme PGCD-1 //Calcul du pgcd de i et j
Lexique I, J : entier // Entrées
P : entier // Sortie
début
tant que I ≠ J faire
si I > J alors
I←I-J
sinon
J ← J - I;
P ← I;
fin
Nombre d'itérations ?
Algorithme d'Euclide
Algorithme PGCD-2 //Calcul du pgcd de i et j
début
tant que J > 0 faire
K ← I mod J;
I ←J ; J ← K ;
P ← I;
fin
Nombre d'itérations ?
Conclusions