Cours de Programmation Procédurale DAWM-ASRS
Cours de Programmation Procédurale DAWM-ASRS
Cours de Programmation Procédurale DAWM-ASRS
1. Historique
2. Définitions
La programmation est une branche de l’informatique qui sert à créer des programmes.
Tout ce que vous possédez sur votre ordinateur est un programme : votre navigateur
Internet, Windows, votre lecteur MP3 donne des instructions à l’ordinateur pour
écouter de la musique, …
Schéma explicatif
Ex.
a. Pourquoi programmer en c
La principale différence entre C# et C++ réside dans ses applications ou C# peut être
utilisé pour développer des applications web professionnelles, tandis que le C++ est
utile lorsque le programmeur souhaite créer quelque chose qui nécessite une
interaction étroite avec le matériel.
5. Types de programme en C
Les programmes graphiques affichent des fenêtres. Ils génèrent à l'écran des
fenêtres que l'on peut ouvrir, réduire, fermer, agrandir…
Les programmes en console sont plus fréquents sous Linux que sous Windows
et Mac OS X. Ils sont constitués de simples textes qui s'affichent à l'écran, le
plus souvent en blanc sur fond noir.
Code : C
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello world!\n");
return 0;
}
#include <stdio.h> et #include <stdlib.h>: sont des en-tête du fichier source sont
appelées directives de préprocesseur (bibliothèque/librairie) ou un programme qui se
lance au début de la compilation. Le mot include en anglais signifie « inclure » en
français. Ces fichiers (stdio.h et stdlib.h) contiennent du code tout prêt qui permet
d'afficher du texte à l'écran, récupérer des informations, quitter le programme, lire un
fichier, etc
Fichier d'en-tête : stdio.h, qui signifie « Standard input output », soit « Entréesortie
standard ». Ce fichier d'en-tête va nous permettre de communiquer avec l'utilisateur
en affichant des messages à l'écran et en récupérant des informations.
programme commence. Une fonction a un début et une fin, délimités par des
accolades {et}. Les lignes à l'intérieur d'une fonction sont des instructions. La première
ligne : printf("Hello world!\n"); demande à afficher le message « Hello world! » à
l'écran. Quand votre programme arrivera à cette ligne, il va donc afficher un message
à l'écran, puis passer à l'instruction suivante : return 0; qui indique qu'on arrive à la fin
de notre fonction main et demande de renvoyer la valeur 0 (0 veut dire tout s'est bien
passé et n'importe quelle autre valeur signifie « erreur »). Noter que toute instruction
se termine obligatoirement par un point-virgule « ; ».
printf est une fonction toute prête qui permet d'afficher un message à l'écran dans une
console. printf se trouve dans une bibliothèque (<stdio.h>et <stdlib.h>:) où l'on
retrouve de nombreuses autres fonctions prêtes à l'emploi. stdio.h en particulier
contient des fonctions permettant d'afficher des choses à l'écran (comme printf).
c. Schéma récap
Votre tâche est d’afficher un message « Bonjour les débutants en langage c » à l'écran
(dans la console) puis le curseur revient à la ligne.
Code : C
/* Ci-dessous, ce sont des directives de préprocesseur. Ces lignes permettent d'ajouter
des fichiers au projet, fichiers que l'on appelle bibliothèques. Grâce à ces
bibliothèques, on disposera de fonctions toutes prêtes pour afficher par exemple un
message à l'écran.*/
08/05/2021
#include <stdio.h>
#include <stdlib.h>
/*Ci-dessous, vous avez la fonction principale du programme, appelée main. C'est par
cette fonction que tous les programmes commencent. Ici, ma fonction se contente
d'afficher Bonjour à l'écran.*/
int main()
{
printf("Bonjour les débutants en langage c \n"); //Cette instruction affiche Bonjour à
l'écran
return 0; // Le programme renvoie le nombre 0 puis s'arrête
}
Remarques :
la console de Windows ne gère pas les accents, par contre la console de Linux,
oui.
deux caractères spéciaux :
- \n : retour à la ligne (= « Entrée ») ;
- \t : tabulation.
Dans notre cas, pour faire une entrée, il suffit de taper \n pour créer un retour à la ligne.
Si je veux donc faire un retour à la ligne juste après le mot « Bonjour », je devrais taper
: printf("Bonjour\n");
7. Utilisation de la mémoire
En théorie, un ordinateur est capable de stocker tout type d’information. Mais comment
est-il possible de réaliser un tel miracle alors qu’il ne s’agit finalement que d’un amas
de circuits électriques ? il faut commencer par comprendre comment notre ordinateur
fait pour stocker des données.
Table de correspondance.
Remarques : Mais pourquoi utiliser la base deux et non la base dix ? Parce que les
données circulent sous forme de courants électriques. Or, la tension de ceux-ci n’étant
pas toujours stable, il est difficile de réaliser un système fiable sachant détecter dix
valeurs différentes. Par contre, c’est parfaitement possible avec deux valeurs : il y a
du courant ou il n’y en a pas.
b. La mémoire
peu de données et rapide, mémoire avec plus de données et lente). Les types de
mémoires :
Dans la mémoire vive, les bits sont regroupés en « paquets » de quantité fixe : des «
cases mémoires », appelées multiplets (ou bytes en anglais). Les mémoires utilisent
des multiplets de huit bits, appelés octet. Un octet peut stocker 256 informations
différentes (vous pouvez faire le calcul vous-même : combien vaut 11111111 en base
deux ?). Pour stocker plus d’informations, il sera nécessaire d’utiliser plusieurs octets.
08/05/2021
08/05/2021
Tout cela est bien sympathique, mais manipuler explicitement des références (des
adresses) est un vrai calvaire, de même que de s’évertuer à calculer en base deux.
Heureusement pour nous, les langages de programmation (et notamment le C), se
chargent d’effectuer les conversions pour nous et remplacent les références par des
variables. Une variable correspondra à une portion de mémoire, appelée objet, à
laquelle nous donnerons un nom. Ce nom permettra d’identifier notre variable, tout
comme une référence permet d’identifier une portion de mémoire parmi toutes les
autres. Nous allons ainsi pouvoir nommer les données que nous manipulons, chacun
de ces noms étant remplacés lors de la compilation par une référence (le plus souvent
une adresse).
a. Les types
Les types short int, int, long int et long long int sont des types signés et servent tous à
stocker des nombres entiers qui peuvent prendre des valeurs positives, négatives, ou
nulles.
Un type entier non signé (ex. _Bool, 0 ou 1) est un type entier qui n’accepte que des
valeurs positives ou nulles.
Les types float, double et long double permettent quant à eux de stocker des nombres
réels.
Le nombre de multiplets occupés par une variable est limité aux valeurs suivant son
type.
08/05/2021
c. Les identificateurs
— Les mots-clés sont des mots spéciaux, réservés par le compilateur, que l’on ne peut
pas utiliser comme on veut. Ils servent à déclarer des variables et certains concepts ;
il s’agit de :
08/05/2021
— les identificateurs peuvent être aussi longs que l’on désire, toutefois le compilateur
ne tiendra compte que des 63 premiers caractères.
À noter que le C fait la différence entre les majuscules et les minuscules (on dit qu’il
respecte la casse). Ainsi les trois identificateurs suivants sont différents.
variable
Variable
VaRiAbLe
08/05/2021
d. Les opérateurs
int resultat = 0;
resultat = 5 + 3;
printf("5 + 3 = %d", resultat); // 5 + 3 = 8
int resultat = 0;
resultat = 5 / 2;
printf ("5 / 2 = %d", resultat); // 5 / 2 = 2
solution :
double resultat = 0;
resultat = 5.0 / 2.0; printf ("5 / 2 = %f", resultat);// 5 / 2 = 2.500000
int main()
{
int resultat = 0, nombre1 = 0, nombre2 = 0;
// On demande les nombres 1 et 2 à l'utilisateur :
printf("Entrez le nombre 1 : ");
scanf("%d", &nombre1);
08/05/2021
Résultat
Entrez le nombre 1 : 30
Entrez le nombre 2 : 25
30 + 25 = 55
Cette fonction renvoie un double, donc votre variable absolue doit être de type double.
ceil est une fonction qui renvoie (un double) le premier nombre entier après le
nombre décimal qu'on lui donne.
sqrt est une fonction qui calcule la racine carrée d'un nombre. Elle renvoie un
double
1 int main(void)
2{
3 _Bool booleen;
4 double taille;
Ex. de séparateurs
int x=0,y,rep;
int x = 0, y, rep;
int age, taille, nombre;
int annee, mois, jour;
int age, taille;
int x, y, z;
_Bool booleen = 0;
unsigned char age = 42;
long score = -1;
double pi = 3.14;
double a = 5 mais double a = 5. (certains préfèrent double a = 5.0, cela revient
au même).
double f = 1E-1; /* 1x10^-1 = 0.1 */
char a = 'a';
const double pi = 3.14159265; /* Rendre une variable constante avec const* /
Ex.
age = 30;
taille = 177.5;
petite_valeur = 2;
Le code suivant est donc incorrect. : int age = 15; int age = 20;
variable += 1;
variable -= 1;
variable++;// on ajoute 1
variable--;//on enlève 1
++variable;
--variable;
Il y a une subtile différence entre les deux formes. Une [in/dé]crémentation préfixée
change la valeur de l’expression avant d'envoyer la valeur, alors qu’une
[in/dé]crémentation post-fixée renvoie la valeur et la modifie ensuite.
Exemple pour bien comprendre : si j'ai une variable a qui vaut 5, ++a incrémentera
08/05/2021
int a = 5 ;
int b = ++a ; /* ici, b vaudra 6 */
Par contre, a++ attendra avant d'incrémenter la variable : celle-ci sera incrémentée
après la prochaine "utilisation".
int a = 5 ;
int b = a++ ; /* ici, b vaudra 5, et a sera mis à 6 une fois que la valeur de a++ est
recopiée dans b */
La conversion de type est une opération qui consiste à changer le type d’une variable
en un autre.
int a;
const double pi = 3.14;
a = (int) pi;
La valeur de pi reste inchangée, elle vaudra toujours 3.14 dans la suite du programme.
Par contre, a vaut maintenant 3, puisque le flottant a été converti en entier. Expliciter
une conversion peut nous servir quand on veut forcer le résultat d’une opération par
exemple. Imaginons que nous voulons faire une division, mais que les deux opérandes
soient de type int.
int a, b;
double c;
a = 5;
b = 9;
c = a / b;
Vu qu’on fait une division euclidienne, le résultat sera tronqué. Si on veut avoir un
résultat avec la partie décimale, il suffit de faire une conversion explicite d’un des deux
opérandes en double :
c = (double) a / b;
/* ou */
c = a / (double) b;
08/05/2021
À l’inverse, les sorties vont transmettre des données vers ces périphériques. On
pourrait citer l’exemple de l’écran : notre ordinateur lui envoie des informations pour
qu’elles soient affichées.
1. Les sorties
la fonction printf() permet d’afficher (de sortir) du texte dans la console ou à l’écran.
Ex.
#include <stdio.h>
int main(void)
{
printf("Bonjour tout le monde !\n");
return 0;
}
2. Les formats
Ce sont des repères au sein d’un texte qui indique à printf() que la valeur d’une variable
est attendue à cet endroit.
#include <stdio.h>
int main(void)
{
int variable = 20;
printf("%d\n", variable);
return 0;
}
08/05/2021
Un format commence toujours par le symbole % et est suivi par une ou plusieurs lettres
qui indiquent le type de données que nous souhaitons afficher. Cette suite de lettre est
appelée un indicateur de conversion. En voici une liste non exhaustive.
Ex.
#include <stdio.h>
int main(void)
{
char z = 'z';
char a = 10;
unsigned short b = 20;
int c = 30;
long d = 40;
float e = 50.;
double f = 60.0;
long double g = 70.0;
printf("%c\n", z);
printf("%d\n", a);
printf("%u\n", b);
printf("%o\n", b);
printf("%x\n", b);
printf("%d\n", c);
08/05/2021
printf("%li\n", d);
printf("%f\n", e);
printf("%e\n", f);
g = 80.0;
printf("%Lg\n", g);
return 0;
}
Remarque : Si vous souhaitez afficher le caractère % vous devez le doubler %%. A
noter que vous devez aussi préciser les nombres flottants :
double x = 42.42734;
printf("%.2f\n", x); //résultat 42.43
Ex.
#include <stdio.h>
int main(void)
{
printf("Quelques sauts de ligne\n\n\n");
printf("\tIl y a une tabulation avant moi !\n");
printf("Je voulais dire que...\r");
printf("Hey ! Vous pourriez me laisser parler !\n");
return 0;
}
08/05/2021
Ex. il est possible d’écrire un long texte sans appeler plusieurs fois la fonction printf().
#include <stdio.h>
int main(void)
{
printf("Texte écrit sur plusieurs "
"lignes dans le code source "
"mais sur une seule dans la console.\n");
return 0;
}
La fonction scanf permet de récupérer des informations fournies par les périphériques
contrairement à la fonction printf qui affiche les informations.
Ex.
#include <stdio.h>
int main(void)
{
int age;
printf("Quel âge avez-vous ? ");
scanf("%d", &age);
printf("Vous avez %d an(s)\n", age);
return 0;
}
La fonction scanf() a besoin de connaitre l’emplacement en mémoire de nos variables
afin de les modifier. Afin d’effectuer cette opération, nous utilisons le symbole &.
L’opérateur & permet de transmettre l’adresse d’une variable à scanf().
Pour ce qui est des indicateurs de conversions, ils sont un peu différents de ceux de
printf().
08/05/2021
En passant, sachez qu’il est possible de lire plusieurs entrées en même temps, par
exemple comme ceci.
int x, y;
scanf("%d %d", &x, &y);
printf("x = %d | y = %d\n", x, y);
5. cas particulier
L’utilisation de la fonction puts est plus simple puisqu’elle ne se contente
d'afficher que des chaînes de caractères simples.
Ex
puts("Salut les zeros !");
int var = 0;
puts("%d", var);
La fonction putchar affiche tout simplement un caractère.
Ex.
putchar('c');
08/05/2021
Exercice
Dit au revoir.
Solution
#include <stdio.h>
int main(void)
{
int nombre_1, nombre_2;
printf("Bonjour !\n\n");
/* On demande a l'utilisateur deux nombres */
printf("Veuillez saisir le premier nombre : ");
scanf("%d", &nombre_1);
printf("Veuillez saisir le deuxième nombre : ");
scanf("%d", &nombre_2);
/* Puis on effectue des calculs */
printf("\nCalculs :\n\n");
printf("\t%d + %d = %d\n", nombre_1, nombre_2, nombre_1 +
nombre_2);
printf("\t%d - %d = %d\n", nombre_1, nombre_2, nombre_1 -
nombre_2);
printf("\t%d * %d = %d\n", nombre_1, nombre_2, nombre_1 *
nombre_2);
printf("\t%d / %d = %.3f\n", nombre_1, nombre_2, (double)
nombre_1 / nombre_2);
printf("\nAu revoir !");
return 0;
}
08/05/2021
Les programmes doivent être capables de prendre des décisions. Pour y parvenir, les
développeurs utilisent ce qu'on appelle des structures de contrôle :
les conditions : elles permettent d'écrire dans le programme des règles comme
« Si ceci arrive, alors fais cela » ;
les boucles : elles permettent de répéter plusieurs fois une série d'instructions.
Pour qu'un programme soit capable de prendre des décisions, on utilise dans le code
source des conditions. On parle de structures conditionnelles ou le programme réagi
différemment en fonction des circonstances.
Nous allons voir comment rédiger des conditions à l’aide de deux catégories
d’opérateurs :
— les opérateurs de comparaison, qui comparent deux nombres : ==, <=, >=, <,>, != ;
— les opérateurs logiques, qui permettent de combiner plusieurs conditions : true (vrai
ou 1) et false (faux ou 0).
Ex. pour combiner les comparaisons a >= 0 et a <= 1000, nous devons placer
l’opérateur && entre les deux, ce qui donne l’expression a >= 0 && a <= 1000.
b. L’opérateur « OU s’écrit || » vérifie que l’une des deux conditions (ou que les
deux) est (sont) vraie(s).
L’exemple suivant permet de déterminer si un nombre est divisible par trois ou par cinq
(ou les deux) : (a % 3 == 0) || (a % 5 == 0).
Par exemple, si nous voulons vérifier cette fois qu’un nombre n’est pas situé entre zéro
et mille, nous pouvons utiliser la condition a >= 0 && a <= 1000 et lui appliquer
l’opérateur de négation, ce qui donne ! (a >= 0 && a <= 1000).
2. Comme ce n'est pas le cas, il passe au premier else if : est-ce qu'on a 1 enfant ?
Non plus !
3. L'ordinateur teste donc le second else if : est-ce qu'on a 2 enfants ? Oui ! Donc on
affiche le message « Quels beaux enfants vous avez la ! ».
Syntaxe :
if (/* Condition(s) */)
{
/* Instruction(s) */
}
else
{
if (/* Condition(s) */)
{
/* Instruction(s) */
08/05/2021
}
else
{
if (/* Condition(s) */)
{
/* Instruction(s) */
}
else
{
/* Instruction(s) */
}
}
}
Les règles de priorités sont les suivantes, de la plus forte à la plus faible :
Si vous souhaitez un résultat différent, il est nécessaire d’ajouter des parenthèses pour
modifier les règles de priorité.
Nous allons voir trois types de boucles courantes en C : while, do… while et for.
Ex.
08/05/2021
int i = 0;
while (i < 5)
{
En termes d'écriture, la première différence avec while est qu'ici le test de la condition
se fait à la fin de la boucle et non au début.
Ex.
int i = 0;
do
{
printf("La variable i vaut %d\n", i);
i++;
} while (i < 5);
Résultat
La variable i vaut 0
La variable i vaut 1
La variable i vaut 2
La variable i vaut 3
La variable i vaut 4
Ex.
int variable;
for (variable = 0 ; variable < 10 ; variable++)
{
printf("variable vaut %d\n", variable);
}
Résultat
variable vaut 0
variable vaut 1
variable vaut 2
variable vaut 3
variable vaut 4
variable vaut 5
variable vaut 6
variable vaut 7
variable vaut 8
variable vaut 9
Une boucle dont la condition est toujours vraie est appelée une boucle infinie
Le résultat d’un programme créé sera une grosse suite d'instructions placées les unes
à la suite des autres. Et parmi cette grosse suite d'instructions, il y a des paquets
d'instructions, qui reviennent régulièrement et qui sont présents en plusieurs
exemplaires dans le programme final.
Une fonction exécute des actions et renvoie un résultat. On dit qu'une fonction possède
une entrée et une sortie.
08/05/2021
Le but des fonctions est donc de simplifier le code source, pour ne pas avoir à retaper
le même code plusieurs fois d'affilée.
Exemple une fonction appelée triple qui calcule le triple du nombre qu'on lui donne, en
le multipliant par 3.
son nom : les règles sont les mêmes que pour les variables ;
son corps (son contenu) : le bloc d’instructions à exécuter ;
son type de retour : le type du résultat de la fonction ;
d’éventuels paramètres : des valeurs reçues par la fonction lors de
l’appel.
Noter : Un paramètre est une variable propre à une fonction, il n’est pas utilisable en
dehors de celle-ci. Un argument est une expression passée lors d’un l’appel de
fonction et dont la valeur est affectée au paramètre correspondant.
void bonjour()
{
printf("Bonjour");
}
Ex. d’une fonction qui affiche « bonjour !» à l’écran.
#include <stdio.h>
void bonjour(void)
{
printf("Bonjour !\n");
}
int main(void)
{
bonjour();
return 0;}
4. Les prototypes
Jusqu’à présent, nous avons toujours défini notre fonction avant la fonction main(). En
effet, mettre la fonction après le « main » provoquera un comportement indéterminé.
La compilation pourrait très bien marcher comme elle pourrait planter.
08/05/2021
En effet, lorsque la fonction est placée avant, le compilateur connait ses paramètres
et sa valeur de retour. Du coup, quand on appelle la fonction, le compilateur vérifie que
les arguments qu'on lui donne sont bons. Si au contraire la fonction est après, le
compilateur ne connait pas la fonction ; il lui fixe arbitrairement des caractéristiques.
Et quand on tente d'appeler la fonction, la compilation plante, car les arguments ne
correspondent pas aux yeux du compilateur.
Pour résoudre ce problème, il est possible de déclarer une fonction à l’aide d’un
prototype. Celui-ci permet de spécifier le type de retour de la fonction, son nombre
d’arguments et leur type, mais ne comporte pas le corps de cette fonction.
Un prototype permet de déclarer une fonction sans spécifier son corps, il n’est ainsi
plus nécessaire de se soucier de l’ordre de définition des fonctions.
Ex.
#include <stdio.h>
int carre(int nombre);
int main(void)
{
int nombre, nombre_au_carre;
printf("Entrez un nombre\n");
scanf("%d", &nombre);
nombre_au_carre = carre(nombre);
printf("Voici le carre de %d : %d\n", nombre,
nombre_au_carre);
return 0;
}
int carre(int nombre)
{
nombre *= nombre;
return nombre;
}
Il arrive parfois que l’utilisation de paramètres ne soit pas adaptée et que des fonctions
08/05/2021
soient amenées à travailler sur des données qui doivent leur être communes.
Il est possible de définir une variable dite «globale» qui sera utilisable par toutes les
fonctions. Pour définir une variable globale, il vous suffit de définir une variable en
dehors de tout bloc, autrement dit en dehors de toute fonction.
Ex.
#include <stdio.h>
void fonction(void);
int appels = 0;
void fonction(void)
{
++appels;
}
int main(void)
{
fonction();
fonction();
printf("Ce programme a réalisé %d appel(s) de fonction\n",
appels);
return 0;
}
08/05/2021
Nous allons voir comment découper nos projets en plusieurs fichiers. En effet, même
si l'on découpe bien son projet en fonctions, ce dernier est difficile à relire si tout est
contenu dans le même fichier. Ce chapitre a donc pour but de vous apprendre à
découper vos projets efficacement.
La portée d’une variable est la partie du programme où cette dernière est utilisable. Il
existe deux types de portées :
Une variable, avec une portée au niveau d’un bloc est utilisable, visible de sa
déclaration jusqu’à la fin du bloc dans lequel elle est déclarée.
Ex.
#include <stdio.h>
int main(void)
{
{
int nombre = 3;
printf("%d\n", nombre);
}
/* Incorrect ! */
printf("%d\n", nombre);
return 0;
}
Dans ce code, la variable nombre est déclaré dans un sous-bloc. Sa portée est donc
limitée à ce dernier et elle ne peut pas être utilisée en dehors.
08/05/2021
Une variable avec une portée au niveau d’un fichier est utilisable, visible de sa
déclaration jusqu’à la fin du fichier dans lequel elle est déclarée.
Ex.
#include <stdio.h>
int nombre = 3;
int triple(void)
{
return nombre * 3;
}
int main(void)
{
nombre = triple();
printf("%d\n", nombre);
return 0;
}
Dans ce code, la variable nombre a une portée au niveau du fichier et peut par
conséquent être aussi bien utilisée dans la fonction triple() que dans la fonction main().
2. Notions de masques
Si elles ont la même portée comme dans l’exemple ci-dessous, alors le compilateur
sera incapable de déterminer à quelle variable ou à quelle fonction le nom fait
référence et, dès lors, il retournera une erreur.
Ex.
int main(void)
{
int nombre = 10;
int nombre = 20;
return 0;
}
En revanche, si elles ont des portées différentes, alors celle ayant la portée la plus
petite sera privilégiée, on dit qu’elle masque celle(s) de portée(s) plus grande(s).
Autrement dit, dans l’exemple qui suit, c’est la variable du bloc de la fonction main()
08/05/2021
Ex.
#include <stdio.h>
int nombre = 10;
int main(void)
{
int nombre = 20;
printf("%d\n", nombre);
return 0;
}
Notez que: «celle(s) de portée plus petite» car les variables déclarées dans un sous-
bloc ont une portée plus faible que celle déclarée dans un bloc supérieur. Ainsi, le code
ci-dessous est parfaitement valide et affichera 30.
Ex.
#include <stdio.h>
int nombre = 10;
int main(void)
{
int nombre = 20;
if (nombre == 20)
{
int nombre = 30;
printf("%d\n", nombre);
}
return 0;
}
3. Les fonctions
nous avions créé une fonction triple() que nous avons placée dans le même fichier que
la fonction main(). Essayons à présent de les répartir dans deux fichiers distincts
comme suit :
autre.c
int triple(int nombre)
{
return nombre * 3;
}
08/05/2021
main.c
int main(void)
{
autre.c
int triple(int nombre)
{
return nombre * 3;
}
main.c
extern int triple(int nombre);
int main(void)
{
int nombre = triple(3);
return 0;
}
En terme technique, on dit que la fonction triple() est définie dans le fichier «autre.c»
(car c’est là que se situe le corps de la fonction) et qu’elle est déclarée dans le fichier
«main.c». Sachez qu’une fonction ne peut être définie qu’une seule et unique fois.
Pour information, notez que le mot-clé extern est facultatif devant un prototype (il est
implicitement inséré par le compilateur). Nous vous conseillons cependant de l’utiliser
par soucis de clarté et de symétrie avec les déclarations de variables (voyez ci-
dessous).
08/05/2021