Annales corrigées Pascal - Examens Deug 1 MASS MA 1998-2003

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 proc´edure 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 proc´edure 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 d´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 l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!