860 likes | 1.05k Views
David TADDEI. ALGORITHMIQUE ET PROGRAMMATION C. Plan du Cours. Introduction Notions d’algorithmique (algèbre de Boole…) Eléments de base du langage C (types, variables…) Tests, itérations… Fonctions Récursivité Algorithmes : complexité, tris... Gestion dynamique de la mémoire
E N D
David TADDEI ALGORITHMIQUE ET PROGRAMMATION C
Plan du Cours • Introduction • Notions d’algorithmique (algèbre de Boole…) • Eléments de base du langage C (types, variables…) • Tests, itérations… • Fonctions • Récursivité • Algorithmes : complexité, tris... • Gestion dynamique de la mémoire • Listes, piles, arbres... • Fichiers
Introduction • Fiabilité : Validité et Robustesse • Efficacité • Maintenance, Evolutivité • Modularité • Réutisabilité (partielle ou totale) • Compatibilité • Portabilité • Ergonomie • Intégrité
Introduction Cahier des charges Modélisation Algorithmes Implémentation
Notions d’algorithmique • Ensemble des activités logiques qui relèvent des algorithmes (science des algorithmes) • un algorithme est un énoncé dans un langage bien défini d’une suite d’opérations permettant de résoudre par calcul un problème • types d’algorithmes : • séquentiel • parallèle • distribué
Notions d’algorithmique • Variable • Un identifiant • Un type (entier, réel, booléen, caractère, chaîne de caractères, tableaux) avec des opérations associées • Une valeur (information)
Notions d’algorithmique • Instruction • traitement(s) portant sur les variables • Affectation, condition, boucles • Fonction • Algorithme autonome réalisant une tâche précise • Accepte des paramètres, retourne une valeur • Contient une Entête (prototype)
fonction somme (n:entier,tab:tableau entier[0..n-1]) : entier début s<-0 pour i de 0 à (n-1) faire s <- s+tab[i] fpour retourne s fin Lexique : - n : entier, nombre d'entiers - tab : tableau entier[0..n-1] - s : entier, somme temporaire Algorithme début nb <- lire () si (nb>0) alors remplir (nb,t) ; écrire (somme(nb,t) ; fsi fin Lexique : - t : tableau entier[0..n-1] - nb : entier, nombre d'entiers
Notions d’algorithmique Définition du problème Décomposition en sous problèmes Recensement des variables Ecriture de l’algorithme Test de l’algorithme Ecriture du programme Test du programme
Algèbre de Boole • Georges Boole (1815 – 1864), mathématicien anglais • Algèbre traduisant des signaux en expressions mathématiques • Algèbre de la pensée s’appuyant sur une logique binaire • Un signal : variables logiques • Un traitement : fonctions logiques
Fonctions logiques de base • Variable logique : entrée binaire • Fonction logique : plusieurs variables logiques en entrée et sortie • Porte : fonction logique de base • OU : OR : + (expression algébrique) • ET : AND : . • OU EXCLUSIF : XOR : • NON : NO : /A,
Table De Vérité
Algèbre de Boole • Egalité : 0 = 0 ; 1 = 1 • Négation : /0 = 1 ; /1 = 0 • Multiplication : A.B
Lois de composition (règles logiques) • Associativité : • (A.B).C A.(B.C) • (A+B)+C A+(B+C) • Absorption : • A.(A+B) A • A+(A.B) A • Commutativité : • A.B B.A • A+B B+A • Distributivité : • A+(B.C) (A+B).(A+C) • A.(B+C) (A.B)+(A.C) • Idempotence : • A.A A • A+A A
Lois de composition (règles logiques) • Identité : • 1.A A • 0+A A • Inversion : • A./A 0 • A+/A 1 • Nullité : • 0.A 0 • 1+A 1 • Théorème de Morgan : • /(A.B) /A+/B • /(A+B) /A./B
Exemple de circuit • Additionneur : A + B • En arithmétique binaire : S = A B ; R = A.B
Petit panorama des langages Source : http://developpeur.journaldunet.com
Critères pour le choix d’un langage • Clarté • Spécificité • Ouverture • Ancienneté • Popularité
Genèse du C • 1972 : mis au point dans les laboratoires BELL en même temps qu’UNIX ; basé sur Algo -> BCPL -> B • 1989 norme ANSI C (ou C89) puis C99… la dernière date de 2003 Kenneth Thompson et Dennis Ritchie
Avantages • Simplicité • Possibilités • Performances (compilé ; très proche du processeur) • Très utilisé (notamment dans le monde Unix) • Portabilité • Légèreté (noyau très simple)
Inconvénients • il est très facile d’écrire du code illisible • Bonne maîtrise des pointeurs requise • pas de « garde-fous » • Mise au point plus délicate pour les programmes faisant intervenir des données complexes (bibliothèques) => C++
C’est du C ! main(void) { int x=3,n,m=2,*t,*a,*b=0; while(b?o:((*(t=b=(int*)malloc(o))=2),a=t+1,o))n=*b,n>=m?c:x%n?(int)b++:N); }
Compilateurs C • GCC : Gnu Compiler Collection • Dev C++ • Borland C++ Builder (Kylix) • Visual Studio, .Net • Et aussi : compilateurs de Watcom, Symantec
Eléments de base du langage C • Structure générale d’un programme • Considérations lexicales : Mots-clés, Identificateurs • Commentaires • Variables • Types de base • Constantes • Chaînes de caractères • Constantes nommées : #define, Enumérations • Opérateurs usuels • Instructions • Fonctions • Objets structurés : Tableaux, Structures • Directives du Préprocesseur • Bibliothèque standard
Programme minimal #include <stdio.h> int main(void) { /* affichage d’un texte */ printf ("Hello World\n"); return 0; }
Génération du programme • Préprocesseur • Compilation • Assemblage • Edition de liens Editeur de liens Code C Compilateur Code machine
Autre exemple de programme #include <stdio.h> #define TVA 0.196f void main () { float fPrixHT , fPrixTTC ; puts ("Veuillez entrer le prix H.T. :"); scanf ("%f",&fPrixHT); fPrixTTC = fPrixHT*(1+TVA) ; printf ("Voici le prix T.T.C. : %f €\n",fPrixTTC); }
Généralités • Structure d’un programme : • Directives de compilation, déclarations globales (variables, types, fonctions), fonctions • Une fonction : entête, bloc • Un bloc : déclarations locales, instructions
Considérations lexicales • Commentaires • Identificateurs • Séparateurs • Mots-clés
Types de base du C • Entier : int, long, short • Réel : float, double • Caractère : char
Types de base du C • char 8 bits Caractère • short 16 bits Nombre entier signé • int 16, 32 bits Nombre entier signé • long 32 ou 64 bits Nombre entier signé • float 32 bits Nombre flottant • double 64 ou 80 bits ou plus Nombre flottant sizeof : taille d'un type ou variable Rappel : 2^8 = 256
Typedef • typedeftype-declaration synonym ; • Exemple : définition du type byte
Définition de variables <type> <identificateur>[,<identificateur>,...]; Les tableaux statiques int tiTab2D[4][3]; int iTableau[] = {2,-1,3}; comment stocker une image 320x200 en 256 couleurs ? Les chaînes de caractères char chaine[taille]; char chaine[] = ‘texte‘ ; char chaine[] = {‘t',‘e',’x’...} le dernier caractère est '\0' premier indice : 0
Variables • Visibilité des variables • Variables statiques • static int count = 0 ; • Variables constantes et volatiles (ne figurent pas dans le C d’origine) • Variables externes
Variables : portée Programme Programme
Variables int i = 3; /* i est accessible de tous les fichiers */ const int j = 5; /* Synonyme de static const int j = 5; */ extern const int k; /* déclaration de la variable k... */ const int k = 7 ; /* définition. */
Opérateurs • Arithmétiques : +, -, *… • Relation : ==, <, >=… • Logique : !, &&, ||… • Affection : = • Condition : <exp1>?<exp2>:<exp3>
Opérateurs simples • Lvalue : adresse, type, valeur • ne sont pas des Lvalue : constantes, tableaux, fonctions • Rvalue : type, valeur
Opérateurs simples • () : appel de fonction • [] : indexation • . : sélection dans une structure • -> : sélection dans un objet pointé • ! : négation • ~ : négation bit à bit • - : moins unaire • * : indirection (accès à un objet pointé) • & : adresse d’une variable
Symboles composés • ++ : pré et post incrémentation • Opérateurs arithmétiques • Opérateurs d’affectation • Comparaisons
Symboles composés • >> et << : décalage de bits • & | ^ : opérateurs de bits • Connecteurs logiques : &&, || • Expression conditionnelle ? :
Ordre de priorité =>Mettre des parenthèses !!
Exemples • x=(7+6)%5/2; • x = 10 ; x *= y = z = 4 ; • x=1 ; y = x++ ; z = ++x ; • x=0;x++;++x; • x=y=z=0 ; x += y += 5 * ++ z ; • x=y=0;z=2;x = x && y || z ; • x = 1 ; y = 3 ; z = ( x < y ? x++ + ++y : 0 ) ;
Exemples • x=(7+6)%5/2=((7+6)%5)2=(13%5)/2=3/2; • = 1 si x est de type entier • = 1.5 si x est de type flottant et / 2.0f • y = 4 ; z = 4 ; x = x * 10 ; • x=1 ; y = x = 1 ; x++ ; x++ ; z = x =3 ; • x=x+1=1;x=x+1=2; • z=z+1=1; y = y + 5 * z = 5 ; x = x + y = 5; • x=(x && y) || z = 0 || 2 = 1 ; • x=x+1=2 ; z = x + y = 5 ; y = y + 1 = 4 ;