Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Département d’Informatique
Rabat
Lazrak Chaïmae
Razzoug Milouda
Année
universitaire : 2003 / 2004
A l’occasion de la
présentation de ce travail,
nous tenons à exprimer notre
gratitude et notre
reconnaissance à Mr . Brahim
Lamharchi, notre encadrant
de projet de fin d’étude à
l’Ecole Normale Supérieure de
Rabat pour les conseils qu’il
nous a prodigués tout au long
de ce travail.
Sommaire
Introduction..........................................................................................................................1
ÉlÉments de base d’un programme en Pascal et en C.........................................................3
II-1.1 Les variables..................................................................................................4
II-1.2 Les constantes................................................................................................6
II-2.1 En langage Pascal .........................................................................................7
II-2.2 En langage C..................................................................................................8
II-3.1 En langage Pascal..........................................................................................8
II-3.2 En langage C..................................................................................................9
Structures de traitement alternatives et itÉratives.............................................................20
Notion de sous-programmes..............................................................................................27
Les structures de
donnÉes statiques...............................................................................................................35
Les structures de donnÉes dynamiques.............................................................................44
Les fichiers.........................................................................................................................57
Solutions des exercices......................................................................................................65
Gestion de l’écran............................................................................................................174
Conclusion.......................................................................................................................176
Références........................................................................................................................177
INTRODUCTION
Langage Pascal
Langage C
Choix du sujet
Objectif
Notre objectif c’est de palier aux difficultés que le programmeur (universitaire,
élève ingénieur, analyste-programmeur, etc.) puisse rencontrer au moment de son
apprentissage en lui proposant une série d’exercices diversifiés et couvrant la
totalité des notions de base de la programmation. On lui propose aussi, à la fin du
document, toutes les solutions des exercices proposés en Pascal et en C.
I-2. En langage C
1- Préambule déclaratif qui comporte :
Exemple : int x ;
En langage Pascal
En langage C
Syntaxe : <type> <identificateur> ;
Selon l'endroit où on déclare une variable, celle-ci pourra être accessible (visible)
de partout dans le code ou bien dans une portion confinée de celui-ci (à l'intérieur
d'une fonction par exemple), on parle de portée (ou visibilité) d'une variable.
Lorsqu'une variable est déclarée à l'extérieur de toute fonction ou de tout bloc
d'instructions, elle est accessible de partout dans le code (n'importe quelle
fonction du programme peut faire appel à cette variable). On parle alors de
variable globale.
Lorsque l'on déclare une variable à l'intérieur d'un bloc d'instructions (entre des
accolades), sa portée se confine à l'intérieur du bloc dans lequel elle est déclarée.
En langage Pascal
Remarque
Contrairement aux variables, il n'est nullement besoin de spécifier le type de la
constante. On peut tout de même le faire, en utilisant le double point, comme
pour les variables.
Exemple : const Gravite : Real = 9.81;
En langage C
Mémoire
Type Description Intervalle Exemples
requise
Shortint Entiers courts -128 à 127 -125; 0; 32 1 octet
Integer Entiers "relatifs" -32 768 à 32 767 -30 000; 421; 2 octets
-2147483648 à -12 545 454; 3
Longint Entiers longs 4 octets
2147483647 257
Entiers sur 1 Bit
Byte 0 à 255 12; 157 1 octet
(Byte ou Octet)
Entiers sur 2 Bits
Word 0 à 65 535 27; 4 589 2 octets
(Word ou Mot)
3.1415;
Real Nombres réels 2.9E-39 à 1.7E38 6 octets
789.457851
Nombres décimaux 3.1415926; 178
Single 1.5E-45 à 3.4E38 4 octets
(simple précision) 925.455678
54.5899; 9 897
Nombres décimaux
Double 5E-324 à 1.7E308 669 8 octets
(double précision)
651.45568959
3.14159265458;
Extended Nombres réels 3.4E-4932 à 1.1E4932 10 octets
9.81
Comp Entier -9.2E18 à 9.2E18 -271; 6 548 8 octets
Boolean logique sur 1 octet false ou true false; true 1 octet
256 caractères au
Chaîne de 'Hello!'; 'Allez- 256
String maximum (0 à
caractères vous bien ?' octets
255)
Chaîne de n n caractères String[6]-
String[n] n octets
caractères maximum >'Hello!'
1 caractère
Char 1 caractère 'R' 1 octet
maximum
II-2.2 En langage C
Taille (en
Type de données Signification Plage de valeurs acceptée
octets)
Char Caractère 1 -128 à 127
Caractère non
unsigned char 1 0 à 255
signé
short int Entier court 2 -32768 à 32767
Entier court non
unsigned short int 2 0 à 65535
signé
int Entier 2 -32768 à 32767
unsigned int Entier non signé 2 0 à 65535
-2 147 483 648 à 2 147 483
long int Entier long 4
647
Entier long non
unsigned long int 2 0 à 4 294 967 295
signé
float flottant (réel) 4 3.4*10-38 à 3.4*1038
double flottant double 8 1.7*10-308 à 1.7*10308
flottant double
long double 10 3.4*10-4932 à 3.4*104932
long
Il est possible au programmeur de créer ses propres types. Les types doivent être
déclarés avec le mot-clef Type à fortiori avant la déclaration des variables.
Exemple
Type matrice = Array[1..10,1..10] of integer;
Définit un type nommé matrice pour représenter une matrice carrée d’ordre 10.
Type énuméré
Dans la déclaration d’un type énuméré, il faut énumérer toutes les valeurs de ce
type.
Syntaxe : type nom_du_type = (identificateur_1, identificateur_2,..,
identificateur_n)
Type intervalle
Syntaxe : type nom_du_type = début_de_l_intervalle..fin_de_l_intervalle
Exemple : Type age = 1..150 ;
Déclare un type nommé age dont les valeurs sont des entiers compris entre 1 et
150.
II-3.2 En langage C
Le type énuméré
Le type énuméré donne une liste de constantes par énumération. Le premier
identificateur a, par défaut, la valeur 0, le second a la valeur 1, etc. Une variable
de type énuméré est une variable entière.
Exemple :
typedef enum = {JAUNE = -2, ROUGE, VERT, VIOLET, BLEU} COULEUR;
main()
{
COULEUR coul1, coul2;
coul1 = VERT; // coul1 = 0
coul2 = coul1+2; // coul2 = 2
}
sont dits unaires (exemple –A). Dans les expressions plus complexes,
l’existence de règles de priorité permet d’éliminer toute ambiguïté dans
l’ordre de réalisation des opérations.
Or Or Opér
Opérateur
dr dr ateur
s
s
0 (,[ 5 +,-
*, /,
1 OR 6 DIV,
MOD
(+),
2 AND 7
(-)
3 NOT 8
< , >, <= ,
4 9
>= , <> , =
III-2. En langage C
Opérateurs arithmétiques
Une expression peut comporter des opérations. Les objets d’une opération sont
les opérandes, qui sont manipulés par les opérateurs.
Ces opérateurs travaillent sur des opérandes ayant deux valeurs : nul (faux) et
non-nul (vrai). Le résultat est soit nul (faux), soit non-nul (vrai).
L'opérateur && (ET logique) a pour résultat vrai si les deux opérandes ont une
valeur vraie. L'opérateur || (OU logique) a pour résultat vrai si l'un au moins des
deux opérandes a une valeur vraie. Les évaluations des opérations logiques sont
effectuées de la gauche vers la droite. On peut imposer un ordre en utilisant des
parenthèses. L'évaluation cesse dès que la valeur de l'expression est établie.
Exemple : i++
Opérateur conditionnel
Syntaxe : expr1?expr2:expr3;
expr1 est évaluée. Si elle est vraie, le résultat est la valeur de expr2, sinon le
résultat est la valeur de expr3.
Exemple : a==b?a=2:b=3;
Les opérandes de ces opérateurs doivent être de type entier (char, int, long,
short), mais ils sont traités comme une suite de bits (donc de 0 et de 1).
L'opérateur ~ remplace chaque 0 par 1 et vice-versa.
Les opérateurs &, ^ et ! opèrent sur chaque bit indépendamment. Ils sont
associatifs.
expr1 << expr2 décale tous les bits de expr1 de expr2 positions vers la gauche ;
les bits vacant sont remplis par des 0.
expr1 >> expr2 décale tous les bits de expr1 de expr2 positions vers la droite ; il
ne remplit les bits vacants par des 0 que si expr1 est de type unsigned, sinon,
selon les implémentations, il insère des copies du bit de signe ou des 0.
Exemple:
unsigned char val = 1; // 00000001
val = val << 3; // 00001000
val = val >> 2; // 00000010
Remarque: Ne pas confondre les opérateurs sur les bits & et | et les opérateurs
sur les expressions && et ||.
Oprérateur sizeof
Les priorités entre opérateurs définissent l'ordre dans lequel ils sont exécutés. Le
tableau suivant récapitule tous les opérateurs avec leur priorité.
En langage C, un certain nombre de notations servant à référencer des objets sont
considérées comme des opérateurs et, en tant que tels, soumises à des règles de
priorité.
Ce sont essentiellement :
- les références à des éléments d’un tableau réalisées par [ ] ;
- des références à des champs d’une structure opérateur -> ;
- des opérateurs d’adressage * et &.
Ces opérateurs seront étudiés ultérieurement dans les chapitres correspondant
aux tableaux, structures et pointeurs.
Catégorie Opérateurs
référence () [ ] -> .
unaire + - ++ -- | ~ * &
arithmétique */%
arithmétique +-
décalage << >>
relationnels < <= > >=
relationnels == !=
manip. de
&
bits
manip. de
^
bits
manip. de
|
bits
logique &&
logique ||
conditionnel ?:
Catégorie Opérateurs
affectation = += -= /= %= &= ^= |= <<= >>=
En langage Pascal:
Syntaxe :
Read (V 1, V2,…., Vn) Où Vi est une variable de tout type simple (sauf
énuméré) ou de type chaîne de caractères.
ReadLn (V1,V2,...Vn) même effet que Read, mais il faut taper la touche
Entrée après l’entrée de la donnée. L’instruction ReadLn (sans argument)
attend la frappe de la touche Entrée au clavier.
Exemple : read(x) ;
En langage C:
La fonction scanf
Syntaxe : scanf (format, liste_d’adresses)
Scanf("%d",&x) ;
Type de la Ivalue
Format
correspondant
c char
d int
hd short int
hu unsigned short
ld long int
lu unsigned long
f Float
lf double
s chaîne de caractères
u unsigned int
Liste_d’adresses : liste de "lvalue", séparées par des virgules, d’un type en
accord avec le code de format correspondant.
La macro getchar()
En Pascal
Syntaxe
Remarque :
• Une constante chaîne de caractères est mise entre apostrophe. Une
apostrophe comprise dans une chaîne doit être dédoublée.
• L’instruction WriteLn (sans arguments) permet un saut de ligne.
En langage C :
La fonction printf
Syntaxe : printf (format, liste_d’expressions)
La macro putchar
Cette instruction permet de transcrire une valeur dans une variable. Le symbole
d’affectation est ‘ := ’
Où la variable <Var> peut être de tout type et la valeur <Val> peut être une
valeur constante, la valeur d’une donnée constante ou variable, la valeur d’une
fonction, ou le résultat d’une expression.
Exemple : x :=2 ;
En langage C :
Affectation ordinaire
Exemple : x=2 ;
Remarque :
La valeur affectée à une variable doit être de même type ou de type compatible à
celui de la variable.
Notion de Ivalue
On constate que l’opérateur d’affectation impose des restrictions sur son premier
opérande. En effet, ce dernier doit être une référence à un emplacement mémoire
Affectation élargie
Le langage C permet de condenser les affectations de la forme :
Ivalue = Ivalue opérateur expression
En : Ivalue opérateur= expression
Cette possibilité concerne tous les opérateurs binaires arithmétiques et de
manipulation de bits (voir chapitre suivant). La liste complète de tous ces
nouveaux opérateurs d’affectation élargie est : +=, -=, *=, /=, %=, |=, ^=, &=,
<<= et >>=.
Remarque
Ne confondez pas l’opérateur de comparaison <= avec un opérateur d’affectation
élargie. Notez bien que les opérateurs de comparaison ne sont pas concernés par
cette possibilité.
Ecrire un programme qui demande à l'utilisateur une valeur pour U0, r et n et qui
affiche la nième valeur de la suite arithmétique définie par U0 et Un+1 = Un + r.
(On rappelle la propriété : Un = U0 + n.r ).
STRUCTURES DE TRAITEMENT
ALTERNATIVES ET ITÉRATIVES
I- Instructions conditionnelles
En langage Pascal :
Instruction IF…Then
Si <Cond> est vraie, le bloc d’instructions <Bloc> sera exécuté, sinon il sera
ignoré.
Instruction IF…THEN…ELSE
Else a:=b-a;
Remarque : la clause ELSE ne doit pas être précédée par un point virgule ‘ ;’.
Instruction CASE
Syntaxe :
CASE <Sélecteur> OF
Val1 : <Bloc1> ;
Val2 : <Bloc2> ;
..........................
Valn : <Blocn> ;
ELSE <Bloc>;
END;
En langage C :
Instruction IF :
Syntaxe : if (expression) instruction
Instruction IF…Else :
Syntaxe : IF (expression) instruction1 ELSE instrucion2
Instruction SWITCH:
Syntaxe:
Switch(expression)
{ case constante1: [suite_d’instruction1]
case constante2: [suite_d’instruction2]
..........................................................
case constante n: [suite_d’instruction n]
[default : suite_d’instruction ]
}
Remarque :
• On peut ajouter l’instruction break qui permet de sortir de l’instruction
switch juste après l’exécution du bloc de l’étiquette choisie.
Switch(expression)
{ case constante1: [suite_d’instruction1]
break ;
case constante2: [suite_d’instruction2]
break ;
..........................................................
case constante n: [suite_d’instruction n]
break ;
[default : suite_d’instruction ]
}
• les “case” peuvent apparaître dans n’importe quel ordre.
Structu En langage
En langage C
res Pascal
While While
Tant
<expression> (<expression>)
que
Do <bloc> <instruction>
Répéter Repeat<instructi Do <instruction>
- on> While(<expressio
Until
jusqu’à n>)
<expression>
For comp :=Vint For
To Valf (<initialisation> ;<c
Do <bloc> ondition de
Pour
For comp :=Vint continuation ;<modi
DownTo Valf fication>)
Do <bloc> <instruction>
Exercice 11
Ecrire un programme qui calcule la somme des N premiers termes positifs pairs
non multiples de 3.
Exercice 12
Ecrire un programme qui calcule la somme 1/2 + 1/4 + 1/8 +…+1/2n (n Є N*).
Exercice 13
Ecrire un programme qui calcule la somme 1+1/2-1/4+ 1/8-1/16+…±1/2n (n Є
N*).
Exercice 14
Ecrire un programme qui donne le nombre N tel que la série 1+1/2-1/3+1/4- 1/5+
…±1/N donne un résultat égal (à 1/100 près) à 1,33.
Exercice 15
Ecrire un programme qui donne la plus grande valeur inférieure à 1000 de la
somme 1+2+4+8+…+2N.
Exercice 16
Ecrire un programme qui calcule la somme 1+x+x2+…+xn (x réel et n entier).
Exercice 17
Calcul approché de x
Soient les deux suites: An+1= (An+Gn)/2 et Gn+1=2AnGn/(An+Gn) avec A0=x et
G0=1, on montre que lim An=lim Gn= x
n∞ n∞
Ecrire un programme qui donne la valeur de x avec une précision relative
Є=10-6, c’est à dire |An-Gn|/|Gn|<Є
Exercice 18
Sachant que la somme 1-1/3+1/5-1/7+1/9-…, tend vers П/4. Écrire un
programme qui calcule le nombre П à 10-6 près
Exercice 19
Le développement limité de la fonction sinus au voisinage de zéro est sin x= x -
x3/3! + x5/5! -…+(-1)p x2p+1/(2p+1)!+…
Ecrire un programme qui calcule sin x à 10-6 près.
Exercice 20
Ecrire un programme qui calcule la somme, le produit et la différence de deux
données numériques.
Exercice 21
Ecrire un programme qui retourne le code d’une donnée de type Caractere.
Exercice 22
Ecrire un programme qui calcule le salaire net d’un employé, sachant que celui-
ci a assuré un certain nombres d’heures de travail à un prix fixe par heure, et que
l’employeur doit réduire de son salaire des charges qui sont calculées avec un
coefficient donné.
Exercice 23
Ecrire un programme qui permet de reprendre l’exercice précédant en
considérant que l’employé a assuré des heures normales, des heures à 25% et des
heures à 50%.
Exercice 24
Ecrire un programme qui retourne si une donnée numérique est paire ou impaire
(utiliser le reste de la division par 2).
Exercice 25
Ecrire un programme qui permet de lire trois données numériques et retourne si
la troisième donnée est la somme des deux autres ou pas.
Exercice 26
Ecrire un programme qui, à partir du salaire brut d’un employé, détermine
l’impôt à payer sachant que les règles de calcul des impôts sont comme suit :
NOTION DE SOUS-PROGRAMMES
Un sous-programme permet :
• d’éviter d’appliquer à plusieurs endroits d’un programme le même traitement,
même s’il porte sur des objets différents.
• d’appliquer sous forme transportable un traitement dont on prévoit que
d’autres programmes peuvent aussi en avoir besoin.
• de dégager d’un programme des tâches de moindre importance ne laissant
dans son corps que la partie importante de l’algorithme d’où le gain de
lisibilité et de sécurité.
I. En langage Pascal
Les sous-programmes en Pascal sont des procédures et des fonctions.
Paramètres formels
La déclaration des procédures peut être suivie d’une liste de paramètres entre
parenthèses. Un paramètre formel est destiné à être remplacé, chaque fois que la
procédure est activée, par un autre objet dit paramètre effectif, le plus souvent
une variable, ou le résultat d’une expression, de la procédure appelante.
Syntaxe : Procedure <Nom> ( <mode> <Ident>.., <Ident> : <Type> ;.. ; <mode>
<Ident>,.., <Ident> : <Type>) ;
Où <mode> = rien ou var.
Paramètres par valeurs et paramètres par adresse
Les objets sont transmis comme données dont la valeur doit être inchangée par
la procédure appelée (on dit qu’on a une lecture pure).
Les objets sont transmis comme résultat dont la valeur doit être calculée par la
procédure appelée et transmise à la procédure appelante (on dit qu’on a une
écriture pure).
Les objets sont transmis comme données qui doivent être modifiées par la
procédure appelée (on dit qu’on a une lecture-écriture).
En Pascal, la transmission des paramètres se fait de deux manières :
• Transmission par valeur (lecture pure).
• Transmission par adresse (écriture pure, lecture-écriture).
On indique les paramètres transmis par adresse, précédés par le mot réservé Var,
les autres ne sont précédés par aucune chose.
II. En langage C
• son prototype :
Syntaxe :
Syntaxe :
III. La récursivité
Un sous-programme est dit récursif s’il s’appelle lui-même. Il doit
contenir une condition d’arrêt. Considérons l’exemple de la fonction
pgcd(a, b) qui retourne le plus grand diviseur commun des deux entiers
a et b :
Exercice 36
Ecrire une fonction paramétrée qui retourne si un nombre donné est parfait ou
non.
Exercice 37
Ecrire une fonction paramétrée qui retourne si deux nombres donnés sont amis
ou non.
Exercice 38
Ecrire une fonction paramétrée qui retourne l’inverse d’un nombre entier donné.
Exercice 39
Ecrire une fonction récursive permettant de calculer le PGDC de deux nombres
entiers positifs A et B.
Exercice 40
Ecrire une fonction récursive permettant de calculer le PPMC de deux nombres
entiers positifs A et B.
Exercice 41
Ecrire une fonction récursive qui permet de calculer le factoriel d’un nombre
donné.
Exercice 42
Ecrire une fonction récursive qui permet de calculer la puissance d’un entier
donné.
Exercice 43
Ecrire une fonction récursive qui calcule la valeur de la fonction d’Ackermann
« A » définie pour m>0 et n>0 par :
A(m, n)=A((m-1),A(m,n-1)) pour n>0, m>0 ;
A(0,n)=n+1 pour n>0;
A(m,0)=A(m-1,1) pour m>0 ;
Exercice 44
Ecrire une fonction qui fournit le nombre de chiffres d’un entier donné.
Exercice 45
Ecrire une procédure qui permet de dessiner la lettre X, à l'aide d'espaces et d'une
"lettre" fournie par l'utilisateur, auquel on demande aussi la "hauteur" du dessin
qu'il désire obtenir.
Par exemple : avec les réponses a et 5, elle donnera :
a a
a a
a
a a
a a
Exercice 46
Soit un programme qui visualise un menu composé de trois rubriques : Hors
d’œuvre, plat chaud et dessert.
Ecrire une procédure qui permet d’effectuer, à chaque fois, un choix exclusif.
Exercice 47
Ecrire une procedure paramétrée, qui permet l’échange des contenus de deux
paramètres formels par valeur A et B. Appeler cette procédure dans un
programme principal.On écrira les résultats dans le corps de la procédure, et dans
le programme principal.
Exercice 48
Ecrire une procedure paramétrée, qui permet l’échange des contenus de deux
paramètres formels par adresse A et B. Appeler cette procédure dans un
programme principal.On écrira les résultats dans le corps de la procédure, et dans
le programme principal.
Exercice 49
Ecrire une procédure qui affiche tous les nombres premiers qui sont compris
entre 1 et 200.
Exercice 50
Ecrire une procédure qui affiche tous les nombres parfaits qui sont compris entre
1 et 200.
Exercice 51
Ecrire une procédure qui permet d’afficher tous les diviseurs d’un entier N ainsi
que leur nombre.
Exercice 52
Affichez un triangle isocèle formé d'étoiles sur N lignes (N est fourni au clavier).
Exemple : N=8
*
***
*****
*******
*********
***********
*************
***************
Exercice 53
Calculer pour une valeur X donnée du type réel la valeur numérique d'un
polynôme de degré n:
P(X) = AnXn + An-1Xn-1 + ... + A1X + A0
Les valeurs de n, des coefficients An, ..., A0 et de X seront entrées au clavier.
Utiliser le schéma de Horner qui évite les opérations d'exponentiation lors du
calcul:
Exercice 54
Ecrire une procédure qui affiche la table des produits pour N variant de 1 à 10 :
X*Y I 0 1 2 3 4 5 6 7 8 9 10
--------------------------------------------------
0 I 0 0 0 0 0 0 0 0 0 0 0
1 I 0 1 2 3 4 5 6 7 8 9 10
2 I 0 2 4 6 8 10 12 14 16 18 20
3 I 0 3 6 9 12 15 18 21 24 27 30
4 I 0 4 8 12 16 20 24 28 32 36 40
5 I 0 5 10 15 20 25 30 35 40 45 50
6 I 0 6 12 18 24 30 36 42 48 54 60
7 I 0 7 14 21 28 35 42 49 56 63 70
8 I 0 8 16 24 32 40 48 56 64 72 80
9 I 0 9 18 27 36 45 54 63 72 81 90
10 I 0 10 20 30 40 50 60 70 80 90 100
LES STRUCTURES DE
DONNÉES STATIQUES
Tableau
Un tableau est une suite d’éléments de même type. En Pascal, la déclaration des
tableaux se fait comme suit :
Syntaxe : Var NomTab : Array[Min..Max] Of Type;
On accède à un élément du tableau en utilisant un index : Exemple NomTab[4].
Chaînes de caractères
Expressions chaînes
Affectation de chaînes
Procédure Commentaires
supprime dans la chaîne st une sous-chaîne contenant
DELETE (st,pos,num)
num caractères à partir du caractère de position pos.
permet l’insertion de la chaîne obj dans la chaîne target
INSERT(obj,target,pos)
à la position pos.
convertit la valeur numérique de value en une chaîne,
STR(value,st)
et range le résultat dans st.
convertit l’expression chaîne st en une valeur entière
ou réelle (en fonction de type de var) et range la valeur
dans var. code doit être une variable entière. Si aucune
VAL(st,var,code)
erreur n’est détectée, code est mise à zéro, sinon code a
la valeur de la position du premier caractère en erreur
et la valeur de var est indéfinie.
Fonctions Commentaires
retourne une sous-chaîne contenant num caractères de
COPY(st,pos,num)
st en commençant par le caractère de position pos.
retourne une chaîne qui est la concaténation de ces
CONCAT(st1,st2,…,stn)
arguments dans l’ordre où ils sont déclarés.
LENGTH(st) retourne la longueur effective de la chaîne st.
si obj est contenu dans target alors pos retourne la
POS(obj,target) position du premier caractère de obj dans target sinon
pos retourne zéro.
Ensembles
Remarques
• Le nombre maximum d’un ensemble est 256.
• On note par [ ] l’ensemble vide compatible avec tout type ensemble.
En langage C
Tableau
Type : définit le type d'éléments que contient le tableau (un tableau en langage C
est composé uniquement d'éléments de même type).
Chaîne de caractères
B o n j o u r \0
Fonctions Commentaires
recopie la seconde chaîne (source) à la
strcat(but,source)
suite de la première (but).
travaille de façon semblable à strcat en
offrant en outre un contrôle sur le
strncat(but,source,lgmax)
nombre de caractères qui seront
concaténés à la chaîne d’arrivée (but).
compare deux chaînes dont on lui
fournit l’adresse et elle fournit une
valeur entière définie comme étant :
strcmp(chaîne1,chaîne2)
• Positive si chaîne1 > chaîne2
• Nulle si chaîne1 = chaîne2
• Négative si chaîne1 < chaîne2
travaille comme strcmp mais elle limite
strncmp(chaîne1,chaîne2,lgmax) la comparaison au nombre maximal de
caractères indiqués par l’entier lgmax.
travaillent respectivement comme
stricmp(chaîne1,chaîne2) et strcmp et strncmp, mais sans tenir
strnicmp(chaîne1,chaîne2,lgmax) compte de la différence entre
majuscules et minuscules.
recopie la chaîne située à l’adresse
strcpy(destin,source) source dans l’emplacement d’adresse
destin.
procède de manière analogue à strcpy,
en limitant la copie au nombre de
strncpy(destin,source,lgmax)
caractères précisés par l’expression
entière lgmax.
recherche dans chaîne la première
strchr(chaîne,caractère) position où apparaît le caractère
mentionné.
réalise le même traitement que strchr,
strrchr(chaîne,caractère) mais en explorant la chaîne concernée à
partir de la fin.
recherche dans chaîne la première
strstr(chaîne,sous-chaîne) occurrence de la sous-chaîne
mentionnée.
Les enregistements
En langage C
Les structures
Dans un tableau, tous les constituants doivent être semblables. Ce n'est pas le cas
des structures, qui sont des variables composées de plusieurs variables (ou
CHAMPS) de types différents.
Exercice 56
Ecrire une procédure qui met à zéro la diagonale d’une matrice carrée.
Exercice 57
Ecrire une procédure qui affiche l’occurrence d’existence d’un nombre réel dans
une liste de nombres réels.
Exercice 58
Ecrire une procédure qui met le plus petit élément d’une liste au début de celle-
ci.
Exercice 59
Ecrire une procédure qui met les éléments négatifs d’une liste à gauche et les
éléments positifs à droite de la liste.
Exercice 60
Ecrire une procédure qui classe une liste de notes de la plus petite à la plus
grande.
Exercice 61
Etant donné N étudiants, leurs notes correspondantes à M matières et leur
moyenne. Ecrire une procédure qui affiche à côté de chaque étudiant son
classement.
Exercice 62
Le tri à bulles est un tri par échange. Le principe de base est de réordonner les
couples non classés tant qu’ils existent. La méthode de tri à bulles consiste à
parcourir la liste en comparant deux éléments successifs et en les permutant s’il y
a lieu. Ecrire une procédure qui réalise ce tri.
Exercice 63
Un palindrome est un mot, ou une phrase, lisible indifféremment de la gauche
vers la droite ou inversement. Ecrire une fonction qui retourne si une chaîne de
caractères est un palindrome ou non.
Exercice 64
Ecrire une fonction qui retourne la fréquence d’occurenced’un mot dans une
phrase.
Exercice 65
Ecrire une procédure qui enlève tous les blancs au début d’une phrase et qui
laisse un seul blanc entre les différents mots de la phrase.
Exercice 66
Soit un nombre entier positif N. Ecrire une fonction qui donne son équivalent
dans une base donnée B (2≤ B≤ 16).
Exercice 67
Soit N un nombre donné en base B (B ≠ 10). Ecrire une fonction qui donne son
équivalent en base 10.
Exercice 68
Soit N un nombre donné en base B1. Ecrire une fonction qui donne son
équivalent en base B2.
Exercice 69
Si on est amené à réaliser des opérations sur des nombres entiers très grands, on
peut utiliser les chaînes de caractères pour représenter ces nombres et ensuite
faire l’opération par bloc.
Ecrire une procédure pour réaliser l’opération d’addition sur de tels nombres.
Exercice 70
Ecrire une procédure qui permet de passer de la représentation d’un nombre en
chiffres romains à sa représentation décimale.
Exercice 71
Ecrire une procédure qui permet de passer de la représentation décimale d’un
nombre à sa représentation en chiffres romains.
Exercice 72
Ecrire une fonction qui retourne le déterminant d’une matrice carrée.
Exercice 73
Ecrire une procédure qui calcule l’inverse d’une matrice carrée.
Exercice 74
Un carré magique est un carré divisé en cellules dans lesquelles les nombres
entiers, à partir de 1 sont disposés de telle sorte que les sommes de chaque ligne,
de chaque colonne et de chaque diagonale soient égales.
Exemple :
6 1 8
7 5 3
2 6 4
Exercice 76
Ecrire les procédures qui donnent le calcul sur les nombres complexes au moyen
d’un type enregistrement.
Dans la pratique, très souvent, on veut représenter des objets, soit dont on ne
connaît pas à priori la taille, soit dont la taille est variable, selon les cas ou au
cours du traitement. On est alors amené à utiliser des structures qui peuvent
évoluer, pour bien s’adapter à ces objets. Ce sont les structures de données
dynamiques.
I- En langage Pascal
I-1. Les pointeurs
Un pointeur est une variable contenant l'adresse d'une autre variable d'un type
donné.
Syntaxe : type type_pointeur = ^type_base ;
type_base = ident_type ;
Si le type de base type_base est un identificateur non encore déclaré, il doit l’être
dans la même partie de la déclaration que le type pointeur type_pointeur.
Exemple : type ref = ^integer ;
Remarques :
• ref est une variable pointeur et ref^ la variable pointée.
• La constante NIL peut être affectée à n’importe quelle variable pointeur
(NIL ne fait référence à aucun élément du type associé).
• Le type prédéfini Pointer indique un pointeur non typé, c’est-à-dire un
pointeur qui ne pointe pas sur un type particulier.
• L’opérateur @ fait pointer la variable pointeur sur une zone mémoire
contenant une variable.
Une liste chaînée est une suite de données (liste) liées entre elles. Le lien est
réalisé par des pointeurs. Chaque élément de la liste est un enregistrement dont
l’un des champs est un pointeur qui pointe vers l’élément suivant.
Tête de la liste
L a1
e1 a2 e2 a3 en NIL
Queue de la liste
Exemple :
type nbrpoint = ^nombre ;
nombre = record
nbr : integer ;
suivant : nbrpoint ;
end ;
L’insertion d’un élément x dans une liste chaînée se fait en deux étapes :
1. allocation de l’espace mémoire qu’occuperait x.
2. création des liens avec l’élément de gauche puis de droite.
Les arbres
B C
D E F G
I
H
J
Définitions :
On appelle parcours d’un arbre tout algorithme permettant d’accéder une et une
seule fois à tous les nœuds de l’arbre. On distingue six parcours généraux,
symétriques deux à deux, valides pour les arbres binaires quelconques et répartis
en trois catégories qui sont :
Les parcours en préordre (préfixés)
Parcourir un arbre binaire en préordre c’est d’abord inspecter la racine, puis
parcourir en préordre le sous-arbre gauche (respectivement le sous-arbre droit) et
enfin parcourir en préordre le sous- arbre droit (respectivement le sous-arbre
gauche).
Exemple :
8
5
10
1 4
1
2
7
Arbres ordonnés
4 1
0
9
5
1
3
8 8
1
4 1 4
0
0
9
5 5 9 1
1 3
3 Insertion 6
1 1
7 6
8 8
4 9 2 4 9 2
4 4
1 1
2 6 8 2 8
0 0
Suppression
Une manière possible de représenter un arbre est la suivante : l’ensemble des fils
du même père forme une liste, donc chaque fils a un pointeur vers son frère qui
le suit. Le dernier frère a 0. Chaque père a un pointeur vers son premier fils.
Les fils de la dernière génération (feuilles) ont 0. Chaque fils à un pointeur vers
son père. L’ancêtre (racine) a 0.
Cela va être contenu dans un array of record :
type gene = Record
nom : string;
pere : integer ;
frere : integer ;
fils : integer;
end ;
arbre = array [1..max] of gene ;
var mafamille : arbre;
Exemple : (entre parenthèse figure l’indice dans le tableau)
Pierre (1)
1 2 3
II. En langage C
Les pointeurs
Un pointeur est une variable qui doit être définie en précisant le type de la
variable pointée, de la façon suivante :
Syntaxe : type * Nom_du_pointeur
Le type de la variable pointée peut-être aussi bien un type primaire (tel que int,
char, etc.) qu'un type complexe (tel que struct, etc .).
Fonctions Commentaires
alloue un emplacement de taille octets,
sans l’initialiser et fournit l’adresse
void * malloc(size_t taille) correspondante lorsque l’allocation a
réussi ou un pointeur nul dans le cas
contraire.
alloue l’emplacement nécessaire à
void * calloc(size_t nb_blocs,size_t
nb_blocs consécutifs, ayant chacun
taille)
une taille de taille octets.
permet de modifier la taille d’une zone
void * realloc(void * pointeur, size_t
préalablement allouée (par malloc,
taille)
calloc ou realloc).
libère la mémoire d’adresse adr. Ce
pointeur doit obligatoirement désigner
void free(void* adr) une zone préalablement allouée par
malloc, calloc, realloc. Si adr est nul,
cette fonction ne fait rien.
Syntaxe : Type *T ;
T = (type*) malloc (sizeof(type)*N) ; Avec N étant le nombre
d’éléments
du tableau.
Une liste chaînée est une structure comportant des champs contenant des données
et un pointeur vers une structure de même type. Ainsi, la structure correspondant
à une liste chaînée contenant une chaîne de 15 caractères et un entier ressemble à
ceci:
struct Nom_de_la_liste {
char Chaine[16];
int Entier;
struct Nom_de_la_liste * pSuivant;
};
Les arbres
info
g d
info
info d
g
g d
info
g d
Exemple :
Pour le cas d’un arbre de caractères, la structure est la suivante :
Typedef struct str{
char info ;
str *g, *d ;
} *Arbre p;
Exercice 78
Ecrire une procédure qui permet la création en pile d’une liste chaînée.
Exercice 79
Ecrire une procédure qui recherche un élément dans une liste chaînée.
Exercice 80
Ecrire une procédure qui insert un élément dans une liste chaînée.
Exercice 81
Ecrire une procédure qui élimine un élément d’une liste chaînée.
Exercice 82
Ecrire une procédure qui empile un élément dans une pile représentée par une
liste chaînée.
Exercice 83
Ecrire une procédure qui désempile un élément dans une pile représentée par une
liste chaînée.
Exercice 84
Ecrire une procédure qui permet la création d’une liste doublement chaînée.
Exercice 85
Ecrire une procédure qui recherche un élément dans une liste doublement
chaînée.
Exercice 86
Ecrire une procédure qui insert un élément dans une liste doublement chaînée.
Exercice 87
Ecrire une procédure qui élimine un élément d’une liste doublement chaînée.
Exercice 89
Ecrire une fonction qui recherche un élément dans une liste chaînée circulaire.
Exercice 90
Ecrire une procédure qui insert un élément dans une liste chaînée circulaire.
Exercice 91
Ecrire une procédure qui élimine un élément d’une liste chaînée circulaire.
Exercice 92
Un paragraphe est une suite de phrases. Une phrase est une suite de mots qui se
termine par un point (‘.’). Deux mots sont séparés par un blanc (‘ ’).
Dans cet exercice on représentera un paragraphe par une liste chaînée, et aussi
une phrase par une liste chaînée.
1- Ecrire une procédure qui permet la création d’une telle représentation.
2- Ecrire une procédure qui permet la recherche de la première occurrence
d’un mot dans le paragraphe. Le résultat de la recherche donne la position
de ce mot.
3- Ecrire une procédure qui permet l’insertion d’un mot M1 après un mot
M2 donné. Si le mot M2 ne se trouve pas dans le paragraphe, on ne fait
pas d’insertion.
4- Ecrire une procédure qui permet l’élimination d’un mot M1 du
paragraphe.
5- Ecrire une fonction qui permet la recherche d’une phrase, donnée par son
premier mot, dans le paragraphe. Le résultat de la recherche donne la
position de cette phrase dans le paragraphe.
6- Ecrire une procédure qui permet l’insertion d’une phrase ph1 après une
phrase ph2 donnée. Si la phrase ph2 ne se trouve pas dans le paragraphe,
on insert ph1 à la fin du paragraphe.
7- Ecrire une procédure qui permet l’élimination d’une phrase ph1 du
paragraphe.
Exercice 93
Ecrire la procédure du parcours d’un arbre binaire en préordre.
Exercice 94
Ecrire la procédure du parcours d’un arbre binaire en postordre.
Exercice 95
Ecrire la procédure du parcours d’un arbre binaire en ordre.
Exercice 96
Exercice 97
Ecrire une procédure qui insert un élément dans un arbre ordonné
horizontalement.
Exercice 98
Ecrire une procédure qui supprime un élément dans un arbre ordonné
horizontalement.
LES FICHIERS
Fichier texte
La tête de lecture et d'écriture se trouve sur un octet et cet octet est interprété
comme un caractère en code ASCII. On a alors ce qu'on appelle un fichier texte.
Un texte est en général divisé en lignes, marquées par des caractères de fin de
ligne et terminé par un code de fin de fichier. Un fichier texte peut se lire
caractère par caractère ou ligne par ligne.
Fichier binaire
La tête de lecture et d'écriture recouvre une variable, d'un type quelconque (réel,
double, structure, tableau, etc.) codée sur n octets comme en mémoire centrale.
On parle alors de fichier binaire. Une opération de lecture lit en bloc tous les
octets constituant cette variable.
I. En langage Pascal
En Pascal, un type fichier est défini par le mot réservé "File Of" suivi du type des
composantes de ce fichier.
Exemple :
Type Fic_mess = File Of string[80] ;
Fic_pers = File Of Record
Nom, prn:string[14];
Doti:string[6];
End;
Expression Commentaires
str est une expression chaîne résultant en tout nom légal de
fichier. Le nom du fichier est affecté à la variable filval et
Assign(filval,str) toutes les opérations suivantes sur filval affecteront le fichier
disque (externe) str. Assign ne doit jamais être utilisée sur un
fichier en cours d’utilisation.
un nouveau fichier disque dont le nom est assigné à la variable
filval est crée et préparé pour le traitement. Le pointeur de
Rewrite(filval) fichier est placé au début de celui-ci (c’est-à-dire : sur
l’enregistrement numéro 0). Un fichier disque crée par
Rewrite est vide.
le fichier disque affecté à la variable filval est préparé pour le
traitement. Le pointeur de ce fichier est positionné sur le
Reset(filval)
composant numéro 0. filval doit référencer un fichier existant,
sinon il se produira une erreur d’entrée/sortie.
var représente une ou plusieurs variables de même type que
les éléments de filval. Chaque variable est lue sur le fichier
Read(filval,var)
disque. Après chaque opération de lecture le pointeur de
fichier est avancé sur le composant suivant.
var représente une ou plusieurs variables de même type que
les éléments de filval. Chaque variable est écrite sur le fichier
Write(filval,var)
disque. Après chaque opération d’écriture le pointeur de
fichier est avancé sur le composant suivant.
déplace le pointeur de fichier sur le nième composant du fichier
Seek(filval,n)
référencé par filval. N est une expression entière.
Filesize(filval) retourne le nombre de composants d’un fichier.
Close(filval) le fichier disque associé à filval est fermé et le répertoire du
disque est mis à jour. Pour tenir compte des modifications
apportées au fichier, il est nécessaire de fermer un fichier
Expression Commentaires
après traitement.
fonction booléenne qui retourne vraie si le pointeur de fichier
Eof(filval)
est positionné à la fin du fichier disque.
fonction entière retournant la position courante du pointeur de
Filepos(filval)
fichier.
Remarque : un paramètre formel de type fichier doit être toujours donné par
adresse.
Toute opération sur les fichiers textes doit être précédée par un appel à la
procédure Assign, Un appel à Reset ou Rewrite doit précéder toute opération
de lecture ou d’ecriture.
Reset est utilisée pour ouvrir un fichier existant en lecture, la seule opération
permise sur ce fichier est la lecture séquentielle. Lorsqu’un nouveau fichier texte
est fermé, une marque de fin de fichier est mise à la fin du fichier.
L’entrée et la sortie des caractères dans les fichiers textes s’effectuent par les
procédures Read(filvar,c) et Write(filval,c). Les procédures Readln, Writeln et la
fonction EoLn permettent le traitement des lignes d’un fichier texte.
Expressions Commentaires
va au début de la ligne suivante, c’est-à-dire
Readln(filvar) ou
écarte tous les caractères jusque et y compris la
readln(filvar,st1,st2,..,stn)
séquence CR/LF (la marque de la fin de ligne).
Expressions Commentaires
Writeln(filvar) ou écrit une marque de fin de ligne, c’est-à-dire une
writeln(filvar,st1,..,stn) séquence CR/LF dans le fichier texte.
fonction booléenne retournant vrai si la fin de
ligne a été atteinte, c’est-à-dire si le pointeur de
EoLn(filvar) fichier est positionné sur le caractère CR de la
séquence CR/LF. Si Eof(filvar) est vrai alors
EoLn(filvar) est également vrai.
similaire à EoLn, mais écarte les espaces et les
seekEoLn(filvar)
Tabs avant de faire le test.
retourne vrai si le pointeur de fichier est
Eof(filvar)
positionné sur la fin de fichier (Ctrl-Z).
similaire à Eof, mais écarte les espaces, les Tabs
SeekEof(filvar) et les marques de fin de ligne avant de faire le
test.
ouvre un fichier texte existant en mode ajout.
Append(var filvar :Text) Après un appel à Append, seule l’écriture est
autorisée.
vide la mémoire tampon associée à un fichier
Flush(var filvar :Text)
texte ouvert en mode écriture.
assigne un tampon d’entrée/sortie à un fichier
texte. Toute variable fichier de type texte dispose
SetTextBuf(var d’un tampon mémoire, dont la taille est de 128
filvar:Text;var octets par défaut. Le tampon est utilisé lors des
tampon[ ;taille :Word]) opérations de lecture et d’écriture. La taille est
suffisante pour la plupart des applications.
SetTextBuf doit être utilisée juste après Assign.
Remarques :
II. En langage C
Pour pouvoir manipuler les fichiers en C, on doit déclarer un pointeur sur la
structure FILE.
Exemple:
#include <stdio.h>
FILE *Pointeur_sur_fichier;
Pointeur_sur_fichier = fopen("C:\IUT\essai.txt", "wt");
Ouvre (ou crée s'il n'existe pas) un fichier texte nommé essai.txt dans le
répertoire IUT du disque C. Les modes de base sont :
• "r" (read : lecture) : lecture seulement ; le fichier doit exister.
• "w" (write : écriture) : écriture seulement. Si le fichier n’existe pas,
il est créé. S’il existe, son ancien contenu est perdu.
• "a" (append : ajout) : si le fichier existe déjà, il sera étendu. S’il
n’existe pas, il sera créé.
• "r+" : mise à jour (lecture et écriture). Le fichier doit exister.
• "t" ou "b" : lorsque l’implémentation distingue les fichiers de texte
des autres, il est possible d’ajouter l’une de ces deux lettres à chacun des
modes précédents. La lettre t précise que l’on a affaire à un fichier texte ; la
lettre b précise que l’on a affaire à un fichier binaire.
• fputc : ce qui signifie "met un caractère dans un fichier". Comme son nom
l'indique, cette fonction écrit un octet dans un fichier.
Exemple:
char erreur;
erreur = fputc('x', Pointeur_sur_fichier);
• fputs : ce qui signifie "met une chaîne dans un fichier". Comme son
nom l'indique également, cette fonction écrit une chaîne de caractères dans
un fichier.
Exemple :
char erreur;
erreur = fputs("chaîne de caractère", Pointeur_sur_fichier);
Remarque :
Dans ces deux cas, la variable erreur de type char contient le dernier caractère
écrit et EOF si une erreur se présente (fin de fichier, disque plein, etc.).
• fwrite : écrit dans un fichier des objets d'un type quelconque. Il faut
préciser la taille d'un objet (par exemple avec sizeof(objet)), le nombre
d'objets à écrire et le pointeur du fichier destination. Cette fois, la fonction
renvoie le nombre d'éléments effectivement écrits. Pour tester que tout va
bien, il faut comparer le nombre d'éléments écrits avec le nombre d'objets à
écrire.
Syntaxe :
nombre_d_elements_ecrits = fwrite(ptr_sur_tableau, taille_element,
nb_elements, fichier)
Met dans Chaîne les caractères situés entre le début et la fin de fichier ou
le prochain espace blanc. Les espaces blancs initiaux sont
automatiquement sautés. Les formats de fscanf sont les mêmes que ceux
de scanf.
Exercice 100
Ecrire une procédure qui permet de modifier les informations d’un étudiant.
Pascal C
Exercice 1
Ecrire un programme qui permet d’afficher le message suivant : mon premier programme.
Program afficher ; #include<stdio.h>
Begin #include<conio.h>
Writeln(‘mon premier programme’) ; void main()
Readln ; {
End . printf("mon premier programme") ;
getch() ;
}
Exercice 2
Ecrire un programme qui demande à l'utilisateur les valeurs de 2 entiers x et y, qui permute leurs valeurs et qui
les affiche.
Program Echange; #include<stdio.h>
var x,y,tmp:integer; #include<conio.h>
begin void main()
write('donner deux entiers differents:'); {
readln(x,y); clrscr();
writeln('x=',x,' et y=' ,y); int x,y,tmp;
tmp:=x; printf("entrez deux nombres: ");
}
Exercice 4
Ecrire un programme qui demande à l'utilisateur les coordonnées de 2 points distincts du plan et qui affiche les
coordonnées du point milieu.
premj=(premj+nbj)%7;
printf("\nle premier jour du mois suivant est:
%d",premj) ;
getch();
}
Exercice 9
Ecrire un programme qui calcule la somme des N premiers termes positifs
program somme; #include<stdio.h>
var N,i,s:integer; #include<conio.h>
begin void main()
write('entrer un nombre positif:'); {
readln(N); clrscr();
s:=0; int N,i,S;
if N>0 then printf("donnez un entier positif:
for i:=1 to N do ");scanf("%d",&N);
s:=s+i; S=0;
writeln('la somme de N premiers termes if(N>0) {
positifs:',N);; for(i=1 ;i<=N;i++)
readln S=S+i;
end. }
printf("la somme des %d premiers termes
positifs est:%d ",N,S);
getch();
}
Exercice 10
Ecrire un programme qui calcule la somme des N premiers termes positifs impaires
program som_impaire; include<stdio.h>
var N,i,s:integer; #include<conio.h>
begin void main()
write('entrer un entier positif:'); {
readln(N); clrscr();
i:=1;s:=0; int N,i,S;
while(i<2*N) do printf("donnez un entier positif:
begin ");scanf("%d",&N);
s:=s+i; S=0;
i:=i+2; i=1;
end; while(i<=2*N-1){
writeln('somme de ',N,' premiers termes positifs S=S+i;
impaires est: ',s); i=i+2;
readln; }
end. printf("la somme des %d premiers termes
positifs impaires est:%d ",N,S);
getch();}
Exercice 11
Ecrire un programme qui calcule la somme des N premiers termes positifs pairs nom multiple de 3
program som_paires; #include<stdio.h>
var N,i,s,cp:integer; #include<conio.h>
begin void main()
write('entrer un entier positif:'); {
readln(N); clrscr();
i:=0;s:=0;cp:=0; int N,i,S,cp;
while(cp<N) do printf("donnez un entier positif:
begin ");scanf("%d",&N);
i:=i+2; S=0;
if (i mod 3 <> 0) then i=0;
begin cp=0;
s:=s+i; while(cp<N){
cp:=cp+1; i=i+2;
end; if(i%3!=0){
end; S=S+i;
writeln('somme de ',N,' premiers termes positifs cp=cp+1;
non multiples de 3 est: ',s); }
readln; }
end. printf("la somme des %d premiers termes
positifs impaires non multiple de 3 est:%d ",N,S);
getch();
}
Exercice 12
Ecrire un programme qui calcule la somme 1/2 + 1/4 + 1/8 +…+1/2n (n Є N*)
program calcul; #include<stdio.h>
var n,i:integer; #include<conio.h>
s,u:real; #include<math.h>
begin #include<stdlib.h>
s:=0; void main()
u:=1/2; {
i:=1; clrscr();
write('donner un entier non nul: ');readln(n); float s,u;
while i<=n do int i,n;
begin s=0;
s:=s+u; u=(float)1/2;
u:=u/2; i=1;
i:=i+1; printf("donnez un entier positif non
end; nul:");scanf("%d",&n);
writeln('la somme est: ',s:10:5); while(i<=n){
readln; s=s+u;
end. u=u/2;
i=i+1;
}
Exercice 14
Ecrire un programme qui donne le nombre N tel que la série 1+1/2-1/3+1/4- 1/5+…±1/N donne un résultat égal
(à 1/100 près) à 1,33
program calcul; #include<stdio.h>
var S:real; #include<conio.h>
i:longint; #include<math.h>
begin void main()
S:=1; {
i:=1; clrscr();
while abs(S - 1.33) > 0.001 do float s,n;
begin long int i;
if (i mod 2=0) then S:=S-(1/(i+1)) s=1;
else S:=S+(1/(i+1)); i=1;
i:=i+1; while( fabs(s-1.33)>0.001)
end; {
write('le nombre tel que la serie donne un resultat = n=(float)1/(i+1);
1,33 est:',s:10:5) ; if (i%2==0) s=s-n;
readln; else s=s+n;
end. i=i+1;
}
printf("la valeur approche de 1,33 est : %f",s);
getch();
}
Exercice 15
Ecrire un programme qui donne la plus grande valeur inférieure à 1000 de la somme 1+2+4+8+…+2N
program calcul; #include<stdio.h>
begin scanf("%f",&x);
B:=A; A=x;
A:=(A+G)/2; G=1;
G:=2*B*G/(B+G); while(fabs((A-G)/G)>0.000001)
end; {
writeln('la racine de ',x:10:5,' est: ',A:10:5); B=A;
readln; A=(A+G)/2;
end. G=2*B*G/(B+G);
}
printf("la racine de %f est : %f",x,A);
getch();
}
Exercice 18
Sachant que la somme 1-1/3+1/5-1/7+1/9... tend vers ∏/4. écrire un programme donnant le nombre ∏ à 10-6 près
program pi; #include<stdio.h>
var s,t:real; #include<conio.h>
i:integer; void main()
begin {
s:=4; clrscr();
i:=1; float s,t;
t:=1/3; int i;
while t>0.000001 do s=4;
begin t=(float)1/3;
t:=4/(2*i+1); i=1;
if i mod 2=0 then while(t>0.000001){
s:=s+t t=(float)4/(2*i+1);
Exercice 20
Ecrire un programme qui calcule la somme, le produit et la différence de deux données numériques.
program operation; #include <stdio.h>
var x,y:integer; #include<conio.h>
op:char; void main()
begin {
writeln('donner deux nombres x et y'); int x,y;
readln(x,y); char op;
writeln('donner un op‚rateur'); printf("donner le premier operande\n");
readln(op); scanf("%d",&x);
case(op) of printf("donner le deusieme operande\n");
'/': begin scanf("%d",&y);
if y<>0 then writeln('la division de x par y est ‚gale printf("donner l'operateur\n");
…:',x/y) op=getch();
else writeln(' division par z‚ro'); switch(op)
end; {
Exercice 21
écrire un programme qui retourne le code d’une donnée de type CARACTERE.
program code_ASCII; #include <stdio.h>
var c:char; #include<conio.h>
asci:integer; void main()
begin {
writeln('donner un caractère:'); int asci;
readln(c); char c;
asci:=ord(c); printf("donner un caractere\n");
writeln('le code ASCII de ce caractère est:',asci); scanf("%c",&c);
readln; asci='A';
end. printf("%d\n",asci);
getch();
}
Exercice 22
Ecrire un programme qui calcule le salaire net d’un employé, sachant que celui-ci a assuré un certain nombres
d’heures de travail à un prix fixe par heure, et que l’employeur doit réduire de son salaire des charges qui sont
calculées avec un coefficient donné.
program salaire_net_employe; #include <stdio.h>
var charges,sb,sn,coef,ph:real; #include<conio.h>
nh:integer; void main()
begin {
writeln('donner le nombre d''heures de travail de cet int NH;
employ‚:'); float NB,SN,SB,coef,PH,charges;
readln(nh);
writeln('donner le prix d''une heure:'); printf("donner le nombre d'heures de travail:\n");
readln(ph); scanf("%d",&NH);
writeln('donner le coefficient:'); printf("donner le prix de chaque heure:\n");
readln(coef); scanf("%f",&PH);
sb:=nh*ph; printf("donner le coefficient de reduction:\n");
charges:=sb*coef; scanf("%f",&coef);
sn:=sb-charges; SB=NH*PH;
writeln('le salaire net de cet employ‚ est:',sn); charges=SB*coef;
readln; SN=SB-charges;
end. printf("la salaire net de cet employe est egal a %f",SN);
getch();
}
Exercice 23
Ecrire un programme qui permet de reprendre l’exercice précédant en considérant que l’employé a assuré des
heures normales, des heures à 25% et des heures à 50%.
program salaire_net_supplements; include<stdio.h>
var charges,sb,sn,coef,ph:real; #include<conio.h>
readln; }
end.
Exercice 26
Ecrire un programme qui, à partir du salaire brut d’un employé, détermine l’impôt à payer sachant que les règles
de calcul des impôts sont comme suit :
else %f\n",450+0.3*(sb-3000));
writeln('l''impot à payer est de:',750+40/100*(sb- else printf("l'impot a payer est de:
5000)); %f\n",750+0.4*(sb-5000));
end; }
end; }
readln getch();
end. }
Exercice 27
Ecrire un programme qui fournit les racines de l’équation Ax2+Bx+C=0.
program eqation ; #include<stdio.h>
var a,b,c:integer; #include<conio.h>
delta:real; #include<math.h>
begin void main()
writeln('donner a, b et c'); { int a,b,c;
readln(a,b,c); float delta;
if a=0 then printf("donner a, b et c:\n");
begin scanf("%d%d%d",&a,&b,&c);
if b=0 then begin if (a==0)
if c=0 then writeln('S=R') { if(b=0)
else writeln('S=VIDE'); { if (c=0) printf("S=R");
end else printf("S=VIDE");
else writeln('la solution est:',-c/b); }
end else printf("la solution est:%f",-c/b);
else begin }
delta:=b*b-4*a*c; else
if delta>=0 then writeln('les racines de cette {
js=j+1;
ms=m;
as=a;
}
printf("\nle jour suivant est:%d/%d/
%d",js,ms,as) ;
getch();
}
Exercice 29
Ecrire un programme qui, étant donnée une date (jour, mois, année), affiche la date du jour précédant.
program jour_precedant; #include<stdio.h>
var nj,j,m,a,mp,jp,ap:integer; #include<conio.h>
biss:boolean; void main()
begin { int nj,j,m,a,mp,jp,biss,a,p;
writeln('donner la date d''aujourd''hui:'); printf("donner la date d'aujourd'hui:\n");
readln(j,m,a); scanf("%d%d%d",j,m,a);
if( a mod 100)=0 then biss:=(a mod 400)=0 if(( a % 100)==0))
else biss:=(a mod 4)=0; biss=(a % 400)==0;
if m=1 then m:=13; else biss=(a % 4)==0;
case m-1 of if m==1 m=13;
1,3,7,8,10,12:nj:=31; switch(m-1)
4,6,9,11:nj:=30; { case 1:
2:if biss then nj:=29 case 3:
else nj:=28; case 5:
end; case 7:
if j=1 then begin case 8:
getch();
}
}
Exercice 30
Ecrire un programme qui calcule la somme 5+6+7+….+N (N>=5).
Program Somme_entiers; #include<stdio.h>
var N,i,S:integer; #include<conio.h>
begin void main()
writeln('donner un entier >=5:'); { int N,i,S;
readln(N); printf("donner un entier >=5:\n");
S:=0;i:=5; scanf("%d",&N);
while i<=N do S=0;
begin i=4;
S:=S+i; while(i<N)
i:=i+1; { i=i+1;
end; S=S+i;
writeln('la somme est égale à’,S); }
readln; printf("la somme est egale a :%d" ,S);
end. getch();
}
Exercice 31
Ecrire un programme qui calcule le produit des N (N>0) premiers entiers positifs.
program Produit_Entiers; #include<stdio.h>
var P,i,N:integer; #include<conio.h>
begin void main()
writeln('donner un entier >0:'); {
end; }while(i<=n);
until i=N+1; printf("la somme est: %f",s);
writeln('S=,'S); getch();
readln; }
end.
Exercice 33
Ecrire un programme qui échange les contenus de trois données numériques si leur somme est paire, sinon il met
la somme des trois dans la première donnée, leur produit dans la seconde et la valeur zéro dans la troisième.
program echange_cond_trois; void main()
uses crt; {
var s,tmp,x,y,z:integer; clrscr();
begin int x,y,z,tmp,s;
clrscr; printf("Donnez trois entiers:");
writeln('donner trois entiers:'); scanf("%d %d %d",&x,&y,&z);
readln(x,y,z); s=x+y+z;
s:=x+y+z; if(s%2==0){
if(s mod 2)=0 then begin tmp=x;
tmp:=x; x=y;
x:=y; y=z;
y:=z; z=tmp;
z:=tmp; printf("x=%d,y=%d,z=%d",x,y,z);
writeln('x=',x,' ','y=',y,' ','z=',z); }
end else{
tmp=x;
else begin x=x+y+z;
tmp:=x; y=y*tmp*z;
x:=x+y+z; z=0;
y:=y*tmp*z; printf("x=%d,y=%d,z=%d",x,y,z);
z:=0; }
writeln('x=',x,' ','y=',y,' ','z=',z); getch();
end; }
readln;
end.
Exercice 34
Ecrire un programme qui calcule la somme :1-1/2+1/3-1/4+…+/-1/N
program Serie_Alternative; include<stdio.h>
var i,N:integer; #include<conio.h>
S:real; void main()
b:boolean; {
begin int i,n,b;
writeln('donner un entier >0'); float s;
readln(N); printf("Donner un entier >0:");
S:=1; scanf("%d",&n);
for i:=2 to N do s=1;
begin for(i=2;i<=n;i++){
b:=(i mod 2)=0; b=(i%2==0);
if b then S:=S-1/i if(b) s=s-(float)1/i;
else S:=S+1/i; else s=s+(float)1/i;
end; }
writeln('S=',S); printf("la somme est: %f",s);
readln;
end. getch(); }
Les fonctions
Exercice 35
Ecrire une fonction paramétrée qui retourne si un nombre donné est premier ou non.
function est_premier(N:integer):boolean; #include<stdio.h>
var i,nb:integer; #include<math.h>
begin int premier(int N)
nb:=0; {
for i:=1 to N do int i=2;
if N mod i =o then nb:=nb+1; int termine=0;
est_premier:=(nb=2); while(i<=sqrt(N)&&(!termine)){
end; termine=(N%i==0);
i=i+1;
}
return(!termine);
}
Exercice 36
Ecrire une fonction paramétrée qui rend si un nombre donné est parfait ou non.
function est_parfait(N:integer):boolean; #include<stdio.h>
var S,i:integer; int parfait(int A)
begin {
S:=0; int s=0;
for i:=1 to N-1 do for(int i=1;i<A;i++)
if N mod i = 0 then S:=S+i if(A%i==0) s+=i;
est_parfait:=(N=S); return(A==s);
end; }
Exercice 37
Ecrire une fonction paramétré qui rend si deux nombres données sont amis ou non.
function Amis(N:integer;M:integer):boolean; #include<stdio.h>
var S,R,i,j:integer; int amis(int N,int M)
begin {
S:=0;R:=0; int s,r,i,j;
for i:=1 to N-1 do r=0;
if N mod i = 0 then S:=S+i; s=0;
for j:=1 toM-1 do for(i=1;i<N;i++)
if M mod j = 0 then R:=R+j; if(N%i==0) s+=i;
Amis:=((M=S) and (N=R)); for(j=1;j<M;j++)
end; if(M%j==0) r+=j;
return((M==s)&&(N==r));
}
Exercice 38
Ecrire une fonction paramétrée qui retourne l’inverse d’un nombre entier donné
end; n=n/10;
inverse:=inv; }
end; return(inv);
}
Exercice 39
Ecrire une fonction récursive permettant de calculer le PGDC de deux nombres entiers positifs A et B.
function pgdc(a,b:integer):integer; #include<stdio.h>
begin int pgdc(int A,int B)
if a>b then pgdc:=pgdc(a-b,b) {
else if a<b then pgdc:=pgdc(a,b-a) if(A>B) return(pgdc(A-B,B));
else pgdc:=a; else if(A<B) return(pgdc(A,B-A));
end; else return A;
}
Exercice 40
Ecrire une fonction récursive permettant de calculer le PPMC de deux nombres entiers positifs A et B.
function calcul_ppmc(A:integer,B:integer):integer; #include<stdio.h>
var multiple,k:integer; int ppmc(int A,int B)
begin {
if A<B then ppmc:=ppmc(B,A) int multiple,k;
else if(A<B) return(ppmc(B,A));
begin else{
multiple:=A; multiple=A;
k:=2; k=2;
end while(multiple%B!=0){
while multiple mod B<> 0 do multiple=A*k;
begin k++;
multiple:= A*k; }
k:=k+1; return(multiple);
end; }
}
ppmc:=multiple;
end;
end;
Exercice 41
Ecrire une fonction récursive qui permet de calculer le factoriel d’un nombre donné.
function Factoriel(N:integer):integer; include<stdio.h>
begin long fact(int n)
if N=0 then factoriel:=1 {
else if(n>1) return(fact(n-1)*n);
factoriel:= N*factoriel(N-1); else return 1;
end; }
Exercice 42
Ecrire une fonction récursive qui permet de calculer la puissance d’un entier donné.
function puissance(N:integer,k:integer):longint; #include<stdio.h>
begin long puiss(int n,int k)
if k=0 then puissance:=1 {
else if(k==0) return 1;
puissance:=N*puissance(N,k-1); else return (puiss(n,k-1)*n);
end; }
Exercice 43
Ecrire une fonction récursive qui calcule la valeur de la fonction d’Ackermann « A » définie pour m>0 et n>0
par :
I:=I+1; }
end;
NCHIFFRES:=I;
End;
Les procédures
Exercice 45
Ecrire une procédure qui permet de dessiner la lettre X, à l'aide d'espaces et d'une "lettre" fournie par
l'utilisateur, auquel on demande aussi la "hauteur" du dessin qu'il désire obtenir. Avec les réponses : a et 5, elle
donnera :
a a
a a
a
a a
a a
procedure DessX(hauteur:integer;lettre:char); void DessX(int hauteur,char lettre)
{ int no_ligne,i;
var no_ligne,i:integer; for(no_ligne=1;no_ligne<((hauteur+1)/2);no_ligne++)
begin {
for no_ligne:=1 to ((hauteur+1) div 2)-1 do for (i=1;i<no_ligne;i++)
begin printf("%c",' ');
for i:=1 to no_ligne-1 do printf("%c",lettre);
write(' '); for(i=0;i<hauteur-2*no_ligne;i++)
write(lettre); printf("%c",' ');
for i:=0 to (hauteur-2*no_ligne)-1 do printf("%c",lettre);
write(' '); printf("\n");
write(lettre); }
writeln; for(i=1;i<(hauteur+1)/2;i++)
end; printf("%c",' ');
for i:=1 to ((hauteur+1) div 2)-1 do printf("%c",lettre);
write(' '); printf("\n");
write(lettre); for(no_ligne=1;no_ligne<((hauteur+1)/2);no_ligne++)
writeln; {
for no_ligne:=1 to ((hauteur+1) div 2)-1 do for (i=0;i<(hauteur-2*no_ligne-1)/2;i++)
begin printf("%c",' ');
for i:=0 to ((hauteur-2*no_ligne-1) div 2)-1 do printf("%c",lettre);
write(' '); for(i=0;i<2*no_ligne-1;i++)
write(lettre); printf("%c",' ');
for i:=0 to (2*no_ligne-1)-1 do printf("%c",lettre);
write(' '); printf("\n");
write(lettre); }
writeln; }
end;
end;
Exercice 46
Soit un programme qui visualise un menu composé de trois rubriques : Hors d’œuvre, plat chaud et dessert.
Ecrire une procédure qui permet d’effectuer, à chaque fois, un choix exclusif.
program menu; #include<stdio.h>
uses crt; #include<conio.h>
procedure Plat(choix1,choix2,choix3:string); void plat(char choix1[10],char choix2[10],char
var choix:char; choix3[10])
begin {
choix:=readkey; char choix;
writeln; choix=getch();
write('-',choix,'-'); printf("-%c-",choix);
if choix=choix1[1] then writeln(choix1) if(choix==choix1[0]) printf("%s",choix1);
else if choix=choix2[1] then writeln(choix2) if(choix==choix2[0]) printf("%s",choix2);
else if choix=choix3[1] then writeln(choix3); if(choix==choix3[0]) printf("%s",choix3);
end; }
begin
clrscr;
plat('soupe','crudit','oeuf Dur');
plat('steak','poulet','hamburger');
plat('gateau','poire','fromage');
readln;
end.
Exercice 47
Ecrire une procedure paramétrée, qui permet l’échange des contenus de deux paramètres formels par valeur A et
B. Appeler cette procédure dans un programme principal.On écrira les résultats dans le corps de la procédure, et
dans le programme principal.
program exchange; include<stdio.h>
var A:real; #include<conio.h>
B: real; void echange(float x,float y)
procedure echange(x,y:real); {
var temp:real; float temp;
begin printf("Echange:%10.2f %10.2f",x,y);
writeln('Ecange:',x:10:2,y:10:2); temp=x;
temp:=x; x=y;
x:=y; y=temp;
begin for(j=1;j<=200;j++)
for j:=1 to 200 do {
begin for (S=0,i=1;i<=j-1;i++)
S:=0; {
for i:=1 to j-1 do if (!(j%i)) s+=i;
if (s==j ) printf(“%d\n”,j);
if( j mod i =0) then S:=S+I; }
if S=j then writeln(j); }
end;
end;
Exercice 51
Ecrire une procédure qui permet d’afficher tous les diviseurs d’un entier N ainsi que leur nombre.
procedure Diviseurs(N :integer) ; void Diviseurs(int N)
var i,nb:integer; { int nb=0 ;
begin printf(“les diviseurs de % sont \n”,N);
nb:=0; for( int i=1 ;i<=N ;i++)
writeln(‘Les diviseurs de ‘,N,’sont :’) ; if (!(N%i )){
for i:=1 to N do printf(‘’ %d\n”,i);
if N mod i =0 then nb+=1;}
begin printf(“le nombre de diviseurs de %d est%d”,N,nb);
writeln(i); }
nb:=nb+1;
end;
writeln(‘Le nombre de diviseurs de ‘,N,’est :’,nb);
end ;
Exercice 52
Exercice 53
Calculer pour une valeur X donnée du type float la valeur numérique d'un polynôme de degré n:
P(X) = AnXn + An-1Xn-1 + ... + A1X + A0
Les valeurs de n, des coefficients An, ..., A0 et de X seront entrées au clavier.
Utiliser le schéma de Horner qui évite les opérations d'exponentiation lors du calcul:
Ecrire une procédure qui affiche la table des produits pour N variant de 1 à 10 :
X*Y I 0 1 2 3 4 5 6 7 8 9 10
--------------------------------------------------
0 I 0 0 0 0 0 0 0 0 0 0 0
1 I 0 1 2 3 4 5 6 7 8 9 10
2 I 0 2 4 6 8 10 12 14 16 18 20
3 I 0 3 6 9 12 15 18 21 24 27 30
4 I 0 4 8 12 16 20 24 28 32 36 40
5 I 0 5 10 15 20 25 30 35 40 45 50
6 I 0 6 12 18 24 30 36 42 48 54 60
7 I 0 7 14 21 28 35 42 49 56 63 70
8 I 0 8 16 24 32 40 48 56 64 72 80
9 I 0 9 18 27 36 45 54 63 72 81 90
10 I 0 10 20 30 40 50 60 70 80 90 100
Ecrire une procédure qui met à zéro la diagonale d’une matrice carrée.
type matrice=array[1..50,1..50] of integer; typedef int ligne[50];
procedure mise_zero(var a:matrice;n:integer); typedef ligne matrice[50];
var i:integer; void mise_zero(matrice A,int n)
begin {int I;
for i:=1 to n do for (I=0; I<n; I++)
a[i,i]:=0; A[I][I]=0;
end; }
Exercice 57
Ecrire une procédure qui affiche l’occurrence d’existence d’un nombre réel dans une liste de nombres réels
Type tab=array[0..50] of real ; void occurrence(float a[],int n,float nbre)
Procedure occurrence(a:tab;n:integer;nbre:real); {int i,cpt;
Var i,cpt:integer; for(i=0,cpt=0;i<n;i++)
Begin if(a[i]==nbre) cpt++;
cpt:=0; printf("L'occurrence d'existence du nombre %f est
for i:=0 to n-1 do %d",nbre,cpt);
if a[i]=nbre then cpt:=cpt+1; }
writeln(‘L’’occurrence d’’existence du nombre
‘,nbre,’ est ’,cpt) ;
End;
Exercice 58
Ecrire une procédure qui met le plus petit élément d’une liste au début de celle-ci
type tab=Array[0..50] of real; void min_debut(float a[],int n)
procedure min_debut(var a:tab;n:integer); {int i,ind;
var i,ind:integer; float tmp;
tmp: real; for(i=1,ind=0;i<n;i++)
Ecrire une procédure qui classe une liste de notes de la plus petite à plus grande
type tab=Array[0..50] of real; void tri(float note[],int n)
procedure tri(var note:tab;n:integer); {int i,j,min;
var i,j,min:integer; float tmp;
tmp:real; for(i=0;i<n-1;i++)
begin {
for i:=0 to n-2 do for(min=i,j=i+1;j<n;j++)
begin if(note[j]<note[min]) min=j;
min:=i; if (min!=i)
for j:=i+1 to n-1 do { tmp=note[i];
if note[j]<note[min] then min:=j; note[i]=note[min];
if min<>i then note[min]=tmp;
begin }
tmp:=note[i]; }
note[i]:=note[min]; }
note[min]:=tmp;
end;
end;
end;
Exercice 61
Etant donné N étudiants, leurs notes correspondantes à M matières et leur moyenne. Ecrire une procédure qui
affiche à côté de chaque étudiant son classement.
type matrice=array[1..50,1..50]of real; void moyenne(float m[50][50],int tl,int tc)
procedure moyenne(var m:matrice;tl,tc:integer); {float s;
var i,j:integer; int i,j;
s:real; for (i=0;i<tl;i++)
begin {s=0;
for i:=1 to tl do for(j=0;j<tc-2;j++)
begin s+=m[i][j];
s:=0; m[i][tc-2]=s/(tc-2);
for j:=1 to tc-2 do }
s:=s+m[i,j]; }
m[i,tc-1]:=s/(tc-2);
end; void classement(float m[50][50],int tl,int tc)
end; {int te,i,cl=1,j,p[50],arret=0;
for(i=0;i<tl;i++)
procedure classement(var m:matrice;tl,tc:integer); m[i][tc-1]=0;
var te,i,j,cl:integer; do
p:array[1..50] of integer; {j=0;te=0;
arret:boolean; while(m[j][tc-1]!=0 && j<tl) j++;
begin if (m[j][tc-1]!=0) arret=1;
for i:=1 to tl do else
m[i,tc]:=0; {p[te++]=j;
arret:=false; for (j=p[te-1]+1;j<tl;j++)
cl:=1; if(m[j][tc-1]==0)
repeat {if(m[j][tc-2]>m[p[te-1]][tc-2])
begin {te=0;
j:=1; p[te++]=j;
te:=0; }
while (m[j,tc]<>0) and (j<=tl) do j:=j+1; else
if m[j,tc]<>0 then arret:=true if (m[j][tc-2]==m[p[te-1]][tc-2]) p[te++]=j; }
else for(i=0;i<te;i++)
begin m[p[i]][tc-1]=cl;
te:=te+1; cl+=te;
p[te]:=j; }
for j:= p[te]+1 to tl do }
if m[j,tc]=0 then while(!arret);
if m[j,tc-1]>m[p[te],tc-1] then }
begin
te:=1;
p[te]:=j;
end
else
if m[j,tc-1] = m[p[te],tc-1] then
begin
te:=te+1;
p[te]:=j;
end;
for i:=1 to te do
m[p[i],tc]:=cl;
cl:=cl+te;
end;
end;
until arret;
end;
Exercice 62
Le tri par bulles est un tri par échange. Le principe de base est de réordonner les couples non classés tant qu’ils
en existent. La méthode de tri par bulles consiste à parcourir la liste en comparant deux éléments successifs en
les permutant s’il y a lieu. Ecrire une procédure qui réalise ce tri.
Type tab=array[0..50] of integer ; void echanger(int t[],int i, int j)
Procedure echanger(var t:tab;i,j: integer); {int tmp=t[i];
Var tmp:integer; t[i]=t[j];
Begin t[j]=tmp;
tmp :=t[i]; }
t[i] :=t[j]; void tri_bulles (int t[], int n)
t[j] :=tmp; {int k,p;
End; for(k=0;k<=n-2;k++)
Procedure tri_bulles(var t: tab; n: integer); for(p=n-2;p>=k;p--)
Var p,k:integer; if(t[p+1]<t[p])
Begin echanger(t,p+1,p);
for k:=0 to n-2 do }
for p:=n-2 downto k do
if t[p+1]<t[p] then
echanger(t,p+1,p);
End;
Les chaînes de caractères :
Exercice 63
Un palindrome est un mot, ou une phrase, lisible indifféremment de la gauche vers la droite ou inversement.
Ecrire une fonction qui rend si une chaîne de caractères est un palindrome ou non.
Function palindrome(s:string):boolean; int palindrome (char s[])
Var i,taille :integer; {int i,taille;
miroir:string; char miroir[255];
begin taille=strlen(s);
taille :=length(s) ; for(i=0;i<taille;i++)
miroir:=’’; miroir[i]=s[taille-i-1];
for i:= 1 to taille do return(!strncmp(miroir,s,taille));
miroir:=miroir+s[taille-i+1]; }
palindrome :=(s=miroir) ; Remarque :
end ; Vous devez ajouter la ligne suivante au début de votre
programme : #include <string.h>, pour pouvoir utiliser
les fonctions strlen et strncmp.
Exercice 64
Ecrire une fonction qui retourne la fréquence de présence d’un mot dans une phrase.
Function frequence(phrase,mot:string):integer; int frequence (char phrase[],char mot[])
var cpt,debut:integer; {int cpt=0;
begin while (phrase=strstr(phrase,mot))
cpt:=0; {cpt++;
while pos(mot,phrase)<>0 do phrase=phrase+strlen(mot);
begin }
cpt:=cpt+1; return(cpt);
debut:=pos(mot,phrase); }
delete(phrase,1,length(mot)+debut); Remarque :
end; Vous devez ajouter la ligne suivante au début de votre
frequence:=cpt; programme : #include <string.h>, pour pouvoir utiliser
end; les fonctions strlen et strstr.
Exercice 65
Ecrire une procédure qui enlève tous les blancs au début d’une phrase et laisse un seul blanc entre les différents
mots de la phrase
procedure blanc(var s:string); void blanc (char s[ ])
var ind:integer; {
Exercice 67
Soit N un nombre donné en base B1 (B ≠ 10). Ecrire une fonction qui donne son équivalent en base 10.
Function valeur (c :char) :word ; int valeur(char c)
Begin { if((c<='9') && (c>='0'))
If c IN [‘0’..’9’] then return(c-'0');
valeur:=ord(c)-ord(‘0’) else
Else if ((toupper(c) >='A') && (toupper(c)<='F'))
If upcase(c) IN [‘A’..’F’] then return(toupper(c)-'A'+10);
valeur:=ord(upcase(c))-ord(‘A’)+10; }
End;
int b_dix(char n[],int b)
Function b_dix(n:string;b:word):word; {int i,res=0;
Var i:integer; for(i=0;i<strlen(n);i++)
res:word; res=res*b+valeur(n[i]);
Begin return(res);
res:=0; }
For i:=1 to length(n) do Remarque :
Delete(N1,Length(N1)-3,4); strcpy(n1+strlen(n1)-4,"");
End }
Else else
Begin {
S1:=N1; strcpy(s1,n1);
N1:=''; strcpy(n1,"");
End ; }
If Length(N2)>4 Then if(strlen(n2)>=4)
Begin {
S2:=Copy(N2,Length(N2)-3,4); strcpy(s2,n2+strlen(n2)-4);
Delete(N2,Length(N2)-3,4); strcpy(n2+strlen(n2)-4,"");
End }
Else else
Begin {
S2:=N2; strcpy(s2,n2);
N2:=''; strcpy(n2,"");
End ; }
Val(S1,V1,Code); v=atoi(s1)+atoi(s2)+r;
Val(S2,V2,Code); strcpy(s1,"");strcpy(s2,"");itoa(v,s,10);
V:=V1+V2+R; if(strlen(s)>4)
Str(V,S); {
If Length(S)>4 Then strncpy(t,s,1);
Begin r=atoi(t);
Val(Copy(S,1,1),R,Code); strcpy(s,s+1);
S:=Copy(S,2,Length(S)-1); }
End else
D’,’D’,’CM’,’M’); *romval[13]={"I","IV","V","IX","X","XL","L","XC","
const decval:array[1..13]of C",
integer=(1,4,5,9,10,40,50,90,100,400,500,900,1000); "CD","D", "CM", "M"};
begin const int decval[13]
rom:=''; ={1,4,5,9,10,40,50,90,100,400,500,900,1000};
for tok:=ntok downto 2 do rom[0] = '\0';
begin for (tok = ntok-1; tok >= 0; tok--) {
while dec>=decval[tok] do while (dec >= decval[tok]) {
begin strcat(rom, romval[tok]);
rom:=rom+romval[tok]; dec -= decval[tok];
dec:=dec-decval[tok]; }
end; }
end; }
end; Remarque :
Vous devez ajouter la ligne suivante au début de votre
programme : #include <string.h> pour pouvoir utiliser
la fonction strcat.
Exercice 72
Ecrire une fonction qui retourne le déterminant d’une matrice carrée.
const DIM=10; #define DIM 10
type matrice=array[0..DIM-1,0..DIM-1] of real; typedef float ligne[DIM];
procedure det_aux(ma:matrice;var typedef ligne matrice[DIM];
mb:matrice;l,c:integer;n:integer); float expo(int n)
var i,j,d,e:integer; {
begin if(!(n%2)){return (1);}
e:=0; return (-1);
x:real; {
begin det_aux(m,m2,i,0,l);
x:=0; x=x+(expo(i)*m[i][0]*determinant(m2,(l-1)));
if l=1 then determinant:= m[0][0] }
else return (x);
begin }
for i:=0 to l-1 do
begin
det_aux(m,m2,i,0,l);
x:=x+(expo(i)*m[i][0]*determinant(m2,(l-1)));
end;
determinant:=x;
end;
end;
Exercice 73
Ecrire une procédure qui calcule l’inverse d’une matrice carrée.
procedure transp_mat(ma:matrice;var void transp_mat(matrice ma,matrice mb,int n)
mb:matrice;n:integer); {
var i,j:integer; int i,j;
begin for (i=0;i<n;i++)
for i:=0 to n-1 do for (j=0;j<n;j++)
for j:=0 to n-1 do mb[j][i]=ma[i][j];
mb[j][i]:=ma[i][j]; }
end;
void multi_R(float a,matrice ma,matrice mb,int n)
procedure multi_R(a:real;ma:matrice;var {
fin:=n*n; c=(n+1)/2;
c:=(n+1) div 2; carre[l][c]=nombre;
carre[l,c]:=nombre; while(nombre!=fin)
while nombre<>fin do {
begin if(nombre%n==0) l++;
if nombre mod n =0 then inc(l) else
else {
begin if(l==1) l=n; else l--;
if l=1 then l:=n if(c==1) c=n; else c--;
else dec(l); }
if c=1 then c:=n nombre++;
else dec(c); carre[l][c]=nombre;
end; }
inc(nombre); }
carre[l,c]:=nombre;
end;
end;
Les enregistrements
Exercice 75
Ecrire un programme qui permet de saisir et d’afficher les informations d’une liste d’étudiants.
Program gest; #include <stdio.h>
#include <conio.h>
uses crt; typedef struct{
Type Date=record int j;
J,M,A:Integer; int m;
end; int a;
etud=record }date;
Nom,Prn:string[20]; typedef struct{
CIN:string[10]; char nom[21];
Date_Nais:Date; char prn[21];
End; char cin[11];
Var TEtud:Array[1..100] of etud; date date_naiss;
Te:Integer; }etud;
etud tetud[10];
Procedure Affich_formul(Titre:String); int te=0;
Begin
TextBackground(Blue); void affich_formul(char titre[])
ClrScr; {
TextColor(Yellow); textbackground(BLUE);
Gotoxy(35,4); clrscr();
Write(Titre); textcolor(YELLOW);
Gotoxy(20,7); gotoxy(35,4);
Write('Nom :'); cprintf("%s",titre);
Gotoxy(20,9); gotoxy(20,7);
Write('Pr‚nom :'); cprintf("Nom:");
Gotoxy(20,11); gotoxy(20,9);
Write('C.I.N :'); cprintf("Prenom");
Gotoxy(20,13); gotoxy(20,11);
Write('Date de Naissance :'); cprintf("C.I.N");
End; gotoxy(20,13);
cprintf("Date de naissance");
Rep:=readkey;
Gotoxy(45,17);
Clreol;
End;
End;
BEGIN
saisietout;
Affichtout;
ClrScr;
Readln;
END.
Exercice 76
Ecrire les procédures qui donnent le calcul sur les nombres complexes au moyen d’un type enregistrement.
type complexe=Record typedef struct{
a,b:real; float a;
end; float b;
}complexe;
procedure zsomme(z1,z2:complexe;var z : complexe);
begin void Zsomme(complexe z1,complexe z2,complexe *z)
z.a:=z1.a+z2.a; {z->a=z1.a+z2.a;
z.b:=z1.b+z2.b; z->b=z1.b+z2.b;
end; }
z.b:=z1.b-z2.b; }
end;
void Zmul(complexe z1,complexe z2,complexe *z)
procedure zmul(z1,z2 : complexe; var z:complexe); {z->a=z1.b*z2.b-z1.a*z2.a;
begin z->b=z1.a*z2.b+z2.b*z2.a;
z.a:=z1.b*z2.b-z1.a*z2.a; }
z.b:=z1.a*z2.b+z2.b*z2.a;
end;
tete:=nil; p->info=x;
while x<>0 do p->suivant=NULL;
begin if(L==NULL) L=p;
p^.info:=x; else{
p^.suivant:=tete; p->suivant=L; L=p;
tete:=p; }
new(p); scanf("%d",&x);
readln(x); }
end; }
end;
Exercice 79
Ecrire une procédure qui recherche un élément dans une liste chaînée
function rechercher (tete:liste;x:integer) :liste; liste rechercher(liste L,int x)
var p:liste; {
begin if(L!=NULL){
if tete=nil then recherche:=nil if(L->info==x) return L;
else if tete^.info=x then recherche:=tete else return(rechercher(L->suivant,x));
else recherche:=recherche(tete^.suivant,x); }
end; else return NULL;
}
procedure rech_elt (tete:liste;x:integer; var
pred:liste;var pos:liste); void recherch_elt(liste L,int x,liste &pos,liste &pred)
begin {
if tete=nil then if(L!=NULL){
begin if(L->info==x){
pos:=nil; pos=L;
pred:=nil; pred=NULL;
end }
else if tete^.info=x then else{
begin liste p=L;
pos:=tete; while((p->suivant! = NULL)&&(p->info!=x))
pred:=nil; {
end pred=p;
else p=p->suivant;
begin }
p:=tete; if(p->info==x) pos=p;
while (p^.suivant<>nil) and (p^.info<>x) do else pos=NULL;
begin }
pred:=p; }
p:=p^.suivant; }
end;
if p^.info=x then pos:=p
else pos:=nil;
end;
end;
Exercice 80
Ecrire une procédure qui insert un élément dans une liste chaînée
procedure inserer(var tete:liste;x:integer;position:liste); void inserer(liste &L,liste pos,int x)
var p,q:liste; {
begin liste p;
new(q); p=(liste)malloc(sizeof(str));
q^.info:=x; p->info=x;
q^.suivant:=nil; p->suivant=NULL;
if position=tete then if(L!=NULL){
begin if(pos==L){
q^.suivant:=tete; p->suivant=L;
tete:=q; L=p;
end }
else else{
begin liste q=L;
q^.suivant:=position; while(q->suivant!=pos)
p:=tete; q=q->suivant;
while p^.suivant<>position do p->suivant=pos;
p:=p^.suivant; q->suivant=p;
}
p^.suivant:=q; }
end; }
end;
procedure insere(var
tete:liste;x:integer;position:liste;pred:liste);
var q:liste;
begin void insere(liste &L,liste pos,liste pred,int x)
new(q); {
q^.info:=x; liste p;
q^.suivant:=nil; p=(liste)malloc(sizeof(str));
if position=tete then p->info=x;
begin p->suivant=NULL;
q^.suivant:=tete; if(L!=NULL){
tete:=q; if(pos==L){
end p->suivant=L;
else L=p;
begin }
q^.suivant:=position; else{
pred^.suivant:=q; p->suivant=pos;
end; pred->suivant=p;
end; }
}
}
Exercice 81
Ecrire une procédure qui élimine un élément d’une liste chaînée
procedure eliminer(var tete:liste;x:integer); void supprimer(liste &L,int x)
var trouve:boolean; {
q,p:liste; int trouve =1;
begin liste p,q;
p:=tete; p=L;
trouve:=false; q=L;
while(not trouve)and(p<>nil) do while((trouve)&&(p!=NULL)){
begin if(p->info==x) trouve=0;
if p^.info=x then trouve:=true else {
else q=p;
begin p=p->suivant;
q:=p; }
p:=p^.suivant; }
end; if(trouve==0){
end; if(p==L) L=p->suivant;
if trouve then q->suivant=p->suivant;
if p=tete then tete:=p^.suivant free(p);
else q^.suivant:=p^.suivant; }
dispose(p); }
end;
void supprime(liste &L,liste pos,liste pred)
{
procedure elimine(var tete:liste;pos:liste;pred:liste); if(pos==L) L=pos->suivant;
begin else pred->suivant =pos->suivant;
if pos=tete then tete:=pos^.suivant free(pos);
else pred^.suivant:=pos^.suivant; }
dispose(pos);
end;
void afficher(liste L)
procedure afficher_liste(tete:liste); {
var p:liste; liste p=L;
begin printf("\n la liste est:\n");
p:=tete; while(p!=NULL){
while p<>nil do printf("\n%d",p->info);
begin p=p->suivant;
writeln('- ',p^.info); }
p:=p^.suivant; }
end;
end;
Exercice 82
Ecrire une procédure qui empile un élément dans une pile représentée par une liste chaînée
procedure empiler(var tete:liste;x:integer); void empiler(liste &L,int x)
var p:liste; {
begin new(p); liste p=(liste)malloc(sizeof(str));
p^.info:=x; p->info=x;
p^.suivant:=tete; p->suivant=L;
tete:=p; L=p;
end; }
Exercice 83
Ecrire une procédure qui désempile un élément dans une pile représentée par une liste chaînée
procedure desempiler(var tete:liste); void desempiler(liste &L)
begin {
if tete<>nil then liste p;
begin p=L;
p:=tete; L=p->suivant;
tete:=tete^.suivant; free(p);
dispose(p); }
end;
end;
2. les listes doublement chainées
type liste=^element; typedef struct str{
element=record int info;
info:integer; str*suivant;
suivant,precedent:liste; str*pred;
end; }*liste;
Exercice 84
Ecrire une procédure qui permet la création d’une liste doublement chaînée
procedure creation(var tete:liste;var Queue:liste); void creation(liste &L,liste &Qu)
var p,q:liste; {
x:integer; int x;
begin printf("entrer des entiers (0 pour terminer):");
new(p); scanf("%d",&x);
write('donner des entiers (0 pour terminer) : '); while(x!=0){
readln(x); liste p=(liste)malloc (sizeof(str));
tete:=nil; p->info=x;
while x<>0 do p->suivant=NULL;
begin Qu=p;
p^.info:=x; if(L==NULL){
p^.suivant:=nil; p->pred=NULL;
Queue:=p; L=p;
if tete=nil then }
begin else{
p^.precedent:=nil; liste q=L;
tete:=p while(q->suivant!=NULL) q=q-
end >suivant;
else q->suivant=p;
begin p->pred=q;
q:=tete; }
while q^.suivant<>nil do scanf("%d",&x);
q:=q^.suivant; }
q^.suivant:=p; }
p^.precedent:=q;
end;
new(p);
readln(x);
end;
end;
Exercice 85
Ecrire une procédure qui recherche un élément dans une liste doublement chaînée
function rechercher(tete:liste;x:integer) :liste; liste rechercher(liste L,int x)
var p:liste; {
begin if(L!=NULL){
if tete=nil then recherche:=nil if(L->info==x) return L;
else if tete^.info=x then recherche:=tete else return(rechercher(L->suivant,x));
else recherche:=recherche(tete^.suivant,x); }
end; else return NULL;
}
function rechercher (tete:liste;
Queue:liste;x:integer):liste;
begin liste rechercher(liste L,liste Qu,int x)
if tete=nil then rech:=nil {
else if tete^.info=x then rech:=tete if(L->pred!=Qu){
else if Queue^.info=x then rech:=Queue if(L->info==x) return L;
else rech:=rech(tete^.suivant,Queue^.precedent,x); else if(Qu->info==x) return Qu;
end; else return(rechercher(L->suivant , Qu-
>pred,x));
}
else return NULL;
}
Exercice 86
Ecrire une procédure qui insert un élément dans une liste doublement chaînée
procedure inserer(var tete:liste;x:integer;position:liste); void inserer(liste&L,int x,liste pos)
var p,q:liste; {
begin liste p=(liste)malloc(sizeof(str));
new(q); p->info=x;
q^.info:=x; if(L!=NULL){
q^.suivant:=nil; if(pos==L){
if position=tete then
begin p->pred=NULL;
q^.precedent:=tete^.precedent; p->suivant=L;
q^.suivant:=tete; L->pred=p;
position^.precedent:=p; L=p;
tete:=q; }
end else{
else if position=nil then p->suivant=pos;
begin p->pred=pos->pred;
p:=tete; pos->pred->suivant=p;
while p^.suivant<>nil do pos->pred=p;
p:=p^.suivant; }
p^.suivant:=q; }
q^.precedent:=p; }
end
else
begin
q^.suivant:=position;
q^.precedent:=position^.precedent;
position^.precedent^.suivant:=q;
position^.precedent:=q;
end;
end;
Exercice 87
Ecrire une procédure qui élimine un élément d’une liste doublement chaînée
procedure eliminer(var tete:liste;position:liste); void supprimer(liste &L,liste pos)
var q,p:liste; {
begin if(L!=NULL){
if position=tete then if(pos==L){
begin pos->suivant->pred=NULL;
position^.suivant^.precedent:=nil; L=pos->suivant;
tete:=position^.suivant; free(pos);
end }
else if position^.suivant=nil then else if(pos->suivant==NULL){
position^.precedent^.suivant:=nil pos->pred->suivant=NULL;
else free(pos);
begin }
position^.precedent^.suivant:=position^.sui else{
vant; pos->pred->suivant=pos->suivant;
position^.suivant^.precedent:=position^.pre pos->suivant->pred=pos->pred;
cedent; free(pos);
end; }
dispose(position); }
end; }
begin else{
p^.info:=x; liste q=L;
if tete=nil then while(q->suivant!=L) q=q->suivant;
tete:=p q->suivant=p;
else }
begin p->suivant=L;
q:=tete; scanf("%d",&x);
while q^.suivant<>tete do }
q:=q^.suivant; }
q^.suivant:=p;
end;
p^.suivant:=tete;
new(p);
readln(x);
end;
end;
Exercice 89
Ecrire une fonction qui recherche un élément dans une liste chaînée circulaire
function recherche(tete:liste; x:integer) :liste; liste rechercher(liste L,int x)
var p:liste; {
begin if(L!=NULL){
if tete<>nil then liste p=L;
begin do{
p:=tete; if(p->info==x) return p;
while (p^.suivant<>tete) and (p^.info<>x) do p=p->suivant;
p:=p^.suivant; }while(p!=L);
if p^.info=x then recherche:=p return NULL;
else recherche:=nil; }
end; return NULL;
end; }
Exercice 90
Ecrire une procédure qui insert un élément dans une liste chaînée circulaire
procedure inserer(var tete:liste;x:integer;position:liste); void inserer(liste &L,liste pos,int x)
var p,q:liste; {
begin liste q;
if tete<>nil then liste p=(liste)malloc(sizeof(str));
begin p->info=x;
new(q); if(L!=NULL){
q^.info:=x; if(pos==L){
if position=tete then q=L;
begin p->suivant=L;
p:=tete;
while p^.suivant<>tete do while(q->suivant!=L) q=q->suivant;
p:=p^.suivant; q->suivant=p;
p^.suivant:=q; L=p;
q^.suivant:=tete; }
tete:=q; else if(pos==NULL){
end q=L;
else if position=nil then while(q->suivant!=L) q=q->suivant;
begin q->suivant=p;
p:=tete; p->suivant=L;
while p^.suivant<>tete do }
p:=p^.suivant; else{
p^.suivant:=q; q=L;
q^.suivant:=tete; while(q->suivant!=pos) q=q-
end >suivant;
else q->suivant=p;
begin p->suivant=pos;
q^.suivant:=position; }
p:=tete; }
while p^.suivant<>position do }
p:=p^.suivant;
p^.suivant:=q;
end;
end; end;
Exercice 91
Ecrire une procédure qui élimine un élément d’une liste chaînée circulaire
procedure eliminer(var tete:liste;position:liste); void supprimer(liste &L,liste pos)
var q,p:liste; {
begin liste p;
if tete<>nil then if(L!=NULL){
begin if(pos==L){
if position=tete then p=L;
begin while(p->suivant!=L) p=p->suivant;
p:=tete; p->suivant=pos->suivant;
while p^.suivant<>tete do p:=p^.suivant; L=pos->suivant;
p^.suivant:=tete^.suivant; free(pos);
tete:=tete^.suivant; }
dispose(position); else{
end p=L;
else while(p->suivant!=pos) p=p-
begin >suivant;
p:=tete; p->suivant=pos->suivant;
while p<>position do free(pos);
begin }
q:=p; }
p:=p^.suivant; }
end;
q^.suivant:=position^.suivant;
dispose(position);
end;
end;
end;
Exercice 92
Un paragraphe est une suite de phrases. Une phrase est une suite de mots qui se termine par un point(‘.’). deux
mots sont séparés par un blanc(‘ ’).
Dans cet exercice on représentera un paragraphe par une liste chainée, et aussi une phrase par une liste chainnée.
1- Ecrire une procédure qui permet la création d’une telle représentation.
2- Ecrire une procédure qui permet la recherche de la première occurrence d’un mot dans le paragraphe. Le
résultat de la recherche donne la position de ce mot.
3- Ecrire une procédure qui permet l’insertion d’un mot M1 après un mot M2 donnée. Si le mot ne se trouve
pas dans le paragraphe, on ne fait pas d’insertion.
while p^.suivant<>nil do }
begin printf("%s.",p->info);
write(p^.info,' ' ); }
p:=p^.suivant;
end; void creer_paragraphe(para&Pa)
write(p^.info,'.'); {
end; para p,q;
end; ligne L;
char rep;
procedure creation_paragraphe(var Pa:para); do{
var p,q:para; L=NULL;
L:ligne; creer_ligne(L);
rep:string; p=(para)malloc(sizeof(str1));
begin p->line=L;
repeat p->suivant=NULL;
L:=nil; if (Pa==NULL) Pa=p;
creation_ligne(L); else{
new(p); q=Pa;
p^.line:=L; while(q->suivant!=NULL) q=q-
p^.suivant:=nil; >suivant;
if Pa=nil then Pa:=p q->suivant=p;
else }
begin getchar();
q:=Pa; printf("voulez vous continuer(o/n)? ");
while q^.suivant<>nil do q:=q^.suivant; scanf("%c",&rep);
q^.suivant:=p; }while(rep=='o');
end; }
write('voulez vous continuer?(oui/non)
');readln(rep); void afficher_paragraphe(para Pa)
until (rep='non'); {
end; para p=Pa;
while(p!=NULL){
procedure afficher_paragraphe(Pa:para); afficher_ligne(p->line);
var p:para; p=p->suivant;
begin }
if Pa<>nil then }
begin
p:=Pa; void chercher(para Pa,char*mot,para&P, ligne &L)
{
while p<>nil do int trouve=0;
begin para q=Pa;
afficher_ligne(p^.line); while((q!=NULL)&&(!trouve)){
writeln; P=q ;
p:=p^.suivant; ligne l=q->line;
end; while((l!=NULL)&&(!trouve)){
end; if(!strcmp(l->info,mot)) {
end; trouve=1;
L=l;
procedure rechercher(Pa:para;mot:string;var p:para;var }
l:ligne); l=l->suivant;
var q:para; }
r:ligne; q=q->suivant;
trouve:boolean; }
begin }
trouve:=false;
if Pa<>nil then void inserer(para Pa,char*M1,char*M2)
begin {
q:=Pa; ligne q,r,l;
while (q<>nil)and(not trouve) do para p;
begin if(p!=NULL){
r:=q^.line; r=(ligne)malloc(sizeof(str1));
while(r<>nil)and(not trouve) do strcpy(r->info,M2);
begin r->suivant=NULL;
if r^.info = mot then chercher(Pa,M1,p,q);
begin l=p->line;
l:=r; l=q;
p:=q; r->suivant=l->suivant;
trouve:=true; l->suivant=r;
end }
else }
r:=r^.suivant;
end; void supprimer(para &Pa,char*mot)
q:=q^.suivant; {
end; ligne l,q;
end; para p;
end; if(Pa!=NULL){
chercher(Pa,mot,p,q);
procedure inserer(Pa:para;M1,M2:string); if(q==p->line){
var q,r,l:ligne;
p:para; p->line=q->suivant;
begin free(q);
if p<>nil then }
begin else{
new(r); l=p->line;
r^.info:=M2; while(l->suivant!=q) l=l->suivant;
r^.suivant:=nil; l->suivant=q->suivant;
rechercher(Pa,M1,p,q); free(q);
l:=p^.line; }
l:=q; }
r^.suivant:=l^.suivant; }
l^.suivant:=r;
end; para rechercher_phrase(para Pa,char*M1)
end; {
para p;
procedure supprimer(var Pa:para;M1:string); ligne q;
var p:para; p=Pa;
q,l:ligne; if(Pa!=NULL){
begin while(p!=NULL){
if Pa<>nil then q=p->line;
begin if(!strcmp(q->info,M1))
rechercher(Pa,M1,p,q); return(p);
if q=p^.line then p=p->suivant;
p^.line:=q^.suivant }
else return NULL;
begin }
l:=p^.line; return NULL;
while l^.suivant<>q do }
l:=l^.suivant;
l^.suivant:=q^.suivant; void inserer_phrase(para Pa,ligne l,char*M1)
end; {
dispose(q); para p,q,r;
end; if(Pa!=NULL){
end; q=(para)malloc(sizeof(str2));
q->line=l;
function rechercher_phrase(Pa:para;M1:string):para; q->suivant=NULL;
var p:para; p=rechercher_phrase(Pa,M1);
q:ligne; if(p!=NULL){
trouve:boolean; q->suivant=p->suivant;
begin p->suivant=q;
p:=Pa; }
trouve:=false; else{
if p<>nil then r=Pa;
begin while(r->suivant!=NULL) r=r-
while(p<>nil) and (not trouve)do >suivant;
begin r->suivant=q;
if(p^.line^.info=M1) then }
begin }
rechercher_phrase:=p; }
trouve:=true;
end void supprimer_phrase(para&Pa,ligne l)
else {
p:=p^.suivant;
end; para p,q,m;
end; ligne r;
end; p=rechercher_phrase(Pa,l->info);
if(p==Pa){
procedure inserer_phrase ( Pa:para ; l:ligne ; Pa=p->suivant;
M1:string); free(p);
var p,q,r:para; }
begin else{
if Pa<>nil then q=Pa;
begin while((q!=NULL)&&(q->line!=p->line)){
new(q); m=q;
q^.line:=l; q=q->suivant;
q^.suivant:=nil; }
p:=rechercher_phrase(Pa,M1); if(q!=NULL){
if p<>nil then m->suivant=q->suivant;
begin free(p);
q^.suivant:=p^.suivant; }
p^.suivant:=q; }
end }
else
begin
r:=Pa;
while r^.suivant<>nil do r:=r^.suivant;
r^.suivant:=q;
end;
end;
end;
d:Noeud;
end;
Exercice 93
Ecrire la procédure du parcours d’un arbre binaire en préordre.
procedure preordre(A:Noeud); void preordre(Noeud A)
begin {
if A<>nil then if(A!=NULL){
begin printf("%d ",A->cle);
write(A^.cle,' '); preordre(A->g);
preordre(A^.g); preordre(A->d);
preordre(A^.d); }
end; }
end;
Exercice 94
Ecrire la procédure du parcours d’un arbre binaire en postordre.
procedure postordre(A:Noeud); void postordre(Noeud A)
begin {
if A<>nil then if(A!=NULL){
begin postordre(A->g);
postordre(A^.g); postordre(A->d);
postordre(A^.d); printf("%d ",A->cle);
write(A^.cle,' '); }
end; }
end;
Exercice 95
Ecrire la procédure du parcours d’un arbre binaire en ordre.
Exercice 97
Ecrire une procédure qui insert un élément dans un arbre ordonné horizontalement
procedure insertion(var A:Noeud;x:integer); void insertion(Noeud &A,int x)
var N:Noeud; {
begin Noeud p=(Noeud)malloc(sizeof(str));
new(N); p->cle=x;
N^.cle:=x; p->g=NULL;
N^.g:=nil; p->d=NULL;
N^.d:=nil; if (A==NULL) A=p;
if A=nil then A:=N else{
else if(A->cle>x) insertion(A->g,x);
begin else insertion(A->d,x);
if x<A^.cle then insertion(A^.g,x) }
else insertion(A^.d,x); }
end;
end;
Exercice 98
Ecrire une procédure qui supprime un élément dans un arbre ordonné horizontalement
procedure suppression(var A:Noeud;x:integer); void suppression(Noeud &A,int x)
var pt,pd,pg:Noeud; {
begin Noeud pt,pg,pd;
if A<>NIL then if(A!=NULL){
begin if(A->cle==x){
if A^.cle=x then pt=A->d;
begin if (pt!=NULL){
pt:=A^.d; while(pt!=NULL){
else A^.g:=A^.g^.g; }
end pd->d=A->d->d;
else A->d=A->d->g;
if x=A^.d^.cle then }
begin else A->d=A->d->d;
pt:=A^.d^.g; }
if pt<>nil then else{
begin if(x<A->cle) suppression(A->g,x);
while pt<>nil do else suppression(A->d,x);
begin }
pd:=pt; }
pd:=pt^.d; }
end;
pd^.d:=A^.d^.d;
A^.d:=A^.d^.g;
end
else A^.d:=A^.d^.d;
end
else
if x<A^.cle then suppression(A^.g,x)
else suppression(A^.d,x);
end;
end;
Les Fichiers
Exercice 99
Ecrire un programme qui permet de créer un fichier d’étudiants.
End; clreol();
End; scanf("%d",&E.date_nais.A);
}
Procedure Ajout;
Var E:Etud; void ajout()
Rep:Char; {
Begin etudiant E;
Assign(Fetud,'C:\Gestion'); int rep;
{$I-} FILE*Fetud=fopen("Gestion","ab");
Reset(Fetud); affich_formul("SAISIE");
{$I+} do{
If IOResult<>0 Then Rewrite(Fetud) saisie(E);
Else Seek(Fetud,FileSize(Fetud)); fwrite(&E,sizeof(etudiant),1,Fetud);
Affich_formul('S A I S I E'); textcolor(YELLOW);
Repeat gotoxy(45,17);
Saisie(E); cprintf("voulez_vous continuez(o/n)?");
Write(Fetud,E); clreol();
TextColor(Yellow); flushall();
Gotoxy(45,17); rep=getchar();
Write('Voulez-vous continuez (O/N)?'); }while(rep=='o' || rep=='O');
Rep:=readkey; fclose(Fetud);
Gotoxy(45,17); }
Clreol; void affich(etudiant &E)
Until Rep In ['N', 'n']; {
Close(Fetud); textcolor(WHITE);
End; gotoxy(26,7);
clreol();
Procedure Affich(Var E:Etud); cprintf("%s",E.nom);
Begin gotoxy(29,9);
TextColor(White); clreol();
With E, Date_Nais Do cprintf("%s",E.prn);
Begin gotoxy(28,11);
Gotoxy(26,7); clreol();
Clreol; cprintf("%s",E.cin);
Write(Nom); gotoxy(40,13);
Gotoxy(29,9); clreol();
Clreol; cprintf("%d/%d/%d",E.date_nais.J,
Write(Prn); E.date_nais.M,E.date_nais.A);
Gotoxy(28,11); }
Clreol;
Write(CIN); void affichtout()
Gotoxy(40,13); {
Clreol; etudiant E;
Write(J,'/',M,'/',A); FILE*Fetud=fopen("Gestion","rb");
End; if (Fetud==NULL) return;
End; affich_formul("CONSULTATION");
do{
Procedure Affichtout; fread(&E,sizeof(etudiant),1,Fetud);
Var E:Etud; affich(E);
Rep:Char; textcolor(YELLOW);
I:Integer; gotoxy(45,17);
Begin cprintf("Tapez une Entree pour
Assign(Fetud,'C:\Gestion'); continuer");
{$I-} getch();
Reset(Fetud); gotoxy(45,17);
{$I+} }while(!feof(Fetud));
If IOResult<>0 Then write('Probleme de lecture !!!!') fclose(Fetud);
Else }
Begin
Affich_formul('C O N S U L T A T I O N'); void main()
Repeat {
Read(Fetud,E); ajout() ;
Affich(E); affichtout() ;
TextColor(Yellow); clrscr() ;
Gotoxy(45,17); getch() ;
Write('Taper une touche pour continuer'); }
Rep:=readkey;
Gotoxy(45,17);
Clreol;
Until EOF(Fetud);
Close(Fetud);
End;
End;
BEGIN
Ajout;
Affichtout;
ClrScr;
Readln;
END.
Exercice 100
Ecrire une procedure qui permet de modifier les informations d’un etudiant
Procedure Modif; void modif()
Var N: Integer; {
E:Etud; int i;
Begin char*CIN;
Assign(Fetud,'C:\Gestion'); char nom[20],prn[20],cin[10];
{$I-} int J,M,A;
Reset(Fetud); etudiant E;
{$I+} etudiant *Et;
If IOResult<>0 Then write('Probleme de lecture !!!!') FILE*Fetud=fopen("Gestion","rb");
Else FILE*f=fopen("tmptmp.$$","wb");
Begin textcolor(YELLOW);
ClrScr; textbackground(BLUE);
Write('Donner le numero d''ordre de l''etudiant a clrscr();
modifier'); if(Fetud==NULL) return;
readln(N); cprintf("Donnez le C.I.N de l'etudiant a modifier:
Seek(Fetud,N-1); ");
Read(Fetud,E); scanf("%s",CIN);
With E do getch();
Begin i=fread(&E,sizeof(etudiant),1,Fetud);
Write('Nom : ',Nom); while((strcmp(E.cin,CIN))&&(i!=0)){
Readln(Nom); fwrite(&E,sizeof(etudiant),1,f);
Write('Pr‚nom : ',Prn); i=fread(&E,sizeof(etudiant),1,Fetud);
Readln(Prn); }
i=fread(&E,sizeof(etudiant),1,Fetud);
}
fclose(f);
fclose(Fetud);
remove("Gestion");
rename("tmptmp.$$","Gestion");
}
GESTION DE L’ÉCRAN
I. Notion de fenêtre
On peut définir une fenêtre dans un écran. L’écran actif sera réduit à cette
fenêtre.
WINDOW(x1,y1,x2,y2) où :
• x1 et y1 représentent les coordonnées du coin supérieur gauche de la
fenêtre.
• x2 et y2 représentent les coordonnées du coin inférieur droit de la
fenêtre.
Couleu
N° N° Couleur N° Couleur N° Couleur
r
0 Noir 4 Rouge 8 Gris foncé 12 Rouge clair
1 Bleu 5 Magenta 9 Bleu clair 13 Magenta
2 Vert 6 Brun 10 Vert clair 14 Jaune
3 Cyan 7 Gris clair 11 Cyan clair 15 Blanc
CONCLUSION
RÉFÉRENCES