Documente Academic
Documente Profesional
Documente Cultură
Programmer en C
Chap 1 - Les bases de la
programmation
Chap 2 Itrations et rcursivit
Chap 3 Structures de donnes
Chap 4 Pointeurs, passage par
adresse et fonctions, allocations
dynamique et tableaux dynamiques
Chap 1 :Les bases de la programmation
I.
II.
III.
IV.
V.
VI.
//ordres pr-processeurs
//dfinition de types
//dfinition de fonctions
intmain() {
couple c;
intz; c.a=2; c.b=9;
z = addition(c);
return 0 ;
}
//fonctionmain
//dclarations
//instructions : affectation
//instructions : appel de fonctions
III.1.Les types :
Entiers (relatifs) : int + - * / % ++ -- < > <= == != += (accumulation)
Rels : float ou double + - * / % ++ -- < > <= == !=
Caractre : char
a est cod par lentier 97
Boolen : nexiste pas en C, 0 -> faux
1-> vrai
&& (et) || (ou) ! (non)
Pour dfinir un boolen :
#define vrai 1 // dfinition dune constante
#define faux 0
typedef unsignedcharbooleen;
Attention: Toute entit manipule (variable, fonction,) devra tre dclare
avec son type.
Rem : il est prfrable dutiliser un double plutt quun float
2.Expressions
7/2 -> 3 (div entire)
7./2 -> 3.50
Attention aux mlanges de types dans les expressions
3.Variables
Variables globales != variable locales
Dclaration de la var : <type> <identificateur> ;
Ex :
intnombreEnfants ;
intnombreParents = 2 ;
double prix_de_vente,prix_achat= 10.5 ;
Rem : viter les accents, ne pas utiliser les espaces, pas de chiffre au dbut du
nom, pas @, ni -, ni les mots-cls rservs du C. La dclaration dune variable se
fait normalement en dbut de bloc dlimit par des {}. Les variables dclares
sont temporaires. Elles sont empiles sur la pile et dpiles en sortie de bloc.
4. Constantes
#define <var> = .. ; ou bien const <type> <var> = ;
Le plus souvent des Maj pour les variables des constantes
fonctions
fonctions
fonctions
fonctions
avecparamtreset rsultats
sans rsultat(aussiappeles procdures)
ouprocdures sans paramtres
avecplusieursrsultats
Mise en page :
*\n = retour chariot
*\t = tabulation
Fonction scanf :(assigner des variables des donnes tapes par l'utilisateur)
scanf(<format_entree>,&nom_variable)
Remarques:
Il y a un espace au dbut de <format_entree> pour que l'excution de plusieurs
scanf conscutifs fonctionnent, mme si les diffrentes valeurs saisies par
l'utilisateur sont spares par des espaces ou des retours-chariot
Avec un seul scanf on peut affecter plusieurs variables en mettant plusieurs
format d'entre dans le premier paramtre, et en spcifiant plusieurs variables
dans les paramtres suivants.
Exemple:
scanf(" %d %f",&i,&x);
V.Instructions et blocs
*Affectation
ex : age=age+1;
*Appel dune fonction
* ; pour sparer les instructions (squentialit)
* , deux instructions spares par une virgule peuvent tre excutes dans un
ordre quelconque *Oprateurs daccumulation : x *=2 => x
=x*2
*Oprateur dincrmentation ou de dcrmentation : i--
Exemples:
int i, j, k, l;
i = 3;
j = 2*i++ ;
k= 2*i ;
l = 2*++i ;
Il est important de regrouper sous forme de bloc, de plus les tabulations sont
primordiales lobtention dun programme lisible(Indentation). Une instruction
seul, peut tre lu comme un bloc.
VI.Composition dinstructions
1.Les conditionnelles si alors sinon finsi
Il faut faire attention lindentation, un else se rapporte toujours au dernier
if
If ( A == B )
if (B > C)
if (D != 8)
if ( A==B){
if (B > C){
if (D !=8){
E = 6.3 ;
E=6.3 ;
else
}
}
E = 5.1 ;
}
else {
E = 5.1 ;
}
approche itrative :
int positionJourDansAnnee(int j, int m, int a){
int pos = j, mois;
for(mois = 1; mois < m; mois++)
pos += nbJoursMois(mois, a);
return pos;
}
approche rcursive :
int positionJourDansAnnee(int j, int m, int a){
return positionJourDansAnnebis(j, m, a, 1); // janvier
}
int positionJourDansAnneebis(int j, int m, int a, int moiscourant){
if (m==moiscourant)
return j;
else
return (nbJoursMois(moiscourant,a)
+ positionJourDansAnnebis(j, m, a, moiscourant + 1));
}
I. Structure
1.Dclaration de variable avec description de son
type.
Plusieurs types ventuellement diffrents.
struct
{
<type1> <id_element1> ;
<typen> <id_elementn> ;
}<id_nouvellevar> ;
Appel de champs :
<id_var> . <id_element> ;
exemple :
struc {double a ; double b ;} p ;
Accs au champs : p.a et p.b
<typen> <id_elementn> ;
};
Exemple :
dclaration du type point
struct point {float a ; float b ;} ;
puis dclaration de la variable p par :
struct point p ;
Exercice :
Contruire le type segment parti du type point ci-dessus puis dclarer
ultrieurement un segment s, ie une var de type segment.
struct segment {struct point M ; struct point N ;} ;
struc segment s ;
s.M.a = 1.0 ;
s.M.b = 1.0 ;
s.N.a = 4.0 ;
s.N.b = 2.0 ;
Ecrire une fonction qui calcul la longueur du segment :
float longueur (struct segment s1=
{
float abs, ord, long ;
abs= s1.N.a s1.M.a ;
ord= s1.N.b s1.M.b ;
long = sqrt (abs*abs + ord*ord) ;
return long ;
}
II.Synonymie ou Typedef
Tout type a un nom dfini ( char, float, int) ou prdifine par le
programmeur (par construction)
On peut aussi lui dfinir un synonyme :
typedef <ancien-nom> <nouveau_synonyme> ;
Exemple :
typedef struct segment Seg ;
Ou bien directement au moment de la cration du type :
typedef struct {double a ; double b ;} Point ;
et dclarer ensuite la variable p par :
Point p ;
*typedef struct
{
double prix ;
int quantite ;
} Article ;
Article pain = {2.50, 4} ;
III.Tableaux statiques
1. Dfinition et proprits
Il existe une sorte de variable appele variable indice ou tableau dont les
valeurs dun n-uplet de variables dun mme type :
Les lments du tableau sont appels occurrence, et leur numro appel
indice.
Dclaration :
<type> <nom_du_tableau>[<nombre_d_elements>] ;
<type> <nom_du_tableau>[<nombre_d_elements>] = {<valeur1>,
<valeur2>,} ;
Accs au lments
<nom_du_tableau> [<numro_de_l_indice>]
Exemple :
inttab [3];
int tab [3] = {10,-5} ;
tab[0] = 10;
tab[1] = -5;
tab[2] = 18;
Int x = tab[2]+5;
Ce tableau dsigne 3 emplacements mmoire dadresses conscutives.
Attention :
*Les indices commencent 0
* Laccs des lments non dclars est possible(erreur lors de
lexcution) do limportance de la taille ( mmoriser la taille dans une
autre variable)
*nombre dlments dclars :
#define N 100
int tab[N]
mais pas :
int n = 100 ;
int tab[n]
Ne fonctionne pas car n prend la valeur 100 quaprs la compilation. Avec
un ordre pr-processeur, on peut connaitre cette valeur au moment de la
compilation.
*les oprations sur les tableaux se font lment par lment
- on ne peut pas crire tab2=tab1
- de mme pour la comparaison de tab1 == tab2
Condition darrt :
int produit (int a, int b) {
if (a==1)
return b ;
else return produit (b, a-1)
}
si on test la fonction, avec produit(2,3), produit (3,2), produit(2,3)
On a une fonction qui
On a donc un crasement de la mmoire si on change une valeur dun
mme tableau sur lindice concern.
Tableaux et structures
exemple :
typedef struct{
float re ;
float im ;
} complexe ;
/*dclaration*/
complexe tabcomplexe[3] ; // tableau de 3 complexes (6 float)
exemple :
tabcomplexe[1].im = 2.3 ;
/*deuxime lement du tableau, et deuxime paramtre du type dfini
complexe */
b) Tableau d dimension :
<type> <nom_var> [<n1>] [<n2>][<nd>] ;
exemple :
Int tab [3] [5] ;
Un tableau deux dimensions.
Int matrice [5] [2] = {{,},{,},{,},{,},{,}} ;
2.Dclaration
<type de la valeur> * <identifiant> ;
-le * signifie dclaration
Exemple :
int*Pi
int*P1 , *P2, *P3 ;
float*Pf ;
3.Initialisation
Pour un pointeur sur rien , on utilise la valeur NULL en C
int*p = NULL ;
// vite que p ne pointe nimporte o en mmoire
Il est important de ne pas oublier la library stdlib.h .
Il en va de mme quil ne faut pas oublier dinitialiser la valeur de p
NULL sinon il y a un risque de mauvaise lecture de la mmoire ou
dcriture.
2.Loprateur contenu *
Permet de rcuprer la valeur de la variable sur laquelle le pointeur pointe.
Exemple :
int i = 1 ;
int j = 2 ;
int k = 3 ;
Pi = &i ;
/*Avec pointeur*/
void exchange2 (int *Px, int *Py)
{
int z ;
z = *Pi ;
//on accde aux colonnes du pointeurs
*Px = *Py ;
*Py = z ;
return 0 ;
}
printf( %d , *Pi) ;
Pj = Pi ;
printf( %d , *Pi );
*Pj = j ;
k = *Pi ;
// k = z
int main()
{
int a = 10 ;
int b = 52 ;
exchange (&a,&b) ;
//change deux pointeurs en arguments
/*Printf a et b (adresse de a et b)*/
Le contenu des variables a et b ont t modifi directement en mmoire
( lextrieur de la fonction)
Il est ncessaire de prvenir les effets de bord dans les spcification du
programme.
Exemple :
int *pi = (int*)malloc ( sizeof(int)) ;
dclaration = adresse de lentier avec sa taille
On peut allouer un nombre prcis de sizeof qui ont le mme type
//Exemple dallocation dynamique
Intrt dinit malloc NULL est de voir si il a fonctionn
2.Exemple de schma de mmoire
Int i = 52 ;
int j = 27 ;
int k = 382
int* p1 = &i ;
int* p2 = &j ;
Identifiant mmoire
adresse
int* p3 = (int*)malloc(sizeof(int)) ;
*p3 = j ;
Toute modification dune contenu dun pointeur, modifie alors les liens et
aussi la valeur initialiser en i , j , k.
3.Itration de la mmoire
Il est ncessaire dindiquer quon restitue la mmoire quon avait allou
avec malloc (fonction free)
malloc free
sizeof
Exemple :
malloc avec pi (prcdemment)
free(pi) ; // libr la mmoire pi
p2 = p1 ;
Etudiant* p_etudiant
(type repoint)
p_etudiant = &et1 ;
structure et1 ;
- p_etudiant numero
Contenu de la structure point ( *p_etudiant.age et *p_etudiant.numero)
Complment :
int * ( *ppz) ;
//pointeur sur un pointeur entier
*ppz = &pz ;
VI.Tabeaux dynamiques
1.Limitation du tableau statique
Par exemple, crer un tableau dont la taille est donne par lutilisateur (On
connait la fonction malloc)
Exemple :
int* tab ;
/*dclaration dun pointeur sur entier (1re adresse de tout un bloc dont la
taille reste dfinir) */
tab = (int*)malloc(3*sizeof(int)) ; //dclaration dynamique dun tableau
3 lments
On utilise comme les tableaux statiques
tab[0], tab[1], tab[2]
int tab[3] ;
//malloc cach
Exemple :
Int* tab ;
tab = (int*)malloc(3*sizeof(int)) ;
for (i=0 ; i<3 ; i++)
{
tab[i]=0 ;
}
return tab ;
//utilisation du tableau
ptab = init() ;
//Utilisation du tableau
int i ;
for (i=0 ;i<500 ; i++)
{
tabPtrEt[i] = (Etudiant*)malloc(sizeof(Etudiant)) ;
(adresse)
tabPtrEt[i] age = 25
}