Exercices en Pascal
Exercices en Pascal
Exercices en Pascal
Dpartement dInformatique
Rabat
Lazrak Chamae
Razzoug Milouda
Anne
universitaire : 2003 / 2004
A loccasion de la
prsentation de ce travail,
nous tenons exprimer notre
gratitude et notre
reconnaissance Mr . Brahim
Lamharchi, notre encadrant
de projet de fin dtude
lEcole Normale Suprieure de
Rabat pour les conseils quil
nous a prodigus tout au long
de ce travail.
Sommaire
Introduction..........................................................................................................................1
lments de base dun programme en Pascal et en C.........................................................3
I- Structure dun programme...............................................................................................3
I-1. En langage Pascal..................................................................................................3
I-2. En langage C.........................................................................................................4
II- Types de donnes............................................................................................................4
II-1. Variables et constantes.........................................................................................4
II-1.1 Les variables..................................................................................................4
II-1.2 Les constantes................................................................................................6
II-2. Les types de base.................................................................................................7
II-2.1 En langage Pascal..........................................................................................7
II-2.2 En langage C..................................................................................................8
II-3. Crer un type de donne......................................................................................8
II-3.1 En langage Pascal..........................................................................................8
II-3.2 En langage C..................................................................................................9
III- Oprateurs et expressions..............................................................................................9
III-1. En langage Pascal...............................................................................................9
III-2. En langage C.....................................................................................................11
IV- Instructions simples.....................................................................................................14
IV-1. Instruction dentre...........................................................................................14
IV-2. Instructions de sortie.........................................................................................16
IV-3. Instruction daffectation...................................................................................17
V- Enonc des exercices....................................................................................................18
Structures de traitement alternatives et itratives..............................................................19
I- Instructions conditionnelles...........................................................................................19
II- Instructions rptitives..................................................................................................21
III- Enonc des exercices...................................................................................................22
Notion de sous-programmes..............................................................................................26
I. En langage Pascal...........................................................................................................26
I.1 Les procdures......................................................................................................26
INTRODUCTION
Langage Pascal
Langage C
Choix du sujet
Objectif
Notre objectif cest de palier aux difficults que le programmeur (universitaire,
lve ingnieur, analyste-programmeur, etc.) puisse rencontrer au moment de son
apprentissage en lui proposant une srie dexercices diversifis et couvrant la
totalit des notions de base de la programmation. On lui propose aussi, la fin du
document, toutes les solutions des exercices proposs en Pascal et en C.
I-2. En langage C
1- Prambule dclaratif qui comporte :
Exemple : int x ;
En langage Pascal
En langage C
Syntaxe : <type> <identificateur> ;
Selon l'endroit o on dclare une variable, celle-ci pourra tre accessible (visible)
de partout dans le code ou bien dans une portion confine de celui-ci ( l'intrieur
d'une fonction par exemple), on parle de porte (ou visibilit) d'une variable.
Lorsqu'une variable est dclare l'extrieur 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 dclare une variable l'intrieur d'un bloc d'instructions (entre des
accolades), sa porte se confine l'intrieur du bloc dans lequel elle est dclare.
En langage Pascal
Remarque
Contrairement aux variables, il n'est nullement besoin de spcifier le type de la
constante. On peut tout de mme le faire, en utilisant le double point, comme
pour les variables.
Exemple : const Gravite : Real = 9.81;
En langage C
Mmoire
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 rels 2.9E-39 1.7E38 6 octets
789.457851
Nombres dcimaux 3.1415926; 178
Single 1.5E-45 3.4E38 4 octets
(simple prcision) 925.455678
54.5899; 9 897
Nombres dcimaux
Double 5E-324 1.7E308 669 8 octets
(double prcision)
651.45568959
3.14159265458;
Extended Nombres rels 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 caractres au
Chane de 'Hello!'; 'Allez- 256
String maximum (0
caractres vous bien ?' octets
255)
Chane de n n caractres String[6]-
String[n] n octets
caractres maximum >'Hello!'
1 caractre
Char 1 caractre 'R' 1 octet
maximum
II-2.2 En langage C
Taille (en
Type de donnes Signification Plage de valeurs accepte
octets)
Char Caractre 1 -128 127
Caractre 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 (rel) 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 crer ses propres types. Les types doivent tre
dclars avec le mot-clef Type fortiori avant la dclaration des variables.
Exemple
Type matrice = Array[1..10,1..10] of integer;
Dfinit un type nomm matrice pour reprsenter une matrice carre dordre 10.
Type numr
Dans la dclaration dun type numr, il faut numrer toutes les valeurs de ce
type.
Syntaxe : type nom_du_type = (identificateur_1, identificateur_2,..,
identificateur_n)
Type intervalle
Syntaxe : type nom_du_type = dbut_de_l_intervalle..fin_de_l_intervalle
Exemple : Type age = 1..150 ;
Dclare un type nomm age dont les valeurs sont des entiers compris entre 1 et
150.
II-3.2 En langage C
Le type numr
Le type numr donne une liste de constantes par numration. Le premier
identificateur a, par dfaut, la valeur 0, le second a la valeur 1, etc. Une variable
de type numr est une variable entire.
Exemple :
typedef enum = {JAUNE = -2, ROUGE, VERT, VIOLET, BLEU} COULEUR;
main()
{
COULEUR coul1, coul2;
coul1 = VERT; // coul1 = 0
coul2 = coul1+2; // coul2 = 2
}
Une expression logique est la compose dexpressions logiques simples par les
oprateurs logiques :
III-2. En langage C
Oprateurs arithmtiques
Une expression peut comporter des oprations. Les objets dune opration sont
les oprandes, qui sont manipuls par les oprateurs.
Ces oprateurs travaillent sur des oprandes ayant deux valeurs : nul (faux) et
non-nul (vrai). Le rsultat est soit nul (faux), soit non-nul (vrai).
L'oprateur && (ET logique) a pour rsultat vrai si les deux oprandes ont une
valeur vraie. L'oprateur || (OU logique) a pour rsultat vrai si l'un au moins des
deux oprandes a une valeur vraie. Les valuations des oprations logiques sont
effectues de la gauche vers la droite. On peut imposer un ordre en utilisant des
parenthses. L'valuation cesse ds que la valeur de l'expression est tablie.
Exemple : i++
Oprateur conditionnel
Syntaxe : expr1?expr2:expr3;
expr1 est value. Si elle est vraie, le rsultat est la valeur de expr2, sinon le
rsultat est la valeur de expr3.
Exemple : a==b?a=2:b=3;
Les oprandes de ces oprateurs doivent tre de type entier (char, int, long,
short), mais ils sont traits comme une suite de bits (donc de 0 et de 1).
L'oprateur ~ remplace chaque 0 par 1 et vice-versa.
Les oprateurs &, ^ et ! oprent sur chaque bit indpendamment. Ils sont
associatifs.
expr1 << expr2 dcale tous les bits de expr1 de expr2 positions vers la gauche ;
les bits vacant sont remplis par des 0.
expr1 >> expr2 dcale 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 implmentations, il insre 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 oprateurs sur les bits & et | et les oprateurs
sur les expressions && et ||.
Oprrateur sizeof
Les priorits entre oprateurs dfinissent l'ordre dans lequel ils sont excuts. Le
tableau suivant rcapitule tous les oprateurs avec leur priorit.
En langage C, un certain nombre de notations servant rfrencer des objets sont
considres comme des oprateurs et, en tant que tels, soumises des rgles de
priorit.
Ce sont essentiellement :
- les rfrences des lments dun tableau ralises par [ ] ;
- des rfrences des champs dune structure oprateur -> ;
- des oprateurs dadressage * et &.
Ces oprateurs seront tudis ultrieurement dans les chapitres correspondant
aux tableaux, structures et pointeurs.
Catgorie Oprateurs
rfrence () [ ] -> .
unaire + - ++ -- | ~ * &
arithmtique */%
arithmtique +-
dcalage << >>
relationnels < <= > >=
relationnels == !=
manip. de bits &
manip. de bits ^
manip. de bits |
logique &&
logique ||
conditionnel ?:
affectation = += -= /= %= &= ^= |= <<= >>=
En langage Pascal:
Syntaxe :
Read (V1, V2,., Vn) O Vi est une variable de tout type simple (sauf
numr) ou de type chane de caractres.
ReadLn (V1,V2,...Vn) mme effet que Read, mais il faut taper la touche
Entre aprs lentre de la donne. Linstruction ReadLn (sans argument)
attend la frappe de la touche Entre au clavier.
Exemple : read(x) ;
En langage C:
La fonction scanf
Syntaxe : scanf (format, liste_dadresses)
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 chane de caractres
u unsigned int
Liste_dadresses : liste de "lvalue", spares par des virgules, dun type en
accord avec le code de format correspondant.
La macro getchar()
En Pascal
Syntaxe
Remarque :
Une constante chane de caractres est mise entre apostrophe. Une
apostrophe comprise dans une chane doit tre ddouble.
Linstruction WriteLn (sans arguments) permet un saut de ligne.
En langage C :
La fonction printf
Syntaxe : printf (format, liste_dexpressions)
La macro putchar
Permet lcriture dun caractre. Lexpression putchar(c), joue le mme rle que :
printf("%c",c).
Cette instruction permet de transcrire une valeur dans une variable. Le symbole
daffectation est :=
O la variable <Var> peut tre de tout type et la valeur <Val> peut tre une
valeur constante, la valeur dune donne constante ou variable, la valeur dune
fonction, ou le rsultat dune expression.
Exemple : x :=2 ;
En langage C :
Affectation ordinaire
Exemple : x=2 ;
Remarque :
La valeur affecte une variable doit tre de mme type ou de type compatible
celui de la variable.
Notion de Ivalue
On constate que loprateur daffectation impose des restrictions sur son premier
oprande. En effet, ce dernier doit tre une rfrence un emplacement mmoire
dont on pourra effectivement modifier la valeur.
Dans les autres langages, on dsigne souvent une telle rfrence par le nom
dune variable. Cependant, en langage C, la syntaxe est telle que cette notion
de variable nest pas assez prcise. Il faut introduire un mot nouveau : la
Ivalue ; ce terme dsigne une valeur gauche, cest--dire tout ce qui peut
apparatre gauche dun oprateur daffectation.
Affectation largie
Le langage C permet de condenser les affectations de la forme :
Ivalue = Ivalue oprateur expression
Remarque
Ne confondez pas loprateur de comparaison <= avec un oprateur daffectation
largie. Notez bien que les oprateurs de comparaison ne sont pas concerns par
cette possibilit.
STRUCTURES DE TRAITEMENT
ALTERNATIVES ET ITRATIVES
I- Instructions conditionnelles
En langage Pascal :
Instruction IFThen
Si <Cond> est vraie, le bloc dinstructions <Bloc> sera excut, sinon il sera
ignor.
Instruction IFTHENELSE
Else a:=b-a;
Remarque : la clause ELSE ne doit pas tre prcde par un point virgule ;.
Instruction CASE
Syntaxe :
CASE <Slecteur> OF
Val1 : <Bloc1> ;
Val2 : <Bloc2> ;
..........................
Valn : <Blocn> ;
ELSE <Bloc>;
END;
En langage C :
Instruction IF :
Syntaxe : if (expression) instruction
Instruction IFElse :
Syntaxe : IF (expression) instruction1 ELSE instrucion2
Instruction SWITCH:
Syntaxe:
Switch(expression)
{ case constante1: [suite_dinstruction1]
case constante2: [suite_dinstruction2]
..........................................................
case constante n: [suite_dinstruction n]
[default : suite_dinstruction ]
}
Expression : expression entire quelconque,
Constante : expression constante dun type entier quelconque (char est accept
car il sera convertit en int),
Suite_dinstructions : squence dinstructions quelconques.
N.B : les crochets ([et]) signifient que ce quils renferment est facultatif.
Remarque :
On peut ajouter linstruction break qui permet de sortir de linstruction
switch juste aprs lexcution du bloc de ltiquette choisie.
Switch(expression)
{ case constante1: [suite_dinstruction1]
break ;
case constante2: [suite_dinstruction2]
break ;
..........................................................
case constante n: [suite_dinstruction n]
break ;
[default : suite_dinstruction ]
}
les case peuvent apparatre dans nimporte quel ordre.
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/2 n (n
N*).
Exercice 14
Ecrire un programme qui donne le nombre N tel que la srie 1+1/2-1/3+1/4- 1/5+
1/N donne un rsultat gal ( 1/100 prs) 1,33.
Exercice 15
Ecrire un programme qui donne la plus grande valeur infrieure 1000 de la
somme 1+2+4+8++2N.
Exercice 16
Ecrire un programme qui calcule la somme 1+x+x2++xn (x rel 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 prcision relative
=10-6, cest 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 prs
Exercice 19
Le dveloppement limit de la fonction sinus au voisinage de zro est sin x= x -
x3/3! + x5/5! -+(-1)p x2p+1/(2p+1)!+
Ecrire un programme qui calcule sin x 10-6 prs.
Exercice 20
Ecrire un programme qui calcule la somme, le produit et la diffrence de deux
donnes numriques.
Exercice 21
Ecrire un programme qui retourne le code dune donne de type Caractere.
Exercice 22
Ecrire un programme qui calcule le salaire net dun employ, sachant que celui-
ci a assur un certain nombres dheures de travail un prix fixe par heure, et que
lemployeur doit rduire de son salaire des charges qui sont calcules avec un
coefficient donn.
Exercice 23
Ecrire un programme qui permet de reprendre lexercice prcdant en
considrant que lemploy a assur des heures normales, des heures 25% et des
heures 50%.
Exercice 24
Ecrire un programme qui retourne si une donne numrique est paire ou impaire
(utiliser le reste de la division par 2).
Exercice 25
Ecrire un programme qui permet de lire trois donnes numriques et retourne si
la troisime donne est la somme des deux autres ou pas.
Exercice 26
Ecrire un programme qui, partir du salaire brut dun employ, dtermine
limpt payer sachant que les rgles de calcul des impts sont comme
suit :
Exercice 32
Ecrire un programme qui calcule la somme 1+1/2+1/4+1/6++1/2N (N>0).
Exercice 33
Ecrire un programme qui change les contenus de trois donnes numriques si
leur somme est paire, sinon il met la somme des trois dans la premire donne,
leur produit dans la seconde et la valeur zro dans la troisime.
Exercice 34
Ecrire un programme qui calcule la somme 1-1/2+1/3-1/4+1/N.
NOTION DE SOUS-PROGRAMMES
Un sous-programme permet :
dviter dappliquer plusieurs endroits dun programme le mme traitement,
mme sil porte sur des objets diffrents.
dappliquer sous forme transportable un traitement dont on prvoit que
dautres programmes peuvent aussi en avoir besoin.
de dgager dun programme des tches de moindre importance ne laissant
dans son corps que la partie importante de lalgorithme do le gain de
lisibilit et de scurit.
I. En langage Pascal
Les sous-programmes en Pascal sont des procdures et des fonctions.
Paramtres formels
La dclaration des procdures peut tre suivie dune liste de paramtres entre
parenthses. Un paramtre formel est destin tre remplac, chaque fois que la
procdure est active, par un autre objet dit paramtre effectif, le plus souvent
une variable, ou le rsultat dune expression, de la procdure appelante.
Syntaxe : Procedure <Nom> ( <mode> <Ident>.., <Ident> : <Type> ;.. ; <mode>
<Ident>,.., <Ident> : <Type>) ;
O <mode> = rien ou var.
Paramtres par valeurs et paramtres par adresse
Les objets sont transmis comme donnes dont la valeur doit tre inchange par
la procdure appele (on dit quon a une lecture pure).
Les objets sont transmis comme rsultat dont la valeur doit tre calcule par la
procdure appele et transmise la procdure appelante (on dit quon a une
criture pure).
Les objets sont transmis comme donnes qui doivent tre modifies par la
procdure appele (on dit quon a une lecture-criture).
En Pascal, la transmission des paramtres se fait de deux manires :
Transmission par valeur (lecture pure).
Transmission par adresse (criture pure, lecture-criture).
On indique les paramtres transmis par adresse, prcds par le mot rserv Var,
les autres ne sont prcds par aucune chose.
II. En langage C
La fonction peut retourner une valeur. La dfinition dune fonction est compose
de deux lments :
son prototype :
Syntaxe :
<corps de la fonction>
}/*fin de la fonction*/
Ds quune instruction de retour est rencontre, lexcution de la fonction
sinterrompt. Cette instruction permet de transmettre ventuellement une valeur
au programme appelant.
Syntaxe :
III. La rcursivit
Un sous-programme est dit rcursif sil sappelle lui-mme. Il doit contenir une condition
darrt. Considrons lexemple de la fonction pgcd(a, b) qui retourne le plus grand
diviseur commun des deux entiers a et b :
Exercice 36
Ecrire une fonction paramtre qui retourne si un nombre donn est parfait ou
non.
Exercice 37
Ecrire une fonction paramtre qui retourne si deux nombres donns sont amis
ou non.
Exercice 38
Ecrire une fonction paramtre qui retourne linverse dun nombre entier donn.
Exercice 39
Ecrire une fonction rcursive permettant de calculer le PGDC de deux nombres
entiers positifs A et B.
Exercice 40
Ecrire une fonction rcursive permettant de calculer le PPMC de deux nombres
entiers positifs A et B.
Exercice 41
Ecrire une fonction rcursive qui permet de calculer le factoriel dun nombre
donn.
Exercice 42
Ecrire une fonction rcursive qui permet de calculer la puissance dun entier
donn.
Exercice 43
Ecrire une fonction rcursive qui calcule la valeur de la fonction dAckermann
A dfinie 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 dun entier donn.
Exercice 45
Ecrire une procdure 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 dsire obtenir.
Exercice 46
Soit un programme qui visualise un menu compos de trois rubriques : Hors
duvre, plat chaud et dessert.
Ecrire une procdure qui permet deffectuer, chaque fois, un choix exclusif.
Exercice 47
Ecrire une procedure paramtre, qui permet lchange des contenus de deux
paramtres formels par valeur A et B. Appeler cette procdure dans un
programme principal.On crira les rsultats dans le corps de la procdure, et dans
le programme principal.
Exercice 48
Ecrire une procedure paramtre, qui permet lchange des contenus de deux
paramtres formels par adresse A et B. Appeler cette procdure dans un
programme principal.On crira les rsultats dans le corps de la procdure, et dans
le programme principal.
Exercice 49
Ecrire une procdure qui affiche tous les nombres premiers qui sont compris
entre 1 et 200.
Exercice 50
Ecrire une procdure qui affiche tous les nombres parfaits qui sont compris entre
1 et 200.
Exercice 51
Ecrire une procdure qui permet dafficher tous les diviseurs dun entier N ainsi
que leur nombre.
Exercice 52
Affichez un triangle isocle form d'toiles sur N lignes (N est fourni au clavier).
Exemple : N=8
*
***
*****
*******
*********
***********
*************
***************
Exercice 53
Calculer pour une valeur X donne du type rel la valeur numrique d'un
polynme de degr n:
P(X) = AnXn + An-1Xn-1 + ... + A1X + A0
Les valeurs de n, des coefficients An, ..., A0 et de X seront entres au clavier.
Utiliser le schma de Horner qui vite les oprations d'exponentiation lors du
calcul:
Exercice 54
Ecrire une procdure 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
DONNES STATIQUES
Tableau
Un tableau est une suite dlments de mme type. En Pascal, la dclaration des
tableaux se fait comme suit :
Syntaxe : Var NomTab : Array[Min..Max] Of Type;
On accde un lment du tableau en utilisant un index : Exemple NomTab[4].
Chanes de caractres
Expressions chanes
Affectation de chanes
Loprateur daffectation est utilis pour affecter la valeur dune expression une
variable chane.
Exemple : p :=Programmation ;
Procdure Commentaires
supprime dans la chane st une sous-chane contenant
DELETE (st,pos,num)
num caractres partir du caractre de position pos.
permet linsertion de la chane obj dans la chane target
INSERT(obj,target,pos)
la position pos.
convertit la valeur numrique de value en une chane,
STR(value,st)
et range le rsultat dans st.
convertit lexpression chane st en une valeur entire
ou relle (en fonction de type de var) et range la valeur
dans var. code doit tre une variable entire. Si aucune
VAL(st,var,code)
erreur nest dtecte, code est mise zro, sinon code a
la valeur de la position du premier caractre en erreur
et la valeur de var est indfinie.
Fonctions Commentaires
retourne une sous-chane contenant num caractres de
COPY(st,pos,num)
st en commenant par le caractre de position pos.
retourne une chane qui est la concatnation de ces
CONCAT(st1,st2,,stn)
arguments dans lordre o ils sont dclars.
LENGTH(st) retourne la longueur effective de la chane st.
si obj est contenu dans target alors pos retourne la
POS(obj,target) position du premier caractre de obj dans target sinon
pos retourne zro.
Ensembles
Remarques
Le nombre maximum dun ensemble est 256.
On note par [ ] lensemble vide compatible avec tout type ensemble.
En langage C
Tableau
Type : dfinit le type d'lments que contient le tableau (un tableau en langage C
est compos uniquement d'lments de mme type).
Chane de caractres
B o n j o u r \0
Fonctions Commentaires
recopie la seconde chane (source) la
strcat(but,source)
suite de la premire (but).
travaille de faon semblable strcat en
offrant en outre un contrle sur le
strncat(but,source,lgmax)
nombre de caractres qui seront
concatns la chane darrive (but).
compare deux chanes dont on lui
fournit ladresse et elle fournit une
valeur entire dfinie comme tant :
strcmp(chane1,chane2)
Positive si chane1 > chane2
Nulle si chane1 = chane2
Ngative si chane1 < chane2
travaille comme strcmp mais elle limite
strncmp(chane1,chane2,lgmax) la comparaison au nombre maximal de
caractres indiqus par lentier lgmax.
travaillent respectivement comme
stricmp(chane1,chane2) et strcmp et strncmp, mais sans tenir
strnicmp(chane1,chane2,lgmax) compte de la diffrence entre
majuscules et minuscules.
recopie la chane situe ladresse
strcpy(destin,source) source dans lemplacement dadresse
destin.
procde de manire analogue strcpy,
en limitant la copie au nombre de
strncpy(destin,source,lgmax)
caractres prciss par lexpression
entire lgmax.
recherche dans chane la premire
strchr(chane,caractre) position o apparat le caractre
mentionn.
ralise le mme traitement que strchr,
strrchr(chane,caractre) mais en explorant la chane concerne
partir de la fin.
recherche dans chane la premire
strstr(chane,sous-chane) occurrence de la sous-chane
mentionne.
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 composes de plusieurs variables (ou
CHAMPS) de types diffrents.
Exercice 56
Ecrire une procdure qui met zro la diagonale dune matrice carre.
Exercice 57
Ecrire une procdure qui affiche loccurrence dexistence dun nombre rel dans
une liste de nombres rels.
Exercice 58
Ecrire une procdure qui met le plus petit lment dune liste au dbut de celle-
ci.
Exercice 59
Ecrire une procdure qui met les lments ngatifs dune liste gauche et les
lments positifs droite de la liste.
Exercice 60
Ecrire une procdure qui classe une liste de notes de la plus petite la plus
grande.
Exercice 61
Etant donn N tudiants, leurs notes correspondantes M matires et leur
moyenne. Ecrire une procdure qui affiche ct de chaque tudiant son
classement.
Exercice 62
Le tri bulles est un tri par change. Le principe de base est de rordonner les
couples non classs tant quils existent. La mthode de tri bulles consiste
parcourir la liste en comparant deux lments successifs et en les permutant sil y
a lieu. Ecrire une procdure qui ralise ce tri.
Exercice 63
Un palindrome est un mot, ou une phrase, lisible indiffremment de la gauche
vers la droite ou inversement. Ecrire une fonction qui retourne si une chane de
caractres est un palindrome ou non.
Exercice 64
Ecrire une fonction qui retourne la frquence doccurencedun mot dans une
phrase.
Exercice 65
Ecrire une procdure qui enlve tous les blancs au dbut dune phrase et qui
laisse un seul blanc entre les diffrents mots de la phrase.
Exercice 66
Soit un nombre entier positif N. Ecrire une fonction qui donne son quivalent
dans une base donne B (2B16).
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 raliser des oprations sur des nombres entiers trs grands, on
peut utiliser les chanes de caractres pour reprsenter ces nombres et ensuite
faire lopration par bloc.
Ecrire une procdure pour raliser lopration daddition sur de tels nombres.
Exercice 70
Ecrire une procdure qui permet de passer de la reprsentation dun nombre en
chiffres romains sa reprsentation dcimale.
Exercice 71
Ecrire une procdure qui permet de passer de la reprsentation dcimale dun
nombre sa reprsentation en chiffres romains.
Exercice 72
Ecrire une fonction qui retourne le dterminant dune matrice carre.
Exercice 73
Ecrire une procdure qui calcule linverse dune matrice carre.
Exercice 74
Un carr magique est un carr divis en cellules dans lesquelles les nombres
entiers, partir de 1 sont disposs 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 procdures qui donnent le calcul sur les nombres complexes au moyen
dun type enregistrement.
Dans la pratique, trs souvent, on veut reprsenter des objets, soit dont on ne
connat 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 sadapter ces objets. Ce sont les structures de donnes
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 dclar, il doit ltre
dans la mme partie de la dclaration que le type pointeur type_pointeur.
Exemple : type ref = ^integer ;
Remarques :
ref est une variable pointeur et ref^ la variable pointe.
La constante NIL peut tre affecte nimporte quelle variable pointeur
(NIL ne fait rfrence aucun lment du type associ).
Le type prdfini Pointer indique un pointeur non typ, cest--dire un
pointeur qui ne pointe pas sur un type particulier.
Loprateur @ fait pointer la variable pointeur sur une zone mmoire
contenant une variable.
Une liste chane est une suite de donnes (liste) lies entre elles. Le lien est
ralis par des pointeurs. Chaque lment de la liste est un enregistrement dont
lun des champs est un pointeur qui pointe vers llment suivant.
Tte 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 ;
Linsertion dun lment x dans une liste chane se fait en deux tapes :
1. allocation de lespace mmoire quoccuperait x.
2. cration des liens avec llment de gauche puis de droite.
Les arbres
B C
D E F G
I
H
J
Dfinitions :
On appelle parcours dun arbre tout algorithme permettant daccder une et une
seule fois tous les nuds de larbre. On distingue six parcours gnraux,
symtriques deux deux, valides pour les arbres binaires quelconques et rpartis
en trois catgories qui sont :
Les parcours en prordre (prfixs)
Parcourir un arbre binaire en prordre cest dabord inspecter la racine, puis
parcourir en prordre le sous-arbre gauche (respectivement le sous-arbre droit) et
enfin parcourir en prordre le sous- arbre droit (respectivement le sous-arbre
gauche).
Exemple :
8
5
10
1 4
1
2
7
Arbres ordonns
4
1
9 0
5
1
3
8 8
4 4 1
1 0
9 0
5 5 9
1
1 3
Insertion 6
3
1 1
6 6
7 1 6 1
8 8
4 9 4 9
2 2
4 4
2 6 8 1 2 8 1
0 0
Suppression
Une manire possible de reprsenter un arbre est la suivante : lensemble des fils
du mme pre forme une liste, donc chaque fils a un pointeur vers son frre qui
le suit. Le dernier frre a 0. Chaque pre a un pointeur vers son premier fils.
Les fils de la dernire gnration (feuilles) ont 0. Chaque fils un pointeur vers
son pre. Lanctre (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 parenthse figure lindice dans le tableau)
Pierre (1)
1 2 3
II. En langage C
Les pointeurs
Un pointeur est une variable qui doit tre dfinie en prcisant le type de la
variable pointe, de la faon suivante :
Syntaxe : type * Nom_du_pointeur
Le type de la variable pointe 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 linitialiser et fournit ladresse
void * malloc(size_t taille) correspondante lorsque lallocation a
russi ou un pointeur nul dans le cas
contraire.
alloue lemplacement ncessaire
void * calloc(size_t nb_blocs,size_t
nb_blocs conscutifs, ayant chacun
taille)
une taille de taille octets.
permet de modifier la taille dune zone
void * realloc(void * pointeur, size_t
pralablement alloue (par malloc,
taille)
calloc ou realloc).
libre la mmoire dadresse adr. Ce
pointeur doit obligatoirement dsigner
void free(void* adr) une zone pralablement alloue 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
dlments
du tableau.
Une liste chane est une structure comportant des champs contenant des donnes
et un pointeur vers une structure de mme type. Ainsi, la structure correspondant
une liste chane contenant une chane de 15 caractres 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
g d
g d
info
g d
Exemple :
Pour le cas dun arbre de caractres, la structure est la suivante :
Typedef struct str{
char info ;
str *g, *d ;
} *Arbre p;
Exercice 77
Ecrire une procdure qui permet la cration en file dune liste chane.
Exercice 78
Ecrire une procdure qui permet la cration en pile dune liste chane.
Exercice 79
Ecrire une procdure qui recherche un lment dans une liste chane.
Exercice 80
Ecrire une procdure qui insert un lment dans une liste chane.
Exercice 81
Ecrire une procdure qui limine un lment dune liste chane.
Exercice 82
Ecrire une procdure qui empile un lment dans une pile reprsente par une
liste chane.
Exercice 83
Ecrire une procdure qui dsempile un lment dans une pile reprsente par une
liste chane.
Exercice 84
Ecrire une procdure qui permet la cration dune liste doublement chane.
Exercice 85
Ecrire une procdure qui recherche un lment dans une liste doublement
chane.
Exercice 86
Ecrire une procdure qui insert un lment dans une liste doublement chane.
Exercice 87
Ecrire une procdure qui limine un lment dune liste doublement chane.
Exercice 89
Ecrire une fonction qui recherche un lment dans une liste chane circulaire.
Exercice 90
Ecrire une procdure qui insert un lment dans une liste chane circulaire.
Exercice 91
Ecrire une procdure qui limine un lment dune liste chane 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 spars par un blanc ( ).
Dans cet exercice on reprsentera un paragraphe par une liste chane, et aussi
une phrase par une liste chane.
1- Ecrire une procdure qui permet la cration dune telle reprsentation.
2- Ecrire une procdure qui permet la recherche de la premire occurrence
dun mot dans le paragraphe. Le rsultat de la recherche donne la position
de ce mot.
3- Ecrire une procdure qui permet linsertion dun mot M1 aprs un mot
M2 donn. Si le mot M2 ne se trouve pas dans le paragraphe, on ne fait
pas dinsertion.
4- Ecrire une procdure qui permet llimination dun mot M1 du
paragraphe.
5- Ecrire une fonction qui permet la recherche dune phrase, donne par son
premier mot, dans le paragraphe. Le rsultat de la recherche donne la
position de cette phrase dans le paragraphe.
6- Ecrire une procdure qui permet linsertion dune phrase ph1 aprs une
phrase ph2 donne. Si la phrase ph2 ne se trouve pas dans le paragraphe,
on insert ph1 la fin du paragraphe.
7- Ecrire une procdure qui permet llimination dune phrase ph1 du
paragraphe.
Exercice 93
Ecrire la procdure du parcours dun arbre binaire en prordre.
Exercice 94
Ecrire la procdure du parcours dun arbre binaire en postordre.
Exercice 95
Ecrire la procdure du parcours dun arbre binaire en ordre.
Exercice 96
Ecrire une fonction qui recherche un lment dans un arbre ordonn
horizontalement.
Exercice 97
Ecrire une procdure qui insert un lment dans un arbre ordonn
horizontalement.
Exercice 98
Ecrire une procdure qui supprime un lment dans un arbre ordonn
horizontalement.
LES FICHIERS
Fichier texte
La tte de lecture et d'criture se trouve sur un octet et cet octet est interprt
comme un caractre en code ASCII. On a alors ce qu'on appelle un fichier texte.
Un texte est en gnral divis en lignes, marques par des caractres de fin de
ligne et termin par un code de fin de fichier. Un fichier texte peut se lire
caractre par caractre ou ligne par ligne.
Fichier binaire
La tte de lecture et d'criture recouvre une variable, d'un type quelconque (rel,
double, structure, tableau, etc.) code sur n octets comme en mmoire centrale.
On parle alors de fichier binaire. Une opration de lecture lit en bloc tous les
octets constituant cette variable.
I. En langage Pascal
En Pascal, un type fichier est dfini par le mot rserv "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 chane rsultant en tout nom lgal de
fichier. Le nom du fichier est affect la variable filval et
Assign(filval,str) toutes les oprations suivantes sur filval affecteront le fichier
disque (externe) str. Assign ne doit jamais tre utilise sur un
fichier en cours dutilisation.
un nouveau fichier disque dont le nom est assign la variable
filval est cre et prpar pour le traitement. Le pointeur de
Rewrite(filval) fichier est plac au dbut de celui-ci (cest--dire : sur
lenregistrement numro 0). Un fichier disque cre par
Rewrite est vide.
le fichier disque affect la variable filval est prpar pour le
traitement. Le pointeur de ce fichier est positionn sur le
Reset(filval)
composant numro 0. filval doit rfrencer un fichier existant,
sinon il se produira une erreur dentre/sortie.
var reprsente une ou plusieurs variables de mme type que
les lments de filval. Chaque variable est lue sur le fichier
Read(filval,var)
disque. Aprs chaque opration de lecture le pointeur de
fichier est avanc sur le composant suivant.
var reprsente une ou plusieurs variables de mme type que
les lments de filval. Chaque variable est crite sur le fichier
Write(filval,var)
disque. Aprs chaque opration dcriture le pointeur de
fichier est avanc sur le composant suivant.
dplace le pointeur de fichier sur le n ime composant du fichier
Seek(filval,n)
rfrenc par filval. N est une expression entire.
Filesize(filval) retourne le nombre de composants dun fichier.
Close(filval) le fichier disque associ filval est ferm et le rpertoire du
disque est mis jour. Pour tenir compte des modifications
apportes au fichier, il est ncessaire de fermer un fichier
Expression Commentaires
aprs traitement.
fonction boolenne qui retourne vraie si le pointeur de fichier
Eof(filval)
est positionn la fin du fichier disque.
fonction entire retournant la position courante du pointeur de
Filepos(filval)
fichier.
Remarque : un paramtre formel de type fichier doit tre toujours donn par
adresse.
Toute opration sur les fichiers textes doit tre prcde par un appel la
procdure Assign, Un appel Reset ou Rewrite doit prcder toute opration
de lecture ou decriture.
Reset est utilise pour ouvrir un fichier existant en lecture, la seule opration
permise sur ce fichier est la lecture squentielle. Lorsquun nouveau fichier texte
est ferm, une marque de fin de fichier est mise la fin du fichier.
Lentre et la sortie des caractres dans les fichiers textes seffectuent par les procdures
Read(filvar,c) et Write(filval,c). Les procdures Readln, Writeln et la fonction EoLn
permettent le traitement des lignes dun fichier texte.
Expressions Commentaires
Expressions Commentaires
Remarques :
II. En langage C
Pour pouvoir manipuler les fichiers en C, on doit dclarer un pointeur sur la
structure FILE.
Exemple : FILE *sortie ;
Exemple:
#include <stdio.h>
FILE *Pointeur_sur_fichier;
Pointeur_sur_fichier = fopen("C:\IUT\essai.txt", "wt");
Ouvre (ou cre s'il n'existe pas) un fichier texte nomm essai.txt dans le
rpertoire 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 nexiste pas, il est
cr. Sil existe, son ancien contenu est perdu.
"a" (append : ajout) : si le fichier existe dj, il sera tendu. Sil nexiste
pas, il sera cr.
"r+" : mise jour (lecture et criture). Le fichier doit exister.
"t" ou "b" : lorsque limplmentation distingue les fichiers de texte des
autres, il est possible dajouter lune de ces deux lettres chacun des modes
prcdents. La lettre t prcise que lon a affaire un fichier texte ; la lettre
b prcise que lon a affaire un fichier binaire.
fprintf : criture formate dans un fichier. Cette fonction est l'quivalent pour un
fichier de printf pour les sorties l'cran. Les formats (prcds du symbole %)
sont les mmes.
Exemple :
char erreur;
erreur = fprintf(Pointeur_sur_fichier, "Le chiffre %d s'crit quatre", 4);
fputc : ce qui signifie "met un caractre 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 chane dans un fichier". Comme son nom
l'indique galement, cette fonction crit une chane de caractres dans un
fichier.
Exemple :
char erreur;
erreur = fputs("chane de caractre", Pointeur_sur_fichier);
Remarque :
Dans ces deux cas, la variable erreur de type char contient le dernier caractre
crit et EOF si une erreur se prsente (fin de fichier, disque plein, etc.).
fwrite : crit dans un fichier des objets d'un type quelconque. Il faut
prciser 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'lments effectivement crits. Pour tester que tout va
bien, il faut comparer le nombre d'lments crits avec le nombre d'objets
crire.
Syntaxe :
nombre_d_elements_ecrits = fwrite(ptr_sur_tableau, taille_element,
nb_elements, fichier)
FILE *Pointeur_sur_fichier;
fopen("C:\IUT\essai.dta", "wb");
int tableau[5];
nb = fread(tableau, sizeof(int), 3, Pointeur_sur_fichier);
Lit dans le fichier binaire "essai.dta" des nombres entiers et les range dans les
trois premires cellules du tableau ; nb a pour valeur le nombre d'lments crits,
3 si tout s'est bien pass.
Exercice 100
Ecrire une procdure qui permet de modifier les informations dun tudiant.
Pascal C
Exercice 1
Ecrire un programme qui permet dafficher 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: ");
x:=y; scanf("%d %d",&x,&y);
Exercice 4
Ecrire un programme qui demande l'utilisateur les coordonnes de 2 points distincts du plan et qui affiche les
coordonnes 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();
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){
getch();
}
Exercice 13
Ecrire un programme qui calcule la somme 1+1/2-1/4+ 1/8-1/16+1/2n (n N*)
program calcul; #include<stdio.h>
var n,i:integer; #include<conio.h>
s,u:real; void main()
begin {
write('donner un entier non nul: ');readln(n); clrscr();
i:=1; float s,u;
S:=1; int i,n;
u:=1/2; s=1;
while i<=n do u=(float)1/2;
begin i=1;
if i mod 2=0 then printf("donnez un entier positif non
s:=s-u nul:");scanf("%d",&n);
else s:=s+u; while(i<=n){
u:=u/2; if(i%2==0) s=s-u;
i:=i+1; else s=s+u;
u=u/2;
end; i=i+1;
writeln('la somme est: ',s:10:5); }
readln; printf("la somme est: %f",s);
end. getch();
}
Exercice 14
Ecrire un programme qui donne le nombre N tel que la srie 1+1/2-1/3+1/4- 1/5+1/N donne un rsultat gal
( 1/100 prs) 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 infrieure 1000 de la somme 1+2+4+8++2N
program calcul; #include<stdio.h>
var u,s:integer; #include<conio.h>
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 prs
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);
else s:=s-t; if (i%2==0) s=s+t;
i:=i+1; u=u*x*x;
t:=u/v; v=(2*i+1)*2*i*v;
end; i++;
writeln('le sinus de ',x:10:5,'est: ',s:10:5); t=(float)u/v;
readln; }
end. printf("sinus de %f=%f",x,s);
getch();
}
Exercice 20
Ecrire un programme qui calcule la somme, le produit et la diffrence de deux donnes numriques.
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 oprateur'); 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 zro'); switch(op)
end; {
'*':writeln('x*y=',x*y); case '+': printf("x+y=%d\n",x+y); break;
Exercice 21
crire un programme qui retourne le code dune donne de type CARACTERE.
program code_ASCII; #include <stdio.h>
var c:char; #include<conio.h>
asci:integer; void main()
begin {
writeln('donner un caractre:'); int asci;
readln(c); char c;
asci:=ord(c); printf("donner un caractere\n");
writeln('le code ASCII de ce caractre est:',asci); scanf("%c",&c);
readln; asci='A';
end. printf("%d\n",asci);
getch();
}
Exercice 22
Ecrire un programme qui calcule le salaire net dun employ, sachant que celui-ci a assur un certain nombres
dheures de travail un prix fixe par heure, et que lemployeur doit rduire de son salaire des charges qui sont
begin {
writeln('donner le nombre d''heures 25% et celui int NHN,NH25,NH50;
50% ainsi que le nombre d''heure normales :'); float NB,SN,SB,coef,PH,charges;
readln(nh25,nh50,nhn);
writeln('donner le prix d''une heure:'); printf("donner le nombre d'heures normales:\n");
readln(ph); scanf("%d",&NHN);
writeln('donner le coefficient:'); printf("donner le nombre d'heures a 25%:\n");
readln(coef); scanf("%d",&NH25);
sb:=nhn*ph+nh25*ph*125/100+nh50*150/100*ph; printf("donner le nombre d'heures a 50%:\n");
charges:=sb*coef; scanf("%d",&NH50);
sn:=sb-charges; printf("donner le prix d'une heure:\n");
writeln('le salaire net de cet employ est:',sn); scanf("%f",&PH);
readln; printf("donner le coefficient de reduction:\n");
end. scanf("%f",&coef);
SB=(NHN+NH25*(125/100)+NH50+(150/100))*PH;
charges=SB*coef;
SN=SB-charges;
printf("la salaire net de cet employe est egal a %f",SN);
getch();
}
Exercice 24
Ecrire un programme qui retourne si une donne numrique est paire ou impaire (utiliser le reste de la division
par 2).
program est_pair; #include<stdio.h>
var n:integer; #include<conio.h>
bp:boolean; void main()
begin {
writeln('donner un entier positif:'); int n;
readln(n); printf("donner un entier positif :\n");
bp:=(n mod 2)=0; scanf("%d",&n);
if bp then writeln('cet entier est pair') if( n % 2 == 0)
else writeln('cet entier n''est pas pair'); printf("cet entier est pair.\n");
readln; else
end. printf("cet entier n'est pas pair.\n");
getch();
}
Exercice 25
Ecrire un programme qui permet de lire trois donnes numriques et retourne si la troisime donne est la
somme des deux autres ou pas.
program est_somme; #include<stdio.h>
var x,y,z:integer; #include<conio.h>
bs:boolean; void main()
begin {int x,y,z;
writeln('donner trois nombres:'); printf("donner trois nombres:\n");
readln(x,y,z); scanf("%d%d%d",&x,&y,&z);
bs:=(x+y)=z; if(z==x+y)
if bs then writeln('la trosime donne est gale la printf("la trosieme donne est egale a la somme des
somme des autres ') autres.\n");
else else printf("la trosieme donne n'est pas egalea la
writeln('la trosime donne n'' est pas gale la somme des autres.\n");
somme des autres '); getch();
readln; }
end.
Exercice 26
Ecrire un programme qui, partir du salaire brut dun employ, dtermine limpt payer sachant que les
rgles de calcul des impts sont comme suit :
end; }
end; }
readln getch();
end. }
Exercice 27
Ecrire un programme qui fournit les racines de lquation 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 {
quation sont: x1=',(-b-sqrt(delta))/(2*a),'x2=', (- delta=b*b-4*a*c;
b+sqrt(delta))/(2*a)) if (delta>=0)
else writeln('pas de solution'); printf("les racines de cette quation sont: x1=%f et x2=
end; %f",(-b-sqrt(delta))/(2*a),(-b+sqrt(delta))/(2*a));
readln; else printf("pas de solution");
end. getch();
}
}
Exercice 28
Ecrire un programme qui, tant donne une date (jour, mois, anne), affiche la date du jour suivant.
program jour_suivant; #include<stdio.h>
var j,m,a,ms,js,as:integer; #include<conio.h>
biss,dj:boolean; void main()
begin {
writeln('donner la date d''aujourd''hui:'); clrscr();
readln(j,m,a); int j,m,a,js,ms,as,dj,biss;
if( a mod 100)=0 then biss:=(a mod 400)=0 printf("donnez la date d'aujourd'hui: ");scanf("%d %d
else biss:=(a mod 4)=0; %d",&j,&m,&a);
case m of if (a % 100==0) a=a/100;
1,3,7,8,10,12:dj:=(j=31); if (a % 4==0) biss=0;
4,6,9,11:dj:=(j=30); else biss=1;
2:if biss then dj:=(j=29) switch (m){
else dj:=(j=28); case 1 :
end; case 3 :
if dj then begin case 5 :
js:=1; case 7 :
if m=12 then begin case 8 :
ms:=1; case 10:
as:=a+1; case 12: dj=(j==31);
end break;
else begin case 4 :
ms:=m+1; case 6 :
as:=a; case 9 :
end; case 11: dj=(j==30);
end break;
else begin case 2 :
js:=j+1; if(biss) dj=(j==28);
ms:=m; else dj=(j==29);
as:=a; break;
end; }
writeln('le jour suivant est :',js,'/',ms,'/',as); if (dj) {
readln; js=1;
end. if(m==12){
ms=1;
as=a+1;
}
else{
ms=m+1;
as=a;
}
}
else{
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 donne une date (jour, mois, anne), affiche la date du jour prcdant.
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:
if m=1 then begin case 10:
ap:=a-1; case 12: nj=31;
jp:=nj; case 4:
mp:=12; case 6:
case 9:
end case 11:nj=30;
else begin case 2: if (biss) nj=29;
mp:=m-1; else nb=28;
ap:=a; }
jp:=nj; if (j==1)
end; { if (m==1)
end { ap=a-1;
else begin jp=nj;
jp:=j-1; mp=12;
mp:=m; }
ap:=a; else
end; { mp=m-1;
writeln('le jour prcdant est :',jp,'/',mp,'/',ap); ap=a;
readln; jp=nj;
end. }
else
{ jp=j-1;
mp=m;
ap=a;
}
printf("le jour precedant est :%d/%d/%d",jp,mp,ap);
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:'); {
readln(N); int p,i,n;
if N<=0 then writeln('il faut donner un entier > 0!') printf("Donner un entier >0:");
else scanf("%d",&n);
readln; }
end.
Exercice 33
Ecrire un programme qui change les contenus de trois donnes numriques si leur somme est paire, sinon il met
la somme des trois dans la premire donne, leur produit dans la seconde et la valeur zro dans la troisime.
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; }
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 paramtre qui retourne linverse dun nombre entier donn
Exercice 39
Ecrire une fonction rcursive 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 rcursive 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 rcursive qui permet de calculer le factoriel dun 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 rcursive qui permet de calculer la puissance dun 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 rcursive qui calcule la valeur de la fonction dAckermann A dfinie pour m>0 et n>0
par :
End;
Les procdures
Exercice 45
Ecrire une procdure 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 dsire obtenir. Avec les rponses : 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 duvre, plat chaud et dessert.
Ecrire une procdure qui permet deffectuer, 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);
readln(A,B); clrscr();
echange(A,B); float A,B;
writeln('Echange:',x:10:2,y:10:2); scanf("%f %f",&A,&B);
readln; echange(A,B);
end. printf("\nEchange:%10.2f %10.2f",A,B);
getch();
}
Exercice 48
Ecrire une procedure paramtre, qui permet lchange des contenus de deux paramtres formels par adresse A et
B. Appeler cette procdure dans un programme principal.On crira les rsultats dans le corps de la procdure, 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(var 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;
y:=temp; printf("\nEchange:%10.2f %10.2f",x,y);
writeln('Echange:',x:10:2,y:10:2); }
end; void main()
begin {
readln(A,B); clrscr();
echange(A,B); float A,B;
*****
*******
*********
***********
*************
***************
procedure DessinerTri(L:integer); void DessinerTri(int L)
var { int i; /* compteur des lignes */
k:integer; {compteur des lignes} int j; /* compteur des caractres */
ESP,I,j:integer; int e; /* nombre d'espaces */
begin for (i=0;i<L;i++)
for k:=1 to L do {
begin e = L-i-1;
ESP := L-k; for (j=0 ; j<e ; j++)
for I:=1 to ESP do putchar(' ');
write(' '); for (j=0 ; j<2*i+1 ; j++)
for j:=1 to 2*k-1 do putchar('*');
write('*'); putchar('\n');
writeln; }
end; getchar() ;
readln; }
end ;
Exercice 53
Calculer pour une valeur X donne du type float la valeur numrique d'un polynme de degr n:
P(X) = AnXn + An-1Xn-1 + ... + A1X + A0
Les valeurs de n, des coefficients An, ..., A0 et de X seront entres au clavier.
Utiliser le schma de Horner qui vite les oprations d'exponentiation lors du calcul:
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
end; printf("\n");
readln;
end. /* Affichage du tableau */
for (I=0 ; I<=MAX ; I++)
{
printf("%3d I", I);
for (J=0 ; J<=MAX ; J++)
printf("%4d", I*J);
printf("\n");
}
}
Les Tableaux
Exercice 55
Ecrire une procdure qui affiche les nombres ngatifs dune liste relle
Type tab=array[0..50] of real ; void nbre_negatif(float a[],int n)
Procedure nbre_negatif(a:tab;n:integer); {int i;
Var i:integer; for(i=0;i<n;i++)
Begin if(a[i]<0) printf("%f\t",a[i]);
for i:=0 to n-1 do }
if a[i]<0 then writeln(a[i]);
End;
Exercice 56
Ecrire une procdure qui met zro la diagonale dune matrice carre.
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 procdure qui affiche loccurrence dexistence dun nombre rel dans une liste de nombres rels
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(Loccurrence dexistence du nombre
,nbre, est ,cpt) ;
End;
Exercice 58
Ecrire une procdure qui met le plus petit lment dune liste au dbut 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++)
begin if(a[i]<a[ind]) ind=i;
ind:=0; tmp=a[0];
for i:=0 to n-1 do a[0]=a[ind];
if a[i]<a[ind] then ind:=i; a[ind]=tmp;
tmp:=a[0]; }
a[0]:=a[ind];
a[ind]:=tmp;
end;
Exercice 59
Ecrire une procdure qui met les lments ngatifs dune liste gauche et les lments positifs droite de la liste
type tab=Array[0..50] of real; void negatif_gauche(float a[],int n)
procedure negatif_gauche(var a:tab;n:integer); {int i,j;
var i,j:integer; float tmp;
tmp: real; for(i=0,j=0;i<n;i++)
begin if(a[i]<0)
j:=0; { tmp=a[j];
for i:=0 to n-1 do a[j]=a[i];
if a[i]<0 then a[i]=tmp;
begin j++;
tmp:=a[j]; }
a[j]:=a[i]; }
a[i]:=tmp;
j:=j+1;
end;
end;
Exercice 60
Ecrire une procdure 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 matires et leur moyenne. Ecrire une procdure qui
affiche ct 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);
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 chanes de caractres :
Exercice 63
Un palindrome est un mot, ou une phrase, lisible indiffremment de la gauche vers la droite ou inversement.
Ecrire une fonction qui rend si une chane de caractres 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 :
tmp:=s; }
while pos(' ',tmp)<>0 do }
begin Remarque :
ind:=pos(' ',tmp)+ind; Vous devez ajouter la ligne suivante au dbut de votre
while s[ind+1]=' ' do delete(s,ind+1,1); programme : #include <string.h>, pour pouvoir utiliser
tmp:=copy(s,ind+1,length(s)); les fonctions strcpy et strchr.
end;
end;
Exercice 66
Soit un nombre entier positif N. Ecrire une fonction qui donne son quivalent dans une base donne B (2B16)
Function car(n :word) :char ; char car(int n)
Begin {if (n<=9) return('0'+n);
If n<=9 then car:=chr(n+ord(0)) else return(n+'A'-10);
Else }
car:=chr(n+ord(A)-10);
End; char* dix_b(int n,int b)
{char *s,t[40];
Function dix_b(n,b:word):string; strcpy(s,"");
Var s:string; while(n!=0)
Begin {
s:=; t[0]=car(n%b);
While n<>0 do strcpy(t+1,"");
Begin strcat(t,s);
s:=car(n mod b)+s; strcpy(s,t);
n:=n div b; n=n/b;
End; }
dix_b:=s; return(s);
End; }
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 :
res:=res*b+valeur(n[i]) ; Vous devez ajouter les lignes suivantes au dbut de
b_dix :=res ; votre programme : #include <string.h> et #include
End ; <ctype.h>, pour pouvoir utiliser les fonctions strlen et
toupper.
Exercice 68
Soit N un nombre donn en base B1. Ecrire une fonction qui donne son quivalent en base B2.
procedure baseB(n:string;b1,b2:integer;var r:string); void baseB(char n[],int b1,int b2,char r[])
var re:integer; {
begin return(dix_b(b_dix(n,b1),b2));
baseB:=dix_b(b_dix(n,b1),b2); }
end;
Exercice 69
Si on est amen raliser des oprations sur des nombres entiers trs grands, on peut utiliser les chanes de
caractres pour reprsenter ces nombres et ensuite faire lopration par bloc.
Ecrire une procdure pour raliser lopration daddition sur de tels nombres.
Function calcul(N1,N2:String):String; char* calcul(char n1[],char n2[])
var Code,R,V,V1,V2:Integer; {char s1[100],s2[100],s[100],n[100],t[2];
N,S,S1,S2:string; int r,v;
begin r=0;
N:='';
R:=0; strcpy(s1,"");strcpy(s2,"");strcpy(s,"");strcpy(n,"");strc
While ( N1<>'') or (N2<>'') Do py(t,"");
Begin while((strlen(n1)!=0) || (strlen(n2)!=0))
If Length(N1)>4 Then {
Begin if(strlen(n1)>=4)
S1:=Copy(N1,Length(N1)-3,4); {
Delete(N1,Length(N1)-3,4); strcpy(s1,n1+strlen(n1)-4);
End strcpy(n1+strlen(n1)-4,"");
Else }
Begin else
S1:=N1; {
N1:=''; strcpy(s1,n1);
End ; strcpy(n1,"");
If Length(N2)>4 Then }
Begin if(strlen(n2)>=4)
S2:=Copy(N2,Length(N2)-3,4); {
Delete(N2,Length(N2)-3,4); strcpy(s2,n2+strlen(n2)-4);
End strcpy(n2+strlen(n2)-4,"");
Else }
Begin else
S2:=N2; {
N2:=''; strcpy(s2,n2);
End ; strcpy(n2,"");
Val(S1,V1,Code); }
Val(S2,V2,Code); v=atoi(s1)+atoi(s2)+r;
V:=V1+V2+R; strcpy(s1,"");strcpy(s2,"");itoa(v,s,10);
Str(V,S); if(strlen(s)>4)
If Length(S)>4 Then {
Begin strncpy(t,s,1);
Val(Copy(S,1,1),R,Code); r=atoi(t);
S:=Copy(S,2,Length(S)-1); strcpy(s,s+1);
End }
Else R:=0; else
N:=S+N; r=0;
End; strcat(s,n);strcpy(n,s);
Calcul:=N }
end; return(n);
}
Remarque :
Vous devez ajouter les lignes suivantes au dbut de
votre programme : #include <string.h> et #include
<stdlib.h>pour pouvoir utiliser les fonctions strlen,
strcat, strcpy, atoi, itoa et strncpy.
Exercice 70
Ecrire une procdure qui permet de passer de la reprsentation dun nombre en chiffres romains sa
reprsentation dcimale.
function ConvDec1(c:char):integer; int ConvDec1(char c)
begin {
case upcase(c) of switch (toupper(c)) {
'I':ConvDec1:=1; case 'I': return 1;
'V':ConvDec1:=5; case 'V': return 5;
'X':ConvDec1:=10; case 'X': return 10;
'L':ConvDec1:=50; case 'L': return 50;
'C':ConvDec1:=100; case 'C': return 100;
'D':ConvDec1:=500; case 'D': return 500;
'M':ConvDec1:=1000; case 'M': return 1000;
end; }
end; }
procedure ConvDec(rom:string;var dec:integer);
var i,d,dn:integer; void ConvDec(char rom[],int *dec)
begin {
dec:=0; int i, d, dn;
d:=ConvDec1(rom[1]);
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 dbut de votre
programme : #include <string.h> pour pouvoir utiliser
la fonction strcat.
Exercice 72
Ecrire une fonction qui retourne le dterminant dune matrice carre.
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);
for i:=0 to n-1 do }
begin
d:=0; void det_aux(matrice ma,matrice mb,int l,int c,int n)
if i<>l then {int i,j,d,e=0;
begin for(i=0;i<n;i++)
for j:=0 to n-1 do {
if j<>c then d=0;
begin if(i!=l)
mb[e][d]:=ma[i][j]; {
d:=d+1; for(j=0;j<n;j++)
end; if(j!=c)
e:=e+1; {mb[e][d]=ma[i][j];
end; d++;
end; }
end; e++;
}
function expo(n:integer):real; }
begin }
if n mod 2=0 then expo:=1
else expo:=-1; float determinant(matrice m,int l)
end; {
int i;
function determinant(m:matrice;l:integer):real; matrice m2;
var float x=0;
i:integer; if(l==1)return (m[0][0]);
m2:matrice; for(i=0;i<l;i++)
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] }
d:real; transp_mat(m1,m2,l);
begin multi_R(d,m2,mb,l);
d:=(1/determinant(ma,l)); }
coffacteur(ma,m1,l);
transp_mat(m1,m2,l);
multi_R(d,m2,mb,l);
end;
Exercice 74
Un carr magique est un carr divis en cellules dans lesquelles les nombres entiers, partir de 1 sont disposs
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 9 4
Ecrire une procdure qui permet de raliser le carr magique.
const k=11; #define k 11
type magique=array[1..k,1..k]of integer; typedef int ligne[k+1];
procedure CaMag(var carre:magique;n:integer); typedef ligne magique[k+1];
var fin,nombre,l,c:integer; void CaMag(magique carre,int n)
begin {
nombre:=1; int fin,nombre=1,l=1,c;
l:=1; fin=n*n;
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 {
Les enregistrements
Exercice 75
Ecrire un programme qui permet de saisir et dafficher les informations dune liste dtudiants.
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];
Begin gotoxy(26,7);
Gotoxy(26,7); clreol();
Clreol; scanf("%s",e->nom);
Readln(Nom); gotoxy(29,9);
Gotoxy(29,9); clreol();
Clreol; scanf("%s",e->prn);
Readln(Prn); gotoxy(28,11);
Gotoxy(28,11); clreol();
Clreol; scanf("%s",e->cin);
Readln(CIN); gotoxy(40,13);
Gotoxy(40,13); clreol();
Clreol; scanf("%d",&e->date_naiss.j);
Readln(J); gotoxy(42,13);
Gotoxy(42,13); printf("/");
Write('/'); scanf("%d",&e->date_naiss.m);
Readln(M); gotoxy(45,13);
Gotoxy(45,13); printf("/");
Write('/'); scanf("%d",&e->date_naiss.a);
Readln(A); }
End; void affich(etud e)
End; {
textcolor(WHITE);
Procedure Saisietout; gotoxy(26,7);clreol();cprintf(e.nom);
Var E:Etud; gotoxy(29,9);clreol();cprintf(e.prn);
Rep:Char; gotoxy(28,11);clreol();cprintf(e.cin);
Begin gotoxy(40,13);clreol();cprintf("%d/%d/
Te:=0; %d",e.date_naiss.j,e.date_naiss.m,e.date_naiss.a);
Affich_formul('S A I S I E'); }
Repeat void saisietout()
Saisie(E); { char rep;
Te:=Te+1; affich_formul("S A I S I E");
TEtud[Te]:=E; do
TextColor(Yellow); {
Gotoxy(45,17); saisie(&tetud[te++]);
Write('Voulez-vous continuez (O/N)?'); textcolor(YELLOW);
Rep:=readkey; gotoxy(45,17);
Gotoxy(45,17); cprintf("Voulez-vous continuez (O/N)?");
Clreol; fflush(stdin);
Until Rep In ['N', 'n']; rep=getchar();
End; gotoxy(45,17);
clreol();
Procedure Affich(Var E:Etud); }
Begin while((rep!='n') && (rep!='N'));
TextColor(White); }
With E, Date_Nais Do void affichtout()
Begin {
Gotoxy(26,7); char rep;
Clreol; int i;
Write(Nom); affich_formul("C O N S U L T A T I O N");
Gotoxy(29,9); for(i=0;i<te;i++)
Clreol; {
Write(Prn); fflush(stdin);
Gotoxy(28,11); affich(tetud[i]);
Clreol; textcolor(YELLOW);
Write(CIN); gotoxy(45,17);
Gotoxy(40,13); cprintf("Taper une touche pour continuer");
Clreol; rep=getchar();
fflush(stdin);
Write(J,'/',M,'/',A); gotoxy(45,17);
End; clreol();
End; }
}
Procedure Affichtout;
Var E:Etud; main()
Rep:Char; {etud e;
I:Integer; saisietout();
Begin affichtout();
Affich_formul('C O N S U L T A T I O N'); clrscr();
For i:=1 To Te Do getch();
Begin }
Affich(TEtud[I]);
TextColor(Yellow);
Gotoxy(45,17);
Write('Taper une touche pour continuer');
Rep:=readkey;
Gotoxy(45,17);
Clreol;
End;
End;
BEGIN
saisietout;
Affichtout;
ClrScr;
Readln;
END.
Exercice 76
Ecrire les procdures qui donnent le calcul sur les nombres complexes au moyen dun 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; }
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:=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 procdure qui limine un lment dune liste chane
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 procdure qui empile un lment dans une pile reprsente par une liste chane
procedure empiler(var tete:liste;x:integer); void empiler(liste &L,int x)
var p:liste; {
Exercice 83
Ecrire une procdure qui dsempile un lment dans une pile reprsente par une liste chane
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 chaines
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 procdure qui permet la cration dune liste doublement chane
new(p);
readln(x);
end;
end;
Exercice 85
Ecrire une procdure qui recherche un lment dans une liste doublement chane
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 procdure qui insert un lment dans une liste doublement chane
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 procdure qui limine un lment dune liste doublement chane
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 }
else{
position^.precedent^.suivant:=position^.suivant; pos->pred->suivant=pos->suivant;
pos->suivant->pred=pos->pred;
position^.suivant^.precedent:=position^.precedent; free(pos);
end;
ENS Rabat Dpartement dInformatique 144
Solutions des exercices
dispose(position); }
end; }
}
2. Les listes circulaires:
type liste=^element; typedef struct str{
element=record int info;
info:integer; str*suivant;
suivant:liste; }*liste;
end;
var l,p:liste;
Exercice 88
Ecrire une procdure qui permet la cration dune liste chane circulaire
procedure creation(var tete:liste); void creer(liste &L)
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 if(L==NULL) L=p;
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 lment dans une liste chane 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 procdure qui insert un lment dans une liste chane 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 procdure qui limine un lment dune liste chane 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 spars par un blanc( ).
Dans cet exercice on reprsentera un paragraphe par une liste chaine, et aussi une phrase par une liste chainne.
1- Ecrire une procdure qui permet la cration dune telle reprsentation.
2- Ecrire une procdure qui permet la recherche de la premire occurrence dun mot dans le paragraphe. Le
rsultat de la recherche donne la position de ce mot.
3- Ecrire une procdure qui permet linsertion dun mot M1 aprs un mot M2 donne. Si le mot ne se trouve
pas dans le paragraphe, on ne fait pas dinsertion.
4- Ecrire une procdure qui permet llimination dun mot M1 du paragraphe.
5- Ecrire une fonction qui permet la recherche dune phrase, donne par son premier mot, dans le
paragraphe le rsultat de la recherche donne la position de cette phrase dans le paragraphe.
6- Ecrire une procdure qui permet linsertion dune phrase ph1 aprs une phrase ph2 donne. Si la phrase
ph2 ne se trouve pas dans le paragraphe, on insert ph1 la findu paragraphe.
7- Ecrire une procdure qui permet llimination dune phrase ph1 du paragraphe.
PROGRAM paragraphe; #include<stdio.h>
#include<conio.h>
type ligne=^element; #include<alloc.h>
element=record #include<string.h>
info:string; typedef struct str1{
suivant:ligne; char info[20];
end; str1*suivant;
type para=^str; }*ligne;
str=record typedef struct str2{
line:ligne; ligne line;
suivant:para; str2*suivant;
end; }*para;
var L,q:ligne;
Pa,p:para; void creer_ligne(ligne &L)
{
procedure creation_ligne(var L:ligne); char mot[20];
var p,q:ligne; printf("Entrer une suite de mots ('.' pour
mot:string; terminer):");
begin scanf("%s",mot);
new(p); while(strcmp(mot,".")){
writeln('entrer une suite de mots (point"." pour int n=strlen(mot) ;
terminer):'); //printf("__%d",n);
readln(mot); ligne p=(ligne)malloc(sizeof(str1));
while mot<>'.' do //p->info=(char*)malloc(sizeof(char)*n);
begin strcpy(p->info,mot);
p^.info:=mot; p->info[n]='\0';
p^.suivant:=nil; p->suivant=NULL;
if L=nil then L:=p if(L==NULL) L=p;
else else{
begin ligne q=L;
q:=L; while(q->suivant!=NULL) q=q-
while q^.suivant<>nil do >suivant;
q:=q^.suivant; q->suivant=p;
q^.suivant:=p; }
end; //free(p->info);
readln(mot); scanf("%s",mot);
new(p); }
end; }
end;
void afficher_ligne(ligne L)
procedure afficher_ligne(L:ligne); {
var p:ligne; ligne p=L;
begin while(p->suivant!=NULL){
if L<>nil then // strcat(p->info," ");
begin printf("%s ",p->info);
p:=L; p=p->suivant;
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 {
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;
var p,q,m:para;
begin
p:=rechercher_phrase(Pa,l^.info);
if p=Pa then Pa:=p^.suivant
else
begin
q:=Pa;
while(q<>nil)and(q^.line<>p^.line) do
begin
m:=q;
q:=q^.suivant;
end;
if q<>nil then
m^.suivant:=q^.suivant;
end;
dispose(p); end;
Les Arbres Binaires
type Noeud=^element; typedef struct str{
element=record int cle;
cle:integer; str*g,*d;
g:Noeud; }*Noeud;
d:Noeud;
end;
Exercice 93
Ecrire la procdure du parcours dun arbre binaire en prordre.
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 procdure du parcours dun 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 procdure du parcours dun arbre binaire en ordre.
procedure ordre(A:Noeud); void ordre(Noeud A)
begin {
if A<>nil then if(A!=NULL){
begin ordre(A->g);
ordre(A^.g); printf("%d ",A->cle);
Exercice 97
Ecrire une procdure qui insert un lment 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 procdure qui supprime un lment 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){
if pt<>nil then pg=pt;
begin pt=pt->g;
while pt<>nil do }
begin pg->g=A->g;
pg:=pt; A=A->d;
pt:=pt^.g; }
end; else A=A->g;
pg^.g:=A^.g; }
A:=A^.d; else if(x==A->g->cle){
end pt=A->g->d;
else A:=A^.g; if(pt!=NULL){
end while(pt!=NULL){
else pg=pt;
if x=A^.g^.cle then pt=pt->g;
begin }
pt:=A^.g^.d; pg->g=A->g->d;
if pt<>nil then A->g=A->g->d;
begin }
while pt<>nil do else A->g=A->g->g;
begin }
pg:=pt; else if(x==A->d->cle){
pt:=pt^.g; pt=A->d->g;
end; if(pt!=NULL){
pg^.g:=A^.g^.d; while(pt!=NULL){
A^.g:=A^.g^.d; pd=pt;
end pt=pt->d;
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 crer un fichier dtudiants.
Program gest_fich; #include<stdio.h>
uses crt; #include<conio.h>
Type Date=record #include<alloc.h>
J,M,A:Integer; #include<string.h>
end; typedef struct{
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 dun 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('Prnom : ',Prn); i=fread(&E,sizeof(etudiant),1,Fetud);
Readln(Prn); }
Write('C.I.N : ',CIN); if(!strcmp(E.cin,CIN)){
Readln(CIN); etudiant
End; *Et=(etudiant*)malloc(sizeof(etudiant));
Seek(Fetud,N-1); cprintf("Nom : %s ",E.nom);
Write(Fetud,E); scanf("%s",nom);
Close(Fetud) strcpy(Et->nom,nom);
End; cprintf("Prenom : %s ",E.prn);
End; scanf("%s",prn);
strcpy(Et->prn,prn);
cprintf("C.I.N : %s ",E.cin);
scanf("%s",cin);
strcpy(Et->cin,cin);
getch();
cprintf("Date de naissance :%d/%d/%d
",E.date_nais.J,E.date_nais.M,E.date_nais.A);
scanf("%d",&J);printf("/");Et-
>date_nais.J=J;
scanf("%d",&M);printf("/");Et-
>date_nais.M=M;
scanf("%d",&A);Et->date_nais.A=A;
fwrite(Et,sizeof(etudiant),1,f);
}
i=fread(&E,sizeof(etudiant),1,Fetud);
while(i!=0){
fwrite(&E,sizeof(etudiant),1,f);
i=fread(&E,sizeof(etudiant),1,Fetud);
}
fclose(f);
fclose(Fetud);
remove("Gestion");
rename("tmptmp.$$","Gestion");
}
GESTION DE LCRAN
I. Notion de fentre
On peut dfinir une fentre dans un cran. Lcran actif sera rduit cette
fentre.
WINDOW(x1,y1,x2,y2) o :
x1 et y1 reprsentent les coordonnes du coin suprieur gauche de la
fentre.
x2 et y2 reprsentent les coordonnes du coin infrieur droit de la
fentre.
CONCLUSION
RFRENCES