Ecole Normale Supérieure Département d’Informatique Rabat
Encadr Enca dré é pa parr : Mr.Brahim Lamharchi Réalisé par : Benallou Imane Lazrak Chaïmae Razzoug Milouda
Année universitaire : 2003 / 2004
A l’occasion de la présentation de ce travail, nous tenons à exprimer notre gratitude et notre reconnaissance reconnaissan ce à Mr . Brahim Lamharchi, notre encadrant de projet de fin d’étude à l’Ecole Normale Supérieure de Rabat pour les conseils qu’il nous a prodigués tout au long de ce travail. Nous adressons également nos sincères remerciements à
Sommaire
Sommaire Introduction..........................................................................................................................1 ÉlÉments de base d’un programme en Pascal et en C.........................................................3 II-1.1 Les variables..................................................................................................4 II-1.2 Les constantes................................................................................................6 II-2.1 En langage Pascal .........................................................................................7 II-2.2 En langage C..................................................................................................8 II-3.1 En langage Pascal..........................................................................................8 II-3.2 En langage C..................................................................................................9 Structures de traitement alternatives et itÉratives.............................................................20 Notion de sous-programmes..............................................................................................27 Les structures de donnÉes statiques...............................................................................................................35 Les structures de donnÉes dynamiques.............................................................................44 Les fichiers.........................................................................................................................57 Solutions des exercices......................................................................................................65 Gestion de l’écran............................................................................................................174 Conclusion.......................................................................................................................176 Références........................................................................................................................177
ENS – Rabat – Département d’Informatique
Introduction
INTRODUCTION Un
programme informatique se compose d’une série d’instructions, qui sont exécutées successivement par l’ordinateur. Lors de la création d’un programme, il est nécessaire d’y inclure les instructions correspondant à la tâche qu’on souhaite voir accomplie par l’ordinateur. Le processus consistant à définir les instructions, devant être exécutées par l’ordinateur, se nomme programmation.
Beaucoup
de langages de programmation sont apparus au fil des années en commençant par les langages intimement liés à la machine (langage machine et assembleur), viennent après les langages dits évolués : interprétés tels que Basic et compilés tels que Pascal et C . Langage Pascal
Le
langage Pascal est un langage de programmation de haut niveau. Il a été conç conçuu par par le prof profes esse seur ur WIRTH à Zurich en 1970 comme une aide à l’enseignement de la programmation structurée . Langage C
Le
langage C a été créé en 1972 par Denis Denis RITCHIE RITCHIE avec avec un obj object ectif if relativement limité : écrire un système d’exploitation (UNIX). Mais, ses qualités opér op érat atio ionn nnel elle less l’on l’ontt très très vite vite fait fait adop adopté té par par un unee larg largee comm commun unau auté té de programmeurs. Une
prem premiè ière re versi version on du lang langag agee est est appa apparue rue en 19 1978 78 avec avec l’ou l’ouvr vrag agee de Kernighan et Ritchie « The C programm programming ing language language ». Mais le langage a continué d’évoluer après cette date à travers les différents compilateurs qui ont vu le jour. Son succès internationnel a amené l’ANSI (American National Standard Institute) à définir un C standard (on ( on le qualifie souvent par le C ANSI). Choix du sujet
’enseig seigne neme ment nt L’en
de l’in ’inform formaatiqu tiquee se répa répand nd de plus plus en plu plus dans ans les les établissements scolaires et pour toutes les options, à l’université, aux écoles d’ingénieurs, plus récemment dans les lycées et collèges et même dans les écoles primaires privées.
ENS – Rabat – Département d’Informatique
1
Introduction
En
particulier, l’enseignement de l’algorithmique et de la programmation est, et reste toujours un passage obligatoire pour la formation des futurs informaticiens. Malgré l’apparition d’autres systèmes de programmation très évolués et reposant sur sur la prog program ramma mati tion on orien orienté téee ob obje jets ts,, ceux ceux-c -cii rest resten entt liés liés aux aux lang langag ages es de programmation de base tels que Pascal et C.
Objectif
Notre
objectif c’est de palier aux difficultés que le programmeur (universitaire, élève ingénieur, analyste-programmeur, etc.) puisse rencontrer au moment de son apprentissage en lui proposant une série d’exercices diversifiés et couvrant la totalité des notions de base de la programmation. On lui propose aussi, à la fin du document, toutes les solutions des exercices proposés en Pascal et en C.
ENS – Rabat – Département d’Informatique
2
Eléments de base d’un programme en Pascal et en C
ÉLÉMENTS DE BASE D’UN PROGRAMME EN PASCAL ET EN C
I- Structure d’un programme I-1. En langage Pascal
Un programme PASCAl PASCAl se compose des éléments éléments suivants : qui se compose du mot réservé PROGRAM suivi d’un identificateur du nom du programme, suivi du point virgule ‘ ;’.
1- En-tête
Exemple : PROGRAM Operations ; 2- Préambule déclaratif qui comporte :
La déclaration des bibliothèques utilisées, précédée par le mot réservé USES US ES.. Les Les iden identi tifi fica cate teur urss des des bibl biblio ioth thèq èque uess sont sont sépa séparé réss par par des des virgules et la liste est terminée ter minée par un point virgule ‘;’. Exemple : USES Crt, Graph, Dos ;
La déclaration des identificateurs de types de données, définis par l’utilisateur, précédée par le mot réservé TYPE. Exemple : TYPE Nombre = 0..99 ;
La déclaration des identificateurs de constantes, précédée par le mot réservé CONST. Exemple : CONST Pi = 3.14 ;
La déclaration des identificateurs de variables, précédée par le mot réservé VAR. Exemple : VAR A : INTEGER ;
3- Défini Définitio tion n des différ différent entss sous-p sous-prog rogram rammes mes
(voi (voirr chap chapit itre re des des sous sous--
programmes). ENS – Rabat – Département d’Informatique
3
Eléments de base d’un programme en Pascal et en C
: ce bloc commence par le mot réservé réservé BEGIN suivi d’une séquence séquence d’instru d’instructio ctions ns (séparées (séparées par par des points points virgules ‘ ;’) et se termine par le mot réservé END suivi du point ‘ .’. 4- Définition du bloc principal du programme
I-2. En langage C 1- Préambule déclaratif qui comporte :
La déclaration des bibliothèques utilisées, précédée par le mot réservé ‘#include’ Exemple : #include
La déclaration de l’identificateur de constante, précédée par le mot réservé define. Exemple : Define Pi 3.14.
La déclaration des identificateurs de variables, précédée par le type des variables et suivie du point virgule ‘ ;’. Exemple : int x ;
2- En-tête : précise réservé Main().
le début du programme principal. Il se compose du mot
3- Définition du bloc principal du programme : ce bloc commence accolade ouvrante ’{‘ et se termine par une accolade fermante ‘}’.
par une
II- Types de données II-1. Variables et constantes II-1.1 Les variables
On appe appell llee vari variab able le,, un empl emplac acem emen entt mémo mémoir iree dans dans lequ lequel el est est codé codéee un unee information que l’on peut modifier et utiliser grâce à un identificateur. Toute variable doit être déclarée avant d’être utilisée. En langage Pascal
ENS – Rabat – Département d’Informatique
4
Eléments de base d’un programme en Pascal et en C
Syntaxe : Var : ;
Exemple : var x : integer ; Variables globales et variables locales Les variables déclarées dans la partie déclaration du programme sont dites globales. Les variables déclarées dans la partie déclaration d’un sous-programme sont dites locales. Les variables globales sont connues par tous les sous-programmes, tandis que les variables locales sont connues seulement par le sous-programme dans lequel elles sont déclarées.
ENS – Rabat – Département d’Informatique
5
Eléments de base d’un programme en Pascal et en C
En langage C Syntaxe : ;
Le de l’identificateur peut être composé de chiffres, de lettres et du caractère ‘_’. Le premier caractère doit être nécessairement une lettre. Exemple : int ident_1 Variables globales et variables locales
Selon l'endroit où on déclare une variable, celle-ci pourra être accessible (visible) de partout dans le code ou bien dans une portion confinée de celui-ci (à l'intérieur d'une fonction par exemple), on parle de portée (ou visibilité ) d'une variable. Lorsqu'une variable est déclarée à l'extérieur de toute fonction ou de tout bloc d'instructions, d'instruction s, elle est accessible de partout dans le code (n'importe quelle fonction du programme peut faire appel à cette variable). On parle alors de variable globale. Lorsque l'on déclare une variable à l'intérieur d'un bloc d'instructions (entre des accolades), sa portée se confine à l'intérieur du bloc dans lequel elle est déclarée. II-1.2 Les constantes
Contrairement à une variable, une constante ne peut être modifiée (théoriquement). En langage Pascal
: const = valeur ; Exemple :
Syntaxe
Remarque
Contrairement aux variables, il n'est nullement besoin de spécifier le type de la constante. On peut tout de même le faire, en utilisant le double point, comme pour les variables. Exemple : const Gravite : Real = 9.81; En langage C Syntaxe :
const = valeur ;
ENS – Rabat – Département d’Informatique
6
Eléments de base d’un programme en Pascal et en C
II-2. Les types de base II-2.1 En langage Pascal Type
Description
Shortint Integer
Entiers courts Entiers "relatifs"
Longint
Entiers lo longs
Byte Word
Entiers sur 1 Bit (Byte ou Octet) Entiers sur 2 Bits (Word ou Mot)
Intervalle
Exemples
Mémoire requise
-128 à 127 -32 768 à 32 767 -2147483648 à 2147483647
-125; 0; 32 -30 000; 421; -12 545 454; 3 257
1 octet 2 octets
0 à 255
12; 157
1 octet
0 à 65 535
27; 4 589
2 octets
Real
Nombres réels
2.9E-39 à 1.7E38
Single
Nombres décimaux (simple précision)
1.5E-45 à 3.4E38
Double
Nombres décimaux (double précision)
5E-324 à 1.7E308
Extended Nombres réels
3.4E -4932 à 1.1E4932
Comp Boolean
Entier logique sur 1 octet
String
Chaîne de caractères
String[n]
Chaîne de n caractères
Char
1 caractère
-9.2E18 à 9.2E18 false ou true 256 caractères au maximum (0 à 255) n caractères maximum 1 caractère maximum
ENS – Rabat – Département d’Informatique
4 octets
3.1415; 789.457851 3.1415926; 178 925.455678 54.5899; 9 897 669 651.45568959 3.14159265458; 9.81 -271; 6 548 false; true
8 octets 1 octet
'Hello!'; 'Allezvous bien ?'
256 octets
String[6]>'Hello!'
n octets
'R'
1 octet
6 octets 4 octets 8 octets 10 octets
7
Eléments de base d’un programme en Pascal et en C
II-2.2 En langage C Type de de do données
Signification
Char
Taille (en octets)
Plage de valeurs acceptée
1
-128 à 127
1
0 à 255
2
-32768 à 32767
Caractère Caractère non unsigned char signé short int Entier court Entier court non unsigned short int signé int Entier unsigned int Entier non signé
2
0 à 65535
2 2
long int
4
-32768 à 32767 0 à 65535 -2 147 483 648 à 2 147 483 647
unsigned long int float double long double
Entier long Entier long non signé flottant (réel) flottant double flottant double long
2
0 à 4 294 967 295
4 8
3.4*10 -38 à 3.4*1038 1.7*10 -308 à 1.7*10 308
10
3.4*10-4932 à 3.4*10 4932
II-3. Créer un type de données II-3.1 En langage Pascal
Il est possible au programmeur de créer ses propres types. Les types doivent être déclarés avec le mot-clef Type à fortiori avant la déclaration des variables. Exemple
Type matrice = Array[1..10,1..10] of integer; Définit un type nommé matrice pour représenter r eprésenter une matrice carrée d’ordre 10. Type énuméré Dans la déclaration d’un type énuméré, il faut énumérer toutes les valeurs de ce type. Syntaxe : typee nom_du typ nom_du_ty _type pe = (ident (identifi ificat cateur eur_1, _1, identi identific ficate ateur_ ur_2,. 2,..,., identificateur_n) ENS – Rabat – Département d’Informatique
8
Eléments de base d’un programme en Pascal et en C
( lundi, mardi, mercredi, jeudi, vendredi, samedi, Exemple : type jour = (lundi, dimanche) ; Type intervalle Syntaxe : type nom_du_type = début_de_l_intervalle..fin_de_l_intervalle début_de_l_intervalle..fin_de_l_intervalle Exemple : Type age = 1..150 ; Déclare un type nommé age dont les valeurs sont des entiers compris entre 1 et 150. II-3.2 En langage C
Caracteristiques_du_type Nom_du_type Syntaxe : typedef Caracteristiques_du_type Où : Caracteristiques_du_type : représente un type de données existant (par exemple float, short int, etc.) Nom_du_type : définit le nom qu’on donne au nouveau type de données. Exemple : typedef short int entier Le type énuméré Le type énuméré donne une liste de constantes par énumération. Le premier identificateur a, par défaut, la valeur 0, le second a la valeur 1, etc. Une variable de type énuméré est une variable entière. Exemple :
typedef enum = {JAUNE = -2, ROUGE, VERT, VIOLET, BLEU} COULEUR; main() { COULEUR coul1, coul2; coul1 = VERT; // coul1 = 0 coul2 = coul1+2; // coul2 = 2 }
III- Opérateurs et expressions III-1. En langage Pascal
Les Les expr expres essi sion onss sont sont comp compos osée éess d’op d’opér érat ateu eurs rs et d’op d’opéra érand ndes es.. La plupart des opérateurs sont binaires, c’est à dire qu’ils mettent en œuvre deux opérandes (exemple A+B). Les opérateurs à un opérande ENS – Rabat – Département d’Informatique
9
Eléments de base d’un programme en Pascal et en C
sont dits unaires (exemple –A). Dans les expressions plus complexes, l’existence de règles de priorité permet d’éliminer toute ambiguïté dans l’ordre de réalisation des opérations. Table de priorité des opérateurs Or dr
Opérateur s
Or dr
Opér ateur s
+,*, /, DIV, MOD (+), (-)
0
(,[
5
1
OR
6
2
AND
7
3
NOT < , >, <= , >= , <> , =
8
4
9
Remarque : (+) et (-) deux opérateurs unaires.
Les trois règles fondamentales de priorité des opérateurs sont les suivantes : 1- Un opérande placé entre deux opérateurs de priorités différentes sera lié à celui possédant la priorité la plus élevée. 2- Un opérande placé entre deux opérateurs de même priorité sera lié à celui qui se trouve à gauche. 3- Les expressions contenues entre parenthèses sont évaluées d’abord afin de traiter leur résultat comme un seul opérande. Dans une expression arithmétique, les opérateurs sont les opérateurs arithmétiques (+,-,*, /, DIV, MOD). Un opérande peut être : - Un nom de variable ou de constante numérique. - Une constante numérique. - Un nom de fonction de type numérique tel que COS, SIN, etc. Une Une expr expres essi sion on logi logiqu quee simp simple le est est un unee comp compara arais ison on entr entree deux deux ENS – Rabat – Département d’Informatique
10
Eléments de base d’un programme en Pascal et en C
expressions arithmétiques. Les opérateurs de comparaison sont =, <>, <, >, <=, >=. Une expression logique est la composée d’expressions logiques simples par les opérateurs logiques : - OR et AND opérateurs logiques logiques binaires, OR pour pour la disjonction disjonction et AND pour la conjonction. - NOT opérateur unaire, NOT opérateur de négation. III-2. En langage C
Opérateurs arithmétiques
Une expression peut comporter des opérations. Les objets d’une opération sont les opérandes, qui sont manipulés par les opérateurs. Opérateur
Fonction
Nbre d'opérandes
*
Opposé Multiplicati on Division Modulo (reste) Addition Soustraction
1 2
/ % + -
2 2 2 2
L'opérateur modulo ne peut s'appliquer qu'à deux entiers, le résultat est le reste de la division entière. Remarque :
Opérateurs d’égalité, relationnels et logiques
Ces opérateurs travaillent sur des opérandes ayant deux valeurs : nul (faux) et non-nul (vrai). Le résultat est soit nul (faux), soit non-nul (vrai). L'opérateur && (ET logique) a pour résultat vrai si les deux opérandes ont une valeur vraie. L'opérateur || (OU logique) a pour résultat vrai si l'un au moins des deux opérandes a une valeur vraie. Les évaluations des opérations logiques sont effectuées de la gauche vers la droite. On peut imposer un ordre en utilisant des parenthèses. L'évaluation cesse dès que la valeur de l'expression est établie. ENS – Rabat – Département d’Informatique
11
Eléments de base d’un programme en Pascal et en C
Opérateur
Fonction
Nbre d'opérandes
! < <=
NON logique Inférieur Inférieur ou égal Supérieur Supérieur ou égal Égalité Inégalité ET logique OU logique
1 2 2
> >= == != && ||
2 2 2 2 2 2
Les opérateurs d'égalité et logiques ne doivent pas s'appliquer sur des flottants à cause des erreurs d'arrondi. Pour tester l'égalité à 0 d'un réel, il est préférable de tester que sa valeur absolue est inférieure à un ε très petit. Remarque :
Opérateurs de décrémentation et d'incrémentation d'incrémentation
Syntaxe :
OP ou OP
Où OP est l’un des opérateurs ++ ou --. L’expressio L’expressionn le_nombre le_nombre = le_nombre le_nombre +1 peut être remplacé par le_nombre++ le_nombre++ ou ++le_nombre. Mais, ces expressions ne sont pas équivalentes ; la valeur de l’expres ression le_nombre+ re++ est égale à la valeur de le_nombre avant l’in l’incr crém émen enta tati tion on alor alorss qu quee ++le_ ++le_no nomb mbre re a po pour ur vale valeur ur le_n le_nom ombr bree aprè aprèss l’incrémentation. L’opérateur de décrémentation a le même comportement que le précédent. Ainsi l’instruction le_reel-- diminue de 1 le contenu de le_reel. Exemple : i++
Opérateur conditionnel
Cet opérateur nécessite trois opérandes et s'apparente à un "si". Syntaxe : expr1?expr2:expr3;
ENS – Rabat – Département d’Informatique
12
Eléments de base d’un programme en Pascal et en C
expr1 est évaluée. Si elle est vraie, le résultat est la valeur de expr2, sinon le résultat est la valeur de expr3. Exemple : a==b?a=2:b=3;
Opérateurs sur les bits
Les opérandes de ces opérateurs doivent être de type entier ( char, int, long, short), mais ils sont traités comme une suite de bits (donc de 0 et de 1). L'opérateur ~ remplace chaque 0 par 1 et vice-versa. Les opérateurs &, ^ et ! opèrent sur chaque bit indépendamment. Ils sont associatifs. expr1 << expr2 décale tous les bits de expr1 de expr2 positions positions vers la gauche gauche ; les bits vacant sont remplis par des 0. expr1 >> expr2 décale tous les bits de expr1 de expr2 positions vers la droite ; il ne remplit les bits vacants par des 0 que si expr1 est de type unsigned, sinon, selon les implémentations, il insère des copies du bit de signe ou des 0. Opérateur
Fonction
Nbre d'opérandes
~
Complémentatio nà1 Décalage à gauche Décalage à droite ET logique OU exclusif OU logique
1
<< >> & ^ |
2 2 2 2 2
Exemple: unsigned char val = 1;
// 00000001 val = val << 3; // 00001000 val = val >> 2; // 00000010 Remarque: Ne pas confondre les opérateurs sur les bits & et | et les opérateurs sur les expressions && et ||.
ENS – Rabat – Département d’Informatique
13
Eléments de base d’un programme en Pascal et en C
Oprérateur sizeof
L’op L’opér érat ateu eurr size sizeof of four fourni nitt la tail taille le en octe octets ts.. Pa Parr exem exempl ple, e, dans dans un unee implémentation où le type int est représenté sur 2 octets, si l’on suppose que l’on a affaire à la déclaration int n ; l’expresion sizeof(n) vaudra 2.
Priorité entre opérateurs
Les priorités entre opérateurs définissent l'ordre dans lequel ils sont exécutés. Le tableau suivant récapitule tous les opérateurs avec leur priorité. En langage C, un certain nombre de notations servant à référencer r éférencer des objets sont considérée considéréess comme des opérateurs opérateurs et, en tant que tels, soumises à des règles de priorité. Ce sont essentiellement : - les références à des éléments d’un tableau réalisées par [ ] ; - des références à des champs d’une structure opérateur -> ; - des opérateurs d’adressage * et &. Ces opérateurs seront étudiés ultérieurement dans les chapitres correspondant aux tableaux, structures et pointeurs. Catégorie
référence unaire arithmétique arithmétique décalage relationnels relationnels manip. de bits manip. de bits manip. de bits logique logique conditionnel
Opérateurs
() [ ] - > . + - ++ -- | ~ * & */% +<< >> < <= > >= == != & ^ | && || ?:
ENS – Rabat – Département d’Informatique
14
Eléments de base d’un programme en Pascal et en C
Catégorie
affectation
Opérateurs
= += -= /= %= &= ^= |= <<= >>=
IV- Instructions simples IV-1. Instructions d’entrée
Une instruction d’entrée permet d’entrée permet de lire une donnée à partir du clavier. En langage Pascal: Syntaxe :
Read (V 1, V2,…., Vn) Où V i est une variable de tout type simple (sauf énuméré) ou de type chaîne de caractères. ReadLn (V1,V2,...Vn) même effet que Read, mais il faut taper la touche Entrée après l’entrée de la donnée. L’instruction ReadLn (sans argument) attend la frappe de la touche Entrée au clavier. Exemple : read(x) ; En langage C:
La fonction scanf scanff (fo (form rmat at,, lis liste te_d _d’a ’adr dres esse ses) s) Syntaxe : scan Format : constante chaîne (entre ""), Pointeur sur une "chaîne de caractères" Scanf("%d",&x) ; Le tableau suivant présente les différents formats existants :
Format
c d hd hu
Type de la Ivalue correspondant
char int short int unsigned short
ENS – Rabat – Département d’Informatique
15
Eléments de base d’un programme en Pascal et en C
ld long int lu unsigned long f Float lf double s chaîne de caractères u unsigned int Liste_d’adresses : liste de "lvalue", séparées par des virgules, d’un type en accord avec le code de format correspondant. La macro getchar()
Elle permet la lecture d’un caractère. L’expression : c=getchar(), joue le même rôle que : scanf("%c",&c). IV-2. Instructions de sortie
Une instru struct ctiion de sort ortie perm permeet l’af l’affi fich chaage sur sur l’éc ’écran ran des val valeurs eurs correspondantes aux arguments considérés. En Pascal Syntaxe
Write (val1,val2,…,valn) Où vali est une valeur d’une donnée constante ou variable (sauf type énuméré), une constante chaîne de caractères, ou une valeur d’une expression. WriteLn(val1,val2,…valn) même effet que Write, mais le curseur passe à la ligne suivante après l’affichage. Exemple : write(‘salut ’,nom) ; Remarque : •
Une Une cons consta tant ntee chaî chaîne ne de carac caractè tère ress est est mi mise se entr entree apos apostro troph phe. e. Une Une apostrophe comprise dans une chaîne doit être dédoublée.
•
L’instruction WriteLn (sans arguments) permet un saut de ligne.
En langage C : La fonction printf Syntaxe
:
prin printf tf (for (forma mat, t, list liste_ e_d’ d’ex expr pres essi sion ons) s)
ENS – Rabat – Département d’Informatique
16
Eléments de base d’un programme en Pascal et en C
Format : constante chaîne chaîne (entre ""), Pointeur sur une "chaîne de caractères" Liste_d’expressions : suite d’expressions séparées par des virgules d’un type en accord avec le code format correspondant. Exemple : printf("salut %s",nom) ; La macro putchar
Permet l’écriture d’un caractère. L’expression putchar(c), joue le même rôle que : printf("%c",c). IV-3. Instruction d’affectation En langage Pascal Pasca l :
Cette instruction permet de transcrire une valeur dans une variable. Le symbole d’affectation est ‘ := ’ Syntaxe : := ;
Où la variable peut être de tout type et la valeur peut être une valeur constante, la valeur d’une donnée constante ou variable, la valeur d’une fonction, ou le résultat d’une expression. Exemple : x :=2 ; En langage lang age C :
Affectation ordinaire
Synt Syntax axee :
= ;
Exemple : x=2 ; Remarque :
La valeur affectée à une variable doit être de même type ou de type compatible à celui de la variable.
Notion de Ivalue
On constate que l’opérateur d’affectation impose des restrictions sur son premier opérande. En effet, ce dernier doit doit être une référence à un emplacement mémoire ENS – Rabat – Département d’Informatique
17
Eléments de base d’un programme en Pascal et en C
dont on pourra effectivement modifier la valeur. Dans les autres langages, on désigne souvent une telle référence par le nom d’une variable. Cependant, en langage C, la syntaxe est telle que cette notion de vari variab able le n‘es n‘estt pas pas asse assezz préc précis ise. e. Il faut faut intr introd odui uire re un mo mott no nouv uvea eauu : la « Ivalue » ; ce terme désigne une valeur à gauche, c’est-à-dire tout ce qui peut apparaître à gauche d’un opérateur d’affectation.
Affectation élargie
Le langage C permet de condenser les affectations de la forme : Ivalue = Ivalue opérateur expression En : Ival Ivalue ue op opér érat ateu eur= r= expre express ssio ionn Cette Cette possib possibili ilité té concern concernee tou touss les opérat opérateur eurss bin binair aires es arithm arithméti étique quess et de manipulation de bits (voir chapitre suivant). La liste complète de tous ces nouveaux opérateurs d’affectation élargie est : +=, -=, *=, /=, %=, |=, ^=, &=, <<= et >>=. Remarque
Ne confondez pas l’opérateur de comparaison <= avec un opérateur d’affectation élargie. Notez bien que les opérateurs de comparaison ne sont pas concernés par cette possibilité.
V-Enoncé des exercices Exercice 1
Ecrire un programme qui permet d’afficher le message suivant : mon premier programme. 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. Exercice 3
Ecrire un programme qui échange 3 entiers. Exercice 4
Ecrire un programme qui demande à l'utilisateur les coordonnées de 2 points distincts du plan et qui affiche les coordonnées du point milieu. Exercice 5
ENS – Rabat – Département d’Informatique
18
Eléments de base d’un programme en Pascal et en C
Ecrire un programme qui demande à l'utilisateur une valeur pour U 0, r et n et qui affiche la n ième valeur de la suite arithmétique définie par U 0 et U n+1 = Un + r. (On rappelle la propriété : U n = U0 + n.r ).
ENS – Rabat – Département d’Informatique
19
Structures de traitement alternatives et itératives
STRUCTURES DE TRAITEMENT ALTERNATIVES ET ITÉRATIVES
Les instru instructi ctions ons structurées sont sont des des inst instru ruct ctio ions ns comp compos osée éess d’au d’auttres res inst instru ruct ctio ions ns deva devant nt être être exéc exécut utée éess sous sous cert certai aine ness cond condit itio ions ns (ins (instru truct ctio ions ns conditionnelles) ou répétées plusieurs fois (instructions répétitives).
I- Instructions conditionnelles En langage Pascal Pasca l :
Syntaxe
Instruction IF…Then
: IF THEN ;
Si est vraie, le bloc d’instructions sera exécuté, sinon il sera ignoré. Cette instruction représente l’alternative simple (instruction de choix unaire). Exemple : if a=b then a :=a+b ;
Syntaxe
Instruction IF…THEN…ELSE IF…THEN…ELSE
: IF THEN ELSE ;
Si est vraie, le bloc d’instructions sera exécuté et le bloc d’instructions sera ignoré, sinon c’est le bloc d’instructions qui sera exécuté et le bloc d’instructions sera ignoré. Cette instruction représente l’alternative complète (instruction de choix binaire). Exemple : if a>b then a:=a-b
Else a:=b-a; Remarque : la clause ELSE ne doit pas être précédée par un point virgule ‘ ;’.
Instruction CASE
ENS – Rabat – Département d’Informatique
20
Structures de traitement alternatives et itératives
L’in L’inst stru ruct ctio ionn CASE CASE est est cons consti titu tuée ée d’un d’unee expr expres essi sion on de type type scal scalai aire re,, représentant le sélecteur, et d’une liste de blocs d’instructions ; chacun étant précédé par une étiquette de cas de même type que le sélecteur. Le bloc d’inst d’instruc ructio tions ns exécut exécutéé est celui celui dont dont l’étiq l’étiquet uette te de cas corresp correspond ond à la valeur valeur courante du sélecteur. Une étiq tiquett uettee de cas cas est est cons consttitué ituéee de tou ouss nom ombr bres es de cons consttant antes ou d’intervalles, séparés par des virgules et terminés par le symbole ’ :’. Syntaxe :
CASE OF Val1 : ; Val2 : ; .......................... Valn : ; ELSE ; END; En langage lang age C :
Instruct Inst ruction ion IF :
Syntaxe :
if (expression) instruction
Expression : expression quelconque. Instruction : instruction simple terminée par un point virgule, bloc d’instructions placées entre { et }, ou instruction structurée.
Instruct Inst ruction ion IF…Else IF…E lse : Synt Syntax axee :
IF (expression) instruction1 ELSE instrucion2
Instruction SWITCH: Syntaxe:
Switch(expression) { case constante1: [suite_d’instruction1] [ suite_d’instruction1] case constante2: [suite_d’instruction2] .......................................................... case constante n: [suite_d’instruction [ suite_d’instruction n] [default : suite_d’instruction ] } ENS – Rabat – Département d’Informatique
21
Structures de traitement alternatives et itératives
Expression : expression entière quelconque, Constante : expression constante d’un type entier quelconque (char est accepté car il sera convertit en int), Suite_d’instructions : séquence d’instructions quelconques. N.B : les les croch crochet etss ([et ([et]) ]) sign signif ifie ient nt qu quee ce qu qu’i ’ils ls renf renferm ermen entt est est facultatif. L’exécution de l’instruction switch commence par évaluer l’expression figurant après le mot switch, ensuite, chercher l’étiquette de la forme case x corr corres esppon onddant ant à la valeu aleurr ob obttenu enue et exéc xécute uter, enfi enfin, n, l’instruction figurant après cette étiquette. Dans le cas où l’étiquette ne figure pas dans la liste, c’est c’ est le bloc par défaut qui est exécuté. Remarque : •
•
On peut peut ajoute ajouterr l’inst l’instruc ructio tionn break qui permet de sortir de l’instruction switch juste après l’exécution du bloc de l’étiquette choisie. Switch(expression) { case constante1: [suite_d’instruction1] [ suite_d’instruction1] break ; case constante2: [suite_d’instruction2] break ; .......................................................... case constante n: [suite_d’instruction [ suite_d’instruction n] break ; [default : suite_d’instruction ] } les “case” peuvent apparaître dans n’importe quel ordre.
II- Instructions répétitives Structu res
Tant que Répéter -
En langage Pascal
En langage C
While Do Repeat
While () Do While(
ENS – Rabat – Département d’Informatique
22
Structures de traitement alternatives et itératives
jusqu’à
Pour
Until For comp :=Vint To Valf Do For comp :=Vint DownTo Valf Do
n>) For ( ;)
III- Enoncé des exercices Exercice 6
Ecrire un programme qui échange les contenus de 2 données si elles sont de signes contraires. Exercice 7
Ecrire un programme qui échange les contenus de 2 données si elles sont de signes contraires, sinon, il met leur produit dans la première donnée et leur somme dans la deuxième Exercice 8
Ecrire un programme qui, étant donné un mois et son premier jour, affiche le premier jour du mois suivant. Exercice 9
Ecrire un programme qui calcule la somme des N premiers termes positifs. Exercice 10
Ecrire un programme qui calcule la somme des N premiers termes positifs impairs.
ENS – Rabat – Département d’Informatique
23
Structures de traitement alternatives et itératives
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/2 n (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 série 1+1/2-1/3+1/4- 1/5+ …±1/N donne un résultat égal (à 1/100 près) à 1,33. Exercice 15
Ecrire un programme qui donne la plus grande valeur inférieure à 1000 de la somme 1+2+4+8+…+2 N. Exercice 16
Ecrire un programme qui calcule la somme 1+x+x 2+…+xn (x réel et n entier). Exercice 17
Calcul approché de Soient les deux suites: A n+1= (An+Gn)/2 et Gn+1=2AnGn/(An+Gn) avec A0=x et G0=1, on montre que lim A n=lim Gn= n∞ n∞ Ecrire un programme qui donne la valeur de avec une précision relative Є=10-6, c’est à dire |An-Gn|/|Gn|<Є x
x
x
Exercice 18
Sachan Sach antt qu quee la somm sommee 1-1/ 1-1/3+ 3+1/ 1/55-1/ 1/7+ 7+1/ 1/99-…, …, tend tend vers vers П/ П/4. 4. Écri Écrire re un -6 programme qui calcule le nombre П à 10 près Exercice 19
Le développement limité de la fonction sinus au voisinage de zéro est sin x= x x3/3! + x5/5! -…+(-1)p x2p+1/(2p+1)!+… Ecrire un programme qui calcule sin x à 10 -6 près. Exercice 20
Ecrire un programme programme qui calcule calcule la somme, le produit produit et la différence de deux données numériques. Exercice 21
Ecrire un programme qui retourne le code d’une donnée de type Caractere.
ENS – Rabat – Département d’Informatique
24
Structures de traitement alternatives et itératives
Exercice 22
Ecrire un programme qui calcule le salaire net d’un employé, sachant que celuici a assuré un certain nombres d’heures de travail à un prix fixe par heure, et que l’employeur doit réduire de son salaire des charges qui sont calculées avec un coefficient donné. Exercice 23
Ecri Ecrire re un prog progra ramm mmee qu quii perm permet et de repr repren endr dree l’ex l’exer erci cice ce préc précéd édan antt en considérant que l’employé a assuré des heures normales, des heures à 25% et des heures à 50%. Exercice 24
Ecrire un programme qui retourne si une donnée numérique est paire ou impaire (utiliser le reste de la division par 2). Exercice 25
Ecrire un programme qui permet de lire trois données numériques et retourne si la troisième donnée est la somme des deux autres ou pas. Exercice 26
Ecrire un programme qui, à partir du salaire brut d’un employé, détermine l’impôt à payer sachant que les règles de calcul des impôts sont comme suit : salaire brut(SB)
SB<1500 1500<=SB<3000 3000<=SB<5000 SB>=5000
l’impôt à payer
0% 10% du SB 450+30%(SB-3000) 750+40%(SB5000)
Exercice 27
Ecrire un programme qui fournit les racines de l’équation Ax 2+Bx+C=0.
Exercice 28
Ecrire un programme qui, étant donnée une date (jour, mois, année), affiche la date du jour suivant. Exercice 29
Ecrire un programme qui, étant donnée une date (jour, mois, année), affiche la date du jour précédent. Exercice 30
Ecrire un programme qui calcule la somme 5+6+7+….+N (N>=5). Exercice 31
ENS – Rabat – Département d’Informatique
25
Structures de traitement alternatives et itératives
Ecrire un programme qui calcule le produit des N (N>0) premiers entiers positifs. 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 données numériques si leur somme est paire, sinon il met la somme des trois dans la première donnée, leur produit dans la seconde et la valeur zéro dans la troisième. Exercice 34
Ecrire un programme qui calcule la somme 1-1/2+1/3-1/4+…±1/N.
ENS – Rabat – Département d’Informatique
26
Notion de sous-programmes
NOTION DE SOUS-PROGRAMMES
Un sous-programme permet : • d’éviter d’appliquer à plusieurs endroits d’un programme le même traitement, même s’il porte sur des objets différents. d’appl pliq ique uerr sous sous forme forme tran transp sport ortab able le un trai traite teme ment nt do dont nt on prév prévoi oitt qu quee • d’ap d’autres programmes peuvent aussi en avoir besoin. • de dégager d’un programme des tâches de moindre importance ne laissant dans son corps que la partie importante de l’algorithme d’où le gain de lisibilité et de sécurité.
I. En langage Pascal Les sous-programmes en Pascal sont des procédures et des fonctions. I.1 Les procédures
Une procédure doit être déclarée dans un programme, ou dans une procédure, avant le corps du programme (de la procédure) et après les déclarations des variables. Le nom de la procédure est un identificateur qui, comme les autres déclarations environnantes, sera local au programme ou à la procédure l’environnant. La structure d’une procédure est à peu près celle d’un programme, l’en-tête diffère, la procédure se termine par un point virgule au lieu d’un point. Syntaxe : procedure ; ; Begin ; End ; Paramètres formels
La déclaration des procédures peut être suivie d’une liste de paramètres entre parenthèses. Un paramètre formel est destiné à être remplacé, chaque fois que la
ENS – Rabat – Département d’Informatique
27
Notion de sous-programmes
procédure est activée, par un autre objet dit paramètre effectif, le plus souvent une variable, ou le résultat d’une expression, de la procédure appelante. Syntaxe : Procedure ( .., : ;.. ; ,.., : ) ) ; Où = rien ou var. Paramètres par valeurs et paramètres par adresse
Les objets sont transmis comme données dont la valeur valeur doit être inchangée par la procédure appelée (on dit qu’on a une lecture pure). Les objets sont transmis comme résultat dont la valeur doit être calculée par la procédure appelée et transmise à la procédure appelante (on dit qu’on a une écriture pure). Les objets sont transmis comme données qui doivent être modifiées par la procédure appelée (on dit qu’on a une lecture-écriture). En Pascal, la transmission des paramètres se fait de deux manières : • Transmission par valeur (lecture pure). Transmission par adresse (écriture pure, lecture-écriture). On indique les paramètres transmis par adresse, adresse, précédés par le le mot réservé Var, Var, les autres ne sont précédés par aucune chose. •
I.2 Les fonctions
Une fonction fonction en Pascal se comporte comporte comme une procédure procédure sauf que la fonction fonction doit fournir un résultat, elle a donc un type. Syntaxe : Fu Func ncttion ion : e> ; Function ( ) : ; Dans le corps de la fonction, on doit trouver quelque part l’affectation d’une valeur à l’identificateur l’identificateur de la fonction. Exemple : Function Minimum (x, y : Integer ) : Integer ; Begin If x
II. En langage C ENS – Rabat – Département d’Informatique
28
Notion de sous-programmes
Les fonctions sont les seuls sous-programmes en C; elles permettent de regrouper des instructions et de lancer leur exécution grâce à un identificateur. La fonction peut admettre des paramètres. La fonction peut retourner une valeur. La définition d’une fonction est composée de deux éléments : •
son prototype protot ype :
Permet de préciser la classe de mémorisation, le type, l’identificateur et les paramètres de la fonction ; c’est l’entête de la fonction. Synt Syntax axee :
[classe][t [classe][type]< ype] teur>([liste ([liste des paramètres paramètres formels]). formels]). La liste est composée de la déclaration des paramètres formels : ,,…,. Si la liste est vide alors elle peut être remplacée par le mot void. •
Son So n corps corps : c’est un bloc d’instructions
[classe][type]([liste [classe][type]([liste des paramètres formels]) { … … }/*fin de la fonction*/ Dès qu’une instruction de retour est rencontrée, l’exécution de la fonc foncti tion on s’in s’inte terr rrom ompt pt.. Cett Cettee inst instru ruct ctio ionn perm permet et de tran transm smet ettr tree éventuellement une valeur au programme appelant. Synt Syntax axee :
return ; /* pas de valeur retournée*/ return ; return() ; Si la fonc foncti tion on ne cont contie ient nt pas pas l’in l’inst stru ruct ctio ionn return, elle elle s’ac s’achè hève ve automatiquement à la fin de son bloc. Passage des paramètres par valeur
ENS – Rabat – Département d’Informatique
29
Notion de sous-programmes
En lang langag agee C, le pass passag agee des des para paramè mètr tres es se fait fait touj toujou ours rs par par vale valeur ur,, c.-à-d. les fonctions travaillent sur les valeurs de leurs paramètres et n'ont pas d'ac d'accè cèss aux aux varia variabl bles es elle elles-m s-mêm êmes es.. Les Les para paramè mètre tress d'un d'unee fonc foncti tion on sont sont à considérer comme des variables locales qui sont initialisées automatiquement par les valeurs indiquées lors d'un appel. A l'intérieur de la fonction, nous pouvons donc changer les valeurs des paramètres sans influencer les données originales dans les fonctions f onctions appelantes. Passage par adresse
Pour change Pour changerr la valeur valeur d'une d'une variab variable le de la foncti fonction on appela appelante nte,, il faut faut que la fonction appelante fournisse l'adresse de la variable et la fonction appelée déclare le paramètre comme pointeur. On peut alors atteindre la variable à l'aide du pointeur (voir chapitre structure de données).
III. La récursivité Un sous-programme est dit récursif s’il s’appelle lui-même. Il doit contenir une condition d’arrêt. Considérons l’exemple de la fonction pgcd(a, b) qui retourne le plus grand diviseur commun des deux entiers a et b : En langage C
En langage Pascal
int pgcd(int a, int b) { if (a = = b) return a; else if (a>b) return pgcd(a b,b); else pgcd(a,b-a); }
Funtion pgcd (a,b : integer): integer; Begin If (a=b) then pgcd:=a Else Else if (a>b (a>b)) the then pgcd:=pgcd(a-b,b) Else pgcd:=pgcd(a,b-a) End;
IV- Enoncé des exercices Exercice 35
Ecrire une fonction paramétrée qui retourne si un nombre donné est premier ou non.
ENS – Rabat – Département d’Informatique
30
Notion de sous-programmes
Exercice 36
Ecrire une fonction paramétrée qui retourne si un nombre donné est parfait ou non. Exercice 37
Ecrire une fonction paramétrée qui retourne si deux nombres donnés sont amis ou non. Exercice 38
Ecrire une fonction paramétrée qui retourne l’inverse d’un nombre entier donné. Exercice 39
Ecrire une fonction récursive récursive permettant permettant de calculer le PGDC de deux nombres nombres entiers positifs A et B. Exercice 40
Ecrire une fonction récursive récursive permettant permettant de calculer le PPMC PPMC de deux nombres nombres entiers positifs A et B. Exercice 41
Ecrire une fonction récursive qui permet de calculer le factoriel d’un nombre donné. Exercice 42
Ecrire une fonction récursive qui permet de calculer la puissance d’un entier donné. Exercice 43
Ecrire une fonction récursive qui calcule la valeur de la fonction d’Ackermann « A » définie pour m>0 et n>0 par : A(m, n)=A((m-1),A(m,n-1)) n)=A((m-1),A(m,n-1)) pour n>0, m>0 ; A(0,n)=n+1 pour n>0; A(m,0)=A(m-1,1) pour m>0 ; Exercice 44
Ecrire une fonction qui fournit le nombre de chiffres d’un entier donné. Exercice 45
ENS – Rabat – Département d’Informatique
31
Notion de sous-programmes
Ecrire une procédure qui permet de dessiner la lettre X, à l'aide d'espaces et d'une "lettre" fournie par l'utilisateur, auquel on demande aussi la "hauteur" du dessin qu'il désire obtenir. Par exemple : avec les réponses a et 5, elle donnera : a a a a a a a a a Exercice 46
Soit un programme qui visualise un menu composé de trois rubriques : Hors d’œuvre, plat chaud et dessert. Ecrire une procédure qui permet d’effectuer, à chaque fois, un choix exclusif. Exercice 47
Ecrire une procedure paramétrée, qui permet l’échange des contenus de deux par param amèt ètre ress form formel elss par par vale valeur ur A et B. Appe Appele lerr cett cettee proc procéd édur uree dans dans un programme principal.On écrira les résultats dans le corps de la procédure, et dans le programme principal. Exercice 48
Ecrire une procedure paramétrée, qui permet l’échange des contenus de deux para paramè mètr tres es forme formels ls par par adres adresse se A et B. Appe Appele lerr cett cettee proc procéd édur uree dans dans un programme principal.On écrira les résultats dans le corps de la procédure, et dans le programme principal. Exercice 49
Ecrire une procédure qui affiche tous les nombres premiers qui sont compris entre 1 et 200. Exercice 50
Ecrire une procédure qui affiche tous les nombres parfaits qui sont compris entre 1 et 200. Exercice 51
Ecrire une procédure qui permet d’afficher tous les diviseurs d’un entier N ainsi que leur nombre. Exercice 52 ENS – Rabat – Département d’Informatique
32
Notion de sous-programmes
Affichez un triangle isocèle formé d'étoiles sur N lignes (N est fourni au clavier).
ENS – Rabat – Département d’Informatique
33
Notion de sous-programmes
Exemple : N=8 * *** ***** ******* ********* *********** ************* *************** Exercice 53
Calculer pour une valeur X donnée du type réel la valeur numérique d'un polynôme de degré n: P(X) = AnXn + An-1Xn-1 + ... + A 1X + A0
Les valeurs de n, des coefficients A n, ..., A0 et de X seront entrées au clavier. Utiliser le schéma de Horner qui évite les opérations d'exponentiation lors du calcul:
Exercice 54
Ecrire une procédure qui affiche la table des produits pour N variant de 1 à 10 : X*Y I
0
1
2
3
4
5
6
7
8
9
10
-------------------------------------------------0
I
0
0
0
0
0
0
0
0
0
0
0
1
I
0
1
2
3
4
5
6
7
8
9
10
2
I
0
2
4
6
8
10
12
14
16
18
20
3
I
0
3
6
9
12
15
18
21
24
27
30
4
I
0
4
8
12
16
20
24
28
32
36
40
5
I
0
5
10
15
20
25
30
35
40
45
50
6
I
0
6
12
18
24
30
36
42
48
54
60
7
I
0
7
14
21
28
35
42
49
56
63
70
8
I
0
8
16
24
32
40
48
56
64
72
80
9
I
0
9
18
27
36
45
54
63
72
81
90
10 I
0
10
20
30
40
50
60
70
80
90 100
ENS – Rabat – Département d’Informatique
34
Les structures de données statiques
LES STRUCTURES DE DONNÉES STATIQUES
Une struct structure ure de donnée donnéess est un ensemb ensemble le organi organisé sé d’info d’informat rmation ionss reliée reliéess logi logiqu quem emen ent, t, ces ces info inform rmat atio ions ns peuv peuven entt être être trai traité tées es coll collec ecti tive veme ment nt ou individuellement. Une Une stru struct ctur uree de do donn nnée éess est est cara caract ctér éris isée ée par par ses ses comp compos osan ante tess et leur leur organisation, mais surtout par ses méthodes d’accès.
I. Les structures de données homogènes En langage Pascal:
Tableau
Un tableau est une suite d’éléments de même m ême type. En Pascal, la déclaration des tableaux se fait comme suit : Syntaxe : Var NomTab : Array[Min..Max] Of Type; On accède à un élément du tableau en utilisant un index : Exemple NomTab[4].
Chaînes de caractères
En Pascal, la définition du type chaîne est constituée du mot réservé STRING suivi de la longueur maximale entre crochets. La longueur est une constante entière dans l’intervalle [0,255]. Si la longueur maximale n’est pas précisée, elle est égale à 255 par défaut. Les variables chaînes occupent en mémoire la longueur maximale définie +1 octet. Le premier octet contient la longueur courante de la chaîne. Les caractères individuels sont indexés de 1 à la longueur maximale de la chaîne. Expressions chaînes Le signe ‘ + ’ est utilisé pour concaténer des chaînes. Exemple : ‘123’ + ‘456’ = ‘123456’.
ENS – Rabat – Département d’Informatique
35
Les structures de données statiques
On peut comparer deux chaînes, le résultat est une valeur booléenne. Exemple : ‘12’ < ‘2’ est vraie Affectation de chaînes L’opérateur d’affectation est utilisé pour affecter la valeur d’une expression à une variable chaîne. Exemple : p :=’Programmation’ ; Procédures sur les chaînes Procédure
Commentaires
supprime dans la chaîne st une sous-chaîne contenant num caractères à partir du caractère de position pos. permet l’insertion de la chaîne obj dans la chaîne target INSERT(obj,target,pos) à la position pos. convertit la valeur numérique de value en une chaîne, STR(value,st) et range le résultat dans st. convertit l’expression chaîne st en une valeur entière ou réelle (en fonction de type de var) et range la valeur dans var. code doit être une variable entière. Si aucune VAL(st,var,code) erreur n’est détectée, code est mise à zéro, sinon code a la valeur de la position du premier caractère en erreur et la valeur de var est indéfinie.
DELETE (st,pos,num)
Fonctions sur les chaînes Fonctions
Commentaires
retourne une sous-chaîne contenant num caractères de st en commençant par le caractère de position pos. retourne une chaîne qui est la concaténation de ces CONCAT(st1,st2,…,stn) arguments dans l’ordre où ils sont déclarés. LENGTH(st) retourne la longueur effective de la chaîne st. si obj est contenu dans target alors pos retourne la POS(obj,target) position du premier caractère de obj dans target sinon pos retourne zéro.
COPY(st,pos,num)
Ensembles
ENS – Rabat – Département d’Informatique
36
Les structures de données statiques
La structure de données Ensemble permet de représenter l’objet mathématique ensemble sur lequel on peut effectuer les opérations d’appartenance, de réunion, etc. Bien qu’en mathématiques il n’y ait pas de restriction sur les objets qui pourront être être memb membre re d’un d’un ense ensemb mble le,, Pa Pasc scal al ne proc procur uree qu qu’u ’une ne form formee rest restre rein inte te d’ensemble. Les membres d’un ensemble doivent être tous de même type appelé type de base. Déclaration : : SET of Exemple: ens: set of char Remarques • •
Le nombre maximum d’un ensemble est 256. On note par [ ] l’ensemble vide compatible avec tout type ensemble.
Opérateurs sur les ensembles Le symbole d’appartenance est IN Le symbole d’intersection est * Le symbole de réunion est + Le symbole de différence est = test d’égalité <> test d’inégalité >= vrai si tous les membres du second opérande sont inclus dans le premier. <= vrai si tous les membres du premier opérande sont inclus dans le second. En langage C
Tableau
En langage C, la syntaxe de la définition d'un tableau est la suivante : Syntaxe
: type Nom_du_tableau [Nombre d'éléments]
Type : définit le type d'éléments que contient le tableau (un tableau en langage C est composé uniquement d'éléments de même type). Nombre d'éléments : est un nombre entier qui détermine le nombre de cases du tableau. Exemple : int T[]20 ; ENS – Rabat – Département d’Informatique
37
Les structures de données statiques
Chaîne de caractères
En langage C, une chaîne de caractères est un tableau de type char, dont le dernier élément est le caractère nul '\0', c'est-à-dire le premier caractère du code ASCII (dont la valeur est 0). Ce caractère est un caractère de contrôle (non affichable) qui permet d'indiquer la fin de la chaîne de caractères. Ainsi, une chaine composée de n éléments sera en fait un tableau de n+1 éléments de type char. On peut par exemple représenter la chaîne "Bonjour" de la manière suivante: B o n j o u r \0 \0
Pour définir une chaîne de caractères en langage C, il suffit de définir un tableau de caractères. Le nombre maximum de caractères que comportera la chaîne sera égal au nombre d'éléments du tableau moins un (réservé au caractère de fin de chaîne). Nom_du_tableau[Nombre_d_elements] elements] Syntaxe : char Nom_du_tableau[Nombre_d_ Lecture et écriture des chaînes
Le langage C offre plusieurs possibilités de lecture ou d’écriture de chaînes : - L’utilisation du code de format %s dans les fonctions printf et scanf . - Les fonctions spécifiques de lecture ( gets) ou d’affichage ( puts) d’une chaîne. Exemple : char ville[25] ; gets(ville) ; puts(ville) ; Remarque : Avec le code %s de scanf , on utilise les délimiteurs habituels (espace ou la fin de ligne). Cela interdit donc la lecture d’une chaîne contenant des espaces. Avec gets seule la fin de ligne sert de délimiteur. Les fonctions de manipulation de chaînes de caractères
De nombreuses fonctions de manipulation de chaînes se trouvent dans le fichier d'en-tête , c'est la raison pour laquelle il faut ajouter la ligne suivante au début du programme : #include
ENS – Rabat – Département d’Informatique
38
Les structures de données statiques
Fonctions
strcat(but,source) strncat(but,source,lgmax)
strcmp(chaîne1,chaîne2)
strncmp(chaîne1,chaîne2,lgmax) stricmp(chaîne1,chaîne2) et strnicmp(chaîne1,chaîne2,lgmax) strcpy(destin,source)
strncpy(destin,source,lgmax)
strchr(chaîne,caractère) strrchr(chaîne,caractère) strstr(chaîne,sous-chaîne)
ENS – Rabat – Département d’Informatique
Commentaires
recopie la seconde chaîne (source) à la suite de la première (but). travaille de façon semblable à strcat en offra ffrant nt en ou outtre un con contrô trôle sur sur le nombre de caractères qui seront concaténés à la chaîne d’arrivée (but). comp compar aree deux deux cha chaînes înes don ontt on lui lui four fourni nitt l’ad l’adre ress ssee et elle elle fou fournit rnit un unee valeur entière définie comme étant : • Positive si chaîne1 > chaîne2 • Nulle si chaîne1 = chaîne2 • Négative si chaîne1 < chaîne2 travaille travaille comme strcmp mais elle limite la comparaison au nombre maximal de caractères indiqués par l’entier lgmax. trav travaaille illent nt resp respec ecti tive veme mennt comm commee strc strcmp mp et strn strncm cmpp, mais mais san sans teni tenir r compte de la différence entre majuscules et minuscules. reco recopi piee la chaî chaîne ne situ située ée à l’ad l’adre ress ssee source source dans dans l’empl l’emplace acemen mentt d’adre d’adresse sse destin. procède de manière analogue à strcpy, en limitant la copie au nomb mbrre de carac caractè tère ress préc précis isés és par par l’exp l’expre ress ssio ionn entière lgmax. rech recher erch chee dans ans chaî chaînne la premi remièère position où apparaît le carac ractère mentionné. réalise le même traitement que strchr, mais en explorant la chaîne concernée à partir de la fin. rech recher erch chee dans ans chaî chaînne la premi remièère occurrence de la sous-chaîne mentionnée.
39
Les structures de données statiques
II. Les structures de données hétérogènes En langage Pascal
Les enregistements
Un enregistrement est un ensemble d’informations de types différents accessibles individuellement ou collectivement. C’est une structure constituée d’un nombre fixe de composantes appelées champs. Syntaxe : TYPE nom_type = RECORD champ1:type ; champ2:type ;.... END; Exemple : TYPE date = RECORD Jour : 1..31 ; Mois : (jan,fev,mars,avr,mai,jui,juil,aout, (jan,fev,mars,avr,mai,jui,juil,aout,sep,oct,nov,dec) sep,oct,nov,dec) ; An : 1900..2000 ; END ; VAR date_nais : date ; L’accès au champ jour dans date_nais par exemple se fait par date_nais.jour. L’affectation entre deux variables enregistrements de même type est autorisée. Exemple : with date do jour:=2; Instruction with Syntaxe : WITH nom_enregistrement DO instruction
Elle permet d'omettre le nom_enregistrement dans l'instruction. En langage C
Les structures
Dans un tableau, tous les constituants doivent être semblables. Ce n'est pas le cas des structures, qui sont des variables composées de plusieurs variables (ou CHAMPS) de types différents. Syntaxe : struct Nom_Structure {
type_champ1 Nom_Champ1; type_champ2 Nom_Champ2; ... }; ENS – Rabat – Département d’Informatique
40
Les structures de données statiques
Exemple : struct date{
Int jour; Int mois ; Int annee ; }; Définition d’une variable structurée
C’es ’est un unee varia riable ble aya ayant comm commee type type celu elui d'un d'unee stru tructu cture qu quee l'on 'on a précédemment déclarée. Syntaxe : struct Nom_Structure Nom_Variable_Structuree; - Nom_St Nom_Struc ructur turee représ représent entee le nom d'un d'unee structu structure re que que l'on l'on aura préalablement déclarée. - Nom_Va Nom_Varia riable ble_St _Struc ructur turee ee est est le nom nom de la variab variable le de type type Nom_Structure. Pour accéder aux champs d'une structure, on utilise un point placé entre le nom de la variable structurée que l'on a définie et le nom du champ . Exemple : date_naiss.jour;
III- Enoncé des exercices Exercice 55
Ecrire une procédure qui affiche les nombres négatifs d’une liste réelle. Exercice 56
Ecrire une procédure qui met à zéro la diagonale d’une matrice carrée. Exercice 57
Ecrire une procédure qui affiche l’occurrence d’existence d’un nombre réel dans une liste de nombres réels. Exercice 58
Ecrire une procédure qui met le plus petit élément d’une liste au début de celleci. Exercice 59
Ecrire une procédure qui met les éléments négatifs d’une liste à gauche et les éléments positifs à droite de la liste. ENS – Rabat – Département d’Informatique
41
Les structures de données statiques
Exercice 60
Ecrire une procédure qui classe une liste de notes de la plus petite à la plus grande. Exercice 61
Etant donné N étudiants, leurs notes correspondantes à M matières m atières et leur moyenne. Ecrire une procédure qui affiche à côté de chaque étudiant son classement. Exercice 62
Le tri à bulles est un tri par échange. Le principe de base est de réordonner les couples non classés tant qu’ils existent. La méthode de tri à bulles consiste à parcourir la liste en comparant deux éléments successifs et en les permutant s’il y a lieu. Ecrire une procédure qui réalise ce tri. Exercice 63
Un palindrome est un mot, ou une phrase, lisible indifféremment de la gauche vers la droite ou inversement. Ecrire une fonction qui retourne si une chaîne de caractères est un palindrome ou non. Exercice 64
Ecrire une fonction qui retourne la fréquence d’occurenced’un mot dans une phrase. Exercice 65
Ecrire une procédure qui enlève tous les blancs au début d’une phrase et qui laisse un seul blanc entre les différents mots de la phrase. Exercice 66
Soit un nombre entier positif N. Ecrire une fonction qui donne son équivalent dans une base donnée B (2 ≤ B≤ 16). Exercice 67
Soit N un nombre donné en base B (B équivalent en base 10.
≠
10). Ecrire une fonction qui donne son
Exercice 68
Soit N un nombre donné en base B1. Ecrire une fonction qui donne son équivalent en base B2. ENS – Rabat – Département d’Informatique
42
Les structures de données statiques
Exercice 69
Si on est amené à réaliser des opérations sur des nombres entiers très grands, on peut utiliser les chaînes de caractères pour représenter ces nombres et ensuite faire l’opération par bloc. Ecrire une procédure pour réaliser l’opération d’addition sur de tels nombres. Exercice 70
Ecrire une procédure qui permet de passer de la représentation d’un nombre en chiffres romains à sa représentation décimale. Exercice 71
Ecrire une procédure qui permet de passer de la représentation décimale d’un nombre à sa représentation en chiffres romains. Exercice 72
Ecrire une fonction qui retourne le déterminant d’une matrice matr ice carrée. Exercice 73
Ecrire une procédure qui calcule l’inverse d’une matrice m atrice carrée. Exercice 74
Un carré magique est un carré divisé en cellules dans lesquelles les nombres entiers, à partir de 1 sont disposés de telle sorte que les sommes de chaque ligne, de chaque colonne et de chaque diagonale soient égales. Exemple : 6 1 8 7 5 3 2 6 4 Ecrire une procédure qui permet de réaliser le carré magique d’ordre n (n impair). Exercice 75
Ecrire un programme qui permet de saisir et d’afficher les informations d’une liste d’étudiants. Exercice 76
Ecrire les procédures qui donnent le calcul sur les nombres complexes au moyen d’un type enregistrement.
ENS – Rabat – Département d’Informatique
43
Les structures de données dynamiques
LES STRUCTURES DE DONNÉES DYNAMIQUES
Dans la pratique, très souvent, on veut représenter des objets, soit dont on ne connaît connaît pas à priori la taille, taille, soit dont la taille est variable, variable, selon selon les cas ou au cours du traitement. On est alors amené à utiliser des structures qui peuvent évoluer, pour bien s’adapter à ces objets. Ce sont les structures de données dynamiques.
I- En langage Pascal I-1. Les pointeurs
Un pointeur est une variable contenant l'adresse d'une autre variable d'un type donné. Syntaxe : type type_pointeur = ^type_base ; type_base = ident_type ; Si le type de base type_base est un identificateur non encore déclaré, il doit l’être dans la même partie de la déclaration que le type pointeur type_pointeur. Exemple : type ref = ^integer ; Remarques : •
•
•
•
ref est une variable pointeur et ref^ la
variable pointée.
La constante NIL peut être affectée à n’importe quelle variable pointeur (NIL ne fait référence à aucun élément du type associé). Le type prédéfini Pointer indique un pointeur non typé, c’est-à-dire un pointeur qui ne pointe pas sur un type particulier. L’opérateur @ fait pointer la variable pointeur sur une zone mémoire contenant une variable.
Procédures et fonctions d’allocation dynamique de mémoire
ENS – Rabat – Département d’Informatique
44
Les structures de données dynamiques
Ces procédures et fonctions permettent de manipuler le tas (zone de mémoire qui correspond à tout ou partie de l’espace mémoire laissé vacant après chargement du programme). Procédures ou fonctions
New (var p:pointeur) GetMem (var p:pointeur; taille:word)
Ptr (seg,dep:word)
Dipose (var p:pointeur) FreeMem (var p:pointeur;taille:word) Mark (var p:pointeur) Release (var p:pointeur)
Commentaires
crée un espace mémoire de la taille de la vari variab able le po poin inté téee et affec affecte te l’ad l’adres resse se de celui-ci au pointeur crée une nouvelle variable dynamique de la taille indiquée et place son adresse dans une variable pointeur. fait fait po poin inte terr la varia variabl blee po poin inte teur ur sur sur un unee adre adress ssee mémo mémoir iree spéc spécif ifiq ique ue sans sans fair fairee intervenir de notion de variable occupant cet espace. Ptr convertit une adresse format segment:déplacement en une valeur de type pointeur. libère la mémoire d’une variable dynamique. libère la mémoire d’une variable dynamique d’une certaine taille mémorise la valeur du pointeur de tas dans une variable de type pointeur. rest restau aure re le tas tas dans dans un unee conf config igur urat atio ionn donnée. Le pointeur p doit être initialisé par la procédure Mark.
Les listes chaînées
Une liste chaînée est une suite de données (liste) liées entre elles. Le lien est réalisé par des pointeurs. Chaque élément de la liste est un enregistrement dont l’un des champs est un pointeur qui pointe vers l’élément suivant.
ENS – Rabat – Département d’Informatique
45
Les structures de données dynamiques
Tête de la liste L
a1 e1 a2
e2 a3
en
NIL
Queue de la liste
Exemple : type nbrpoint = ^nombre ; nombre = record nbr : integer ; suivant : nbrpoint ; end ; L’insertion d’un élément x dans une liste chaînée se fait en deux étapes : 1. allocation allocation de l’espace l’espace mémoire mémoire qu’occupe qu’occuperait rait x. 2. création création des liens liens avec avec l’élément l’élément de de gauche gauche puis de droite. droite. L’élimination d’un élément x d’une liste chaînée se fait en deux étapes : 1. création création des liens liens entre entre l’élémen l’élémentt de gauche gauche et de droite. droite. 2. libération libération de l’espace l’espace mémoire mémoire qu’occu qu’occupait pait x. x.
Les arbres
Lorsqu’on généralise la notion de listes chaînées en associant à chaque élément de la liste 2 ou plusieurs successeurs, tout en gardant une structure à une seule tête, on obtient ce qu’on peut appeler un arbre. A B D
C E
F
G H
I J
ENS – Rabat – Département d’Informatique
46
Les structures de données dynamiques
Définitions :
Nœud : chaque élément d’un arbre est
appelé nœud. Racine d’arbre : le premier nœud d’arbre est appelé racine (ici A). Feuille : un nœud sans successeur est appelé feuille (comme D, E, F, H, I,J). Arc : un lien entre 2 nœuds successifs est appelé arc. Chemin : un chemin est une séquence d’arcs reliant deux nœuds d’un même arbre (A B E). Père / Fils / Ancêtre / Descendant : - Un successeur B d’un nœud A est appelé fils de A, A est alors père de B ; - Si A dispose d’un autre fils C alors B et C sont frères ; - B et C sont aussi appelés des descendants immédiats ; - Les fils fils de B et C sont sont auss aussii des des desce descenda ndants nts de de A ; - A est alors l’ancêtre des fils de B et C ainsi que de leurs fils. Arbre évalué : c’est un arbre dont les arcs portent des étiquettes permettant de définir ce qu’on appelle un coût pour se rendre d’un nœud à l’autre. Il est possible de calculer le coût relativement r elativement à un chemin. Arbre binaire : les arbres binaires sont le type d’arbre le plus utilisé car il est plus simple à gérer et à implémenter, il dispose au maximum de 2 fils. Le premier est appelé fils gauche, le deuxième fils droit. Par contre, un arbre multiple est un arbre dont chaque nœud peut disposer de plus de 2 fils. Il s’agit donc d’une structure plus complexe que celle des arbres binaires. Pour faciliter leur gestion, il existe plusieurs méthodes pour transformer transformer un arbre en son équivalen équivalentt binaire. binaire. Parmi ces méthodes, méthodes, on peut citer la suivante : Le 1 er fils d’un nœud est marqué comme fils gauche de • l’arbre binaire correspondant. • Les autres fils sont rangés successivement comme fils er droit du 1 fils c'est-à-dire pour pour chaque nœud de l’arbre binaire obtenu, obtenu, er er son 1 fils se trouve à gauche et son 1 frère se trouve à droite.
Parcours d’arbres binaires
ENS – Rabat – Département d’Informatique
47
Les structures de données dynamiques
On appelle parcours d’un arbre tout algorithme permettant d’accéder une et une seule fois à tous les nœuds de l’arbre. On distingue six parcours généraux, symétriques deux à deux, valides pour les arbres binaires quelconques et répartis en trois catégories qui sont : Les parcours en préordre (préfixés) Parcourir un arbre binaire en préordre c’est d’abord inspecter la racine, puis parcourir en préordre le sous-arbre gauche (respectivement le sous-arbre droit) et enfin parcourir en préordre le sous- arbre droit (respectivement le sous-arbre gauche). Exemple :
2 8
5
10
1
4
1 2
7
Parcours en préordre racine, sous-arbre gauche, sous-arbre droit 2, 5, 1, 7, 4, 8, 10, 12. Parcours en préordre racine, sous-arbre droit, sous-arbre gauche 2, 8, 10, 12, 5, 4, 1, 7. Les parcours en postordre (postfixés) Parcourir un arbre binaire en postordre c’est d’abord parcourir en postordre le sous sous-a -arb rbre re gauc gauche he (resp (respec ecti tive vemen mentt le sous sous-ar -arbre bre droi droit), t), pu puis is parc parcou ouri rirr en postordre le sous-arbre droit (respectivement le sous-arbre gauche) et enfin inspecter la racine. Exemple : même exemple que précédemment. Parcours en postordre sous-arbre gauche, sous-arbre droit 7, 1, 4, 5, 12, 10, 8, 2. Parcours en postordre sous-arbre droit, sous-arbre gauche 12, 10, 10, 8, 7, 1, 4, 5, 2. Les parcours en ordre (infixés)
ENS – Rabat – Département d’Informatique
48
Les structures de données dynamiques
Parcourir un arbre binaire en ordre c’est d’abord parcourir en ordre le sous-arbre gauche (respectivement le sous-arbre droit), puis inspecter la racine et enfin parcourir en ordre le sous-arbre droit (respectivement le sous-arbre gauche). Exemple : même exemple que précédemment. Parcours en ordre sous-arbre gauche, racine, sous-arbre droit 1, 7, 5, 4, 2, 8, 12, 10. Parcours en ordre sous-arbre droit, racine, sous-arbre gauche 10, 12, 8, 2, 4, 5, 7, 1. Arbres ordonnés
Arbre binaire ordonné horizontalement Un arbre binaire est ordonné horizontalement (de gauche à droite) si la clé de tout nœud non feuille est supérieure à toutes celles de son sous-arbre gauche et est inférieure à toutes celles de son sous-arbre droit. Exemple :
8 4 5
9
1 0 1 3
Recherche d’un élément dans un arbre ordonné horizontalement La recherche d’un élément dans un arbre ordonné horizontalement qui tient compte de l’ordre est dichotomique et donc très supérieure à une recherche systématique à l’aide d’un parcours général. Insertion d’un élément Le prin princi cipe pe de l’in l’inse sert rtio ionn d’un d’un élém élémen entt dans dans un arbr arbree bina binair iree ordo ordonn nnéé horizontalement est le suivant : on recherche de façon récursive la place de l’élément, ce qui conduit nécessairement à une feuille si l’élément ne figure pas déjà dans l’arbre, puis on accroche l’élément à cette feuille. Exemple : insertion de l’élément 6 dans l’arbre suivant
ENS – Rabat – Département d’Informatique
49
Les structures de données dynamiques
8
8
4 9
5
1 0
4
1 0
5 1 3
Insertion
9
1 3
6
Suppression d’un élément Le prin princi cipe pe de la supp suppre ress ssio ionn d’un d’un élém élémen entt d’un d’un arbr arbree bina binair iree ordo ordonn nnéé horizontalement est le suivant : - si l’élé l’élémen mentt est une une feuil feuille le alors alors on on le supp supprime rime simple simplemen ment.t. - si l’élé ’éléme ment nt n’a qu qu’u ’unn des descen cendan dant alor alorss on le remp rempla lacce par ce descendant. - si l’élé l’éléme ment nt a deux deux desc descen enda dant nts, s, on le rempla remplace ce au choix choix,, soit soit par par l’élément le plus à droite du sous-arbre gauche, soit par l’élément le plus à gauche du sous-arbre droit, afin de conserver la propriété d’ordre horizontal.
Exemple : Suppression de l’élément 7 1 6
1 6 1 8
7 4 2
9 6
8
1 8
6 2 4 1 0
4 2
9 8
2 4 1 0
Suppression
Représentation d’un arbre en Pascal
ENS – Rabat – Département d’Informatique
50
Les structures de données dynamiques
Une manière possible de représenter un arbre est la suivante : l’ensemble des fils du même père forme une liste, donc chaque fils a un pointeur vers son frère qui le suit. Le dernier frère a 0. Chaque père a un pointeur vers son premier fils. Les fils de la dernière génération (feuilles) ont 0. Chaque fils à un pointeur vers son père. L’ancêtre (racine) a 0. Cela va être contenu dans un array of record : type gene = Record nom : string; pere : integer ; frere : integer ; fils : integer; end ; arbre = array [1..max] of gene ; var mafamille : arbre; Exemple : (entre parenthèse figure l’indice dans le tableau) Pierre (1) Paul (2)
Jacques (3)
Marcel (4) George (5)
Jean (6)
Gérard (7)
Alain (8)
1 Pierre
2 0 0
2
Paul
Louis (9) 3
1
3 4
Jacques
1
0 6
II. En langage C
Les pointeurs
Un pointeur est une variable qui doit être définie en précisant le type de la variable pointée, de la façon suivante : Syntaxe : type * Nom_du_pointeur Le type de la variable variable pointée peut-être peut-être aussi bien un type primaire primaire (tel que int , char , etc.) qu'un type complexe (tel que struct , etc .). ENS – Rabat – Département d’Informatique
51
Les structures de données dynamiques
Après Après avoir avoir déclar déclaré, é, un poi pointe nteur ur il faut faut l'ini l'initia tialis liser er en uti utilis lisant ant l'o l'opér pérate ateur ur d'affectation '=' suivi de l'opérateur d'adresse '&' auquel est accollé un nom de variable (celle-ci doit bien sûr avoir été définie auparavant). &nom_de_la_variable_pointee; Syntaxe : Nom_du_pointeur = &nom_de_la_variable_pointee; Après Après (et seulement après) avoir déclaré et initi initialisé alisé un pointeur, pointeur, il est possible d'accéder au contenu de l'adresse mémoire pointée par le pointeur grâce à l'opérateur '*'.
Fonctions d’allocation dynamique de mémoire
Le prototype de ces fonctions figure à la fois dans stdlib.h et dans alloc.h. Fonctions
void * malloc(size_t taille)
void * calloc(size_t nb_blocs,size_t taille) void * realloc(void * pointeur, size_t taille)
void free(void* adr)
Commentaires
alloue un emplacement de taille octets, sans l’initialiser l’initialiser et fournit l’adresse correspondante lorsque l’allocation a réussi ou un pointeur nul dans le cas contraire. alloue l’emplacement nécessaire à nb_blocs consécutifs, ayant chacun une taille de taille octets. permet de modifier la taille d’une zone préalablement allouée (par malloc, calloc ou realloc). libère la mémoire d’adresse adr. Ce pointeur doit obligatoirement désigner une zone préalablement allouée par malloc, calloc, realloc. Si adr est nul, cette fonction ne fait rien.
Les tableaux dynamiques
Type *T *T ; T = (type*) malloc (sizeof(type)*N) ; Avec N étant le nombre d’éléments du tableau.
Syntaxe
:
Les listes chaînées
ENS – Rabat – Département d’Informatique
52
Les structures de données dynamiques
Une liste chaînée est une structure comportant des champs contenant des données et un pointeur vers une structure de même type. Ainsi, la structure correspondant à une liste chaînée contenant une chaîne de 15 caractères et un entier ressemble à ceci: struct Nom_de_la_liste { char Chaine[16]; int Entier; struct Nom_de_la_liste * pSuivant; };
Les arbres
La repr représ ésen enta tati tion on dy dyna nami miqu quee no nonn cont contig iguë uë cons consis iste te à crée créerr des des nœud nœudss séparément les uns des autres et les relier par le chaînage adéquat pour préciser qu’un nœud donné est fils gauche ou fils droit d’un autre nœud. Ainsi, chaque nœud est constitué de 3 parties : l’information, un pointeur sur le nœud gauche et un pointeur sur le nœud droit. info g
d
info g
d
info d g
info g
d
Exemple : Pour le cas d’un arbre de caractères, la structure est la suivante : Typedef struct str{ char info ; str *g, *d ; } *Arbre p;
ENS – Rabat – Département d’Informatique
53
Les structures de données dynamiques
III- Enoncé des exercices Exercice 77
Ecrire une procédure qui permet la création en file d’une liste chaînée. Exercice 78
Ecrire une procédure qui permet la création en pile d’une liste chaînée. Exercice 79
Ecrire une procédure qui recherche un élément dans une liste chaînée. Exercice 80
Ecrire une procédure qui insert un élément dans une liste chaînée. Exercice 81
Ecrire une procédure qui élimine un élément d’une liste chaînée. Exercice 82
Ecrire une procédure qui empile un élément dans une pile représentée par une liste chaînée. Exercice 83
Ecrire une procédure qui désempile un élément dans une pile représentée par une liste chaînée. Exercice 84
Ecrire une procédure qui permet la création d’une liste doublement chaînée. Exercice 85
Ecrir Ecriree un unee proc procéd édure ure qu quii rech recher erch chee un élém élémen entt dans dans un unee list listee do doub uble leme ment nt chaînée. Exercice 86
Ecrire une procédure qui insert un élément dans une liste doublement chaînée. Exercice 87
Ecrire une procédure procédure qui élimine un élément d’une liste doublement chaînée. Exercice 89
Ecrire une fonction qui recherche un élément dans une liste chaînée circulaire. ENS – Rabat – Département d’Informatique
54
Les structures de données dynamiques
Exercice 90
Ecrire une procédure qui insert un élément dans une liste chaînée circulaire. Exercice 91
Ecrire une procédure qui élimine un élément d’une liste chaînée circulaire. Exercice 92
Un paragraphe paragraphe est une suite de phrases. Une phrase est une suite de mots qui se termine par un point (‘.’). Deux mots sont séparés par un blanc (‘ ’). Dans cet exercice on représentera un paragraphe par une liste chaînée, et aussi une phrase par une liste chaînée. 1- Ecrire une une procédure procédure qui qui permet permet la création création d’une d’une telle telle représent représentation ation.. 2- Ecrire Ecrire une procéd procédure ure qui perme permett la recherch recherchee de la premiè première re occurren occurrence ce d’un mot dans le paragraphe. Le résultat de la recherche donne la position de ce mot. 3- Ecrire Ecrire une procé procédur duree qui permet permet l’inse l’inserti rtion on d’un d’un mot M1 après après un mot M2 donné. Si le mot M2 ne se trouve pas dans le paragraphe, on ne fait pas d’insertion. 4- Ecr Ecrire une proc rocédure qui perme rmet l’él ’élimi minnation d’un mo mott M1 du paragraphe. 5- Ecrire une une fonction fonction qui permet permet la reche recherche rche d’une d’une phrase, phrase, donnée donnée par par son premier mot, dans le paragraphe. Le résultat de la recherche donne la position de cette phrase dans le paragraphe. 6- Ecrire Ecrire une procéd procédure ure qui permet permet l’ins l’insert ertion ion d’une d’une phrase phrase ph1 après après une phrase ph2 donnée. Si la phrase ph2 ne se trouve pas dans le paragraphe, on insert ph1 à la fin du paragraphe. 7- Ecri Ecrire re un unee proc procéd édur uree qu quii perm permet et l’él l’élim imin inat atio ionn d’un d’unee ph phra rase se ph ph11 du paragraphe. Exercice 93
Ecrire la procédure du parcours d’un arbre binaire en préordre. Exercice 94
Ecrire la procédure du parcours d’un arbre binaire en postordre. Exercice 95
Ecrire la procédure du parcours d’un arbre binaire en ordre. Exercice 96 ENS – Rabat – Département d’Informatique
55
Les structures de données dynamiques
Ecrir criree une fon fonctio ctionn qu quii rech recheerch rche un éléme lément nt dans ans un arbr arbree ordon rdonné né horizontalement. Exercice 97
Ecrire une procédure qui insert un élément dans un arbre ordonné horizontalement. Exercice 98
Ecrire une procédure qui supprime un élément dans un arbre ordonné horizontalement.
ENS – Rabat – Département d’Informatique
56
Les fichiers
LES FICHIERS
Dans tous les langages de programmation, on utilise la notion de fichier. Il s'agit d'enregistrer des données sur un support plus durable (disquette, disque dur, etc.). Les principales manipulations sur un fichier sont : - L'ouverture du fichier - La lecture ou l’écriture d'un élément du fichier - Le déplacement sur le fichier. - La ferm fermeeture ture du fi fichie chier. r. Des erreurs de manipulation d'un fichier peuvent survenir. En particulier, on a comme erreurs classiques : - La tenta tentativ tivee d'ouv d'ouvrir rir en lectur lecturee un fichi fichier er qui qui n'exis n'existe te pas. pas. - La tent tentati ative ve de de lire lire au au delà delà de de la fin d'un d'un fichi fichier. er. - La tentat tentative ive d'écr d'écrire ire sur sur une disque disquette tte déjà déjà pleine pleine ou sur sur un fichier fichier proté protégé gé en écriture. Dans la majorité des langages de programmation, on distingue deux types de fichiers: les fichiers textes et les fichiers binaires. Fichier texte
La tête de lecture et d'écriture se trouve sur un octet et cet octet est interprété comme un caractère en code ASCII. On a alors ce qu'on appelle un fichier texte. Un texte est en général divisé en lignes, marquées par des caractères de fin de ligne et terminé par un code de fin de fichier. Un fichier texte peut se lire caractère par caractère ou ligne par ligne. Fichier binaire
La tête de lecture et d'écriture recouvre une variable, d'un type quelconque (réel, double, structure, tableau, etc.) codée sur n octets comme en mémoire centrale. On parle alors de fichier binaire. Une opération de lecture lit en bloc tous les octets constituant cette variable.
I. En langage Pascal En Pascal, un type fichier est défini par le mot réservé "File Of" suivi du type des composantes de ce fichier. ENS – Rabat – Département d’Informatique
57
Les fichiers
Exemple : Type Fic_mess = File Of string[80] str ing[80] ; Fic_pers = File Of Record Nom, prn:string[14]; Doti:string[6]; End; I.1 Opérations sur les fichiers
Soit filvar un identificateur de variable de type fichier. Expression
Commentaires
str est une expression chaîne résultant en tout nom légal de fichier. Le nom du fichier est affecté à la variable filval et Assign(filval,str) toutes toutes les opérations opérations suivantes suivantes sur filval affecteront affecteront le fichier fichier disque (externe) str. Assign ne doit jamais être utilisée sur un fichier en cours d’utilisation. un nouveau fichier disque dont le nom est assigné à la variable filval est crée et préparé pour le traitement. Le pointeur de Rewrite(filval) fich fichie ierr est est plac placéé au débu débutt de celu celuii-ci ci (c’e (c’est st-à -à-d -dir iree : sur sur l’en l’enre regi gist stre reme ment nt nu numé méro ro 0). 0). Un fich fichie ierr disq disque ue crée crée par par Rewrite est vide. le fichier disque affecté à la variable filval est préparé pour le traitement. Le pointeur de ce fichier est positionné sur le Reset(filval) composant numéro 0. filval doit référencer un fichier existant, sinon il se produira une erreur err eur d’entrée/sortie. var représente une ou plusieurs variables de même type que les éléments de filval. Chaque variable est lue sur le fichier Read(filval,var) disq disque ue.. Aprè Aprèss chaq chaque ue op opér érat atio ionn de lect lectur uree le po poin inte teur ur de fichier est avancé sur le composant suivant. var représente une ou plusieurs variables de même type que les éléments de filval. Chaque variable est écrite sur le fichier Write(filval,var) disq disque ue.. Aprè Aprèss chaq chaque ue op opér érat atio ionn d’éc d’écrit ritur uree le po poin inte teur ur de fichier est avancé sur le composant suivant. déplace le pointeur de fichier sur le n ième composant du fichier Seek(filval,n) référencé par filval. N est une expression entière. Fi File lesi size ze(fi (filv lval al)) retou retourn rnee le le nom nombr bree de de com compo posa sant ntss d’u d’unn fic fichi hier. er. Close lose(f (fil ilvval) al) le fic fichhier ier disq disque ue ass assoocié cié à filv filval al est est fe fermé rmé et le le rép réperto ertoiire du du disque est mis à jour. Pour tenir compte des modifications apportées au fichier, il est nécessaire de fermer un fichier ENS – Rabat – Département d’Informatique
58
Les fichiers
Expression
Eof(filval) Filepos(filval) Remarque :
Commentaires
après traitement. fonction booléenne qui retourne vraie si le pointeur de fichier est positionné à la fin du fichier disque. fonction entière retournant la position courante du pointeur de fichier.
un paramètre formel de type fichier doit être toujours donné par
adresse. I.2 Les fichiers textes
Déclaration
La déclaration d’un fichier texte se fait par le mot réservé Text. Exemple : var fich_text : Text ;
Opérations sur les fichiers textes
Toute opération sur les fichiers textes doit être précédée par un appel à la procédure Assign, Un appel à Reset ou Rewrite doit précéder toute opération de lecture ou d’ecriture. Rewrite permet de créer un nouveau fichier texte et la seule opération autorisée est l’ajout de nouveaux éléments à la fin f in de ce fichier. Reset est utilisée pour ouvrir un fichier existant en lecture, la seule opération permise sur ce fichier est la lecture séquentielle. Lorsqu’un nouveau fichier texte est fermé, une marque de fin de fichier est mise à la fin du fichier. L’entrée et la sortie des caractères dans les fichiers textes s’effectuent par les procédures Read(filvar,c) et Write(filval,c). Les procédures Readln, Writeln et la fonction EoLn permettent le traitement des lignes d’un fichier texte. Expressions
Readln(filvar) ou readln(filvar,st1,st2,..,stn)
Commentaires
va au début de la ligne suivante, c’est-à-dire écarte tous les caractères jusque et y compris la séquence CR/LF (la marque de la fin de ligne).
ENS – Rabat – Département d’Informatique
59
Les fichiers
Expressions
Writeln(filvar) ou writeln(filvar,st1,..,stn) EoLn(filvar)
seekEoLn(filvar) Eof(filvar) SeekEof(filvar) Append(var filvar :Text) Flush(var filvar :Text)
SetTextBuf(var filvar:Text;var tampon[ ;taille :Word])
Commentaires
écrit une marque de fin de ligne, c’est-à-dire une séquence CR/LF dans le fichier texte. fonction booléenne retournant vrai si la fin de ligne a été atteinte, c’est-à-dire si le pointeur de fichier est positionné sur le caractère CR de la séquen séquence ce CR/LF. CR/LF. Si Eof(fil Eof(filvar var)) est vrai vrai alors alors EoLn(filvar) est également vrai. similaire à EoLn, mais écarte les espaces et les Tabs avant de faire le test. reto retouurne rne vrai vrai si le poin ointeu teur de fich fichie ierr est est positionné sur la fin de fichier (Ctrl-Z). similaire à Eof, mais écarte les espaces, les Tabs et les marques de fin de ligne avant de faire le test. ouvre un fichier texte existant en mode ajout. Après un appel à Append, seule l’écriture est autorisée. vide la mémoire tampon associée à un fichier texte ouvert en mode écriture. assigne un tampon d’entrée/sortie à un fichier texte. Toute variable fichier de type texte dispose d’un tampon mémoire, dont la taille est de 128 octets par défaut. Le tampon est utilisé lors des opérations de lecture et d’écriture. La taille est suff suffis isan ante te po pouur la plup plupar artt des des appl applic icat atio ions ns.. SetTextBuf doit être utilisée juste après Assign.
Remarques : •
•
Les procédures et fonctions Seek, FilePos et FileSize ne s’appliquent pas aux fichiers textes. Ctrl-Z a pour code ASCCI 26, CR 13 et LF 10.
II. En langage C Pour pouvoir manipuler les fichiers en C, on doit déclarer un pointeur sur la structure FILE. ENS – Rabat – Département d’Informatique
60
Les fichiers
Exemple : FILE *sortie ; II.1 Ouverture et création d'un fichier
La fonction fopen a pour argument deux chaînes de caractères, le nom du fichier et le mode d'ouverture. Elle donne comme résultat un pointeur qui est NULL si l'ouverture a échoué, sinon le pointeur renvoyé est utilisé dans les écritures, les lectures et les déplacements ultérieurs. Exemple:
#include FILE *Pointeur_sur_fichier; Pointeur_sur_fichier = fopen("C:\IUT\essai.txt", "wt"); Ouvr Ouvree (ou (ou crée crée s'il s'il n'ex n'exis iste te pas) pas) un fich fichie ierr text textee no nommé mmé essai.txt dans le répertoire IUT du disque C. Les modes de base sont : "r" (read : lecture) : lecture seulement ; le fichier doit exister. • "w" (write : écriture) : écriture seulement. Si le fichier n’existe pas, • il est créé. S’il existe, son ancien contenu est perdu. "a" (append (append : ajout) : si le fichier fichier existe déjà, déjà, il sera étendu. étendu. S’il • n’existe pas, il sera créé. "r+" : mise à jour (lecture et écriture). Le fichier doit exister. • • "t" ou "b" : lorsque l’implémentat l’implémentation ion distingue distingue les fichiers de texte des autres, il est possible d’ajouter l’une de ces deux lettres à chacun des modes précédents. La lettre t précise que l’on a affaire à un fichier texte ; la lettre b précise que l’on a affaire à un fichier binaire. II.2 Ecriture dans un fichier fprintf : écriture formatée dans un fichier. Cette fonction est l'équivalent pour un
fichier fichier de printf printf pour les sorties à l'écran. l'écran. Les formats formats (précédés du symbole symbole %) sont les mêmes. Exemple : char erreur; erreur = fprintf(Pointeur_sur_fichier, "Le chiffre %d s'écrit quatre", 4); Dans un fichier texte
ENS – Rabat – Département d’Informatique
61
Les fichiers •
fputc : ce qui signifie "met un caractère dans un fichier". Comme son nom
l'indique, cette fonction écrit un octet dans un fichier. Exemple: char erreur; erreur = fputc('x', Pointeur_sur_fichier); • fputs : ce qui signifie "met une chaîne dans un fichier". Comme son nom l'indique également, cette fonction écrit une chaîne de caractères dans un fichier. Exemple : char erreur; erreur = fputs("chaîne de caractère", Pointeur_sur_fichier); Remarque :
Dans ces deux cas, la variable erreur de type char contient le dernier caractère écrit et EOF si une erreur se présente (fin de fichier, disque plein, etc.). Dans un fichier binaire •
: écrit dans un fichier des objets d'un type quelconque. Il faut préciser la taille d'un objet (par exemple avec sizeof(objet)), le nombre d'objets à écrire et le pointeur du fichier destination. Cette fois, la fonction renvoie renvoie le nombre nombre d'éléments d'éléments effectivement effectivement écrits. Pour tester que tout va bien, il faut comparer le nombre d'éléments écrits avec le nombre d'objets à écrire. Syntaxe : nombre nombre_d_ _d_ele elemen ments_ ts_ecr ecrits its = fwrite( fwrite(ptr ptr_su _sur_t r_tabl ableau eau,, tai taille lle_el _eleme ement, nt, nb_elements, fichier) fwrite
II.3 Lecture dans un fichier
Les opérations de lecture sont les symétriques de celles d'écriture. On retrouve la même classification et à peu près la même syntaxe. •
fscanf : lecture formatée analogue à scanf. Syntaxe : Nb_lu = fscanf(Pointeur_sur_fichier, format, liste de
pointeurs); Où : Nb_lu est le nombre d'arguments lus et acceptés. Par exemple : Nb_lu = fscanf(Pointeur_sur_fichier, "%s", Chaîne);
ENS – Rabat – Département d’Informatique
62
Les fichiers
Met dans Chaîne les caractères situés situés entre le début et la fin de fichier ou le prochain espace blanc. Les espaces blancs initiaux sont automatiquement sautés. Les formats de fscanf sont les mêmes que ceux de scanf. Dans un fichier texte •
•
fgetc : ce qui signifie "prend un caractère dans un fichier".
Exemple : int caractere; caractere = fgetc(Pointeur_sur_fichier); fgets : ce qui signifie "prend une chaîne dans un fichier". Lit un certain nombre de caractères dans un fichier et les met dans une chaîne en ajoutant le caractère nul à la fin. Exemple : fgets(Chaine, 10, Pointeur_sur_fichier); Lit 10 caractères dans le fichier et les écrits dans Chaine. Un dernier caractère nul est ajouté. Mais, si une fin de ligne (EOL) est rencontrée avant le dixième caractère lu, seuls les caractères avant la fin de ligne seront lus et ils seront suivis dans la chaîne par EOL et NULL.
Dans un fichier binaire Syntaxe
: Nb_lu Nb_lu = fread( fread(poi pointe nteur_ ur_sur sur_ta _table bleau, au, tai taille lle_el _eleme ement, nt, nb_ele nb_elemen ments, ts,
fichier); Nb_lu est égal à nb_elements si l'écriture s'est passée sans incident. Exemple: #include 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 premières cellules du tableau ; nb a pour valeur le nombre d'éléments écrits, 3 si tout s'est bien passé. II.4 Déplacement dans un fichier
ENS – Rabat – Département d’Informatique
63
Les fichiers •
(FILE *flux,long noct,int org): place le pointeur du flux indiqué à int fseek (FILE un endroit défini comme étant situé à noct octets de l’origine spécifiée par org : org = SEEK_SET correspond au début du fichier. org = SEEK_CUR correspond à la position actuelle du pointeur. pointeur. org = SEEK_END correspond à la fin f in du fichier. • long ftell (FILE *flux) : fournit la position courante du pointeur du flux indiqué (exprimée en octets par rapport r apport au début du fichier).
II.5 Fermeture du fichier •
(FILE int fclose fclose(FILE
*flux *flux)) : désa désall llou ouee l’es l’espa pace ce mémo mémoir iree asso associ ciéé au flux flux concerné et ferme le fichier correspondant. Fournit la valeur EOF en cas d’erreur et la valeur 0 dans le cas contraire.
III- Enoncé des exercices Exercice 99
Ecrire un programme qui permet de créer un fichier d’étudiants. Exercice 100
Ecrire une procédure qui permet de modifier les informations d’un étudiant.
ENS – Rabat – Département d’Informatique
64
Solutions des exercices
SOLUTIONS DES EXERCICES
Pascal
C
Exercice 1
Ecrire un programme qui permet d’afficher le message suivant : mon premier programme. Program afficher ; #include Begin #include 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 var x,y,tmp:integer; #include 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: "); ENS – Rabat – Département d’Informatique
65
Solutions des exercices
x:=y; y:=tmp; writeln('x=',x,' et y=',y); readln; end.
scanf("%d %d",&x,&y); printf("avant echange x=%d et y=%d\n",x,y); tmp=x; x=y; y=tmp; printf("apres echange x=%d et y=%d",x,y); getch(); }
Exercice 3
Ecrire un programme qui échange 3 entiers. Program Echange; var x,y,tmp,z:integer; begin write('donner trois entiers differents:'); readln(x,y,z); writeln('x=',x,' et y=' ,y,’et z=’,z); tmp:=x; x:=y; y :=z ; z:=tmp; writeln('x=',x,' et y=',y,’ et z=’,z); readln; end.
ENS – Rabat – Département d’Informatique
#include #include void main() { int x,y,z,tmp; printf("entrez trois nombres: "); scanf("%d %d %d",&x,&y,&z); printf("avant echange x=%d , y=%d et z=%d \n",x,y,z); tmp=x; x=y; y=z ; z=tmp; printf("apres echange x=%d , y=%d et z=%d ",x,y,z); getch(); 66
Solutions des exercices
} Exercice 4
Ecrire un programme qui demande à l'utilisateur les coordonnées de 2 points distincts du plan et qui affiche les coordonnées du point milieu. program milieu ; var var x1, x1, y1, y1, x2, x2, y2, y2, xm xm,, ym : real real ; begin writeln ('Entrez les coordonnées du premier point') ; readln ( x1 ) ; readln ( y1 ); writeln ('Entrez les coordonnées du deuxième point') ; readln ( x2 ) ; readln ( y2 ); xm := (x1 + x2) x2) / 2 ; ym := (y1 + y2) y2) / 2 ; writeln ('Les coordonnées du point milieu sont :', xm :5:2, ym:5:2) ; end.
#include void main() { float x1, y1, x2, y2, xm, ym ; printf ("Entrez les coordonnées du premier point") ; scanf("%f %f ",&x1,&y1) ; printf ("Entrez les coordonnées du second point") ; scanf("%f %f ",&x2,&y2) ; xm =(float) (x1 + x2) / 2 ; ym = (float)(y1 + y2) / 2 ; printf("Les coordonnées du point milieu sont : (%5.2f, %5.2f) ", xm, ym); getch() ; }
Exercice 5
Ecrire Ecrire un programme programme qui demande à l'uti l'utilisateu lisateurr une valeur pour U0, r et n et qui affiche la nième valeur de la suite arithmétique définie par U0 et Un+1 = Un + r. (On rappelle la propriété : Un = U0 + n.r ). program suite ; #include var U0, Un, r : real eal ; n : intege eger ; void main() begin { writeln ('Entrez les valeurs de U0, r et n') ; float U0,Un,r ; readln ( U0,r, n ); int n ; ENS – Rabat – Département d’Informatique
67
Solutions des exercices
Un := U0 + n*r; writeln ('La ',n:3,'ième valeur de la suite est :', Un :5:2) ; end.
printf("Entrez les valeurs de U0, r et n") ; scanf("%f %f %d",&Uo,&r,&n) ; Un = U0 + n*r; printf ("La %d ième valeur de la suite est :%5.2f"', Un) ; getch() ; }
Exercice 6
Ecrire un programme qui échange les contenus de 2 données si elles sont de signes contraires. program signe_contraire; #include var tmp,x,y:integer; #include begin void main() write('donner deux entiers differents:'); { readln(x,y); clrscr(); writeln('x=',x,' et y=' ,y); int x,y,tmp; if x*y <0 then printf("entrez deux nombres: "); begin scanf("%d %d",&x,&y); tmp:=x; printf("avant echange x=%d et y=%d\n",x,y); x:=y; if(x*y<0){ y:=tmp; tmp=x; writeln('les deux entiers sont de signes x=y; contraires donc apres echange'); y=tmp; writeln('x=',x,' et y=',y); printf("les 2 nombres sont de signes contraires end donc apres echange x=%d et y=%d",x,y); else } writeln('les deux entiers sont de meme signes else ENS – Rabat – Département d’Informatique
68
Solutions des exercices
donc pas d''echange'); readln; end.
printf("les 2 nombres sont de meme signes donc pas de changement"); getch(); }
Exercice 7
Ecrire un programme qui échange les contenus de 2 données si elle sont de signes contraires, sinon, il met leur produit dans le premier et la somme dans le deuxième program somme_produit; #include var tmp,x,y:integer; #include begin void main() write('donner deux entiers:'); { readln(x,y); clrscr(); writeln('x=',x,' et y=' ,y); int x,y,tmp; if x*y<0 then printf("entrez deux nombres: "); begin scanf("%d %d",&x,&y); tmp:=x; printf("avant echange x=%d et y=%d\n",x,y); x:=y; if(x*y<0){ y:=tmp; tmp=x; end x=y; else y=tmp; begin printf("les 2 nombres sont de signes contraires tmp:=x; donc apres echange x=%d et y=%d",x,y); x:=y*x; } y:=y+tmp; else{ end; tmp=x; writeln('apres operation'); x=x*y; ENS – Rabat – Département d’Informatique
69
Solutions des exercices
writeln('x=',x,' et y=',y); readln; end.
y=y+tmp; printf("les 2 nombres sont de meme signes donc leur produit est x=%d \net leur somme est y=%d",x,y); } getch(); }
Exercice 8
Ecrire un programme qui étant donnée un mois et son premier jour, affiche le premier jour du mois suivant program premier_jour; #include var nbj,annee,mois,premj:integer; #include begin void main() write('entrer une annee de votre choix:'); { readln(annee); clrscr(); write('entrer un mois et son premier jour:'); int biss,nbj,premj,M,A; readln(mois,premj); printf("donnez une annee de votre case mois of choix:");scanf("%d",&A); 1,3,5,7,8,10,12: nbj:=31; printf("donnez un mois et son premier 4,6,9,11: nbj:=30; jours:");scanf("%d %d",&M,&premj); 2: begin if (A % 100==0) 100==0) A=A/100; if annee mod 100 = 0 then annee:=annee div if (A % 4==0) biss=0; 100; else biss=1; if annee mod 4 = 0 then nbj:=29 switch (M){ else nbj :=28; case 1 : end; case 3 : end; case 5 : premj:=(premj+nbj) mod 7; case 7 : ENS – Rabat – Département d’Informatique
70
Solutions des exercices
writeln('le premier jour du mois suivant est:',premj);
case 8 : case 10: case 12: nbj=31;
readln; end.
break;
case 4 : case 6 : case 9 : case 11: nbj=30; break;
case 2 : if (bissextile(A)) nbj=28; else nbj=29; break; }
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 var N,i,s:integer; #include begin void main() write('entrer un nombre positif:'); { ENS – Rabat – Département d’Informatique
71
Solutions des exercices
readln(N); s:=0; if N>0 then for i:=1 to N do s:=s+i; writeln('la somme de N premiers termes positifs:',N);; readln end.
clrscr(); int N,i,S; printf("donnez un entier positif: ");scanf("%d",&N); S=0; if(N>0) { for(i=1 ;i<=N;i++) S=S+i; } printf("la somme des %d premiers termes positifs est:%d ",N,S); getch(); }
Exercice 10
Ecrire un programme qui calcule la somme des N premiers termes positifs impaires program som_impaire; include var N,i,s:integer; #include 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; ENS – Rabat – Département d’Informatique
72
Solutions des exercices
end; writeln('somme de ',N,' premiers termes positifs impaires est: ',s); readln; end.
while(i<=2*N-1){ S=S+i; i=i+2;
} printf("la somme des %d premiers termes positifs impaires est:%d ",N,S); getch();}
Exercice 11
Ecrire un programme qui calcule la somme des N premiers termes positifs pairs nom multiple de 3 program som_paires; #include var N,i,s,cp:integer; #include begin void main() write('entrer un entier positif:'); { readln(N); clrscr(); i:=0;s:=0;cp:=0; int N,i,S,cp; while(cp 0) then i=0; begin cp=0; s:=s+i; while(cp
73
Solutions des exercices
readln; end.
} printf("la somme des %d premiers termes positifs impaires non multiple de 3 est:%d ",N,S); getch(); }
Exercice 12
Ecrire un programme qui calcule la somme 1/2 + 1/4 + 1/8 +…+1/2n (n Є N*) program calcul; #include var n,i:integer; #include s,u:real; #include begin #include s:=0; void main() u:=1/2; { i:=1; clrscr(); write('donner un entier non nul: ');readln(n); float s,u; while i<=n do int i,n; begin s=0; s:=s+u; u=(float)1/2; u:=u/2; i=1; i:=i+1; printf("donnez un entier positif non end; nul:");scanf("%d",&n); writeln('la somme est: ',s:10:5); while(i<=n){ readln; s=s+u; end. u=u/2; i=i+1; } ENS – Rabat – Département d’Informatique
74
Solutions des exercices
printf("la somme est: %f",s); getch(); } Exercice 13
Ecrire un programme qui calcule la somme 1+1/2-1/4+ 1/8-1/16+…±1/2 n (n Є N*) program calcul; #include var n,i:integer; #include 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(); } ENS – Rabat – Département d’Informatique
75
Solutions des exercices
Exercice 14
Ecrire un programme qui donne le nombre N tel que la série 1+1/2-1/3+1/4- 1/5+…±1/N donne un résultat égal (à 1/100 près) à 1,33 program calcul; #include var S:real; #include i:longint; #include begin void main() S:=1; { i:=1; clrscr(); while abs(S - 1.33) > 0.001 do float s,n; begin long int i; if (i mod 2=0) then S:=S-(1/(i+1)) s=1; else S:=S+(1/(i+1)); i=1; i:=i+1; while( fabs(s-1.33)>0.001) end; { write('le nombre tel que la serie donne un resultat = n=(float)1/(i+1); 1,33 est:',s:10:5) ; if (i%2==0) s=s-n; readln; else s=s+n; end. i=i+1; } printf("la valeur approche de 1,33 est : %f",s); getch(); } Exercice 15
Ecrire un programme qui donne la plus grande valeur inférieure à 1000 de la somme 1+2+4+8+…+2N program calcul; #include ENS – Rabat – Département d’Informatique
76
Solutions des exercices
var u,s:integer; begin u:=2; s:=1; while s<1000 do begin s:=s+u; u:=u*2; end; s:=s-(u div 2); writeln('la plus grande valeur inferieur a 1000 de la somme est: ',s); readln; end.
#include void main() { clrscr(); int s,u; s=1; u=2; while(s<1000){ s=s+u; u=2*u; } s=s-u/2; printf("la plus grande valeur inferieur a 1000 est: %d",s); getch(); }
Exercice 16
Ecrire un programme qui calcule la somme 1+x+x2+…+xn (x réel et n entier). program calcul; #include var x,s,u:real; #include n,i:integer; #include begin void main() write('donner un reel et un entier:'); { readln(x,n); clrscr(); i:=1; float s,x,u; s:=1; int n,i; ENS – Rabat – Département d’Informatique
77
Solutions des exercices
u:=x; while i<=n do begin s:=s+u; u:=u*x; i:=i+1; end; writeln('la somme est: ',s:10:5); readln; end.
printf("donnez un reel et un entier :"); scanf("%f %d",&x,&n); s=1; u=x; for(i=1;i<=n;i++){ s=s+u; u=u*x; } printf("la Somme est:%f",s); getch(); }
Exercice 17 Calcul approché de 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 A n=lim Gn= n∞ n∞ Ecrire un programme qui donne la valeur de avec une précision relative Є=10-6, c’est à dire |An-Gn|/|Gn|<Є x
x
x
program racine_carre; var x,A,G,B:real; begin write('donner un nombre non nul: '); readln(x); A:=x; G:=1; while abs((A-G)/G)>0.000001 do ENS – Rabat – Département d’Informatique
#include #include #include void main() { clrscr(); float x,A,B,G; printf("donner un nombre non nul:"); 78
Solutions des exercices
begin B:=A; A:=(A+G)/2; G:=2*B*G/(B+G); end; writeln('la racine de ',x:10:5,' est: ',A:10:5); readln; end.
scanf("%f",&x); A=x; G=1; while(fabs((A-G)/G)>0.000001) { B=A; A=(A+G)/2; G=2*B*G/(B+G); } printf("la racine de %f est : %f",x,A); getch(); }
Exercice 18
Sachant que la somme 1-1/3+1/5-1/7+1/9... tend vers ∏/4. écrire un programme donnant le nombre ∏ à 10 -6 près program pi; #include var s,t:real; #include 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); ENS – Rabat – Département d’Informatique
79
Solutions des exercices
else s:=s-t; i:=i+1; end; writeln('pi =',s:10:5); readln; end.
if (i%2==0) s=s+t; else s=s-t; i=i+1;
}
} printf("la valeur de pi est:%f",s); getch();
Exercice 19
Le développement limité de la fonction sinus au voisinage de zéro est : sin x= x - x3/3! + x5/5! -…+(-1) p x2p+1/ (2p+1)!+… Ecrire un programme qui calcule sin x à 10-6 près. program sinx; #include var s,x,u,t:real; #include v,i:integer; void main() begin { write('donner un nombre:');readln(x); clrscr(); s:=0; float s,u,x,v,t; u:=x; int i,n; v:=1; printf("donner un nombre:");scanf("%f",&x); i:=1; s=0; t:=u/v; u=x; while t>0.000001 do v=1; begin i=1; if i mod 2=0 then s:=s-(u/v) t=(float)u/v; else s:=s+(u/v); while (t>0.000001 ){ u:=u*x*x; if (i%2==0) s=s+u/v; ENS – Rabat – Département d’Informatique
80
Solutions des exercices
v:=(2*i+1)*2*i*v; i:=i+1; t:=u/v; end; writeln('le sinus de ',x:10:5,'est: ',s:10:5); readln; end.
else s=s-u/v; u=u*x*x; v=(2*i+1)*2*i*v; i++; t=(float)u/v; } printf("sinus de %f=%f",x,s); getch(); }
Exercice 20
Ecrire un programme qui calcule la somme, le produit et la différence de deux données numériques. program operation; #include var x,y:integer; #include op:char; void main() begin { writeln('donner deux nombres x et y'); int x,y; readln(x,y); char op; writeln('donner un op‚rateur'); printf("donner le premier operande\n"); readln(op); scanf("%d",&x); case(op) of printf("donner le deusieme operande\n"); '/': begin scanf("%d",&y); if y<>0 then writeln('la division de x par y est ‚gale printf("donner l'operateur\n"); …:',x/y) op=getch(); else writeln(' division par z‚ro'); switch(op) end; { ENS – Rabat – Département d’Informatique
81
Solutions des exercices
'*':writeln('x*y=',x*y); '+':writeln('x+y=',x+y); '-':writeln('x-y=',x-y); end; readln; end.
case '+': printf("x+y=%d\n",x+y); break; case '-': printf("x-y=%d\n",x-y); break; case '*': printf("x*y=%d\n",x*y); break; case '/': if( y!=0) printf("x/y=%f\n",x/y); else printf(" division par zero\n"); break; } getch(); }
Exercice 21
écrire un programme qui retourne le code d’une donnée de type CARACTERE. program code_ASCII; #include var c:char; #include asci:integer; void main() begin { writeln('donner un caractère:'); int asci; readln(c); char c; asci:=ord(c); printf("donner un caractere\n"); writeln('le code ASCII de ce caractère est:',asci); scanf("%c",&c); readln; asci='A'; end. printf("%d\n",asci); getch(); } Exercice 22
Ecrire un programme qui calcule le salaire net d’un employé, sachant que celui-ci a assuré un certain nombres ENS – Rabat – Département d’Informatique
82
Solutions des exercices
d’heures de travail à un prix fixe par heure, et que l’employeur doit réduire de son salaire des charges qui sont calculées avec un coefficient donné. program salaire_net_employe; #include var charges,sb,sn,coef,ph:real; #include nh:integer; void main() begin { writeln('donner le nombre d''heures de travail de cet int NH; employ‚:'); float NB,SN,SB,coef,PH,charges; readln(nh); writeln('donner le prix d''une heure:'); printf("donner le nombre d'heures de travail:\n"); readln(ph); scanf("%d",&NH); writeln('donner le coefficient:'); printf("donner le prix de chaque heure:\n"); readln(coef); scanf("%f",&PH); sb:=nh*ph; printf("donner le coefficient de reduction:\n"); charges:=sb*coef; scanf("%f",&coef); sn:=sb-charges; SB=NH*PH; writeln('le salaire net de cet employ‚ est:',sn); charges=SB*coef; readln; SN=SB-charges; end. printf("la salaire net de cet employe est egal a %f",SN); getch(); } Exercice 23
Ecrire un programme qui permet de reprendre l’exercice précédant en considérant que l’employé a assuré des heures normales, des heures à 25% et des heures à 50%. program salaire_net_supplements; include var charges,sb,sn,coef,ph:real; #include ENS – Rabat – Département d’Informatique
83
Solutions des exercices
nh25,nh50,nhn:integer; begin writeln('donner le nombre d''heures … 25% et celui … 50% ainsi que le nombre d''heure d''heure normales :'); readln(nh25,nh50,nhn); writeln('donner le prix d''une heure:'); readln(ph); writeln('donner le coefficient:'); readln(coef); sb:=nhn*ph+nh25*ph*125/100+nh50*150/100*ph; charges:=sb*coef; sn:=sb-charges; writeln('le salaire net de cet employ‚ est:',sn); readln; end.
void main() { int NHN,NH25,NH50; float NB,SN,SB,coef,PH,charges; printf("donner le nombre d'heures normales:\n"); scanf("%d",&NHN); printf("donner le nombre d'heures a 25%:\n"); scanf("%d",&NH25); printf("donner le nombre d'heures a 50%:\n"); scanf("%d",&NH50); printf("donner le prix d'une heure:\n"); scanf("%f",&PH); printf("donner le coefficient de reduction:\n"); 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 donnée numérique est paire ou impaire (utiliser le reste de la division par 2). program est_pair; #include var n:integer; #include ENS – Rabat – Département d’Informatique
84
Solutions des exercices
bp:boolean; begin writeln('donner un entier positif:'); readln(n); bp:=(n mod 2)=0; if bp then writeln('cet entier est pair') else writeln('cet entier n''est pas pair'); readln; end.
void main() { int n; printf("donner un entier positif :\n"); scanf("%d",&n); if( n % 2 == 0) printf("cet entier est pair.\n"); else printf("cet entier n'est pas pair.\n"); getch(); }
Exercice 25
Ecrire un programme qui permet de lire trois données numériques et retourne si la troisième donnée est la somme des deux autres ou pas. program est_somme; #include var x,y,z:integer; #include 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 trosième donnée est égale à la printf("la trosieme donnée est egale a la somme des somme des autres ') autres.\n"); else else printf("la trosieme donnée n'est pas egalea la writeln('la trosième donnée n'' est pas égale à la somme des autres.\n"); somme des autres '); getch(); ENS – Rabat – Département d’Informatique
85
Solutions des exercices
readln; end.
}
Exercice 26
Ecrire un programme qui, à partir du salaire brut d’un employé, détermine l’impôt à payer sachant que les règles de calcul des impôts sont comme suit : salaire brut(SB) SB<1500 1500<=SB<3000 300 3000<=S 0<=SB< B<50 5000 00 SB>=5000 program impots; var sb,impot:real; begin writeln('donner le salaire brut de cet employé:'); readln(sb); if sb<1500 then writeln('l''impot à payer est de 0%') else begin if sb<3000 then writeln('l''impot à payer est de:',sb*0,1) else begin if sb<5000 then writeln('l''impot à payer est de:',450+30/100*(sb-3000)) ENS – Rabat – Département d’Informatique
l’impôt à payer 0% 10% du SB 450 450+30% +30%(S (SBB-30 3000 00)) 750+40%(SB5000) #include #include void main() {float sb; printf("donner le salaire brut de cet employe:\n"); scanf("%f",&sb); if (sb<1500) printf("l'impot a payer est de 0%.\n"); else { if (sb<3000) printf("l'impot a payer est de: %f\n",sb*0.1); else { if (sb<5000) printf("l'impot a payer est de: 86
Solutions des exercices
else writeln('l''impot à payer est de:',750+40/100*(sb5000)); end; end; readln end.
%f\n",450+0.3*(sb-3000)); else printf("l'impot a payer est de: %f\n",750+0.4*(sb-5000)); } } getch(); }
Exercice 27
Ecrire un programme qui fournit les racines de l’équation Ax 2+Bx+C=0. program eqation ; #include var a,b,c:integer; #include delta:real; #include 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"); 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 { ENS – Rabat – Département d’Informatique
87
Solutions des exercices
équation sont: x1=',(-b-sqrt(delta))/(2*a),'x2=', ( b+sqrt(delta))/(2*a)) else writeln('pas de solution'); end; readln; end.
delta=b*b-4*a*c; if (delta>=0) printf("les racines de cette équation sont: x1=%f et x2= %f",(-b-sqrt(delta))/(2*a),(-b+sqrt(delta))/(2*a)); else printf("pas de solution"); getch(); } }
Exercice 28
Ecrire un programme qui, étant donnée une date (jour, mois, année), affiche la date du jour suivant. program jour_suivant; #include var j,m,a,ms,js,as:integer; #include 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) 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 : ENS – Rabat – Département d’Informatique
88
Solutions des exercices
if m=12 then begin ms:=1; as:=a+1; end else begin ms:=m+1; as:=a; end; end else begin js:=j+1; ms:=m; as:=a; end; writeln('le jour suivant est :',js,'/',ms,'/',as); readln; end.
ENS – Rabat – Département d’Informatique
case 8 : case 10: case 12: dj=(j==31);
break;
case 4 : case 6 : case 9 : case 11: dj=(j==30); case 2 : if(biss) dj=(j==28); else dj=(j==29); break;
break;
} if (dj) { js=1; if(m==12){ ms=1; as=a+1; } else{ ms=m+1; as=a; } } else{ 89
Solutions des exercices
}
js=j+1; ms=m; as=a;
printf("\nle jour suivant est:%d/%d/ %d",js,ms,as) ; getch(); } Exercice 29
Ecrire un programme qui, étant donnée une date (jour, mois, année), affiche la date du jour précédant. program jour_precedant; #include var nj,j,m,a,mp,jp,ap:integer; #include 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: ENS – Rabat – Département d’Informatique
90
Solutions des exercices
if m=1 then begin ap:=a-1; jp:=nj; mp:=12; end else begin mp:=m-1; ap:=a; jp:=nj; end; end else begin jp:=j-1; mp:=m; ap:=a; end; writeln('le jour précédant est :',jp,'/',mp,'/',ap); readln; end.
ENS – Rabat – Département d’Informatique
case 10: case 12: nj=31; case 4: case 6: case 9: case 11:nj=30; case 2: if (biss) nj=29; else nb=28; } if (j==1) { if (m==1) { ap=a-1; jp=nj; mp=12; } else { mp=m-1; ap=a; jp=nj; } else { jp=j-1; mp=m; ap=a; } printf("le jour precedant est :%d/%d/%d",jp,mp,ap); 91
Solutions des exercices
getch(); } } Exercice 30
Ecrire un programme qui calcule la somme 5+6+7+….+N (N>=5). Program Somme_entiers; #include var N,i,S:integer; #include 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
Ecrire un programme qui calcule le produit des N (N>0) premiers entiers positifs. program Produit_Entiers; #include var P,i,N:integer; #include begin void main() writeln('donner un entier >0:'); { ENS – Rabat – Département d’Informatique
92
Solutions des exercices
readln(N); if N<=0 then writeln('il faut donner un entier > 0!') else P:=1; for i:=1 to N do P:=P*i; writeln('le produit des N premiers entiers est :',P); end.
int p,i,n; printf("Donner un entier >0:"); scanf("%d",&n); if(n<=0) printf("Il faut donner un entier enti er >0!!"); else{ p=1; for(i=1;i<=n;i++) p=p*i; printf("le produit des %d premiers entiers est:%d",n,p); } getch(); }
Exercice 32
Ecrire un programme qui calcule la somme 1+1/2+1/4+1/6+…1/2N (N>0). program Serie_Fraction; #include var i,N:integer; #include S:real; void main() begin { writeln('donner un entier N>0'); int i,n; readln(N); float s; S:=1; printf("Donner un entier >0:"); i:=1; scanf("%d",&n); repeat s=1;i=1; begin do{ S:=S+(1/(2*i)); s=s+(float)1/(2*i); i:=i+1; i=i+1; ENS – Rabat – Département d’Informatique
93
Solutions des exercices
end; until i=N+1; writeln('S=,'S); readln; end.
}
}while(i<=n); printf("la somme est: %f",s); getch();
Exercice 33
Ecrire un programme qui échange les contenus de trois données numériques si leur somme est paire, sinon il met la somme des trois dans la première donnée, leur produit dans la seconde et la valeur zéro dans la troisième. program echange_cond_trois; void main() uses crt; { var s,tmp,x,y,z:integer; clrscr(); begin int x,y,z,tmp,s; clrscr; printf("Donnez trois entiers:"); writeln('donner trois entiers:'); scanf("%d %d %d",&x,&y,&z); readln(x,y,z); s=x+y+z; s:=x+y+z; if(s%2==0){ if(s mod 2)=0 then begin tmp=x; tmp:=x; x=y; x:=y; y=z; y:=z; z=tmp; z:=tmp; printf("x=%d,y=%d,z=%d",x,y,z); writeln('x=',x,' ','y=',y,' ','z=',z); } end else{ tmp=x; else begin x=x+y+z; tmp:=x; y=y*tmp*z; ENS – Rabat – Département d’Informatique
94
Solutions des exercices
x:=x+y+z; y:=y*tmp*z; z:=0; writeln('x=',x,' ','y=',y,' ','z=',z); end; readln; end.
z=0; printf("x=%d,y=%d,z=%d",x,y,z); } getch(); }
Exercice 34
Ecrire un programme qui calcule la somme :1-1/2+1/3-1/4+…+/-1/N program Serie_Alternative; include var i,N:integer; #include S:real; void main() b:boolean; { begin int i,n,b; writeln('donner un entier >0'); float s; readln(N); printf("Donner un entier >0:"); S:=1; scanf("%d",&n); for i:=2 to N do s=1; begin for(i=2;i<=n;i++){ b:=(i mod 2)=0; b=(i%2==0); if b then S:=S-1/i if(b) s=s-(float)1/i; else S:=S+1/i; else s=s+(float)1/i; end; } writeln('S=',S); printf("la somme est: %f",s); readln; end. getch(); } ENS – Rabat – Département d’Informatique
95
Solutions des exercices
Les fonctions Exercice 35
Ecrire une fonction paramétrée qui retourne si un nombre donné est premier ou non. function est_premier(N:integer):boolean; #include var i,nb:integer; #include begin int premier(int N) nb:=0; { for i:=1 to N do int i=2; if N mod i =o then nb:=nb+1; int termine=0; est_premier:=(nb=2); while(i<=sqrt(N)&&(!termine)){ end; termine=(N%i==0); i=i+1; } return(!termine); } Exercice 36
Ecrire une fonction paramétrée qui rend si un nombre donné est parfait ou non. function est_parfait(N:integer):boolean; #include var S,i:integer; int parfait(int A) begin { S:=0; int s=0; for i:=1 to N-1 do for(int i=1;i
96
Solutions des exercices
Ecrire une fonction paramétré qui rend si deux nombres données sont amis ou non. function Amis(N:integer;M:integer):boolean; #include var S,R,i,j:integer; int amis(int N,int M) begin { S:=0;R:=0; int s,r,i,j; for i:=1 to N-1 do r=0; if N mod i = 0 then S:=S+i; s=0; for j:=1 toM-1 do for(i=1;i
Ecrire une fonction paramétrée qui retourne l’inverse d’un nombre entier donné function inverse(n:longint):longint; var r,inv:longint; begin inv:=0; while n mod 10 =0 do n:=n div 10; while n mod 10 <>0 do begin r:=n mod 10; inv:=(inv*10)+r; n:=n div 10; ENS – Rabat – Département d’Informatique
#include #include long inverse(long n) { long r,inv; inv=0; while(n%10==0) n=n/10; while(n%10!=0){ r=n%10; inv=(inv*10)+r; 97
Solutions des exercices
end; inverse:=inv; end;
n=n/10; }
} return(inv);
Exercice 39
Ecrire une fonction récursive permettant de calculer le PGDC de deux nombres entiers positifs A et B. function pgdc(a,b:integer):integer; #include begin int pgdc(int A,int B) if a>b then pgdc:=pgdc(a-b,b) { else if aB) return(pgdc(A-B,B)); else pgdc:=a; else if(A
Ecrire une fonction récursive permettant de calculer le PPMC de deux nombres entiers positifs A et B. function calcul_ppmc(A:integer,B:integer):integer; #include var multiple,k:integer; int ppmc(int A,int B) begin { if A 0 do multiple=A*k; ENS – Rabat – Département d’Informatique
98
Solutions des exercices
begin multiple:= A*k; k:=k+1; end;
k++; }
} return(multiple);
} ppmc:=multiple; end; end; Exercice 41
Ecrire une fonction récursive qui permet de calculer le factoriel d’un nombre donné. function Factoriel(N:integer):integer; include begin long fact(int n) if N=0 then factoriel:=1 { else if(n>1) return(fact(n-1)*n); factoriel:= N*factoriel(N-1); else return 1; end; } Exercice 42
Ecrire une fonction récursive qui permet de calculer la puissance d’un entier donné. function puissance(N:integer,k:integer):longint; #include 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; }
ENS – Rabat – Département d’Informatique
99
Solutions des exercices
Exercice 43
Ecrire une fonction récursive qui calcule la valeur de la fonction d’Ackermann « A » définie pour m>0 et n>0 par : A(m, n)=A((m-1),A(m,n-1)) 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 ; function acker(n,m:integer):integer; begin if (m<0) or (n<0) then acker:=0 else if n=0 then acker:=m+1 else if m=0 then acker:= acker(n-1,1) else acker:=acker(n-1,acker(n,m-1)) end;
#include #include int acker(int n,int m) { if((m<0)||(n<0)) return 0; else if(n==0) return (m+1); else if(m==0) return(acker(n-1,1)); else return(acker(n-1,acker(n,m-1))); }
Exercice 44
Ecrire une fonction qui fournit le nombre de chiffres d’un entier donné. function NCHIFFRES (N:longint):integer; int NCHIFFRES(long N) var I:integer; { begin int I; If N<0 then N:=N*(-1); if (N<0) I:=1; N *= -1; while N>10 do for (I=1; N>10; I++) begin N /= 10; N:=N div 10; return I; ENS – Rabat – Département d’Informatique
100
Solutions des exercices
I:=I+1; end; NCHIFFRES:=I; End;
}
Les procédures Exercice 45
Ecrire une procédure qui permet de dessiner la lettre X, à l'aide d'espaces et d'une "lettre" fournie par l'utilisateur, auquel on demande aussi la "hauteur" du dessin qu'il désire obtenir. Avec les réponses : a et 5, elle donnera : a a a a a a a a a procedure DessX(hauteur:integer;lettre:char); void DessX(int hauteur,char lettre) { int no_ligne,i; var no_ligne,i:integer; for(no_ligne=1;no_ligne<((hauteur+1)/2);no_ligne++) begin { for no_ligne:=1 to ((hauteur+1) div 2)-1 do for (i=1;i
101
Solutions des exercices
writeln; end; for i:=1 to ((hauteur+1) div 2)-1 do write(' '); write(lettre); writeln; for no_ligne:=1 to ((hauteur+1) div 2)-1 do begin for i:=0 to ((hauteur-2*no_ligne-1) div 2)-1 do write(' '); write(lettre); for i:=0 to (2*no_ligne-1)-1 do write(' '); write(lettre); writeln; end; end;
for(i=1;i<(hauteur+1)/2;i++) printf("%c",' '); printf("%c",lettre); printf("\n"); for(no_ligne=1;no_ligne<((hauteur+1)/2);no_ligne++) { for (i=0;i<(hauteur-2*no_ligne-1)/2;i++) printf("%c",' '); printf("%c",lettre); for(i=0;i<2*no_ligne-1;i++) printf("%c",' '); printf("%c",lettre); printf("\n"); } }
Exercice 46
Soit un programme qui visualise un menu composé de trois rubriques : Hors d’œuvre, plat chaud et dessert. Ecrire une procédure qui permet d’effectuer, à chaque fois, un choix exclusif. program menu; #include uses crt; #include 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; ENS – Rabat – Département d’Informatique
102
Solutions des exercices
writeln; write('-',choix,'-'); if choix=choix1[1] then writeln(choix1) else if choix=choix2[1] then writeln(choix2) else if choix=choix3[1] then writeln(choix3); end; begin clrscr; plat('soupe','crudit','oeuf Dur'); plat('steak','poulet','hamburger'); plat('gateau','poire','fromage'); readln; end.
choix=getch(); printf("-%c-",choix); if(choix==choix1[0]) printf("%s",choix1); if(choix==choix2[0]) printf("%s",choix2); if(choix==choix3[0]) printf("%s",choix3); }
Exercice 47
Ecrire une procedure paramétrée, qui permet l’échange des contenus de deux paramètres formels par valeur A et B. Appeler cette procédure dans un programme principal.On écrira les résultats dans le corps de la procédure, et dans le programme principal. program exchange; include var A:real; #include B: real; void echange(float x,float y) procedure echange(x,y:real); { var temp:real; float temp; begin printf("Echange:%10.2f %10.2f",x,y); writeln('Ecange:',x:10:2,y:10:2); temp=x; temp:=x; x=y; x:=y; y=temp; ENS – Rabat – Département d’Informatique
103
Solutions des exercices
y:=temp; writeln('Echange:',x:10:2,y:10:2); end; begin readln(A,B); echange(A,B); writeln('Echange:',x:10:2,y:10:2); readln; end.
printf("\nEchange:%10.2f %10.2f",x,y); } void main() { clrscr(); float A,B; scanf("%f %f",&A,&B); echange(A,B); printf("\nEchange:%10.2f %10.2f",A,B); getch(); }
Exercice 48
Ecrire une procedure paramétrée, qui permet l’échange des contenus de deux paramètres formels par adresse A et B. Appeler cette procédure dans un programme principal.On écrira les résultats dans le corps de la procédure, et dans le programme principal. program exchange; #include var A:real; #include 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); } ENS – Rabat – Département d’Informatique
104
Solutions des exercices
end; begin readln(A,B); echange(A,B); writeln('Echange:',x:10:2,y:10:2); readln; end.
void main() { clrscr(); float A,B; scanf("%f %f",&A,&B); echange(A,B); printf("\nEchange:%10.2f %10.2f",A,B); getch(); }
Exercice 49
Ecrire une procédure qui affiche tous les nombres premiers qui sont compris entre 1 et 200. procedure Nombres_premiers; Void Nombres_premiers (void) var i,j,nb:integer; { begin int i,j,nb ; for j:=1 to 200 do for(j=1; i<=200;i++) begin { nb:=0; for(nb=0,i=1;i<=j/2;i++) for i:=1 to (j div 2) do if (!(j %i) nb++; if( j mod i =0) then nb:=nb+1; if( nb==1 ) printf(“%d\n”,j); if nb=1 then writeln(j); } end; } end; Exercice 50
Ecrire une procédure qui affiche tous les nombres parfaits qui sont compris entre 1 et 200. procedure Nombres_parfaits; Void Nombres_parfaits() var i,j,nb,S:integer; { int i,j,S ; ENS – Rabat – Département d’Informatique
105
Solutions des exercices
begin for j:=1 to 200 do begin S:=0; for i:=1 to j-1 do if( j mod i =0) then S:=S+I; if S=j then writeln(j); end; end;
for(j=1;j<=200;j++) { { } }
for (S=0,i=1;i<=j-1;i++) if (!(j%i)) s+=i; if (s==j ) printf(“%d\n”,j);
Exercice 51
Ecrire une procédure qui permet d’afficher tous les diviseurs d’un entier N ainsi que leur nombre. procedure Diviseurs(N :integer) ; void Diviseurs(int N) var i,nb:integer; { int nb=0 ; begin printf(“les diviseurs de % sont \n”,N); nb:=0; for( int i=1 ;i<=N ;i++) writeln(‘Les diviseurs de ‘,N,’sont :’) ; if (!(N%i )){ for i:=1 to N do printf(‘’ %d\n”,i); if N mod i =0 then nb+=1;} begin printf(“le nombre de diviseurs de %d est%d”,N,nb); writeln(i); } nb:=nb+1; end; writeln(‘Le nombre de diviseurs de ‘,N,’est :’,nb); end ; Exercice 52 ENS – Rabat – Département d’Informatique
106
Solutions des exercices
Affichez un triangle isocèle formé d'étoiles de N lignes (N est fourni au clavier): Nombre de lignes : 8 * *** ***** ******* ********* *********** ************* *************** procedure DessinerTri(L:integer); void DessinerTri(int L) var { int i; /* compteur des lignes */ k:integer; {compteur des lignes} int j; /* compteur des caractères */ ESP,I,j:integer; int e; /* nombre d'espaces */ begin for (i=0;i
107
Solutions des exercices
Exercice 53
Calculer pour une valeur X donnée du type float la valeur numérique d'un polynôme de degré n: P(X) = AnXn + An-1Xn-1 + ... + A 1X + A0 Les valeurs de n, des coefficients An, ..., A0 et de X seront entrées au clavier. Utiliser le schéma de Horner qui évite les opérations d'exponentiation lors du calcul:
procedure polynome(N:integer;X:real); var I:integer; A,B:real; begin for I:=1 to N+1 do begin writeln('donner le ',I,'eme coefficient'); readln(B); A:=A*X+B; end; writeln(‘Valeur du polynôme pour X = ‘,X,’est :’,A); readln; end;
void polynome(int N, float X) { float A; /* coefficients successifs du polynôme */ float P; /* coefficient coefficient courant du terme Horner */ for(P=0.0 ; N>=0 ; N--) { printf("Entrer le coefficient A%d : ", N); scanf("%f", &A); P = P*X + A; } printf("Valeur du polynôme pour X = %.2f : %.2f\n", X, P); }
Exercice 54 ENS – Rabat – Département d’Informatique
108
Solutions des exercices
Ecrire une procédure qui affiche la table des produits pour N variant de 1 à 10 : X*Y I 0 1 2 3 4 5 6 7 8 9 10 ------------------------------------------------------------------------------------------------0 I 0 0 0 0 0 0 0 0 0 0 0 1 I 0 1 2 3 4 5 6 7 8 9 10 2 I 0 2 4 6 8 10 12 14 16 18 20 3 I 0 3 6 9 12 15 18 21 24 27 30 4 I 0 4 8 12 16 20 24 28 32 36 40 5 I 0 5 10 15 20 25 30 35 40 45 50 6 I 0 6 12 18 24 30 36 42 48 54 60 7 I 0 7 14 21 28 35 42 49 56 63 70 8 I 0 8 16 24 32 40 48 56 64 72 80 9 I 0 9 18 27 36 45 54 63 72 81 90 10 I 0 10 20 30 40 50 60 70 80 90 100 program tabMul; CONST MAX= 10; var I,J:integer; begin write(' X*Y I'); for I:=0 to MAX do write(I:4); writeln; writeln('-----------------------writeln('----------------------------------------------------------’); -----------’); for J:=0 to max do begin ENS – Rabat – Département d’Informatique
void tabMul(void) { const int MAX = 10; /* nombre de lignes et de colonnes */ int I; /* compteur des lignes */ int J; /* compteur des colonnes */ /* Affichage de l'en-tête */ printf(" X*Y I"); for (J=0 ; J<=MAX ; J++) printf("%4d", J); 109
Solutions des exercices
write(J:7,’ I’); for I:=0 to Max do write(I*J:4); writeln; end; readln; end.
printf("\n"); printf("------"); for (J=0 ; J<=MAX ; J++) printf("----"); printf("\n"); /* 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 procédure qui affiche les nombres négatifs d’une liste réelle 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
110
Solutions des exercices
Ecrire une procédure qui met à zéro la diagonale d’une matrice carrée. type matrice=array[1..50,1..50] of integer; typedef int ligne[50]; procedure mise_zero(var a:matrice;n:integer); typedef ligne matrice[50]; var i:integer; void mise_zero(matrice A,int n) begin {int I; for i:=1 to n do for (I=0; I
Ecrire une procédure qui affiche l’occurrence d’existence d’un nombre réel dans une liste de nombres réels Type tab=array[0..50] of real ; void occurrence(float a[],int n,float nbre) Procedure occurrence(a:tab;n:integer;nbre:real); {int i,cpt; Var i,cpt:integer; for(i=0,cpt=0;i
Ecrire une procédure qui met le plus petit élément d’une liste au début de celle-ci type tab=Array[0..50] of real; void min_debut(float a[],int n) procedure min_debut(var a:tab;n:integer); {int i,ind; var i,ind:integer; float tmp; tmp: real; for(i=1,ind=0;i
111
Solutions des exercices
begin ind:=0; for i:=0 to n-1 do if a[i]
if(a[i]
Exercice 59
Ecrire une procédure qui met les éléments négatifs d’une liste à gauche et les éléments positifs à droite de la liste 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
112
Solutions des exercices
Ecrire une procédure qui classe une liste de notes de la plus petite à plus grande type tab=Array[0..50] of real; void tri(float note[],int n) procedure tri(var note:tab;n:integer); {int i,j,min; var i,j,min:integer; float tmp; tmp:real; for(i=0;ii then note[min]=tmp; begin } tmp:=note[i]; } note[i]:=note[min]; } note[min]:=tmp; end; end; end; Exercice 61
Etant donné N étudiants, leurs notes correspondantes à M matières et leur moyenne. Ecrire une procédure qui affiche à côté de chaque étudiant son classement. type matrice=array[1..50,1..50]of real; void moyenne(float m[50][50],int tl,int tc) procedure moyenne(var m:matrice;tl,tc:integer); {float s; var i,j:integer; int i,j; s:real; for (i=0;i
113
Solutions des exercices
begin for i:=1 to tl do begin s:=0; for j:=1 to tc-2 do s:=s+m[i,j]; m[i,tc-1]:=s/(tc-2); end; end; procedure classement(var m:matrice;tl,tc:integer); var te,i,j,cl:integer; p:array[1..50] of integer; arret:boolean; begin for i:=1 to tl do m[i,tc]:=0; arret:=false; cl:=1; repeat begin j:=1; te:=0; while (m[j,tc]<>0) and (j<=tl) do j:=j+1; if m[j,tc]<>0 then arret:=true else ENS – Rabat – Département d’Informatique
{s=0; for(j=0;jm[p[te-1]][tc-2]) {te=0; p[te++]=j; } else if (m[j][tc-2]==m[p[te-1]][tc-2]) p[te++]=j; } for(i=0;i
Solutions des exercices
begin te:=te+1; p[te]:=j; for j:= p[te]+1 to tl do if m[j,tc]=0 then if m[j,tc-1]>m[p[te],tc-1] then begin te:=1; p[te]:=j; end else if m[j,tc-1] = m[p[te],tc-1] then begin te:=te+1; p[te]:=j; end; for i:=1 to te do m[p[i],tc]:=cl; cl:=cl+te; end; end; until arret; end;
m[p[i]][tc-1]=cl; cl+=te; }
} while(!arret); }
Exercice 62
Le tri par bulles est un tri par échange. Le principe de base est de réordonner les couples non classés tant qu’ils en existent. La méthode de tri par bulles consiste à parcourir la liste en comparant deux éléments successifs en ENS – Rabat – Département d’Informatique
115
Solutions des exercices
les permutant s’il y a lieu. Ecrire une procédure qui réalise ce tri. Type tab=array[0..50] of integer ; void echanger(int t[],int i, int j) Procedure echanger(var t:tab;i,j: integer); {int tmp=t[i]; Var tmp:integer; t[i]=t[j]; Begin t[j]=tmp; tmp :=t[i]; } t[i] :=t[j]; void tri_bulles (int t[], int n) t[j] :=tmp; {int k,p; End; for(k=0;k<=n-2;k++) Procedure tri_bulles(var t: tab; n: integer); for(p=n-2;p>=k;p--) Var p,k:integer; if(t[p+1]
Un palindrome est un mot, ou une phrase, lisible indifféremment de la gauche vers la droite ou inversement. Ecrire une fonction qui rend si une chaîne de caractères est un palindrome ou non. Function palindrome(s:string):boolean; int palindrome (char s[]) Var i,taille :integer; {int i,taille; miroir:string; char miroir[255]; begin taille=strlen(s); taille :=length(s) ; for(i=0;i
116
Solutions des exercices
miroir:=’’; for i:= 1 to taille do miroir:=miroir+s[taille-i+1]; palindrome :=(s=miroir) ; end ;
miroir[i]=s[taille-i-1]; return(!strncmp(miroir,s,taille)); } Remarque : Vous devez ajouter la ligne suivante au début de votre programme : #include , pour pouvoir utiliser les fonctions strlen et strncmp.
Exercice 64
Ecrire une fonction qui retourne la fréquence de présence d’un mot dans une phrase. Function frequence(phrase,mot:string):integer; int frequence (char phrase[],char mot[]) var cpt,debut:integer; {int cpt=0; begin while (phrase=strstr(phrase,mot)) cpt:=0; {cpt++; while pos(mot,phrase)<>0 do phrase=phrase+strlen(mot); begin } cpt:=cpt+1; return(cpt); debut:=pos(mot,phrase); } delete(phrase,1,length(mot)+debut); Remarque : end; Vous devez ajouter la ligne suivante au début de votre frequence:=cpt; programme : #include , pour pouvoir utiliser end; les fonctions strlen et strstr. Exercice 65
Ecrire une procédure qui enlève tous les blancs au début d’une phrase et laisse un seul blanc entre les différents mots de la phrase procedure blanc(var s:string); void blanc (char s[ ]) var ind:integer; { ENS – Rabat – Département d’Informatique
117
Solutions des exercices
tmp:string; begin while s[1]=' ' do delete(s,1,1); ind:=0; tmp:=s; while pos(' ',tmp)<>0 do begin ind:=pos(' ',tmp)+ind; while s[ind+1]=' ' do delete(s,ind+1,1); tmp:=copy(s,ind+1,length(s)); end; end;
while(s[0]==' ') strcpy(s,s+1); while(s=strchr(s,' ')) { while(*(s+1)==' ') strcpy(s,s+1); s=s+1; } } Remarque : Vous devez ajouter la ligne suivante au début de votre programme : #include , pour pouvoir utiliser les fonctions strcpy et strchr.
Exercice 66
Soit un nombre entier positif N. Ecrire une fonction qui donne son équivalent dans une base donnée B (2≤ B≤ 16) 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); ENS – Rabat – Département d’Informatique
118
Solutions des exercices
While n<>0 do Begin s:=car(n mod b)+s; n:=n div b; End; dix_b:=s; End;
strcpy(t+1,""); strcat(t,s); strcpy(s,t); n=n/b; } return(s); }
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
119
Solutions des exercices
res:=res*b+valeur(n[i]) ; b_dix :=res ; End ;
Vous devez ajouter les lignes suivantes au début de votre vot re progra programme mme : #in #inclu clude de > et #in #inclu clude de , 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é à réaliser des opérations sur des nombres entiers très grands, on peut utiliser les chaînes de caractères pour représenter ces nombres et ensuite faire l’opération par bloc. Ecrire une procédure pour réaliser l’opération d’addition sur de tels nombres. 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[10 s1[100],s2[100],s[100],n[100],t[2]; 0],t[2]; N,S,S1,S2:string; int r,v; begin r=0; N:=''; strcpy(s1,"");strcpy(s2,"");strcpy(s,"");strcpy(n,"");strc R:=0; py(t,""); While ( N1<>'') or (N2<>'') Do while((strlen(n1)!=0) || (strlen(n2)!=0)) Begin { If Length(N1)>4 Then if(strlen(n1)>=4) Begin { S1:=Copy(N1,Length(N1)-3,4); strcpy(s1,n1+strlen(n1)-4); ENS – Rabat – Département d’Informatique
120
Solutions des exercices
Delete(N1,Length(N1)-3,4); End Else Begin S1:=N1; N1:=''; End ; If Length(N2)>4 Then Begin S2:=Copy(N2,Length(N2)-3,4); Delete(N2,Length(N2)-3,4); End Else Begin S2:=N2; N2:=''; End ; Val(S1,V1,Code); Val(S2,V2,Code); V:=V1+V2+R; Str(V,S); If Length(S)>4 Then Begin Val(Copy(S,1,1),R,Code); S:=Copy(S,2,Length(S)-1); End ENS – Rabat – Département d’Informatique
strcpy(n1+strlen(n1)-4,""); } else { strcpy(s1,n1); strcpy(n1,""); } if(strlen(n2)>=4) { strcpy(s2,n2+strlen(n2)-4); strcpy(n2+strlen(n2)-4,""); } else { strcpy(s2,n2); strcpy(n2,""); } v=atoi(s1)+atoi(s2)+r; strcpy(s1,"");strcpy(s2,"");itoa(v,s,10); if(strlen(s)>4) { strncpy(t,s,1); r=atoi(t); strcpy(s,s+1); } else 121
Solutions des exercices
Else R:=0; N:=S+N; End; Calcul:=N end;
r=0; strcat(s,n);strcpy(n,s); } return(n); } Remarque : Vous devez ajouter les lignes suivantes au début de votre vot re progra programme mme : #in #inclu clude de > et #in #inclu clude de .h>pou pourr pouvoi pouvoirr utilis utiliser er les fonctio fonctions ns strlen strlen,, strcat, strcpy, atoi, itoa et strncpy.
Exercice 70
Ecrire une procédure qui permet de passer de la représentation d’un nombre en chiffres romains à sa représentation décimale. 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); ENS – Rabat – Département d’Informatique
122
Solutions des exercices
var i,d,dn:integer; begin dec:=0; d:=ConvDec1(rom[1]); for i:=1 to length(rom)-1 do begin dn:=ConvDec1(rom[i+1]); if(d
void ConvDec(char rom[],int *dec) { int i, d, dn; *dec = 0; d = ConvDec1(rom[0]); for (i = 0; rom[i+1] != '\0'; i++) { dn = ConvDec1(rom[i+1]); if (d < dn) *dec -= d; else *dec += d; d = dn; } *dec += d; } Remarque : Vous devez ajouter la ligne suivante au début de votre programme : #include pour pouvoir utiliser la fonction toupper.
Exercice 71
Ecrire une procédure qui permet de passer de la représentation décimale d’un nombre à sa représentation en chiffres romains. procedure ConvRom(var rom:string;dec:integer); void ConvRom(char rom[], int dec) const ntok=13; { var tok:integer; int tok; const romval:array[1..13]of const int ntok = 13; string[2]=(‘I’,’IV’,’V’,’IX’,’X’,’XL’,’L’,’XC’,’C’,’C const char ENS – Rabat – Département d’Informatique
123
Solutions des exercices
D’,’D’,’CM’,’M’); const decval:array[1..13]of integer=(1,4,5,9,10,40,50,90,100,400,500,900,1000); begin rom:=''; for tok:=ntok downto 2 do begin while dec>=decval[tok] do begin rom:=rom+romval[tok]; dec:=dec-decval[tok]; end; end; end;
*romval[13]={"I","IV","V","IX","X","XL","L","XC"," C", "CD","D", "CM", "M"}; const int decval[13] ={1,4,5,9,10,40,50,90,100,400,500,900,1000}; rom[0] = '\0'; for (tok = ntok-1; tok >= 0; tok--) { while (dec >= decval[tok]) { strcat(rom, romval[tok]); dec -= decval[tok]; } } } Remarque : Vous devez ajouter la ligne suivante au début de votre programme programme : #include pour pouvoir utiliser utiliser la fonction strcat.
Exercice 72
Ecrire une fonction qui retourne le déterminant d’une matrice carrée. const DIM=10; #define DIM 10 type matrice=array[0..DIM-1,0..DIM-1] of real; typedef float ligne[DIM]; procedure det_aux(ma:matrice;var typedef ligne matrice[DIM]; mb:matrice;l,c:integer;n:integer); float expo(int n) var i,j,d,e:integer; { begin if(!(n%2)){return (1);} e:=0; return (-1); ENS – Rabat – Département d’Informatique
124
Solutions des exercices
for i:=0 to n-1 do begin d:=0; if i<>l then begin for j:=0 to n-1 do if j<>c then begin mb[e][d]:=ma[i][j]; d:=d+1; end; e:=e+1; end; end; end; function expo(n:integer):real; begin if n mod 2=0 then expo:=1 else expo:=-1; end; function determinant(m:matrice;l:integer):real; var i:integer; m2:matrice; ENS – Rabat – Département d’Informatique
} void det_aux(matrice ma,matrice mb,int l,int c,int n) {int i,j,d,e=0; for(i=0;i
Solutions des exercices
x:real; begin x:=0; if l=1 then determinant:= m[0][0] else begin for i:=0 to l-1 do begin det_aux(m,m2,i,0,l); x:=x+(expo(i)*m[i][0]*determinant(m2,(l-1))); end; determinant:=x; end; end;
{ det_aux(m,m2,i,0,l); x=x+(expo(i)*m[i][0]*determinant(m2,(l-1)));
} return (x); }
Exercice 73
Ecrire une procédure qui calcule l’inverse d’une matrice carrée. procedure transp_mat(ma:matrice;var void transp_mat(matrice ma,matrice mb,int n) mb:matrice;n:integer); { var i,j:integer; int i,j; begin for (i=0;i
126
Solutions des exercices
mb:matrice;n:integer); var i,j:integer; begin for i:=0 to n-1 do for j:=0 to n-1 do mb[i][j]:=ma[i][j]*a; end; procedure coffacteur(ma:matrice;var mb:matrice;l:integer); var i,j:integer; m2:matrice; begin if l=1 then mb[0][0]:=1 else begin for i:=0 to l-1 do for j:=0 to l-1 do begin det_aux(ma,m2,i,j,l); mb[i][j]:=expo(i+j)*determinant(m2,(l - 1)); end; end; end;
ENS – Rabat – Département d’Informatique
int i,j; for(i=0;i
Solutions des exercices
procedure inverse(ma:matrice;var mb:matrice;l:integer); var m1,m2:matrice; d:real; begin d:=(1/determinant(ma,l)); coffacteur(ma,m1,l); transp_mat(m1,m2,l); multi_R(d,m2,mb,l); end;
matrice m1,m2; float d; d=(1/determinant(ma,l)); coffacteur(ma,m1,l); transp_mat(m1,m2,l); multi_R(d,m2,mb,l); }
Exercice 74
Un carré magique est un carré divisé en cellules dans lesquelles les nombres entiers, à partir de 1 sont disposés de telle sorte que les sommes de chaque ligne, de chaque colonne et de chaque diagonale soient égales. Exemple : 6 1 8 7 5 3 2 9 4 Ecrire une procédure qui permet de réaliser 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; ENS – Rabat – Département d’Informatique
128
Solutions des exercices
fin:=n*n; c:=(n+1) div 2; carre[l,c]:=nombre; while nombre<>fin do begin if nombre mod n =0 then inc(l) else begin if l=1 then l:=n else dec(l); if c=1 then c:=n else dec(c); end; inc(nombre); carre[l,c]:=nombre; end; end;
c=(n+1)/2; carre[l][c]=nombre; while(nombre!=fin) { if(nombre%n==0) l++; else { if(l==1) l=n; else l--; if(c==1) c=n; else c--; } nombre++; carre[l][c]=nombre; } }
Les enregistrements Exercice 75
Ecrire un programme qui permet de saisir et d’afficher les informations d’une liste d’étudiants. Program gest; #include #include uses crt; typedef struct{ Type Date=record int j; J,M,A:Integer; int m; ENS – Rabat – Département d’Informatique
129
Solutions des exercices
end; etud=record Nom,Prn:string[20]; CIN:string[10]; Date_Nais:Date; End; Var TEtud:Array[1..100] of etud; Te:Integer; Procedure Affich_formul(Titre:String); Begin TextBackground(Blue); ClrScr; TextColor(Yellow); Gotoxy(35,4); Write(Titre); Gotoxy(20,7); Write('Nom :'); Gotoxy(20,9); Write('Pr‚nom :'); Gotoxy(20,11); Write('C.I.N :'); Gotoxy(20,13); Write('Date de Naissance :'); End;
ENS – Rabat – Département d’Informatique
int a; }date; typedef struct{ char nom[21]; char prn[21]; char cin[11]; date date_naiss; }etud; etud tetud[10]; int te=0; void affich_formul(char titre[]) { textbackground(BLUE); clrscr(); textcolor(YELLOW); gotoxy(35,4); cprintf("%s",titre); gotoxy(20,7); cprintf("Nom:"); gotoxy(20,9); cprintf("Prenom"); gotoxy(20,11); cprintf("C.I.N"); gotoxy(20,13); cprintf("Date de naissance"); 130
Solutions des exercices
Procedure saisie(Var E:Etud); Begin TextColor(White); With E, Date_Nais Do Begin Gotoxy(26,7); Clreol; Readln(Nom); Gotoxy(29,9); Clreol; Readln(Prn); Gotoxy(28,11); Clreol; Readln(CIN); Gotoxy(40,13); Clreol; Readln(J); Gotoxy(42,13); Write('/'); Readln(M); Gotoxy(45,13); Write('/'); Readln(A); End; End;
ENS – Rabat – Département d’Informatique
} void saisie(etud *e) { textcolor(WHITE); gotoxy(26,7); clreol(); scanf("%s",e->nom); gotoxy(29,9); clreol(); scanf("%s",e->prn); gotoxy(28,11); clreol(); scanf("%s",e->cin); gotoxy(40,13); clreol(); scanf("%d",&e->date_naiss.j); gotoxy(42,13); printf("/"); scanf("%d",&e->date_naiss.m); gotoxy(45,13); printf("/"); scanf("%d",&e->date_naiss.a); } void affich(etud e) { textcolor(WHITE); 131
Solutions des exercices
Procedure Saisietout; Var E:Etud; Rep:Char; Begin Te:=0; Affich_formul('S A I S I E'); Repeat Saisie(E); Te:=Te+1; TEtud[Te]:=E; TextColor(Yellow); Gotoxy(45,17); Write('Voulez-vous continuez (O/N)?'); Rep:=readkey; Gotoxy(45,17); Clreol; Until Rep In ['N', 'n']; End; Procedure Affich(Var E:Etud); Begin TextColor(White); With E, Date_Nais Do Begin Gotoxy(26,7); Clreol; ENS – Rabat – Département d’Informatique
gotoxy(26,7);clreol();cprintf(e.nom); gotoxy(29,9);clreol();cprintf(e.prn); gotoxy(28,11);clreol();cprintf(e.cin); gotoxy(40,13);clreol();cprintf("%d/%d/ %d",e.date_naiss.j,e.date_naiss.m,e.date_naiss.a); } void saisietout() { char rep; affich_formul("S A I S I E"); do { saisie(&tetud[te++]); textcolor(YELLOW); gotoxy(45,17); cprintf("Voulez-vous continuez (O/N)?"); fflush(stdin); rep=getchar(); gotoxy(45,17); clreol(); } while((rep!='n') && (rep!='N')); } void affichtout() { char rep; int i; 132
Solutions des exercices
Write(Nom); Gotoxy(29,9); Clreol; Write(Prn); Gotoxy(28,11); Clreol; Write(CIN); Gotoxy(40,13); Clreol;
affich_formul("C O N S U L T A T I O N"); for(i=0;i
Write(J,'/',M,'/',A); End; End; } Procedure Affichtout; Var E:Etud; Rep:Char; I:Integer; Begin Affich_formul('C O N S U L T A T I O N'); For i:=1 To Te Do Begin Affich(TEtud[I]); TextColor(Yellow); Gotoxy(45,17); Write('Taper une touche pour continuer'); ENS – Rabat – Département d’Informatique
main() {etud e; saisietout(); affichtout(); clrscr(); getch(); }
133
Solutions des exercices
Rep:=readkey; Gotoxy(45,17); Clreol; End; End; BEGIN saisietout; Affichtout; ClrScr; Readln; END. Exercice 76
Ecrire les procédures qui donnent le calcul sur les nombres complexes au moyen d’un type enregistrement. type complexe=Record typedef struct{ a,b:real; float a; end; float b; }complexe; procedure zsomme(z1,z2:complexe;var z : complexe); begin void Zsomme(complexe z1,complexe z2,complexe *z) z.a:=z1.a+z2.a; {z->a=z1.a+z2.a; z.b:=z1.b+z2.b; z->b=z1.b+z2.b; end; } procedure zmoins(z1,z2:complexe;var z : complexe); begin z.a:=z1.a-z2.a; ENS – Rabat – Département d’Informatique
void Zmoins(complexe z1,complexe z2,complexe *z) {z->a=z1.a-z2.a; z->b=z1.b-z2.b; 134
Solutions des exercices
z.b:=z1.b-z2.b; end;
}
procedure zmul(z1,z2 : complexe; var z:complexe); begin z.a:=z1.b*z2.b-z1.a*z2.a; z.b:=z1.a*z2.b+z2.b*z2.a; end;
void Zmul(complexe z1,complexe z2,complexe *z) {z->a=z1.b*z2.b-z1.a*z2.a; z->b=z1.a*z2.b+z2.b*z2.a; }
Les listes chaînées
1. Les listes listes simples simples:: type liste=^element; element=record info:integer; suivant:liste; end;
typedef struct str{ int info; str*suivant; }*liste;
Exercice 77
Ecrire une procédure qui permet la création en file d’une liste chaînée procedure creation_file(var tete:liste); void creer_file(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; ENS – Rabat – Département d’Informatique
135
Solutions des exercices
while x<>0 do begin p^.info:=x; p^.suivant:=nil; if tete=nil then tete:=p else begin q:=tete; while q^.suivant<>nil do q:=q^.suivant; q^.suivant:=p; end; new(p); readln(x); end; end;
}
p->suivant=NULL; if(L==NULL) L=p; else{ liste q=L; while(q->suivant!=NULL) q=q->suivant; q->suivant=p; } scanf("%d",&x); }
Exercice 78
Ecrire une procédure qui permet la création en pile d’une liste chaînée procedure creation_pile(var tete:liste); void creer_pile(liste &L) var p: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)); ENS – Rabat – Département d’Informatique
136
Solutions des exercices
tete:=nil; while x<>0 do begin p^.info:=x; p^.suivant:=tete; tete:=p; new(p); readln(x); end; end;
p->info=x; p->suivant=NULL; if(L==NULL) L=p; else{ p->suivant=L; L=p; } scanf("%d",&x); } }
Exercice 79
Ecrire une procédure qui recherche un élément dans une liste chaînée function rechercher (tete:liste;x:integer) :liste; liste rechercher(liste L,int x) var p:liste; { begin if(L!=NULL){ if tete=nil then recherche:=nil if(L->info==x) return L; else if tete^.info=x then recherche:=tete else return(rechercher(L->suivant,x)); else recherche:=recherche(tete^.suivant,x); } end; else return NULL; } procedure rech_elt (tete:liste;x:integer; var pred:liste;var pos:liste); void recherch_elt(liste L,int x,liste &pos,liste &pred) begin { if tete=nil then if(L!=NULL){ begin if(L->info==x){ pos:=nil; pos=L; ENS – Rabat – Département d’Informatique
137
Solutions des exercices
pred:=nil; end else if tete^.info=x then begin pos:=tete; pred:=nil; end else begin p:=tete; while (p^.suivant<>nil) and (p^.info<>x) do begin pred:=p; p:=p^.suivant; end; if p^.info=x then pos:=p else pos:=nil; end; end;
pred=NULL; } else{ liste p=L; while((p->suivant! = NULL)&&(p->info!=x)) {
pred=p; p=p->suivant;
}
} if(p->info==x) pos=p; else pos=NULL; }
}
Exercice 80
Ecrire une procédure qui insert un élément dans une liste chaînée procedure inserer(var tete:liste;x:integer;position:liste); void inserer(liste &L,liste pos,int x) var p,q:liste; { begin liste p; new(q); p=(liste)malloc(sizeof(str)); q^.info:=x; p->info=x; ENS – Rabat – Département d’Informatique
138
Solutions des exercices
q^.suivant:=nil; if position=tete then begin q^.suivant:=tete; tete:=q; end else begin q^.suivant:=position; p:=tete; while p^.suivant<>position do p:=p^.suivant; p^.suivant:=q; end; end; procedure insere(var tete:liste;x:integer;position:liste;pred:liste); var q:liste; begin new(q); q^.info:=x; q^.suivant:=nil; if position=tete then begin ENS – Rabat – Département d’Informatique
p->suivant=NULL; if(L!=NULL){ if(pos==L){ p->suivant=L; L=p; } else{ liste q=L; while(q->suivant!=pos) q=q->suivant; p->suivant=pos; q->suivant=p; } } }
void insere(liste &L,liste pos,liste pred,int x) { liste p; p=(liste)malloc(sizeof(str)); p->info=x; p->suivant=NULL; 139
Solutions des exercices
q^.suivant:=tete; tete:=q; end else begin q^.suivant:=position; pred^.suivant:=q; end; end;
if(L!=NULL){ if(pos==L){ p->suivant=L; L=p; } else{ p->suivant=pos; pred->suivant=p; } } }
Exercice 81
Ecrire une procédure qui élimine un élément d’une liste chaînée procedure eliminer(var tete:liste;x:integer); void supprimer(liste &L,int x) var trouve:boolean; { q,p:liste; int trouve =1; begin liste p,q; p:=tete; p=L; trouve:=false; q=L; while(not trouve)and(p<>nil) do while((trouve)&&(p!=NULL)){ begin if(p->info==x) trouve=0; if p^.info=x then trouve:=true else { else q=p; begin p=p->suivant; q:=p; } p:=p^.suivant; } ENS – Rabat – Département d’Informatique
140
Solutions des exercices
end; end; if trouve then if p=tete then tete:=p^.suivant else q^.suivant:=p^.suivant; dispose(p); end; procedure elimine(var tete:liste;pos:liste;pred:liste); begin if pos=tete then tete:=pos^.suivant else pred^.suivant:=pos^.suivant; dispose(pos); end; procedure afficher_liste(tete:liste); var p:liste; begin p:=tete; while p<>nil do begin writeln('- ',p^.info); p:=p^.suivant; end; end; ENS – Rabat – Département d’Informatique
if(trouve==0){ if(p==L) L=p->suivant; q->suivant=p->suivant; free(p); } } void supprime(liste &L,liste pos,liste pred) { if(pos==L) L=pos->suivant; else pred->suivant =pos->suivant; free(pos); } void afficher(liste L) { liste p=L; printf("\n la liste est:\n"); while(p!=NULL){ printf("\n%d",p->info); p=p->suivant; } }
141
Solutions des exercices
Exercice 82
Ecrire une procédure qui empile un élément dans une pile représentée par une liste chaînée procedure empiler(var tete:liste;x:integer); void empiler(liste &L,int x) var p:liste; { begin new(p); liste p=(liste)malloc(sizeof(str)); p^.info:=x; p->info=x; p^.suivant:=tete; p->suivant=L; tete:=p; L=p; end; } Exercice 83
Ecrire une procédure qui désempile un élément dans une pile représentée par une liste chaînée procedure desempiler(var tete:liste); void desempiler(liste &L) begin { if tete<>nil then liste p; begin p=L; p:=tete; L=p->suivant; tete:=tete^.suivant; free(p); dispose(p); } end; end; 2. les listes listes double doublement ment chain chainées ées type liste=^element; typedef struct str{ element=record int info; info:integer; str*suivant; suivant,precedent:liste; str*pred; ENS – Rabat – Département d’Informatique
142
Solutions des exercices
e nd ;
}*liste;
Exercice 84
Ecrire une procédure qui permet la création d’une liste doublement chaînée procedure creation(var tete:liste;var Queue:liste); void creation(liste &L,liste &Qu) var p,q:liste; { x:integer; int x; begin printf("entrer des entiers (0 pour terminer):"); new(p); scanf("%d",&x); write('donner des entiers (0 pour terminer) : '); while(x!=0){ readln(x); liste p=(liste)malloc (sizeof(str)); tete:=nil; p->info=x; while x<>0 do p->suivant=NULL; begin Qu=p; p^.info:=x; if(L==NULL){ p^.suivant:=nil; p->pred=NULL; Queue:=p; L=p; if tete=nil then } begin else{ p^.precedent:=nil; liste q=L; tete:=p while(q->suivant!=NULL) q=qend >suivant; else q->suivant=p; begin p->pred=q; q:=tete; } while q^.suivant<>nil do scanf("%d",&x); ENS – Rabat – Département d’Informatique
143
Solutions des exercices
q:=q^.suivant; q^.suivant:=p; p^.precedent:=q; end; new(p); readln(x); end; end;
} }
Exercice 85
Ecrire une procédure qui recherche un élément dans une liste doublement chaînée function rechercher(tete:liste;x:integer) :liste; liste rechercher(liste L,int x) var p:liste; { begin if(L!=NULL){ if tete=nil then recherche:=nil if(L->info==x) return L; else if tete^.info=x then recherche:=tete else return(rechercher(L->suivant,x)); else recherche:=recherche(tete^.suivant,x); } end; else return NULL; } function rechercher (tete:liste; Queue:liste;x:integer):liste; begin liste rechercher(liste L,liste Qu,int x) if tete=nil then rech:=nil { else if tete^.info=x then rech:=tete if(L->pred!=Qu){ else if Queue^.info=x then rech:=Queue if(L->info==x) return L; else rech:=rech(tete^.suivant,Queue^.precedent,x); else if(Qu->info==x) return Qu; end; else return(rechercher(L->suivant , Qu ENS – Rabat – Département d’Informatique
144
Solutions des exercices
>pred,x)); } else return NULL; } Exercice 86
Ecrire une procédure qui insert un élément dans une liste doublement chaînée procedure inserer(var tete:liste;x:integer;position:liste); void inserer(liste&L,int x,liste pos) var p,q:liste; { begin liste p=(liste)malloc(sizeof(str)); new(q); p->info=x; q^.info:=x; if(L!=NULL){ q^.suivant:=nil; if(pos==L){ if position=tete then begin p->pred=NULL; q^.precedent:=tete^.precedent; p->suivant=L; q^.suivant:=tete; L->pred=p; position^.precedent:=p; L=p; tete:=q; } end else{ else if position=nil then p->suivant=pos; begin p->pred=pos->pred; p:=tete; pos->pred->suivant=p; while p^.suivant<>nil do pos->pred=p; p:=p^.suivant; } ENS – Rabat – Département d’Informatique
145
Solutions des exercices
p^.suivant:=q; q^.precedent:=p; end else begin q^.suivant:=position; q^.precedent:=position^.precedent; position^.precedent^.suivant:=q; position^.precedent:=q; end; end;
} }
Exercice 87
Ecrire une procédure qui élimine un élément d’une liste doublement chaînée procedure eliminer(var tete:liste;position:liste); void supprimer(liste &L,liste pos) var q,p:liste; { begin if(L!=NULL){ if position=tete then if(pos==L){ begin pos->suivant->pred=NULL; position^.suivant^.precedent:=nil; L=pos->suivant; tete:=position^.suivant; free(pos); end } else if position^.suivant=nil then else if(pos->suivant==NULL){ position^.precedent^.suivant:=nil pos->pred->suivant=NULL; else free(pos); begin } ENS – Rabat – Département d’Informatique
146
Solutions des exercices
position^.precedent^.suivant:=position^.sui vant; cedent;
position^.suivant^.precedent:=position^.pre
end; dispose(position); end; 2. Les listes circulaires: type liste=^element; element=record info:integer; suivant:liste; end; var l,p:liste;
}
else{ pos->pred->suivant=pos->suivant; pos->suivant->pred=pos->pred; free(pos); } }
typedef struct str{ int info; str*suivant; }*liste;
Exercice 88
Ecrire une procédure qui permet la création d’une liste chaînée 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; ENS – Rabat – Département d’Informatique
147
Solutions des exercices
begin p^.info:=x; if tete=nil then tete:=p else begin q:=tete; while q^.suivant<>tete do q:=q^.suivant; q^.suivant:=p; end; p^.suivant:=tete; new(p); readln(x); end; end;
else{ liste q=L; while(q->suivant!=L) q=q->suivant; q->suivant=p; } p->suivant=L; scanf("%d",&x); } }
Exercice 89
Ecrire une fonction qui recherche un élément dans une liste chaînée circulaire function recherche(tete:liste; x:integer) :liste; liste rechercher(liste L,int x) var p:liste; { begin if(L!=NULL){ if tete<>nil then liste p=L; begin do{ p:=tete; if(p->info==x) while (p^.suivant<>tete) and (p^.info<>x) do p=p->suivant; ENS – Rabat – Département d’Informatique
return p; p;
148
Solutions des exercices
p:=p^.suivant; if p^.info=x then recherche:=p else recherche:=nil; end; end;
}while(p!=L); return NULL; } return NULL; }
Exercice 90
Ecrire une procédure qui insert un élément dans une liste chaînée circulaire procedure inserer(var tete:liste;x:integer;position:liste); void inserer(liste &L,liste pos,int x) var p,q:liste; { begin liste q; if tete<>nil then liste p=(liste)malloc(sizeof(str)); begin p->info=x; new(q); if(L!=NULL){ q^.info:=x; if(pos==L){ if position=tete then q=L; begin p->suivant=L; p:=tete; while p^.suivant<>tete do while(q->suivant!=L) q=q->suivant; p:=p^.suivant; q->suivant=p; p^.suivant:=q; L=p; q^.suivant:=tete; } tete:=q; else if(pos==NULL){ end q=L; else if position=nil then while(q->suivant!=L) q=q->suivant; begin q->suivant=p; ENS – Rabat – Département d’Informatique
149
Solutions des exercices
p:=tete; while p^.suivant<>tete do p:=p^.suivant; p^.suivant:=q; q^.suivant:=tete; end else begin q^.suivant:=position; p:=tete; while p^.suivant<>position do p:=p^.suivant; p^.suivant:=q; end; end; end;
p->suivant=L; } else{ >suivant;
}
q=L; while(q->suivant!=pos) q=qq->suivant=p; p->suivant=pos;
}
}
Exercice 91
Ecrire une procédure qui élimine un élément d’une liste chaînée circulaire procedure eliminer(var tete:liste;position:liste); void supprimer(liste &L,liste pos) var q,p:liste; { begin liste p; if tete<>nil then if(L!=NULL){ begin if(pos==L){ if position=tete then p=L; begin while(p->suivant!=L) p=p->suivant; p:=tete; p->suivant=pos->suivant; while p^.suivant<>tete do p:=p^.suivant; L=pos->suivant; ENS – Rabat – Département d’Informatique
150
Solutions des exercices
p^.suivant:=tete^.suivant; tete:=tete^.suivant; dispose(position); end else begin p:=tete; while p<>position do begin q:=p; p:=p^.suivant; end; q^.suivant:=position^.suivant; dispose(position); end; end; end;
free(pos); } else{ >suivant;
}
p=L; while(p->suivant!=pos) p=p p->suivant=pos->suivant; free(pos);
}
}
Exercice 92
Un paragraphe est une suite de phrases. Une phrase est une suite de mots qui se termine par un point(‘.’). deux mots sont séparés par un blanc(‘ ’). Dans cet exercice on représentera un paragraphe par une liste chainée, et aussi une phrase par une liste chainnée. 1- Ecrire une une procédure procédure qui qui permet la création création d’une d’une telle telle représentatio représentation. n. 2- Ecrire une une procédure procédure qui permet la recherche recherche de la première première occurrence occurrence d’un d’un mot dans le paragraph paragraphe. e. Le résultat de la recherche donne la position de ce mot. 3- Ecrire une une procédure procédure qui permet l’inserti l’insertion on d’un mot M1 après après un mot M2 donnée. donnée. Si le mot ne se trouve trouve pas dans le paragraphe, on ne fait pas d’insertion.
ENS – Rabat – Département d’Informatique
151
Solutions des exercices
4- Ecrire une une procédure procédure qui qui permet l’éliminat l’élimination ion d’un d’un mot M1 du paragra paragraphe. phe. 5- Ecrire une une fonction qui qui permet la recherche recherche d’une d’une phrase, phrase, donnée par son son premier mot, mot, dans le paragraphe le résultat de la recherche donne la position de cette phrase dans le paragraphe. 6- Ecrire une une procédure procédure qui permet l’inserti l’insertion on d’une phrase phrase ph1 après après une phrase phrase ph2 donnée. donnée. Si la phrase ph2 ne se trouve pas dans le paragraphe, on insert ph1 à la findu paragraphe. 7- Ecrire une une procédure procédure qui permet l’éliminat l’élimination ion d’une d’une phrase ph1 du paragrap paragraphe. he. PROGRAM paragraphe; #include #include type ligne=^element; #include element=record #include 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,".")){ ENS – Rabat – Département d’Informatique
152
Solutions des exercices
writeln('entrer une suite de mots (point"." pour terminer):'); readln(mot); while mot<>'.' do begin p^.info:=mot; p^.suivant:=nil; if L=nil then L:=p else begin q:=L; while q^.suivant<>nil do q:=q^.suivant; q^.suivant:=p; end; readln(mot); new(p); end; end; procedure afficher_ligne(L:ligne); var p:ligne; begin if L<>nil then begin p:=L; ENS – Rabat – Département d’Informatique
int n=strlen(mot) ; //printf("__%d",n); ligne p=(ligne)malloc(sizeof(str1)); //p->info=(char*)malloc(sizeof(char)*n); strcpy(p->info,mot); p->info[n]='\0'; p->suivant=NULL; if(L==NULL) L=p; else{ ligne q=L; while(q->suivant!=NULL) q=q>suivant;
}
q->suivant=p; } //free(p->info); scanf("%s",mot);
} void afficher_ligne(ligne L) { ligne p=L; while(p->suivant!=NULL){ // strcat(p->info," "); printf("%s ",p->info); p=p->suivant; 153
Solutions des exercices
while p^.suivant<>nil do begin write(p^.info,' ' ); p:=p^.suivant; end; write(p^.info,'.'); end; end; procedure creation_paragraphe(var Pa:para); var p,q:para; L:ligne; rep:string; begin repeat L:=nil; creation_ligne(L); new(p); p^.line:=L; p^.suivant:=nil; if Pa=nil then Pa:=p else begin q:=Pa; while q^.suivant<>nil do q:=q^.suivant; q^.suivant:=p; ENS – Rabat – Département d’Informatique
} printf("%s.",p->info); } void creer_paragraphe(para&Pa) { para p,q; ligne L; char rep; do{ L=NULL; creer_ligne(L); p=(para)malloc(sizeof(str1)); p->line=L; p->suivant=NULL; if (Pa==NULL) Pa=p; else{ q=Pa; while(q->suivant!=NULL) q=q>suivant; q->suivant=p; } getchar(); printf("voulez vous continuer(o/n)? "); scanf("%c",&rep); }while(rep=='o'); 154
Solutions des exercices
end; write('voulez vous continuer?(oui/non) ');readln(rep); until (rep='non'); end; procedure afficher_paragraphe(Pa:para); var p:para; begin if Pa<>nil then begin p:=Pa;
} void afficher_paragraphe(para Pa) { para p=Pa; while(p!=NULL){ afficher_ligne(p->line); p=p->suivant; } }
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; ENS – Rabat – Département d’Informatique
155
Solutions des exercices
trouve:boolean; begin trouve:=false; if Pa<>nil then begin q:=Pa; while (q<>nil)and(not trouve) do begin r:=q^.line; while(r<>nil)and(not trouve) do begin if r^.info = mot then begin l:=r; p:=q; trouve:=true; end else r:=r^.suivant; end; q:=q^.suivant; end; end; end; procedure inserer(Pa:para;M1,M2:string); ENS – Rabat – Département d’Informatique
} } void inserer(para Pa,char*M1,char*M2) { ligne q,r,l; para p; if(p!=NULL){ r=(ligne)malloc(sizeof(str1)); strcpy(r->info,M2); r->suivant=NULL; chercher(Pa,M1,p,q); l=p->line; l=q; r->suivant=l->suivant; l->suivant=r; } } void supprimer(para &Pa,char*mot) { ligne l,q; para p; if(Pa!=NULL){ chercher(Pa,mot,p,q); if(q==p->line){ 156
Solutions des exercices
var q,r,l:ligne; p:para; begin if p<>nil then begin new(r); r^.info:=M2; r^.suivant:=nil; rechercher(Pa,M1,p,q); l:=p^.line; l:=q; r^.suivant:=l^.suivant; l^.suivant:=r; end; end; procedure supprimer(var Pa:para;M1:string); var p:para; q,l:ligne; begin if Pa<>nil then begin rechercher(Pa,M1,p,q); if q=p^.line then p^.line:=q^.suivant else ENS – Rabat – Département d’Informatique
} else{
}
p->line=q->suivant; free(q); l=p->line; while(l->suivant!=q) l=l->suivant; l->suivant=q->suivant; free(q);
} } para rechercher_phrase(para Pa,char*M1) { para p; ligne q; p=Pa; if(Pa!=NULL){ while(p!=NULL){ q=p->line; if(!strcmp(q->info,M1)) return(p); p=p->suivant; } return NULL; 157
Solutions des exercices
begin l:=p^.line; while l^.suivant<>q do l:=l^.suivant; l^.suivant:=q^.suivant; end; dispose(q); end; end; function rechercher_phrase(Pa:para;M1:string):para; var p:para; q:ligne; trouve:boolean; begin p:=Pa; trouve:=false; if p<>nil then begin while(p<>nil) and (not trouve)do begin if(p^.line^.info=M1) then begin rechercher_phrase:=p; trouve:=true; end ENS – Rabat – Département d’Informatique
} return NULL; } void inserer_phrase(para Pa,ligne l,char*M1) { para p,q,r; if(Pa!=NULL){ q=(para)malloc(sizeof(str2)); q->line=l; q->suivant=NULL; p=rechercher_phrase(Pa,M1); if(p!=NULL){ q->suivant=p->suivant; p->suivant=q; } else{ r=Pa; while(r->suivant!=NULL) r=r>suivant; r->suivant=q; } } } void supprimer_phrase(para&Pa,ligne l) 158
Solutions des exercices
else p:=p^.suivant; end; end; end; procedure inserer_phrase ( Pa:para ; l:ligne ; M1:string); var p,q,r:para; begin if Pa<>nil then begin new(q); q^.line:=l; q^.suivant:=nil; p:=rechercher_phrase(Pa,M1); if p<>nil then begin q^.suivant:=p^.suivant; p^.suivant:=q; end else begin r:=Pa; while r^.suivant<>nil do r:=r^.suivant; r^.suivant:=q; ENS – Rabat – Département d’Informatique
{ para p,q,m; ligne r; p=rechercher_phrase(Pa,l->info); if(p==Pa){ Pa=p->suivant; free(p); } else{ q=Pa; while((q!=NULL)&&(q->line!=p->line)){ m=q; q=q->suivant; } if(q!=NULL){ m->suivant=q->suivant; free(p); } } }
159
Solutions des exercices
end; end; end; procedure supprimer_phrase(var Pa:para;l:ligne); 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; element=record cle:integer; g:Noeud; ENS – Rabat – Département d’Informatique
typedef struct str{ int cle; str*g,*d; }*Noeud; 160
Solutions des exercices
d:Noeud; end; Exercice 93
Ecrire la procédure du parcours d’un arbre binaire en préordre. procedure preordre(A:Noeud); void preordre(Noeud A) begin { if A<>nil then if(A!=NULL){ begin printf("%d ",A->cle); write(A^.cle,' '); preordre(A->g); preordre(A^.g); preordre(A->d); preordre(A^.d); } end; } end; Exercice 94
Ecrire la procédure du parcours d’un arbre binaire en postordre. procedure postordre(A:Noeud); void postordre(Noeud A) begin { if A<>nil then if(A!=NULL){ begin postordre(A->g); postordre(A^.g); postordre(A->d); postordre(A^.d); printf("%d ",A->cle); write(A^.cle,' '); } end; } end; Exercice 95
Ecrire la procédure du parcours d’un arbre binaire en ordre. ENS – Rabat – Département d’Informatique
161
Solutions des exercices
procedure ordre(A:Noeud); begin if A<>nil then begin ordre(A^.g); write(A^.cle,' '); ordre(A^.d); end; end;
void ordre(Noeud A) { if(A!=NULL){ ordre(A->g); printf("%d ",A->cle); ordre(A->d); } }
Exercice 96
Ecrire une fonction qui recherche un élément dans un arbre ordonné horizontalement function recherche(A:Noeud;x:integer):Noeud; Noeud recherche(Noeud A,int x) begin { if A<>nil then if(A!=NULL){ begin if(A->cle==x) return A; if A^.cle=x then recherche:=A else{ else if A^.cle>x then if(A->cle>x) return(recherche(Arecherche:=recherche(A^.g,x) >g,x)); else recherche:=recherche(A^.d,x); else return(recherche(A->d,x)); end } else recherche:=nil; } end; else return NULL; } Exercice 97 ENS – Rabat – Département d’Informatique
162
Solutions des exercices
Ecrire une procédure qui insert un élément dans un arbre ordonné horizontalement procedure insertion(var A:Noeud;x:integer); void insertion(Noeud &A,int x) var N:Noeud; { begin Noeud p=(Noeud)malloc(sizeof(str)); new(N); p->cle=x; N^.cle:=x; p->g=NULL; N^.g:=nil; p->d=NULL; N^.d:=nil; if (A==NULL) A=p; if A=nil then A:=N else{ else if(A->cle>x) insertion(A->g,x); begin else insertion(A->d,x); if x
Ecrire une procédure qui supprime un élément dans un arbre ordonné horizontalement procedure suppression(var A:Noeud;x:integer); void suppression(Noeud &A,int x) var pt,pd,pg:Noeud; { begin Noeud pt,pg,pd; if A<>NIL then if(A!=NULL){ begin if(A->cle==x){ if A^.cle=x then pt=A->d; begin if (pt!=NULL){ pt:=A^.d; while(pt!=NULL){ ENS – Rabat – Département d’Informatique
163
Solutions des exercices
if pt<>nil then begin while pt<>nil do begin pg:=pt; pt:=pt^.g; end; pg^.g:=A^.g; A:=A^.d; end else A:=A^.g; end else if x=A^.g^.cle then begin pt:=A^.g^.d; if pt<>nil then begin while pt<>nil do begin pg:=pt; pt:=pt^.g; end; pg^.g:=A^.g^.d; A^.g:=A^.g^.d; end ENS – Rabat – Département d’Informatique
pg=pt; pt=pt->g; } pg->g=A->g; A=A->d; } else A=A->g; } else if(x==A->g->cle){ pt=A->g->d; if(pt!=NULL){ while(pt!=NULL){ pg=pt; pt=pt->g; } pg->g=A->g->d; A->g=A->g->d; } else A->g=A->g->g; } else if(x==A->d->cle){ pt=A->d->g; if(pt!=NULL){ while(pt!=NULL){ pd=pt; pt=pt->d; 164
Solutions des exercices
else A^.g:=A^.g^.g; end else if x=A^.d^.cle then begin pt:=A^.d^.g; if pt<>nil then begin while pt<>nil do 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
} pd->d=A->d->d; A->d=A->d->g;
} else A->d=A->d->d; } else{ }
if(xcle) suppression(A->g,x); else suppression(A->d,x);
} }
Les Fichiers Exercice 99
Ecrire un programme qui permet de créer un fichier d’étudiants. ENS – Rabat – Département d’Informatique
165
Solutions des exercices
Program gest_fich; uses crt; Type Date=record J,M,A:Integer; end; etud=record Nom,Prn:string[20]; CIN:string[10]; Date_Nais:Date; End; Var FEtud:File of etud; Procedure Affich_formul(Titre:String); Begin TextBackground(Blue); ClrScr; TextColor(Yellow); Gotoxy(35,4); Write(Titre); Gotoxy(20,7); Write('Nom :'); Gotoxy(20,9); Write('Pr‚nom :'); Gotoxy(20,11); Write('C.I.N :'); Gotoxy(20,13); ENS – Rabat – Département d’Informatique
#include #include #include #include typedef struct{ int J,M,A; }date; typedef struct{ char nom[20]; char prn[20]; char cin[10]; date date_nais; }etudiant; void affich_formul(char *titre) { textbackground(BLUE); clrscr(); textcolor(YELLOW); gotoxy(35,4); cprintf("%s",titre); gotoxy(20,7); cprintf("Nom :"); gotoxy(20,9); cprintf("Prenom :"); gotoxy(20,11); 166
Solutions des exercices
Write('Date de Naissance :'); End; Procedure saisie(Var E:Etud); Begin TextColor(White); With E, Date_Nais Do Begin Gotoxy(26,7); Clreol; Readln(Nom); Gotoxy(29,9); Clreol; Readln(Prn); Gotoxy(28,11); Clreol; Readln(CIN); Gotoxy(40,13); Clreol; Readln(J); Gotoxy(42,13); Write('/'); Readln(M); Gotoxy(45,13); Write('/'); Readln(A); ENS – Rabat – Département d’Informatique
}
cprintf("C.I.N :"); gotoxy(20,13); cprintf("Date de naissance :");
void saisie(etudiant &E) { textcolor(WHITE); gotoxy(26,7); clreol(); scanf("%s",E.nom); gotoxy(29,9); clreol(); scanf("%s",E.prn); gotoxy(28,11); clreol(); scanf("%s",E.cin); gotoxy(40,13); clreol(); scanf("%d",&E.date_nais.J); gotoxy(42,13); clreol(); cprintf("/"); scanf("%d",&E.date_nais.M); gotoxy(45,13); cprintf("/"); 167
Solutions des exercices
End; End; Procedure Ajout; Var E:Etud; Rep:Char; Begin Assign(Fetud,'C:\Gestion'); {$I-} Reset(Fetud); {$I+} If IOResult<>0 Then Rewrite(Fetud) Else Seek(Fetud,FileSize(Fetud)); Affich_formul('S A I S I E'); Repeat Saisie(E); Write(Fetud,E); TextColor(Yellow); Gotoxy(45,17); Write('Voulez-vous continuez (O/N)?'); Rep:=readkey; Gotoxy(45,17); Clreol; Until Rep In ['N', 'n']; Close(Fetud); End; ENS – Rabat – Département d’Informatique
clreol(); scanf("%d",&E.date_nais.A); } void ajout() { etudiant E; int rep; FILE*Fetud=fopen("Gestion","ab"); affich_formul("SAISIE"); do{ saisie(E); fwrite(&E,sizeof(etudiant),1,Fetud); textcolor(YELLOW); gotoxy(45,17); cprintf("voulez_vous continuez(o/n)?"); clreol(); flushall(); rep=getchar(); }while(rep=='o' || rep=='O'); fclose(Fetud); } void affich(etudiant &E) { textcolor(WHITE); gotoxy(26,7); 168
Solutions des exercices
Procedure Affich(Var E:Etud); Begin TextColor(White); With E, Date_Nais Do Begin Gotoxy(26,7); Clreol; Write(Nom); Gotoxy(29,9); Clreol; Write(Prn); Gotoxy(28,11); Clreol; Write(CIN); Gotoxy(40,13); Clreol; Write(J,'/',M,'/',A); End; End; Procedure Affichtout; Var E:Etud; Rep:Char; I:Integer; Begin ENS – Rabat – Département d’Informatique
clreol(); cprintf("%s",E.nom); gotoxy(29,9); clreol(); cprintf("%s",E.prn); gotoxy(28,11); clreol(); cprintf("%s",E.cin); gotoxy(40,13); clreol(); cprintf("%d/%d/%d",E.date_nais.J, E.date_nais.M,E.date_nais.A); } void affichtout() { etudiant E; FILE*Fetud=fopen("Gestion","rb"); if (Fetud==NULL) return; affich_formul("CONSULTATION"); do{ fread(&E,sizeof(etudiant),1,Fetud); affich(E); textcolor(YELLOW); gotoxy(45,17); cprintf("Tapez une Entree pour 169
Solutions des exercices
Assign(Fetud,'C:\Gestion'); {$I-} Reset(Fetud); {$I+} If IOResult<>0 Then write('Probleme de lecture !!!!') Else Begin Affich_formul('C O N S U L T A T I O N'); Repeat Read(Fetud,E); Affich(E); TextColor(Yellow); Gotoxy(45,17); Write('Taper une touche pour continuer'); Rep:=readkey; Gotoxy(45,17); Clreol; Until EOF(Fetud); Close(Fetud); End; End; BEGIN Ajout; Affichtout; ClrScr; Readln; ENS – Rabat – Département d’Informatique
continuer"); getch(); gotoxy(45,17); }while(!feof(Fetud)); fclose(Fetud); } void main() { ajout() ; affichtout() ; clrscr() ; getch() ; }
170
Solutions des exercices
END. Exercice 100
Ecrire une procedure qui permet de modifier les informations d’un etudiant Procedure Modif; void modif() Var N: Integer; { E:Etud; int i; Begin char*CIN; Assign(Fetud,'C:\Gestion'); char nom[20],prn[20],cin[10]; {$I-} int J,M,A; Reset(Fetud); etudiant E; {$I+} etudiant *Et; If IOResult<>0 Then write('Probleme de lecture !!!!') FILE*Fetud=fopen("Gestion","rb"); Else FILE*f=fopen("tmptmp.$$","wb"); Begin textcolor(YELLOW); ClrScr; textbackground(BLUE); Write('Donner le numero d''ordre de l''etudiant a clrscr(); modifier'); if(Fetud==NULL) return; readln(N); cprintf("Donnez le C.I.N de l'etudiant a modifier: Seek(Fetud,N-1); "); Read(Fetud,E); scanf("%s",CIN); With E do getch(); Begin i=fread(&E,sizeof(etudiant),1,Fetud); Write('Nom : ',Nom); while((strcmp(E.cin,CIN))&&(i!=0)){ Readln(Nom); fwrite(&E,sizeof(etudiant),1,f); Write('Pr‚nom : ',Prn); i=fread(&E,sizeof(etudiant),1,Fetud); Readln(Prn); } ENS – Rabat – Département d’Informatique
171
Solutions des exercices
Write('C.I.N : ',CIN); Readln(CIN); End; Seek(Fetud,N-1); Write(Fetud,E); Close(Fetud) End; End;
ENS – Rabat – Département d’Informatique
if(!strcmp(E.cin,CIN)){ etudiant *Et=(etudiant*)malloc(sizeof(etudiant)); cprintf("Nom : %s ",E.nom); scanf("%s",nom); strcpy(Et->nom,nom); cprintf("Prenom : %s ",E.prn); 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);
172
Solutions des exercices
}
ENS – Rabat – Département d’Informatique
i=fread(&E,sizeof(etudiant),1,Fetud); } fclose(f); fclose(Fetud); remove("Gestion"); rename("tmptmp.$$","Gestion");
173
Annexe
GESTION DE L’ÉCRAN
Les fonctions de gestion de l’écran sont les mêmes en C et en Pascal. Vous aure aurez, z, en ce qu quii suit suit,, un unee brèv brèvee desc descri ript ptio ionn des des inst instruc ructi tion onss les les plus plus courantes. Remarque :
En C, toutes ces fonctions se trouvent dans la bibliothèque conio.h
I. Notion de fenêtre On peut définir une fenêtre dans un écran. L’écran actif sera réduit à cette fenêtre. WINDOW(x1,y1,x2,y2) WINDOW(x1,y1,x2,y2) où : • x1 et y1 représentent les coordonnées du coin supérieur gauche de la fenêtre. • x2 et y2 représentent les coordonnées du coin inférieur inf érieur droit de la fenêtre.
II. Gestion du curseur •
• •
L’instruction Gotoxy(x,y) positionne le curseur sur le point de coordonnées (x,y) de la fenêtre active. La fonction WhereX retourne la colonne colonne où se trouve trouve le curseur. La fonction WhereY retourne la ligne où se trouve le curseur.
III. Instructions de gestion de l’écran •
•
•
•
ClrScr : efface la fenêtre active et positionne le curseur au point de coordonnées (1,1). ClrEol : efface les caractères se trouvant après la position du curseur jusqu’à la fin de la ligne. DelLine : élimine la ligne pointée par le curseur et déplace toutes les lignes suivantes vers le haut. La dernière ligne devient vide. InsLine : insère une ligne vide à la place du curseur et décale les lignes suivantes vers le bas. La dernière ligne sera perdue.
ENS – Rabat – Département d’Informatique
174
Annexe
IV. Instructions de gestion des couleurs TextColor(couleur) : définit la couleur du texte (16 couleurs codées de 0 à 15). • TextBackGround(couleur) : défint la couleur du fond du texte (8 couleurs codées de 0 à 7). Le tableau suivant présente les 16 couleurs existantes pour l’écriture du texte : •
N°
Couleu r
N° Couleur
N° Couleur
N° Couleur
0 1 2 3
Noir Bleu Vert Cyan
4 5 6 7
8 9 10 11
12 13 14 15
Rouge Magenta Brun Gris clair
ENS – Rabat – Département d’Informatique
Gris foncé Bleu clair Vert clair Cyan clair
Rouge clair Magenta Jaune Blanc
175
Conclusion
CONCLUSION
En
conclu conclusio sion, n, le langag langagee Pascal Pascal reste reste le plus adapté adapté à l’ense l’enseign igneme ement nt d’algorithmique pour les élèves de l’enseignement secondaire ou pour les débutants en algorithmique. Malgré
sa performance parfois supérieure à celle de Pascal, C est plutôt destiné à des utilisateurs avertis (école d’ingénieurs, etc.). Malgré
le nombre très important d’exercices et leur diversité, on pourrait pré prévo voir ir qu quel elqu ques es prob problè lèmes mes de synt synthè hèse se tels tels qu quee les les Tour Tourss de Hano Hanoi, i, problèmes complets de système (gestion de stock, etc.), gestion très poussée de l’écran avec par exemple un menu déroulant, etc. On
pourrait aussi suggérer pour les promotions à venir de compléter les solutions proposées par une analyse du problème consistant à mettre en évidence les données du problème et leurs types, ainsi les principales actions à réaliser pour calculer les données de sortie (résultats) en partant des données d’entrée.
ENS – Rabat – Département d’Informatique
176
Références
RÉFÉRENCES
Programmer en langage C Claude Delanoy .
Turbo Pascal manuel de l’utilisateur version 5.0 .
Algori Algorithm thmiqu iquee : cours cours et exerci exercices ces méthod méthodolo ologiq giques ues corrig corrigés és Guy CHATY & Jean VICARD.
Turbo Pascal et ses fichiers (version 3) : Jacques BOISGONTIER & Christophe DNAY.
Manuel d’Algorithmique réalisé par Mr LAMHARCHI Brahim.
ENS – Rabat – Département d’Informatique
177