0% ont trouvé ce document utile (0 vote)
3 vues41 pages

Polycopie de Cours Module Programmation

Ce cours de Programmation C 1 est destiné aux étudiants de première année en licence informatique appliquée et vise à les familiariser avec le langage C, ses concepts, et son environnement de développement. Il couvre les bases de l'architecture des ordinateurs, les composants matériels et logiciels, ainsi que les différentes phases de réalisation d'un programme. Les étudiants apprendront à écrire, compiler et exécuter des programmes en C, tout en maîtrisant les structures conditionnelles et itératives.

Transféré par

dondeg
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
3 vues41 pages

Polycopie de Cours Module Programmation

Ce cours de Programmation C 1 est destiné aux étudiants de première année en licence informatique appliquée et vise à les familiariser avec le langage C, ses concepts, et son environnement de développement. Il couvre les bases de l'architecture des ordinateurs, les composants matériels et logiciels, ainsi que les différentes phases de réalisation d'un programme. Les étudiants apprendront à écrire, compiler et exécuter des programmes en C, tout en maîtrisant les structures conditionnelles et itératives.

Transféré par

dondeg
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Polycopié de cours

Module : Programmation C 1

Filière : Licence Informatique appliquée SD S1

©Prof. El Bachir TAZI


[Link]@[Link]

Année universitaire: 2023/2024


Module : Programmation C1 Filière: Licence appliquée SD

PREAMBULE

Ce cours est une introduction à la programmation C. Il est destiné


aux étudiants de première année en licence, filière informatique
appliquée aux sciences de données à la Faculté Polydisciplinaire de
Taza.

Objectifs généraux :

 Se familiariser avec l’environnement de programmation C

 Connaître l’aspect syntaxique et sémantique du langage C

 Ecrire des programmes corrects partant des programmes simples à


des programmes complexes.

Objectifs spécifiques :

La méthodologie adoptée afin de traiter ce module se base


principalement sur des cours magistraux, des travaux dirigés et des
travaux pratiques. On vise par ce module la réalisation des
objectifs spécifiques suivants :

 Connaître les concepts nécessaires pour la programmation C


(identifiants, déclaration, opérateurs, instructions, modules,
structures…)

 Apprendre à écrire des programmes en langage C et savoir les


compiler et les exécuter sur la machine à l’aide d’un des EDI
suivants : DevC++, CodeBlocks ou Visual Studio.

 Maîtriser la manipulation des structures conditionnelles et


itératives.

 Acquérir des connaissances et de savoir-faire relatif à la


résolution des problèmes complexes en adoptant le langage de
programmation C.

©Prof. El Bachir TAZI Page 1


Module : Programmation C1 Filière : Licence appliquée SD

CHAPITRE 1 : INTRODUCTION AU LANGAGE C

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.

 Composants matériels d’un ordinateur

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 adresse : il permet au microprocesseur de localiser l’emplacement des données sur la


mémoire

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.

Horloge système : contrôle et synchronise le microprocesseur et les composants associés. Sa «


fréquence » ou vitesse est exprimée en mégahertz (MHz).

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 2


Module : Programmation C1 Filière : Licence appliquée SD
La mémoire "cache" : zone de mémoire ultra-rapide intégrée dans les processeurs où sont
conservées les instructions et données qui reviennent le plus souvent. Pour des contraintes
techniques, ce type de mémoire utilisant la technologie SRAM (statique RAM) reste toujours limité
et chère. Mais elle aide beaucoup le processeur pour opérer plus vite (temps d’accès plus court)

Connecteurs d'extensions : sur la carte-mère, emplacements disponibles destinés à recevoir des


cartes d'usages divers.

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.

Carte-mère : c’est la carte principale d’un ordinateur (mainboard/motherboard) qui comporte


tous les composants nécessaires au fonctionnement de celui-ci. On y retrouve entre autres : le
microprocesseur, la mémoire centrale, les shipsets, les bus et les connecteurs d’extensions.
L’image ci-après montre un exemple de carte mère d’un PC de type desktop.

 Les périphériques d’un ordinateur

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 :

Les périphériques d'entrée :

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 3


Module : Programmation C1 Filière : Licence appliquée SD
La souris : permet de sélectionner et d’activer ce qui est affiché à l'écran.

Le clavier : permet de communiquer des caractères ou des fonctions au programme ou au


microprocesseur, clavier et souris ont à peu près les mêmes qualités, disons qu'ils sont
complémentaires.

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.

Les périphériques de sortie :


L'écran : permet la transmission d'informations visibles à l'utilisateur (texte, images, vidéo...)
L'imprimante : permet le transfert de documents depuis l'ordinateur vers un support papier.
Les périphériques d'entrée-sortie :
Le disque dur externe : lieu d’archivage principal des données. La taille d’un bon disque dur
externe est en teraoctet (TO)
Lecteur USB : C'est une sorte de mémoire flash sur laquelle on peut lire et écrire indifféremment
les données. Il permet de les stocker et les préserver contre une éventuelle panne inopinée de
l’ordinateur d’une façon très pratique.
Le lecteur de CD-Rom et de DVD : périphérique de lecture qui permet de lire les informations se
trouvant sur un CD-Rom ou sur un DVD. Il est devenu aujourd’hui obsolète. La plus part des
laptops modernes n’utilisent plus cette technologie.
Le Disque dur interne : On distingue principalement deux technologies de disque dur à savoir :
SSD : Acronyme de Solid State Drive est un disque électronique à semi-conducteur dit aussi
disque statique. Il s’agit de la dernière génération de disque dur ; il est basé sur de la technologie
de la mémoire flash. Il faut noter que cette technologie offre deux types de disque sata et NVMe.
HDD : Acronyme de Hard Disk Drive sont les plus couramment utilisés pendant ces dernières
années notamment pour les ordinateurs de bureau. Ces disques qui peuvent être internes ou
externes à l’ordinateur, sont constitués d’un ou plusieurs disques mécaniques qui lisent et écrivent
des informations sur un disque magnétique rotatif.

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.

II. Composants logiciels de l’ordinateur

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

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 4


Module : Programmation C1 Filière : Licence appliquée SD
utiliser un langage de programmation, le programmeur doit connaître la syntaxe et la sémantique
du langage.

Les phases de réalisation d’un programme sont :

 Analyser un problème et trouver une solution algorithmique


 Ecrire le programme dans un langage de programmation
 Tester et améliorer toujours la solution sur la machine en vérifiant les résultats d’exécution
du programme.

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.

 Notion d’IDE ou Environnement de Développement Intégré

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.

 Les niveaux des langages de programmation : Il existe trois niveaux de langages de


programmation à savoir :

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.

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 5


Module : Programmation C1 Filière : Licence appliquée SD
 Liste des langages évolués les plus connus

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.

 Types de langages de programmation : il existe trois types de langages de programmation


selon la manière dont ils traduisent et exécutent les programmes à savoir :

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.

Programmation Procédurale : La programmation procédurale est un type de programmation ou


le programmeur instruit l’ordinateur sur ce qu’il doit faire en regroupant les tâches en procédure.
Une procédure ou encore routine ou fonction est un bloc de tâches que l’ordinateur va effectuer.

Programmation Orienté Objet POO : La programmation orienté objet est un type de


programmation ou le programmeur instruit l’ordinateur sur ce qu’il doit faire en regroupant les
tâches en classes. Une classe est un objet qui expose ses comportements et ses caractéristiques.

Programmation Evénementielle : La programmation événementielle est un type de


programmation ou la direction du programme est déterminé par des événements, des actions
d’utilisateurs (clics de souris, bouton actionné), des actions venant de capteurs, ou des messages
venant d’autre programmes. Visual basic (VB) est un exemple.

III. Notion de codage et de traitement automatique de l’information

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é.

Donnée : Représentation formalisée de l'information, adaptée à la communication,


l'interprétation ou le traitement. Par exemple : une séquence de bits, un tableau de nombres, les
caractères d'une page, un enregistrement audio, etc. Une donnée est donc un conteneur porteur
d'une information ou d'un fragment d'information.

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.

 Traitement automatique de l’information (informatique)

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.

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 7


Module : Programmation C1 Filière : Licence appliquée SD
Un système de traitement automatique de l'information se caractérise par un minimum de quatre
unités :

 l'unité d'entrée (input), recueille l'information ;


 l'unité de stockage (storage) conserve toute ou une partie de l'information ;
 l'unité de traitement (processing), transforme l'état de l'information ;
 l'unité de sortie (output) présente le résultat de la modification.

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.

 Le système binaire (base 2)

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.

Unités et ordres de grandeur

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.

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 8


Module : Programmation C1 Filière : Licence appliquée SD
1 mégaoctet (Mo) = 220 octets = 1024 ko = 1 048 576 octets.
2 mégaoctets : une photographie haute résolution,
1 gigaoctet (Go) = 230 octets = 1024 Mo = 1 073 741 824 octets.
1 gigaoctet : une camionnette pleine de livres,
1 téraoctet (To) = 240 octets = 1024 Go = 1 099 511 627 776 octets.
10 téraoctets: l’ensemble des documents imprimés de la Bibliothèque du Congrès américain,
1 pétaoctet (Po) = 250 octets = 1024 To = 1 125 899 906 842 624 octets.
1 pétaoctet : 3 années d’images d’observation de la Terre par EOS (Earth Observation Satellite)
1 exaoctet (Eo) = 260 octets = 1024 Po = 1 152 921 504 606 846 976 octets.
5 exaoctets : tous les mots prononcés par les hommes depuis qu'ils existent.

 Le système hexadécimale (base 16)

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.

hexadécimal binaire hexadécimal binaire


0 0000 8 1001
1 0001 9 1000
2 0010 A 1010
3 0011 B 1011
4 0100 C 1100
5 0101 D 1101
6 0110 E 1110
7 0111 F 1111

Le codage ASCII (American Standard Code for Information Inter change) :

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.

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 9


Module : Programmation C1 Filière : Licence appliquée SD

CHAPITRE 2 : NOTIONS DE BASE DU LANGAGE C

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- Les composantes d’un programme en C


La forme générale d’un programme C est :

- Inclusions des entêtes des bibliothèques


- Déclarations globales
- Déclarations des entêtes des fonctions
main ()
{
- déclarations locales
- instructions
}
- Ecriture des corps des fonctions

1.2.1- La fonction main


main(): indique qu’il s’agit de la fonction principale du programme ;
{et} : indique le début et la fin de la fonction.

1.2.2- Les variables


La syntaxe de déclaration de variables est :
type_de_la_variable nom_de_la_variable ;

 Toute variable utilisée dans un programme C doit être déclarée ;


 Une variable peut être initialisé au moment de sa déclaration ;
 En C++, la déclaration se fait à n’importe quel endroit du programme apte à recevoir
une instruction.
1.2.3- Les identificateurs
 A toute variables est associé un nom (identificateur de 32 caractères au maximum, dont
le premier caractère est une lettre) et un type.
 Majuscules et minuscules donnent lieu à des identificateurs différents.
 Certains mots sont des mots réservés du langage et ne peuvent donc être utilisés comme
noms de variable (ou de fonctions).

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.

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 10


Module : Programmation C1 Filière : Licence appliquée SD

1.2.5- Les fonctions


Les fonctions permettent de décomposer un programme en entités plus petites (programme
modulaire) et donc de simplifier à la fois la réalisation et la mise au point des programmes.

2 – TYPE DE BASE, OPERATEURS ET EXPRESSIONS


2.1 Types simples :
Il existe des types entiers (char, short, int et long) et des types rationnels ( float et double) :

Type Signification Taille (en bits) Valeurs limites


Char Caractère 8 -128 à 127
Short Entier 16 -32768 à +32767
Int Entier 16 -32768 à +32767
Long Entier en double longueur 32 -2 147 483 648 à 2 147 483 647
Float Réel 32 ±10-37 à ±10+38
Double réel en double précis 64 ±10-307 à ±10+308

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

2.2 La déclaration des variables simples


La syntaxe de déclaration de variables est :
type_de_la_variable nom_de_la_variable ;

Exemple de déclaration des variables :

main()
{
int i, j;
float x;
char rep;
unsigned int u;
long l1;
short s1;
printf ("exemple de déclaration de variable");
}

2.2.1- Les constantes numériques


 Une constante réelle peut être exprimée (en spécifiant e ou E) en notation scientifique :

1.2e5 = 1.2*105 = 120000


.2e-2 = 0.2*10-2 = 0.002

 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 :

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 11


Module : Programmation C1 Filière : Licence appliquée SD
int i = 011; on initialise i à la valeur octale 11, soit à 9 en décimal.
 Une constante de type caractère contient un seul caractère (entre apostrophes). Il
existe une différence fondamentale entre ‘A’ et "A". Ces caractères sont représentés
dans le code ASCII. Donc, ‘A’ a la représentation hexadécimale 41.
 Il est possible de définir une constante de type caractère :
- en représentation hexadécimale en la préfixant de 0x ou 0X ou encore \x suivi de 1 à
3 chiffres hexadécimaux.
- en représentation octale en préfixant le nombre octal (1, 2 ou 3 chiffres de 0 à 7) de \
(backslash).

2.2.2- Initialisation des variables


Une valeur peut être affecter à une variable dès la déclaration.
exemple d’initialisation de variables

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;
}

Le contenu d’une variable non initialisée est indéterminé.

2.3 Les opérateurs standards


2.3.1- Les opérateurs connus
[Link]- Les opérateurs arithmétiques
Les opérateurs arithmétiques sont :
+ : addition ; - : soustraction ; * : multiplication ;
/ : division ; % : reste de la division entière

[Link]- Opérateurs conditionnels

! NON
> >= < >= tests de supériorité et d’infériorité
== et != testes d’égalité et d’inégalité
&& et ¦¦ ET et OU logique

[Link]- Opérations logiques sur les bits

& ET (niveau bit)


¦ OU (niveau bit)
^ OU exclusif (idem)
<< décalage binaireà gauche
>> décalage binaireà droite
~ complément à un

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 12


Module : Programmation C1 Filière : Licence appliquée SD

2.3.2- Les opérateurs particuliers de C


[Link]- Les opérateurs d’incrémentation et de décrémentation
Les opérateurs arithmétiques sont :
i++ : post-incrémentation de i ;
++i : pré-incrémentation de i ;
i-- : post-décrémentation de i ;
--i : pré-décrémentation de i ;
Exemples :
Avant chaque opération i=3 et k=15
Opération Equivalent résultat
i = ++k; k = k + 1; i = k; K = 16 et i = 16
i = k++; i = k; k = k + 1; i = 15 et k = 16
i++; i = i + 1; i=4
k = ++i + 5; i = i + 1; k = i + 5; i = 4 et k = 9
k = i++ + 5; i = i + 1; k = i + 5; k = 8 et i = 4

[Link]- Les opérateurs arithmétiques


+= -= *= /= : combinaison d’un opérateur arithmétique avec =
Exemple :
Au lieu d’écrire i = i + 20; on peut écrire i += 20;

2.4 Les expressions et les instructions


2.4.1 Les expressions
Une expression est une opération normale réalisée par l’association d’opérateurs, variables et/ou
constantes numériques.
Exemple :
( x * 13 + y ) / z est une expression

2.4.2 Les instructions


Les instructions sont identifiées par le point virgule. C’est ce caractère qui marque la fin
d’une instruction.
Exemple :
; /* Instruction vide : ne fait rien ! */

On peut faire une affectation à l’intérieur d’une instruction :


variable = expression ;
Exemple :
j=i+3*g; /* affecte j par i+(3*g) */

On peut effectuer des affectations multiples.


Exemple :
i=j=k=m=0 ; /* Annule les variables i, j, k et m. */

On peut réaliser un bloc d’instruction grâce au { }


Exemple :
{ j++;
i++;
}

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 13


Module : Programmation C1 Filière : Licence appliquée SD

2.5 Les priorités des opérateurs

La priorité relative des opérateurs est indiquée dans le tableau suivant :

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 */

2.6 Les fonctions arithmétiques standards

Les fonctions arithmétiques standard sont :

abs(x) : calcul la valeur absolue d’un entier x


fabs(x) : calcul la valeur absolue d’un float ou d’un double x
labs(x) : calcul la valeur absolue d’un entier long x
sqrt(x) : calcul la racine carrée de x
pow(x,y) : calcul la puissance xy
log10(x) : calcul le logarithme décimale de x
pow10(x) : calcul la puissance 10x
log(x) : calcul le logarithme de x
exp(x) : calcul l’exonentiel de x
sin(x) : calcul le sinus d’un nombre x
cos(x) : calcul le cosinus d’un nombre x
tan(x) : calcul la tangente d’un nombre x
asin(x) : calcul l‘arcsinus d’un nombre x
acos(x) : calcul l’arccosinus d’un nombre x
atan(x) : calcul l’arctangente d’un nombre x

Exemples :
s = sin(45) + cos(i) ;
t = 5 * sin(i) / cos(i) ;
r = pow( sin(i) , 2) ;

2.7 Les conversions de types


2.7.1- Les conversions de type automatiques
©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 14
Module : Programmation C1 Filière : Licence appliquée SD
Lorsque tous les opérandes (à droite du symbole = ) ont le même type, le résultat hérite de ce
type.
Lorsqu’une expression arithmétique comprend des types différents, le compilateur effectue des
conversions automatiques
 Les char sont convertis en int.
Exemple :
int i=3,j ;
j = i + ‘0’ ;
/*le caractère ‘0’ est converti en un int de valeur 48 (code ASCII du caractère ‘0’), le résultat est
j = 51 */

 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.

Conversions lors d’assignations


Entre char et int
char  int Le char se trouve dans l’octet le moins significatif de l’entier
int  char perte de l’octet le plus significatif
Entre int et long
int  long toujours expansion du bit de signe, ainsi :0xA2340xFFFFA234
0x12340x00001234
long  int résultat tronqué (perte des 2 octets les plus significatifs). Le résultat peut
donc être erronné
Entre unsigned et long
unsigned  long Les 2 octets les plus significatifs du long mis à 0
Entre int et float
int  float 15  15.0
float  int perte de la partie décimale, ainsi : 2.5  2
n’oubliez qu’un nombre entier est limité à 32767 alors qu’un float peut
prendre des valeurs infiniment plus élevées.
Entre float et double
float  double aucun problème
double  float perte de précision

2.7.2- Les conversions de type forcées (casting)


Le programmeur peut imposer lui même une conversion en préfixant l’opération d’un type
placé entre parenthèse.
(type) : spécifie le type du résultat ;
exemple : int i =10 ; float R ;
R = (float) i/3;

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 15


Module : Programmation C1 Filière : Licence appliquée SD

3 –AFFICHAGE DES DONNEES A L’ECRAN (sur console)

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.

La forme générale de printf est :

zone de contrôle (texte et format d’affichage)


arguments(nom de variables ou expressions)
(optionnels)
printf (controle, arg1, arg2, ... );

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

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 16


Module : Programmation C1 Filière : Licence appliquée SD

Entre le % et le caractère de conversion, on peut placer :


- le signe moins pour réclamer un cadrage à gauche
- le signe+ pour faire précéder les nombres de + ou - selon signe
- un espace pour faire précéder les nombres de - (si négatifs) ou d’un espace (si positifs)
- un chiffre qui indique le nombre minimum de caractères d’impression (avec 0 en tête si ce nombre
est précédé de 0)
- un point pour séparer l’indication ci-dessus d’un chiffre qui indique le nombre de chiffres après
la virgule (pour le float)
- la lettre l pour indiquer qu’on affiche un long ou un double.

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 : %

Il est également possible de spécifier dynamiquement le nombre minimum de caractères


d’impression et le nombre de décimales en remplaçant les constantes par * dans la zone de
contrôle et en plaçant ces valeurs comme négatifs :

i=6; j=3;
printf("XX%*.*fXX \n", i, j, x); /*  %6.3f */

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 17


Module : Programmation C1 Filière : Licence appliquée SD
Ecriture d’un caractère

La fonction putch permet d’afficher un caractère à l’écran.

Exemple :
main()
{
char c =’A’;
putch(c) ;/*permet d’afficher A à l’écran*/
}
Ecriture d’une chaîne de caractère

La fonction puts permet d’afficher une chaîne de caractère à l’écran.

Exemple :
main()
{
puts("BONJOUR");/*permet d’afficher BONJOUR à l’écran*/
}

3.5 Déplacement du curseur à l’écran


La fonction gotoxy(x,y) place le curseur à la ligne y et colonne x de 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 */
}

3.6 Exercices d’application

1. soit l’algorithme suivant :


Algorithme essai
Variables
V,D : entier
Début
V ← 231
D←2*V
Ecrire V
Ecrire D
Fin

Ecrire son équivalent en langage C

2. Ecrire le programme qui permet d’afficher le carrée de 500.

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 18


Module : Programmation C1 Filière : Licence appliquée SD

4. SAISIE DE DONNEES AU CLAVIER


1 – Saisie formatée de nombres et de caractères

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

scanf (controle, arg1, arg2, ...)

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

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 19


Module : Programmation C1 Filière : Licence appliquée SD

Introduction de données avec repères


main()
{ int i, j;
printf("?");
scanf("XX%dYY%d", &i, &j);
printf("i : %d et j : %d", i, j);
} Affichages si on entre XX53YY82
i : 53 et j : 82

2. Lecture d’un caractère


La fonction getch permet de lire un caractère à partir du clavier sans affichage sur l’écran.
La fonction getche permet de lire un caractère à partir du clavier avec affichage sur
l’écran.
Exemple :
main(){
char c ;
c = getch() ; /*permet de lire un caractère du clavier et le stocker dans c */
putch(c) ;/*permet d’afficher le contenu de c */
}

3. Lecture d’une chaîne de caractère


La fonction gets permet de lire une chaîne de caractère à partir du clavier avec affichage
sur l’écran.
Exemple :
main(){
char s[20] ;
gets(s) ; /*permet de lire une chaîne de
caractère du clavier et le stocker dans s */
puts(s) ;/*permet d’afficher le contenu de s */
}

4. Exercices d’application

1. un programme C qui permet de :


Lire le coté d’un cube
Et de calculer et afficher la surface et le volume du cube
2. Ecrire un Ecrire programme C qui permet de :
Lire le rayon et la hauteur d’un cylindre
Et de calculer et afficher la surface et le volume du cylindre

3. Ecrire un programme C qui permet de :


Lire le prix hors taxe PHT
Lire le nombre d’articles NART
Lire le taux TVA
Et de calculer et afficher le prix TTC
4. Ecrire l’algorithme qui permet de :
Lire les notes de 4 matières
Lire les coefficients des 4 matières
Et de calculer et afficher la somme et la moyenne

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 20


Module : Programmation C1 Filière : Licence appliquée SD

CHAPITRE 4 : LES STRUCTURES ALTERNATIVE ET LES BOUCLES

I – LES STRUCTURES ALTERNATIVES


I.1- Condition if
si ... alors une seule instruction
if (cond) instruction-1; if (i>0) printf ("positif ");
si ... alors plusieurs instructions
if (cond) { if (i>0){
instruction-1; printf("i pos ");
..... j = 0;
instruction-n; }
}

I.2 - Condition if … else


si ... alors une instruction ou bloc d’instructions
sinon une instruction ou bloc d’instructions
if (cond) { if (i>0){
instruction1; printf ( "i >0");
instruction2; j = 1;
} }
else instruction3; else printf ("i<=0 ");

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.3 - Conditions imbriquées if … else if … else


Dans une imbrication, un else se rapporte toujours au if le plus rapproché :
if (condition1) instruction1;
else if (condition2) instruction2;
else instruction3;

I.4 - Les opérateurs conditionnels


Dans l’ordre décroissant de priorité :
! NON
> >= < >= tests de supériorité et d’infériorité
== et != testes d’égalité et d’inégalité
&& et ¦¦ ET et OU logique

L’opération ! inverse une condition :


si i>j est vrai alors !(i>j) est faux
si i>j est faux alors !(i>j) est vrai
si j est différent de 0 alors !i est = 0
si i vaut 0 alors !i est différent de 0

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 21


Module : Programmation C1 Filière : Licence appliquée SD
if(i) est équivalent à if (i!=0)
if(!i) est équivalent à if (i= =0)

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.

I.6 - Structure à choix multiples (switch) :


L’instruction switch réalise un aiguillage vers différentes instructions en fonction de la valeur
d’une variable de contrôle (sélecteur) qui doit être un entier ou un caractère.

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;

default : .... fait sortir


} du switch

Seule l’instruction break fait sortie du switch


Pour default son rôle est de traiter les cas restants.

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)

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 22


Module : Programmation C1 Filière : Licence appliquée SD
2. Ecrire un programme qui permet d’afficher un nombre de 2 chiffres saisi par
l’utilisateur sous forme d’une phrase. (Exemple : 36 sera afficher trente six)

II- LES BOUCLES

II.1- while
tant que
cette condition reste vraie,
cette instruction (ou ce groupe
d’instructions) est exécuté.

while (condition) instruction ;

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

do instruction; while (condition) ;

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
}

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 23


Module : Programmation C1 Filière : Licence appliquée SD
i : 2 et j : 0

II.3- for

for est utilisé lorsque le nombre d’itération est connu d’avance. La syntaxe de for est la
suivante:

for (expr-1; expr-2; expr-3) instructions ;


ce qu’il faut faire à chaque fin de boucle
(plusieurs instructions possibles, séparées
par des virgules)
la boucle est effectuée tant que cette
condition est vérifiée (évaluation de la
condition avant entrée dans la boucle)
Initialisations de départ (plusieurs
initialisations possibles, séparées par des
virgules)
boucle for
main()
{ int i;
for (i=2; i<5; i++)
printf(" %d ",i);
}
affichages
234
boucle for
main()
{ int i, j;
for (i=2, j=4; i<5 && j>2; i++, j--)
printf("i : %d et j : %d \n", i, j);
}
affichages
i : 2 et j : 4
i : 3 et j :3

II.4- Utilisation de break et continue

L’instruction break permet de sortir directement d’une boucle (for ..., while ..., do ... while).

L’instruction continue permet de passer directement à l’itération suivante.

II.5- Choix de la structure répétitive

 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.

 for est utilisé lorsque le nombre d’itération est connu d’avance.

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 24


Module : Programmation C1 Filière : Licence appliquée SD

II.6- Exercices d’application

II.6.1
Ecrire un programme qui permet de calculer la moyenne des notes d’un élève :

L’algorithme à suivre est le suivant :


 Lire le nom de l’élève ;
 Répéter
Lire une note et faire la somme
Afficher « Autre note O/N »
Lire choix de l’utilisateur
 Tant que le choix est O
 Afficher le nom, somme et moyenne et la mention

II.6.2
Réécrire le programme précédent sachant que l’élève possède 10 notes :

L’algorithme à suivre est le suivant :


 Lire le nom de l’élève ;
 Pour i allant de 1 à 10 faire
Lire une note et faire la somme
 Afficher le nom, somme et moyenne et la mention

II.6.3
Ecrire un programme qui permet de calculer la moyenne de plusieurs élèves, chacun
possède 10 notes :

L’algorithme à suivre est le suivant :


 Répéter
Lire le nom de l’élève ;
Lecture de 10 note de l’élève
Afficher le nom, somme et moyenne et la mention
Afficher « Calcul pour un autre élève O/N »
Lire choix de l’utilisateur
 Tant que le choix est O

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.

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 25


Module : Programmation C1 Filière : Licence appliquée SD

CHAPITRE 5 : LES TYPES DE VARIABLES COMPLEXES

I- LES TABLEAUX

1 – Tableaux à une dimension

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.

b – Déclaration du nouveau type tableau

La syntaxe de déclaration d’une variable tableau est la suivante :

type_des_éléments Nom_tableau[taille] ;

Exemple :

Float Note[20] ;

 Cet exemple permet de déclarer de façon implicite 20 variables réels indicées de 0 à 19


Note[0], Note[1], … Note[19]
 Ce qui se trouve entre crochets se nomme indice, et sa valeur doit être limité entre 0 et
taille-1

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

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 26


Module : Programmation C1 Filière : Licence appliquée SD
Le système réservera 7 octets d’adresses mémoires successives pour ce tableau ; dont la
première adresse est tab ( ou &tab[0])

tab[0] tab[1] tab[2] tab[3] tab[4] tab[5] tab[6]

Ce tableau peut mémoriser 7 données de type char.

d- Initialisation et réservation automatique


Un tableau peut être initialisé au moment de sa déclaration ; si sa taille est non défini, il
y’ aura réservation automatique des cellules du tableau :

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.

e – Syntaxe d’utilisation des tableaux


Les tableaux sont utilisés à travers leurs éléments : le nom du tableau suivi d’un indice
entre crochets.
Les éléments d’un tableau sont des variables qui s’utilisent exactement comme n’importe
quelles autres variables classiques. Autrement dit, elles peuvent faire l’objet d’une affectation,
elles peuvent figurer dans une expression arithmétique, dans une comparaison, elles peuvent être
affichées et saisies…

L’indice d’un élément d’un tableau peut être :


 Directement une valeur ex : Note[10]
 Une variable entière ex : Note[i] avec i de type entier
 Une expression entière ex : Note [k+1] avec k de type entier

Quelque soit sa forme, la valeur de l’indice doit être :


 Entière
 Comprise entre la valeur minimale et maximale déterminées à la déclaration du tableau.

Remarque : La taille d’un tableau statique est fixe.

f- Initialisation, Affichage et affectation


Le fait que les éléments constituant un tableau soient indicés permet de parcourir tous les
éléments avec une boucle. La boucle POUR est généralement la boucle la plus adaptée, puisque
l’on connaît le nombre de fois qu’on doit effectuer le traitement. On utilise une variable qui sert
d’indice et s’incrémente à chaque tour de boucle.
De même qu’une variable possède toujours une valeur (qui peut être indéterminée), un tableau
peut être bien posséder des éléments dont la valeur est indéterminée. Donc avant d’utiliser un
tableau, il est donc nécessaire de l’initialiser.

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
+

2 – Généralisation à des tableaux à plusieurs dimensions :


a – Tableau à 2 dimensions
Imaginons, maintenant, que l’on veut garder les notes d’une matière de tout un trimestre,
pour tous les élèves de la classe. On suppose que l’on a 5 notes pour ce trimestre. On a besoin
d’un tableau à 2 dimensions.

Note0 Note1 Note2 Note3 Note4


Elève 0 10 12 15 11 13.5
Elève 1 12.5 13 14.5 15 12
Elève 2 9 12.5 5 16.5 10
… … … … … …
Elève 18 15 15 16 17 14
Elève 19 10 12 15 16 18
©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 28
Module : Programmation C1 Filière : Licence appliquée SD

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] ;

Initialisation et réservation automatique :


Un tableau à 2 dimensions peut être initialisé au moment de sa déclaration ; Soit le tableau
t à 2 dimensions :

int t[3][2] = { {1, 2} , {3, 4} , {5, 6} };

t est un tableau à 3 lignes et 2 colonnes :


1 2
3 4
5 6

Si la taille est non définie, le compilateur détermine la taille du tableau d’après le


nombre de valeurs d’initialisation.

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]) ;

Pour afficher les éléments d’un tableau, il faut réaliser 2 boucles :


Exemple :
int t[10] ;
for (i=0 ;i<10 ;i++)
for (j=0 ;j<5 ;j++)
printf("%d\n",t[i][j]) ;

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 29


Module : Programmation C1 Filière : Licence appliquée SD

Exercice d’application :

Soit le programme suivant :

main()
{
float Note[20][5],
M[20] ;
int i,j ;

for(i=0 ;i< 20 ;i++)


for(j=0 ;j<5 ;j++)
scanf("%f",&Note[i][j]) ;

for(i=0 ;i< 20 ;i++) {


M[i]=0 ;
for(j=0 ;j<5 ;j++)
M[i]=M[i]+Note[i][j];
M[i] /= 5;
printf("%d\n", M[i]);
}
}

1. Donner la tâche effectuée par le programme précédent.


2. Compléter le programme précedent précédent pour afficher la moyenne de la
classe.
3. Compléter le programme précédent pour afficher les notes des élèves et leurs
moyens selon l’ordre décroissant des moyennes.

b – Tableau à n dimensions
On peut généraliser pour déclarer un tableau à n dimensions de la manière suivante :

type_des_éléments Nom_tableau [taille1][taille2] … [taillen] ;

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 :

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 30


Module : Programmation C1 Filière : Licence appliquée SD

10 30 60

1 Nom
3 Notes Coefficients Notes*Coefficients
…. …. ….

21 Somme des coefficients Somme :……….


22 Moyenne:……….
23 Mentien:……….

 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
…. …. …. …. ….

23 Prix a payer HT:………. Prix à paye TTC:……….

 Autre Client O/N ?


 Jusqu’à ce que choix=N

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 31


Module : Programmation C1 Filière : Licence appliquée SD
3.3 Ecrire un programme en langage C qui permet de résoudre le système d’équation à N (<20)
inconnus ( X[1] … X[N]) suivant :

A[1][1] * X[1]= B[1]


A[2][1] * X[1] + A[2][2] * X[2] = B[2]
….
A[N][1] * X[1] + A[N][N-1] * X[2] + … + A[N][N] * X[N] = B[N]

L’algorithme à suivre est le suivant :


 Lire l’ordre N du système ;
 Lire les éléments du tableaux B à une dimension
( Indication : Lire B[i] avec i variant de 1 à N)
 Lire les éléments du tableaux A à 2 dimensions
( Indication : Lire A[i][j] avec i variant de 1 à N et j variant de 1 à i)
 Calculer les éléments du tableau X à une dimension ; sachant que:
i-1
X[i] = ( B[i] -  ( A[i][j] * X[j] ) ) / A[i][i]
J=1

Avec i varie de 1 à N

 Afficher la solution du système d’équations à n inconnus ( Afficher le tableau X)

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 32


Module : Programmation C1 Filière : Licence appliquée SD

II- LES CHAINES DE CARACTERES


Une chaîne de caractères (string) est composée de caractères alphanumériques (texte).
Elle est un cas particulier de tableau de caractères.

II.1- Déclaration et mémorisation :


Une chaîne de caractère est déclarée comme étant un tableau de caractère.
En C, une chaîne de caractère est une liste de caractère qui se termine par l’octet nul
(valeur 0).
Exemple :
char s[20] ; // la variable s est de type chaîne de caractère
strcpy(s, "SALUT"); // fonction qui affecte s par "SALUT"

‘S’ ‘A’ ‘L’ ‘U’ ‘T’ 0


s[0] s[1] s[2] s[3] s[4] s[5] s[6] ....

s représente l’adresse de s[0] ; donc une chaîne est manipulée par l’adresse du premier élement
du tableau.

II.2- Les chaînes de caractères constantes


une chaîne de caractères peut être déclarée comme constante ; on ne peut pas modifier s
dans le programme :
const char s[]= "SALUT" ;

II.3- Initialisation de chaînes de caractères


 Une chaîne de caractères peut être initialisée par la fonction strcpy :
strcpy(s, "SALUT"); // fonction qui affecte s par "SALUT"
 Une chaîne de caractères peut être initialisée au moment de sa déclaration. Il y’ aura
réservation automatique des cellules de la chaîne de caractères :
char s[]= "SALUT" ;
 Une autre méthode consiste à utilisé un pointeur, tel que :
char *p= "SALUT" ;
II.4- Accès aux éléments d’une chaîne de caractères
Le contenu d’une chaîne de caractères peut être utilisé par des fonctions spécifiques aux
chaînes de caractères ou par accès directe aux caractères de la chaîne, en utilisant les propriétés
des tableaux à une dimension.
char c, s[]= "SALUT" ;
s[0]=’V’ /*change la chaîne en "VALUT" */
s[2]= 0 /*change la chaîne en "VA" */
c = s[1] /*met dans c le caractère ‘A’ */
Exercices :
1. Ecrire un programme qui permet de compter le nombre de caractères d’une chaîne s.
2. Ecrire un programme qui permet de copier le contenu d’une chaîne s1 dans la chaîne s2.
3. Ecrire un programme qui permet de concaténer la chaîne s1 à la chaîne s2, le résultat sera
mis dans une chaîne s.
4. Ecrire un programme qui permet de mettre tous les caractères d’une chaîne s en majuscules.
5. Ecrire un programme qui permet de renverser une chaîne s.
6. Ecrire un programme qui permet de permuter la chaîne s1 avec la chaîne s2.

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 33


Module : Programmation C1 Filière : Licence appliquée SD
II.5- Précédence alphabétique et Lexicographique :
II.5.1- Précédence alphabétique des caractères :
Le code ASCII définie la précédence des caractères alphabétiques dans les PC :
…< ‘0’ < ’1’ < ’2’ < … < ‘9’ < … < ‘A’ < ‘B’ < … < ‘Z’ < … < ‘a’ < ‘b’ < … < ‘z’ <…

II.5.2- Précédence lexicographique des chaînes de caractères :


- La chaîne vide  est inférieure à toutes les chaînes de caractères.
- La chaîne A=a1a2…ap est inférieure à la chaîne B=b1b2…bm si :
1. ‘a1’ < ‘b1’
2. ‘a1’ < ‘b1’ et a2…ap < b2…bm

II.6- Travailler avec des chaînes de caractères :


C dispose de bibliothèques de fonctions pour le traitement des chaînes :
II.6.1- Les fonctions de <string> :
strlen(s) : calcul la longueur d’une chaîne s
strcpy(s1,s2) : copie la chaine s2 dans la chaîne s1
strcat(s1,s2) : ajoute la chaîne s2 à la fin de la chaîne s1
strcmp(s1,s2) : compare s1 à s2
strncpy(s1,s2,n) : copie n caractères de s2 dans la s1
strncat(s1,s2,n) : ajoute n caractères de s2 dans la s1

II.6.2- Les fonctions de <stdlib> :


atoi(s) : convertie s en un entier int
atol(s) : convertie s en un entier long
atof(s) : convertie s en un double
itoa(n,s,b) : convertie n (int) en chaîne s selon la base b
ltoa(n,s,b) : convertie n (long) en chaîne s selon la base b
ultoa(n,s,b) : convertie n (unsigned long) en s selon la base b

II.7- Tableaux de chaînes de caractères


II.7.1- Déclaration, initialisation et mémorisation
Une chaîne de caractère est déclarée comme étant un tableau de caractère à 2 dimensions.
Exemple :
char s[3][10] = { Mohamed , Ali , Hicham }
La mémorisation se fait comme suit :
S[0] ‘M’ ‘o’ ‘h’ ‘a’ ‘m’ ‘e’ ‘d’ 0
S[1] ‘A’ ‘l’ ‘i’ 0
S[2] ‘H’ ‘i’ ‘c’ ‘h’ ‘a’ ‘m’ 0

s[0], s[1] et s[2] représentent les adresses des 3 chaînes de caractères.

II.7.2- Accès aux différentes composantes


s[0], s[1] et s[2] permettent d’accéder aux 3 chaînes de caractères de l’exemple précédent.
s[i][j] permet d’accéder au caractère d’indice j de la chaîne s[i]

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 34


Module : Programmation C1 Filière : Licence appliquée SD

III- LES POINTEURS

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

Le calcul de l’adresse d’une variable se fait par l’opérateur & :

int a, *p; //a de type int et p de type pointeur sur int


p = &a; //ainsi, p contient l’adresse de a.
p++; //L’opérateur ++ permet d’incrémenter automatiquement de 1 la valeur du pointeur p qui
est aussi l’adresse de la mémoire pointée par p.

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.

IV- LES STRUCTURES


Les structures sont des collections de données regroupées dans une entité logique. Ils
permettent de regrouper des données relatives à un même objet.

IV.1- Déclaration de structure

struct date {int jour ;


char mois[10] ;
int annee;} d1;

nom donnée à la variable


éléments (ou membres) de la structure
nom donné à la structure
mot réservé

D’autres formes plus simples sont :

struct X { ... }; //définit uniquement une structure, à


//laquelle on donne le nom X.

struct { ... } s1; //on déclare une variable de nom s1.

struct X s2; //déclaration d’une variable, appelée s2


//dont la description de contenu est X.

struct X s3, s4, s5; //déclaration de 3 variables ayant


//chacune la structure X.
©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 35
Module : Programmation C1 Filière : Licence appliquée SD

IV.2- Affectation des variables de la structure


Un membre d’une structure est accédé par :

nom_variable_structurée.nom_membre

accès aux éléments d’une structure


Main(){
struct date { int jour ;
char mois[10];
int annee;
}; /*aucune variable */
struct date d1,d2; /* 2 variables ayant le type date */
[Link] = 18;
strcpy([Link], "janvier");
[Link] = 2001;
[Link] = [Link] + 1;
}

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

accès aux éléments d’une structure par pointeur


main(){
struct date { int jour ;
char mois[10];
int annee;
};
struct date d3, /* variable de struct signe */
*pl; /* pl est un pointeur et qu’il
contiendra l’adresse d’une variable de type structure date*/
pl = &d3; /* pl contient l’adresse de l°octet de d3 */
pl->jour = 12; /*[Link] vaut 12 */
strcpy(pl->mois, "janvier");
cout << "jour : "<< pl->jour<< endl<<" mois : " pl->mois;
}
jour : 12 affichages
mois : janvier

Il est important de comprendre la différence entre

struct date d3; et struct date *p1;

 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).

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 36


Module : Programmation C1 Filière : Licence appliquée SD

CHAPITRE 6 : LES FONCTIONS

I - Déclaration et Définition de fonctions


Les fonctions permettent de décomposer un programme en entités plus petites (programme
modulaire) et donc de simplifier à la fois la réalisation et la mise au point de programmes.
Une fonction peut :
- se trouver dans le même module de texte (toutes les déclarations et instructions qui la
composent s’y trouvent), être incluse automatiquement dans le texte de programme (par une
directive #include) ou compilée séparément
- être appelée à partir du programme principal, d’une autre fonction ou d’elle-même
(récursivité).
- admettre ou non des arguments.
- retourner ou non une valeur
- posséder ses propres variables.

appel et déclaration d’une fonction

int triple(int); /* Déclaration du prototype de fonction */


void main(){
int i=2, j; /*variables appartenant uniquement à main */
j=triple(i); /* appel de la fonction triple */
j=triple(4); /* nouveau appel de la fonction triple */
}
int triple(int nb) { /* Définition de la fonction */
return(nb*3); /* valeur entière retourné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.

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 37


Module : Programmation C1 Filière : Licence appliquée SD

et la ligne suivante une implémentation de 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
}

Si la fonction admet plusieurs arguments, on écrira par exemple :

int func(int i, float x, char ch)


{
...
}

II- Passage de paramètre par valeur, par adresse

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

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 38


Module : Programmation C1 Filière : Licence appliquée SD

III- Classes de stockage et règles de portée des variables

La portée des variables, dépend du mot réservé (classe de stockage) qui précède leurs
déclarations.

Classe de stockage Signification


auto Par défaut, les variables locales à une fonction sont automatiques.
globale Elles sont définies en dehors de toute fonction et peuvent être accédées
dans toutes les fonctions du programme.
extern Une variable externe est une variable qu’une fonction peut accéder
sans qu’il y ait eu allocation de mémoire (l’allocation de mémoire est
assurée par un module compilé séparement)
static Une variable statique est une variable locale à une fonction mais garde
sa valeur d’une invocation à l’autre de la procédure.
register Variable que le programmeur souhaiterait voir placée dans un registre
de la machine.
const Variable que sa valeur reste constante

Pour pouvoir porter des fonctions vers un autre programme. Il faut que la fonction n’utilise
que des variables locales.

Exercice

Ecrire un programme qui permet de calculer :

n
S =  combinaison(n,p)
p=0

avec
n!
combinaison(n,p) =
p! .(n-p)!

et

n!=1*2*3*…*n

N.B : il faut commencer par écrire :


1. une fonction qui calcul n !
2. et une fonction qui calcule la combinaison(n,p) ;

©Prof. El Bachir TAZI, FPT-USMBA 2023 Page 39

Vous aimerez peut-être aussi