Algo 1&2 Complet
Algo 1&2 Complet
Algo 1&2 Complet
LDA
……
……
……
Programme C, C+
Langage Machine Compilateur
+
Exemple 1. Recherche d’un mot dans un dictionnaire
a. Début algorithme.
b. Retenir (saisir, lire) le mot à rechercher.
c. Ouvrir le dictionnaire à la page du milieu.
d. Tant que le mot ne se trouve pas sur la page courante et
la page courante n'est pas la dernière exécuter l'étape e)
et f) sinon passer à l'étape g).
e. Si le mot se trouve dans la partie droite ouvre la page du
milieu de cette partie
f. Sinon ouvre la page du milieu de la partie gauche
g. Si le mot s'y trouve lire la définition sinon ce mot ne se
trouve pas dans le dictionnaire.
h. Fin de l'algorithme.
• Conclusion
début algorithme
action 1 // commentaire 1
action 2 // commentaire 2
Le corps de l’algorithme .
.
.
action n // commentaire n
fin algorithme
* Structure d’un
Nom de l’algorithmeAlgorithme
:
o Il permet tout simplement d’identifier un algorithme
parmi d’autres.
Les déclarations :
o C’est une liste exhaustive de variables utilisées et
manipulées dans le corps de l’algorithme.
Le corps de l’algorithme :
o Dans cette partie de l’algorithme, sont placées les
tâches à exécuter (instructions, opérations, …).
Les commentaires :
o Pour permettre une lecture plus aisée et plus
compréhensive de l’algorithme
* Les
Déclarations
Les Constantes :
o Elles représentent des chiffres, des nombres, des caractères, des
chaînes de caractères, … dont la valeur ne peut pas être modifiée au
cours de l’exécution de l’algorithme.
Les Variables :
o Elles peuvent stocker des chiffres des nombres, des caractères, des
chaînes de caractères,… dont la valeur peut être modifiée au cours de
l’exécution de l’algorithme.
Les Tableaux :
o Elles permettent de rassembler plusieurs valeurs ou constantes de
même type sous un même identificateur.
Les Structures :
o Elles permettent de rassembler plusieurs valeurs ou constantes de
types différents sous un même identificateur, on parle également
d’entités ou d’objets.
* Les Déclarations des variables et des
constantes
Pour pouvoir accéder aux données, le programme (quel que soit le
langage dans lequel il est écrit) fait usage d’un grand nombre de
variables de différents types.
main(void)
{
……
}
C’est une fonction sans argument en général d’où le mot void (rien) entre
les parenthèses.
* Langage de programmation C
* Structure générale d’un programme C
Les Inclusion de source #include<nonfichier.h>
#include <nomfichier.h>
#include <stdio.h>
main(void)
{
printf("bonjour tout le monde\n");
}
* Langage de programmation C
* Structure générale d’un programme C
Les variables et les constantes :
Les constantes et les variables sont définies dans la partie déclarative
par deux caractéristiques essentielles, à savoir :
L’ identificateur :
o Il représente le nom de la variable, de la constante ou de la
structure. Il est composé généralement de lettres mais peut
également contenir et de chiffres.
Il ne doit pas commencer par des chiffres
Il ne doit pas contenir d’espaces, de caractères de
ponctuation ou de caractères accentués.
Le type :
o Il représente la nature de la variable ou de la constante (entier,
réel, booléen, chaîne de caractères…)
* Langage de programmation C
* Structure générale d’un programme C
Les variables :
Une valeur : Une fois la variable définie, une valeur lui est assignée, ou
affectée.
Toute données, quelle que soit sa nature, devra être codée sous forme
binaire
Le type de donnée permet de donner un sens à une données qui est
stockée dans un emplacement mémoire d’adresse N.
Sont désigné par « int ». Ils peuvent être affectés de deux types
d’attributs : un attribut de précision et un attribut de représentation.
unsigned long int Entier long non signé 4 0 à 4 294 967 295
Différents types des constantes peuvent être définis en ajoutant des suffixes.
forme de la constante liste de types
pas de suffixe, décimal int, unsigned int, long int, unsigned long int
pas de suffixe, octal ou hexadécimal int, unsigned int, long int, unsigned long int
suffixé par u ou U unsigned int, unsigned long int
suffixé par l ou L long int, unsigned long int
suffixé par (u ou U) et (l ou L) unsigned long int
* Langage de programmation C
* Structure générale d’un programme C
Les constantes flottant
#include <stdio.h>
main()
{
double b=12.345e123;
b=b+2;
printf("b= %e", b);
}
* Langage de programmation C
* Structure générale d’un programme C
Les constantes caractère
#include <stdio.h>
main(void)
{
char b='a';
b=b+5;
printf("b= %c\n", b);
}
* Langage de programmation C
* Structure générale d’un programme C
Les constantes caractère
\n nouvelle ligne
\t tabulation horizontale
\v tabulation verticale
\b retour d'un caractère en arrière
\f saut de page
\a beep
\' apostrophe
\" guillemet
* Langage de programmation C
* Structure générale d’un programme C
Les pointeurs
Un pointeur est une variable qui stock une adresse mémoire. Cette
adresse peut être celle d’une autre variable d’un certain type ou celle d’un
espace mémoire alloué dynamiquement.
Un pointeur typé permet de pointer une adresse d’un espace
mémoire ou on peut stocké des valeurs d’un certain type.
Un pointeur générique permet de pointer une adresse d’un espace
mémoire ou on peut stocké des valeurs de n’importe quel type.
La syntaxe de déclaration d’un pointeur est :
char *p1
type *identificateur ; int *P2
Double *p3
* Langage de programmation C
* Structure générale d’un programme C
Les pointeurs Opérateur « & »
Main{
int i;
int *pi; // pi pointeur vers un int /
pi = &i; / /le pointeur pi repère la variable i /
}
* Langage de programmation C
* Structure générale d’un programme C
Les pointeurs (l’Opérateur d’indirection « * »)
« * » utilisé en opérateur préfixé est un opérateur d’indirection qui, appliqué
à une valeur de type pointeur, délivre la valeur stocké dans l’adresse
pointée.
main()
{
int i=3, j;
int *pi;
pi = &i; // on affecte l’adresse de i au pointeur « pi »/
*pi = 2; //on stocke la valeur 2 dans la zone mémoire dont l’adresse est
// donnée par pi
j = i + 1;/ on ajoute 1 à la valeur de i dont l’adresse est pointée par « pi ».}
L’opérateur * peut être opérateur de multiplication ou opérateur
d’indirection. (*x * *y)
* Langage de programmation C
* Structure générale d’un programme C
Les pointeurs (l’Opérateur d’indirection « * »)
#include <stdio.h>
#include <stdlib.h>
main()
{
int i;
int *pi;
i=5;
pi = &i;
*pi = 2;
printf("i=%d", i);
system("pause");}
* Langage de programmation C
* Structure générale d’un programme C
Les pointeurs
Type *nom_pointeur
Donc lorsqu’on déclare un pointeur on peut identifier trois objets
différents :
&nom_pointeur : contient l’adresse mémoire propre au pointeur
nom_pointeur : contient l’adresse mémoire pointée
*nom_pointeur : contient la valeur contenue dans l’adresse pointée
* Langage de programmation C
* Structure générale d’un programme C
Les doubles pointeurs
Type **nom_pointeur
Un double pointeur est une variable qui stock une adresse mémoire d’un
pointeur. Donc le contenue de l’adresse pointée est une adresse mémoire.
* Langage de programmation C
* Structure générale d’un programme C
Les doubles pointeurs
int i=3, j=9;
int *P, **G;
P=&i;
G=&P;
*G=&j;
**G=i+1;
printf("&i = %d &j = %d\n", &i, &j);
printf("P = %d\n", P);
printf("i = %d j = %d\n", i, j);
&j = 60FF04 j = 49
La valeur d'un pointeur étant un entier, on peut lui appliquer un certain nombre
d'opérateurs arithmétiques classiques
#include <stdio.h>
#include <stdlib.h>
main()
{
int *p1, *p2, a;
p1=&a;
p2=p1+2; // Equivalent à P2 = P1 + 2*sizeof(int)
printf("p1=%x\n", p1);
printf("p2=%x\n", p2);
}
* Langage de programmation C
* Structure générale d’un programme C
Allocation Dynamique de la mémoire
Lorsqu’on déclare un pointeur il est initié par NULL :
Type *P = NULL (Si P==0 Alors Ecrire(« p ne pointe vers aucun objet »)
(Type*)malloc(sizeof(Type))
Cette fonction retourne un pointeur d’un certain type (Type *) pointant vers
un objet de taille sizeof(Type) octets.
#include <stdlib.h>
main()
{
int i = 3;
int *p=NULL;
p = (int*)malloc(sizeof(int));
*p = 6;}
* Langage de programmation C
* Structure générale d’un programme C
Allocation Dynamique de la mémoire: Fonction malloc()
#include <stdlib.h>
main()
{
int i = 3;
int *p=NULL;
p = &i;
*p = 6
}
* Langage de programmation C
* Structure générale d’un programme C
Allocation dynamique d’un espace pour plusieurs objets contigus en
mémoire
#include <stdio.h>
#include <stdlib.h>
=i
main()
{
p+1
int i = 3; =j
int j = 6;
int *p;
p = (int*)malloc(2 * sizeof(int));
*p = i;
*(p + 1) = j;
}
* Langage de programmation C
* Structure générale d’un programme C
Les opérateurs et les expressions
#include <stdio.h>
main()
{ i : variable (Adresse, type , valeur)
int i;
i = i*2+5; i*2+5 : expression (type, valeur)
printf("b= %d", i);
}
* Langage de programmation C
* Structure générale d’un programme C
Les opérateurs Arithmétique, de comparaison & logique
Arithmétique Comparaison
Opérateur C Opérateur C
Addition + Supérieur stricte >
Soustraction - Inférieur stricte <
Multiplication * Supérieur ou égal >=
Division / Inférieur ou égal <=
Modulo (reste de la Egal ==
%
division entière) Différent !=
Logique
Opérateur C
ET Logique &&
OU Logique ||
Négation Logique !
* Langage de programmation C
*Structure générale d’un programme C
Les opérateurs Arithmétique, de comparaison & logique
Priorité croissante de bas vers le haut
Opérateur C
Opérateur de multiplication *
Opérateur de division /
Opérateur d'addition +
Opérateur de soustraction -
Opérateur d'infériorité stricte <
Opérateur de supériorité stricte >
Opérateur d'infériorité ou d'égalité <=
Opérateur de supériorité ou
>=
d'égalité
Opérateur d'égalité ==
Opérateur d'inégalité !=
Opérateur et logique ET &&
* Langage de programmation C
* Structure générale d’un programme C
Les Opérateurs d’incrémentations & de décrémentation
++ incrémentation
-- décrémentation
On dit que ++ est :
- un opérateur de pré incrémentation lorsqu'il est placé à gauche de la variable
- un opérateur de post incrémentation lorsqu'il est placé à droite de la variable
a++; a = a+1;
b = a++; b = a;
a = a+1;
b = ++a; a = a+1;
b = a;
* Langage de programmation C
* Structure générale d’un programme C
Les Opérateurs d’incrémentations & de décrémentation
%d entier décimal
%f réel
%e Réel flottant
%c caractère (1 seul)
%s chaîne de caractères
* Langage de programmation C
* Structure générale d’un programme C
Les fonctions d’entrée et sortie scanf()
"getchar()" fonction sans paramètre qui « capte » la valeur d’un seul caractère
Traitement 2
se caractérise par une suite d’actions
à exécuter dans l’ordre où elles sont énoncées Traitement 3
Traitement 4
Les structures de contrôle
Traitement 1
si la condition est si la condition n’est pas
Si Vrai vérifiée les traitements
vérifiée les traitements Condition
se font dans cet ordre : se font dans cet ordre :
(T1 T2 T3). Si Faux (T1 T3).
Traitement 2
Traitement 3
* Les structures
Alternatives
Forme alternative complète :
Contrôle de plusieurs bloc d’instruction
Dans cette structure, l’exécution de l’un des deux
traitements distincts possibles T2 et T3 ne dépend
que la réalisation de la condition qui les précède :
Traitement 1
Si Vrai Si Faux
IF ( <condition> )
{
[<bloc d'actions-1>]
}
[<bloc d'actions-2>]
IF ( <condition> )
{
[<bloc d'actions 1>]
}
ELSE
{
[<bloc d'actions 2>]
}
if (a > b)
if (a > b) {
if (c < d) if (c < d)
u = v; u = v;
else }
i = j; else
i = j;
* Les structures
Alternatives
* Les structures
Alternatives Vrai
Si Cond 1
TA Faux TAT1TB
T1
Vrai
Si Cond 2
Faux TAT2TB
T2
Vrai
Si Cond n
Faux TATnTB
Tn
Aucune Cond
TATn+1TB
T n+1
TB
* Les structures
Alternatives
if <condition1>
{Traitement 1;}
else { if <condition1>
if <condition2> {Traitement 1;}
{Traitement 2;} else if <condition2>
else { {Traitement 2;}
if <condition3> else if <condition3>
{Traitement 3;} {Traitement 3;}
else { else if <condition4>
if <condition4> {Traitement 4;}
{Traitement 4;} else
else { {Traitement 5;}
Traitement 5;
}
}
}
}
* Les structures
Alternatives
Structure de choix multiple (selon que)
Au lieu de faire des « Si » imbriqués ou des Sinon Si, il suffit d’indiquer
quoi faire quand telle ou telle valeur d’une expression est rencontrée. En
algorithmique
switch(variable)
Le mot clé « break » indique la
{
sortie de la structure
case valeur 1 : liste intruction; break;
conditionnelle.
case valeur 2 : liste intruction; break;
case valeur 3 : liste intruction; break;
Le mot clé « default » précède
case valeur 4 : liste intruction; break;
la liste d'instructions qui sera
.
exécutée si l'expression n'est
.
jamais égale à aucunes valeurs
.
des « case ».
case valeur n : liste intruction;break;
default: liste intruction;
}
* Les structures
Alternatives
Forme alternative : (Cas des conditions non disjointes)
contrôle deux traitements (T et T’)
dans ce cas on va combiner les conditions Ci avec les
opérateurs logiques (AND, OR, XOR).
Exemple :
Vrai
Si Cn
Si (a=0) AND (b=0) AND (c=0) alors «la solution est IR »
Nombre Nombre
connu de inconnu de
répétitions répétitions
Structures de contrôle itératives
Cas ou le nombre de répétition est connu :
• sa valeur initiale,
• sa valeur finale,
• son pas de variation.
Structures de contrôle itératives
Cas ou le nombre de répétition est connu :
Attention :
le traitement ne doit pas modifier la variable itérative (compteur)
Structures de contrôle itératives
Exemples Pour….allant….suivant
Cet algorithme fait la somme d’un certain nbre de valeurs saisies)
Pseudo - code Language C
Var i, S, var : entiers int i, S, var;
S0 S = 0;
Pour i allant de 0 à 3 for (i=0; i<=3; i++)
Afficher ("var =" ) {
Lire (var) printf("var =");
S S + var scanf("%d« , &var);
Suivant i S = S + var;
Afficher("La somme est :", S) }
Afficher(i) printf("la somme est :%d", S);
Structures de contrôle itératives
Exemples Pour….allant….suivant
Int S, i; j;
j=1 j=2 j=3
S 0; i=1 S=0+1+1=2 S=2+1+2=5
i=2 S=5+2+1=8 S=8+2+2=12
for(i=1; i<=3; i++)
i=3 S=12+3+1=16 S=16+3+2=21
{
for(j=1; j<=2; j++) i=4 Arrêt des itérations
{S = S + i + j}
}
EN MEMOIRE
printf (“la somme est %d”, S)
i=4 S = 21
j=3
Structures de contrôle itératives
Cas ou le nombre de répétition est inconnu :
While
Language C
int S, var;
i = 1;
S = 0;
printf("saisir la valeur", i);
scanf("%d",&var);
while (var!=-1)
{
S = S + var;
i = i + 1;
printf("saisir la valeur %d", i);
scanf("%d",&var);
}
printf("la somme est :%d",S);
printf("le nbre de valeur est :%d",i-1);
Structures de contrôle itératives
Tant que …. faire
Language C
int S, i, var;
i = 1;
S = 0;
do
{
printf("Saisir la valeur" , i);
scanf("%d",&var);
S = S + var;
i = i + 1;
}
while (S<1000);
printf("la somme est :%d",S);
printf("le nbre de valeur est :%d", i);
Comparaison boucles répéter et tant que
• boucle While
condition vérifiée avant chaque exécution du traitement
le traitement peut donc ne pas être exécuté
la condition porte surtout sur la saisie de nouvelles
variables (relance)
• boucle Do While
condition vérifiée après chaque exécution du traitement
le traitement est exécuté au moins une fois
la condition porte surtout sur le résultat du traitement
Boucle Pour
L’algorithme du Max et du Min
Trouver la max et le nombre de max d’un certain nombre connu de valeur
Exemple de problème :
Saisir une suite de nombres, puis afficher cette suite après
avoir divisé tous les nombres par la valeur maximale de la
suite.
var 132
les "cases" sont numérotées à partir de zéro, autrement dit que le plus
petit indice est zéro.
Indice ligne
Indice colonne
0 1 2 3 4
1 3 4 -56 -8
2 3 4 6 7 valeurs
3 2 12 32 43
4 2 6 7 9
Tab1(3)=-56 Tab2(3)(2)=12
Les tableaux Accès aux données
0 1 2 ….. 499
12 1 2 …… 5
0 0 0 0 1 1 0 0
P
0 0 0 0 0 0 0 1
P+1
P+2 0 0 0 0 0 0 1 0
……. ... … … … … … … …
P+499 0 0 0 0 0 1 0 1
main()
main() {
main() { int *T, i=0, n, k;
{ int *T, i, n;
int T[10], i; T=(int*)malloc(sizeof(int));
printf("n= "); printf("T[%d]= ", i);
for(i=0; i<10; i++) scanf("%d", &n);
{ scanf("%d", T+i);
T=(int*)malloc(n*sizeof(int)); while(T[i]!=0)
printf("T[%d]= ", i); for(i=0; i<=n-1; i++) {
scanf("%d", &T[i]); {
} i++;
printf("T[%d]= ", i); T=(int*)realloc(T,
} scanf("%d", T+i); (i+1)*sizeof(int));
} printf("T[%d]= ", i);
} scanf("%d", T+i);
}
}
malloc() & realloc()
La syntaxe de la fonction malloc() est :
(Type*)malloc(Nbre_case*sizeof(Type))
Cette fonction retourne un pointeur d’un certain type (Type*) pointant vers un
objet de taille (Nbre_case)*sizeof(Type) octets.
(Type*)realloc(pointeur, Nbre_case*sizeof(Type))
Cette fonction permet de :
- faire une extension de la zone mémoire allouée par malloc et pointé par
« pointeur », Si l'espace mémoire libre qui suit le bloc initial est suffisant
- Allouer un nouveau bloc de mémoire (bloc d’origine plus l’extension), le
contenu de la zone d'origine recopié dans la nouvelle zone et le bloc
mémoire d'origine sera libéré automatiquement. Si l'espace mémoire libre
qui suit le bloc initial est insuffisant
malloc() & realloc()
*P
*(P+1)
*(P+2)
(type*)Malloc(6*sizeof(type)
*(P+3)
*(P+4)
*(P+5)
P *P P *P
*(P+1) *(P+1)
*(P+2) (type*)Realloc(P, 8*sizeof(type) *(P+2)
*(P+3) *(P+3)
*(P+4) *(P+4)
*(P+5) *(P+5)
*(P+6)
*(P+7)
Les Tableaux
Insertion d’un élément :
Ecrire un programme qui saisit la dimension N d’un tableau de int
remplit le tableau par des valeurs entrées au clavier. Insérer ensuite
une valeur « e » à une position « pos » du même tableau. Afficher
enfin le tableau avec la valeur insérée.
Insérer un élément dans la case 2
0 1 2 3 4 5
12 4 11 78 15
Les Tableaux
suppression d’un élément :
Ecrire un programme qui saisit la dimension N d’un tableau de int
remplit le tableau par des valeurs entrées au clavier. Supprimer
ensuite la valeur d’une position « pos » du même tableau. Afficher
enfin le tableau de N-1 éléments.
Suppression de l’élément de la case 2
0 1 2 3 4
12 4 11 78 15
Suppression d’une valeur dans un tableau
0 1 2 3 4 5 6 7
2 12
14 14
12
45 12 45 12 12 12
j=0;
for(i=0; i<n; i++)
{
T[j]=T[i];
if(T[i]!=x)
j++;
}
Suppression de doublons
2 12 2 12 24 2 24
2 12 12 24 24 2 24
2 12 24 24 24
2 12 24 24
for(k=0; k<n; k++)
{
j=k+1;
for(i=k+1;i<n; i++)
{
T[j]=T[i];
if(T[i]!=T[k])
j++;
}
for(i=j; i<n; i++)
n=j;
}
Suppression de doublant
T 2 12 2 12 24 2 24
G 2 12 24
G=(int*)malloc(sizeof(int));
k=0;
for(i=0; i<n; i++)
{
for(j=0; j<i && T[i]!=T[j]; j++)
{}
if(i==j)
{G=(int*)realloc(G, (k+1)*sizeof(int));
G[k]=T[k];
k++;}
}
Les Tableaux
Union de tableau:
Ecrire un programme qui saisit deux tableaux de dimension # et de
créer un troisième dont les éléments représentent l’union sans
doublons des deux tableaux.
i= 0 1 2 3 i= 0 1 2
T1[i]= 12 4 13 12 T2[i]= 45 4 32
k= 0 1 2 3 4
T[k]= 12 4 13 45 32
Les Tableaux
Intersection de tableaux:
Ecrire un programme qui saisit deux tableaux de dimension # et de
créer un troisième dont les éléments représentent l’intersection des
deux premiers tableaux.
i 0 1 2 3 4 5 6 j 0 1 2 3
T1[i]= 12 4 13 6 12 45 23 T2[j]= 12 4 23 45
k 0 1 2 3
T[k]= 12 4 45 23
Exercice:
Donner un algorithme qui stocke un certain nombre inconnu de notes dans un tableau
de valeur et calcule et affiche la moyenne. L’utilisateur peut arrêter la saisie en
entrant (-1).
Les tableaux multidimensionnels
12
En mémoire un tableau statique, quelque soit sa
dimension, (T[n1][n2]…[np]) occupe un seul bloc. 9
Ligne 1
Ce bloc est linéaire. 34
Dans un tableau à plusieurs dimensions, l’accès à une 11
données (case) provoque un déplacement en mémoire
à partir du début. 18
-11
Ligne 2
0 1 2 3 9
0 12 9 34 11 -34
1 18 -11 9 -34 -1
2 -1 0 13 15 0
Ligne 3
3 78 22 88 23 13
15
78
22
Ligne 4
88
23
Les tableaux multidimensionnels
Donc on peut considérer un tableau de n dimension comme un tableau
unidimensionnel. On repère un élément du tableau par un seul indice
T *T
T+1 *(T+1)
0 1 ….. n T+2 *(T+2)
0 T+3 *(T+3)
1 … ..
….. ..
…..
m ..
….. ..
..
…..
Le temps d’accès à une donnée du tableau est ..
long. Pour accéder à un élément T(p, q) on ..
……
doit parcourir p*n+q+1 éléments.
T+n*m-1 *(T+n*m-1)
Les tableaux multidimensionnels (2D)
Tableau de valeurs
Simple Pointeur P *(*(T+0) + 0)
*(*(T+0) + 1)
Double Tableau de pointeurs ….
Pointeur *(*(T+0) + m-1)
T *(T+0) *(*(T+1) + 0)
*(T+1) *(*(T+1) + 1)
*(T+2) ….
….. *(*(T+1) + m-1)
*(*(T+2) + 0)
…..
*(*(T+2) + 1)
*(T+n-1) ……
*(*(T+2) + m-1)
……
*(*(T+n-1) + 0)
Les tableaux multidimensionnels
Chaque élément est repérer par deux indices : numéro de ligne et
numéro de colonne:
T[i][j] = *(*(T+i) + j)
Le temps d’accès à une donnée du tableau est plus rapide. Pour accéder
à un élément T(p, q) on va aller directement vers l’adresse
pointée par T[p] puis à l’adresse T[p]+q.
T[0][0][0]
Les tableaux multidimensionnels 3D T[0][0][1]
…..
T[0][0] T[0][0][k-1]
T[0]T[1] T[0][1][0]
…. T[0][1][1]
T[0]T[m-1]
…..
T T[0] T[1]T[0]
T[0][1][k-1]
T[1] T[1]T[1]
…. ….
T[2]
T[1]T[m-1] T[0]T[m-1][0]
…..
T[2]T[0] T[0]T[m-1][0]
….. T[2]T[1] ….
T[n-1] …… T[0]T[m-1][k-1]
T[2]T[m-1]
……
T[n-1]T[0]
Les tableaux multidimensionnels
Chaque élément est repérer par trois indices : numéro de ligne, numéro
de colonne et numéro de la profodeur:
T[i][j][k] = *(*(*(T+i) + j) + k)
Les tableaux
main()
{
main() int **T, i, j, n, m;
{ printf("n= ");
int T[3][3], i, j; scanf("%d", &n);
for(i=0; i<=2; i++) printf("m= ");
{ scanf("%d", &m);
for(j=0; j<=2; j++) T=(int**)malloc(n*sizeof(int*));
{ for(i=0; i<=n-1; i++)
printf("T[%d][%d]= ", i, j); {
scanf("%d", &T[i][j]); *(T+i)=(int*)malloc(m*sizeof(int));
} for(j=0; j<=m-1; j++)
} {
} printf("T[%d][%d]= ", i, j);
scanf("%d", *(T+i)+j);
}
}
printf("T[2][1]= %d", *(*(T+2)+1));
}
Les tableaux Accès aux données
les valeurs d’un tableau multidimensionnel alloué dynamiquement ne
sont pas forcément stockées dans un seul bloc. En effet l’initiation des
pointeurs T[i] avec la fonction malloc() permet au système d’exploitation
de chercher n zones mémoire composées chacune par m case mémoire.
Chaque zone sera pointée par T[i].
Les Algorithmes de tri
Les tableaux permettent de stocker plusieurs éléments de
même type au sein d'une seule entité,
Trier un tableau c'est donc ranger les éléments d'un
tableau en ordre croissant ou décroissant
Il existe plusieurs méthodes de tri qui se différencient par
leur complexité d'exécution et leur complexité de
compréhension pour le programmeur.
Nous exposons deux méthodes :
le tri par sélection (minimum (maximum) successif )
Le tri à bulles (permutation successive)
Le tri par insertion
Le tri par insertion
Ce tri s’inspire d’un processus naturel utilisé dans le tri des cartes qu’un
possédé dans sa main, le joueur prend chaque carte et l’insère à sa place
en décalant les autres.
4
50
0 1 2 3 4 5 6 7 8
12 23 35 45 55
55 63
63 78
78 89
89
Lire (e) // valeur à inserer
Redim(T(n+1))
Pour(i=n; i>=1 && e<T[i -1]; i--)
T[i]=T[i-1];
FinPour
T[i]=e;
pour(i=0; i<=n; i++)
Afficher(T[i])
FinPour
Le tri par insertion
Pour(k=1; k<n; k++)
e=T[k];
Pour(i=k; i>=1 && e<T[i-1]; i--)
T[i]=T[i-1];
suivant i
T[i]=e
Suivant k
Tri par sélection
Tri par Min ou Max successif
Consiste à chercher le minimum (ou maximum) et à la
permuter avec la valeur de la première position, puis
rechercher le deuxième min et la permuter avec la deuxième
position, et ainsi de suite. Cette algorithme utilise donc le
traitement élémentaire de permutation de deux valeurs de
deux variables.
Tri par maximum successif
i=1; 34 14 11 3 12 10
i=2; 34 14 12 3 11 10
i=3; 34 14 12 11 3 10
i=4; 34 14 12 11 10 3
Tri par max successif
Pour(k=0; à n-2; k++)
Max=T[k];
pmax=k;
Pour(i=k+1; à n-1 ; i++)
Si(T[i]>Max)
Max=T[i];
pmax=i;
FinSi
Suivant i
Si(T[k]!=T[pmax]) Alors
e=T[k];
T[k]=T[pmax];
T[pmax]=e;
FinSi
Suivant k
Le tri à bulles
Principe de la méthode :
Fonctions et Procédures
Chaines de caractère
Les Structures
Les Fichiers
Les fonctions & les procédures
On peut, dans une application, procéder aux mêmes
traitements, ou à des traitements similaires, à plusieurs
endroits de son déroulement.
Ces traitements vont être écrites dans des algorithmes à
part
Fonctions
procédures
Un paramètre de sortie est une variable dont la valeur est affectée par
les instructions du sous-programme
On peut avoir des fonctions qui nécessite pas de paramètres pour qu’ils
soient exécutées. On parle de fonction sans argument
Les fonctions
Les fonctions sont des sous-programmes admettant des paramètres et
retournant un seul résultat (comme les fonctions mathématiques
z=f(x,y,. . .)). les fonctions possédent:
Un nom
des paramètres en nombre fixe (n>=0)
Un seul type, qui est le type de la valeur retournée. la valeur de
retour est spécifiée par l'instruction Return
Main()
{ type P, x, y, z ……;
………
P = NomFonction (x, y, z, …)
……}
Paramètres effectifs
Les fonctions
Exemple : fonction qui renvoi le maximum de deux variables a et b
(paramètres d’entrés).
#include <stdio.h>
int Max(int a, int b) main()
{ { int M, x, y;
int res; printf("x = ");
res=a; scanf("%d", &x);
if(b>res) printf("y = ");
res=b; scanf("%d", &y);
return(res); M=Max(x, y);
} printf("Max = %d", M);
}
Les fonctions
Exercice : Ecrire une fonction int FMax(int *T, int n) qui permet de trouver le
maximum d’un tableau d’un certain nombre de valeurs. Ecrire un algorithme test
qui appelle cette fonction.
Syntaxe: Exemple
Main()
{ type P, x, y, z ……;
………
NomProcédure (x, y, z, …)
……}
Paramètres effectifs
Exercices: Ecrire une procédure qui permet d’afficher le Max et le Min d’un
tableau d’entier. void MaxMin(int *V, int n)
M = Max(Max(Max(Max(V[0], V[1]),V[2]),V[3]),V[4]);
return (M);}
Processus d’analyse
La décomposition récursive
Dans certain cas, le sous traitement est une illustration du problème initial,
mais pour un cas « plus simple ». Par conséquent, la solution du problème
s’exprime par rapport à elle-même! On appelle ce phénomène récursivité.
Traitement complexe
Sous Traitement 1
Sous traitement 2
Traitement élémentaire
Méthode itérative et récursive
X0 *X X4 =
X1 *X X* X3
X2 *X X* X2
X3 *X X* X1
X4 *X X* X0
= X4
Raisonnement par récurrence
Exemple de Récursivité
la factoriel de n est :
n! = 1*2*3…..*n : traitement itératif
n! = n*(n-1)*(n-2)*(n-3)*…..*1
n! = n*(n-1)! : traitement récursif
Récursivité simple
Récursivité terminale
Fonctions Récursives simple
Des fonctions s'appelant elles-mêmes, elles sont également
un moyen rapide pour poser certains problèmes
algorithmique.
main(){
int x;
printf("x = ");
scanf("%d", &x);
printf("%d! = %d", x, fact(x));}
Phase descente
Fact(6) = 6 * fact(5)
Fact(5) = 5 * fact(4)
Fact(4) = 4 * fact(3)
Fact(3) = 3 * fact(2)
3*2*1
4*3*2*1
5*4*3*2*1
6*5*4*3*2*1
Phase de remontée
Fonction récursive terminale
La récursivité simple reste valable pour des petits calculs.
Pour des récursivités plus profondes, un autre type de fonction récursive
existe, c'est la récursivité terminale.
Cela est possible en évitant de faire d’autre opérations sur les appelles
empilés la fonction récursive.
Fact(4, 5*6*1)
Fact(3, 4*5*6*1)
Fact(2, 3*4*5*6*1)
Fact(1, 2*3*4*5*6*1)
Si n==1; renvoyer res=720
Fonction– Racine carrée
La valeur de la racine carrée d'un nombre A peut être
approximée en employant la suite récurrente d'ordre 1
suivante:
*Fonction Racine carrée (2)
Version itérative Version récursive
float racine(floatA,floate){
float X;
X=A;
while(abs(X*X-A)>e)
X=(X+A/X)/2; float racine(float A,float e,
return(X);} float X){
float res;
if(abs(X*X-A)<=e)
res = X;
else
res = racine(A,e,(X+A/X)/2);}
return (res);}
float racine(float A,float e,
float X){
float res;
if(abs(X*X-A)<=e)
res = X;
else
res = racine(A,e,(X+A/X)/2);}
return (res);}
|X*X-A|=1
X=1,414213
le Maximum de V avec une fonction récursive
Soit la fonction Max(a, b).
Ecrire une fonction récursive qui renvoi le maximum des valeurs d’un
tableau V de dimension n. cette fonction aura pour argument les
éléments du vecteur V et la dimension n « RecMax(V, n) »
Cette fonction récursive doit renvoyer la valeur suivante:
(
MAX T[4], MAX(T[3], FMax(T, 3)) )
2378
(
MAX T[4], MAX(T[3], MAX(T[2], FMax(T, 2))) )
(
MAX T[4],2378 )
(
MAX T[4], MAX(T[3], MAX(T[2],MAX(T[1], T[0]))) )
(
MAX T[4], MAX(T[3],2378) )
(
MAX T[4], MAX(T[3], MAX(T[2],123)) )
Recherche du Max Méthode de
diviser pour régner
Etape-1 : diviser le tableau en deux sous-tableaux.
Deb=0 =Max(v(1),v(0))=6
Fin = 2
(2-0=2)
Mid=2/2=1
Max1=Fmax(v, 0, 1)
Deb=0 Max2 = Fmax(v, 2, 2)
= Max(v(2),v(2))=9
Fin = 4 Max(6,9)=9
Deb=0
(4-0=4)
Fin = 9
Mid=4/2=2
(9-0=9)
Max1=Fmax(v, 0, 2)
Mid=9/2=4,5
Max2 = Fmax(v, 3, 4)
Max1=Fmax(v, 0, 4) Max(v(4),v(3))=8
Max2 = Fmax(v, 5, 9) Max(9,8)=9
Max(12,7)=12 Max(12,1)=12
Max(v(8),v(9))=7
Calcul récursif de la puissance Méthode-1
PUISS(2, 6)
2*PUISS(2, 5) 2*32=64
2*PUISS(2, 4) 2*16=32
2*PUISS(2, 3) 2*8=16
2*PUISS(2, 2) 2*4=8
2*PUISS(2, 1) 2*2=4
2*PUISS(2, 0) 2*1=2
Calcul récursif de la puissance Méthode-1
16*PUISS(16*16, 0) 16*1
Récursivité croisée
Deux fonctions récursive qui s’appelle mutuellement:
Calcul de la racine carré en utilisant deux suites adjacentes.
i=1; 34 14 11 3 12 10
i=2; 34 14 12 3 11 10
i=3; 34 14 12 11 3 10
i=4; 34 14 12 11 10 3
Tri par max successif
void permute(int *a, int *b)
C'est l’un des tris les plus rapides, et les plus utilisés. La méthode est
constituée de deux méthodes.
Si f(a)*f(p)<=0 alors
Rechercher x0 dans [a,p]
Sinon
Rechercher x0 dans [p,b]
FinSi
Utilisation de la dichotomie
résolution de f(x)=0
double
doublezerof(double
zerof2(double a, a,
double b, b,
double double e){e){
double
double
doublemid,
mid,res;
res;
mid=(a+b)/2;
int n=1; P2 P3 P1
if(fabs(f(mid))<e)
mid=(a+b)/2; Min Min
res=mid;
while(fabs(f(mid))>=e){
else{if(f(a)*f(mid)<0)
if(f(a)*f(mid)<0)
b=mid;
b=mid;
else f(Min)
else
a=mid;
a=mid;
mid=(a+b)/2;
res=zerof(a,
n++; b, e);}
return res;}
printf("%d\n", n);}
return mid;} f(P2)
main(){ P2 P3 P1
double a, b, e=1e-6; f(P3) Min Max
scanf("%f", &a);
printf("b = "); f(Max)
scanf("%f", &b);
if(f(a)*f(b)>0)
printf("pas de solution");
else
printf("%f", zerof(a, b, e));}
Chapitre – 2 Les chaines de caractère
char <nom_chaine>[<dimension>]
char T[8]="bonjour";
main()
{int i; main(){
CH[]="bonjour"; char CH[]="bonjour";
for(i=0; i<=7; i++) printf("%s", CH);}
printf("%c", CH[i]);
}
# include <stdio.h>
main(){
char CH[8]="bonjour";
int i;
printf("\tCaractere | ASCII | Adresse\n");
printf("-----------------------------------\n");
for(i=0; i<8; i++)
printf("CH[%d] = %5c | %4d | %6x\n", i, CH[i], CH[i], &CH[i]);}
Chapitre – 2 Les chaines de caractère
Initialiser une chaine char
Par contre cette dernière sera constante (non modifiable) dans le cas
d’une initiation par pointeur.
# include <stdio.h>
main()
{ char t;
char *CH= "bonjour", t='B'; // Impossible: Erreur //
*CH=t;
printf("%s\n", CH);}
Chapitre – 2 Les chaines de caractère
Initialiser d’une chaine char
# include <stdio.h>
main(){
char CH[9]="bon\njour";
printf("%s", CH);}
Remarque
'c' est un caractère contant qui a une valeur numérique qui correspond
au code ASCII
# include <stdio.h>
main() !!!!!!!! Utilisation facile mais
{ avec beaucoup de précaution
char CH[20];
scanf("%s", CH);
printf("%s\n", CH);
}
Chapitre – 2 Les chaines de caractère
Saisie d’une chaîne de caractères
Saisie dans un tableau statique
# include <stdio.h>
main(){
char CH[20];
printf("donner votre nom et prenom ");
scanf("%s", CH);
printf("votre nom et prenom est : %s\n", CH);}
Chapitre – 2 Les chaines de caractère
Saisie d’une chaîne de caractères
Saisie dans un tableau statique
La réservation de <stdio.h>
# include la mémoire sera dynamique en utilisant les fonctions
malloc() main(){
et realloc().
char *CH, c;
int p=0, i;
printf("donner votre nom et prenom ");
CH=(char*)malloc(sizeof(char));
scanf("%c", CH+p);
while(CH[p]!='\n')
{ p++;
CH=(char*)realloc(CH,(p+1)*sizeof(char));
scanf("%c", CH+p);
}
CH[p]='\0';
printf("votre nom et prenom est : %s\n", CH);}
Chapitre – 2 Les chaines de caractère
#include <stdio.h>
int main(){
char c;
c = getchar();
// le programme suspend son fonctionnement jusqu'à ce que l'utilisateur tape
// au moins un caractère puis la touche <return>
putchar(c);}
Chapitre – 2 Les chaines de caractère
#include <stdio.h>
main(){
char CH[100], *P;
P=gets(CH);
printf("%s", p);}
Chapitre – 2 Les chaines de caractère
#include <stdio.h>
main(){
char CH[100];
printf("saisir une chaine ");
gets(CH);
printf("votre chaine est: ");
puts(CH);}
Chapitre – 2 Les chaines de caractère
Cette fonction lit les caractères stdin et les place dans la chaîne CH tant
que le caractère lu est différent du caractère de saut de ligne ('\n') (ce
caractère est copié en fin de chaîne). La fin de la chaîne de caractères est
marquée par l'ajout d'un caractère nul (\0).
int strncmp ( const char * str1, const char * str2, size_t num );
Un zéro signifie que les num premiers caractères des deux chaînes
sont égaux.
Une valeur positive indique que le premier caractère différent a une
plus grande valeur dans str1 que dans str2
Une valeur négative indique l'inverse.
Chapitre – 2 Les chaines de caractère
Manipulations de chaînes de caractères
Nombre de caractère d’unr chaine strslen()
main()
{
char CH[]="bonjour";
printf("%d", strlen(CH));
}
Chapitre – 2 Les chaines de caractère
Manipulations de chaînes de caractères
Recherche d'un char dans une autre strchr()
main(){
char CH1[]="abcdefr";
char *p;
p=strchr(CH1, 'c');
if(p!=NULL)
printf("trouvee");
else
printf("non trouvee");}
Chapitre – 2 Les chaines de caractère
Manipulations de chaînes de caractères
Recherche d'une chaîne dans une autre strstr()
P1
P2
Type2 V2
struct test{
Type1 V1
Type2 V2
Type3 V3};
typedef struct test str;
Str P1, P2;
Les Structures
Déclaration de structure
Elle se fait en deux étapes :
Définir le type structure avec les membres
struct personne
{ On préfère utiliser l’instruction « deftype »
char nom[20];
char prenom[20]; Typedef struct personne str
int no_employe;
};
main()
{
printf("%s ", p1.nom);
printf("%s ", p1.prenom);
printf("%d", p1.no_employe);
}
Les Structures
simplifier la déclaration de types : définir des synonymes avec
typedef
typedef int entier; typedef int * ptr; typedef struct test Str;
struct test
main() main() {
{ { float x;
entier a, b; ptr P1, P2; char c;
} } int a;
};
main()
{
Str S1, S2;
}
Les Structures
Saisie des membres d’une structure
typedef
La saisie des champs d’unestruct personne
structure str; avec les méthode déjà vu de
se fait
struct
saisie des variables personne{
classiques.
chacun des champschar d’unenom[20];
structure peut être d’un type absolument
chartableau,
quelconque : pointeur, prenom[20];
structure, pointeur ... Il peut
int no_employe;};
même s’agir de pointeurs sur des structures du type de la structure dans
main(){
laquelle ils apparaissent.
//saisie des champs
Données simplestr(int,
p1; float, char, ….);
Tables de donnée;gets(p1.nom);
gets(p1.prenom);
scanf("%d", &p1.no_employe);
//Affichage des données
printf("%s ", p1.nom);
printf("%s ", p1.prenom);
printf("%d", p1.no_employe);
}
Saisie des membres d’une Structure comportant des pointeurs
vers une zone allouer dynamiquement : Chaine de caractère
struct employe
{
char *nom;
char *prenom;
int num;
};
Les Structures
Affectation de structures
Il est possible d’affecter à une structure le contenu d’une structure
définie à partir du même modèle.
(*P).nom ou P nom
l’indirection (*) a une priorité inférieure à celle de la sélection (.).
(*P).x signifie que P est un pointeur vers une structure qui possède
un élément X d’un certain type.
Fin = New
Next = NULL
Note = 13,50
Last = NULL
Fin
Chainage de la chaine
if(Deb==NULL)
Deb=Fin=New
{
Deb=New;
Fin=New;
}
else
{
Fin->Next=New;
New->Last=Fin;
Fin=New;
}
Deb
Next
12,00
Last=NULL Next
18,00
Last
Next
14,00
Last
Parcourir une LC
Str *P
Int i=1
P=Deb; Fin
While(P!=NULL)
{ Next=NULL
P=P->Next; 10,00
i++; Last
}
Deb Insertion à une position pos
Next
P1
12,00
Next
Last=NULL
18,00
Last Next
18,00
Last
P2
Next
14,00
Last
Fin
Next=NULL
10,00
Last
Insertion à une position pos
else
if(pos==1) {
{ P=Deb;
New->Next=Deb; for(i=1; i<pos; i++)
Deb->Last=New; {
Deb=New; P=P->Next;
} }
else if(pos==n) P1=P->Last;
{ P2=P;
Fin->Next=New; P1->Next=New;
New->Last=Fin; New->Last=P1;
Fin=New; New->Next=P2;
} P2->Last=New;
}
Deb Suppression à une position pos
Next
P1
12,00
Next
Last=NULL
18,00
Last Next
18,00
Last
P2
Next
14,00
Last
Fin
Next=NULL
10,00
Last
Suppression à une position pos
else
if(pos==1) {
{ P=Deb;
Deb=Deb->Next; for(i=1; i<pos; i++)
} {
else if(pos==n) P=P->Next;
{ }
Fin->Last->Next=NULL; P1=P->Last;
P2=P->Next;
}
P1->Next=P2;
P2->Last=P1;
P1->Next=P2;
P2->Last=P1;
Deb->Next : pointe la deuxième
structure de la liste }
Last Last
Les Piles
Next LIFO Next
Last Last
Next Next
Last=NULL Last=NULL
if(Deb==NULL){
typedef struct Insert_Note Str; Deb=New;
struct Insert_Note{ Fin=New;}
Str *Next; else{
float note; (*Fin).Next=New;
Str *Last;}; (*New).Last=Fin;
Fin=New;}
main(){
Str *Deb=NULL, *Fin=NULL, Cour=Deb;
*New, *Cour=NULL; while(Cour!=NULL){
float x; printf("%f\n", (*Cour).note);
int n; Cour=(*Cour).Next;}}
int i;
printf("donner le nombre de note; ")
scanf("%d", &n);
for(i=0; i<n; i++){
printf("donner la note %d ", i);
scanf("%f", &x);
New=(Str *)malloc(Str)); Enfilement
(*New).Next=NULL;
(*New).note=x;
(*New).Last=NULL;
Les Structures
Les Tableaux de structure
Nous allons développé dans ce cours le cas du stockage de plusieurs
valeurs d’une variable de type structure dans un tableau de structure.
Les données sont stockées dans un bloc de mémoire.
struct personne
{
char nom[20];
char prenom[20];
int no_employe;
};
struct personne tab_personne[100];
struct employe
{
char *nom;
char *prenom;
int num;
};
struct client
{
char *nom;
char *prenom;
int code;
};
typedef struct client client;
main()
{
int i, n;
client Tabclient[20];
printf("donner le nombre de client a saisir ");
scanf("%d", &n);
getchar();
for(i=0; i<n; i++)
{
printf("saisir le client %d\n", i+1);
Tabclient[i].nom = saisirChaine();
Tabclient[i].prenom=saisirChaine();
scanf("%d", &Tabclient[i].code);
getchar();
}
Les Structures
Les Tableaux de structure
Allocation dynamique d’un tableau de structure
struct NomStruct
{
…….
};
typedef NomStruct Struct;
main()
{
int n ;
Struct *Tab ;
scanf("%d », &n) ;
Tab=(Struct*)malloc(n*sizeof(Struct)) ;
…….
}
Les Structures
Les Tableaux de structure
Ecrire un prog C qui permet de saisir et de stocker les noms, les prénoms
ainsi que les codes des employés dans un Tableau de structure
« employé ». La saisie s’arrête lorsqu’on saisie un nom égal à la liste
constante « FIN ».
Les fichiers permettent de stocker (ou lire) des données sur (à partir d’)
un support permanent tel que le disque dur. Les données sont
mémorisées sous forme d'une suite d'octets.
deux types de fichiers : binaire ou texte.
Un fichier texte est donc un cas particulier de fichier binaire : on peut donc
le manipuler en accès binaire, avec les fonctions (fread, fwrite).
On utilise surtout des fonctions "formatées" (fprintf, fgets, fscanf,...),
qui ressemblent à celles dont on dispose pour écrire à l'écran ou lire au
clavier.
deux types de fichiers : binaire ou texte.
Pour traiter les deux types de fichiers, binaire ou texte, on suit la même
procédure :
1. ouvrir le fichier (fonction fopen) ; on indique le nom du fichier et le
mode d’accès.
2. lire ou écrire dans le fichier en utilisant les fonctions compatibles
avec le type de fichier (binaire ou texte).
a. fread()//fscanf()
b. fwrite()//fprintf()
3. fermer le fichier (fonction fclose).
Contenu d’un fichier binaire et de son équivalent texte
On veut stocker dans un fichier la structure suivante :
Str S={-1.345e-5, -54, "abc"};
Programme C Fichier
Main Texte
{ 2334
……… 12/12/2015
}
HD
RAM
fgetc()
fgets()
fscanf()//fread()
Les Fonctions d’entrées-Sorties
Ces informations sont rassemblées dans une structure dont le type, FILE*,
définie dans stdio.h.
Un objet de type FILE * est appelé flot de données (en anglais, stream).
Les Fonctions d’entrées-Sorties
Ouverture et fermeture de fichiers : fopen(), fclose()
nom-de-fichier :if(fopen(nom-de-fichier
le nom du fichier auquel on ,veut
mode)==NULL)
accéder.
Mode : est uneprintf(‘’Ouverture
chaîne de caractères quiimpossible’’) ;
spécifie le mode d'accès au fichier. Les
modes d'accès else
diffèrent suivant le type de fichier considéré. On distingue : les
fichiers textes,{les fichiers binaires (caractères de contrôle sont interprétés ou pas.
//…Utilisation du contenu du fichier…//
Valeur rendue}
Si l’ouverture a réussi, la valeur retournée permet de repérer le fichier
Si l’ouverture est impossible, fopen rend la valeur NULL.
Les Fonctions d’entrées-Sorties
Ouverture et fermeture de fichiers
Paramètres
stream est le flot de type FILE* retourné par la fonction fopen() correspondant.
Valeur rendue
La fonction fclose() retourne un entier qui vaut zéro si l'opération s'est déroulée
normalement (et une valeur non nulle en cas d'erreur).
FILE *fi;
fi=fopen(nomfichier, mode)
fclose(fi);
Lecture et écriture par caractère sur fichier
Paramètres
#include
Stream ou flot-de-données : <stdio.h>
est de type pointeur vers FILE. Il pointe vers le fichier à
partir duquel se fait laint c;
lecture.
FILE *fi;
Valeur rendue
while ((c = fgetc(fi)) != EOF)
rend le caractère lu.
{ y a erreur d’entrée-sortie, ou rencontre de fin de fichier.
rend la valeur EOF S’il
... /* utilisation de c */
}
Lecture et écriture par caractère sur fichier
Ecriture par caractère sur fichier
Paramètres
– carac est de type int,FILE
c’est*fo;
le caractère à écrire.
– flot-de-données est char
de typec; pointeur vers FILE. Il pointe vers le fichier sur lequel se
fait l’écriture.. fo=fopen("testecrire", "w");
do
Valeur rendue {c=getchar();
La fonction fputc() rend le caractère écrit si l’écriture s’est faite sans erreur, ou EOF
fputc(c, fo);}
en cas d’erreur.
while(c!='\n');
EXERCICE
Ecrire une fonction qui permet de saisir puis stocker caractère par caractère une
chaine de char dans un fichier.
Ecrire une fonction qui permet de mettre en mémoire le contenue d’un fichier en
stockant dans une chaine caractère par caractère.
Lecture et écriture par lignes sur fichier
Lecture par lignes sur fichier
Valeur rendue
La fonction fgets rend le pointeur chaîne en cas de lecture sans erreur, ou NULL
dans le cas de fin de fichier ou d’erreur.
Lecture et écriture par lignes sur fichier
Paramètres
FILE *fo;
– chaîne est de type pointeur vers char. Pointe vers un tableau de caractères contenant
char
une chaîne se terminant parc,unT[20];
null.
– flot-de-données estfo=fopen("testecrire",
de type pointeur vers FILE."w");
Il pointe vers le fichier sur lequel se
fait l’écriture.
gets(T);
Valeur rendue
fputs(T, fo);
La fonction fputs rend une valeur non négative si l’écriture se passe sans erreur, et
EOF en cas d’erreur.
Ecrire un programme qui permet d’écrire dans un fichier une chaine de
char en utilisant une allocation statique.
Ecrire un programme qui lire à partir d’un fichier une chaine de char
puis la stocker dans la RAN dans un tableau statique.
Ecrire une procédure permettant de saisir n chaines de caractères char
par char puis les stocke sur n ligne sur un fichier.
Programme qui permet de stocker les lignes d’un fichier dans une tableau de
chaine avec une allocation dynamique.
Paramètres
– flot-de-données : est de type pointeur vers FILE. Il pointe vers le fichier sur lequel
se fait l’écriture.
– chaineformat : Elle contient des caractères ordinaires qui doivent être copiés tels
for(i=0;
quels, i<n;séquences
et des i++) d’échappement (introduites par le caractère %), décrivant la
{ dont doivent être écrits les paramètres param1, param2,... paramn.
manière
– param : est une expression délivrant
printf("%d\n",fprintf(fo, "%s %sune%d\n",
valeur à écrire.
Tabclient[i].nom,
Tabclient[i].prenom, Tabclient[i].code));
} rendue
Valeur
La fonction fprintf retourne le nombre de caractères écrits, ou une valeur négative
s’il y a eu une erreur d’entrée-sortie.
Lecture et Ecriture formatées sur fichiers
Lecture formatée : fscanf()
fscanf (FILE *stream , chaineformat , param1 , param2 , ... , paramn )
Paramètres
–FILE *fo;
flot-de-données : est de type pointeur vers FILE. Il pointe vers le fichier à partir
duquel
int se faitn=4;
i=0, la lecture.
– chaineformat : est une chaîne de caractères qui spécifie la forme de l’entrée
client Tabclient[20];
admissible dans flot-de-données.
– lesfo=fopen("testecrire",
parami : sont des pointeurs. "r");Ils pointent des variables dans lesquelles fscanf
while(fscanf(fo,
dépose les valeurs lues"%s
dans %s %d\n", Tabclient[i].nom,
flot-de-données, après les avoir converties en binaire.
Tabclient[i].prenom,
s'arrête &Tabclient[i].code)!=EOF)
si elle tombe au cours de sa lecture sur un espace, une tabulation ou une
entrée
i++;
Valeur rendue
fscanf retourne le nombre de param_i affectés. S’il y a eu rencontre de fin de
fichier ou erreur d’entrée-sortie avant toute affectation à un param_i, fscanf retourne
EOF.
Ecrire un programme C qui permet de stocker dans un fichier Texte les
valeurs d’un tableau de structure
Ecrire un programme C qui permet de lire à partir d’un fichier Texte les
valeurs d’un tableau de structure
struct test
{
char CH[20];
float PU;
int STK;
};
Paramètres
– l’adresse de la zone mémoire où on veut (on a) stocké la valeur.
– la taille en octet d'un élément .
– le nombre d'éléments à Lire/Ecrire.
– le pointeur du fichier
Valeur rendue
renvoient le nombre d'éléments effectivement lus/écrits..
Lecture et Ecriture sur fichiers binaire
Accès non séquentiel binaire : fseek()/ftell()
long ftell(FILE *stream );
Paramètres
– le pointeur du fichier
Valeur rendue
Valeur de type long qui représente la position actuelle du curseur.
Lecture et Ecriture sur fichiers binaire
Accès non séquentiel binaire : fseek()/ftell()
Paramètres
le pointeur du fichier
nombre de déplacement du curseur (nbre d’octet). Peut être > = < à 0
l’origine à partir duquel on effectue le déplacement.
o SEEK_SET : indique le début du fichier ;
o SEEK_CUR : indique la position actuelle du curseur ;
o SEEK_END : indique la fin du fichier.
Valeur rendue
0 si l’utilisation est réussie.
Lecture et Ecriture sur fichiers binaire
Accès non séquentiel binaire : fseek()/ftell()
Paramètres
le pointeur du fichier
Ecrire un programme C qui permet de stocker dans un fichier binaire
les valeurs d’un tableau de structure
struct test
{
char CH[20];
float PU;
int STK;
};
Lecture et Ecriture formatées sur une chaine
Ecriture formatée : sprintf()
main()
int sprintf (char
{ *chaine , format , param1 , param2 , ... , paramn )
char CH[20], T[20], x;
La fonction sprintf() réalise le même traitement que la fonction fprintf(), avec
int y;
la différence que les caractères émis par sprintf() sont écrits dans le tableau
printf("saisir
de caractères chaîne. Un nullun
estchar
écrit :dans
"); chaîne en fin de traitement.
scanf("%c", &x);
getchar();
printf("saisir une chaine : ");
gets(T);
printf("saisir entier : ");
scanf("%d", &y);
printf("la chaine formatee est : ");
sprintf(CH, "%c/%d/%s", x, y, T);
puts(CH);
}
Lecture et Ecriture formatées sur une chaine
Lecture formatée : sscanf()
sscanf (char *chaine , chaineformat , param1 , param2 , ... , paramn )
Valeur renvoyée
Scanf() retourne le nombre de param-i affectés c-a-d le nombre de
paramètre qui sont conforme à la chaine format.
Lecture et Ecriture formatées sur une chaine
Les directives pour les lectures formatées
Caractères blancs :il s’agit des six caractères suivants : espace, tab, line
feed, new line, vertical tab et form feed. Ce sont des caractères très utilisés
dans les lectures formatées.
main()
{
FILE *fi;
char x[20], y[20], *z="ABCD xyz";
sscanf(z, "%s %s", x,y); // ou sscanf(z, "%s%s", x,y);
printf("%s\n", x);
printf("%s", y); main()
} {
FILE *fi;
char x[20], y[20], *z="ABCD */* xyz";
sscanf(z, "%s */* %s", x,y); // ou sscanf(z, "%s%s", x,y);
printf("%s\n", x);
printf("%s", y);
}
Lecture et Ecriture formatées sur une clavier
Affichage formatée sur Ecran : printf()
int printf (chaineformat , param1 , param2 , ... , paramn )
Valeur renvoyée
Scanf() retourne le nombre de param-i affectés c-a-d le nombre de
paramètre qui sont conforme avec la chaine format.
On dira qu’une chaîne format est conforme à un modèle quand elle
appartient à l’ensemble des chaînes décrites par le modèle. Exemple :
123 est conforme au modèle %d.
Les énumérations
On peut aussi définir des constantes nommées de la manière suivante :
enum { liste-d’identificateurs }
Les énumérations
On peut aussi définir des constantes nommées de la manière suivante :
enum { liste-d’identificateurs }
union nombre
{
int i;
float f;
}
union nombre N;
N . a = 10;
N . F = 3.14;
Complexité
Comment évaluer les performances d'un algorithme ?
Exemple-2: Calcul d'une somme
R <-- 0
i <-- 1 aff : affectation
TantQue i <= N Faire test : test
R <-- R+T[i] som : somme
Si R>1000 Alors inc : incrémentation
R<-- 2*R mult : multiplication
FinSi
i <-- i+1
FinTantQue
Exemple-3 : calcul du factorielle (fonction récursive)
Dans le cas d’un traitement récursif les deux branchements vont être
exécutés
T(n) = test + aff + mult + T(n-1)
Cette algorithme à une complexité O(n2).
Exemple-5 algorithme de Recherche du Max
Var : X, i, Max : entiers
Ecrire(« donner la valeur », 0)
Lire X c1:affectation
Max X c2: incrémentation
i1 c3: test
Tant que (X <> -1) faire
si(X > Max) alors
Max X
FinSi
Ecrire(« donner la valeur », i)
lire X
ii+1 La complexité est en O(n)
Fin tant que
Ecrire(‘’Max=‘’, Max)
Exemple-7 Fonction Echange
1.5
T(n)
0.5
0
1 9 17 25 33 41 49 57 65 73 81 89 97 105 113
Complexité en O(n)
140
T(n)
12000 60
10000 40
T(n)
8000 20
6000 0
4000 1 17 33 49 65 81 97 113 129 145 161 177 193 209 225
2000 n
0
1 17 33 49 65 81 97 113129145161177193209225
n
Les algorithmes usuels peuvent être classés en un certain nombre de
grandes classes de complexité.
Plus lents sont les algorithmes de complexité située entre O(n2) et O(n3),
c'est le cas de la multiplication des matrices et du parcours dans les
graphes.
Conseils :
1. Privilégier le point 2 sur le point 1 uniquement si on
gagne en complexité.
2. «ce que fait» l'algorithme doit se lire lors d'une lecture
rapide : Une idée par ligne.
3. Faire également attention à la précision, la stabilité et la
sécurité.
La rapidité d'un algorithme est un élément essentiel pour
définir les qualités de celui-ci.
Méthodologie
Comment trouver un algorithme?
Prenez un exemple
Fin
Next
Note
Last