0% ont trouvé ce document utile (0 vote)
123 vues7 pages

Exercices d'algorithmique et de programmation

L'exercice présente 8 exercices sur les sous-programmes, enregistrements et fichiers en algorithmique. Les exercices proposent des problèmes variés sur la manipulation de données structurées.

Transféré par

Iddir Yuder
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
123 vues7 pages

Exercices d'algorithmique et de programmation

L'exercice présente 8 exercices sur les sous-programmes, enregistrements et fichiers en algorithmique. Les exercices proposent des problèmes variés sur la manipulation de données structurées.

Transféré par

Iddir Yuder
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

M.

OUNNACI — Algorithmique — Math-info — UMMTO — 2018/2019

T.D n°5
Sous-programmes, Enregistrements Et Fichiers.

Exercice 1
Ecrire les actions paramétrées (procédure ou fonction) permettant de résoudre les problèmes suivants :
1- Calcul de la somme de deux nombres entiers.
2- Calcul de la factorielle de N (N !).
3- Vérifier si un nombre entier A divise un nombre entier B.
4- Calcul du quotient et du reste de la division entière de deux nombres entiers A et B.
5- Vérifier si un caractère donné est une voyelle (voyelles : 'a', 'e', 'i', 'o', 'u', 'y').
6- Permet de permuter (d’échanger) le contenu de deux variables réelles.
7- Etant donné un entier A, calcule sa valeur absolue.

Exercice 2
Ecrire un programme affichant tous les nombres inférieurs à 500 égaux à la somme des cubes
de leurs chiffres. On utilisera une fonction UNITE, et une fonction CUBE.
Exemple: 153 = 13+ 53+ 33= 1 + 125 + 27

Exercice 3
Ecrire un programme affichant tous les nombres parfaits inférieurs à 10000. Sachant qu’un
nombre entier positif (N) est parfait s'il est égal à la somme de ses diviseurs (<N). On écrira
une fonction booléenne, appelée PARFAIT, pour vérifier si le nombre est parfait ou non
parfait. Exemples: 6 qui est égal à 1+2+3 et 28 qui est égal à 1+2+4+7+14 sont des nombres
parfaits.

Exercice 4
Une société veut informatiser la gestion de ses employés. Elle détient pour chacun les informations
suivantes : matricule, nom, salaire, et un état civil. Sachant que le nombre d’employés est N avec
10≤𝑁≤ 50. Ecrivez un programme modulaire nommé Entreprise, qui permet la saisie de toutes les
fiches de renseignements des employés puis d’afficher le nombre d’employés dont le salaire est
compris entre 15000 et 70000 DA.

Exercice 5
Dans cet exercice nous avons un tableau d’enregistrements, où chaque enregistrement qui contient : le
N° d’une phrase, la phrase elle-même et un tableau de 26 cases dont chaque case contient la fréquence
d’apparition de chaque lettre de l’alphabet. (La 1ère case concerne le ‘A’, la 2ième le ‘B’,…). Le
problème consiste donc à donner un N° à la phrase puis à lire la phrase elle-même. Puis on calculera la
fréquence d’apparition de chaque lettre de l’alphabet que l’on rangera dans un tableau. Lequel sera mis
à son tour dans l’enregistrement. On affiche ensuite le N° et le tableau des fréquences qui se trouvent
dans chaque enregistrement.

Exercice 6
Nous avons au plus 500 étudiants et pour chaque étudiant nous voulons avoir les informations
suivantes : matricule, le nom et prénom, la section, le groupe, les notes de ses 3 EMD, de ses 3 TP, de
son projet, sa moyenne. Il faut donc déclarer la structure convenable pour ce problème. Puis construire
2 modules : le premier (INFOGENE) qui permet de rentrer toutes les informations concernant un
étudiant et toutes ses notes en algorithmique et le second (MOYALGO) qui calcule sa moyenne.
Exercice 7
Considérons un enregistrement avec les champs suivant, Matricule : entier; Nom, Prenom : chaine
[20] ; Moyenne : réel ;

Soit T un tableau d’au plus 100 étudiants. Ecrire un programme permettant de recopier tous les
étudiants admis appartenant à T dans un fichier ADMIS de type étudiant. Un étudiant est admis si sa
moyenne est supérieure ou égale 10.

Exercice 8
 Soient les enregistrements suivants :
 TDate : Jour, mois, année : entier ;
 TDiscipline : Discipline : chaine [10] ; Faculté : chaine [20] ;
 TEtudiant : Nom, prenom : chaine [20] ;DateN : TDate ; Filiere : TDiscipline ;

 Soit FEtudiant un fichier d’étudiants.


 Ecrire un programme qui permet de :
 Remplir le fichier FEtudiant.
 Eclater le fichier FEtudiant en deux fichiers, F1 (étudiants de la faculté ‘F’) et F2 (étudiants
des autres facultés).

Exercice 9
1. Ecrire une fonction Premier qui détermine si un entier positif est premier.
2. Ecrire une fonction SPremier qui détermine si un entier positif est semi-premier.(un nombre semi-
premier est un produit de deux nombres premiers non nécessairement distincts.).
3. En utilisant SPremier définie précédemment, écrire un programme qui détermine les nombres
semi-premiers parmi les entiers de la forme (qui s’écrivent de la manière suivante) abcabc où a,b,c
sont des chiffres entre 0 et 9 avec a > 0. Ex : 136136, 524524, 908908, ...
Program entreprise ;
Type
Employe =record
Matricule :string[10] ;
Nom : string[25] ;
Salaire :real ;
Etat_civil : string[15] ; Program Etude ;
End ; Type Etudiant = record
Matricule : integer;
Tab = Array [1..100] of employe ; Nom, Prenom : string[20];
var Moyenne: real;
S,n:integer; end;
T: tab; Var T :array[1..100] of Etudiant;
Procedure Saisir (var a: integer); F : File of Etudiant;
Begin I,N :integer ;
Repeat
writeln ('le nombre d’employés '); Begin
readln(a) ; writeln(‘Donner le nombre d’’étudiants’) ;
until((2<=a ) and (a<=5)); /*lecture des éléments du tableau
end; Repeat
Procedure Remplir (var T : tab; var c : integer) ; Read(N);
var i:integer; Until ( N>0 et N≤100 );
begin
For i := 1 to c do For I :=1 to N do
with T[i] do With T[I] do
begin Begin
writeln ('Matricule : ') ; writeln(‘saisir la matricule’) ;
readln(matricule) ; read(Matricule) ;
writeln ('Nom : '); writeln(‘saisir le nom et le prénom’) ;
readln (nom); read(Nom,Prenom) ;
writeln ('Salaire :'); writeln(‘saisir la moyenne’) ;
readln (salaire); read(Moyenne) ;
writeln ('Etat civil : ') ; End;
readln (etat_civil) ; /*création du fichier des admis
Assigne(F,’c:ADMIS’) ;
end ; Rewrite(F) ;
end ; For I :=1 to N do
Procedure Affiche (var T : tab ; var b : integer) ; If T[I].Moyenne)≥10 Then
var i :integer; Ecrire(F,T[I]);
begin Close(F) ;
S := 0 ; END.
For i := 1 to b do
begin
with t[i] do
begin
if (salaire >=15000) and (salaire <=70000) then
S := S + 1;
End;end ;
writeln ('le nombre d’employés dont le salaire est entre 15000 et 70000 DA est : ', S)

end; PROGRAM SommeCube ;


Begin Var A,B,S :INTEGER ;
saisir (n) ; FUnction Unite(X :integer) :INTEGER ;
Remplir (T, n) ; begin
Affiche (T, n) ; Unite := X mod 10 ;
End. end ;

Function Cube(X :integer) :integer;


begin
Cube := X*X*X ;
end ;

Begin
for A:= 0 to 500 do
Begin
S:=0; B :=A;
Repeat
S:=S + Cube(Unite(B));
B := B div 10;
until (B=0);
if (S=A) then
writeln(A,' est égale à la somme des cubes de ses chiffres') ;
end;
end.
Program enreg;

Type etudiant = RECORD


matricule :String[6];
nom,prenom:string[30];
section:'A'..'D';
sg:1..12;
emd:array[1..3] of real;
tp:array[1..3] of real;
prj , moy:real;
END;
Promo = array[1..500] of etudiant;

Var pli: promo;


Tai ,i: integer;

Procedure INFOGENE (var p:promo; var taille :integer);


BEGIN Program NombreParfait ;
For i:=1 to taille do Var A :integer ;
BEGIN Function Parfait(X :integer) :boolean ;
write('Matricule : '); readln(p[i].matricule); Var I,S :integer ;
write('Nom : '); readln(p[i].nom); begin
write('prenom : '); readln(p[i].prenom); S := 0 ;
write('Section : '); readln(p[i].section); for I := 1 to X div 2 do
write('S/G : '); readln(p[i].sg); if (X mod I = 0 ) then
END; S := S+I ;
END; if (S=X) then
Parfait :=true
Procedure MOYALGO (var p:promo; var taille:integer); else
var i, k: integer; Parfait := False;
sommemd, sommetp:real; end;
BEGIN begin
For i:=1 to taille do for A:= 1 to 10000 do
BEGIN if Parfait(A) then
sommemd:=0; writeln (A,' est parfait') ;
sommetp:=0; END.
writeln ('ETUDIANT :', i);
For k:=1 to 3 do
BEGIN
Write ('Note EMD', k,'? : '); readln(p[i].emd[k]);
sommemd:= sommemd + p[i].emd[k];
END;
For k:=1 to 2 do
BEGIN
write('Note TP',k,'?: ');
readln(p[i].tp[k]);
sommetp:= sommetp + p[i].tp[k];
END;
Write ('Note PROJET ? :');
readln(p[i].prj);
p[i].moy := (sommemd + sommetp + p[i].prj) / 6;
END;
END;

BEGIN
Repeat
writeln(' Donnez le nombre d’’étudiants: ');
readln(tai);
Until ((tai<=500) and (tai >=1));
INFOGENE(pli,tai);
MOYALGO(pli,tai);
For i := 1 to tai do
writeln('nom : ',pli[i].nom,' moyenne :',pli[i].moy:4:2);
END.
Program Nombre ;
Var a,b,c,X,NBDiv :integer ; Pr :boolean ;
Function Premier(X : integer): boolean;
Var I,M:integer;
begin
if X=1 then Premier :=False
else M := X DIV 2 ; I := 2 ; Premier ;= true ;
While (I<=M) and (Premier) do
begin
if X mod I=0 then Premier :=False ;
I:=I+1 ;
end;
End ;
Function SemiPremier(X : integer ): boolean;
Var I,M:entier;
Debut
if Premier(X)
then SemiPremier := False
else M :=X DIV 2 ; I := 2 ;
SemiPremier :=Vrai ;
While (I<=M )and (SemiPremier)
do
If (X MOD I=0)Then
if (Not Premier(I))or(Not Premier(X DIV I))then
SemiPremier :=False;
I :=I+1 ;
End ;
Begin /* trios boucles imbriquées Pour générer un nombre de la forme abcabc
For a :=1 to 9 do
For b := 0 to 9 do
For c :=0 to 9 Faire
X :=1001*(100*a+10*b+c) ;
if SemiPremier(X)then
wrieln(X,’ est semi premier’) ;
Fin.
program enreg;
uses crt;
type
tab=array[1..26] of integer;
P = record
nump:integer;
phrase:string;
tabf:tab
end;
var
j,i, n:integer;
tabl : array [1..10]of p;

procedure Freq_let(chaine:string; var t:tab);


var i, j :integer;
Begin
for i:= 1 to 26 do
begin
T[i]:=0;
for j:=1 to length(chaine) do
if upcase(chaine[j])=chr(i+64) then
t[i]:=T[i]+1;

end;
end;
BEGIN
Clrscr;
repeat
write('SVP ! Donnez le Nombre d''enregistrement : ');
read (n);
until((n>=1) and (n<=10));
for i := 1 to n do
begin
write('SVP ! Donnez le Numero de la phrase de l''enregistrelent ',i,': ');
readln(tabl[i].nump);
writeln('Donnez votre phrase n° ', tabl[i].nump,' : ');
readln(tabl[i].phrase);
FREQ_LET(tabl[i].phrase, tabl[i].tabf );
end;

for i:=1 to n do
begin
writeln('Dans la phrase n° ', tabl[i].nump ,' on a:');
for j:=1 to 26 do
if tabl[i].tabf [j]<> 0 then
writeln(' ', tabl[i].tabf[j], ' fois le caractere : ',chr(64 +j));
end;

END.
Program Eclate ;
Type
TDate = record
Jour, mois, année : byte ;
End;
TDiscipline =record
Discipline : string [10] ;
Faculté : string[20] ;
End;
Etudiant = record
Nom, prenom : string [20] ;
DateN : TDate ;
Filiere : TDiscipline ;
End ;
Var Etudiant :TEtudiant ;
F, F1, F2: file of TEtudiant ;
FEI, Autre: Boolean ;

Begin
Assigne (F,’FEtudiant’) ; Rewrite(F) ;
with Etudiant, [Link], [Link] do
write (‘Nom :’) ; read(Nom) ;
while (Nom<>’’) do
write(‘Prénom :’) ;read(prenom) ;
write(‘Date de naissance :’) ;read Jour,mois,Annee) ;
write(‘Discipline, Faculté :’) ;read(Discipline, Faculté) ;
write(F,Etudiant) ;
write (‘Nom :’) ;read(Nom) ; /*Lire le nom suivant
End;
End;
Close(F) ;
Reset(F) ;
/*Pour éviter de créer des fichiers vides, on peut utiliser ces 2 indicateurs
booléens, dans ce Cas l’assignation et la création ne se font que si nous trouvons un
élément, après on remet le booléen à /*vrai pour ne pas refaire ces opérations
FEI:=Faux ; Autre:=Faux ;

If eof(F) then
write(‘Fichier vide’)
else
while not eof(F)do
read(F,Etudiant) ;
with [Link] do
begin
if Faculté =’FEI’then
if Not (FEI) then
begin
Assigne (F1,’FFEI’) ; Rewrite(F1); FEI :=Vrai;
End ;
write(F1,Etudiant) ;
end
else
begin
if not (Autre) then
begin
Assigner(F2,’FAutrer’); Réecrire(F2); Autre←Vrai ;
end ;
write(F2,Etudiant) ;
end ;
end ;
close(F) ;
if FEI then close(F1);
ifAutre Alors close(F2) ;
end.

Vous aimerez peut-être aussi