LU1IN002 : Éléments de programmation 2
Cours 1
Cours : Jean-Lou Desbarbieux, François Bouchet,
Mathilde Carpentier
et toute l’équipe de l’UE
LU1IN002 Sorbonne Université 2023/2024
Sections :
Présentation du module
▶ Module niveau 1 de 9 ECTS
▶ Objectifs principaux :
▶ Consolidation de notions de programmation impérative
(alternatives, boucles, variables, fonctions)
▶ Représentation de la mémoire, gestion explicite de la mémoire
▶ Spécificités du langage C
▶ Structure de données autoréférentielles : listes, piles, files
▶ Bonnes habitudes de programmation (tests, structuration)
▶ Notions d’algorithmique
Calendrier
▶ 11 semaines de cours (1 par semaine)
▶ 11 semaines de TD (1 par semaine)
▶ 11 semaines des TME (2 par semaine)
▶ Début des CM de LU1IN002 : 15/1/2024
Fin le 22/4/2024
▶ Début des TD de LU1IN002 : 22/1/2024
Fin le 29/4/2024
▶ Début des TME de LU1IN002 : 29/01/2024
Fin le mardi 7/5/2023 (rattrapage du 1/4 et du 1/5)
Poly de TD à aller chercher à l’association étudiante
ALIAS en salle 14-15-506
Horaires : 12h45-13h45 & 18h00-19h00
Évaluation
Modalité de contrôle des connaissances :
▶ 50% pour le contrôle continu (CC) :
▶ 5% pour les quizz de cours sur Moodle
▶ 5% pour les TME rendus sur Moodle
▶ 15% TME solitaire 1, 45min, la semaine du TME4
▶ 25% TME solitaire 2, 1h30, la dernière semaine de TME
▶ 50% pour l’examen final
”Règle du max” : max((CC/50 + examen/50), examen/100)
Déroulé de l’UE (à titre indicatif)
1. Noyau impératif des langages : de Python à C
2. Principes de fonctionnement des ordinateurs
3. Tableaux, pointeurs et allocation
4. Algorithmes avec les tableaux
5. Arithmétique de pointeurs et chaı̂nes de caractères
6. Enregistrement (structures) et pointeurs
7. Structure de données linéaires (liste, files d’attente)
(4 semaines)
Bibliographie
▶ Apprenez à programmer en C, Mathieu Nebra, Collection
OpenClassrooms, Eyrolles, 2015
▶ Programmer en langage C : Cours et exercices corrigés ,
Claude Delannoy, Collection Noire, Eyrolles, 2016
▶ Le langage C - Norme ANSI, Brian W. Kernighan et Dennis
M. Ritchie, Collection Sciences Sup, Dunod, 2014 (“K & R”)
[2ème édition en anglais date de 1990]
▶ ...
Outils informatiques utilisés
Environnement : Linux
▶ éditeurs : gedit/emacs/vi/gvim /Visual Studio Code
▶ compilateur : gcc
▶ (débogueur : gdb, ddd)
Le Langage C : historique
▶ Le langage C a été inventé en 1972 par Dennis Ritchie et Ken
Thompson (AT&T Bell Laboratories) pour réécrire Unix et
développer des programmes sous Unix
▶ En 1978, Brian Kernighan et Dennis Ritchie publient la
définition classique du C dans le livre “The C Programming
language”
▶ C est une norme ANSI (ANSI-C) depuis 1989 et un standard
ISO depuis 1990, standard étendu en 1999 (C99), 2011 (C11)
et en 2018 (C18)
Caractéristiques du langage :
▶ impératif
▶ bas-niveau
▶ typé
▶ compilé
Comparaison de différents langages
Pereira, R., Couto, M., Ribeiro, F., Rua, R., Cunha, J., Fernandes, J. P., & Saraiva, J. (2017). Energy efficiency
across programming languages : how do energy, time, and memory relate ?. In Proceedings of the 10th ACM
SIGPLAN International Conference on Software Language Engineering (pp. 256-267).
Premier programme
Premier programme
− > DEMO Hello World.c
Fonctions, programmes, exécution
Au 1er semestre : environnement intégré mrpython
Au 2nd semestre : éditeur de texte
+ commande de compilation
+ commande d’exécution du programme
(a) Fichier texte contenant le code C (b) Compilation et exécution dans le
terminal
Figure – Exemple de programme C, de sa compilation et de son exécution
Les fonctions
Les éléments à définir sont :
1. le type de la valeur de retour (void si rien n’est retourné)
2. le nom de la fonction
3. les arguments éventuels, avec leur type
4. le corps de la fonction (entre accolades)
int main ( )
{
printf ( " Hello World \ n " ) ;
return 0;
}
Types que nous utiliserons
Type Signification Taille (o) Plage de valeurs Exemple
char Caractère 1 -128 à 127 ’a’
int Entier 4 -2 147 483 648 à 2 147 483 647 25
float Simple précision 4 +/- 1.175494e-38 à 3.402823e+38 3.14
Attention : ’a’ est différent de ”a” en langage C
car ’ et ” définissent deux types différents :
▶ ’a’ est un caractère (char)
▶ ”a” est une chaı̂ne de caractères (comme
”Hello World \n”).
Attention : Pas de type booléen. On utilise le type
entier avec 0 = Faux et tout le reste = Vrai.
Tous les types simples
Pour information : Tous ne sont pas à connaı̂tre, seuls
les précédents seront utilisés
Type Signification Taille (o) Plage de valeurs
char Caractère 1 -128 à 127
unsigned char Caractère 1 0 à 255
short int Entier court 2 -32768 à 32767
uns. short int Entier court non s. 2 0 à 65535
int Entier 2 (16 b) -32768 à 32767
4 -2 147 483 648
à 2 147 483 647
unsigned int Entier non signé 2 (16 b) 0 à 65 535
4 (32 et 64 b) 0 à 4 294 967 295
long int Entier long 4 -2 147 483 648
à 2 147 483 647
8 (64 b) -9 223 372 036 854 775 080
9 223 372 036 854 775 807
à
uns. long int Entier long non s. 4 0 à 4 294 967 295
float Simple précision 4 +/- 1.175494e-38 à 3.402823e+38
double Double précision 8 +/- 2.225074e-308 à 1.797693e+308
long double Double préc. long 12 +/- 3.362103e-4932 à 1.189731e+4932
Les fonctions
Attention : Il faut toujours une (et une seule) fonction
main par programme.
1 int main () {
2 printf ( " Hello World \ n " ) ;
3 return 0;
4 }
Les fonctions
1 void Hello () {
2 printf ( " Hello World \ n " ) ;
3 }
4
5 int main () {
6 Hello () ; // Appel de la fonction
7 return 0;
8 }
Pour être testée, la fonction Hello est appelée dans la fonction
main. La fonction main est le point de départ du programme.
Les fonctions : ordre
Attention : L’ordre de définition des fonctions est
important
1 int main () {
2 Hello () ;
3 return 0;
4 }
5
6 void Hello () {
7 printf ( " Hello World \ n " ) ;
8 }
Ce code provoquera une erreur de compilation.
Les fonctions : ordre
Attention : L’ordre de définition des fonctions est
important
1 int main () {
2 Hello () ;
3 return 0;
4 }
5
6 void Hello () {
7 printf ( " Hello World \ n " ) ;
8 }
Ce code provoquera une erreur de compilation.
Les fonctions : arguments
1 void Hello ( int annee ) {
2 printf ( " Hello World % d \ n " , annee ) ;
3 }
4
5 int main () {
6 Hello (2023) ; // Appel de la fonction
7 return 0;
8 }
Les fonctions : prototypes
void Hello(int annee);
et
int main();
sont les prototypes des fonctions définies ci-dessous.
1 void Hello ( int annee ) {
2 printf ( " Hello World % d \ n " , annee ) ;
3 }
4
5 int main () {
6 Hello (2023) ; // Appel de la fonction
7 return 0;
8 }
La fonction printf
Exemples :
1 printf ( " un entier %d , un float % f \ n " , 2023 ,
3.14) ;
2 printf ( " un caract è re % c \ n " , ’b ’) ;
Arguments :
▶ une chaı̂ne de caractères entre ” ” (le format) contenant
éventuellement %f pour les float, %d pour les int et %c pour
les char
▶ les valeurs ou variables à afficher
Variables : déclaration et affectation
En C, il faut obligatoirement déclarer les variables :
1 #i n c l u d e < s t d i o . h>
2 #i n c l u d e <math . h>
3
4 float aire triangle ( float a , float b, float c) {
5 float p;
6 p = (a + b + c ) / 2;
7 return sqrt (p ∗ (p − a) ∗ (p − b) ∗ (p − c ) ) ;
8 }
9
10 i n t main ( ) {
11 f l o a t a =0 , b=1 , c =3 , d = 3 . 5 ; //Dé c l a r a t i o n e t
i n i t i a l i s a t i o n p e u v e n t ê t r e g r o u p é e s .
12 a= a i r e t r i a n g l e ( b , c , d ) ;
13 p r i n t f ( ”L ’ a i r e du t r i a n g l e e s t %f \n” , a ) ;
14 return 0;
15 }
Attention : Les variables sont locales au bloc où elles
sont déclarées.
Opérateurs
Par ordre de priorité :
référence : () [] -> .
unaire : ! ++ + - * & (type) sizeof
arithmétique : * / %
arithmétique : + -
relationnels : < <= > >=
relationnels : == !=
logique : &&
logique : ||
affectation : =
Attention : Pas d’opérateur puissance (**) comme en
Python.
Tous les opérateurs
Pour information : Tous ne sont pas à connaı̂tre, seuls
les précédents seront utilisés
opérateurs action
. et -> sélection de champ
[] indiçage
() appel de fonction
++ pré- et post-incrémentation,
−− pré- et post-décrémentation opérateurs action
∼ complément à 1 & ET bit à bit
! négation ∧ OU exclusif bit à bit
+- plus et moins unaire — OU inclusif bit à bit
&* référence et indirection && ET logique
(type) cast —— OU logique
sizeof taille ?: conditionnel (ternaire)
*/ multiplication, division = affectation
% modulo += -= *= /= %= modification et affectation
+- addition et soustraction , évaluation séquentielle
<< et >> décalage à gauche et à droite
<> inférieur et supérieur
<= inférieur ou égal et
>= supérieur ou égal
== != égal et différent
De Python à C : exemple de la fonction perimetre
1 def perimetre ( largeur : int , longueur : int ) -> int :
2 """ hypothese : longueur >= largeur >= 0
3 retourne le perimetre du rectangle defini par
4 sa largeur et sa longueur . """
5 return 2 * ( largeur + longueur )
1 /∗ h y p o t h e s e : l o n g u e u r >= l a r g e u r >= 0
2 r e t o u r n e l e p e r i m e t r e du r e c t a n g l e d e f i n i p a r
3 s a l a r g e u r e t s a l o n g u e u r . ∗/
4 int perimetre ( int largeur , int longueur ) {
5 return 2 ∗ ( l a r g e u r + longueur ) ;
6 }
De Python à C : spécification
Méthode : exemple pour la fonction perimetre :
1. Que doit calculer la fonction ?
▶ périmètre du rectangle défini par sa largeur et sa longueur.
2. Quels sont les paramètres (nombre, nom, type) ?
▶ les deux côtés largeur et longueur,
▶ tous les deux de type int .
3. Quelles sont les hypothèses sur les paramètres ?
▶ longueur >= largeur >= 0
4. Quel est le type de la valeur de retour ?
▶ le périmètre du rectangle est de type int .
1 /∗ h y p o t h e s e : l o n g u e u r >= l a r g e u r >= 0
2 r e t o u r n e l e p e r i m e t r e du r e c t a n g l e d e f i n i p a r s a
l a r g e u r e t s a l o n g u e u r . ∗/
3 int perimetre ( int largeur , int longueur ) {
4 return 2 ∗ ( l a r g e u r + longueur ) ;
5 }
De Python à C : ce qui change (1)
En-tête des déclarations (signature ou prototype)
1 def perimetre ( largeur : int , longueur : int ) -> int :
C : typage explicite
1 int perimetre ( int largeur , int longueur )
La signature (prototype) d’une fonction précise :
1. la valeur de retour
2. le nom de la fonction
3. le type des arguments
De Python à C : ce qui change (2)
Commentaires en C : /* ... */ pour commenter plusieurs
lignes ou //... pour commenter une seule ligne
(commentaires C++)
1 """ hypothese : longueur >= largeur >= 0
2 retourne le perimetre du rectangle defini par
3 sa largeur et sa longueur . """
1 /∗ h y p o t h e s e : l o n g u e u r >= l a r g e u r >= 0
2 r e t o u r n e l e p e r i m e t r e du r e c t a n g l e d e f i n i p a r
3 s a l a r g e u r e t s a l o n g u e u r . ∗/
De Python à C : ce qui change (3)
Bloc :
▶ Python : indentation, une instruction par ligne
▶ C : accolades, point virgule en fin d’instruction
1 def perimetre ( largeur : int , longueur : int ) -> int :
2 """ hypothese : longueur >= largeur >= 0
3 retourne le perimetre du rectangle defini par
4 sa largeur et sa longueur . """
5 return 2 * ( largeur + longueur )
1 /∗ h y p o t h e s e : l o n g u e u r >= l a r g e u r >= 0
2 r e t o u r n e l e p e r i m e t r e du r e c t a n g l e d e f i n i p a r
3 s a l a r g e u r e t s a l o n g u e u r . ∗/
4 int perimetre ( int largeur , int longueur ) {
5 return 2 ∗ ( l a r g e u r + longueur ) ;
6 }
Les structures de contrôle
▶ if /else
▶ while et do ... while
▶ for
Alternative ( if et else )
if ( expression ) {
instructions ;
}
else {
instructions ;
}
1 float valeur absolue ( float x) {
2 f l o a t abs x ;
3 i f ( x >= 0 ) {
4 a b s x= x ;
5 } else {
6 a b s x=−x ;
7 }
8 return abs x ;
9 }
▶ Condition entre parenthèses
▶ Blocs délimités par des accolades
Alternative ( if et else )
Python
1 def v a l e u r a b s o l u e ( x : f l o a t ) C
−> f l o a t :
1 float valeur absolue ( float x) {
2 ””” r e t o u r n e l a v a l e u r
2 f l o a t abs x ;
a b s o l u e de x .
3 i f ( x >= 0 ) {
3 ”””
4 a b s x= x ;
4 # a b s x : Number
5 } else {
5 abs x = 0
6 a b s x=−x ;
6 if x >= 0 :
7 }
7 abs x = x
8 return abs x ;
8 else :
9 }
9 a b s x = −x
10 return abs x
▶ Condition entre parenthèses
▶ Blocs délimités par des accolades
Alternatives imbriquées
if ( expression ) {
if ( expression ) {
instructions ;
} else {
instructions ;
}
}
else {
if ( expression ) {
instructions ;
} else {
instructions ;
}
}
Alternatives imbriquées
1 int nb sol ( float a , float b , float c) {
2 f l o a t d = b∗b − 4∗ a ∗ c ;
3 i f ( d == 0 ) {
4 return 1;
5 } else {
6 i f ( d > 0) {
7 return 2;
8 } else {
9 return 0;
10 }
11 }
12 }
▶ Condition entre parenthèses
▶ Blocs délimités par des accolades
▶ Pas de elif : des if et else imbriqués
Boucle while
while ( e x p r e s s i o n )
{
instructions ;
}
1 int somme entiers ( int n){
2 int i = 1;
3 int s = 0;
4 w h i l e ( i <= n ) {
5 s = s + i;
6 i = i + 1;
7 }
8 return s ;
9 }
Comme pour l’alternative :
▶ parenthèses autour de la condition
▶ bloc délimité par des accolades
Boucle while
1 /∗ h y p o t h è s e : n >= 1 [ . . ]
1 def somme entiers (n : i n t )
∗/
−> i n t :
2 int somme entiers ( int n){
2 # i : int
3 int i = 1;
3 i = 1
4 int s = 0;
4 # s : int
5 w h i l e ( i <= n ) {
5 s = 0
6 s = s + i;
6 w h i l e i <= n :
7 i = i + 1;
7 s = s + i
8 }
8 i = i + 1
9 return s ;
9 return s
10 }
▶ parenthèses autour de la condition
▶ bloc délimité par des accolades
Boucle do ... while
1 i n t main ( ) {
2 i n t i = 1 , n =1;
3 do {
4 p r i n t f ( ” i :%d\n” , i ) ;
5 i = i + 1;
6 } while ( i < n ) ;
7 return 0;
8 }
▶ bloc délimité par des accolades
▶ condition à la fin, et entre parenthèses
▶ ne pas oublier le ” ;” après la condition
Qu’affiche ce programme ?
Boucle for
Forme synthétique de la boucle en C :
1 for ( expression1 ; expression2 ; expression3 )
{
2 instructions ;
3 }
1 int i ;
2 f o r ( i = 1 ; i <= n ; i ++) {
3 s = s + i;
4 }
Les 3 éléments qui font tourner la boucle :
initialisation : i = 1
condition : ( i <= n)
incrément : i ++ (équivaut à i = i+1)
Boucle for
1 int i ;
2 f o r ( i = 1 ; i <= n ; i ++) {
3 s = s + i;
4 }
Les 3 éléments qui font tourner la boucle :
initialisation : i = 1
condition : ( i <= n)
incrément : i ++ (équivaut à i = i+1)
Analogue à for i in range en Python :
1 f o r i i n r a n g e ( 1 , n+1) :
2 s = s + i
Rq : i <= n équivaut à i < n+1
Équivalence while et for en C
for
1 for ( expression1 ; expression2 ; expression3 ){
2 instructions ;
3 }
equivaut à :
while
1 expression1 ;
2 while ( expression2 ) {
3 instructions ;
4 expression3 ;
5 }
Équivalence while et for en C
Exemple
for
1 int i ;
2 f o r ( i = 1 ; i <= n ; i ++) {
3 s = s + i;
4 }
equivaut à :
while
1 int i ;
2 i =1;
3 w h i l e ( i <= n ) {
4 s = s + i;
5 i ++;
6 }
C’est tout pour aujourd’hui !