algo-à-c.pdf
TRANSCRIPT
-
Algorithmique...
De lalgorithmique au C
Nicolas [email protected]
Michel [email protected]
INSA de Rouen
De lalgorithmique au C - v1.1 p. 1
-
Plan...Notes
Un langage compil
Un langage bas sur desmodules
Traduire les types de bases
Traduire les constantes
Traduire les oprateurs usuels
Traduire les instructionssimples et composes
Traduire les conditionnelles
Traduire les itratifs
Les pointeurs
Traduire les fonctions et lesprocdures
Traduire lire ou crire
Traduire un programme
Un exemple
De lalgorithmique au C - v1.1 p. 2
-
Notes...Ce cours nest pas un cours prsentant tous les concepts du CIl prsente seulement la manire de traduire proprement un programmealgorithmique en programme CVous ne trouverez donc pas dans ce cours toutes les subtilits du C, maisvous pouvez vous rfrer des cours sur le langage C aux adressessuivantes :
http://www.enstimac.fr/~gaborit/lang/CoursDeC/
http://www-rocq.inria.fr/codes/Anne.Canteaut/COURS_C/
http://www-ipst.u-strasbg.fr/pat/program/tpc.htm
http://www710.univ-lyon1.fr/~bonnev/CoursC/CoursC.html
. . .
De lalgorithmique au C - v1.1 p. 3
-
Un langage compil...Le C est un langage compil
Les compilateurs C transforment un programme C (fichier suffix par .c) enprogramme objet (fichier suffix par .o) en deux phases :
1. Le prprocesseur agit sur les macros (commandes prcdes dun #) ettransforme le code source C en un autre code source C (ne contenant plusaucune macro) en remplaant le code macro par son valuation
Par exemple si le code C contient linstruction #define PI 3.14159, le prprocesseur remplacera
dans le code source la chane de caractres PI par la chane de caractres 3.14159 partir de la
position du #define
2. Le compilateur transforme ce deuxime code source C en programme machine(nomm code objet)
Sous Linux (et gnralement sous unix), on utilise le compilateur gcc (GNUC Compiler) avec loption -c pour compiler
De lalgorithmique au C - v1.1 p. 4
-
Un langage compil...Par exemple pour compiler le programme helloworld.c suivant (dont onexpliquera le contenu plus tard), il faut taper gcc -c helloworld.c, on obtientalors le fichier helloworld.o# i n c l u d e < s t d i o . h>
i n t main ( ) {p r i n t f ( " H e l l o wor ld \ n " ) ;
}
De lalgorithmique au C - v1.1 p. 5
-
Un langage bas sur des modules...Le langage C utilise le concept de module (ou de librairie) qui permet decrer et dutiliser des bibliothques de fonctions qui peuvent tre utilisesdans plusieurs programmes
De ce fait, le code objet produit par le compilateur nest pas un programmeexcutable car il utilise certainement des fonctions dfinies dans des modules
Pour le rendre excutable il faut le lier aux modules adquates : cest ce quelon nomme ldition des liens (ou linkage)Cette dition des liens seffectue toujours avec gcc (sans option) suivi descodes objets du programme et des modules (non standards) utiliss
De lalgorithmique au C - v1.1 p. 6
-
Un langage bas sur des modules...Par exemple pour linker helloworld.o on tape gcc helloworld.o
Il ny a que helloworld.o car le seul module utilis est le module stdio.hqui est un module standard
Le programme excutable a.out est alors cr
Si la place de lexcutable a.out, on veut obtenir lexcutable helloworld ilfaut utiliser loption -o suivi du nom du fichier excutable dsir (ici -ohelloworld)
Remarque :
Si le programme nutilise aucune librairie non standard, on peut compileret linker directement en utilisant gcc suivi du fichier C (avecoptionnellement loption -o), par exemple :
gcc -o helloworld helloworld.cDe lalgorithmique au C - v1.1 p. 7
-
Traduire les types simples...Le C propose les types simples suivants :
int, long, short, float, double, charOn peut donc suivre les rgles de traduction suivantes :
Algorithmique C
Entier,Naturel int, long, short
Rel float, double
Caractre char
Boolen int (1=Vrai, 0=Faux)
Chane de caractres Voir cours sur les tableaux
De lalgorithmique au C - v1.1 p. 8
-
Traduire les constantes...Pour traduire les constantes entires, le C propose trois notations :
1. La notation dcimale, en base dix, par exemple 379
2. La notation octale, en base huit, qui doit commencer par un zro parexemple 0573
3. Le notation hexadcimale, en base seize, qui doit commencer par un zrosuivi dun x (ou X), par exemple 0X17B (ou 0x17B, 0X17b, 0x17b)
Les constantes caractres sont entoures de quote, par exemple a
Certains caractres (les caractres non imprimables, avec un code ASCIIinfrieur 32, le \, le ) ne sont utilisables quen prfixant par un \:
le code ASCII du caractre (exprim en octal), par exemple \001
un caractre tel que \n, \t, \\, \
De lalgorithmique au C - v1.1 p. 9
-
Traduire les constantes...Pour les constantes relles, on utilise le . pour marquer la virgule et lecaractre e suivi dun nombre entier, ici a, pour reprsenter 10a, parexemple :
2. , .3, 2e4, 2.3e4
les constantes chane de caractres doivent tre entoures de guillemet, parexemple "une chaine"
Par dfaut le compilateur ajoute la fin de la chane de caractres \0,qui est le marqueur de fin de chane
Il ny a pas de constante nomme en C, il faut utiliser la commande#define du prprocesseur
De lalgorithmique au C - v1.1 p. 10
-
Traduire les oprateurs...On traduit les oprateurs en respectant les rgles suivantes :
Algorithmique C
=
=, 6= ==, !=
, =
et, ou, non &&, ||, !
+, -, *, / +, -, *, /
div, mod /, %
De lalgorithmique au C - v1.1 p. 11
-
Traduire les oprateurs...Les oprateurs unaires ++ et sont des oprateurs particuliers quipeuvent avoir jusqu deux effets de bord:
En dehors de toute affectation, elle incrmente loprande associe, parexemple
i++ et ++i sont quivalents i=i+1
Lorsquils sont utiliss dans une affectation, tout dpend de la position deloprateur par rapport loprande, par exemple :
j=i++ est quivalent j=i;i=i+1;j=++i est quivalent i=i+1;j=i;
De lalgorithmique au C - v1.1 p. 12
-
Les instructions...Il existe deux types dinstructions en C :
Les instructions simples (expression, appel de fonction, etc.)Elles finissent toujours par un ;Par exemple :
a=a +1;
Les instructions composes qui permettent de considrer unesuccession dinstructions comme tant une seule instruction
Elles commencent par { et finissent par }Par exemple :
{ a=a +1; b=b +2;}
De lalgorithmique au C - v1.1 p. 13
-
Traduire les variables...On dclare en C une variable en la prcdant de son type, par exemple :
i n t a ;f l o a t x ;char c ;
Une variable globale est dfinie en dehors de toute fonctionSa porte est le fichier o elle est dfinie partir de sa dfinition (pasau dessus)
Une variable locale est dfinie lintrieur dune fonctionSa porte est uniquement la fonction ou elle a t dfinie
De lalgorithmique au C - v1.1 p. 14
-
Les conditionnelles...Linstruction si...alors...sinon est traduit par linstruction if,qui a la syntaxe suivante :
i f ( c o n d i t i o n )/ / i n s t r u c t i o n ( s ) du i f
[ e l s e/ / i n s t r u c t i o n ( s ) du e l s e
]
Par exemple :
i f ( a
-
Les conditionnelles...Remarque :
Lorsquil y ambiguit sur la port du else dune instruction if, leelse dpend toujours du if le plus prochePar exemple :
i f ( a>b ) i f ( cb )i f ( cb ) {i f ( c
-
Les conditionnelles...Linstruction cas..o est traduite par linstruction switch, qui a lasyntaxe suivante :
s w i t c h ( l e S e l e c t e u r ) {c a s e c a s 1 :
/ / i n s t r u c t i o n ( s ) du cas 1break ;
c a s e c a s 2 :/ / i n s t r u c t i o n ( s ) du cas 2break ;
. . .d e f a u l t :
/ / i n s t r u c t i o n ( s ) du d e f a u l t}
De lalgorithmique au C - v1.1 p. 17
-
Les conditionnelles...Par exemple :s w i t c h ( c h o i x ) {
case t : p r i n t f ( " vous v o u l e z un t r i a n g l e " ) ; break ;case c : p r i n t f ( " vous v o u l e z un c a r r e " ) ; break ;case r : p r i n t f ( " vous v o u l e z un r e c t a n g l e " ) ; break ;d e f a u l t : p r i n t f ( " e r r e u r . recommencez ! " ) ;
}
De lalgorithmique au C - v1.1 p. 18
-
Traduire les itrations...Linstruction Pour est traduite par linstruction for, qui a la syntaxesuivante :f o r ( i n i t i a l i s a t i o n ;
c o n d i t i o n _ d _ a r r e t ;o p e r a t i o n _ e f f e c t u e _ _ c h a q u e _ i t r a t i o n )
i n s t r u c t i o n ;
Par exemple :
f o r ( i =0 ; i
-
Traduire les itrations...Linstruction Tant...que est traduite par linstruction while, qui a lasyntaxe suivante :
whi le ( c o n d i t i o n )i n s t r u c t i o n ;
Par exemple :
i =0 ;whi le ( i
-
Traduire les itrations...Linstruction rpter est traduite par linstruction do..while, qui a lasyntaxe suivante :
doi n s t r u c t i o n ;
whi le ( c o n d i t i o n ) ;
Par exemple :
i =0 ;do {
p r i n t f ( "%d \ n " , i ) ;i ++;
} whi le ( i
-
Les pointeurs...Lorsque lon dclare une variable, par exemple un entier i, lordinateurrserve un espace mmoire pour y stocker les valeurs de iLemplacement de cet espace dans la mmoire est nomm adresse
Dans lanalogie de larmoire que nous avons vu dans un coursprcdent, ladresse correspond au numro du tiroir
Un pointeur est une variable qui permet de stocker une adressePar exemple si on declare une variable entire i (initialise 10) et quelon dclare un pointeur p dans lequel on range ladresse de i (on dit que ppointe sur i), on a par exemple le schma suivant :
i p
124
10Mmoire :
226
124
De lalgorithmique au C - v1.1 p. 22
-
Les pointeurs...On dclare une variable de type pointeur en suffixant le type de la variablepointe par le caractre *, par exemple
i n t i , j ;i n t p ;
Il existe deux oprateurs permettant dutiliser les pointeurs :& : permet dobtenir ladresse dune variable, permettant donc unpointeur de pointer sur une variable, par exemple
p=&i ; / / p p o i n t e s u r i
* : permet de drfrencer un pointeur, cest--dire daccder lavaleur de la variable pointe, par exemple
p=p +2; / / a j o u t e 2 a ij =p ; / / met l a v a l e u r de i dans j ( donc 12)
De lalgorithmique au C - v1.1 p. 23
-
Les pointeurs...Par dfaut lorsque lon dclare un pointeur, on ne sait pas sur quoi il pointeComme toute variable, il faut linitialiser
On peut dire quun pointeur ne pointe sur rien en lui affectant la valeurNULLPar exemple :
i n t i ;i n t p1 , p2 ;p1=&i ;p2=NULL;
De lalgorithmique au C - v1.1 p. 24
-
Traduire les fonctions...On dclare une fonction en respectant la syntaxe suivante :t y p e R e t o u r nomFonct ion ( t y p e 1 param1 , t y p e 2 param2 , . . . ) {
/ / v a r i a b l e s l o c a l e s
/ / i n s t r u c t i o n s avec au moins/ / une f o i s l i n s t r u c t i o n r e t u r n
}
Par exemple :
i n t plusUn ( i n t a ) {return a +1;
}
De lalgorithmique au C - v1.1 p. 25
-
Traduire les procdures...Il ny a pas de procdure en C
Pour traduire une procdure, on cre une fonction qui ne retourne pas devaleur, on utilise alors le type void comme type de retour
Tous les passages de paramtres en C sont des passages de paramtres enentre (on parle de passage par valeur)
Lorsque lon veut traduire des passages de paramtres en sortie ou enentre/sortie on utilise les pointeurs (on parle de passage de paramtrepar adresse)
On passe le pointeur sur la variable en lieu et place de la variable
De lalgorithmique au C - v1.1 p. 26
-
Passage de paramtre par valeur...
i n t c a r r e ( i n t x ) {return ( xx ) ;
}
void exemple ( ) {i n t i = 3 ;i n t j ;
j = c a r r e ( i ) ;p r i n t f ( "%d " , j ) ;
}
exemple carre
Avant appel i = 3de carre j = ?
Appel i = 3 x = 3de carre j = ?
Aprs appel i = 3de carre j = 9 9
copie
retour
De lalgorithmique au C - v1.1 p. 27
-
Passage de paramtre par adresse...
void remiseAZero ( i n t p ) {p =0;
}
void exemple2 ( ) {i n t i =10;
remiseAZero (& i ) ;p r i n t f ( "%d " , i ) ;
}
exemple carreAvant appel i = 10
Appel i = 10de remiseAZero &i p = 124
Aprs appel i = 0de remiseAZero
i p
124
10Mmoire :
226
124
copie
De lalgorithmique au C - v1.1 p. 28
-
Traduire crire...Linstruction printf (du module stdio.h) permet dafficher desinformations lcranSyntaxe :
p r i n t f ( " c h a n e de c a r a c t r e s " [ , v a r i a b l e s ] )
Si des variables suivent la chane de caractres, cette dernire doitspcifier comment prsenter ces variables :
%d pour les entiers (int, short, long)%f pour les rels (float, double)%s pour les chanes de caractres%c pour les caractres
La chane de caractres peut contenir des caractres spciaux :\n pour le retour chariot\t pour les tabulations
De lalgorithmique au C - v1.1 p. 29
-
Traduire crire...Par exemple :
i n t i =1 ;f l o a t x = 2 . 0 ;p r i n t f ( " Bonjour \ n " ) ;p r i n t f ( " i = %d \ n " , i ) ;p r i n t f ( " i = %d , x = %f \ n " , i , x ) ;
. . . affiche :Bonjouri = 1i = 1, x=2.0
De lalgorithmique au C - v1.1 p. 30
-
Traduire lire...Linstruction scanf (du module stdio.h) permet lutilisateur desaisir des informations au clavierSyntaxe :
s c a n f ( " c h a n e de f o r m a t a g e " , p o i n t e u r var1 , . . . )
La chane de formatage spcifie le type des donnes attendues, parexemple :
%d pour les entiers (int, short, long)%f pour les rels (float, double)%s pour les chanes de caractres
%c pour les caractres
De lalgorithmique au C - v1.1 p. 31
-
Traduire lire...Par exemple :
i n t i ;f l o a t x ;s c a n f ( "%d%f " ,& i ,&x ) ;
De lalgorithmique au C - v1.1 p. 32
-
Traduire les programmes...Le programme principal en C est une fonction (comme une autre) dont lenom est main et son type de retour est int
Programme nom du programmeDfinition des constantesDfinition des typesDclaration des variables principalesDfinition des sous-programmes
dbutinstructions du programme principal
fin
/ / i n c l u r e l e s l i b r a i r i e s (# i n c l u d e )/ / d e f i n i r l e s c o n s t a n t e s (# d e f i n e )/ / d e f i n i r l e s t y p e s/ / d e f i n i r l e s f o n c t i o n si n t main ( ) {
/ / d e c l a r e r l e s v a r i a b l e s du/ / programme p r i n c i p a l/ / i n s t r u c t i o n s
}
De lalgorithmique au C - v1.1 p. 33
-
Un exemple...Nous allons traduire le programme suivant :Programme NombrePremier
Dclaration n : Entier; c : Caractrefonction estPremier (a : Entier) : Boolen
dbutrpter
crire(Entrez un entier :)lire(n)si estPremier(n) alors
crire(n," est premier")sinon
crire(n," nest pas premier")finsirpter
crire("Voulez vous tester un autre nombre (O/N) :")lire(c) ;
jusqu ce que c=O ou c=o ou c=n ou c=Njusqu ce que c=n ou c=N
fin
De lalgorithmique au C - v1.1 p. 34
-
Un exemple...avec :fonction estPremier (a : Entier) : Boolen
Dclaration i : Entier
dbuti 2tant que i
-
Un exemple...Le programme C correspondant :
# inc lude < s t d i o . h>
i n t e s t P r e m i e r ( i n t a ) {i n t i =2 ;whi l e ( ( i
-
Un exemple...
p r i n t f ( "%d n e s t pas p r e m i e r \ n " , n ) ;do {
p r i n t f ( " Voulez vous t e s t e r un a u t r e nombre (O/N) : " ) ;s c a n f ( "%c " ,&c ) ;
} whi l e ( c != o && c != O && c != n && c != N ) ;} whi l e ( c != n && c != N ) ;
}
De lalgorithmique au C - v1.1 p. 37
Algorithmique...Plan...Notes...Un langage compil...Un langage compil...Un langage bas sur des modules...Un langage bas sur des modules...Traduire les types simples...Traduire les constantes...Traduire les constantes...Traduire les oprateurs...Traduire les oprateurs...Les instructions...Traduire les variables...Les conditionnelles...Les conditionnelles...Les conditionnelles...Les conditionnelles...Traduire les itrations...Traduire les itrations...Traduire les itrations...Les pointeurs...Les pointeurs...Les pointeurs...Traduire les fonctions...Traduire les procdures...Passage de paramtre par valeur...Passage de paramtre par adresse...Traduire commandeAlgo {crire}...Traduire commandeAlgo {crire}...Traduire commandeAlgo {lire}...Traduire commandeAlgo {lire}...Traduire les programmes...Un exemple...Un exemple...Un exemple...Un exemple...