Cours Informatique 2 Cours 2
Cours Informatique 2 Cours 2
Cours Informatique 2 Cours 2
COURS D’INFORMATIQUE 2
LANGAGE C
M. Berhoum Adel
2020/2021
2
PLAN DU COURS
I. ILa structure répétitive
Structure:
while(condition) tant que condition est vraie (≠0)
{ on exécute
bloc d'instructions ; bloc d'instructions
}
Remarques:
- S'il n'y a qu'une seule instruction, les accolades sont inutiles.
- Le bloc d’instructions est exécuté 0 ou plusieurs fois.
Exemple 1:
int i =0; while(i<4) Affichage:
{ 0
printf("%d\n",i); i++ 1
; 2
} 3
Exemple 2:
int i =0; while(i<4) Affichage:
printf("%d\n",i++); 0
1
2
3
Exemple 3:
int i =0; while(i<4) Affichage:
printf("%d\n",++i); 1
2
3
4
Exemple 4:
int i =4; while(i) Affichage:
printf("%d\n",i--); 4
3
2
1
Remarque : Le bloc d’instructions peut être vide (notation : {} ou ;), si l’on attend un évènement
sans avoir besoin de traitement de données.
Exemple :
while(getch()==’ ‘); Ignore tous les espaces entrés au clavier et sera utilisé jusqu’à l’entrée d’un
caractère significatif.
Il est semblable au while, mais : while évalue la condition avant d’exécuter, alors que dowhile
exécute une fois avant d’évaluer la condition.
Structure:
do on exécute
{
bloc d'instructions ; } bloc d'instructions
3) for
structure:
for(expr1;expr2;expr3)
{
bloc d'instructions ;
}
expr1 est évaluée une fois avant le passage dans la boucle, elle est utilisée pour initialiser les
données de la boucle.
expr2 est évaluée à chaque passage de la boucle, elle est utilisée pour savoir si la boucle est
répétée ou non (c'est une condition de répétition, et non d'arrêt).
expr3 est évaluée à la fin de chaque passage de la boucle, elle est utilisée pour réinitialiser les
données de la boucle.
Equivalence entre une boucle for et une boucle while:
for(expr1;expr2;expr3) expr1;
{ while(expr2)
bloc d'instructions ; {
} bloc d'instructions ;
expr3;
}
Exemple 1 :
int i; Affichage:
for(i=1;i<=4;i++) Le carré de 1 est 1
{ Le carré de 2 est 4
printf("Le carré de %d est %d\n",i,i*i); } Le carré de 3 est 9
Le carré de 4 est 16
Exemple 2 :
int i; for(i=4;i>0;i--) Affichage:
{ Le carré de 4 est 16
printf("Le carré de %d est %d\n",i,i*i); } Le carré de 3 est 9
Le carré de 2 est 4
Le carré de 1 est 1
Remarque :
Les parties expr1 et expr2 peuvent contenir plusieurs initialisations ou réinitialisations, séparées
par des virgules.
Exemple :
int n,tot;
for(tot=0, n=1;n<101;n++) tot+=n;
printf("La somme des nombres de 1 à 100 est égale à: %d\n",tot);
On choisit la structure qui reflète le mieux l'idée du programme que l'on veut réaliser, en
respectant les directives suivantes:
- Si le bloc d'instructions ne doit pas être exécuté si la condition est fausse -> while ou for
- Si le bloc d'instructions doit être exécuté au moins une fois -> do-while
- Si le nombre d'exécution du bloc d'instructions dépend d’une ou plusieurs variables qui sont
modifiées à la fin de chaque répétition--> for
- Si le bloc d'instructions doit être exécuté aussi longtemps qu'une condition extérieure est
vraie (par exemple aussi longtemps qu'il y a des données dans un fichier d'entrées) ->
while
Le choix entre for et while est souvent une question de préférence et d’habitude.
- for permet de réunir les instructions qui influencent le nombre de répétitions au début de la
structure.
- while a l’avantage de correspondre plus exactement aux structures d’autres langages et à la
logique humaine.
- for a le désavantage de favoriser la programmation de structures surchargées et par la suite
illisibles.
- while a le désavantage de mener parfois à de longues structures dans lesquelles il faut
chercher pour trouver les instructions influençant la condition de répétition.
Si une variable est utilisée uniquement de manière locale, sa déclaration se fait dans la fonction
où elle est utilisée.
Exemple:
main() void fonction()
{ {
int A; int A;
} }
Si une variable doit être disponible pour plusieurs fonctions du programme, elle doit être déclarée
de manière globale, c'est à dire juste après les include (et donc aussi avant le main).
#include <stdio.h>
int A;
void main()
{
…
}
On cherchera à utiliser au minimum les variables globales car:
- elles créent des liens invisibles entre les fonctions
- elles risquent d'être cachées par des variables locales du même nom
2) Déclaration et définition
a) Déclaration
En C, il faut déclarer une fonction avant de pouvoir l'utiliser. Cette déclaration informe le
compilateur du type des paramètres et du résultat de la fonction. Seule la fonction main n'a pas
besoin d'être déclarée.
Si on définit la fonction (dans le programme) avant de l'appeler, la déclaration est inutile, mais:
afin de faciliter la lecture d'un programme, on conseille de définir les fonctions après le main(),
il faut donc les déclarer avant (le main), juste après les include.
Syntaxe:
type nom_fontion ( type var1, type var2 );
Déclaration locale: une fonction peut être déclarée localement dans la fonction qui l'appelle
(avant les déclarations de variables), elle est alors disponible à cette fonction.
Déclaration globale: une fonction peut être déclarée globalement au début du programme
(derrière les include), elle est alors disponible à toutes les fonctions du programme.
b) Définition
Syntaxe:
type nom_fontion ( type var1, type var2 )
{
déclarations des variables locales;
instructions;
}
Si une fonction fournit un résultat de type T, on dit que la fonction est de type T, ou a le type T.
Exemple 1:
int MAX (int N1, int N2) Fonction ayant deux paramètres int, retournant un
{ résultat int (le max)
if(N1>N2) return N1;
else return N2;
}
Exemple 2: fonction sans paramètre
float PI(void)
{
return 3.14159;
}
Remarque: la fonction main est de type int: int main(void) mais on peut écrire main()
3) Renvoyer un résultat
Exemple 1: double
CARRE (double X)
{
return X*X; Fournit comme résultat le carré d'un double fourni
} comme paramètre
Exemple 2: double
TANGENTE (double X)
{
if(cos(X)!=0)
return sin(X)/cos(X); Fournit comme résultat le rapport sin/cos
else sinon
printf("Erreur!\n"); affiche erreur
}
Exemple 3: void
LIGNE (int L)
{
int I;
for(I=0;I<L;I++) printf("*")
printf("\n");
}
Exercice 14
En C, le passage des paramètres se fait toujours par valeur, c'est-à-dire: les fonctions n'obtiennent
que les valeurs de leurs paramètres et n'ont pas accès aux variables elles-mêmes. Les paramètres
d'une fonction sont à considérer comme des variables locales qui sont initialisées
automatiquement par les valeurs indiquées lors d'un appel. A l'intérieur de la fonction, on peut
donc changer les valeurs des paramètres sans influencer les valeurs originales dans les fonctions
appelantes.
Exemple:
La fonction ETOILE dessine une ligne de N étoiles, le paramètre N est modifié à l'intérieur de
la fonction.
void ETOILE(int N)
{
while(N>0) En utilisant N comme compteur, on n'a pas besoin
{ de l'indice d'aide l comme dans la fonction LIGNE
printf("*"); précédente
N--;
}
printf("\n");
}
La fonction TRIANGLE appelle la fonction ETOILE en utilisant la variable L comme paramètre.
void TRIANGLE (void)
{
int L;
for(L=1;L<10;L++)ETOILE(L);
}
Au moment de l'appel, la valeur de L est copiée dans N. La variable N peut donc être décrémentée
dans ETOILE, sans influencer la valeur originale de L.
On l'a vu précédemment, une fonction n'obtient que les valeurs de ses paramètres.