Présentation • P.C. Jean-Eric Pin, Directeur de recherches en

Commentaires

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.

Documents pareils