Année universitaire 2002-2003 |
Licence d'informatique
|
Un programme C peut être composé d'un ou de plusieurs "fichiers sources" (parfois également appelés "unités de compilation"). La structuration d'un programme en plusieurs fichiers sources n'implique pas forcément qu'il y ait des relations d'inclusion entre ces fichiers (à l'aide de directives du type #include). Ce point sera vu plus en détail dans la séance 9 de travaux dirigés.
|
int a=0;        /* Définition de la variable
globale a. */ static int b=1; /* Définition confidentielle de b. */ int main(void) { ... } |
|
extern int a;   /* Référence à
la variable globale a. */ static int b=2; /* Définition confidentielle de b. */ int fonct(int i) { static int c=2; /* Classe statique. */ int d;          /* Classe automatique. */ c++; ... } |
En C, la déclaration d'une variable peut être :
Dans le cadre du module 4 de licence, nous avons choisi de déconseiller systématiquement l'utilisation de variables globales. Il est nécessaire de justifier ce parti pris, en énumérant les principaux avantages et inconvénients des variables globales :
Or, dans le cadre du module 4, les avantages des variables globales nous semblent mineurs par rapport à leurs inconvénients...
Lorsqu'une même variable (globale) doit être utilisée dans plusieurs fichiers, il est nécessaire de la "déclarer" dans chacun de ces fichiers, mais de deux façons différentes :
La différence entre définition et référence réside dans la réservation (ou non) d'un espace mémoire pour la variable (les différents fichiers doivent faire référence à la valeur contenue dans un même espace mémoire). Pour faire référence à une variable déjà définie, il suffit de la faire précéder du mot-clé extern (cf. la variable a de l'exemple précédent).
Certaines variables globales, définies dans un fichier, ne doivent pas être référencées dans d'autres fichiers pour ne pas être confondues avec des variables globales définies dans ces autres fichiers. Pour exprimer le fait que de telles variables sont confidentielles à un fichier (c'est-à-dire visibles uniquement dans ce fichier), on fait précéder leur déclaration du mot-clé static (cf. les deux variables b de l'exemple précédent).
Lorsque la classe d'une variable locale n'est pas spécifiée, la classe "automatique" lui est alors attribuée par défaut, comme pour la variable d de l'exemple précédent.
Une variable "statique" locale à une fonction, constitue une mémoire du passé pour cette fonction. Une fois initialisée, cette variable conserve son ancienne valeur à chaque nouvel appel de la fonction. Dans l'exemple précédent, la variable c de fichier2.c est initialisée à 2 lors du premier appel à la fonction fonct, puis est incrémentée. Lors de l'appel suivant, cette variable vaut 3 avant sa nouvelle incrémentation.
Écrire le fichier somme.c, contenant la fonction somme_chiffres d'en-tête :
dont le rôle est de :
Écrire le fichier principal.c, contenant le programme principal effectuant l'appel à la fonction somme_chiffres écrite précédemment. Pour cela, on appliquera l'algorithme suivant :
tant que le caractère lu par "scanf"
est différent du caractère '$' : ce caractère est envoyé à la fonction "somme_chiffres" ; |
De plus, il est demandé de modifier somme.c de manière à calculer également le produit des chiffres trouvés. Ce produit sera affiché à chaque parcours de la boucle dans le programme principal.
Ce type de boucle permet de réaliser un parcours de la boucle avant l'évaluation de la condition de boucle. Sa syntaxe :
est équivalente à :
La séquence d'instructions situées entre accolades se termine par un point-virgule dans la première écriture (boucle do-while), mais pas dans la deuxième écriture (boucle while).
Modifier le fichier principal.c de l'exercice 2 de manière à utiliser une boucle do-while. On suppose maintenant que la fin de la série de caractères à saisir est spécifiée par l'entrée du caractère 9 (qui doit être pris en compte pour le calcul de la somme et du produit).