Programmation en C
Données et … …
. …
…programmes
.
.
2M - 1
La mémoire centrale « RAM » permet de stocker les informations à traiter. Elle est
composée d’un ensemble de bits (1 bit = 0 ou 1) dit case mémoire.
Chaque case est identifiée par un numéro dit « adresse »
3. Unités périphériques
1. d’entrée & sortie qui permettent à l’utilisateur de communiquer avec l’ordinateur
(saisie, affichage, …)
2. mémoires auxiliaires qui permettent de stocker les informations en permanence
(disque dur, CD, …)
Codage binaire
• Les informations traitées par une machine sont traduites en informations
binaires (suite de bits de 0 et 1). On parle du ‘codage binaire’.
• Pour une base de numérotation b, un nombre n peut s’écrire sous la
forme: n = Σaibi / 0≤ai<b i0,m
• Code binaire pur: représente les entiers positifs en base 2. Avec n bits, on
peut coder de 0 à 2n -1;
– exemple: n = 23, b=2 sur 8 bits n = (00010111)2
23 = 2(10+1)+1 = 2( 2 x ( 2 x 2 + 1) + 1) + 1 = 2( 2 x (22+20) + 20 ) + 20 =
2(23 + 21 + 20) + 20 = 1x24 + 0x23 + 1x 22 + 1x21 + 1x20 = (10111)2
• Code complément à 2: représente les entiers négatifs; dans ce cas, on
rajoute la valeur 1 au complément à 1 du nombre à coder;
– exemple : n = -15, b=2 sur 8 bits n = (11110001)2
15 = 2x7 + 1= 2 x (22 + 21 + 20) + 20 = 1x23 + 1x22 + 1x21 + 1x20 =
(00001111)2
(11110000)2 complément à 1
(00000001)2 on rajoute la valeur 1
(11110001)2
donc (-15) = (11110001)2
Partie I
« Algorithmique »
Introduction
• Que signifie le terme « Algorithme»? Problème
– ensemble d’étapes qui permettent de résoudre un
problème donné;
– une suite de règles à appliquer dans un ordre analyse
déterminé afin d’arriver au résultat attendu;
– un algorithme est indépendant des données, de la
machine et du langage de programmation I . algorithme
– Exemple: problème posé = calcul de la moyenne
de 2 entiers
• Analyse: les données fournies = 2 entiers traduction
• Résultat désiré = un nombre qui représente la
moyenne des données
II. programmation
il faut ensuite décrire les étapes qui permettent de
passer des données au résultat (algorithme)
– Saisir deux entiers
– Calculer leur somme Résultat
– Diviser la somme par 2
Méthodologie générale
◊ Comprendre la nature du problème posé et préciser les
données (entrées)
◊ Préciser le(s) résultat(s) désiré(s) (sorties)
◊ Les entrées et les sorties sont des ‘variables’
◊ Déterminer le processus de transformation des données
en résultats
◊ Représentation d’un algorithme Nom_algorithme
1. Organigramme
Représentation graphique de l’enchaînement de la
suite d’instructions relatives à un algorithme donné Entrées
2. Pseudo-code
Représentation textuelle de la solution proposée tests
Squelette d’un algorithme:
– Déclaration de variables (entrées)
– Début résultat1 résultat2
– Bloc d’instructions
– Fin Schéma d’un organigramme
Notion de variables
a. Définition = information à stocker et à utiliser au cours d’un
programme désignée par son nom (identificateur attribué
par un utilisateur) et une étiquette (référence attribuée par
l’ordinateur)
b. Déclaration
Attribuer un nom à une variable au sein d’un programme en précisant
son type
Syntaxe = Variables nom_var en Type
c. Initialisation
Affecter une valeur aux variables à l’aide de l’opérateur
Syntaxe = nom_var valeur
d. Types de variables
• Type numérique (entier, réel, …)
• Type alphanumérique (caractères et chaînes de caractères)
• Type booléen (vrai ou faux)
Familles d’instructions 1/
-- Ensemble d’opérations à manipuler sur les différentes variables
a. Affectation
Attribuer une valeur pour initialisation ou modification par l’opérateur
b. Lecture & écriture
Lire = saisir, introduire des données
Syntaxe : Lire nom_var
Ecrire = exécuter l’affichage à l’écran
Syntaxe : Ecrire « texte explicatif », nom_var
c. Structure de choix
Dans le cas où il existe plusieurs choix correspondants à un certain résultat, on utilise une
structure de choix indiquant quel ensemble doit être exécuté
i. forme simple: si (condition est vraie) alors (exécuter bloc d’instructions 1)
sinon (exécuter bloc d’instructions 2)
finsi
ii. forme complexe: selon que (condition 1) faire (bloc d’instructions 1)
ou que (exécuter bloc d’instructions 2)
…
ou que (exécuter bloc d’instructions n)
autrement (exécuter bloc d’instructions n+1)
fselon (fin du selon)
Suite 2/
d. Structures de répétition
i. Boucle « pour » : utiliser lorsque le nombre d’opérations ou de répétitions à effectuer est connu d’avance;
Syntaxe : pour nom_var val_initiale à val_finale faire (bloc instructions)
nom_var Suivant
Exemple : calculer la moyenne d’une classe
Données = n nombre d’étudiants, nt note de chaque étudiant
Résultat = moyenne de la classe = somme divisée par n
Algo = lire n
S0
Pour i 1 à n
Lire nt
S S + nt
i Suivant
Ecrire « la moyenne des notes est :», S/n
ii. Boucle « tantque … »: aucune condition sur le nombre d’itérations. Le bloc est exécuté tant que la
condition est vraie. Sinon on s’arrête.
Syntaxe : tantque (condition) faire (bloc instructions)
fintantque
iii. Boucle « répéter …jusqu’à »: ici on répète l’exécution du bloc jusqu’à ce que la valeur de la condition
soit vraie. On s’arrête dans ce cas.
Syntaxe : répéter (bloc instructions) jusqu’à (condition)
8. Écrire un programme qui lit trois chaînes de caractères puis les retourne triées dans
l’ordre alphabétique inverse
9. Écrire un algorithme qui donne le signe (+/-) du produit de 2 nombres sans le calculer
10. Écrire un programme qui décrémente la valeur d’un produit sachant qu’il n’a pas atteint
sa valeur minimale
11. Écrire un programme qui n’affiche que les valeurs paires d’un dé
12. Écrire un programme qui demande à l’utilisateur de saisir une chaîne de caractères
jusqu’à la lecture du mot « bye ». Dans ce cas, on s’arrête
15. Écrire un algorithme qui d’après une valeur initiale affiche les cents chiffres suivants
d’un pas de 2. par exemple, si la valeur est 25 alors les chiffres suivantes seront 27, 29,
… jusqu’à 225
17. Écrire un algorithme qui affiche la valeur maximale et minimale d’une série de 30
chiffres saisis par l’utilisateur
18. Même algorithme que 17 sauf que le nombre de chiffres à saisir n’est pas connu. On
s’arrête lorsqu’une valeur nulle est saisie
Tableaux
Un autre type de variable que nous traitons dans cette partie concerne les
variables indicées. IL s’agit de regrouper un ensemble de valeurs portant le
même nom de variable et différenciées par un numéro dit ‘indice’. A chaque fois
que l’on veut insérer, chercher, modifier un élément du tableau, on le fait par le
nom du tableau suivi de l’indice entre (). L’indice débute par défaut à 0;
20. Écrire un algorithme qui affiche les éléments d’une suite de Fibonacci de taille 15. une
suite de Fibonacci est donnée par F0 = 0; F1 = F2 = 1; Fn = Fn-1 + Fn-2
Exemple :
variables i, N en Entier
Tableau Tab() en Numérique ‘taille non connue’
Début
Écrire « donner la taille du tableau »
lire N
Redim Tab(N-1)
pour i 0 à N-1
Tab(i) 0
i Suivant
Fin
Exercices 2/
22. Écrire un algorithme qui mesure l’amplitude de la marée (différence entre la
pleine et la basse mer), l’insère dans un tableau. Ensuite, affiche la
fréquence des valeurs supérieures et inférieures à la marée moyenne
durant une certaine période
23. Écrire un algorithme qui somme 2 tableaux de même dimension. Est qu’on
peut le faire pour des tableaux de dimensions différentes)
4 5
I. Tri
II. Recherche
1. Recherche séquentielle
Elle consiste à parcourir le tableau dès sa première valeur et tester
élément par élément jusqu’à atteindre celui en question
2. Recherche dichotomique
L’élément à trouver est comparé au milieu du tableau.
S’il est supérieur, la recherche est effectuée sur la partie droite du tableau,
sinon la partie gauche est à traiter. La tableau est supposé trié dans l’ordre
croissant
Exercices
30. Même question que (29) sauf que dans ce cas le tableau est trié dans
l’ordre décroissant
Partie II
« Programmation en C »
Introduction
A. Historique:
– 1972 : Dennis M. Ritchie a fondé ses premières origines
– 1978: publication du standard K&R-C (Brian w.Kerrighan)
– 1982: publication du standard ANSI-C
B. Caractéristiques du langage C:
– universel : il est utilisable pour tous types d’application et non spécifique pour un
domaine précis (Fortran applications scientifiques)
– haut niveau: le langage C est structuré, déclaratif et récursif
– proche de la machine : offre des opérateurs et fonctions proches du langage machine
– portable : un programme en C peut être utilisé sur tout système possédant un
compilateur C
– compilé :
• saisir un texte « programme source » à l'aide d'un programme appelé EDITEUR,
• le traduire en langage machine (en codes binaires) : c'est la compilation et, si
plusieurs modules ont été compilés séparément, l'édition de liens (LINK ou
BIND),
• l'exécuter.
C. Phases de programmation en C:
Compilation
Programme .objet
(.ob)
math.h
Programme exécutable
(.exe)
Notions de base
• Premier programme en C:
« include » fonctions standards
#include<stdio.h> directives
#include<math.h>
« define » définit une constante
#define Pi 3.14
int main(void) { « main » fonction principale
• Déclaration de fonctions :
– Syntaxe: <type résultat><nom fonction>(<type arg1>, <type arg2>, …, <type
argn>) {
<déclarations locales>; // données utilisées uniquement à l’intérieur de la fonction
<bloc d’instructions>; // liste des instructions qui définissent l’action à exécuter
}
– Fonction « main »:
• Fonction principale pour l’exécution du programme
• Un seul appel main par programme
• Le type du résultat du main est un « int ». Il peut ne pas être déclaré.
• L’instruction « return 0 » signifie que le programme s’est terminé avec succès
• Commentaires en C :
– /* ceci est un commentaire sur plusieurs lignes */
– // ceci est un commentaire sur une seule ligne
Types de base
• Un type définit les valeurs que peut prendre une variable, la taille
mémoire à allouer et les opérateurs que l’on peut appliquer dessus;
1. Les types entiers:
– 4 variables du type « entier » existent en C : les caractères (char), les
entiers courts (short int), les entiers standards (int) et les entiers larges
(long int);
– Un caractère s’identifie à son code ASCII. Ainsi, une variable de type
«char» peut subir les mêmes opérations que les autres entiers;
– Si on ajoute le préfixe « unsigned » à l’une de ces variantes, ceci signifie
que nous sommes entrain de manipuler des entiers non signés (positifs)
Type Valeur Valeur Nombre
minimale maximale d’octets
char -128 127 1
e) L’opérateur (const)
pour fixer une valeur d’une variable, on utilise l’attribut « const »
• const int a = 10; // la valeur de a ne change pas au cours du programme
Caractères de signification
contrôle
‘\a’ bip sonore
‘\\’ antislash
‘\’’ apostrophe
‘\’’’ guillemets
2. if(n>0) {
if(a>b)
m = a;
}
else
m = b;
5. Exemples :
a. saisie et affichage d’un tableau de réels
#include<stdio.h>
main() {
// déclaration
int i, N;
printf(‘’veuillez saisir une dimension\n’’);
scanf(‘’%d’’, &N);
flaot T[N];
// saisie
for(i=0; i<N; i++) {
printf(‘’l’élément %d\n’’, i);
scanf(‘’%f’’, &T[i]);
}
// affichage
for(i=0; i<N; i++)
printf(‘’%f\n’’,T[i]);
return 0;
}
Tri d’un tableau
1. Tri par sélection
– Il s’agit de parcourir le tableau en cherchant l’élément le plus petit (le plus
grand), le mettre dans la 1ère (dernière) position. Ensuite, procéder à la
recherche du second plus petit(grand) et le mettre en seconde (avant-
dernière) position et ainsi de suite jusqu’à ce que le tableau soit trié.
2. Tri par propagation (bubble sort)
– Il s’agit à comparer les éléments du tableau deux à deux successivement.
S’ils sont dans le bon ordre, on passe aux suivants; sinon, on les permute
et on reprend la comparaison dès le début.
3. Exercices :
– Écrire un programme de tri par sélection et par propagation;
Recherche dans un tableau
1. Recherche séquentielle
– Il s’agit de comparer successivement les valeurs du tableau avec la valeur
donnée
2. Recherche dichotomique
– Décomposer le tableau en 2.
– Comparer la valeur recherchée à celle du milieu; si elle est supérieure, la
recherche est effectuée sur la partie droite du tableau,
– sinon la partie gauche est à traiter.
– La tableau est supposé trié dans l’ordre croissant.
3. Exercices :
– Écrire un programme de recherche séquentielle et dichotomique dans le
cas croissant et décroissant
Tableau à plusieurs dimensions
1. Déclaration :
Syntaxe: <type><nom tableau>[dim1] [dim2]…[dimn]
2. Cas de deux dimensions (matrices)
Syntaxe: <type><nom matrice>[lignes] [colonnes]
• La taille « lignes » représente le nombre maximale de lignes composantes la matrice;
(sens horizontal)
• La taille « colonnes » représente le nombre maximale de colonnes composantes la
matrice; (sens vertical)
• float classe [30][5];
3. Mémorisation :
• Le nom d’une matrice est le représentant de l’adresse du 1er élément(l’adresse de la
1ère ligne);
• Les composantes d’une matrice sont stockées ligne par ligne en mémoire;
• Les adresses des autres composantes sont calculées comme suit :
M + (i* lignes* taille_de_la_composante) + (j* taille_de_la_composante)
• Pour une matrice formée de L lignes et C colonnes de taille M octets, l’espace total à
allouer est (L*C*M) octets.
4. Accès :
• Pour accéder à l’élément (i,j) d’une matrice, on utilise ses indices selon la syntaxe
suivante:
Syntaxe : nom_matrice[i] [j]
5. Exemples :
a. saisie et affichage d’une matrice de réels
#include<stdio.h>
main() {
// déclaration
int i, j, L, C;
printf(‘’veuillez saisir un nombre de lignes\n’’);
scanf(‘’%d’’, &L);
printf(‘’veuillez saisir un nombre de colonnes’’);
scanf(‘’%d’’, &C);
flaot M[L][C];
// saisie
for(i=0; i<L; i++)
for (j=0; j;C; j++) {
printf(‘’l’élément [%d,%d]\n’’, i,j);
scanf(‘’%f’’, &M[i][j]);
}
// affichage
for(i=0; i<L; i++)
for (j=0; j;C; j++)
printf (‘’%f\t’’, M[i][j]);
return 0;
Pointeurs
Fonctions
Chaînes de
caractères
Structures