29 janvier
2025
1- Chap1 : introduction à la
programmation structurée
2- Quelques repères
Le langage C est lie à la conception du système Unix. Les dates
marquantes de l’histoire du C sont les suivantes :
1972 : la première version du C est écrite en assembleur
1973 : création du premier compilateur C portable
1980 : sortir du premier document normaliser appelle norme
ANSI
1990 : réalisation du document final normaliser auprès du ISO
3- Présentation du langage C
Le langage C’est un langage de bas niveau dans la mesure ou il permet
l’accès à des données que manipulent les ordinateurs (bits, octets,
adresses) et qui ne sont pas toujours disponibles dans les langages
évoluer tel que le Fortran, le Pascal ou Ada.
Le langage C a été conçu pour l’écriture des systèmes d’exploitation.
Plus de 90% du noyau du système Unix est écrit en C. le compilateur C est
écrit lui en grande partie en langage C ou à partir d’outil générant du
langage C. il en est de même des autres outils de la chaine de
compilation : assembleur, éditeur de lien, préprocesseur. De plus les
utilitaires du systèmes Unix sont écrit en C (Shell, …).
Il est cependant suffisamment général, pour permettre de développer
des applications variées de types scientifiques. Le langage C est disponible
sur pratiquement toutes les plates formes, de l’ordinateur personnel
jusqu’au gros calculateur scientifique en passant par les stations de
travail. De nombreux logiciels du domaine des ordinateurs personnels tel
que : Microsoft Word, ou Excel, sous le système Windows, sont eux
aussi écrit à partir du langages C ou de sont successeur Oriente Object
C++. Le C est un langage impératif, classique qui comporte :
Des types standards de base (entier, réel, caractère)
Des structures de contrôles (si … alors, séquencé, boucle)
Des constructions de types (tableaux, union,
enregistrement)
Des sous-programmes (fonctions, procédures)
Bien que pouvant être considérer de bas niveau, le langage C
supporte les structures de base nécessaire a la conception des
applications structurées. Un programme C peut être constituer de
plusieurs modules, chaque module est un fichier source qui peut être
compilé de manière autonome pour obtenir un fichier objet. Le langage
05 Février
C se limite aux fonctionnalités qui peuvent être traduites efficacement en
instruction machine. 2025
Cette règle de fonctionnement doit permettre de détecter ce qui est
fait directement Par le compilateur lui-même et ce qui ne peux pas être
fait illustrer cette règle par quelques exemples.
Le compilateur est capable de générer les instructions machine qui
permet de manipuler les éléments binaires
Il permet la manipulation algébrique (addition, soustraction,
multiplication et autres …)
De groupe d’octet qui représente des valeurs entières ou de valeurs
réelles
Il permet de manipuler des caractères en considérant que ceux si
sont représenter par un octet. Il ne permet pas de manipuler
directement les tableaux.
De manière contradictoire a la règle précédente, le compilateur
accepte l’affection d’une collection de données groupées (structure)
par une collection de données de types identique
4- Premier programme en c
#include<stdio.h>
#include<stdlib.h>
Int main () {
Printf(‘’ \n hello world’’);
return 0;
}
/* » et de fin « */
Noté en premier lieu que toutes les instructions se termine par un
point-virgule. Omettre un point-virgule déclenche un message d’erreur lors
de la compilation. Des commentaires peuvent être insérer n’importe ou
dans le programme. Des lors qu’ils sont placés entre les délimiteurs de
début « /* » et de fin « */ » un commentaire peut également être introduit
par : « // ». Le premier il s’agit des commentaires multilignes et le
deuxième monolingue.
La ligne 3 indique définit l’entête de la fonction principale du
programme. Cette fonction principale s’appellera toujours main. Dans
notre cas, la notre ne prends pas de paramètre en entrée mais retourne
une valeur de type (int). Cela est fait grâce a l’instruction return. La valeur
de retourne de la fonction étant 0. En générale, 0 signifie terminaison sans
erreur. La ligne 4 affiche dans la console « hello world » l’instruction
utilisée pour afficher le message est : printf la chaine a affiché doit être
obligatoirement entre guillemets ( ‘’ ‘’) sauf le cas d’une variable. A la
base, le langage c n’est qu’un ensemble de bibliothèque à partir desquels
le compilateur trouve des fonctions et les applications qui lui permettent
de créer un programme exécutable. Certaines bibliothèques sont inclues
dans le compilateur ainsi l’instruction printf est défini dans la bibliothèque
« stdio.h ». Les librairies standards du C seront présenter 18 Février
au fur et a
mesure de leurs utilisations dans ce cours néanmoins nous 2025
pouvons déjà
en dire quelques mots a l’instar de l’étudiant qui recherche des livres, on
peut dire que le fichiers .h représente l’index du livres et le fichier .cbp
correspond au contenue du chapitre concerné.
5- Le langage C et la programmation
structuré
La programmation structurée est un nom générique qui couvre un
courant de pensé. Ce courant de pensée ses développer entre les années
1965 et 1975. Elle a pour but de faciliter le travail de relecture des
programmes et de minimiser le travail de maintenance ⛑ (correction et
ajout de fonctionnalités). Le langage C est assez contraignant. Il offre des
structures de programme mais il n’oblige pas a les utiliser. En particulier il
autorise des entrée 🎟 multiples et des sorties multiples dans les taches. La
mise en page est libre 🆓 ce qui permet d’écrire des programmes dont la
mise en page reflète la structure. Les programmes sans mise en page sont
pratiquement illisibles du fait de la richesse de la syntaxe du C.
Comme le montre la figure ci-dessous, un programme en C est
constitué d’un ensemble de fichier 📂 source destiné a être compiler
séparément et a subir une édition de lien 🔗 commune. Ces fichiers sources
sont également appelés modules et ce type de programmation est appelé
programmation modulaire. La visibilité des modules entre eux serra
expliquer plus loin.
Le fait de pouvoir compilé chaque fichier source de manière
autonome amène a concevoir des programmes de manière modulaire en
regroupant dans chaque fichier source des fonctions qui manipulent des
même variables ou qui participent au même algorithme.
Fichier [Link] Fichier [Link] Fichier [Link]
(source, module) (source, module) (source, module)
< Compilation > < Compilation > < Compilation >
Fichier1.O Fichier1.O Fichier1.O
(Objet) (Objet) (Objet)
< Edition des liens >
[Link]
(Exécutable)
Maîtriser la programmation en C nécessite beaucoup de savoir-faire et
donc de pratique. Elle s’apprend essentiellement a partir de ses erreurs,
alors n’hésitez pas à mettre les mains 🤲 cambouis.
CHAP 2 : type et variable
Ce chapitre traitera des définitions de variables. Dans tous les
langages de programmation, une définition de variable (adresse et valeur)
a des rôles suivants :
1. Définir le domaine de valeur de cette variable (taille en mémoire)
et représentation machine 🎰
2. Définir les opérations possibles sur cette variable
3. Définir le domaine de validité de cette variable
4. Permettre a l’environnement d’exécution du programme d’associer
le nom de la variable a une adresse mémoire
5. Initialiser la variable avec une valeur compatible avec le domaine de
valeur.
1- Type de bases
Ce sont les types prédéfinis du compilateur. Ils sont au nombre de
5 et on peut les classer en trois catégories :
Les types entiers
Les types réels
Le type vide 🕳
1-1- : les types entiers : (Char et Int)
Char : type caractère représentant un nombre entier codé sur
1Octect (8bits) avec une valeur évoluant entre -128 et + 127 (28 =
256 possibilités). Le nom char n’est anodin car il est le support des
caractères au sens communs du terme. La correspondance entre un
nombre et le caractère qu’il représente est transcrit dans la table
ASCII.
Int : c’est le type entier et généralement codé sur 4 octets et
permet de représenter et permet de représenter 232 nombres entiers.
Les types entiers peuvent être qualifiés a l’aide du mot Unsigned
qui force les variables de ce types a être considérer comme étant
uniquement positif par exemple la valeur d’une variable unsigned char
ne peut évolué qu’entre 0 et 255. Le type int se décline avec les
qualificateurs short ou long pour préciser sa taille. Exemple : short int,
long int.
1-2- Les types réels (float, double,
long double)
Ces types servent a représenter les nombres réels. On distingue trois
types reels qui se distingue par :
1- La précision sur la partie décimale
2- Les plages de valeurs acceptables
Float : c’est le type de base des nombres réels
Double : ce type permet de représenter des valeurs ayant une
partie décimale avec une grande précision que le type float
Long double : ce type est récent il permet de représenter des
nombres avec une partie décimale qui nécessite une très grande
précision si la machine le permet
1-3- Les types vides : void
C’est le type vide, il est surtout utilisé pour préciser les fonctions
sans arguments ou sans retour 🔙 . il joue également un rôle
particulier dans l’utilisation des pointeurs
1-4- Taille de type de base
Taille
Type
(Octet)
Char 1
Short 2
Int 4
Long 4
Float 4
Double 8
Double
8
float
2- Constante associée aux types de bases
Les constantes sont reconnues par le compilateur Grace a
l’utilisation des caractères qui ne participent pas à la construction
d’un identificateur
2-1- Constante de type entier
Les constantes de types enteirs sont construites a partir de
chiffres, elles sont naturellement exprimées en base 10 mais
peuvent être exprimé en base 8 ou 16. Une constante est en priori
de type int si le nombre qu’elle représente est plus petit que le plus
grand nombre entier représentable. Si la valeur de la constant est
supérieur au plus grand entier représentable la constate devient de
type long. Les constantes peuvent être sur fixé pas un ‘’l’’ ou un
« L » pour préciser que leur type associer est un long (long int)
voici quelles exemples de constantes de types entiers :
Constante sans précision de type : 0377 Octal : avec le 0
devant la machine comprend rapidemenet que c’est
en octales , 0X0FF hexadécimal : avec le 0X devant
la machine comprend rapidemenet que c’est en
octales, 10 decimal, -20 decimal
Constante long entière : 120L, 120l, 0X1FAL, 0X1FAl
Constante entièrement non signé : 120U, 120u
Constante long entièrement non signé : 120UL, 120ul,
120uL, 120Ul
2-2- Constante avec partie decimale
En voici quelques :
121.34 est une constant exprimée en utilisant le point décimal son
type est implicite est double. 12134e-2 constante exprimée en notation
exponentielle. 121.32f constante de valeur identique mais de type
float. 121.34l constante de valeur identique mais de type long double
2-3- Constante caractère
Les constantes de types caractères simples sont toujours entourées
« ‘ ‘ ». En général lorsque le caractère est disponible au clavier, le
caractère correspondant est donné directement par exemple ‘a’. Certains
caractères du clavier ne sont pas disponibles directement et il convient
d’utiliser les notations suivantes ‘\\ ‘ : barre de fraction inversée. ‘\’’ :
apostrophe. ‘\t’: tabuler horizontalement. ‘\b’ : effacer d’un pas
Un certain nombre d’abréviations est également disponible :
‘\a’ : alerte ou sonneries ⏰
‘\f’ : saut de pages
‘\n’ : retour a la ligne
‘\0’ : definir la fin de caractère ou les espaces vides de tableau 🖼
‘\r’ : retour chariot 🛒 : fait du responsive
‘\v’ : tabulation verticale
3- Variable de base : déclaration et
initialisation
En C une variable de type entier note i, on le déclare par : int i; et
s’initialise a la valeur 3 par : i = 3 ;. De même une variable de type
caractère se déclare par : char c ; et s’initialise par c = ‘d’ où c = 100 ;.
Possibilité de déclarer et initialisé en une seule instruction : int i = 5 ;
3-1- Classe mémoire
Elle sert a explicité la visibilité d’une variable et son implantation en
machine 🎰. Les classes mémoires sont :
Global : cette classe est celle des variables définis en dehors
de tous sous-programmes
Local : ou auto : cette classe comprends l’ensemble des
variables déclaré dans les blocs de fonctions
Static : ce prédicat modifie la visibilité de la variable et son
implantation
Extern : ce prédicat permet de spécifier que la ligne
correspondante n’est pas une tentative de définition mais une
déclaration
Register : ce prédicat permet d’informer le compilateur que
les variables locales définis dans le reste de la ligne sont
utilisées souvent. Il le demande de les mettre si possibles dans
des registres disponibles du processeurs de manière a
optimiser le temps d’exécution.
3-2- Qualificatif des variables
Qualificatif : unsigned et signed qui s’applique aux variables de
types entiers. Il existe 2 autres qualificatifs qui ont été spécifiés par la
norme. Il s’agit de const et volatile une définition de variable qualifié
du mot const informe le compilateur que la variable est considérée
comme const et ne doit pas être utilisé dans la partie gauche d’une
affectation. Ce type de définition autorise le compilateur a placé la
variable dans une zone mémoire accessible en lecture seulement a
l’exécution exemple : const double pi = .14 ;
Le qualificatif volatile informe le compilateur que la variable
correspondante est placée dans une zone de mémoire qui peut être
modifier par d’autre partie du système que le programme lui-même
4- Les types dérivés
Un type dérivé est crée a partir de type standard pour l’usage propre a
un programme. Ils sont principalement :
Les pointeurs :
Les chaines de caractère
Les tableaux
Les structures, les unions et les énumérations
4-1 Pointeurs
Le pointeur est une variable destinée à contenir une adresse
mémoire. Un pointeur est associé à un type d’objets et un reconnu par
l’emploie d’un * lors de sa définition. Ce type est utilise en particulier
lors des calculs d’adresse qui permet de manipuler des tableaux à
partir de pointeurs. Prénoms la définition suivante :
Int *ptint; ou char* ptchat ;
Dans cette exemple, ptint est une variable de type pointeur sur un
entier. Cette variable peut donc contenir des valeurs qui sont des
adresses de variables de types entiers. De même ptchar est une
variable de type pointeurs sur un 1 caractère. Elle peut donc contenir
des valeurs qui sont des adresses de variables de types caractères.
Le compilateur C vérifie le type des adresses mises dans un
pointeur. Le type de pointeur condition les opérations arithmétiques sur
ce pointeur. Les opérations les plus simples sur un pointeur sont les
suivantes :
- Affectation d’une adresse au pointeur
- Utilisation du pointeur pour accéder a l’objet dont il contient
d’adresse
Considérons les variables suivantes :
- int in ; char car ;
- int* ptint ; char *ptchar ;
un pointeur peut être affecter a l’adresse d’une variable ayant un type qui
correspond a celui du pointeur :
ptint =&in ; ptchar = &car ;
une fois un pointeur affecter avec l’adresse d’une variable, il peut être
utiliser pour accéder aux cases mémoires correspondant a la variable :
*ptint = 12 ; *ptchar = ‘a’ ;
La 1er instructions met la valeur entiere 12 dans l’entier in et la deuxieme
instruction met la valeur caractere ‘a’ dans la variable entier car.
4-2 chaine de caractere
les constantes du type chaine de caractere doivet etre mis entre
guillement, (doubles cotes : ‘’ ‘’ ). Le compilateur genere une suite
d’octect terminer par un caractere null (‘\0’) a aprtir des caracteres
contenues dans la chaine. Une chaine de caractere est en faite un tableau
de char. La chaine est referentier par l’adresse du tableau ( C-A-D :
l’adresse du premier element du tableau ) par exemple la chaine de
caractere ‘’message’’ est generer par le compilateur selon le schema du
tableau si-dessous
M E S S A G E \0
La déclaration d’une variable ch. désignant une chaine de 10
caractères s’écrit : char ch. [10] ; nous pouvons écrire 9 caractères
sachant que le 10 -ème emplacement est réserver pour le caractère de
terminaison de chaine ‘\0’. Il est impossible d’utiliser des operateurs sur
des chaines de caractères. Notamment il est interdit de concaténer les
chaines de caractères en utilisant l’opérateur « + ». De même il n’est pas
possible de copier une chaine de copier dans une seconde en utilisant le
signe égale. Pour obtenir ce résultat, il faut travailler non pas au niveau de
la chaine de caractère, mais au niveau des caractère qui la composent
( en programmant des boucles comme nous le verrons par la suite).
Néanmoins la norme du langage C a prévu un certain nombre d’outils
permettant de manipuler avec aisance les chaines de caractères. Ils font
partir de la bibliothèque standard du C.
Il est néanmoins possible d’initialiser une chaine de caractères
Const char b[10] = ‘’ bonjour’’ ;. Dans cette exemple, nous avons reserver
un espace mémoire de 50 caracteres. Les 7 premiers espaces sont utiliser
pour les 7 caracteres du mot, le 8 eme espace est utilise pour le caractere
de terminaison de chaine. Les 42 espaces restants sont non utilisees. D’
autre exemple d’initialisation sont presenter dans le tableau ci-dessous.
Char t1[10] = Tableau de 10 caractères initialiser avec ‘c’, ‘o’, ‘u’, ‘c’, ‘o’, ‘u’,’\
’’coucou’’ ; 0’. Les 3 derniers caractères sont eux aussi initialiser avec le
caractère de terminaison
Tableau de caractères initialiser avec ‘’ bonjour’’. La taille du
Char t2[8] = tableau est calculer selon le nombre de caractère + 1.
‘’bonjour’’ ;
Char t3[10] = Tableau de 10 caractères donc les 3 premiers éléments sont
{‘a’,’b,’c’} ; initialiser avec les lettres { ‘a’,’b,’c’}
NB : faites une requête des recherches pour le tableau ASCII 👤
Caractère imprimable ASCII (code de caractère 32 – 127)
Les codes 32 -127 sont communs à toutes les différentes variantes
de tables ASCII ils sont appelles caractères imprimables représente
des lettres des chiffres des signes de ponctuations et quelques
symboles divers. Le caractère 127 représente la commande DEL.
81 121 51 Q
82 122 52 R
83 123 53 S
84 124 54 T
85 125 55 U
86 126 56 V
87 127 57 W
221 335 DD Ý
222 336 DE
223 337 DF
224 340 E0 à
225 341 E1 á
226 342 E2 â