Algorithmique et langage c cours et exercices d’application
…
Critère algorithmique élémentaire
Une application courante ou un problème est automatisable (traitable par informatique) si
- Il est possible de définir et décrire parfaitement les données et les résultats de sortie
- Il est possible de décomposer le passage de ces données vers ces résultats en une suite finie d'opérations élémentaires dont chacune peut être exécutée par une machine
L'algorithmique est la transformation de la connaissance que l'humain possède sur un problème en actions élémentaires exécutées par l'ordinateur
Ensemble de règles opératoires dont l'application permet de résoudre un problème au moyen d'un nombre fini d'opérations (ou actions)
Exemple 1: Fabrication d'un pain la « machine » réalisant ces actions élémentaires n’est bien sur pas un ordinateur !
Entrées : farine, eau, sel, levure Sortie : pain cuit
Opérations séquentielles
De l’ algorithmes au programme :
Programme :
codage d’un algorithme afin que l’ordinateur puisse exécuter les actions décrites dans l’algorithme doit être écrit dans un langage « compréhensible » par l’ordinateur c’est un langage de programmation (Assembleur (micropro), C, Fortran, Pascal, Cobol ...)
A la conception d ’un ordinateur, est défini l ’ensemble des opérations élémentaires qu ’il peut réaliser. Ces opérations doivent être les plus simples possible pour diminuer la complexité des circuits électroniques. L ’ensemble des opérations élémentaires est appelé langage machine.
Un programme en "code-machine" est une suite d'instructions élémentaires, composées uniquement de 0 et de 1, exprimant les opérations de base que la machine peut physiquement exécuter: instructions de calcul (addition, ...) ou de traitement ("et" logique, ...), instructions d'échanges entre la mémoire principale et l'unité de calcul ou entre la mémoire principale et une mémoire externe, des instructions de test qui permettent par exemple de décider de la prochaine instruction à effectuer.
Voici en code machine de l'IBM 370 l'ordre de charger la valeur 293 dans le registre "3": 01011000 0011 00000000000100100100 charger 3 293
Ce type de code binaire est le seul que la machine puisse directement comprendre et donc réellement exécuter. Tout programme écrit dans un langage évolué devra par conséquent être d'abord traduit en code-machine avant d'être exécuté.
Algorithme programmation
Programme en langage évolué (exemple C) traduction
Programme en langage machine
Interprétation par l’Unité Centrale de traitement le traitement souhaité est réalisé
2001/2002 DEUG MIAS-MASS 1ère année - Ph. Huœl 68
-JN Provost - V Pagé
Importance des algorithmes :
- La calculabilité des algorithmes (convergence de l’algorithme) la méthode existe t’elle ?
- La complexité des algorithmes (nombre d’opérations nécessaires)
- L’efficacité des algorithmes (vitesse des algo: raisonnable) Temps d’exécution et taux d’occupation de la mémoire centrale
Exemple: Calcul de la circonférence d'un cercle de r=12
Ici la « machine » réalisant les opérations élémentaires est un ordinateur !!
Analyse : il faut connaître la valeur de r, calculer 2ð r, afficher le résultat
Solution 1:
algorithme Programme C
DEBUT
Écrire (2*3.14159*12) FIN #include <stdio.h> int main (void)
{ printf(" %10.5f\n ", } 2*3.14159* 12) ;
Solution 2:
Réel : x #include <stdio.h>
DEBUT int main (void)
Lire (x) {
Écrire (2*3.14159*x) double x ;
FIN printf("tapez la valeur du rayon\n") ; scanf(" %f ",&x) ;
printf(" %10.5f\n ", 2*3.14159*x) ;
}
Solution 3:
Réel : rayon, Pi,Perimetre #include <stdio.h>
DEBUT int main (void)
Pi=3.14159 {
Écrire ('Entrer la valeur du rayon:') double Rayon,Pi , Perimetre ;
Lire (rayon) /* lecture du rayon */
Perimetre<- 2*Pi*rayon printf(" tapez la valeur du rayon\n") ;
Écrire ('la circonférence du cercle est',Perimetre) scanf(" %f ",&Rayon) ;
FIN /* initialisation de Pi /*
Pi=3.14159 ;
/* calcul du perimetre et écriture */
Perimetre=2*Pi*Rayon ;
printf("%10.5f\n", Perimetre) ;
}
Méthodologie simple
- Analyse méthodique descendante
Si le problème est trop complexe, le décomposer en sous-problèmes, et appliquer, pour chacun, la méthodologie simple
Décomposition du problème = description de + en + détaillée du problème = ensemble d'opérations élémentaires traductibles en langage de programmation
Langage algorithmique
- Données :valeur introduite par l'utilisateur (au clavier ou dans un fichier)
- Constante : identificateur dont la valeur, utilisée dans le programme, ne change pas lors de l'exécution (par ex. ð )
- Variable: identificateur dont la valeur, utilisée dans le programme, peut changer lors de l'exécution (par ex. rayon d'un cercle)
Cette variable se référe à un emplacement précis en mémoire centrale
Il est indispensable de:
- Définir la nature des données, constantes et variables
- Choisir les identificateurs les plus appropriés
- Pouvoir référencer tous les genres de valeurs (entier,reel,caractére...)
Ainsi une variable a un nom fixe (identificateur de variable)
Un type de contenu fixe ( caractere, entier, reel....)
Par contre son contenu peut varier au cours de l’éxécution du programme
L'échange de données entre programme et utilisateur pour recevoir de l'information de l'extérieur
- Lire (x) où x est une variable qui va prendre la valeur donnée par l'utilisateur au clavier
Écrire : pour fournir de l'information à l'extérieur
- Écrire (x) : la valeur contenue dans la variable x sera affichée
- Écrire ('Bonjour') : Bonjour sera écrit à l'écran
L'affectation : Opération qui consiste à attribuer une valeur à une variable notée :
variable <-- valeur Exemples:
x <-- 1.2 (x prend la valeur 1.2) x
n <-- 2+8 (n prend la valeur 10) n
i <-- i+1 (i est incrémenté de 1) i
ECRITURE D’ALGORITHMES :
Opérateurs arithmétiques :
+, -, *, /
- Exemple : x <- x-6; surface <- pi*sqr(rayon)
Opérateurs logiques
-Sur variables booléennes ou logiques : vrai/faux, 1/0, oui/non
- La structure de séquence
suite d’opérations (instructions) éxécutées dans l’ordre...Le paquet peut être precedé de DEBUT et suivi de FIN
- La structure de sélection simple
SI condition ALORS expression1 SINON
expression2
FINSI
Recherche du Max de A et B:
Entrées : réel: A, B #include <stdio.h>
Sortie : réel : max int main (void)
DEBUT {
ECRIRE(« donnez A et B ») double A,B,max ;
LIRE(A,B) /* lecture données */
printf(" tapez les valeurs de A et B\n") ;
SI A>B ALORS scanf(" %lf,%lf " , &A , &B ) ;
max <- A /* calcul du maximum */
SINON if (A > B)
max<- B max = A;
FINSI else
max = B;
ECRIRE(« Le maximum est»,max) /* écriture*/
FIN printf(" le max de %lf et %lf est %lf\n ",A,B,max);
}
Exercice : Dérouler et comprendre l’algorithme et le programme en langage C suivants : Pour les entrées 100.4 , 56 puis - 24.2 , 2.12 puis 3 , 3
Entrées : réel: A, B #include <stdio.h>
Sortie : réel : max int main (void)
DEBUT {
ECRIRE(« donnez A et B ») double A,B,max ;
LIRE(A,B) /* lecture données */
printf(" tapez les valeurs de A et B\n") ;
SI A>B ALORS scanf(" %lf,%lf " , &A , &B ) ;
max <- A /* calcul du maximum */
SINON if (A > B)
Max <- B max = A;
FINSI else
max = B;
ECRIRE(« Le maximum est»,max) /* écriture*/
FIN printf(" le max de %lf et %lf est %lf\n ",A,B,max);
}
Exercice : écrire un algorithme permettant de faire le calcul suivant :
En entrée on a deux entiers x et y , et le programme produit la sortie suivante : x+y si x >=y et 2*x +2*y si x<y répétitions (nombre connu)
POUR variable DE valeur1 À valeur2 FAIRE Expression
FINPOUR
Pour calculer Xn (n >0) et stocker le résultat dans Y:
Entrées : réel : X, entier : n #include <stdio.h>
Sorties : réel : Y int main (void)
Variables : entier : i {
DEBUT double X,Y; int n , i ;
Lire (X,n) /* lecture de X et n */
printf(" tapez les valeurs de X et n \n") ;
Y=1 scanf("%lf,%d", &X , &n) ;
POUR i DE 1 À n FAIRE /* calcul de X à la puissance n /*
Y = Y * X Y=1.0 ;
FINPOUR for ( i=1,(i<n),i=i+1)
Y = Y * X;
Écrire (X, 'puissance', n, 'vaut', Y) /* resultat */
FIN printf(" %lf puissance %d vaut %lf \n ", X , n ,Y ) ;
}
Pour calculer la moyenne de 16 notes:
#include <stdio.h> int main (void)
{
Entrées : réel : Note double note , moyenne , somme ;
Sorties : réel : Moyenne int i ;
Variables : réel : Somme, entier : i /* initialisation de la somme */ somme = 0.0 ;
DEBUT
Somme=0 /* calcul de la somme */
POUR i DE 1 À 16 FAIRE for ( i=1,(i<16), i=i+1)
Lire (Note) {
Somme = Somme + Note /* lecture de la note courante */
FINPOUR printf(" donnez la note numéro %d \n ",i) ;
Moyenne = Somme / 16 scanf("%lf",,¬e) ;
Écrire ('La moyenne des 16 notes vaut', /* ajout de la note à somme */
Moyenne) somme = somme + note;
FIN }
/* resultat et sortie du resultat */ moyenne = somme /16 ;
printf(" la moyenne est %lf \n",moyenne) ;
}
La boucle TANT QUE: structure répétitive, nombre de répétition inconnu
TANT-QUE condition FAIRE expression
FINTANTQUE
La boucle REPETER...TANTQUE : structure répétitive, nombre de répétition inconnu
REPETER REPETER
Expression peut s’écrire Expression
TANTQUE condition JUSQUA condition opposée
Exemple
Pour calculer Xn (n >0) et stocker le résultat dans Y:
Entrées : réel : X, entier : n #include <stdio.h>
Sorties : réel : Y int main (void)
Variables : entier : i {
double X,Y; int n , i ;
DEBUT /* lecture de X et n */
Lire (X , n) printf(" tapez les valeurs de X et n \n") ; scanf("%lf,%d",&X, &n) ;
Y = 1 i = 1 /* calcul de X à la puissance n /*
TANTQUE i <= n FAIRE Y=1.0 ;
Y = Y * X i=1;
i = i+1 while (I <= n)
FINTANTQUE {
Écrire (X, 'puissance', n, 'vaut', Y) Y = Y * X;
FIN i=i+1;
}
/* resultat */
printf(" %lf puissance %d vaut %lf \n ", X ,n , Y ) ;
}
Entrées : réel : X, entier : n Sorties : réel : Y #include <stdio.h> int main (void)
Variables : entier : i {
double X,Y; int n , i ;
DEBUT /* lecture de X et n */
Lire (X , n) printf(" tapez les valeurs de X et n \n") ; scanf("%lf,%d",&X, &n) ;
Y = 1 i = 1 /* calcul de X à la puissance n /*
REPETER REPETER Y=1.0 ;
Y = Y * X Y = Y * X i=1;
i = i+1 i=i + do
TANTQUE i <= n JUSQUA i > n {
Écrire (X, 'puissance', n, 'vaut', Y) FIN Y = Y * X; i=i+1;
}
while (i <= n)
/* resultat */
printf(" %lf puissance %d vaut %lf \n ", X ,n , Y ) ;
}
Exemple 2 Pour obliger l'utilisateur à entrer n>0 dans le calcul de Xn et éviter un échec.
algorithme Programme C
Entrées : réel : X, entier : n
Sorties : réel : Y
Variables : entier : i
DEBUT
Lire (X)
LIRE(n)
TANTQUE NOT(n > 0) FAIRE
Ecrire ('Le nombre n'est pas strictement positif!!')
Ecrire ('Entrer un nombre positif non nul:')
Lire (n)
FINTANTQUE
Y = 1
i = 1
TANTQUE i <= n FAIRE
Y = Y * X
i = i+1
FINTANTQUE
Écrire (X, 'puissance', n, 'vaut', Y)
FIN #include <stdio.h>
int main (void)
{
double X,Y; int n , i ;
/* lecture de X et n */
printf("tapez la valeur de X \n") ; scanf("%lf",&X) ;
printf(" tapez la valeur de n \n") ; scanf("%d",&n) ;
while ( !(n>0) )
{
printf(" le nombre tapé n’est pas strict positif ! \n") ;
printf("retapez un nombre correct!!! \n ") ;
scanf("%d",&n) ;
}
/* calcul de X à la puissance n /*
Y=1.0 ; i=1;
while (I <= n)
{
Y = Y * X; i=i+1;
}
printf(" %f puissance %d vaut %f \n ", X ,n , Y ) ; }
algorithme Programme C
Entrées : réel : X, entier : n Sorties : réel : Y Variables : entier : i
DEBUT Lire (X)
REPETER
Ecrire ('Entrer un nombre positif non
nul:')
Lire (n)
TANTQUE n >= 0
Y = 1
i = 1
TANTQUE i <= n FAIRE
Y = Y * X
i = i+1
FINTANTQUE
Écrire (X, 'puissance', n, 'vaut', Y)
FIN #include <stdio.h>
int main (void)
{
double X,Y; int n , i ;
/* lecture de X et n */
printf(" tapez la valeur de X \n") ; scanf("%lf",&X)
do
{
printf(" tapez la valeur de n \n") ;
scanf("%d",&n) ;
}
while (n <= 0 )
/* calcul de X à la puissance n /*
Y=1.0 ;
i=1;
while (I <= n)
{
Y = Y * X;
i=i+1;
}
/* resultat */
printf(" %f puissance %d vaut %f \n ", X ,n , Y ) ;
} ;
Exercice
écrire un algorithme permettant de faire le calcul suivant :
En entrée on a six entiers sexe, an_nais, mois_nais, dept_nais, x et y représentant le numéro de
sécurité sociale de l’utilisateur ( par exemple 1, 46, 04, 97, 129, 132) , et le programme produit les sorties suivantes :
« Bonjour monsieur » si c’est un homme et « Bonjour madame » si c’est une femme
« Tu es bien petit » si son age est inférieur ou égal à 6 ans
« que fais tu la a ton age » si il a entre 6 et 16 ans
« bonjour pépé » si il a plus de 16 ans
« bonjour la Guadeloupe » si dept_ nais vaut 97 et que x est un nombre commençant par 1
écrire ensuite le programme C correspondant
rappel : entier / entier donne le quotient de la division entière
Exercice
Faire un algorithme et le programme en C correspondant qui lit 20 notes et calcule deux moyennes , la moyenne des notes supérieures ou égales à 10 et la moyenne des notes inférieures à 10