Présentation • P.C. Jean-Eric Pin, Directeur de recherches en
Transcription
Présentation • P.C. Jean-Eric Pin, Directeur de recherches en
X, Petite classe 15 Présentation • P.C. Jean-Eric Pin, Directeur de recherches en informatique au CNRS (LIAFA) • T.D. Olivier Devillers (INRIA) Arnaud Venet (LIX) • e-mail [email protected] [email protected] [email protected] • Recherche Automates finis. X, Petite classe 15 Automates 1|0 1|1 0|0 0 1 0|1 2 1|1 0|0 La multiplication par 3 pour les nombres binaires écrits à l'envers : 11 x 3 = 33 110100 --> 100001 X, Petite classe 15 Plan des P.C. Algorithmes • Tris • Hachage • Arbres • Graphes • Algorithmes complémentaires (polynômes, compression, etc.) Programmation • Récursivité • Pointeurs X, Petite classe 15 Plan • Structure d'un programme • Mots-clés • Identificateurs • Types de base • Règles de priorité • Déclarations de constantes, de types et de variables • Expressions et instructions • Entrées et sorties • Tris • Conseils de la semaine X, Petite classe 15 Structure d'un programme C Un programme C est constitué d'un ou plusieurs fichiers. Le nom de ces fichiers est terminé par .h ou .c : main.c main.h Les fichiers .h sont des fichiers d'en-tête (header file) : ils contiennent des définitions de constante, de type, etc. Les fichiers .c contiennent les programmes proprement dit. Règle : créer un fichier nom.h chaque fois que l'on crée un fichier nom.c X, Petite classe 15 Fichier main.h • Déclarations #define N 100 /* Constante */ • Type des Fonctions void Magique(int n); void Erreur(char s[]); void Lire(int *n); void Imprimer(int n); int main(void); X, Petite classe 15 Fichier main.c #include <stdio.h> #include <stdlib.h> #include "main.h" • Variables globales int n, a[N][N]; • Fonctions void void void void Magique(int n) { ... } Erreur(char s[]) { ... } Lire(int *n) { ... } Imprimer(int n) { ... } • Programme principal int main() { Lire(&n); Magique(n); Imprimer(n); return 0; } X, Petite classe 15 Mots-clés auto double int break else long case enum register char extern return const float short continue for signed default goto sizeof do if static struct switch typedef union unsigned void volatile while X, Petite classe 15 Système binaire 10011101 (binaire) --> 9D (hexadécimal) --> 157 (décimal) Bits, octets Adresses Adressage 16 bits, 32 bits, 64 bits Table ASCII X, Petite classe 15 Identificateurs Suite de lettres, de chiffres et de _ Le premier caractère doit être une lettre • Corrects: EstValide est_valide Matrice3x3 Code5417 FaDiese Do • Incorrects: 2Fois N! Deux-Deux Deux+Deux Fa# do (mot réservé) • C distingue majuscules et minuscules X, Petite classe 15 Les types de base • Le type caractère char codé sur un octet • Le type entier int codé sur 2, 4 ou 8 octets short entier "court" (2 octets) long entier "long" (4 octets) • Le type réel float double simple précision double précision • Qualificatif "signed" signed char [-128, 127] unsigned char [0, 255] signed short unsigned short entier signé entier non signé X, Petite classe 15 Opérateurs arithmétiques - x : signe opposé +, -, * : addition, soustraction, multiplication x / y : division x % y : "modulo", reste de la division entière de x par y (x et y entiers positifs) X, Petite classe 15 Opérateurs de comparaison == != <= < > => Attention au == ... Opérateurs logiques && || ! ET OU NON Par définition, une expression logique vaut 1 si elle est vraie et 0 sinon. L'évaluation se fait de gauche à droite et cesse dès que le résultat est connu X, Petite classe 15 Opérateurs logiques e = (i == 0) && ((j >= 0) || (k < j)) Si i = 1, on a e = 0 et les tests j >= 0 et k < j ne sont même pas effectués. Permet d'éviter les problèmes de Pascal var t : array[1..5] of integer; procedure Recherche(v: integer); begin i := 1; while (i <= 5) and (t[i] <> v) i := i + 1; ... end; X, Petite classe 15 Version C int t[5]; void Recherche(int v) { int i = 0; } while ((i <= 4) && (t[i] != v)) i++; X, Petite classe 15 Constantes entières Sont déclarées dans un fichier .h par un #define #define CENT 100 /* Décimal */ #define QUINZE 017 /* En octal ! */ #define MILLE 0x3E8 /* En hexadéc. */ Suffixes possibles : L, U #define GRAND 123456789L /* long */ #define TREIZE 0xDUL /* unsigned long */ Constantes prédéfinies dans stdio.h EOF end of file /* Type int */ NULL 0 /* Type int */ X, Petite classe 15 Constantes de type char Sont déclarées dans un fichier .h par un #define #define I_GREC 'y' #define FIN_DE_LIGNE '\n' #define TABULATION '\t' #define BELL '\a' Caractères spéciaux : \n \t \v \b \\ \? \' \" \r \f \a \ooo Nombre octal \xhh Nombre hexadécimal X, Petite classe 15 Séquence d'instructions { instruction1; instruction2; instruction3; } Exemple if (n % 2) n=3*n+1 else n = n / 2; if (n % 2) { n = 2 * n + 1; printf("%d\n", n); } else n = n / 2; X, Petite classe 15 If else if (expression) SuiteInstructions1; else SuiteInstructions2; int max(int i, int j) { if ( i < j) max = j; else max = i; } X, Petite classe 15 Ambiguïté du "if then else" Comment comprendre : if b1 if b2 instruction1 else instruction2; Version 1 if b1 if b2 instruction1; else instruction2; Version 2 if b1 if b2 instruction1; else instruction2; Version 2 corrigée : if b1 { if b2 instruction1; } else instruction2; X, Petite classe 15 If else if ... if (expression) SuiteInstructions1; else if SuiteInstructions2; else if SuiteInstructions3; else if SuiteInstructions4; else SuiteInstructions5; X, Petite classe 15 Tris Ranger dans l'ordre croissant (au sens large) une suite finie d'entiers t[0], …, t[N-1] Tri.h #include <stdio.h> #include <stdlib.h> #include <time.h> /* printf */ /* rand */ /* clock */ #define N 10 void void void void void void void Initialisation(void ); Echanger (int i, int j); Impression(void ); TriSelection(void ); TriBulle(void ); TriInsertion(void ); TriShell(void ); X, Petite classe 15 Tri.c int t [N ]; /* Le tableau */ void Initialisation () { int i, s; s = (unsigned int ) clock(); srand(s); for (i = 0; i < N; ++i) t[i] = rand() % 128; } void Echanger (int i, int j) { int c; } c = t[i]; t[i] = t[j]; t[j] = c; X, Petite classe 15 Tri.c void Impression () { int i; for (i = 0; i < N; ++i) printf("%3d ", t[i]); printf("\n"); } X, Petite classe 15 Tri par sélection • On recherche le plus petit élément t[m] de la suite t[0] ... t[N-1] et on l'échange avec t[0] • On recherche le plus petit élément t[m] de la suite t[1] ... t[N-1] et on l'échange avec t[1], etc void TriSelection() { int i, j, min; } for (i = 0; i < N - 1; ++i) { min = i; for (j = i +1; j < N; ++j) if (t[j] < t[min]) min = j; Echanger(i, min); } X, Petite classe 15 Tri bulle • On parcourt la suite t[0] ... t[N-1] en échangeant les éléments consécutifs t[j-1] > t[j] • On parcourt la suite t[0] ... t[N-2] en échangeant les éléments consécutifs t[j-1] > t[j], etc. void TriBulle() { int i, j; } for (i = N - 1; i >= 0; --i) for (j = 1; j <= i; ++j) if (t[j-1] > t[j]) Echanger(j-1, j); X, Petite classe 15 Tri par insertion • On suppose les i-1 premiers éléments triés et on insère le i-ème à sa place parmi les i premiers void TriInsertion() { int i, j, v; } for (i = 1; i < N; ++i) { v = t[i]; j = i; while ((j > 0) && (t[j-1] > v)) { t[j] = t[j-1]; --j; } t[j] = v; } ↓ min 18 ↑i 3 3 18 10 ↑i 3 3 3 3 3 10 25 9 3 11 13 23 8 11 13 23 8 ↓ min 3 3 3 3 3 25 9 ↓ min 10 25 ↑i 9 8 9 8 8 8 3 25 ↑i 9 9 9 18 11 13 23 8 18 11 13 23 10 ↓ min ↓ min 25 18 ↑i 10 10 11 23 10 13 23 25 ↓ min 18 11 ↑i 11 13 ↓ min 18 13 ↑i 23 25 18 23 ↑i 25 ↓ min 3 3 8 9 10 11 13 ↓ min 3 3 8 9 10 11 13 18 23 25 ↑i 3 3 8 9 10 11 13 18 23 Tri par sélection 25 18 3 10 25 9 3 11 13 23 8 ↑i 3 10 18 9 3 11 13 23 8 25 ↑i 3 10 9 3 11 13 18 8 23 ↑i 3 9 3 10 11 13 8 18 ↑i 3 3 9 10 11 8 13 ↑i 3 3 9 10 8 11 ↑i 3 3 9 8 10 ↑i 3 3 8 ↑i 9 3 3 ↑i 8 3 3 8 25 23 25 18 23 25 13 18 23 25 11 13 18 23 25 10 11 13 18 23 25 9 10 11 13 18 23 25 9 10 11 13 18 23 25 Tri bulle 18 3 10 ↑i 25 9 3 11 13 23 8 3 18 10 25 ↑i 9 3 11 13 23 8 3 10 18 25 ↑i 9 3 11 13 23 8 3 10 18 25 9 3 ↑i 11 13 23 8 3 9 10 18 25 3 11 ↑i 13 23 8 3 3 9 10 18 25 11 13 ↑i 23 8 3 3 9 10 11 18 25 13 23 ↑i 8 3 3 9 10 11 13 18 25 23 ↑i 8 3 3 9 10 11 13 18 23 25 8 ↑i 3 3 8 9 10 11 13 18 23 25 Tri par insertion X, Petite classe 15 Les conseils de la semaine… • Faire des fichiers .h et .c • Ne pas oublier les #include <stdio.h> #include <stdlib.h> #include <math.h> /* etc. */ • Commenter les programmes et respecter un style de programmation.