Algorithmes et C appliqués aux Systèmes Numériques
                        John Samuel
                        CPE Lyon
                        Année: 2018-2019
                        Courriel: john(dot)samuel(at)cpe(dot)fr
                        
                
                              
                
		 
		
	
	
		
		
			Objectifs
			
				- Syntaxe et bases de la programmation
- Manipulation de buffer
- Initiation au concept de chaine de compilation
- Algorithmes et structures de données
 
                              
                        
		 
		
	
	
		
		
			Ce module est divisé en deux parties:
			
				- Cours: 8h
- Travaux pratiques: 24h
 
                        
		 
		
	
	
		
		
			Module:
			
				- Système d'exploitation: Linux
- Compilateur: gcc
- Éditeur: Vim, Emacs (ou selon votre choix)
Cours:
			
				- Interactifs
- Programmation en live
- Les questions: chaque 20-30 mins
- Devoir surveillé: 60%
 
                              
                        
		 
		
	
	
		
		
			
				
					| Cours | Dates | 
				
					| Cours 1 | 24 septembre | 
				
					| Cours 2 | 26 septembre | 
			
		 
		
	
	
		
		
			
				
					| Cours | Dates | 
				
					| Cours 1 | 24 septembre | 
				
					| Cours 2 | 8 octobre | 
			
		 
		
	
	
	
		
		
			Travaux pratiques
			
				- Groupes: A, B, C, D
- Programmation en binôme
 
		
	
	
		
		
			Travaux pratiques:
			
				- TP: 40%
- Projet divisé en 7 exercises
 
                              
                        
		 
		
	
	
		
		
			
				
					| TP | Points | 
				
					| TP 1 | 1 | 
				
					| TP 2 | 3 | 
				
					| TP 3 | 3 | 
				
					| TP 4 | 4 | 
				
					| TP 5 | 4 | 
				
					| TP 6 | 5 | 
				
					| TP 7 | (BONUS, max. 2) | 
			
		 
		
	
	
		
		
			Travaux pratiques
                        Chaque question a un niveau de difficulté
			
                           - ★: Facile
- ★★: Difficulté moyenne
- ★★★: Difficile
 
		
	
	
		
		
			Travaux pratiques: Rendus
                        
                          - Il y a deux parties de rendu: rapport d’auto-évaluation et les sources
- Votre dossier de rendu doit contenir les fichiers suivants:
                              - README: rapport d’auto-évaluation
- INSTALL: Description de la compilation et l’exécution de votre application
- Makefile
- CONTRIBUTORS: Noms et prénoms de contributeurs
- src/ : les sources
 
		
	
	
		
		
			Travaux pratiques: Rendus
                        
                          - Votre rendu doit renommer comme groupe[ABCD]NN, où NN est le numéro de votre groupe (e.g., groupeA01, groupeB01 etc.).
- Ecrivez README, INSTALL et CONTRIBUTORS en format markdown.
- Le contenu de README rapport d’auto-évaluation :
                            
                              - Objectif: Quel est l’objectif de votre projet/TP?
- Exercice N (N: [1..7])
                               
                                 - Fichiers: Noms de fichiers
- Bibliothèques: les bibliothèques standards
- Références: les URLs, les numéros de groupes
- Difficulté: niveau de difficulté (facile, moyenne, difficile)
- Commentaires (optionnels): remarques etc.
 
 
 
		
	
	
	
		
		
			Travaux pratiques: Objectifs
                        
                          - Créer, compiler et exécuter un projet C
- Comprendre la chaine de compilation en utilisant GCC (GNU compilation chain) : prétraitement jusqu’à l’exécution
- Travailler avec les bibliothèques standards et les appels de système d’exploitation (fichiers, les sockets réseau etc.)
- Comprendre les pointeurs et manipuler les buffers en utilisant les pointeurs
- Travailler avec les différents formats de données comme BMP et les structures de données
- Créer un simple programme client-serveur pour le transfert de fichiers et messages
- Exécuter les applications existantes sur la machine (e.g. GNU plot)
- Documenter et tester une application
 
		
	
	
		
		
			
                          Donnez des exemples de logiciels écrits en C
		
		
	
	
		
		
			C est un langage de programmation
			
				- impératif (procédural)
- structuré
- compilée
				Remarque: Pas de classes (Ce n'est pas un langage de programmation orienté-objet!!!)
                         
                        
                              
                              
		        
		 
		
	
	
		
		
			C
			
				- Auteur Dennis Ritchie, Bell Labs
- Date de première version en 1972
 
		
	
	
		
		
			
			/* 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;
 }
			
		
		
	
	
		
		
			
				/* Fichier: bonjour2.c 
 * affiche un message à l'écran en utilisant un variable
				
 * auteur: John Samuel 
 * Ceci est un commentaire
				sur plusieurs lignes 
 */ 
 
 #include <stdio.h> // headers 
				
 int main()
				{ 
   int year = 2017;
				//déclaration d'un variable 
   printf("Bonjour le Monde!!! C'est l'annee %d", year);
   return 0;
 }
			
		
		
	
	
		
		
			
La compilation
			$ gcc bonjour1.c
			L'exécution
			
				$./a.out 
 Bonjour le Monde!!!
			
		
		
	
	
		
		
			
La compilation
			
				$ gcc -o bonjour bonjour2.c
			
			L'exécution
			
				$./bonjour 
 Bonjour le Monde!!! C'est l'annee 2017
			
		
		
	
	
		
		
			Commentaires sur une ou plusieurs lignes
			// Ceci est un commentaire sur une ligne
                        
			/* Ceci est un 
			        * commentaire sur 
			        * quatre lignes 
                                */
		 
		
	
	
		
		
			
				
					| 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 | 
			
		 
		
	
	
		
		
			
				
					| 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!
			
		 
		
	
	
		
		
			
			  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
			
                        
                              
			
		 
		
	
	
		
		
			
			  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;
			
		
		
	
	
		
		
			énumrérations
			
			  enum status {ETUDIANT, STAGIAIRE};
			  enum status  s = ETUDIANT;
			
			
			  enum status {ETUDIANT=1, STAGIAIRE};
			
			
			  enum boolean {FAUX=0, VRAI};
			
			
				Remarque: enum: unsigned int
			
		 
		
	
	
		
		
			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 | [UCHAR_MIN, UCHAR_MAX] | 
			
		 
		
	
	
		
		
			
				
					| 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] | 
			
		 
		
	
	
		
		
			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] | 
			
		 
		
	
	
		
		
			
sizeof
			
			  sizeof  (char) //type
			  sizeof  (my_uchar_var) //variable
			
		
		
	
	
		
		
			Afficher à l'écran
			
			  printf("%d",
			  	my_int_var);
			  printf("%f",
			  	my_float_var);
			
                        
                              
			
		 
		
	
	
		
		
			
				
					| 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 | 
			
		 
		
	
	
		
		
			
				
					| Mots clés | Code de conversion | 
				
					| long long int | lld | 
				
					| unsigned long long int | llu | 
				
					| float | f, F | 
				
					| double | g, G | 
				
					| long double | Lg | 
				
					| string of characters | s | 
			
		 
		
	
	
		
		
			
				
					| Character | Code de conversion | 
				
					| Retour-chariot | \n | 
				
					| Tabulation | \t | 
			
		 
		
	
	
		
		
			Notation binaire
                        
                            
                        
                        
			  
                                 int
                              valeur = 0b10100100;
                          
                        
		 
		
	
	
		
		
			Notation octale
                        
                            
                        
                        
			  
                                 int
                              valeur = 0b10100100;
                              
   printf("notation octale: %o\n", valeur);
                          
                        
                        
                              
                        
		 
		
	
	
		
		
			Notation héxadecimale
                        
                            
                        
                        
			  
                                 int
                              valeur = 0b10100100;
                              
   printf("notation hexadecimale: %x\n", valeur);
                          
                        
                        
                              
                        
		 
		
	
	
		
		
			
				
					| Opérateur | Objectif | 
				
					| + | addition | 
				
					| - | soustraction | 
				
					| * | multiplication | 
				
					| / | division | 
				
					| % | modulus | 
			
		 
		
	
	
		
		
                
			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 | 
			
		 
		
	
	
		
		
			
				
					| Opérateur | Objectif | 
				
					| < | inférieur | 
				
					| <= | inférieur ou égale | 
				
					| > | supérieur | 
				
					| >= | supérieur ou égale | 
				
					| == | égale | 
				
					| != | différent | 
			
		 
		
	
	
		
		
                
			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 | 
			
		 
		
	
	
		
		
                
			int
                            a = 20,
			    b = 0;
                
			
				
					| Opérateur | Objectif | Exemple | Résultat | 
				
					| ! | Négation | !a | 0 | 
				
					| && | Et | a && b | 0 | 
				
					| || | Ou | a || b | 1 | 
			
		 
		
	
	
		
		
                
			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 | 
			
		 
		
	
	
		
		
			
				
					| 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 | 
			
		 
		
	
	
		
		
                
			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 | 
			
		 
		
	
	
		
		
                
			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
			
		 
		
	
	
		
		
			
				
					| 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
			
		 
		
	
	
		
		
			
if
			if (condition) {
			 ...
			}
		
		
	
	
		
		
			
if
			
			int
                            a = 20,
			    b = 0;
                        if (a >
                            b) {
			 printf("a est supérieur à b");
			}
		
		
	
	
		
		
			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
			
		 
		
	
	
		
		
			
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");
			}
			
		
		
	
	
		
		
			switch
			
				switch (expression) { 
				 case valeur1 : statements1 
				 case valeur2 : statements2 
				 ...
				 default : statementsn 
				}
			
                        
				Remarque: expression doit être soit:
                                char,
                                short,
                                int ou
                                long
                        
		 
		
	
	
		
		
			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.
			
		 
		
	
	
		
		
			
			  Que sera-t-il affiché à l'écran suite à l'exécution de ce programme?
			if (1) {
			  printf("Hi");
			} else {
			  printf("Bonjour");
			}
			
		
		
	
	
		
		
			for
			for(initialisation;condition;actualisation){
			 ...
			} 
			
                        
                            
                        
		 
		
	
	
		
		
			for
			
			int
                                a = 0;
                        for( a = 0;
                                a > 10;
                                a++){
			 ...
			} 
			
                        
                            
                        
		 
		
	
	
		
		
			for
			
			int
                                a = 0;
                        for(;
                                a > 10;
                                ){
			 ...
			} 
			
			
				Remarque: Une ou toutes les instructions d'initialisation, de condition ou d'actualisation peuvent être manquant.
			
		 
		
	
	
		
		
			
for
			
                 	int
                                a = 0;
                        for( a = 0;
                                a > 10;
                                a++){
			 ...
			  a += 2 ;
			 ...
			} 
			
		
		
	
	
		
		
			while
			while(condition){
			 ...
			} 
			
                        
                            
                        
		 
		
	
	
		
		
			while
			
                 	int
                                a = 20;
                        while(a > 0){
			 ...
			 a--;
			 ...
			} 
			
                        
                            
                        
		 
		
	
	
		
		
			
while
			
                	int
                                a = 0;
                        while(a < 20){
			 ...
			 a++;
			 ...
			} 
			
		
		
	
	
		
		
			do..while
			do{
			 ...
			} while(condition);
			
                        
                            
                        
		 
		
	
	
		
		
			do..while
			
                	int
                                a = 20;
                        do{
			 ...
			  a --;
			 ...
			} while(a > 0);
			
                        
                            
                        
		 
		
	
	
		
		
			
do..while
			
                	int
                                a = 0;
                        do{
			 ...
			  a ++;
			 ...
			} while(a < 20);
			
		
		
	
	
		
		
			break
			do{
			 ...
			 if (condition 1) {
			  ...
			  break;
			 }
			 ...
			} while(condition 2);
			
                        
                            
                        
		 
		
		
	
	
		
		
			continue
			do{
			 ...
			 if (condition 1) {
			  ...
			  continue;
			 }
			 ...
			} while(condition 2);
			
                        
                            
                        
		 
		
		
	
	
		
		
			break
			while(condition 1){
			 ...
			 if (condition 2) {
			  ...
			  break;
			 }
			 ...
			};
			
                        
                            
                        
		 
		
		
	
	
		
		
			continue
			while(condition 1){
			 ...
			 if (condition 2) {
			  ...
			  continue;
			 }
			 ...
			};
			
                        
                            
                        
		 
		
		
	
	
		
		
			break
			for(initialisation;condition 1;actualisation){
			 ...
			 if (condition 2) {
			  ...
			  break;
			 }
			 ...
			};
			
                        
                            
                        
		 
		
		
	
	
		
		
			continue
			for(initialisation;condition 1;actualisation){
			 ...
			 if (condition 2) {
			  ...
			  continue;
			 }
			 ...
			};
			
                        
                            
                        
		 
		
		
	
	
		
		
			
			 Écrivez un programme qui affiche 0..20 en ordre croissant et décroissant
                         utilisant for, while et do..while.
		
		
	
	
		
		
			
			 Écrivez un boucle infini en utilisant for, while, do..while.
		
		
		
	
	
		
		
			Tableau
                        est un ensemble d'éléments homogènes
                        
                        
                            
                        
		 
		
		
	
	
		
		
			Tableaux de tableaux
                        Tableaux à deux indices
                        
                        
                            
                        
		 
		
		
	
	
		
		
			Tableaux de tableaux
                        Tableaux à plusieurs indices
                        
                        
                            
                        
		 
		
	
	
		
		
			Déclaration
			
				char name[20];
			
                        
			Remarque: Langage C n'a pas un type nommé 'string'.
                        
		 
		
	
	
		
		
			
Déclaration
			
				int iarray[20];
				float farray[20];
				double darray[20];
			
		
		
	
	
		
		
			
Initialisation
			
				int i; 
				int array[20];
				for ( i = 0;
					i < 20; i++) {
				 array[i] =
					i;
				}
			
		
		
	
	
		
		
			Initialisation
			
				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
                        
		 
		
	
	
		
		
			
Initialisation
			
				int prices[2][2] = {
				    {11, 12}, 
				    {13, 14} 
				 }; 
				int rooms[][2] = {
				    {201, 202}, 
				    {301, 302} 
				 }; 
				char message[2][11] =
					{"Bonjour", "Le Monde!!"};
			
		
		
	
	
		
		
			Références
			
			Crédits d'images