Compléments de programmation et...

52
Compléments de programmation et d’algorithmique Cours 1: Introduction Langage C J. Roland Quantum Information & Communication INFO-H-304 2020-2021 1 / 52

Transcript of Compléments de programmation et...

Page 1: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

Compléments de programmation et d’algorithmiqueCours 1:

IntroductionLangage C

J. Roland

Quantum Information & Communication

INFO-H-304 2020-2021 1 / 52

Page 2: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 3: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 4: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 5: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 6: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 7: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 8: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 9: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 10: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 11: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 12: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 13: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 14: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 15: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

Livres

... et beaucoup d’autres

INFO-H-304 2020-2021 15 / 52

Page 17: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 18: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 19: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 20: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 21: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 22: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 23: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 24: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 25: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 26: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 27: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 28: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 29: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 30: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 31: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 32: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 33: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 34: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 35: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 36: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 37: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 38: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 39: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 40: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 41: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 42: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

Prochain cours

Prochain cours :

Programmation en C (suite)

Pointeurs

Allocation manuelle de mémoire

INFO-H-304 2020-2021 42 / 52

Page 43: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 44: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 45: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 46: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 47: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 48: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 49: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 50: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 51: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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

Page 52: Compléments de programmation et d’algorithmiquequic.ulb.ac.be/_media/teaching/cours-1-handout.pdf · 2020. 9. 11. · Bref historique 1972Développement initial du C I Par K. Thompson

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