Info 2
Info 2
Info 2
2020/2021
Plan du cours (1)
1. Introduction
5. Les tableaux 2
Plan du cours (2)
6. Les pointeurs
7. Les fonctions
8. Les chaînes de
caractères
9. Les structures
3
Langages informatiques
Un langage informatique est un outil permettant de
donner des ordres (instructions) à la machine
4
Langage machine
Langage binaire: l’information est exprimée et manipulée
sous forme d’une suite de bits
• Le code ASCII (American Standard Code for Information Interchange) donne les
correspondances entre les caractères alphanumériques et leurs
représentation binaire, Ex. A= 01000001, ?=00111111
5
L'assembleur
Problème: le langage machine est difficile à comprendre par l'humain
6
Langages haut niveau
Intérêts multiples pour le haut niveau:
• proche du langage humain «anglais» (compréhensible)
• permet une plus grande portabilité (indépendant du
matériel)
• Manipulation de données et d’expressions complexes
(réels, objets, a*b/c, …)
Nécessité d’un traducteur (compilateur/interpréteur),
exécution plus ou moins lente selon le traducteur
Code source Compilateur ou
Langage machine
en langage évolué interpréteur
7
Compilateur/interpréteur
Compilateur: traduire le programme entier une fois pour
toutes
Compilateur exécution
exemple.c exemple
fichier source fichier exécutable
• + plus rapide à l’exécution
• + sécurité du code source
• - il faut recompiler à chaque modification
Exemples de langages:
• Fortran, Cobol, Pascal, C, …
• C++, Java, …
2011/2012
Historique du C
Le langage C a été conçu en 1972 dans «Bell Laboratories » par
Dennis Ritchie avec l’objectif d’écrire un système d'exploitation
(UNIX).
2011/2012
Caractéristiques du C
Universel : n'est pas orienté vers un domaine d'application particulier
(applications scientifiques, de gestion, …)
2011/2012
Programme source, objet et exécutable
Un programme écrit en langage C forme un texte qu’on nomme
programme ou code source, qui peut être formé de plusieurs fichiers
sources
Ce fichier objet n’est pas exécutable tel quel car il lui manque les
instructions exécutables des fonctions standards appelées dans le fichier
source (printf, scanf, …) et éventuellement d’autres fichiers objets
Accédez à ce lien:
http://www.codeblocks.org/downloads/26
https://
www.fosshub.com/Code-Blocks.html?dwl=codeblocks-20.03-setup.
exe
ou bien
https://
code-blocks.fr.uptodown.com/windows/telecharger
Il faut choisir la version qui inclut le compilateur
Composantes d’un
programme C
• Directives du préprocesseur
• inclusion des fichiers d'en-tête (fichiers avec extension .h)
• définitions des constantes avec #define
2011/2012
Chapitre 2
Variables, types, opérateurs et
expressions
2011/2012
Les variables
Les variables servent à stocker les valeurs des données
utilisées pendant l’exécution d’un programme
• un nom (Identificateur)
• un type (entier, réel, …)
(Les types de variables en C seront discutés par la suite)
2011/2012
Les identificateurs
Le choix d’un identificateur (nom d’une variable ou d’une fonction) est
soumis à quelques règles :
doit être différent des mots réservés du langage : auto break case char
const continue default do double else enum extern float for goto
if int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while
2011/2012
Les types de base
Le type d’une variable détermine l’ensemble des valeurs qu’elle peut prendre
et le nombre d'octets à lui réserver en mémoire
En langage C, il n’y a que deux types de base les entiers et les réels avec
différentes variantes pour chaque type
Remarques:
Un type de base est un type pour lequel une variable peut prendre une seule
valeur à un instant donné contrairement aux types agrégés
Le type booléen n’existe pas. Un booléen est représenté par un entier (un
entier non nul équivaut à vrai et la valeur zero équivaut à faux)
2011/2012
Types Entier
4 variantes d’entiers :
char : caractères (entier sur 1 octet : - 128 à 127)
short ou short int : entier court (entier sur 2 octets : - 32768 à 32767)
int : entier standard (entier sur 2 ou 4 octets )
long ou long int : entier long (4 octets : - 2147483648 à 2147483648)
Remarque : Une variable du type char peut subir les mêmes opérations que les
variables du type short, int ou long
2011/2012
Types Réel
3 variantes de réels :
2011/2012
Déclaration des variables
Les déclarations introduisent les variables qui seront utilisées,
fixent leur type et parfois aussi leur valeur de départ (initialisation)
Syntaxe de déclaration en C
<Type> <NomVar1>,<NomVar2>,...,<NomVarN>;
Exemple:
int i, j,k;
float x, y ;
double z=1.5; // déclaration et initialisation
short compteur;
char c=`A`;
2011/2012
Déclaration des constantes
Une constante conserve sa valeur pendant toute l’exécution d’un programme
(Rq: L’intérêt des constantes est de donner un nom parlant à une valeur, par exemple
NB_LIGNES, aussi ça facilite la modificationdu code)
2011/2012
Constantes entières
On distingue 3 formes de constantes entières :
2011/2012
Remarques sur les constantes entières
Le compilateur attribue automatiquement un type aux constantes
entières. Il attribue en général le type le plus économique parmi (int,
unsigned int, long int, unsigned long int)
2011/2012
Constantes réelles
On distingue 2 notations :
notation décimale Ex : 123.4, .27, 5.
Remarques :
Les constantes réelles sont par défaut de type double
2011/2012
Les constantes caractères
Se sont des constantes qui désignent un seul caractère,
elles sont toujours indiquées entre des apostrophes, Ex :
‘b’, ‘A’, ‘?’
2011/2012
Expressions et opérateurs
Une expression peut être une valeur, une variable ou une opération
constituée par des valeurs, des constantes et des variables reliées
entre eux par des opérateurs
exemples: 1, b, a*2, a+ 3*b-c, …
Un opérateur est un symbole qui permet de manipuler une ou
plusieurs variables pour produire un résultat. On distingue :
2011/2012
Opérateurs en C
Le langage C est riche en opérateurs. Outre les opérateurs
standards, il comporte des opérateurs originaux d’affectation,
d’incrémentation et de manipulation de bits
2011/2012
Opérateurs arithmétiques
binaires : + - * / et % (modulo) et unaire : -
Les opérandes peuvent être des entiers ou des réels sauf pour % qui
agit uniquement sur des entiers
Lorsque les types des deux opérandes sont différents il y’a conversion
implicite dans le type le plus fort
2011/2012
Conversions implicites
Les types short et char sont systématiquement convertis en int
indépendemment des autres opérandes
2011/2012
Exemple de conversion
Exemple : n * p + x (int n ; long p ; float x)
n * p + x
* multiplication par p
+ addition
2011/2012
Opérateur d’affectation simple =
L’opérateur = affecte une valeur ou une expression à une variable
• Exemple: double x,y,z; x=2.5; y=0.7; z=x*y-3;
Le terme à gauche de l’affectation est appelé lvalue (left value)
2011/2012
Opérateurs relationnels
Opérateurs
• < : inférieur à <= : inférieur ou égal à
• > : supérieur à >= : supérieur ou égal à
• == : égal à != : différent de
2011/2012
Opérateurs logiques
&& : ET logique || : OU logique ! : négation logique
&& retourne vrai si les deux opérandes sont vrais (valent 1) et 0 sinon
• Exemple : 5 && 11 1
!13.7 0
2011/2012
Évaluation de && et ||
Le 2ème opérande est évalué uniquement en cas de nécessité
• a && b : b évalué uniquement si a vaut vrai (si a vaut faux,
évaluation de b inutile car a && b vaut faux)
• a b : b évalué uniquement si a vaut faux (si a vaut vrai,
évaluation de b inutile car a b vaut vrai)
Exemples
• if ((d != 0) && (n / d == 2)) : pas de division si d vaut 0
• if ((n >=0) && (sqrt(n) < p)) : racine non calculée si n < 0
L’intérêt est d’accélérer l’évaluation et d’éviter les traitements
inappropriés
2011/2012
Incrémentation et décrémentation
Exemple : i = 5 ; n = ++i - 5 ;
i vaut 6 et n vaut 1
i = 5 ; n = i++ - 5 ;
i vaut 6 et n vaut 0
2011/2012
Opérateurs de manipulations de bits
Les opérandes sont de type entier. Les opérations s'effectuent bit à bit
suivant la logique binaire
2011/2012
Opérateurs de décalage de bits
Dans le cas d'un décalage à gauche les bits les plus à gauche
sont perdus. Les positions binaires rendues vacantes sont
remplies par des 0
Ex : char x=14; (14=00001110) 14<<2 = 00111000
= 56
char y=-7; (-7=11111001) -7<<2= 11100100= -28
2011/2012
Opérateurs de décalage de bits
2011/2012
Opérateurs d’affectation combinés
Opérateurs utilisables :
• += -= *= /= %=
• <<= >>= &= ^= |=
Exemples :
• a=a+b s’écrit : a+=b
• n=n%2 s’écrit : n%=2
• x=x*i s’écrit : x*=i
• p=p>>3 s’écrit : p>>=3
2011/2012
Opérateur de forçage de type (cast)
2011/2012
Opérateur conditionnel ? :
Syntaxe: exp1 ? exp2 : exp3
exp1 est évaluée, si sa valeur est non nulle c’est exp2
qui est exécutée, sinon exp3
2011/2012
Opérateur séquentiel ,
Utilité : regrouper plusieurs sous-expressions ou calculs en une seule
expression
Exemples
• i++ , i + j; // on évalue i++ ensuite i+j (on utilise la valeur de i incrémentée)
• i++ , j = i + k , a + b; // la valeur de l’expression est celle de a+b
• for (i=1 , k=0 ; … ; …) { }
2011/2012
Opérateur SIZEOF
Syntaxe : sizeof (<type>) ou sizeof (<variable>)
fournit la taille en octets d'un type ou d'une variable
Exemples
• int n;
• printf ("%d \n",sizeof(int)); // affiche 4
• printf ("%d \n",sizeof(n)); // affiche 4
2011/2012
Priorité et associativité des opérateurs
Une expression est évaluée en respectant des règles de priorité et
d’associativité des opérateurs
• Ex: * est plus prioritaire que +, ainsi 2 + 3 * 7 vaut 23 et non 35
Les opérateurs dans une même ligne ont le même niveau de priorité.
Dans ce cas on applique les règles d’associativité selon le sens de la
flèche. Par exemple: 13%3*4 vaut 4 et non 1
2011/2012
Priorités de tous les opérateurs
2011/2012
2011/2012
2011/2012
CHAPITRE 3
Entrées-sorties
LES INSTRUCTIONS DE LECTURE ET
D’ÉCRITURE
Il s’agit des instructions permettant à la machine de dialoguer avec
l’utilisateur
2011/2012
ECRITURE FORMATÉE DE
DONNÉES: PRINTF ()
2011/2012
SPÉCIFICATEURS DE FORMAT
SYMBOLE TYPE AFFICHAGE COMME
%d ou %i int entier relatif
%c char caractère
2011/2012
SÉQUENCES D’ÉCHAPPEMENT
l'affichage du texte peut être contrôlé à l'aide des
séquences d'échappement :
• \n : nouvelle ligne
• \t : tabulation horizontale
• \a : signal sonore
• \b : retour arrière
• \r : retour chariot
• \v : tabulation verticale
• \f : saut de page
• \\ : back slash ( \ )
• \’ : apostrophe
• \" : guillemet
2011/2012
EXEMPLES DE PRINTF()
#include<stdio.h>
main()
{ int i=1 , j=2, N=15;
printf("la somme de %d et %d est %d \n", i, j,
i+j); printf(« N= %x \n" , N);
char c='A' ;
printf(" le code Ascii de %c est %d \n", c, c);
}
Ce programme va afficher la somme de 1 et 2 est
: 3 N=f
le code Ascii de A est
65
Remarque : Pour pouvoir traiter correctement les arguments du type
long, il faut utiliser les spécificateurs %ld, %li, %lu, %lo, %lx
2011/2012
EXEMPLES DE PRINTF()
#include<stdio.h> main()
{ double x=10.5, y=2.5;
printf("%f divisé par %f égal à %f \n", x, y, x/y); printf("%e divisé par
%e égal à %e\n", x, y, x/y);
}
Ce programme va afficher :
10.500000 divisé par 2.500000 égal à 4.200000
1.050000e+001 divisé par 2.500000e+000 égal à 4.200000e+000
Remarque : Pour pouvoir traiter correctement les arguments du type long double, il faut
utiliser les spécificateurs %lf et %le
2011/2012
REMARQUES SUR L’AFFICHAGE
Par défaut, les entiers sont affichés sans espaces avant ou
après
Exemples : printf("%4d" , n );
n = 20 ~~20 (~espace)
n=56123 56123
printf("%4X", 123); ~~7B
2011/2012
REMARQUES SUR L’AFFICHAGE
Pour les réels, on peut préciser la largeur minimale de la valeur à afficher
et le nombre de chiffres après le point décimal.
La précision par défaut est fixée à six décimales. Les positions
décimales sont arrondies à la valeur la plus proche.
Exemples :
printf("%f", 100.123); 100.123000
printf("%12f", 100.123);
~~100.123000
printf("%.2f", 100.123);
100.12
printf("%5.0f", 100.123);
~~100
printf("%10.3f",
100.123); ~~~100.123
printf("%.4f", 1.23456); 1.2346
2011/2012
LECTURE FORMATÉE DE
DONNÉES: SCANF ()
2011/2012
EXEMPLES DE SCANF()
#include<stdio.h>
main()
{ int i , j;
scanf("%d%d", &i,
&j);
printf("i=%d et j=%d", i, j);
}
Remarque : pour lire une donnée du type long, il faut utiliser les
spécificateurs
%ld, %li, %lu, %lo, %lx.
2011/2012
EXEMPLES DE SCANF()
#include<stdio.h>
main()
{ float x; double y;
scanf("%f %lf", &x, &y); printf("x=%f
et y=%f", x,y);
}
Remarque : pour lire une donnée du type double, il faut utiliser %le ou %lf et pour lire une
donnée du type long double, il faut utiliser %Le ou %Lf
2011/2012
Chapitre 4
Structures de contrôle
2011/2012
Structures de contrôle
Les structures de contrôle définissent la façon avec laquelle les
instructions sont effectuées. Elles conditionnent l'exécution
d'instructions à la valeur d'une expression
On distingue :
• Les structures alternatives (tests) : permettent d’effectuer des choix
càd de se comporter différemment suivant les circonstances (valeur
d'une expression). En C, on dispose des instructions : if…else et
switch.
2011/2012
L’instruction if…else
Syntaxe : If (expression)
bloc-instruction1
else
bloc-instruction2
• expression est évaluée, si elle est vraie (valeur différente de 0), alors
bloc-instruction1 est exécuté. Si elle est fausse (valeur 0) alors bloc-
instruction2 est exécuté
2011/2012
if…else : exemples
• float a, b, max;
if (a > b)
max = a;
else
max = b;
• int a;
if ((a%2)==0)
printf(" %d est paire" ,a);
else
printf(" a est impaire ",a);
2011/2012
Imbrication des instructions if
On peut imbriquer plusieurs instructions if…else
• if (N>0)
if (A>B)
MAX=A;
else MAX=B; (interprétation 2 : si N=0 MAX ne change pas)
2011/2012
Imbrication des instructions if
Conseil : pour éviter toute ambiguïté ou pour forcer une certaine
interprétation dans l’imbrication des if, il vaut mieux utiliser les
accolades
if(a<=0)
{if(a==0)
printf("a est nul ");
else
printf(" a est strictement négatif ");}
else
printf(" a est strictement positif " );
2011/2012
L’instruction d’aiguillage switch :
Permet de choisir des instructions à exécuter selon la valeur d’une
expression qui doit être de type entier
la syntaxe est :
switch (expression) {
case expression_constante1 : instructions_1; break;
case expression_constante2 : instructions_2; break;
…
case expression_constante n : instructions_n; break;
default : instructions;
}
expression_constantei doit être une expression constante entière
Instructions i peut être une instruction simple ou composée
break et default sont optionnels et peuvent ne pas figurer
2011/2012
Fonctionnement de switch
expression est évaluée
• On exécute aussi les instructions des cas suivants jusqu’à la fin du bloc
ou jusqu’à une instruction break (qui fait sortir de la structure switch)
2011/2012
Switch : exemple
main( )
{ char c;
switch (c) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'y': printf("voyelle\n"); break ;
default : printf("consonne\n");
}
}
2011/2012
Les boucles while et do .. while
while (condition) do
{ {
instructions instructions
} } while (condition);
par contre, dans la boucle do-while ce test est effectué après le corps de
boucle, lequel sera alors exécuté au moins une fois
2011/2012
Boucle while : exemple
Un programme qui détermine le premier nombre entier N
tel que la somme de 1 à N dépasse strictement 100
main( )
{ int i, som;
i =0; som= 0;
while (som <=100)
{ i++;
som+=i;
}
printf (" La valeur cherchée est N= %d\n ", i);
}
2011/2012
Boucle do .. while : exemple
Contrôle de saisie d'une note saisie au clavier jusqu’à ce
que la valeur entrée soit valable
main()
{ int N;
do {
printf (" Entrez une note comprise entre 0 et 20 \n");
scanf("%d",&N);
} while (N < 0 || N > 20);
}
2011/2012
La boucle for
for (expr1 ; expr2 ; expr3)
{
instructions
}
L'expression expr1 est évaluée une seule fois au début de
l'exécution de la boucle. Elle effectue l’initialisation des données de
la boucle
2011/2012
Boucle for : remarques
for (expr1 ; expr2 ; expr3) équivaut à :
{ expr1;
instructions while(expr2)
} { instructions
expr3;
}
2011/2012
Boucle for : exemple
Calcul de x à la puissance n où x est un réel non nul et n
un entier positif ou nul
main ( )
{ float x, puiss;
int n, i;
{ printf (" Entrez respectivement les valeurs de x et n \n");
scanf ("%f %d" , &x, &n);
for (puiss =1, i=1; i<=n; i++)
puiss*=x;
printf (" %f à la puissance %d est égal à : %f", x,n,puiss);
}
}
2011/2012
L’instruction break
L’instruction break peut être utilisée dans une boucle (for, while, ou do .. while).
Elle permet d’arrêter le déroulement de la boucle et le passage à la première
instruction qui la suit
En cas de boucles imbriquées, break ne met fin qu’ à la boucle la plus interne
{int i,j;
for(i=0;i<4;i++)
for (j=0;j<4;j++)
{ if(j==1) break;
printf("i=%d,j=%d\n ",i,j);
}
} résultat: i=0,j=0
i=1,j=0
i=2,j=0
i=3,j=0
2011/2012
L’instruction continue
L’instruction continue peut être utilisée dans une boucle (for, while, ou
do .. while). Elle permet l’abandon de l’itération courante et le passage à
l’itération suivante
{int i;
for(i=1;i<5;i++)
{printf("début itération %d\n " ,i);
if(i<3) continue;
printf(" fin itération %d\n " ,i);
}
} résultat: début itération 1
début itération 2
début itération 3
fin itération 3
début itération 4
fin itération 4
2011/2012
Chapitre 5
Les tableaux
Tableaux
Un tableau est une variable structurée composée d’un nombre de
variables simples de même type désignées par un seul identificateur
ainsi pour :
• short A[100]; // on réserve 200 octets (100* 2octets)
• char mot[10]; // on réserve 10 octets (10* 1octet)
Initialisation à la déclaration
On peut initialiser les éléments d’un tableau lors de la déclaration, en
indiquant la liste des valeurs respectives entre accolades. Ex:
• int A[5] = {1, 2, 3, 4, 5};
• float B[4] = {-1.5, 3.3, 7e-2, -2.5E3};
Si la liste ne contient pas assez de valeurs pour toutes les
composantes, les composantes restantes sont initialisées par zéro
• Ex: short T[10] = {1, 2, 3, 4, 5};
la liste ne doit pas contenir plus de valeurs que la dimension du
tableau. Ex: short T[3] = {1, 2, 3, 4, 5}; Erreur
for(i=0;i<n;i++)
{ printf ("Entrez l'élément %d \n ",i + 1);
scanf(" %d" , &T[i]);
}
for(i=0;i<n;i++)
printf (" %d \t",T[i]);
Tableaux : exemple
Calcul du nombre d'étudiants ayant une note supérieure à 10 :
main ( )
{ float notes[30];
int nbre,i;
for(i=0;i<30;i++)
{ printf ("Entrez notes[%d] \n ",i);
scanf(" %f" , ¬es[i]);
}
nbre=0;
for (i=0; i<30; i++)
if (notes[i]>10) nbre+=1;
printf (" le nombre de notes > à 10 est égal à : %d", nbre);
}
Tableaux à plusieurs dimensions
On peut définir un tableau à n dimensions de la façon suivante:
float notes[20][5][2];
Exemple :
• float A[3][4] = {{-1.5, 2.1, 3.4, 0}, {8e-3, 7e-5,1, 2.7 }, {3.1, 0, 2.5E4, -1.3E2}};
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{ printf ("Entrez la valeur de A[%d][%d] \n ",i,j);
scanf(" %d" , &A[i][j]);
}
for(i=0;i<n;i++)
{ for(j=0;j<m;j++)
printf (" %d \t",A[i][j]);
printf("\n");
}
Représentation d’un tableau en
mémoire
La déclaration d’un tableau provoque la réservation automatique par le
compilateur d’une zone contiguë de la mémoire.
Les fonctions
2011/2012
La programmation modulaire
Certains problèmes conduisent à des programmes longs, difficiles à écrire età
comprendre. On les découpe en des parties appelées sous-programmes ou
modules
Les modules sont des groupes d'instructions qui fournissent une solution àdes
parties bien définies d'un problème plus complexe. Ils ont plusieurs intérêts :
2011/2012
Fonctions
On définit une fonction en dehors de la fonction principale main ( ) par :
type nom_fonction (type1 arg1,…, typeN argN)
{
instructions constituant le corps de la fonction
return (expression)
}
Dans la première ligne (appelée en-tête de la fonction) :
• type est le type du résultat retourné. Si la fonction n’a pas de résultat à
retourner, elle est de type void.
• le choix d'un nom de fonction doit respecter les mêmes règles que celles
adoptées pour les noms de variables.
• entre parenthèses, on spécifie les arguments de la fonction et leurs
types. Si une fonction n'a pas de paramètres, on peut déclarer la liste
des paramètres comme (void) ou simplement comme ()
Pour fournir un résultat en quittant une fonction, on dispose de la commande
return.
3
2011/2012
Fonctions : exemples
Une fonction qui calcule la somme Une fonction qui renvoie un
de deux réels x et y : entier saisi au clavier
double Som(double x, double y ) int RenvoieEntier( void )
{ {
return (x+y); int n;
}
printf(" Entrez n
\n"); scanf (" %d ",
Une fonction qui affiche la somme de &n); return n;
deux réels x et y : }
Une fonction qui affiche les
void AfficheSom(double x, double
éléments d’un tableau d’entiers
y)
void AfficheTab(int T[ ], int n)
{
{ int i;
printf (" %lf", x+y );
for(i=0;i<n;i++)
}
printf (" %d \t", T[i]);
4
}
2011/2012
Appel d’une fonction
L‘appel d'une fonction se fait par simple écriture de son nom avec la liste
des paramètres : nom_fonction (para1,…, paraN)
Lors de l'appel d'une fonction, les paramètres sont appelés paramètres
effectifs : ils contiennent les valeurs pour effectuer le traitement. Lors de la
définition, les paramètres sont appelés paramètres formels.
L'ordre et les types des paramètres effectifs doivent correspondre à ceux
des paramètres formels
Exemple d’appels:
main( )
{ double z;
int A[5] = {1, 2, 3, 4, 5};
z=Som(2.5, 7.3);
AfficheTab(A,5);
}
2011/2012
Déclaration des fonctions
Il est nécessaire pour le compilateur de connaître la définition d'une
fonction au moment où elle est appelée. Si une fonction est définie
après son premier appel (en particulier si elle définie après main ),
elle doit être déclarée auparavant.
2011/2012
Déclaration des fonctions :exemple
#include<stdio.h>
float ValeurAbsolue(float); //prototype de la fonction ValeurAbsolue
main( )
{ float x=-5.7,y;
y= ValeurAbsolue(x);
printf("La valeur absolue de %f est : %f \n " , x,y);
}
//Définition de la fonction ValeurAbsolue
float ValeurAbsolue(float a)
{
if (a<0) a=-a;
return a;
}
2011/2012
Variables locales et globales
On peut manipuler 2 types de variables dans un programme C : des
variables locales et des variables globales. Elles se distinguent
par ce qu'on appelle leur portée (leur "espace de visibilité", leur
"durée de vie")
2011/2012
Variables locales et globales :
remarques
Les variables déclarées au début de la fonction principale main ne
sont pas des variables globales, mais elles sont locales à main
• Il faut utiliser autant que possible des variables locales. Ceci permet
d'économiser la mémoire et d'assurer l'indépendance de la fonction
2011/2012
Variables locales et globales :
exemple
#include<stdio.h>
int x = 7;
int f(int);
int g(int);
main( )
{ printf("x = %d\t", x);
{ int x = 6; printf("x = %d\t", x); }
printf("f(%d) = %d\t", x, f(x));
printf("g(%d) = %d\t", x, g(x));
}
int f(int a) { int x = 9; return (a + x); }
int g(int a) { return (a * x); }
Qu’affiche ce programme?
x=7 x=6 f(7)=16 g(7) = 49
10
2011/2012
Variables locales et globales :
exemple
#include<stdio.h>
void f(void);
int i;
main( )
{ int k = 5;
i=3; f(); f();
printf("i = %d et k=%d \n", i,k); }
void f(void) { int k = 1;
printf("i = %d et k=%d \n", i,k);
i++;k++;}
Qu’affiche ce programme?
i=3 et k=1
i=4 et k=1
i=5 et k=5
11
2011/2012
La fonction main peut également posséder
des paramètres formels.
un programme C peut recevoir une liste
d’arguments au lancement de son
exécution.
La ligne de commande qui sert à lancer le
programme est, dans ce cas, composée du
nom du fichier exécutable suivi par des
paramétres.
2011/2012
la fonction main possède deux paramètres
formels, appelés par convention:
argc (argument count)
argv (argument vector).
2011/2012
argc est une variable de type int dont la
valeur est égale au nombre de mots
composant la ligne de commande (y
compris le nom de l’exécutable). Elle est
donc égale au nombre de paramètres
effectifs de la fonction + 1.
2011/2012
argv est un tableau de chaînes de
caractères correspondant chacune à un
mot de la ligne de commande. Le premier
élément argv[0] contient donc le nom de
la commande (du fichier exécutable), le
second argv[1] contient le premier
paramètre. . . .
2011/2012
Paramètres d'une fonction
Les paramètres servent à échanger des informations entre la
fonction appelante et la fonction appelée. Ils peuvent recevoir des
données et stocker des résultats
18
2011/2012
Transmission des
paramètres en C
La transmission des paramètres en C se fait toujours par valeur
Pour effectuer une transmission par adresse en C, on déclare le
paramètre formel de type pointeur et lors d'un appel de la fonction, on
envoie l'adresse et non la valeur du paramètre effectif
Exemple : void Increment (int x, int *y)
{ x=x+1;
*y =*y+1; }
main( )
{ int n = 3, m=3;
Increment (n, &m);
printf(“n = %d et m=%d \n", n,m); }
Résultat :
n=3 et m= 4
19
2011/2012
Exemples
Une fonction qui échange le contenu de deux variables :
void Echange (float *x, float *y)
{ float z;
z = *x;
*x = *y;
*y = z;
}
main()
{ float a=2,b=5;
Echange(&a,&b);
printf("a=%f,b=%f\n ",a,b);
}
20
2011/2012
Récursivité
Une fonction qui fait appel à elle-même est une fonction récursive
Toute fonction récursive doit posséder un cas limite (cas trivial) qui
arrête la récursivité
2011/2012
Fonctions récursives :
exercice
Ecrivez une fonction récursive (puis itérative) qui calcule le terme n
de la suite de Fibonacci définie par : U(0)=U(1)=1
U(n)=U(n-1)+U(n-2)
22
2011/2012
Fonctions récursives :
exercice (suite)
Une fonction itérative pour le calcul de la suite de Fibonacci :
int Fib (int n)
{ int i, AvantDernier, Dernier, Nouveau;
if (n==0 || n==1) return (1);
AvantDernier=1; Dernier =1;
for (i=2; i<=n; i++)
{ Nouveau= Dernier+ AvantDernier;
AvantDernier = Dernier;
Dernier = Nouveau;
}
return (Nouveau);
}
Remarque: la solution récursive est plus facile à écrire
23
2011/2012
Chapitre 8
2011/2012
Chaînes de caractères
Il n'existe pas de type spécial chaîne ou string en C. Une chaîne de
caractères est traitée comme un tableau de caractères
25
2011/2012
Déclaration
Syntaxe : char <NomVariable> [<Longueur>]; //tableau de caractères
26
2011/2012
Initialisation
On peut initialiser une chaîne de caractères à la définition :
27
2011/2012
Traitement des chaînes de
caractères
Le langage C dispose d’un ensemble de bibliothèques qui contiennent
des fonctions spéciales pour le traitement de chaînes de caractères
• La bibliothèque <stdio.h>
• La bibliothèque <string.h>
• La bibliothèque <stdlib.h>
28
2011/2012
Fonctions de la bibliothèque
<stdio.h>
29
2011/2012
Fonctions de la bibliothèque
<stdio.h>
scanf( ) : permet de saisir une chaîne de caractères en utilisant le
spécificateur de format %s.
30
2011/2012
Fonctions de la bibliothèque
<string.h>
strlen(ch): fournit la longueur de la chaîne sans compter le '\0' final
Exemple : char s[ ]= " Test";
printf(“%d”,strlen(s)); //affiche 4
31
2011/2012
Fonctions de la bibliothèque
<string.h>
strcmp(ch1, ch2): compare ch1 et ch2 lexicographiquement et
retourne une valeur : - nul si ch1 et ch2 sont identiques
- négative si ch1 précède ch2
- positive si ch1 suit ch2
32
2011/2012
Fonctions de la bibliothèque
<stdlib.h>
<stdlib> contient des fonctions pour la conversion de nombres en
chaînes de caractères et vice-versa.
33
2011/2012