La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Introduction à l’informatique

Présentations similaires


Présentation au sujet: "Introduction à l’informatique"— Transcription de la présentation:

1 Introduction à l’informatique
Chapitre 1: Algorithmes et Programmes

2 Algorithmes et Programmes
Vie d'un programme Algorithme Programmation : le langage Exécution et test des programmes

3 Cycle de vie d'un programme (d'un logiciel)
Conception - Modélisation Analyse du problème Solution algorithmique langage d'algorithmes Programmation Programme langage de « haut niveau » Compilation – Interprétation Exécution sur machine langage machine de « bas niveau » assembleur et code machine Mise au point Vérification par test pour corriger Evaluation du coût pour optimiser

4 Cycle de vie d'un programme (d'un logiciel)
Conception - Modélisation Langage de description d'algorithme simplicité , précision indépendant de la programmation et de la machine Exemple : diagramme , pseudo C, ... Programmation Exécution

5 Cycle de vie d'un programme (d'un logiciel)
Conception - Modélisation Programmation Langage de programmation (langages « évolués ») syntaxe contraignante, différents styles d'abstraction indépendant de la machine Types de langages impératifs : Fortran, Cobol, Pascal, C fonctionnels : Lisp, ML, Caml logiques : Prolog objets : C++, Java Exécution

6 Cycle de vie d'un programme (d'un logiciel)
Conception - Modélisation Programmation Exécution Langage assembleur dépendant de la machine, du processeur Exemples : Assembleur pour PC (IA-32), PowerPC, MIPS, SPARC, etc.

7 L'entier N est-il pair ? Conception - Modélisation Analyse du problème
Un nombre N est pair si le reste de la division de N par 2 est nul Solution algorithmique 1. calculer le reste R de la division de N par 2 2. si R est égal à 0 alors N est pair 3. sinon N n'est pas pair

8 L'entier N est-il pair ? Programmation
Programme C main () {// début du programme principal int n ; printf("Donner un nombre n:") ; scanf("%d", &n) ; if ((n % 2) == 0) printf("%d est pair \n", n); else printf("%d n'est pas pair \n", n); } // fin du programme principal

9 L'entier N est-il pair ? Compilation - Codage load N modi 2 jzer P ...
9de3bfc0 a d 80a24000 …. 808a6001 load N modi 2 jzer P ... halt Assembleur Code machine

10 Algorithme () Recette, règle, mécanisme, procédé, procédure, méthode,
(=) Description d'une procédure de calcul par une suite d'étapes de calcul, d'actions (plus ou moins) élémentaires. Un algorithme n'est pas forcément destiné à décrire la solution d'un problème pour la programmation et l'informatique ... Un algorithme en cuisine s'appelle une recette Un algorithme en musique s'appelle une partition Un algorithme en tissage s'appelle un point

11 Algorithme (historique)
Les premières formulations de règles précises pour la résolution de certains types d'équations remontent aux Babyloniens (époque d'Hammurabi, (1800 avant J.C.). Depuis l'antiquité : algorithmes sur les nombres. Exemple : l'algorithme d'Euclide qui permet de calculer le p.g.c.d. de deux nombres entiers. Le mot algorithme est plus récent, il vient du nom d'un mathématicien perse du IXe siècle: Muhammad ibn Musa al-Khowârizmî. La signification du mot évolue au cours des temps : pratique de l'algèbre (d'Alembert, XVIIIe siècle) méthode et notation de toute espèce de calcul tout procédé de calcul systématique, voire automatique

12 Algorithme de la mousse au chocolat (6 p)
Ingrédients : 250g de chocolat, 125g de beurre, 6 œufs, 50 g de sucre, café Etapes : faire fondre le chocolat avec 2 cuillères d'eau ajouter le beurre laisser refroidir avant d'ajouter les jaunes d’œufs ajouter le sucre et comme parfum un peu de café battre les blancs en neige et les 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). L’abus de mousse au chocolat est déconseillé

13 Algorithme : un peu de méthodologie
identifier les données fournies / nécessaires (données en entrée) identifier le résultat (données en sortie) déterminer les actions ou opérations élémentaires spécifier l'enchaînement des actions langage d'algorithmes = langage de description des données, des actions et des enchaînements

14 Langage de description d'algorithmes
Algorithme titre % commentaire Lexique : variables // entrée : variables // sortie : variables // auxiliaire action : noms des opérations début liste d'instructions fin

15 Calculer le carré de N avec l'addition seule
Analyse N2 = N + N N N fois Algorithme Algorithme Calcul-Carré-par-Add Calcul du carré d'un entier Lexique : N entier // Entrée Carré entier // Sortie Action : + Initialiser Carré à 0 Faire N fois : Carré ← Carré + N

16 Variable Une variable est le nom d'un «récipient» destiné à contenir une valeur. Lorsque nous nous intéresserons un peu plus à l'ordinateur, le récipient sera une «zone» mémoire. Le type d'une variable sert à préciser la nature des valeurs acceptables par le récipient. Un type est un nom pour un ensemble de valeurs. Exemple : Carré est une variable de type entier. La valeur de (dans) Carré est un entier. La valeur de Carré ne peut être un caractère ou un réel

17 Affectation par une valeur
L'affectation variable ← valeur est une instruction qui permet de changer la valeur d'une variable. L'affectation modifie le contenu du récipient désigné par la variable. La valeur de la variable à gauche de ← est remplacée par la valeur à droite de ←. Exemple : Carré ← 0 « se lit » le récipient Carré reçoit la valeur 0. Avertissement L'affectation est une instruction qui est dite «destructrice». L'ancienne valeur de la variable est détruite, écrasée, effacée par la nouvelle valeur ! Carré ← N Copie de la valeur de N. La valeur de N (par exemple 7) existe en double

18 Affectation par une expression
L'affectation variable ← expression est effectuée par : 1. évaluation de l'expression 2. placement du résultat dans le récipient désigné par la variable à gauche. Attention A droite de ←, dans l'expression, les variables sont abusivement utilisées pour désigner les valeurs qu'elles contiennent. Ceci est une convention. Exemple : Carré ← Carré + N a pour effet de mettre le résultat de la somme de la valeur de Carré avec la valeur de N dans le récipient Carré.

19 Tester si N est un carré parfait
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 Action : + , * , , = Auxiliaire : I, J entier (* voir page suivante *)

20 Tester si N est un carré parfait
Début 1. I←0 Répéter 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

21 Algorithme = Abstraction de séquences de calcul
Calcul-Carré-par-Add pour N=0 Instruction Expression évaluée Valeur de carré 1. 2. Calcul-Carré-par-Add pour N=3 Instruction Expression évaluée Valeur de carré 1. 2. 3. Carré + N 3 6 9

22 Algorithme = Abstraction de séquences de calcul
Test du carré parfait (N=7) Instruction Expression évaluée Valeur de i Valeur de J Valeur de réponse 1 2 I*I 3 I+1 4 J  7 ? 9 5 J=N 5c faux Faux

23 Instruction conditionnelle
Si « condition » alors faire liste d'instructions sinon faire liste d'instructions Exemple : l'instruction 5 de l'algorithme Test-Carré-Parfait est une conditionnelle. Condition est une expression booléenne Exemple : Reprenons l'exécution de Test-Carré-Parfait pour N=7. La première évaluation de la condition J  7 produit la valeur booléenne «faux» donc les instructions 2. et 3. sont exécutées.

24 Algèbre de Boole Un ensemble  = {0, 1} muni de l'ordre total (0 < 1) et des opérations suivantes : Addition : x + y = max(x,y) Multiplication : x.y = min(x,y) Complémentation : propriétés l'addition et la multiplication sont commutatives 0 est élément neutre de l'addition 1 est élément neutre de la multiplication l'addition est distributive sur la multiplication et vice versa. Propriété des compléments :

25 Fonctions booléennes – tables de vérité
Une fonction booléenne f est une application de 2 dans  cas n=1. Il existe 4 fonctions booléennes de { 0, 1 } dans { 0, 1 } : l'identité, la complémentation et ... cas n=2. Il existe 24 fonctions booléennes de { 0, 1 }2 dans { 0, 1} x y f0 f1 f2 f3 f4 f5 f9 f13 f14 f15 1

26 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 V

27 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.

28 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 = gris ou cv = blanc) et div = 75 )

29 Langage de programmation C
#include <stdio.h> //bibliothèque main() { //entête const type nom = valeur ; // bloc déclaration type1 nom1, nom2 ; type2 nom3 ; instruction; //bloc d'instructions }

30 Syntaxe : symboles, mots, règles
symboles spéciaux [ ] \{ } . , ; : # =< > - * / ( ) ! mots réservés if else int char float double while for switch case, const etc. règles syntaxiques point virgule après chaque instruction accolade ouvrante au début { et fermante } à la fin de chaque fonction (y compris « main »), de chaque bloc d’instructions La syntaxe d'un programme est définie par une grammaire.

31 Autres règles Contraintes imposées par le langage
Toute variable apparaissant dans le bloc d'instructions doit être déclarée. Contraintes imposées par l'usage Tout programme doit être commenté ! Un commentaire est du texte encadré par des symboles de début /* et de fin */ ou une ligne commençant par // Ignoré lors des traitements du programme /* Tout l’algo repose sur la recherche du plus grand nombre premier après le carré parfait */ int i = 0; // sert d’indice dans la boucle

32 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

33 Types Généralités Avertissement
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 !

34 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.) TYPE Intervalle Codage unsigned char [0,255] 1 octet (= 8 bits) char [-128,127] 1 octet unsigned short [0, 65536] 2 octets short [-32768, 32767] unsigned int [0, ] 4 octets int [ , ]

35 Les types réels Pour manipuler les réels, C propose 2 types (d’autres existent) présentés dans la table ci-dessous Les opérateurs sur les réels sont l’addition +, la soustraction -, la multiplication *, la division /, les comparaisons (=, !=, >, >=, etc.) TYPE Intervalle Codage Chiffres significatifs float [-2-150, -2128], 0, [+2-150, +2128] 4 octets 7 chiffres décimaux double [ , ], 0, [ , ] 8 octets 15 chiffres décimaux

36 Type booléen Le type booléen n’existe pas en C.
Le booléen faux est représenté par l’entier 0, et le booléen vrai par tout entier différent de 0. Les opérations de comparaison produisent 0 quand la condition est fausse et 1 quand la condition est vraie. Les opérateurs sur les expressions booléennes sont le ET : &&, le OU : || et le NON : !

37 Type caractère Le type caractère n’existe pas de manière indépendante en C Les caractères sont représentés par des « char » correspondant au codage ASCII des caractères alphanumériques (lettres et chiffres), typographiques (ponctuation), etc. Les caractères sont entrés entre quotes ‘a’, ‘b’, …’0’…’9’, etc.

38 Déclarations de constantes
const type nom-constante valeur nom-constante est un identificateur qui sert à nommer une valeur. Une constante sert souvent à simplifier la lisibilité d'un programme. Le nom donné à la valeur correspondant à l'utilisation de cette valeur dans un contexte particulier (ici le programme). Exemples const float PI = ; // PI est la valeur const float euro 6.56; // euro est le réel 6.56 const int duo = 2; // duo est synonyme de 2 Avertissement Il est impossible de changer la valeur 2 : De la même manière il est impossible de toucher à la constante duo dans le programme !

39 Affectation nom-variable = expression ; sémantique Exemples
seule la notation change par rapport au langage algorithmique i←i+1 le type de l'expression à droite de = doit être identique au type de la variable à gauche Exemples I = 0 ; I = I + 1 ; res = (J = =I*I) ; // res = 1 ou res = 0 Attention : le compilateur C fait des conversions pour que la valeur affectée corresponde au type de la variable à gauche. Exemple : int n; float x=15.4; n=x; // Les deux types sont différents printf("n=%d :\n", n); // résultat affiché : n=15

40 Instructions d’entrée-sortie
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.

41 Instructions d’entrée-sortie
scanf ("FORMATS", liste de variables); Exemple scanf ("%d %d %d", &I, &J, &N) si l'utilisateur tape , 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 !

42 Instructions d’entrée-sortie
printf ("FORMAT", expression) printf ("FORMATS", liste d'expressions) permet d'afficher des valeurs (résultats de calcul)à l'écran. Exemple I =1 ; //la valeur de I est 1 printf("%d", I) ; //affichage de 1 à l'écran printf("%d", 5+7) ; //affichage de 12 à l'écran printf("valeur de I= %d", I) ; //affichage de valeur de I= 1 printf ("FORMAT \n", expression) affiche le résultat de l'évaluation de l'expression puis effectue un retour à la ligne (voir console)

43 Programmation en C du Test-Carré-Parfait
main() { ... printf ("Donnez l'entier a tester : \n"); scanf("%d", &N); // saisie de la valeur de N au clavier I = 1; // initialisation de I printf( "Oui la valeur que vous avez entré…"); } Avertissement Toute instruction est suivie d’un point virgule ;

44 Conditionnelle if (condition) instruction1 ;
Erreur a eviter : if (condition); instruction1 ; condition est une expression booléenne L'exécution de l'instruction globale évalue la condition si la condition est vraie, exécute l'instruction 1. Attention : si la condition est fausse, il ne se passe rien dans ce cas. Exemple N = 4 ; I=2; if (N==I*I) printf ("L'entier %d est un carré parfait", N); Affichage à l'écran de : L'entier 4 est un carré parfait

45 Conditionnelle if (condition) instruction1;
if (condition) instruction1; else instruction2; if (…); instruction1; EST TOUJOURS EXECUTE A CAUSE DU ; Permet d'introduire des branchements d'instructions. L'exécution de l'instruction globale évalue la condition si la condition est vraie, exécute l'instruction 1 sinon exécute l'instruction 2. 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); Affichage à l'écran de L'entier 5 n'est pas un carre parfait

46 % est le reste de la division entière
Conditionnelle if (condition) bloc-instruction1 else bloc-instruction2 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); else { N = N-1 ; printf ("%d est pair", N); } Affichage à l'écran : 4 est pair % est le reste de la division entière

47 Conditionnelle 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

48 Conditionnelle Exemple N=5 switch (N%2==0) {
case 1 : printf ("%d est impair", N) ; break; case 0 : printf ("%d est pair", N) ; break; } switch (C) { case ‘0’ : case ‘2’ : case ‘4’ : case ‘6’ : case ‘8’ : printf("%d est un chiffre pair" , C); break; case ‘1’ : case ‘3’ : case ‘5’ : case ‘7’ : case ‘9’ : printf("%d est un chiffre impair", C); break; default : printf ("%d n’est pas un chiffre", C);

49 Itération Une itération correspond à la répétition d'une séquence de calcul. Exemple : l'instruction 3. est itérée N fois dans l'algorithme du Calcul-Carré-par-Add Le nombre d'exécutions répétées de l'instruction 3 ne dépend pas des calculs effectués par l'instruction 3. Exemple : la séquence d'instructions [ ] est itérée dans l'algorithme Test-Carré-Parfait}. Le nombre d'exécutions répétées de [ ] dépend des calculs effectués par la séquence elle-même.

50 Itération : tant que Tant que (expression) fin tant que Attention
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. Exemple : calcul de factorielle entree : N entier ; sortie : Res entier ; ecrire (entrez N) ; lire (N); Res=1; Tant que (N>0) Res=Res*N; N=N-1; Fin tant que Exécution pour N=3, N=0.

51 Itération : Répéter… jusqu’à
Instructions jusqu’à (expression) 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 : calcul de factorielle entree : N entier ; sortie : Res entier ; ecrire (entrez N) ; lire (N); Res=1; répéter Res=Res*N; N=N-1 jusqu’à (N  0); Exécution pour N=3, N=0;

52 Itération : Pour Pour i allantde borne_inf à borne sup (par pas de 1) faire instructions Finpour Exemple : calcul de factorielle entree : N entier ; sortie : Res entier ; ecrire (entrez N) ; lire (N); Res=1; Pour i allant de 2 à N faire Res=Res*i Exécution pour N=3, N=0;

53 Itération Une écriture concise pour la répétition de blocs d'instructions Il existe 2 sortes d'itération : 1. Le nombre de répétitions est fixe faire N fois en C : for 2. Le nombre de répétitions n'est pas fixe Il dépend des calculs effectués par les instructions répétées si ... alors repartir en C : while ou do...while

54 Itération-while Le nombre de répétitions n'est pas fixe
while (condition) bloc-instruction; condition est une expression booléenne L'exécution de cette itération s'effectue par : 1. évaluation de la condition 2. si la condition est vraie alors exécution du bloc-instruction et repartir (recommencer) en 1. si la condition est fausse alors l'exécution est terminée. Tant que la condition est vraie, le bloc d'instructions est exécuté. A la sortie de la boucle, la condition est toujours fausse (… ne pas tester)

55 Itération - do...while Le nombre de répétitions n'est pas fixe
do liste-instruction while (condition); L'exécution de cette itération s'effectue par : 1.- exécution de la liste d'instructions 2.- évaluation de la condition 3.- si la condition est vraie alors repartir (recommencer) en 1. si la condition est fausse alors l'exécution est terminée. Exécuter la liste d'instructions tant que la condition est vraie et toujours au moins une fois !!!

56 Itération - do...while Exemple Main () { scanf("%d", &N); Res = 1;
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

57 Itération - for Le nombre de répétitions est fixe
for (expr1; expr2; expr3;) {bloc-instructions} L'exécution de cette itération s'effectue par : initialiser le compteur d'itération par expr1 Tant que la condition expr2 est vraie, exécuter le bloc d'instructions Le compteur est modifié par expr3 à chaque itération Utilisation typique (boucle pour du langage de description d’algorithme) for (i=0; i<N; i=i+1) {bloc-instructions} Remarque générale d'utilisation Veiller à ce que l'intervalle [début, fin] soit identifiable avant l'itération.

58 Itération - for Exemple scanf("%d", &N) ; res = 1 ;
for (I = 2; I <=N; I = I + 1) res = res * I ; printf("%d \n", res); Simulation de l'exécution (pour la saisie de 0 et pour la saisie de 5) Simulation par while scanf("%d", &N) ; res = 1 ; I = 2 ; while (I <= N) { res = res * I ; I = I + 1;} printf("%d", res);

59 Itération - for Exemple d'itération avec décrémentation
scanf("%d", &N) ; res = 1 ; for (I = N; I >=2; I = I - 1) res := res * I ; printf ("%d", res); Simulation de l'exécution pour la saisie de 0 et pour la saisie de 5 Remarque générale pour l'itération for, on peut mettre plusieurs autres variantes pour les expressions expr1, expr2 et expr3.

60 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

61 Programme Test-Carré-Parfait
#include <stdio.h> ; // bibliothèque main() { /* Test-Carré-Parfait : Ce programme vérifie si l'entier N est ou non un carré parfait */ int N, I, J ; // bloc déclaration printf ("Donnez l'entier à tester : "); scanf("%d", &N); // saisie de la valeur de N au clavier I = 0; // initialisation de I J = 0 ; while (J<N) { I = I+1 ; J = I * I ; } if (J == N) printf("%d est un carré parfait", N); else printf("%d n'est pas un carré parfait", N);

62 Autres prog. de Test-Carré-Parfait
main(){ // Test-Carré-Parfait ... I = 0; // initialisation de I do {J = I * I ; I = I+1 ;} while (J<N); } // enlever J de la déclaration I = -1; // initialisation de I do I = I+1 ; while (I * I <N); for (I=0; I*I<N; I=I+1); // BOUCLE AUTO-SUFFISANTE

63 Imbrication de boucles
Supposons que la multiplication soit interdite ! 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); La boucle « for » est imbriquée dans la boucle « do...while ».

64 Tableaux mono-dimensionnels
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];

65 Tableaux mono-dimensionnels
1 2 3 4 5 6 7 8 9 11 19 13 17 23 Définitions sur un exemple A chaque case i, le tableau fait correspondre un nombre premier Accessible par l'opération Tprem[i] On peut changer la valeur d'une case par Tprem[i]=valeur Le type des éléments (ici entier) peut être quelconque Attention : les compilateurs C ne vérifient pas que l’indice est compris dans l’intervalle défini à la déclaration du tableau. S’il n’est pas dans cet intervalle, il y a généralement erreur à l’exécution.

66 Tableaux mono-dimensionnels
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] = 29; // pas Tprem[10] !!! int i; for (i= 0; i < N; i = i +1) printf("%d \n", Tprem[i]); }

67 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); }

68 Tableaux mono-dimensionnels
Utilisation (suite) Le programme PremCar vérifie et affiche si 'a' est présent dans le tableau Tcar main(){ // programme PremCar const int N = 100; char Tcar [N]; int i ; 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"); }

69 Qualité d'un programme Le programme est-il une bonne traduction de l'algorithme ? Le programme produit-il toujours la solution du problème ? Le programme est-il performant ? Fait-il des actions inutiles ? Utilise-t-il des variables sans en avoir réellement besoin ? La validation, vérification, test de programme sont des tâches très complexes qui s'appliquent de façon beaucoup plus générale ... tout au long du cycle de vie du logiciel !

70 Test de programme - Trouver les fautes
Test statique (lecture attentive du texte du programme) le type des variables usage des variables Test dynamique (exécution du programme) 1. choisir un jeu de tests (les entrées à tester) test structurel (texte et structure du programme) test fonctionnel (spécification, algorithme) test aléatoire ou statistique 2. traitement/exécution du jeu de tests 3. analyse (dépouillement) des résultats du jeu de tests

71 Test structurel - Trouver les fautes
Impossible d'essayer toutes les valeurs possibles en entrée ! Un jeu de test est un ensemble représentatif de valeurs d'entrées permettant de générer tous les types d'exécution du programme : de couvrir toutes les instructions et enchaînements d'instructions Mini-exemple (1) scanf("%d", &I) ; " (2) if (I <= 10) (3) bloc1 " else (4) bloc2 ; - séquence valeurs test de I : -435 , 10" - séquence valeurs test de I : 832 Avertissement 0 est un entier particulier, mais ici ce n'est pas une valeur de test plus intéressante que -435 !

72 Un exemple plus élaboré
(1) scanf("%d", &I); scanf("%d", &J); K= 0; signe = 1; (2) if (I < 0) { (3) signe = -1 ; (4) I = - I; (5)} (6) if (J < 0) { (7) signe = -signe ; (8 ) J = - J; (9) } (10) while (I >= J) { (11) I = I - J ; (12) K = K+1; (13)} (14) K = signe * K; printf("%d", K) ;

73 Un exemple plus élaboré
jeu de tests séquence valeurs test : ... séquence valeurs test : ... séquence valeurs test : ... séquence valeurs test : ... séquence valeurs test : ... séquence valeurs test : ...

74 Test des conditions (1) if ( (I==0) || (I==36 )) (2) bloc1 else
Jeu de tests séquence 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.

75 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). Exemple (problème de l'arrêt) : Considérons la fonction booléenne à 2 arguments. Le premier argument est un programme C. Le deuxième argument est une entrée pour ce programme. Cette fonction vaut vraie si le programme s'arrête pour l'entrée donnée et faux sinon. Il est impossible d'écrire un algorithme (et un programme C) qui réalise cette fonction.

76 Complexité et coûts des algorithmes
Un problème peut avoir une solution algorithmique mais cet algorithme peut ne pas être raisonnable parce qu'il effectue un nombre très grand d'opérations. Exemple (programme de jeux): Jeu d'échec. A chaque étape, il existe un nombre fini de coups possibles. Donc il est possible d'explorer la suite du jeu pour chaque coup. Mais il faut examiner de l'ordre de 1019 coups pour décider de chaque déplacement.

77 Coût en temps d'un algorithme
unité de mesure : opération élémentaire identifier les opérations élémentaires 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 ...

78 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 ?

79 Algorithme d'Euclide Algorithme PGCD-2 //Calcul du pgcd de i et j
Entrée I, J : entier Sortie P : entier Auxiliaire K entier début tant que J > 0 faire K ← I mod J; I ←J ; J ← K ; P ← I; fin Nombre d'itérations ?


Télécharger ppt "Introduction à l’informatique"

Présentations similaires


Annonces Google