Compléments de programmation et...
Transcript of Compléments de programmation et...
Compléments de programmation et d’algorithmiqueCours 1:
IntroductionLangage C
J. Roland
Quantum Information & Communication
INFO-H-304 2020-2021 1 / 52
Aujourd’hui
1 IntroductionAvant le premier coursOrganisation du coursSupports de cours
2 Langage CIntroductionSyntaxe d’un programme C
3 Annexe : Types de données et impression formatée
4 Annexe : structures de contrôle
INFO-H-304 2020-2021 2 / 52
Plan
1 IntroductionAvant le premier coursOrganisation du coursSupports de cours
2 Langage CIntroductionSyntaxe d’un programme C
3 Annexe : Types de données et impression formatée
4 Annexe : structures de contrôle
INFO-H-304 2020-2021 3 / 52
L’Université Virtuelle
ConseilInscrivez-vous dès à présent sur l’UV !
Si inscription au BA3 en ordre : automatique
Sinon : possibilité d’inscription manuelle
Pas d’accès à l’UV? Voir page web du service QuIC
Répondez aux questions suivantes :Cours à distance ou en présentielOption Informatique ou Biomédical
Pourquoi l’UV?Slides des cours théoriquesEnoncés et corrigés des TPsCode de base pour cours théoriques et TPsNombreux liens vers ressources en ligneInstructions pour la machine virtuelle
INFO-H-304 2020-2021 4 / 52
Machine virtuelle
Une machine virtuelle, c’est quoi?Une machine virtuelle est une simulation (ou plus exactement une émulation) d’unordinateur (invité) par un autre ordinateur (hôte).
ExempleSystème invité Linux sur système hôte Mac OS
INFO-H-304 2020-2021 5 / 52
Machine virtuelle
Une machine virtuelle, pourquoi?Aux cours théoriques : pour directement tester des bouts de code
Aux TPs : pour effectuer les exercices sur votre propre ordinateur
A la maison : pour réviser
ExempleSystème invité Linux sur système hôte Mac OS
INFO-H-304 2020-2021 6 / 52
Installation
Démarrage rapide
1 Téléchargez et installez VirtualBox (y compris le Extension Pack)
2 Téléchargez l’image de la machine virtuelle :padi-vm.ova ou padi-vm.ova (lien alternatif)
3 Ouvrez ce fichier avec VirtualBox pour importer la machine virtuelle
Instructions détaillées
Voir : Université Virtuelle
Ou : Page web du service QuIC
INFO-H-304 2020-2021 7 / 52
Plan
1 IntroductionAvant le premier coursOrganisation du coursSupports de cours
2 Langage CIntroductionSyntaxe d’un programme C
3 Annexe : Types de données et impression formatée
4 Annexe : structures de contrôle
INFO-H-304 2020-2021 8 / 52
Organisation du cours
Compléments de
ProgrammationI Langage CI Langage C++
AlgorithmiqueI Introduction, algorithmes de triI Analyse de base des algorithmesI Structures de donnéesI Stratégies algorithmiques
Séances d’exercices (en salle informatique) : 12x2h
Projet : seconde moitié du quadrimestre
4x2h
8x2h
INFO-H-304 2020-2021 9 / 52
Charte du cours
Responsabilités partagéesEnseignants :
I Préparer et donner les cours de manière consciencieuse et didactiqueI Se tenir disponible pour répondre aux questions pertinentes des étudiantsI Etre ouvert à tout commentaire ou critique constructive
Etudiants :I Assister et participer activement aux cours et TPsI Rendre un projet respectant le cahier des chargesI Réviser le cours et les exercices avant l’examen
Si chacun remplit sa part du contrat
Vous aurez acquis de nouvelles compétences
Tout en validant le cours !
INFO-H-304 2020-2021 10 / 52
Evaluation
Evaluation continue : 5 points
Projet
Evaluation finale : 15 pointsExamen oral
I Question de programmation (5 points)I Question d’algorithmique (10 points)
AttentionPour valider le cours il faut valider l’examen oral et le projet
Echec global si l’un des deux est en échec
INFO-H-304 2020-2021 11 / 52
Plan
1 IntroductionAvant le premier coursOrganisation du coursSupports de cours
2 Langage CIntroductionSyntaxe d’un programme C
3 Annexe : Types de données et impression formatée
4 Annexe : structures de contrôle
INFO-H-304 2020-2021 12 / 52
Supports de cours
Pas de syllabus mais...
De nombreux autres supports de cours
Slides
Livres de référence
Ressources en ligne
Podcast des cours et TPs
Tutoriels vidéos
etc.
INFO-H-304 2020-2021 13 / 52
Slides
Disponibles sur l’Université Virtuelle
Mis en ligne sur l’UV au plus tard la veille de chaque cours
Liste de références à la fin des slides de chaque cours :
INFO-H-304 2020-2021 14 / 52
Livres
... et beaucoup d’autres
INFO-H-304 2020-2021 15 / 52
Ressources en ligne
MIT OpenCourseWare : http://ocw.mit.edu
C Programming and C++ Programming : http://www.cprogramming.com/
... et beaucoup d’autres
INFO-H-304 2020-2021 16 / 52
Plan
1 IntroductionAvant le premier coursOrganisation du coursSupports de cours
2 Langage CIntroductionSyntaxe d’un programme C
3 Annexe : Types de données et impression formatée
4 Annexe : structures de contrôle
INFO-H-304 2020-2021 17 / 52
Bref historique
1972 Développement initial du CI Par K. Thompson et D. Ritchie, à AT&T Bell LabsI Intimement lié au développement de Unix
1978 “K&R C”I 1ère édition de The C programming language par Kernighan et RitchieI Spécification informelle du langage
1989 ANSI-C ou C89I Standardisation par la American National Standards InstituteI 2ème édition de The C programming language par Kernighan et Ritchie
1990 C90I Certification ISOI Equivalent à ANSI-C / C89
... C99, C11, C18
INFO-H-304 2020-2021 18 / 52
Caractéristiques du C
Le C est un langageimpératif
I cf Python et Java
compiléI cf Java
pas orienté objetI contrairement à Python, Java,. . . et C++
à gestion de mémoire manuelleI Pas de ramasse-miette (garbage collector) comme en Python et Java !
simple !
Pourquoi utiliser le C?
Vitesse
Mémoire
Fonctionnalités de bas-niveau (OS, pilotes)
INFO-H-304 2020-2021 19 / 52
Gestion de la mémoire
Niveaux d’abstraction :
Gestion automatique : Python, Java
Accès à la mémoire : C, C++
Manipulation directe de la mémoire : Assembleur
Types de mémoire :Zone statique :
I Variables statiques et globales
Mémoire pile (stack )I Variables localesI Remplie/vidée quand fonction lancée/terminée
Mémoire tas (heap)I Allouée dynamiquementI Exemple : Objets en Java/Python bas
haut
Pile
Libre
Tas
Zone statique
INFO-H-304 2020-2021 20 / 52
Accès à la mémoire tas
Mémoire tas :
Peut être vue comme une grande table
Chaque octet : adresse↔ contenu
Le programme entier y a accès
Accès via “pointeurs”
Exemple : Mémoire contenant
une chaîne de caractère “Hello”
un entier 214
Que se passe-t-il si :
On veut allonger “Hello” en “Hello, world” ?
On n’a plus besoin de la chaîne?
On lit/écrit à une adresse quelconque?
Adresse Contenu
.
.
....
0x6C0A2BF0 ’H’
0x6C0A2BF1 ’e’
0x6C0A2BF2 ’l’
0x6C0A2BF3 ’l’
0x6C0A2BF4 ’o’
0x6C0A2BF5 ’\0’
0x6C0A2BF6
0x6C0A2BF7214
.
.
....
INFO-H-304 2020-2021 21 / 52
Allocation dynamique de mémoire
But :permettre au programme
I de désigner des bouts de mémoire comme “utilisés”I d’y stocker et manipuler des donnéesI de libérer ces bouts de mémoire quand ils ne sont plus nécessaires
Implémentation en CLa bibliothèque standard du C (standard library stdlib.h) fournit lesfonctions
I malloc : pour allouer de la mémoireI free : pour libérer cette mémoire
INFO-H-304 2020-2021 22 / 52
Plan
1 IntroductionAvant le premier coursOrganisation du coursSupports de cours
2 Langage CIntroductionSyntaxe d’un programme C
3 Annexe : Types de données et impression formatée
4 Annexe : structures de contrôle
INFO-H-304 2020-2021 23 / 52
Le classique “Hello, world”
Soit le fichier hello.c
1 #include <stdio.h>2
3 int main()4 {5 /* Affiche le texte ‘‘Hello, world’’ */6 printf("Hello, world\n");7 return 0;8 }
hello.c
Compilation : gcc -o hello hello.c
Execution : ./hello
ExerciceCompilez et exécutez ce programme
I Quel fichier est créé par la compilation?I Que se passe-t-il si on omet la ligne 1?
INFO-H-304 2020-2021 24 / 52
Analyse
1 #include <stdio.h>2
3 int main()4 {5 /* Affiche le texte ‘‘Hello, world’’ */6 printf("Hello, world\n");7 return 0;8 }
hello.c
Ligne 1 : Inclure le fichier stdio.h (bibliothèque standard)
Ligne 3 : Fonction principale main à valeur de retour int
Ligne 5 : Commentaire
Ligne 6 : Affichage, requiert stdio.h
Ligne 7 : Valeur de retour 0 (succès)
INFO-H-304 2020-2021 25 / 52
Types de données
Très peu de types de données de base en C
Type Description Mémoire 1
char caractère ASCII vu comme un entier court 1 octetint entier de taille typique pour la machine hôte 4 octetsfloat réel à virgule flottante 4 octetsdouble réel à virgule flottante de précision double 8 octets
4 char premiere = ’a’;5 int nbre_lettres = 26;6 const float avogadro = 6.0221415e23;7 const double pi = 3.14159265358979323846;
datatypes.c
Qualificateurs short/long ou signed/unsigned (voir annexe ) pour
Diminuer l’utilisation de mémoire
Augmenter ou modifier la gamme de valeurs possibles
1. Dépend de l’architecture, ici sous Mac OS 64 bitsINFO-H-304 2020-2021 26 / 52
Déclaration de variables
Avant utilisation, une variable doit êtreI déclaréeI éventuellement initialisée à partir d’une constante ou d’une autre variable
Types de constantesI caractère : ’a’ = 97 (décimal) = ’\141’ (octal) = ’\x61’ (hexadécimal)I entier : 26 (décimal) = 032 (octal) = 0x1a (hexadécimal)I réel : 6.0221415e23 ou 3.14159265I expression : 24*60*60
4 char premiere = ’a’;5 int nbre_lettres = 26;6 const float avogadro = 6.0221415e23;7 const double pi = 3.14159265358979323846;
datatypes.c
Mot-clé constI Empêche de modifier la valeur de la variable
INFO-H-304 2020-2021 27 / 52
Impression formatée : printf
Exemple :
1 #include <stdio.h>2 int main()3 {4 char premiere = ’a’;5 int nbre_lettres = 26;6 const float avogadro = 6.0221415e23;7 const double pi = 3.14159265358979323846;8 printf("Premiere lettre de l’alphabet: %c\n", premiere);9 printf("Nombre de lettres: %10i\n", nbre_lettres);
10 printf("Le nombre d’Avogadro vaut %11.3e\n", avogadro);11 printf("La constante pi vaut %10.6f\n", pi);12 return 0;13 }
datatypes.c
Syntaxe générale pour spécifier le format : %[-][l][.p]s, oùI [-] permet d’aligner à gaucheI [l] est la largeur minimaleI [.p] est la précisionI s est un symbole donnant le type (voir annexe )
INFO-H-304 2020-2021 28 / 52
Fonctions
Exemple
1 #include <stdio.h>2 int somme(int a, int b);3
4 int main()5 {6 int terme1 = 5, terme2 = 7;7 int resultat = somme(terme1, terme2);8 printf("La somme des termes vaut %i.\n", resultat);9 return 0;
10 }11
12 int somme(int a, int b)13 {14 return a+b;15 }
somme-v1.c
Doit être déclarée avant utilisation
ExerciceTestez ce bout de code
I Que se passe-t-il si vous omettez la déclaration en ligne 2?(utilisez l’option -Wall à la compilation)
INFO-H-304 2020-2021 29 / 52
Arguments passés par valeur
Les arguments sont passés par valeur
Exemple qui ne fonctionne pas :
1 #include <stdio.h>2
3 /* echange: tentative ratée d’échange des deux arguments */4 void echange(int a, int b)5 {6 int temp = a;7 a = b;8 b = temp;9 }
10
11 int main()12 {13 int premier = 1, deuxieme = 2;14 echange(premier, deuxieme);15 printf("premier vaut %i, deuxieme vaut %i.\n", premier, deuxieme);16 return 0;17 }
echange.c
Résultat :premier vaut 1, deuxieme vaut 2.
INFO-H-304 2020-2021 30 / 52
Variables locales
Variables locales :I Arguments d’une fonctionI Variables déclarées dans une fonction
Deux cas possibles :I automatique (par défaut) : créée puis détruite à chaque exécutionI statique (mot-clé static) : garde sa valeur entre les exécutions
Portée (scope) : uniquement pendant l’exécution de la fonction
INFO-H-304 2020-2021 31 / 52
Variables locales
Exemple :
1 int somme(int a, int b)2 {3 static int compteur = 0;4 int somme = a+b;5 ++compteur;6 return somme;7 }
somme-v2.c
La variable statique compteurI compte le nombre d’appel à sommeI n’est pas accessible en dehors de somme
ExerciceReprenez le code de cette fonction et créez une fonction main pour la tester
I Modifiez la fonction somme pour afficher la valeur de compteur à chaqueexécution
I Que se passe-t-il si vous essayez d’accéder à compteur depuis main?I Que se passe-t-il si vous supprimez le mot-clé static?
INFO-H-304 2020-2021 32 / 52
Variables globales (extern)
Différence entre définition et déclarationDéclaration : annonce les propriétés de la variable (type)
Définition : attribue aussi un espace de stockage(éventuellement avec initialisation de la valeur)
Variable globale : Variable définie en dehors de toute fonctionI Portée : depuis sa déclaration jusqu’à la fin du fichierI Mot-clé extern : pour déclarer une variable définie dans un autre fichier
Exemple :I Fichier 1 :
1 int variable_globale = 0;2 int main()3 { ... }
I Fichier 2 :
1 extern int variable_globale;2 int fonction(int a)3 { ... }
INFO-H-304 2020-2021 33 / 52
Préprocesseur
Les instructions commençant par # sont pour le “préprocesseur”
1 #include <stdio.h>2 #include "decl.h"3 #define PI 3.141592654 #define square(x) (x)*(x)5
6 int main()
preprocessor.c
Avant compilation, le préprocesseur fait des substitutions sur le code :I #include insère les fichiers cités
F stdio.h fait partie de la bibliothèque standardF "decl.h" peut contenir les déclarations de fonctions et variables globales
I #define définit des macrosF Les occurrences de PI sont remplacées par 3.14159265F square(expr) est remplacé par (expr)*(expr) (pour tout expr)
ExerciceTestez la macro #define square(x) (x)*(x)
I Pourquoi n’utilise-t-on pas la syntaxe #define square(x) x*x?I Essayez de l’appliquer à square(1+1), et interprétez le résultat
INFO-H-304 2020-2021 34 / 52
Structures de contrôle
Comme dans la plupart des langages impératifsI if-elseI whileI forI switch-case
Syntaxe : voir annexe
INFO-H-304 2020-2021 35 / 52
Opérateurs d’incrément : ++i, i++, --i, i--
Exemple :
1 /* table: imprime une table de multiplication */2 int table(int a)3 {4 int produit, facteur = 0;5 while ( facteur<10 )6 {7 produit = a*(++facteur);8 printf("%i fois %i egale %i\n", a, facteur, produit);9 }
10 return 0;11 }
table.c
Hors d’une expression : ++i et i++ sont équivalentsI i est incrémenté de 1, comme pour l’instruction i=i+1 ou i+=1
Dans une expression :I ++i : i est incrémenté avant évaluation de l’expressionI i++ : i est incrémenté après évaluation de l’expression
Idem pour les opérateurs de décrément --i et i--
INFO-H-304 2020-2021 36 / 52
Opérateurs d’incrément : ++i, i++, --i, i--
Exemple :
1 /* table: imprime une table de multiplication */2 int table(int a)3 {4 int produit, facteur = 0;5 while ( facteur<10 )6 {7 produit = a*(++facteur);8 printf("%i fois %i egale %i\n", a, facteur, produit);9 }
10 return 0;11 }12
13 int main()14 {15 ...16 return 0;17 }
table.c
ExerciceTestez la fonction table
I Que se passe-t-il si vous remplacez ++facteur par facteur++ à la ligne 7?INFO-H-304 2020-2021 37 / 52
Entrée/sortie de caractères : getchar et putchar
La commande c=getchar();I Lit un caractère sur l’entrée standardI Affecte ce caractère à la variable c de type char
La commande putchar(c);I Affiche le caractère c sur la sortie standard
Nécessitent <stdio.h>Exemple :
1 #include <stdio.h>2 /* Copie l’entrée sur la sortie (version 1) */3 int main()4 {5 char c;6 c = getchar();7 while ( c != EOF )8 {9 putchar(c);
10 c = getchar();11 }12 return 0;13 }
copy-v1.c
INFO-H-304 2020-2021 38 / 52
Exemple 1 : copier l’entrée sur la sortie
Exemple :
1 #include <stdio.h>2 /* Copie l’entrée sur la sortie (version 1) */3 int main()4 {5 char c;6 c = getchar();7 while ( c != EOF )8 {9 putchar(c);
10 c = getchar();11 }12 return 0;13 }
copy-v1.c
Analyse : EOFI caractère spécial signalant la fin de fichier (End Of File)I correspond généralement à l’entier -1I défini dans <stdio.h>I Peut-être entré avec Ctrl-D (Linux et Mac OS) ou Ctrl-Z (Windows)
INFO-H-304 2020-2021 39 / 52
Exemple 1 : copier l’entrée sur la sortie
En C, toute instruction renvoie une valeurI L’affectation (a=b) renvoie la valeur b.
ApplicationsI Au lieu de a=0;b=0;, on peut écrire a=(b=0);, ou même a=b=0;.I (c=getchar()) renvoie la valeur c, et donc :
1 #include <stdio.h>2 /* Copie l’entrée sur la sortie (version 2) */3 int main()4 {5 char c;6 while ( (c = getchar()) != EOF )7 putchar(c);8 return 0;9 }
copy-v2.c
ExerciceTestez l’une ou l’autre version de ce programme
I Observez à quel moment la copie est effectuée
INFO-H-304 2020-2021 40 / 52
Exemple 2 : compter les caractères
Version 1, avec while1 #include <stdio.h>2 /* Compte les caractères (version 1) */3 int main()4 {5 int nc = 0;6 while ( getchar() != EOF )7 ++nc;8 printf("%i caractères ont été entrés.\n", nc);9 return 0;
10 }
Version 2, avec for1 #include <stdio.h>2 /* Compte les caractères (version 2) */3 int main()4 {5 int nc;6 for ( nc=0; getchar()!=EOF ; ++nc )7 ;8 printf("%i caractères ont été entrés.\n", nc);9 return 0;
10 }
I Le corps de la boucle est vide !
INFO-H-304 2020-2021 41 / 52
Prochain cours
Prochain cours :
Programmation en C (suite)
Pointeurs
Allocation manuelle de mémoire
INFO-H-304 2020-2021 42 / 52
Références
Ces slides : disponibles sur l’Université Virtuelle
The C programming language, B.M. Kernighan and D.M. Ritchie, Prentice Hall (1988)I Chapitres 1 à 4 et 7
6.088 Introduction to C Memory Management and C++ Object-Oriented Programming, E. Kang and J. Yang,
MIT OpenCourseWare (2010) : http://ocw.mit.edu/...I Lecture 1
Wikipedia :I http://en.wikipedia.org/wiki/C_(programming_language)
INFO-H-304 2020-2021 43 / 52
Qualificateurs : short/long, signed/unsigned
Qualificateurs short/long ou signed/unsigned pour
Diminuer l’utilisation de mémoire
Augmenter ou modifier la gamme de valeurs possibles
Type Gamme de valeurs2 Mémoire 2
short int = short −215 → 215 − 1 2 octetsint −231 → 231 − 1 4 octetslong int = long −263 → 263 − 1 6 octetslong double ∼ 10−37 → 1037 16 octetssigned char −128→ 127 1 octetunsigned char 0→ 255 1 octetsigned int = int −231 → 231 − 1 4 octetsunsigned int 0→ 232 − 1 4 octets
2. Dépend de l’architecture, ici sous Mac OS 64 bitsINFO-H-304 2020-2021 44 / 52
Impression formatée : printf
Syntaxe générale pour spécifier le format : %[-][l][.p]s, oùI [-] permet d’aligner à gaucheI [l] est la largeur minimaleI [.p] est la précisionI s est un symbole donnant le type
Symbole Type Description Exemplec char caractère unique %c→ "a"d, i int entier décimal %4i→ " 26"u int entier décimal non-signé %4u→ " 26"o int entier octal %4o→ " 32"x, X int entier hexadécimal %4x→ " 1a"f float, double réel %10.6f→ " 3.141593"e, E float, double réel (notation scientifique) %11.3e→ " 6.022e+23"
ExerciceEn vous basant sur les bouts de code des derniers slides
I Déclarez, initialisez et imprimez différents types de variablesI Testez différents formats d’affichage pour entiers et réelsI Que se passe-t-il si vous essayez de modifier une variable const?
INFO-H-304 2020-2021 45 / 52
Structure de contrôle : if-else
Syntaxe :
1 if (expr1)2 instr1;3 else4 instr2;
Pas de variables booléennes : expr1 est un entierI expr1=0→fauxI expr1,0→vrai
Exemple :
1 /* max: calcule le maximum des deux arguments */2 int max(int a, int b)3 {4 if (a>b)5 return a;6 else7 return b;8 }
INFO-H-304 2020-2021 46 / 52
Autre solution : ( ? : )
Syntaxe : (expr1 ? expr2 : expr3)Principe :
I expr1=vrai→ évalue expr2I expr1=faux→ évalue expr3
Exemple :
1 /* max: calcule le maximum des deux arguments (version 2) */2 int max(int a, int b)3 {4 return (a>b ? a : b);5 }
INFO-H-304 2020-2021 47 / 52
Variantes : else-if, switch
else if
1 if (expr1)2 instr1;3 else if (expr2)4 instr2;5 else6 instr3;
switch
1 switch (expr1)2 {3 case const1: instr1;4 case const2: instr2;5 case const3: instr3;6 default: instr4;7 }
Note :I Tous les case sont considérés, même si un case précédent est vraiI Instruction break pour sortir immédiatement du switch
INFO-H-304 2020-2021 48 / 52
Structure de contrôle : while
Syntaxe :
1 while (expr1)2 {3 instructions;4 }
Exemple :
1 /* table: imprime une table de multiplication */2 int table(int a)3 {4 int produit, facteur = 0;5 while ( facteur<10 )6 {7 produit = a*(++facteur);8 printf("%i fois %i egale %i\n", a, facteur, produit);9 }
10 return 0;11 }
INFO-H-304 2020-2021 49 / 52
Structure de contrôle : do-while
Syntaxe :
1 do2 {3 instructions;4 }5 while (expr1);
Exemple :
1 /* table: imprime une table de multiplication (version 2) */2 int table(int a)3 {4 int produit, facteur = 0;5 do6 {7 produit = a*(++facteur);8 printf("%i fois %i egale %i\n", a, facteur, produit);9 }
10 while ( facteur<10 );11 return 0;12 }
Utilisé quand la boucle est exécutée au moins une fois
INFO-H-304 2020-2021 50 / 52
Structure de contrôle : for
Syntaxe :
1 for (expr1; expr2; expr3)2 {3 instructions;4 }
Equivalent à :
1 expr1;2 while (expr2)3 {4 instructions;5 expr3;6 }
Utilisé en présence d’une initialisation et d’un incrément simple
Exemple : for (i=0;i<n;i++)Différence entre version for et while : instruction continue
I Un continue dans la boucle fait sauter à l’itération suivanteI Pour for, expr3 est tout de même exécutée
INFO-H-304 2020-2021 51 / 52
Structure de contrôle : for
Syntaxe :
1 for (expr1; expr2; expr3)2 {3 instructions;4 }5 while (expr1);
Exemple :
1 /* table: imprime une table de multiplication (version 3) */2 int table(int a)3 {4 int facteur;5 for ( facteur=1; facteur<=10; facteur++ )6 {7 printf("%i fois %i egale %i\n", a, facteur, a*facteur);8 }9 return 0;
10 }
INFO-H-304 2020-2021 52 / 52