Programmation en C

John Samuel

CPE Lyon

Année: 2022-2023
Courriel: john(dot)samuel(at)cpe(dot)fr

Creative Commons License

1.1. Programmation en C: Introduction

Objectifs

1.1. Programmation en C: Introduction

Bonjour le Monde!!

/* Fichier: bonjour1.c
* affiche 'Bonjour le Monde!!!' à l'écran.
* auteur: John Samuel
* Ceci est un commentaire sur plusieurs lignes
*/

#include <stdio.h> // headers

// Ceci est un commentaire sur une ligne
int main() {
  printf("Bonjour le Monde !!!");
  return 0;
}

1.1. Programmation en C: Introduction

Structures de contrôle

1.1. Programmation en C: Introduction

Memoire virtuelle

Adresses physiques
la conversion des adresses virtuelles en adresses physiques
La conversion des adresses virtuelles en adresses physiques

1.1. Programmation en C: Introduction

La chaine de compilation

Compilation:gcc

1.1. Programmation en C: Introduction

File

File

1.1. Programmation en C: Introduction

Pile

Pile

1.1. Programmation en C: Introduction

Environnement de programmation:

Cours:

1.1. Programmation en C: Introduction

Devoir surveillé (DS): 60%

Vous recevrez un courrier détaillé avant l'examen

1.1. Programmation en C: Introduction

Cours Dates
Cours 1 13 septembre
Cours 2 15 septembre
Cours 3 22 septembre
Cours 4 29 septembre
Cours 5 6 octobre
Cours 6 13 octobre

1.1. Programmation en C: Introduction

Déroulement du cours

1.1. Programmation en C: Introduction

Travaux pratiques et Projet

1.1. Programmation en C: Introduction

TP Points
TP 1 3
TP 2 3
TP 3 4
TP 4 3
TP 5 3
TP 6 4

1.1. Programmation en C: Introduction

Travaux pratiques

Chaque question a un niveau de difficulté

1.1. Programmation en C: Introduction

Travaux pratiques et Projet

1.1. Programmation en C: Introduction

Travaux pratiques: Rendus

  1. Il y a deux parties de rendu: le rapport d’auto-évaluation et les sources
  2. Votre dossier de rendu doit contenir les fichiers suivants:
    1. README.md: rapport d’auto-évaluation
    2. CONTRIBUTORS.md: Noms et prénoms de contributeurs
    3. src/: les sources (Extensions de fichiers: .c, .h )

1.1. Programmation en C: Introduction

Travaux pratiques: Rendus

  1. Votre rendu doit renommer comme groupe_N1_N2.zip, où N1 et N2 sont les noms (e.g., groupe_DUPONT_SMITH.zip).
  2. Ecrivez/Completez README.md et CONTRIBUTORS.md en format markdown.
  3. Le contenu de README.md rapport d’auto-évaluation : TP N (N: [1..6])
    1. Bibliothèques: les bibliothèques standards
    2. Références: les URLs, les groupes
    3. Difficulté: niveau de difficulté (facile, moyenne, difficile)
    4. Commentaires (optionnels): remarques etc.

1.1. Programmation en C: Introduction

Liste de contrôle

Avant de déposer votre travail pratique, vérifiez si vous respectez la liste de contrôle suivante:

1.1. Programmation en C: Introduction

Modèle de code

Vous pouvez consulter https://github.com/johnsamuelwrites/ProgC en ligne
ou le cloner sur votre machine à l'aide du terminal en utilisant les commandes suivantes.

                	  $ git clone https://github.com/johnsamuelwrites/ProgC
$ cd ProgC
$ ls

Pour obtenir les dernières mises à jour du répertoire, vous pouvez exécuter la commande suivante:

                	  $ git pull

1.1. Programmation en C: Introduction

Travaux pratiques et Projet

1.1. Programmation en C: Introduction

Objectifs des travaux pratiques

  1. Comprendre la chaine de compilation en utilisant GCC (GNU compilation chain) : prétraitement jusqu’à l’exécution
  2. Travailler avec les bibliothèques standards et les appels de système d’exploitation (fichiers, les sockets réseau etc.)
  3. Comprendre les pointeurs et manipuler les buffers en utilisant les pointeurs
  4. Créer, compiler et exécuter un projet C
  5. Travailler avec les différents formats de données comme BMP
  6. Créer un simple programme client-serveur pour le transfert de fichiers et messages
  7. Exécuter les applications existantes sur la machine (e.g. GNU plot)
  8. Documenter une application en utilisant le format markdown (*.md)
  9. Tester une application

1.1. Programmation en C: Introduction

⚠️ Attention

  1. Aucune soumission par courriel électronique.
  2. Les liens vers des sites externes comme GitHub/GitLab,... ne seront pas acceptés.
  3. Seules les soumissions complètes sur E-Campus seront acceptées pour l'évaluation.
  4. Ne pas modifier les noms de fichiers (*.c, *.h, *.md, ...).

1.2. Programmation en C: Histoire

Questions

Donnez des exemples de logiciels écrits en C

1.2. Programmation en C: Histoire

Exemples

  1. Noyau Linux: https://github.com/torvalds/linux
  2. GCC: https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git
  3. GIT: https://git.kernel.org/pub/scm/git/git.git/
  4. Apache HTTP Server: https://github.com/apache/httpd
  5. Python: https://github.com/python/cpython

1.2. Programmation en C: Histoire

C

C est un langage de programmation

Extensions de fichiers

Remarque: Pas de classes (Ce n'est pas un langage de programmation orienté-objet!!!)

1.2. Programmation en C: Histoire

C

1.2. Programmation en C: Histoire

C: chronologie des langages de programmation

1.3. Bonjour le Monde!!

/* Fichier: bonjour1.c
* affiche 'Bonjour le Monde!!!' à l'écran.
* auteur: John Samuel
* Ceci est un commentaire sur plusieurs lignes
*/

#include <stdio.h> // headers

// Ceci est un commentaire sur une ligne
int main() {
  printf("Bonjour le Monde !!!");
  return 0;
}

1.3. Bonjour le Monde!!

/* Fichier: bonjour2.c
* affiche un message à l'écran en utilisant une variable
* auteur: John Samuel
* Ceci est un commentaire sur plusieurs lignes
*/

#include <stdio.h> // headers

int main() {
  int year = 2017; //déclaration d'une variable
  printf("Bonjour le Monde!!! C'est l'annee %d", year);
  return 0;
}

1.4. Compilation

La compilation

$ gcc bonjour1.c

Pour voir tous les avertissements (*warnings*) pendant la compilation, vous pouvez utiliser les options -Wall et -Wextra.

$ gcc -Wall -Wextra -o bonjour bonjour.c

L'exécution

$./a.out
Bonjour le Monde!!!

1.4. La compilation

La compilation

$ gcc -o bonjour bonjour2.c

L'exécution

$./bonjour
Bonjour le Monde!!! C'est l'annee 2017

1.5. Les commentaires

Commentaires sur une ou plusieurs lignes

// Ceci est un commentaire sur une ligne

/* Ceci est un
 * commentaire sur
 * quatre lignes
 */

1.6. Les types de base

Types Mots clés Exemples
caractères char 'h', 'a', ...
entiers short, int, long, long long ...,-1,0,1,...
nombres en flottant float, double, long double 3.14, 3.14e23
énumrérations enum ETUDIANT, STAGIAIRE

1.7. Les types caractères et entiers

Un octet, deux octets, quatre octets ou huit octets

1.7. Les types caractères et entiers

Types Mots-clés
caractères signed char, unsigned char
entiers signed short, signed int, signed long, signed long long, unsigned short, unsigned int, unsigned long, unsigned long long

La taille des types de base n'est pas standardisée!

1.8. Declaration des variables

Variables char

char my_char_var1 = 'a';
char my_char_var2 = -125;
unsigned char my_char_var3 = 225;

Remarque: Remarquez-bien l'utilisation de sous-tiret en nommant les variables

1.8. Declaration des variables

Variables

char my_char_var = 'a';
unsigned char my_uchar_var = 234;
short my_short_var = -12;
unsigned short my_ushort_var = 65535;
int my_int_var = 12;
unsigned int my_uint_var = 3456;
long my_long_var = -1234553L;
unsigned long my_ulong_var = 234556UL;
long long my_llong_var = 1123345LL;
unsigned long long my_ullong_var = 1234567ULL;
float my_float_var = 3.14;
double my_double_var = 3.14E-12;
long double my_long_double_var = 3.14E-22;

1.8. Declaration des variables

Énumrérations

enum status {ETUDIANT, STAGIAIRE}; // ETUDIANT = 0, STAGIAIRE = 1
enum status s = ETUDIANT;
enum status {ETUDIANT=1, STAGIAIRE}; // STAGIAIRE = 2
enum status {ETUDIANT=1, STAGIAIRE=14, ENSEIGNANT}; // ENSEIGNANT = 15
enum boolean {FAUX=0, VRAI};

Remarque: enum: unsigned int

1.9. L'intervalle minimum et maximum

limits.h

L'intervalle minimum et maximum de types de base en utilisant limits.h

Mots clés Intervalle
signed char [SCHAR_MIN, SCHAR_MAX]
unsigned char [0, UCHAR_MAX]

1.9. L'intervalle minimum et maximum

Mots clés Intervalle
(signed) short int [SHRT_MIN, SHRT_MAX]
unsigned short int [0, USHRT_MAX]
(signed) int [INT_MIN, INT_MAX]
unsigned int [0, UINT_MAX]
(signed) long [LONG_MIN, LONG_MAX]
unsigned long [0, ULONG_MAX]
(signed) long long [LLONG_MIN, LLONG_MAX]
unsigned long long [0, ULLONG_MAX]

1.9. L'intervalle minimum et maximum

float.h

L'intervalle minimum et maximum de types flottant en utilisant float.h

Mots clés Intervalle
float [FLT_MIN, FLT_MAX]
double [DBL_MIN, DBL_MAX]
long double [LDBL_MIN, LDBL_MAX]

1.10. taille (en octets)

sizeof

sizeof (char) //type
sizeof (my_uchar_var) //variable
printf("sizeof(char): %lu\n", sizeof (char));
printf("sizeof(long long int): %lu\n", sizeof (long long int));
printf("sizeof(my_char_var): %lu\n", sizeof (my_char_var));

Remarque 1: sizeof donne la taille d'une variable en octets ou d'un type de données.

Remarque 2: La valeur retournée peut varier, mais la taille d'une variable de type caractère est de 1 octet.

Remarque 3: La valeur retournée est du type "unsigned long int". C'est pourquoi nous utilisons "%lu".

1.11. Afficher à l'écran

Afficher à l'écran

printf("%d", my_int_var);
printf("%f", my_float_var);

1.11. printf: Afficher à l'écran

Mots clés Code de conversion
char c
unsigned char hhu
short hd
unsigned short hu
int d, i
unsigned int u
long int ld
unsigned long int lu

1.11. printf: Afficher à l'écran

Mots clés Code de conversion
long long int lld
unsigned long long int llu
float f, F,e, E
double g, G
long double Lg, LG, Le, LE
string of characters s

1.11. printf: Afficher à l'écran

Character Code de conversion
Retour-chariot \n
Tabulation \t

1.12. Les notations

Notation binaire

  int valeur = 0b10100100;

1.12. Les notations

Notation octale

  int valeurb = 0b10100100;
  int valeuro = 0244;
  printf("notation octale: %o\n", valeurb);
  printf("notation octale: %o\n", valeuro);

1.12. Les notations

Notation héxadecimale

  int valeurb = 0b10100100;
  int valeurx = 0xa4;
  printf("notation hexadecimale: %x\n", valeurb);
  printf("notation hexadecimale: %x\n", valeurx);

1.13. Les opérateurs arithmétiques

Opérateur Objectif
+ addition
- soustraction
* multiplication
/ division
% modulus

1.13. Les opérateurs arithmétiques

int a = 20, b = 10;
Opérateur Exemple Résultat
+ a + b 30
- a - b 10
* a * b 200
/ a / b 2
% a % b 0

1.14. Les opérateurs relationnels

Opérateur Objectif
< inférieur
<= inférieur ou égale
> supérieur
>= supérieur ou égale
== égale
!= différent

Remarque: Une valeur différente de zéro est considérée comme VRAIE et la valeur zéro est considérée comme FAUSSE.

1.14. Les opérateurs relationnels

int a = 20, b = 10;
Opérateur Exemple Résultat
< a < b 0
<= a <= b 0
> a > b 1
>= a >= b 1
== a == b 0
!= a != b 1

Remarque: Une valeur différente de zéro est considérée comme VRAIE et la valeur zéro est considérée comme FAUSSE.

1.15. Les opérateurs logiques

int a = 20, b = 0;
Opérateur Objectif Exemple Résultat
! Négation !a 0
&& Et a && b 0
|| Ou a || b 1

Remarque: Une valeur différente de zéro est considérée comme VRAIE et la valeur zéro est considérée comme FAUSSE.

1.16. Les opérateurs d'incrementation

int a = 20, b = 0;
Opérateur Exemple Résultat
a++ b = a++ a = 21, b = 20
++a b = ++a a = 21, b = 21
a-- b = a-- a = 19, b = 20
--a b = --a a = 19, b = 19

1.17. Les opérateurs de manipulation de bits

Bit 1 Bit 2 & | ^ (XOR)
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

Remarque: Les valeurs ci-dessus (0 et 1) sont des bits binaires et non des valeurs entières.

1.17. Les opérateurs de manipulation de bits

int a = 0b01000100;
Opérateur Objectif Exemple Résultat
~ Négation ~a 0xffffffbb
& ET a & 0x4 0x4
| OR a | 0x2 0x46
^ XOR a ^ 0x4 0x40
<< décalage à gauche a << 1 0x88
>> décalage à droite a >> 1 0x22

1.18. Les opérateurs d'affectation

int a = 20, b = 0;
Opérateur Objectif Exemple
= equal a = b
+= addition a += b
-= substraction a -= b
*= multiplication a *= b
/= division a /= b
%= modulo a %= b

Remarque: a op = b ::- a = a op b

1.18. Les opérateurs d'affectation

Opérateur Objectif Exemple
&= ET a &= b
|= OU a |= b
^= XOR a ^= b
<<= décalage à gauche a <<= b
>>= décalage à droite a >>= b

Remarque: a op = b ::- a = a op b

1.19. Structures de contrôle: les branchements conditionnels

if

if (condition) {
 ...
}

Remarque: C n'a pas de type booléen. Une valeur différente de zéro est considérée comme VRAIE et la valeur zéro est considérée comme FAUSSE.

1.19. Structures de contrôle: les branchements conditionnels

if

int a = 20, b = 0;
if (a > b) {
 printf("a est supérieur à b");
}

1.19. Structures de contrôle: les branchements conditionnels

if

if (condition1) {
 ...
} else if (condition2) {
 ...
} else {
 ...
}

Remarque 1: Toutes les nombres non nulles sont ont considérées comme vrai ('TRUE')
Remarque 2: else est optionnel

1.19. Structures de contrôle: les branchements conditionnels

if

int a = 20, b = 0;
if (a > b) {
 printf("a est supérieur à b");
} else if (a < b) {
 printf("a est inférieur à b");
} else {
 printf("a égale b");
}

1.20. Structures de contrôle: les branchements conditionnels (choix)

switch

switch (expression) {
 case valeur1 : statements1
 case valeur2 : statements2
 ...
 default : statementsn
}

Remarque: expression doit être soit: char, short, int ou long

1.20. Structures de contrôle: les branchements conditionnels (choix)

switch

int a = 20;
switch (a) {
 case 10 : statement1
  break;
 case 20 : statement2
 case 30 : statement3
  break;
 ...
 default : statementn
}

Remarque: Les deux instructions statement2 et statement3 seront exécutées.

1. Questions

Que sera-t-il affiché à l'écran suite à l'exécution de ce programme?

if (1) {
  printf("Hi");
} else {
  printf("Bonjour");
}

1.21. Structures de contrôle: les boucles

for

for(initialisation;condition;actualisation){
 ...
}

1.21. Structures de contrôle: les boucles

for

int a = 0;
for( a = 0; a < 10; a++){
 ...
}

1.21. Structures de contrôle: les boucles

for

int a = 0;
for(; a < 10; ){
 ...
}

Remarque: Une ou toutes les instructions d'initialisation, de condition ou d'actualisation peuvent être manquant.

1.21. Structures de contrôle: les boucles

for

int a = 0;
for( a = 0; a < 10; a++){
 ...
  a += 2 ;
 ...
}

1.21. Structures de contrôle: les boucles

while

while(condition){
 ...
}

1.21. Structures de contrôle: les boucles

while

int a = 20;
while(a > 0){
 ...
 a--;
 ...
}

1.21. Structures de contrôle: les boucles

while

int a = 0;
while(a < 20){
 ...
 a++;
 ...
}

1.21. Structures de contrôle: les boucles

do..while

do{
 ...
} while(condition);

1.21. Structures de contrôle: les boucles

do..while

int a = 20;
do{
 ...
  a --;
 ...
} while(a > 0);

1.21. Structures de contrôle: les boucles

do..while

int a = 0;
do{
 ...
  a ++;
 ...
} while(a < 20);

1.22. Structures de contrôle: les sauts (branchements inconditionnels)

break

do{
 ...
 if (condition 1) {
  ...
  break;
 }
 ...
} while(condition 2);

1.22. Structures de contrôle: les sauts (branchements inconditionnels)

continue

do{
 ...
 if (condition 1) {
  ...
  continue;
 }
 ...
} while(condition 2);

1.22. Structures de contrôle: les sauts (branchements inconditionnels)

break

while(condition 1){
 ...
 if (condition 2) {
  ...
  break;
 }
 ...
};

1.22. Structures de contrôle: les sauts (branchements inconditionnels)

continue

while(condition 1){
 ...
 if (condition 2) {
  ...
  continue;
 }
 ...
};

1.22. Structures de contrôle: les sauts (branchements inconditionnels)

break

for(initialisation;condition 1;actualisation){
 ...
 if (condition 2) {
  ...
  break;
 }
 ...
};

1.22. Structures de contrôle: les sauts (branchements inconditionnels)

continue

for(initialisation;condition 1;actualisation){
 ...
 if (condition 2) {
  ...
  continue;
 }
 ...
};

1. Questions

Écrivez un programme qui affiche 0..20 en ordre croissant et décroissant utilisant for, while et do..while.

1. Questions

Écrivez un boucle infini en utilisant for, while, do..while.

1.23. Les tableaux

Tableau

est un ensemble d'éléments homogènes

1.23. Les tableaux

Tableaux de tableaux

Tableaux à deux indices

1.23. Les tableaux

Tableaux de tableaux

Tableaux à plusieurs indices

1.23. Les tableaux

Déclaration: Tableaux de caractères

char name[20];

Remarque: Langage C n'a pas un type nommé 'string'.

1.23. Tableaux

Déclaration: tableaux d'entiers

int iarray[20];
float farray[20];
double darray[20];

1.23. Tableaux

Initialisation: tableau à une dimension

int i;
int array[20];
for ( i = 0; i < 20; i++) {
 array[i] = i;
}

1.23. Les tableaux

Initialisation: tableau à une dimension

int prices[5] = { 11, 12, 13, 14, 15 };
int rooms[] = { 301, 302, 303 };
char message[] = "Bonjour Le Monde!!";

Remarque: Nous n'avons pas écrit la taille de rooms, message

sizeof (prices) // 5 * sizeof(int)
sizeof (rooms) // 3 * sizeof(int)
sizeof (message) // (18 + 1 (NULL)) * sizeof(char)

1.23. Les tableaux

Initialisation: Tableaux à deux indices

int prices[2][2] = {
  {11, 12},
  {13, 14}
};
int rooms[][2] = {
  {201, 202},
  {301, 302}
};
char message[2][11] = {"Bonjour", "Le Monde!!"};

Remarque: Nous n'avons pas précisé le nombre de lignes pour rooms.

sizeof (prices) // 2 * 2 * sizeof(int)
sizeof (rooms) // 2 * 2 * sizeof(int)
sizeof (message) // 2 * 11 * sizeof(char)

1. Programmation en C: Références

Références

Crédits d'images