annales-pascal

Telechargé par traore issa
Algorithmes et programmation
en Pascal
Facult´e des Sciences de Luminy Edouard Thiel
Annales corrig´ees
Deug 1 Mass MA
Module de 75 heures
Examens de 1998 `a 2003
Sommaire
Juin 1998 – page 3
Exercices : tableau de sortie ; trouver les erreurs ; tableaux de matchs ; fusion de 2 fichiers tri´es.
Sept 1998 – page 7
Probl`eme : le jeu du pendu.
Juin 1999 – page 11
Exercices : tableau de sortie ; date de naissance dans pi ; les invit´es du mariage.
Sept 1999 – page 15
Probl`eme : la collection de timbres.
Juin 2000 – page 19
Exercices : arch´eologie ; programme myst`ere ; le jeu des 12 erreurs ; carr´es magiques.
Sept 2000 – page 25
Probl`eme : ´edition de factures.
Juin 2001 – page 29
Exercices : les 16 erreurs ; programme myst`ere ; score au tennis ; recherche dans un fichier.
Sept 2001 – page 33
Probl`eme : formatage de texte.
Juin 2002 – page 37
Exercices : le jeu des erreurs ; programme myst`ere ; compter les BUTS ; l´egislatives.
Sept 2002 – page 41
Probl`eme : la discoth`eque.
Juin 2003 – page 45
Exercices : le jeu des erreurs ; programme myst`ere ; entrelacement ; timbres postes.
Sept 2003 – page 49
Probl`eme : puissance 4.
2
Facult´e des Sciences de Luminy 9 juin 1998
Deug 1 MASS MA Dur´ee 3 heures
´
Epreuve d’Informatique
Documents, calculettes et ordinateurs sont interdits.
Les exercices sont ind´ependants, `a r´ealiser en langage Pascal.
1. Tableau de sortie (4 points)
Faire le tableau de sortie de chaque programme (c’est-`a-dire le tableau des valeurs successives
des variables et expressions) et en d´eduire ce qui est affich´e `a l’´ecran.
1.a var i : integer;
begin
i := 1; while i < 10 do i := 11 - 2*i; writeln (i);
end.
1.b const r = ’mercredi’; var i : integer; m, e : char;
begin
m := r[1]; e := r[2];
for i := 2 to 7 do if m <= r[i]
then begin e := m; m := r[i]; end;
writeln (e = m);
end.
2. Trouver les erreurs (5 points)
Les programmes suivants devraient tous afficher 1998, or ils sont truff´es d’erreurs (il peut y en
avoir plusieurs dans chaque programme). Trouvez-les et proposez ´eventuellement une correction.
2.a procedure p (var x : integer);
begin
writeln(x+4);
end;
Begin
p(1994);
End.
2.b procedure q (var x : integer);
begin
for i := 1 to 1998 do x := x+1;
end;
Var t : integer;
Begin
q(t); writeln(t);
End.
2.c function r (a, b : char) : boolean;
begin
if a <> b then r := 999;
end;
Begin
r(’a’,’b’); writeln(2*r);
End.
2.d procedure s (var u, v, w : integer);
begin
w := u; v := w; u := v;
end;
Var x, y : integer;
Begin
x := 4 and y := 8; s(x,y);
writeln(’199’x);
End.
3. Tableaux de matchs (6 points)
Le s´electionneur de l’´equipe de France veut faire des statistiques sur les matchs de 1`ere division.
Il dispose des types suivants pour m´emoriser le nom des ´equipes :
CONST MaxEquipe = 25;
TYPE nom_t = string[63];
TabNom_t = array [1..MaxEquipe] of nom_t;
3
3.a ´
Ecrire la proedure SaisieNoms (var tN : TabNom_t ; var nN : integer); qui lit au
clavier une suite de noms (1 par ligne) termin´ee par une ligne vide, m´emorise ces noms dans
tN et le nombre r´esultant dans nN.
3.b Les ´equipes sont d´esormais num´erot´ees dans leur ordre de saisie. On introduit maintenant
des types pour m´emoriser les scores des matchs, qui ont lieu chaque fois entre une ´equipe locale
et une ´equipe ext´erieure :
CONST MaxMatch = 1000;
TYPE Match_t = record
n_loc, n_ext, { num´ero ´equipe locale, ext´erieure }
s_loc, s_ext : integer; { score ´equipe locale, ext´erieure }
end;
TabMatch_t = array [1..MaxMatch] of Match_t;
´
Ecrire la fonction QuiGagne (m : Match_t) : integer; qui pour un match mdonn´e, renvoie
1, -1 ou 0 selon que la gagnante est l’´equipe locale, ext´erieure ou que le match est nul.
3.c ´
Ecrire la proedure AffiGagnants (tM : TabMatch_t; nM : integer; tN : TabNom_t;
nN : integer); qui affiche pour chacun des nM matchs le nom de l’´equipe gagnante, en appe-
lant ´eventuellement la fonction QuiGagne.
3.d ´
Ecrire la fonction DiffLocalExt (tM : TabMatch_t; nM : integer) : integer; qui
renvoie pour l’ensemble des nM matchs, la diff´erence entre le nombre de matchs gagn´es par
l’´equipe locale et le nombre de matchs gagn´es par l’´equipe ext´erieure, en appelant ´eventuelle-
ment la fonction QuiGagne.
4. Fusion de 2 fichiers tri´es (5 points)
Soit le type ligne_t = string[255];
On dispose de 2 fichiers texte nomf1 et nomf2 qui contiennent chacun exactement 1 mot par
ligne (lettres minuscules sans espacement), sauf `a la fin o`u il peut y avoir une ligne vide. Ces
fichiers sont tri´es sur les mots dans l’ordre croissant.
On se propose de fusionner ces 2 fichiers en 1 fichier unique nomf3, qui contiendra tous les mots
de nomf1 et nomf2, et sera tri´e.
Exemple
nomf1 nomf2 nomf3
choisir bien bien
fait des choisir
germer exemples des
la exemples
solution fait
germer
la
solution
Il s’agit de lire alternativement parfois dans nomf1,
parfois dans nomf2, et de d´ecider chaque fois quel mot on ´ecrit dans nomf3.
On rappelle que l’on n’a pas le droit de lire dans un fichier sans avoir v´erifi´e au pr´ealable que
sa fin n’est pas atteinte.
4.a ´
Ecrire la proc´edure Lire (var f : text; var s : ligne_t); qui re¸coit en param`etre
un fichier fd´ej`a ouvert, puis lit une ligne sdans fsi fn’est pas vide, sinon rend svide.
4.b ´
Ecrire la proc´edure Fusion (nomf1, nomf2, nomf3 : ligne_t); qui r´ealise la fusion des
fichiers nomf1 et nomf2 dans le fichier nomf3, et s’occupe de l’ouverture et de la fermeture des
3 fichiers.
4
Correction
Exercice 1 : sur 4 points.
1.a : 1 point pour le tableau, 0,5 point pour l’affichage.
1.b : 2 points pour le tableau, 0,5 point pour l’affichage, + bonus 1 point pour l’interpr´etation
du r´esultat.
1.a i = 1 init
i=9
i = -7
i = 25
Le programme affiche 25.
1.b m = ’m’ e = ’e’ init
i = 2 r[i] = ’e’ m = ’m’ e = ’e’
i = 3 r[i] = ’r’ m = ’r’ e = ’m’
i = 4 r[i] = ’c’ m = ’r’ e = ’m’
i = 5 r[i] = ’r’ m = ’r’ e = ’r’
i = 6 r[i] = ’e’ m = ’r’ e = ’r’
i = 7 r[i] = ’d’ m = ’r’ e = ’r’
Le programme affiche true.
(eest le pr´ec´edent max et le test renvoie true si il y a plusieurs occurences du max).
Exercice 2 : sur 5 points, soit 0,5 points par erreur * 10 erreurs.
2.a procedure p (var x : integer); enlever le var
begin
writeln(x+4);
end;
Begin
p(1994);
End.
2.b procedure q (var x : integer);
begin eclarer i
for i := 1 to 1998 do x := x+1;
end;
Var t : integer;
Begin
q(t); writeln(t); initialiser t := 0;
End.
2.c function r (a, b : char) : boolean; : integer;
begin
if a <> b then r := 999; la fct ne renvoie pas
end; toujours un r´esultat
Begin
r(’a’,’b’); writeln(2*r); writeln(2*r(’a’,’b’))
End.
2.d procedure s (var u, v, w : integer); mettre w en local
begin
w := u; v := w; u := v; mauvais ´echange, il faut
end; changer l’ordre des :=
Var x, y : integer;
Begin
x := 4 and y := 8; s(x,y); remplacer and par ;
writeln(’199’x); il manque la virgule
End.
5
1 / 49 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !