Vous êtes sur la page 1sur 29

08/10/2019

Introduction à l’Algorithmique

Etapes de résolution d’un problème en


informatique

1. Définition et analyse du problème


2. Ecriture d'un algorithme
3. Programmation de l'algorithme
4. Compilation du programme
5. Exécution et test du programme

1
08/10/2019

Algorithme, Programme, Logiciel


Algorithme
Un jeu de règles bien défini qu'il faut suivre pour obtenir la solution d'un problème dans un
nombre fini d'étapes. Un algorithme peut comprendre instructions algébriques,
arithmétiques, et logiques, et autres.

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.

Logiciel (Anglais : Software)


Mot inventé en 1967 par Philippe Renard pour remplacer le terme anglais "software".
Un logiciel est le produit final. C’est l’exécutable qu’on obtient après la compilation et le test
d’un programme. C’est le produit qui est commercialisé après un projet de développement
informatique. Le code source (le programme) n’est jamais fourni ou commercialisé.
Exp. : Logiciel d’emploi du temps.

Structure générale d’un algorithme

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

Les expressions, les opérations de lecture/


écriture
• L’action d’affectation qui permet d’affecter à une variable (enregistré
dans un emplacement mémoire) une valeur qui peut être donnée ou
calculée à partir d’une expression.

• L’action de lecture qui met en ouvre l’opération de lecture d’une


valeur à partir de l’entrée standard d’un ordinateur et de l’enregistrer
dans un emplacement mémoire.

• L’action d’écriture qui permet d’afficher, sur la sortie standard d’un


ordinateur, un résultat qui peut être alphabétique ou numérique.

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 {+, -, /, *}

Exemple d'action d’affectation : H ← (y/2) + x*3

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}

Exemple d'expressions logiques : (x < 6), Vrai, (x < 6) ET (y = 206) , non (x = y)


Exemple d'action d'affectation: Z ← (x < 6) ET (y = 206)

L'action de lecture ou d'entrée


Une action de lecture permet à l’utilisateur d’introduire des
informations pour effectuer un traitement par l’ordinateur.

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

L'action d'écriture ou de sortie


Une action d'écriture permet d’afficher des résultats sur un périphérique
de sortie (par défaut : l’écran).

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

Les traitements conditionnels

L’action conditionnelle simple


Forme 1 : Traduction en langage C:

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

L’action conditionnelle simple


Forme 2 : Traduction en langage C:

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

L’action conditionnelle à choix multiples


Selon <sélecteur> faire Traduction en langage C:
valeur 1 : action(s)
Switch (sélecteur)
valeur 2 : action(s)
{ case valeur 1 : action(s) ;
.... break;
valeur n : action(s) case valeur 2 : action(s) ;
break;
Sinon action (s) /* facultative
…..
Fin selon default: action(s) ;
break;
}

9
08/10/2019

Les traitements itératifs

L'action "Tant que"


Traduction en langage C:
Tant que condition faire
while (condition)
action(s)
{ action(s); }
Fin tant que

Tant que la condition fournit la valeur vrai, le bloc d’actions est


exécuté et on revient pour répéter la même chose. Si la condition
fournit la valeur faux alors c’est l’action qui suit l’action tant que
dans l’algorithme est exécutée.

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"

Pour compteur de valeur_initiale à valeur_finale [pas valeur] faire


action(s)
Fin 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];

Accès à une case:


T [i] désigne la case d’indice i dans le tableau T.

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.

Le traitement consiste à répéter la comparaison de l’élément X au contenu


d’une case i du tableau T jusqu’à ce qu’une égalité soit trouvée ; i varie entre
1 et N. Le processus s’arrête si :
• Pour un i dans l’intervalle [1..N], la condition X = T[i] est vérifiée. Dans ce
cas, la réponse est positive.
• La condition i > N est vérifiée, c’est à dire que tout le tableau a été
parcouru et la condition X = T[i] n’a pas été vérifiée, X n’apparaît pas dans
le tableau. La réponse est, dans ce cas, négative.

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

Tri par sélection


Le principe du tri par sélection (croissant) consiste à:
1. Comparer tous les nombres afin de sélectionner le plus petit
2. Echanger le plus petit élément trouvé avec le premier élément de
la liste
3. Refaire l ‘étape 1 et 2 en cherchant le plus petit élément dans la
sous liste sauf le premier élément puis on échange avec le second.
Et ainsi de suite… Ce processus est répété autant de fois que le
nombre d’élément de la liste moins un.

15
08/10/2019

Tri par sélection


Pour i de 1 à N-1 Faire
indmin ← i
Pour j de i + 1 à N Faire
Si (T[j] < T[indmin] Alors indmin ← j
FinSi
FinPour

Si (i<>indmin) Alors
TempT[i]
T[i]T[indmin]
T[indmin] Temp
FinSi

FinPour

Tri par insertion


Le principe du tri par insertion consiste :
à insérer un par un les éléments en les plaçant correctement:
1.) On insère le second élément du tableau dans sa place dans le sous tableau constitué du
1er élément
2.) on insère ensuite le 3 e élément du tableau dans sa place dans le sous tableau constitué
du 1e au 2 e éléments et ainsi de suite jusqu'au dernier élément.
de l’élément d’indice i allant de 2 à N :
Insérer l’élément d’indice i dans la sous liste d’indice j (j allant de 1 à i) de façon que cette
sous liste soit triée

trié Non trié

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 par insertion


pour i de 2 à N faire
v ← T[i]
j←i
inséré ← faux
Tant que (j >1 et inséré=faux) faire
Si (T[j-1] > v) alors
T[j] ← T[j-1]
j ← j-1
sinon
inséré ← vrai
Fin si
FinTantque
T[j] ← v
Fin pour

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.

Répéter le même parcours 1


jusqu'à ce qu'aucun échange ne soit nécessaire.

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
TempT[i+1]
T[i+1]T[i]
T[i] Temp
Finsi
FinPour
Jusqu'à (Echange =f aux)

Les tableaux
multidimensionnels

18
08/10/2019

Tableaux à 2 dimensions : Matrices


• Une matrice est un tableau à deux dimensions.
• Tableau à deux dimensions de 5 colonnes et 4 lignes. Une case i,j
correspond à la case de la ligne i et de la colonne j.

Tableaux à 2 dimensions : Matrices


• Déclaration :
Algo: nom_tableau:Tableau [1.. Nombre_lignes, 1.. Nombre_colonnes]: type
Langage C: type nom_tableau[nombre_lignes][nombre_colonnes];

Exp.: Algo : M : Tableau[1..4,1..5] : entier


M[1][1]  5
C: int M[4][5];
M[1][1] = 5;

19
08/10/2019

Tableaux à 2 dimensions : Matrices


Exp.: Algo :
Pour i de 1 à nombres_lignes faire
Pour j de 1 à nombres_colonnes faire
lire(M[1][1])
Fin pour
Fin pour
C:
for(i=0;i<nombre_lignes;i++)
for(j=0;j<nombre_colonnes;j++)
scanf("%d", &M[i][j]);

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

Procédures et fonctions :Types des paramètres formels

• Paramètres données (in): ils ne changent pas de valeur dans le sous


programme. Leurs valeurs sont plutôt utilisées.

• Paramètres résultats (out): ils n’ont une signification qu’après


l’exécution du sous programme.

• Paramètres données / résultats (in/out): ils ont une valeur avant


l’exécution du sous programme et qui peut changer après l’exécution.

Procédures et fonctions :Mode de passage des


paramètres
• Passage par valeur : (paramètres données) le paramètre formel
représente une variable locale au sous programme et tout
changement n’a pas d’effet sur le paramètre effectif.

• Passage par adresse : (paramètres données/résultats ou paramètres


résultats) le principe consiste à associer aux paramètres formels
l’adresse des paramètres effectifs. Toute modification apportée aux
paramètres formels affecte les paramètres effectifs. Les paramètres
passés par adresse sont précédés du mot clé Var.

23
08/10/2019

Procédures et fonctions :Mode de passage des


paramètres
Par valeur Par adresse
fonction fact (x :entier) : entier procédure fact (x :entier, var f: entier)
f , i : entier i : entier
Début Début
f1 f1
pour i de 2 à x faire pour i de 2 à x faire
ff*i ff*i
fin pour fin pour
retourner f retourner f
Fin Fin

Procédures et fonctions :Mode de passage des


paramètres
Par valeur Par adresse
void main() void fact (int x, int * R)
{int n, R; {int i,f;
printf("Saisir un entier"); f = 1;
scanf("%d",& n); for(i=2; i<=x; i++)
fact(n, &R); f = f * i;
printf(" %d! = %d", n, R); *R=f;}
}

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
}

Les chaînes de caractères

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.

• "x" est un tableau de caractères qui contient deux caractères:


la lettre 'x' et le caractère NUL: '\0'

• char CHAINE[] = {'S','a','l','u','t','\0'};


• char CHAINE[] = "Salut";
• char CHAINE[6] = "Salut";

• char CHAINE[5] = "Salut"; ➔ Erreur lors de l’éxécution


• char CHAINE[4] = "Salut"; ➔ Erreur lors de la compilation

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.

• Il est facile, de convertir des lettres majuscules dans des minuscules:


if (C>='A' && C<='Z') C = C-'A'+'a';
if (C>='a' && C<='z') C = C-'a'+'A';

Conversion
• Chaîne --> Nombre
Le symbole <s> est une chaîne de caractères

• Conversion de chaînes de caractères en nombres


atoi(<s>) retourne la valeur numérique représentée par <s> comme int
atol(<s>) retourne la valeur numérique représentée par <s> comme long
atof(<s>) retourne la valeur numérique représentée par <s> comme double

• Conversion de nombres en chaînes de caractères


itoa (<n_int>, <s>, <b>)

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

• strlen(<s>) fournit la longueur de la chaîne sans compter le '\0' final


• strcpy(<s>, <t>) copie <t> vers <s>
• strcat(<s>, <t>) ajoute <t> à la fin de <s>
• strcmp(<s>, <t>) compare <s> et <t> et fournit un résultat:
• négatif si <s> précède <t>
• zéro si <s> est égal à <t>
• positif si <s> suit <t>
• strncpy(<s>, <t>, <n>) copie au plus <n> caractères de <t> vers <s>
• strncat(<s>, <t>, <n>) ajoute au plus <n> caractères de <t> à la fin de <s>
• strstr((<s>, <t>) recherche <t> dans <s>

#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

Tableaux de chaînes de caractères


• Déclaration
char tableau_chaine[taille_tableau][taille_chaine];

• 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

Vous aimerez peut-être aussi