Polycopie de Cours Module Programmation
Polycopie de Cours Module Programmation
Module : Programmation C 1
PREAMBULE
Objectifs généraux :
Objectifs spécifiques :
Introduction
L’objectif ultime de ce premier chapitre est de présenter les notions de bases nécessaires pour
appréhender le domaine de l’informatique, des ordinateurs et de la programmation en général.
Le chapitre est scindé en trois parties : Architecture et structure de l’ordinateur, aspect logiciel
et langage de programmation et enfin un petit aperçu sur le traitement automatique de
l’information et les systèmes de numération et de codage de l’information.
1. Architecture et composants matériels de l’ordinateur
L'ordinateur est une machine électronique qui ne sait faire qu'une chose : manipuler des nombres
binaires. La partie de l'ordinateur qui effectue tous ces calculs se nomme le processeur ou
microprocesseur. Nous verrons plus loin les composants internes à l'ordinateur plus en détail mais
retenons principalement que le processeur lit des instructions dans la mémoire de l’ordinateur
(appelée mémoire vive) et les exécute. Un programme est une séquence d’instructions. Notons que
la mémoire de l’ordinateur contient aussi des données sur lesquelles l’ordinateur doit travailler
pour exécuter un programme.
Le processeur est relié à la mémoire en vue d’échanger des données aussi bien en lecture ou en
écriture via trois types de dispositifs de communication appelés des bus à savoir : le bus
de données, le bus d’adresse et le bus de contrôle. Les bus sont eux-mêmes gérés par plusieurs
composants, regroupés en général en une seule puce dite le chipset ou jeu de composants. Le
schéma ci-après illustre l’architecture et la structure basique d’un ancien ordinateur de type PC.
Type de machine que vous devrez connaitre le mieux.
Voici plus en détails les composants internes de l'ordinateur, l'important n'étant pas d'en retenir
tous les éléments mais plutôt de mieux comprendre son fonctionnement.
©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 1
Module : Programmation C1 Filière : Licence appliquée SD
Processeur ou microprocesseur : il est constitué de circuits électroniques miniatures rassemblés
sur une seule puce fabriquée par un robot. Le processeur interprète et exécute les instructions
d’un programme informatique. L’image ci-après montre un microprocesseur Intel i9 de 9th
génération.
Bus de données : il transporte les données entre les différents blocs fonctionnels et composants
d’un ordinateur. Un bus qui n'interconnecte que deux dispositifs est appelé un port.
Bus de contrôle : il permet au microprocesseur d’envoyer les ordres en vue de contrôler les
différentes opérations et interactions avec les circuits voisins comme par exemple l’ordre de lire
ou écrire dans la mémoire. Le schéma ci-après montre ces trois types de bus.
Chipset (jeu de composants) : il est essentiel sur la carte-mère et gère les échanges de données
sur les différents bus.
Mémoire centrale : dite aussi mémoire de travail ou encore mémoire vive. En technologie elle est
connue par le sigle RAM (Random Access Memory). Comme son nom l’indique c’est la mémoire
dans laquelle se fait tout le travail effectué par le microprocesseur depuis le démarrage de la
machine où il y charge une partie du système d’exploitation. Les machines d’aujourd’hui sont
équipées d’au moins 4GO. Mais on trouve aussi 8GO, 16GO et 32GO.
Entrées/sorties : les ordinateurs comportent des ports série et parallèle pour la liaison avec des
périphériques de type imprimante, modem, ...
Mémoire vidéo : il s’agit d’une mémoire, dite VRAM, qui permet le stockage des images en vue
de les afficher à l'écran.
Carte vidéo VGA, carte son : peuvent être intégrés ou branchées sur un connecteur d’extension,
la carte vidéo permettent de décharger le microprocesseur des calculs de l'affichage (c'est-à-dire
qu'elle prenne en charge tout ce qui concerne l'affichage; tandis que la carte son permet
d’enregistrer et de reproduire du son.
Les périphériques sont des dispositifs extérieurs à l'ordinateur. Ils vont jouer un rôle essentiel
dans le transfert d'information vers l'ordinateur ou à partir de celui-ci. On distingue trois types :
Le scanner, le caméscope ou l'appareil photo numérique, ou encore la webcam sont aussi des
périphériques d'entrée puisqu'ils permettent l'introduction de données dans l'ordinateur.
Remarque : Aujourd’hui la capacité de ces disques durs dépasse 4 To. Toutefois il faut retenir
que la technologie SSD est au moins dix fois plus rapide que l’ancienne technologie HDD. Je
pense qu’avec le temps cette dernière technologie deviendra obsolète.
De façon générale, on peut dire que l’objectif premier d’un traitement automatique de
l’information consiste à demander à un ordinateur de traiter des informations d’une manière
automatique et de présenter les résultats selon la planification qui a été faite.
ORDINATEUR
Données Résultats
La programmation constitue un des moyens d’atteindre cet objectif. Au moyen d’un langage
approprié, appelé langage de programmation, on décrit précisément les étapes que l’ordinateur
doit franchir pour obtenir les résultats escomptés à partir des informations fournies. En
informatique, plusieurs de ces langages existent, à l’instar des langues naturelles (le français,
l’anglais, etc.), et ces divers langages permettent de communiquer avec l’ordinateur. Dans le reste
de cette section, nous allons donner un aperçu général sur les langages de programmation. Au
passage il faut bien retenir qu’un langage de programmation est un langage utilisé pour écrire
les programmes. Chaque langage utilise une liste de mots clé réservés dits instructions. Pour
Nous pouvons également définir un programme comme étant une solution à un problème
d’utilisateur. Le schéma suivant illustre les phases du processus de programmation.
Un environnement de développement intégré est un logiciel qui contient l’ensemble des outils qui
permet au programmeur d’être plus efficace dans son travail de développement informatique. Les
outils contenus dans un environnement de développement sont : un éditeur de texte destiné à
l’écriture des programmes, des fonctions qui permettent, par pression sur un bouton, de démarrer
le compilateur ou l’éditeur de liens ainsi qu’un débogueur qui permet d’exécuter ligne par ligne
le programme en vue localiser les sources de problèmes. Pour pratiquer la programmation C,
vous allez utiliser soit DEV C++ ou CODEBLOCKS comme IDE open source.
Langage bas niveau ou langage machine : Ce type de langage utilise uniquement le langage
binaire 0 et 1. D’ailleurs il est le seul langage que peut exécuter un microprocesseur. Un
programme écrit en langage machine dépend étroitement de la machine pour laquelle est écrit et
on dit qu’il n’est pas portable. La programmation en langage machine est une tâche lourde et très
difficile qui nécessite beaucoup de temps d’où perte de productivité.
Langage assembleur : C’est un langage intermédiaire entre les deux langages précédents. Celui-
ci utilise des mots réservés dits mnémoniques qui sont spécifiques au microprocesseur utilisé. Les
langages de bas niveau généralement et l’Assembleur particulièrement permettent de créer des
programmes très optimisés et proches du matériel sur lequel on exécute celui-ci. Avec ces
langages, vous devez par exemple gérer vous-même l’utilisation de la mémoire, ce qui peut être
compliqué pour un non spécialiste en microinformatique (informatique industrielle). Un
programme assembleur n’est pas portable, il est intimement lié au type de microprocesseur pour
lequel il a été écrit (Intel, Motorola, etc)
Langage évolué ou haut niveau : Il s’agit de tous les langages utilisant des mots clé et instructions
ayant un sens très proche du langage naturel (voir la liste de langages ci-après). Ce type de
langage est généralement portable càd qu’un programme écrit en langage évolué peut être exécuté
sur n’importe quelle machine dotée de n’importe quel microprocesseur. Java est un des meilleurs
langages portables grâce à sa fameuse machine virtuelle.
Les langages de programmation ont évolué au fil des années. Il existe alors beaucoup de langages
de programmation.
Parmi les plus anciens au monde, nous citons : Le Cobol, le Fortran et le Basic
Parmi les plus utilisés actuellement nous citons :
JavaScript : très utilisé pour le développement web
Python : utilisé d’une façon intensive ces dernières années dans le domaine scientifique et
particulièrement en intelligence artificielle (machine Learning)
Java : un des langages de POO les plus populaires au monde
C# utilisé pour le développement Windows mobile
C utilisé pour développer les systèmes d’exploitation OS entre autres
C++ utilisé pour développer les jeux vidéo entre autres
PHP utilisé pour le développement web notamment coté serveur
Ruby utilisé pour le développement web
Flutter/Dart : utilisé pour le développement des applications mobiles Android supporté par
Google
Swift : utilisé pour le développement des applications mobiles pour les produits Apple comme
l’iPhone.
L’Objective-C utilisé dans les systèmes d’exploitation d’Apple Mac OS.
Les langages Compilés : Un langage est compilé lorsque les programmes écrits dans ce langage
sont entièrement d’abord transformés en code objet avant d’être exécutés. C’est le rôle du
compilateur dont ils sont dotés.
Les langages Interprétés : Un langage est interprété lorsque les programmes écrits dans ce
langage sont directement exécutés sans transformation préliminaires. C’est le rôle de
l’interpréteur dont ils sont dotés.
Les langages semi-compilés : Ceux-ci commence par la compilation du code source en vue de
générer un byte code qui sera ensuite interprété au niveau de l’exécution.
Paradigmes de programmation
Le paradigme est la façon dont on programme un ordinateur. Au début, on codait une liste
d’instructions que l’ordinateur exécutait de façon linéaire, comme une recette de cuisine : c’est
la programmation procédurale. Elle est utilisée, par exemple, dans les langages C et Pascal. Puis
©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 6
Module : Programmation C1 Filière : Licence appliquée SD
on est passé à la programmation orientée objet POO où l’on crée et utilise des objets qui
communiquent entre eux. Comme dans les langages Java, Python, C#, C++, Ruby, Swift ou
l’Objective-C.
Codage : Le codage consiste à établir une correspondance entre un élément ayant un premier
niveau de sémantique dans la vraie vie et une représentation de cet élément dans un système
informatique. Il faut notre qu’un système informatique (matériel informatique) n’est qu’une partie
d’un système d’information SI qui est un concept plus générale qui sort du cadre de ce chapitre.
Information : L'information est définie comme une connaissance pouvant être échangée. En
pratique, l'information est donc un élément de connaissance susceptible d'être codé pour être
conservé, traité ou communiqué.
Remarque : Il est important de retenir que l'information est indépendante de la manière dont elle
sera représentée par des données.
Le traitement automatique de l’information est l’ensemble des opérations réalisées par des
moyens automatiques, relatif à la collecte, l'enregistrement, l'élaboration, la modification, la
conservation, la destruction, l'édition de données, affichage et impression de données et, d'une
façon générale, leur exploitation. Le schéma ci-après montre la chaine de traitement automatique
de données.
L'évolution de l'état d'une information ne peut être observée qu'en accord avec la notion de temps.
L'horloge est le système de traitement de l'information le plus élémentaire. Tous les systèmes de
traitement de l'information sont munis d'un quartz oscillateur constituant la fréquence de
l’horloge du système exprimée en gigahertz (GHz). Le premier type d'information que les systèmes
étaient capables de manipuler étaient des nombres, puis des textes, enfin vers 1980 on a inventé
les systèmes multimédia capables de manipuler divers types d'information: images, sons, vidéos…
Il faut noter que même les instructions d'un programme informatique sont aussi des informations.
Dans le système de traitement de l'information, les informations circulent sous forme de suite
de bits regroupés dans des fichiers ou des enregistrements. Un format désigne la manière dont les
bits sont disposés à l'intérieur du fichier ou de l'enregistrement pour stocker l'information.
Entre humains, l’information peut être transmise de différentes façons. Nous utilisons, pour ce
faire, différentes formes de « langages », comme la parole, l’écrit et même le geste. Pour échanger
de l’information avec un ordinateur, ces mêmes formes de langages ne suffisent pas : l’information
que nous désirons transmettre doit être codée de manière à ce qu'elle soit comprise par
l’ordinateur. Car l’ordinateur parle son propre langage, basé sur ce que l’on appelle « le système
binaire ». À la fin des années 30, Claude Shannon a démonté qu’une machine pouvait manipuler
de l’information en exécutant des opérations logiques à l'aide de « contacteurs » fermés pour «
vrai » et ouverts pour « faux », associant à « vrai » le nombre « 1 » et à « faux » le nombre « 0 ».
En effet, le signal de base d'un ordinateur est matérialisé par l'absence ou non d'un courant
électrique pendant un laps de temps donné. C’est le principe d’ailleurs derrière l’acquisition, le
stockage et la manipulation de l’information au niveau matériel ou électronique de l’ordinateur.
Bits et octets
Le bit (pour « binary digit ») est la plus petite unité d’information manipulable par un ordinateur.
Un bit vient préciser si le courant passe ou non. Ainsi, il ne peut avoir que la valeur de 0 ou de 1.
Le bit est le plus petit élément de la donnée qui ne représente pratiquement rien, mais groupés par
huit, les bits forment des octets (bytes) qui sont à même de représenter
différentes informations comme les lettres de l’alphabet et les chiffres. Concrètement avec un bit
on peut représenter deux états différents : 0 ou 1. On programmation C nous allons utiliser les
bits pour représenter des nombres entiers (int) sur 2 ou 4 octets ou encore des nombres réels
décimaux sur 4(float) ou 8(double) et parfois 16(long double) octets.
Il est important et utile de connaître les principales unités pour mesurer la capacité ou le volume
de données numériques. Il est tout aussi important de disposer de références concrètes quant à ce
que chacune de ces unités de mesure permet de stocker.
1 kilooctet (Ko) = 210 octets = 1024 octets : une photographie basse résolution.
L'ordinateur manipule des bits, le plus souvent organisés en octets comme suit :
01101111011100110110100001101111011100000010000001000101011011000110010101101
0001100100011000000110000..................
Cette représentation binaire étant assez peu pratique à manipuler pour l'homme, nous utiliserons
la représentation dite hexadécimale construite sur un système à base 16, compatible avec le
système binaire (à base 2) des ordinateurs, mais beaucoup plus concise. Dans ce système les dix
premiers symboles sont identiques à ceux utilisés dans le système décimal : 0, 1, 2, 3, 4, 5, 6, 7, 8
et 9, et les six derniers correspondent aux premières lettres de l'alphabet latin : A, B, C, D, E et
F, lesquelles valent respectivement: 10, 11, 12, 13, 14 et 15 en base 10». La table ci-après donne
la représentation hexadécimale.
Il s’agit d’un codage standard commun à tous les systèmes. Il donne une représentation numérique
binaire/hexa pour tous les caractères, nombres et symboles que comporte le clavier de
l’ordinateur. La table du code ASCII disponible sur le net donne en détail cette correspondance.
1 – NOTION DE BASE
1.1 Premier programme en C :
#include <stdio.h>
#include <conio.h>
main()
{
printf(BONJOUR); /*permet d’afficher BONJOUR*/
}
1.2.4- Commentaires
En plus des délimiteurs de commentaires /* et */ utilisés par le langage C, le C++ utilise
// pour rendre une ligne commentaire.
Quand on n’a besoin que des valeurs positives d’une variable, on peut précéder la déclaration
par le mot réservé unsigned, ce qui signifie non signé.
Exemple :
Unsigned int a comme valeurs limites 0 et 65535
main()
{
int i, j;
float x;
char rep;
unsigned int u;
long l1;
short s1;
printf ("exemple de déclaration de variable");
}
Une constante à représenter sous la forme d’un entier en double longueur (type long)
doit être suffixée de la lettre L si elle est comprise dans les limites d’un entier : 1000
est codé sur 2 octets tandis que 1000L l’est sur 4 octets.
Si une constante entière commence par zéro, le compilateur l’interprète comme une
valeur octale. Donc, en écrivant :
main()
{ int i, j=3, k; /* seul j est initialisé */
float x=1.5,
y=1.2e-3 ; /* représentation scientifique */
char c = ‘A’,
c2 = ‘\x41’, /* valeur hexadécimale */
c3 = ‘\202’; /* valeur octale */
long l1 = 123L; /* 123 représenté au format long */
double z1 = .5E8;
}
! NON
> >= < >= tests de supériorité et d’infériorité
== et != testes d’égalité et d’inégalité
&& et ¦¦ ET et OU logique
Opérateurs
1 ! ++ -- droite à gauche
2 * / % gauche à droite
3 + - gauche à droite
4 << >> gauche à droite
5 < <= > >= gauche à droite
6 == != gauche à droite
7 & gauche à droite
8 ^ gauche à droite
9 ¦ gauche à droite
10 && gauche à droite
11 ¦¦ gauche à droite
12 = += -= /= *= droite à gauche
Exemple :
s = i+j*k ; /* s = i + (j * k) */
s = i/j*k ; /* s = (i / j) * k */
s = i*j/k ; /* s = (i * j) / k */
Exemples :
s = sin(45) + cos(i) ;
t = 5 * sin(i) / cos(i) ;
r = pow( sin(i) , 2) ;
Si l’un des opérandes est un double, les autres sont convertis en double et le résultat est
un double
Sinon si l’un des opérandes est un long signé, les autres sont convertis en long et le résultat est
un long signé.
Sinon si l’un des opérandes est unsigned, les autres sont convertis en unsigned et le
résultat est unsigned
C permet des assignations (et de façon plus générale des opérations arithmétiques) entre
variables de types différents. Des conversions sont automatiquement réalisées.
La fonction printf permet un affichage formaté, ce qui signifie que pour chaque donnée à
afficher, le programmeur spécifie :
- le nom de la variable (ou une expression arithmétique).
- le format d’affichage ( sous forme d’un entier, sous forme scientifique, nombre décimales,
nombre de positions d’affichage, ...)
- le texte d’accompagnement.
Les caractères de contrôle (\n, ...) peuvent être utilisés. Par exemple \n provoque un interligne.
main () interligne
{
printf ("BONJOUR \nDE \nTURBO C");
}
Affichage
BONJOUR
DE
TURBO C
Chaque format d’affichage est introduit ( dans la zone de contrôle) par le caractère %
suivi d’un caractère qui indique le type de conversion.
car signification
d conversion en décimal
o octal
x hexadécimal (de 0 à f)
X hexadécimal (de 0 à F)
u un entier non signé (unsigned)
c caractère
s chaîne de caractère (string)
e sous la forme [Link]
E [Link]
f sous la forme [Link]
g semblable à e ou f suivant la valeur à afficher
Instructions affichages
i=2;
printf("XX%dXX",i); XX2XX
printf("XX%3dXX",i); XX 2XX
printf("XX%-3dXX",i); XX2 XX
printf("XX%03dXX",i); XX002XX
printf("XX%+3dXX",i); XX +2XX
i=1234;
printf("XX%2dXX",i); XX1234XX
x=1.5;
printf("XX%eXX",x); XX1.500000e+000XX
printf("XX%EXX",x); XX1.500000E+000XX
printf("XX%fXX",x); XX1.500000XX
printf("XX%6.3fXX",x); XX 1.500XX
printf("XX%-6.3fXX",x); XX1.500 XX
x=1.5;
printf("XX%3.0fXX",i); XX 2XX
rep=‘A’;
printf("XX%xXX",rep); XX41XX
printf("XX%4xXX",rep); XX 41XX
printf("XX%04xdXX",rep); XX0041XX
printf("XX%cXX",rep); XXAXX
printf("XX%3cXX",rep); XX AXX
printf("XX%-3cXX",rep); XXA XX
i=2;
printf("XX%3dYY%cZZ%4.1fXX",i,rep,x); XX 2YYAZZ 1.5XX
printf("X %3d %c %4.1f ",i,rep,x); X 2 A 1.5
printf("GUILLEMETS : \" "); GUILLEMETS : "
printf("POURCENTS : %% "); POURCENTS : %
i=6; j=3;
printf("XX%*.*fXX \n", i, j, x); /* %6.3f */
Exemple :
main()
{
char c =’A’;
putch(c) ;/*permet d’afficher A à l’écran*/
}
Ecriture d’une chaîne de caractère
Exemple :
main()
{
puts("BONJOUR");/*permet d’afficher BONJOUR à l’écran*/
}
Exemple :
main()
{
char c ;
c = ‘A’ ;
gotoxy(40,10);
putch(c) ;/*permet d’afficher le contenu de c à la
ligne 10 et colonne 40 */
}
La fonction scanf est l’analogue de printf en entrée. Elle effectue une conversion entre le format
utilisé lors de la saisie (sous forme de caractères ASCII) et la représentation interne de la variable
Chaque nom d’argument qui correspond à un scalaire (pas les tableaux ou chaînes de caractères)
doit être précédé de & (et commercial).
Les données tapées au clavier sont placées dans un tampon interne. scanf va chercher ses données
dans ce tampon, sans nécessairement le vider.
Les formats sont indiqués comme pour printf (sauf que * permet de sauter un nombre, par exemple
%*d ignore un entier dans la chaîne de saisie).
Les blancs en tête d’une donnée ne sont pas pris en compte, sauf pour le format %c)
Saisie de données.
main()
{ int i;
float x;
printf ("i ? "); scanf ("%d", &i);
printf ("x ? "); scanf ("%f", &x);
printf ("i = %d \nx = %f \n", i, x);
}
Plusieurs données (séparées par au moins un blanc) peuvent être tapées sur une même
ligne (un seul retour de chariot). L’opération de conversion s’arrête au premier caractère qui ne
correspond pas au type spécifié (par exemple une lettre ou un espace pour un entier).
Pour une chaîne de caractères, la recherche s’arrête au premier caractère blanc ou au caractère
‘retour de chariot’.
Plusieurs données sur une même ligne
main ()
{ int i; float x; char nom[50];
scanf("%d %f %s", &i, &x, nom);
printf ("i : %d \nx : %f \nnom : %s \n", i, x, nom);
}
affichage si on entre 25 54.32 ali
i : 25
x : 54.320000
nom : ali
Autre exemple
main()
{ int i; float x; char nom[50] ;
printf ("?");
scanf("%2d %f %*d %2s", &i, &x, nom);
printf("i : %d \nx : %f \nnom : %s \n", i, x, nom);
} Affichages si on entre 56789 0123 45a72
i : 56
x : 789.000000
nom : 45
4. Exercices d’application
Au lieu d’écrire:
if (i>j) z=a;
else z=b;
on peut écrire :
z = (i>j) ? a : b;
ce qui signifie : si i>j alors z prend la valeur a; sinon z prend la valeur b.
I.5 - Exercices
I.5.1 Ecrire un programme qui permet la résolution d’une équation de second ordre : A.x2 + B.x
+C=0;
I.5.2 Ecrire un programme qui permet le calcul de la moyenne de 4 notes d’un élève et d’afficher
sa mention :
Si 10 ≤ moyen < 12 : Passable
Sinon Si 12 ≤ moyen < 14 : Assez Bien
Sinon Si 14 ≤ moyen < 16 : Bien
Sinon Si 16 ≤ moyen : Très Bien
Sinon Pas de mention
I.5.2 Un patron décide d’accorder une réduction aux employés désirant prendre un repas dans le
restaurant de l’entreprise. Pour cela il affiche les modalités suivantes :
Si l’employé est célibataire il va bénéficier d’une réduction de 20% ;
Si l’employé est marié, il va bénéficier d’une réduction de 25% ;
Si l’employé à des enfants, la réduction est de 10% par enfant ;
En plus le patron accorde une réduction supplémentaire de 10% si le salaire mensuel de
l’employé est inférieur à 5000DH
Mais dans tous les cas la réduction ne doit dépasser 50%
Ecrire le programme permettant de calculer et d’afficher la remise correspondante à chaque cas.
mot réservé
variable de contrôle
switch(i)
{
branchement branche-ment case 1 : ....
si i est ni 1 ni 3 si break;
i=3 break
case 3 : ....
break;
Exercice d’application
1. Ecrire un programme qui permet d’afficher un chiffre saisi par l’utilisateur sous forme
d’un mot. (Exemple : 1 sera afficher un)
II.1- while
tant que
cette condition reste vraie,
cette instruction (ou ce groupe
d’instructions) est exécuté.
La ou les instructions sont effectuées tant que la condition entre parenthèses reste vérifiée. La
condition est évaluée avant l’exécution de la première instruction de la boucle.
boucle while
main()
{
int i = 2,
j = 7;
while (i<j)
printf("i : %d et j : %d \n", i++, j--);
} affichage
i : 2 et j : 7
i : 3 et j : 6
i : 4 et j : 5
II.2- do … while
exécuter
cette instruction (ou ce groupe
d’instructions)
tant que
cette condition reste vérifiée
Dans un do while, la condition (toujours spécifiée entre parenthèses) est évaluée en fin de boucle.
Les instructions sont donc toujours exécutées au moins une fois.
boucle do while
main()
{
int i = 2, j = 0;
do {
printf("i : %d et j : %d \n",i ,j);
i++; j--;
} while (i<j); affichage
}
II.3- for
for est utilisé lorsque le nombre d’itération est connu d’avance. La syntaxe de for est la
suivante:
L’instruction break permet de sortir directement d’une boucle (for ..., while ..., do ... while).
while est utilisé lorsqu’on veut répéter l’exécution d’une instruction (ou groupe d’instructions)
tant qu’une condition est vérifiée.
do while est utilisé lorsqu’on veut exécuter une instruction (ou groupe d’instructions) une fois ;
et de répéter l’exécution si une condition est vérifiée.
II.6.1
Ecrire un programme qui permet de calculer la moyenne des notes d’un élève :
II.6.2
Réécrire le programme précédent sachant que l’élève possède 10 notes :
II.6.3
Ecrire un programme qui permet de calculer la moyenne de plusieurs élèves, chacun
possède 10 notes :
II.6.4
Ecrire un programme qui permet de faire défiler de gauche à droite la chaîne de
caractère « BONJOUR » affiché sur la 10ème ligne
II.6.5
Ecrire un programme qui permet de faire défiler de bas à haut la chaîne de caractère
« BONJOUR » affiché à partir de la 20ème ligne.
I- LES TABLEAUX
a – Introduction
Supposons que l’on ait besoin, dans un programme, de conserver les notes de vingt élèves.
Il aurait fallu autant de variables que l’on a des notes (ex : Note1, Note2,…).
Cette solution a des inconvénients car il faut utiliser autant de noms différents que l’on a
de valeurs de même type à conserver (ex : 20 notes, il faut 20 noms).
Autre problème : il n’existe aucun lien entre ces différentes variables, or dans certains cas,
on est amené à appliquer le même traitement à l’ensemble de ces variables.
Il est donc nécessaire d’introduire un nouveau type de données, appelé tableau, pour
résoudre ce problème.
Un tableau est une suite séquentielle de cellules, chacune d’elles contenant (ou pouvant
contenir) une donnée de même type.
La taille d’un tableau est le nombre de ses cellules, et elle est fixe.
Un tableau est l’association de plusieurs variables de même type, et réserve ainsi une zone
mémoire permettant de stocker plusieurs données de même taille.
Un tableau possède un nom et un nombre d’éléments qui représente sa taille.
Tous les éléments d’un tableau ont le même type.
Pour désigner un élément, on indique le nom du tableau suivi par son indice entre crochets.
type_des_éléments Nom_tableau[taille] ;
Exemple :
Float Note[20] ;
c- Réservation de mémoire
La déclaration d’un tableau pouvant contenir 7 caractères se fait comme suit :
char tab[7];
taille du tableau (nombre d’elèments)
Nom du tableau
Type des éléments
int t[3] = { 2, 4, 8 };
Valeurs d’initialisation (leur nombre ne peut pas dépasser la taille
du tableau mais peut être inférieur ; dans ce cas, les cellules non
initialisées sont mises à 0)
taille du tableau
facultatif : si absent, le compilateur détermine la taille du tableau
d’après le nombre de valeurs d’initialisation.
Exemple :
int t[10] ;
for (i=0 ;i<10 ;i++) t[i]=0 ;
©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 27
Module : Programmation C1 Filière : Licence appliquée SD
Pour affecter les éléments d’un tableau, il faut réaliser une boucle qui permet de lire tous
les éléments un par un.
Exemple :
int t[10] ;
for (i=0 ;i<10 ;i++) scanf("%d",&t[i]) ;
Pour afficher les éléments d’un tableau, il faut réaliser une boucle :
Exemple :
int t[10] ;
for (i=0 ;i<10 ;i++) printf("%d\n",t[i]) ;
Application :
Ecrire l’algorithme d’un programme qui permet de calculer la moyenne des 20 notes des élèves
d’une classe.
g – Exercices d’application
1. Ecrire un programme qui permet de chercher l’élément petit d’un tableau de N éléments réels
(ex : la note la plus faible d’un élève):
2. Ecrire un programme qui permet de saisir 20 notes des élèves d’une classe, et de déterminer la
meilleur et la mauvaise note.
3. Ecrire un programme qui permet de calculer le nombre de notes qui sont supérieur ou égale
10.
4. Ecrire un programme qui permet de calculer le nombre de notes qui sont supérieur ou égale à
la moyenne d’une classe qui contient 20 élèves.
5. Ecrire un programme qui permet de trier les éléments d’un tableau de N éléments réels suivant
un ordre croissant (ex : trier les notes d’un élève)
6. Ecrire un programme qui permet de calculer le nombre d’apparition d’un nombre entier dans
un tableau de N éléments de type entier :
7. Ecrire un programme C qui permet d’afficher le résultat de la somme de deux tableaux et placer
le résultat dans un troisième tableau de N éléments
+
Prenons la note n°4 de l’élève n°2. Pour la retrouver dans le tableau il faudrait taper
Note[2][4]. En premier, le numéro de lignes et en second, le numéro de colonnes.
Syntaxe de déclaration :
C’est la même méthode de déclaration qu’un tableau à une dimension, mais là, on ajoute
le nombre de colonne. Et toujours, en premier le nombre de ligne et en second le nombre de
colonne.
type_des_éléments Nom_tableau[taille_ligne][taille_colonne] ;
Affichage et affectation :
Pour initialiser les éléments d’un tableau à 2 dimensions, il faut utiliser 2 boucles
imbriquées qui permettent d’initialiser les éléments un par un.
Exemple :
int t[10][5] ;
for (i=0 ;i<10 ;i++)
for (j=0 ;j<5 ;j++) t[i][j]=0;
Pour affecter les éléments d’un tableau, il faut réaliser deux boucles imbriquées qui
permettent de lire tous les éléments un par un:
Exemple :
int t[10][5] ;
for (i=0 ;i<10 ;i++)
for (j=0 ;j<5 ;j++)
scanf("%d",&t[i][j]) ;
Exercice d’application :
main()
{
float Note[20][5],
M[20] ;
int i,j ;
b – Tableau à n dimensions
On peut généraliser pour déclarer un tableau à n dimensions de la manière suivante :
Exemple :
float T[20][20][20] ;
3- Exercices d’application
3.1 Ecrire un programme qui permet de calculer la moyenne des élèves d’une même classe, en
utilisant les tableaux ; L’algorithme à suivre est le suivant :
Lire le nom de la classe, le nombre de matière ;
Lire les coefficients des matières
Lire le nombre d’élèves
Pour tous les élèves faire
Lire le nom de l’élève
Lecture des notes de l’élève
Afficher le nom, somme et moyenne et la mention sous la forme :
10 30 60
1 Nom
3 Notes Coefficients Notes*Coefficients
…. …. ….
Fin pour
Afficher la moyenne de la classe.
3.2 Ecrire un programme qui permet de d’afficher la facture des clients d’un magasin en
utilisant les tableaux ; L’algorithme à suivre est le suivant :
Répéter
Lire le nom du client ;
Lire le nombre de produits ;
Pour tous les produits faire
Lire le nom du produit
Lire la quantité
Lire le prix unitaire Hors taxe (HT)
Lire le taux de TVA
Fin pour
Afficher la facture selon le format suivant :
10 20 50 60 70
1 Nom
3 Quantité Nom Produit Prix unit HT Taux TVA Prix totale HT
…. …. …. …. ….
Avec i varie de 1 à N
s représente l’adresse de s[0] ; donc une chaîne est manipulée par l’adresse du premier élement
du tableau.
Un pointeur est une variable qui contient l’adresse d’une autre variable (adressage indirect)
Un pointeur doit être déclaré préalablement à son utilisation. Le programmeur doit également
indiquer le type de la variable pointée.
Une valeur particulière de pointeur est dénommée NULL. Elle indique que le pointeur ne contient
aucune adresse valide.
Un pointeur est déclaré grâce à l’opérateur * de la manière suivante :
int * p;
nom de la variable
indique qu’il s’agit d’un pointeur
type de la variable pointée
L’unité d’incrémentation (ou de décrémentation) d’un pointeur est toujours (convertie en octets)
la taille de la variable pointée.
nom_variable_structurée.nom_membre
Un membre particulier d’une structure peut également être accédé par l’intermédiaire
d’un pointeur sur cette structure :
nom_pointeur ->nom_membre
d3 est le nom donné à une zone mémoire qui occupe 14 octets (2 pour [Link] et [Link] qui
sont des entiers et 10 pour [Link] qui est un tableau de 10 caractères)
tandis que p1 est un pointeur : il occupe 2 ou 4 octets et contient l’adresse d’une zone mémoire
(celle de la variable pointée).
nom de la fonction
elle admet un seul argument qui est un entier
void signifierait qu’elle n’admet aucun argument
Si plusieurs arguments, ils sont séparés par virgule
int triple(int);
termine la fonction prototype
type de la valeur retournée
void signifierait que la fonction ne retourne pas
Les prototypes des fonctions du système sont placés dans des fichiers d’extension .h.
Vous introduisez ces fichiers dans vos programmes par : #include <xxxx.h>
La ligne suivante est une instruction (appel de la fonction triple avec le contenu de i passé en
argument) :
j = triple(i);
argument de la fonction
(si plusieurs arguments, ils doivent être séparés par des virgules)
un argument peut être une expression
nom de la fonction
assignation dans j de la valeur retournée par la fonction.
nom de l’argument
pas de point-virgule
int triple(int nb)
{
ici on insère les variable locales et les instructions de la fonction
}
Le passage de paramètre par valeur, permet d’envoyer des données à une fonction.
Le passage de paramètre par adresse permet à une fonction de modifier une ou des variables.
passage de paramètre par valeur, par adresse
#include <conio.h>
#include <stdio.h>
Void triple_val(int);
void triple_adr(int *);
main(){
int i=4;
triple_val(i);
printf ("passage de paramètre par valeur : %d", i );
triple_adr(&i);
printf ("passage de paramètre par adresse : %d", i );
}
void triple_val(int nb) {
nb=nb*3;
}
void triple_adr(int nb) {
*nb=(*nb)*3;
}
affichages
Passage argument par valeur : 4
Passage valeur par adresse : 12
La portée des variables, dépend du mot réservé (classe de stockage) qui précède leurs
déclarations.
Pour pouvoir porter des fonctions vers un autre programme. Il faut que la fonction n’utilise
que des variables locales.
Exercice
n
S = combinaison(n,p)
p=0
avec
n!
combinaison(n,p) =
p! .(n-p)!
et
n!=1*2*3*…*n