Académique Documents
Professionnel Documents
Culture Documents
Introduction à l’Algorithmique
1
08/10/2019
Programme
Un programme est la traduction d’un algorithme dans un langage de programmation
(exemple : le langage C) qui peut être codé (compris) par la machine.
2
08/10/2019
Variables, Types
Variables
Case mémoire stockant une donnée pouvant varier au cours de l'exécution d'un
programme (par opposition aux constantes).
Les variables ou les constantes sont des chaînes qui répondent à certains critères :
• un nom de variable doit commencer par une lettre (majuscule ou minuscule) ou
un « _ » (pas par un chiffre)
• un nom de variable peut comporter des lettres, des chiffres et le caractère « _ »
(les espaces ne sont pas autorisés !)
• les noms de variables ne peuvent pas être des mots réservés.
Types
Réel, Entier, Caractère, Chaîne de caractères
3
08/10/2019
L’action d’affectation
a pour effet d’écrire la valeur d’une variable dans la zone mémoire réservée à la variable.
Syntaxe
<identificateur de variable> <expression>
Nous distinguons deux types d’expressions : arithmétiques ou logiques
Traitement
L’exécution d’une action d’affectation consiste d’abord à évaluer la valeur de l'expression et
ensuite à écrire cette valeur dans l'espace mémoire correspondant à la variable en
question.
Compatibilité de types
Une action d'affectation doit se faire entre deux types compatibles : la valeur affectée doit
être d'un type compatible avec celui de la variable identifiée qui reçoit cette valeur (entier
à un entier, entier à un réel, booléen à un booléen,...).
L’action d’affectation
Les expressions arithmétiques
Une expression arithmétique exp_arith peut être :
• une constante, exemple 5
• une variable, exemple x
• <exp_arith> op_arith <exp_arith>
où op_arith désigne un opérateur arithmétique {+, -, /, *}
4
08/10/2019
L’action d’affectation
Les expressions logiques
Une expression logique exp_log peut avoir vrai ou faux comme valeur. Elle peut être :
• une constante booléenne (vrai ou faux)
• une variable booléenne
• <exp_arith> op_rel <exp_arith>
où op_rel désigne un opérateur relationnel de comparaison appartenant à
l'ensemble {<,>, <=, >=, =}
• <exp_log> op_log <exp_log>
où op_log est un opérateur logique {ET, OU, NON}
Syntaxe
L'action de lecture a la forme :
Lire (variable) ou Lire (var_1, …, var_n)
Exemple
Lire (x, y, z)
5
08/10/2019
Syntaxe
L'action d’écriture est de la forme :
Ecrire (expression) ou Ecrire (expression1, …, expression n)
Exemple
Ecrire (" la somme de ", x ," et ", y ," = " , z)
Le langage C
6
08/10/2019
Environnement de développement
• Codeblocks
• Dev C++
• Visual Studio
• …
Applications
• Un algorithme qui lit deux entiers X et Y et affiche leurs somme.
• Un algorithme qui lit deux entiers X et Y et affiche leurs valeurs avant
et après permutation selon deux méthodes :
• Méthode 1 : avec variable auxiliaire
• Méthode 2 : sans variable auxiliaire
• Traduisez en langage C
7
08/10/2019
Si condition if (condition)
Alors action(s) { action(s); }
Fin si
Dans cette forme, la condition est évaluée. Si elle vaut vrai alors c'est la
séquence d'actions qui est exécutée sinon c'est l'action qui suit l'action
conditionnelle dans l'algorithme qui est exécutée.
8
08/10/2019
Si condition if (condition)
Alors action(s) 1 { action(s) 1; }
Sinon action(s) 2 else
Fin si { action(s) 2; }
Dans cette forme, la condition est évaluée. Si elle vaut vrai alors c'est la
première séquence d'actions qui est exécutée sinon c'est la deuxième qui
est exécutée
9
08/10/2019
10
08/10/2019
L'action "Répéter"
Forme 1 :
Répéter
action (s)
Jusqu'à condition
Forme 2 :
Traduction en langage C:
Répéter do
action (s) { action(s); }
Tant que condition while (condition);
Le bloc d’actions est exécuté la première fois. Ensuite la condition est évaluée.
Forme 1 : Le bloc d’actions continu à s’exécuter jusqu’à ce que la condition devienne vrai.
Forme 2 : Tant que la condition fournit la valeur vrai, le bloc d’actions est exécuté.
L'action "Pour"
Traduction en langage C:
for (compteur=valuer_initiale;compteur<valeur_fianle;compteur=compteur+pas)
{ action(s) ; }
11
08/10/2019
Les tableaux
Tableau : définition
• Un tableau est une structure de données homogène qui sert à
stocker, dans une même variable, un nombre fini d’éléments de
même type. Un espace mémoire est associé à cette variable
dimensionnée à un nombre fini de cases consécutives pouvant
contenir ces éléments. La variable identifiée est de type tableau.
Tableau de 5 cases
12
08/10/2019
Tableau : déclaration
nomtableau : Tableau [borneinf..bornesup] : typedonnées
Langage C : type nomtableau[taille];
Exemple:
Var T : Tableau [1 .. 10] : entier
Langage C : int T[10];
Recherche séquentielle
Soit T un tableau de N entiers. Un algorithme de recherche d’un élément
quelconque reçoit en entrée un tableau de N éléments et un élément X. Il
répond par oui si cet élément a été trouvé au moins une fois dans le tableau
T et par non dans le cas contraire.
13
08/10/2019
Recherche séquentielle
Application
• Ecrire un algorithme qui permet :
• de lire la taille du tableau à saisir,
• de saisir le tableau,
• de saisir l’élément X à rechercher dans le tableau,
• et d’appliquer la recherche séquentielle.
• Traduire en langage C
Recherche dichotomique
Etant donné un tableau T de N entiers, la recherche dichotomique d’un
entier X dans ce tableau consiste à :
• Diviser le tableau en deux,
• Calculer l’indice du milieu (division entière) dans une variable milieu,
• Comparer l’élément recherché à l’élément du milieu,
• Ramener la recherche dans une des moitiés [1..milieu-1] ou bien
[milieu+1..N]
• Répéter ces étapes en considérant la moitié comme un tableau initial.
L’algorithme s’arrête quand l’élément du milieu est l’élément recherché ou
quand l’indice début de la portion du tableau en cours dépasse l’indice de
fin. Dans ce cas l’élément n’est pas trouvé.
14
08/10/2019
Recherche dichotomique
Application
• Ecrire un algorithme qui permet :
• de lire la taille du tableau à saisir,
• de faire une saisie triée du tableau,
• de saisir l’élément X à rechercher dans le tableau,
• et d’appliquer la recherche dichotomique.
• Traduire en langage C
15
08/10/2019
Si (i<>indmin) Alors
TempT[i]
T[i]T[indmin]
T[indmin] Temp
FinSi
FinPour
On prend le premier élément de la partie non triée , on l’insère à sa place dans la partie triée
en effectuant un décalage à droite.
16
08/10/2019
Tri à bulles
Le principe du tri à bulles consiste : à balayer tout le tableau en comparant les éléments
adjacents et les échangeant s'ils ne sont pas dans le bon ordre. Un seul passage ne déplacera
un élément donné que d'une position, mais en répétant le processus jusqu'à ce qu'aucun
échange ne soit nécessaire, le tableau sera trié.
7 2 16 -5
2 7 16 -5 1er Parcours
2 7 16 -5
A la fin du premier parcours le
plus grand élément est stocké
2 7 -5 16 dans la dernière case du tableau.
17
08/10/2019
Tri à bulles
Répéter
Echange ←faux
Pour i de 1 à N-1 faire
Si (T[i+1] < T[i]) alors
Echange ← vrai
TempT[i+1]
T[i+1]T[i]
T[i] Temp
Finsi
FinPour
Jusqu'à (Echange =f aux)
Les tableaux
multidimensionnels
18
08/10/2019
19
08/10/2019
Procédures et fonctions
20
08/10/2019
Procédures et fonctions
• Pour la résolution d’un problème complexe,
• Il est préférable de décomposer le problème en des sous problèmes.
• Pour chacun de ces sous problèmes on écrit un sous programme qui
sera appelé par l’algorithme principal.
• Un sous programme peut être une procédure ou une fonction.
• Un sous programme (fonction ou procédure) est spécifié par un nom,
un type de retour et éventuellement une liste de paramètres.
Procédures et fonctions
• Paramètres formels
Paramètres déclarés dans l’algorithme principal et qu’on spécifie lors de
l’appel d’un sous-programme
• Paramètres effectifs
Paramètres déclarés dans le sous-programme Formel
Exemple
void main ()
{int a; void pair (int b)
printf("Saisir un entier"); {if (b%2==0)
Effectif scanf("%d",&a); printf("%d est pair", b);}
pair(a);}
21
08/10/2019
Procédures
Algorithme Exemple
Procédure Nom (paramètres formels) Procédure pair (a :entier)
Déclaration des variables locales Début
Début Si a mod 2 =0 alors
Liste des actions ecrire(a, " est pair")
Fin Fin si
Fin
Langage C Exemple
void Nom (paramètres formels) void pair (int a)
{ Déclaration des variables locales; {if (a%2==0)
actions; printf("%d est pair", a);
} }
Fonctions
Exemple
Algorithme Fonction pair (a :entier) : booleén
fonction Nom (paramètres formels) : Type retour
Début
Déclaration des variables locales
Si a mod 2 =0 alors
Début
retourner vrai
Liste des actions
sinon retourner faux
retourner resultat
Fin si
Fin
Fin
Langage C Exemple
int pair (int a)
type Nom (paramètres formels)
{if (a%2==0)
{ Déclaration des variables locales;
return 1;
actions;
else
return resultat; }
return 0;}
22
08/10/2019
23
08/10/2019
24
08/10/2019
La récursivité
• La récursivité est analogique aux traitements itératifs
• La récursivité se base sur 2 éléments:
• La condition d’arrêt : contenant les cas particuliers et les arrêts de traitement
itératif
• L’appel récursif :La fonction s’appelle elle-même.
Exemple
int factR (int x)
{if (x==0 || x==1) Condition d’arrêt
return 1 ;
else
return x * factR(x-1); Appel récursif
}
25
08/10/2019
Déclaration
• Déclaration
Algo : Nom_variable : chaîne
Langage C : char nom_variable[taille];
Exemple : Char nom[20];
• Mémorisation
Le nom d'une chaîne est le représentant de l'adresse du premier caractère de la
chaîne. Pour mémoriser une variable qui doit être capable de contenir un texte de
N caractères, nous avons besoin de N+1 octets en mémoire:
char TXT[10] = "BONJOUR !";
Chaînes constantes
• 'x' est un caractère constant, qui a une valeur numérique:
'x' a la valeur 120 dans le code ASCII.
26
08/10/2019
Précédence
• La précédence des caractères dans l'alphabet d'une machine est dépendante du
code de caractères utilisé. Pour le code ASCII, nous pouvons constater l'ordre
suivant:
. . . ,0,1,2, ... ,9, . . . ,A,B,C, ... ,Z, . . . ,a,b,c, ... ,z, . . .
'0' est inférieur à 'Z' et noter '0' < 'Z'
• La comparaison se fait lettre par lettre sachant que La chaîne vide "" précède
toutes les autres chaînes et le caractère vide '' précède tous les autres caractères.
Conversion
• Chaîne --> Nombre
Le symbole <s> est une chaîne de caractères
27
08/10/2019
#include <string.h>
• <n> représente un nombre du type int. Les symboles <s> et <t> peuvent être remplacés par :
• une chaîne de caractères constante
• le nom d'une variable déclarée comme tableau de char
• un pointeur sur char
#include <ctype.h>
La fonction: retourne une valeur différente de zéro,
• isupper(<c>) si <c> est une majuscule ('A'...'Z')
• islower(<c>) si <c> est une minuscule ('a'...'z')
• isdigit(<c>) si <c> est un chiffre décimal ('0'...'9')
• isalpha(<c>) si islower(<c>) ou isupper(<c>)
• isalnum(<c>) si isalpha(<c>) ou isdigit(<c>)
• isxdigit(<c>) si <c> est un chiffre hexadécimal ('0'...'9' ou 'A'...'F' ou 'a'...'f’)
• isspace(<c>) si <c> est un signe d'espacement (' ', '\t', '\n', '\r', '\f’)
• tolower(<c>) retourne <c> converti en minuscule si <c> est une majuscule
• toupper(<c>) retourne <c> converti en majuscule si <c> est une minuscule
28
08/10/2019
• Exemple
char JOUR[7][9];
char JOUR[7][9]= {"lundi", "mardi", "mercredi", "jeudi", "vendredi",
"samedi", "dimanche"};
int i = 2;
printf("Aujourd'hui, c'est %s !\n", JOUR[i]);
Application
Lesquelles des chaînes suivantes sont initialisées correctement ? Corrigez les
déclarations fausses et indiquez pour chaque chaîne de caractères le nombre
d'octets qui sera réservé en mémoire.
a) char a[] = "un\ndeux\ntrois\n";
b) char b[12] = "un deux trois";
c) char c[] = 'abcdefg';
d) char d[10] = 'x';
e) char e[5] = "cinq";
f) char f[] = "Cette " "phrase" "est coupée";
g) char g[2] = {'a', '\0'};
h) char h[4] = {'a', 'b', 'c'};
i) char i[4] = "'o'";
29