Enseignant : Idoudi Khaled Lycée Secondaire Haffouz Page : 1/6
Exercice
Bac Blanc 2014
Dans le cadre de la migration vers son nouvel nom commercial ooredoo, la société mère a décidé d’organiser chaque semaine un jeu de chance pour ses abonnés. Pour cela cette société vous demande d’écrire un programme qui gère ce jeu.
Saisir le nombre des participants N sachant que 5≤N≤100.
Remplir le tableau T par le numéro de téléphone de chaque participant, sachant que les numéros de téléphones sont des chaines de caractères de 8 chiffres dont le chiffre n°1 doit être 2.
Calculer le nombre de chance pour chaque n° de Tel et le stocker dans le tableau S.
Comment calculer le nombre de chance d’un n° de Tel ?
Nombre de chance = somme des chiffres de n°Tel multiplié par son rang.
Exemple : Tel=29234560
Nombre de chance= 2*1+ 9*2+ 2*3+ 3*4+ 4*5+ 5*6+ 6*7+ 0*8 = 130
Afficher les 33% premiers numéros de Téléphone ayant les plus grands scores.
NB : Si le calcul de 33% des n°Tel ne donne pas un entier, on utilisera l’arrondi du nombre trouvé.
Pour N=7
T= 24023456 20056782 29234560 25737286 26570694 23781269 21627839
1 2 3 4 5 6 7
S= 140 166 130 196 188 192 206
1 2 3 4 5 6 7
Le programme affichera
Les participants gagnants : 21627839 25737286
Enseignant : Idoudi Khaled Lycée Secondaire Haffouz Page : 2/6
Décomposition modulaire du problème
Analyse de programme principal : Nom de programme : jeuxRésultat : Trait
Trait=[] PROC Afficher(Arrondi(n*0.33),Ttel) PROC Trier(N, Ttel,Tscore)
PROC Remplir_Score(n,Ttel,Tscore) PROC Remplir_participant(N, Ttel) PROC Saisir(n)
Fin jeux T.D.N.T
Type T_Tel=chaine de 8 caractères
TABTel= Tableau de taille 50 et de type T_Tel TABScore= Tableau de taille 50 et de type entier T.D.O Globaux
Objet T/N Rôle
N Entier stocker la taille du tableau
Ttel TABTel Stocker le n° de tel des participants
Tscore TABScore Stocker dans le tableau les scores de chaque participant Saisir Procédure Saisir la taille du tableau
Remplir_participant Procédure Remplir le tableau par les n°tel des participants Remplir_Score Procédure Remplir le tableau par les scores des participants
Trier Procédure Trier le tableau Tscore dans l’ordre décroissant Afficher Procédure Afficher les gagnants
Programme Principal
PROC
Remplir_participant(N,var T)
PROC Tri_Score (N,var T,var S)
PROC Saisie(var N)
FN calculer_score(tel)
PROC Remplir_Score (N, T, var S)
PROC PermutScore (var x,y)
FN verif(tel)
PROC PermutTel (var x,y)
PROC Afficher (N, T)
Algorithme de programme principal:0) Début jeux 1) PROC Saisir(N)
2) PROC Remplir_participant(N, Ttel) 3) PROC Remplir_Score(n,Ttel,Tscore) 4) PROC Trier(N, Ttel,Tscore)
5) PROC Afficher(Arrondi(n*0.33),Ttel) 6) Fin jeux
Enseignant : Idoudi Khaled Lycée Secondaire Haffouz Page : 3/6
Algorithme de la procédure Saisir 1) Répéterécrire("Donner la valeur de N : ") lire(x)
jusqu’à (5≤x)ET(x≤50) 2) Fin Saisir
Algorithme de la procédure Remplir_participant 1) Pour i de 1 à N faireRépéter
écrire("Tel[",i, "]=") lire(T[i])
jusqu’à FN verif(T[i]) Fin Pour
2) Fin Remplir T.D.O Locaux
Objet T/N Rôle
i Entier Compteur
verif Fonction Vérifier la validité d’un numéro de téléphone
Algorithme de la fonction Vérif 1) i 22) Tant que (tel[i] dans ["0".."9"]) et (i<long(tel)) faire ii+1
Fin Tant que
3) Verif (long(tel)≠8) et (tel[i] dans ["0".."9"]) et (tel[1] = "2") Fin Verif
T.D.O Locaux
Objet T/N Rôle
i Entier Compteur
Algorithme de la procédure Remplir_Score 1) Pour i de 1 à N faireTscore[i]FN calculer_score(Ttel[i]) Fin Pour
2) Fin Remplir_Score T.D.O Locaux
Objet T/N Rôle
i Entier Compteur
calculer_score Fonction Calculer le nombre de chance d’un numéro de téléphone
Algorithme de la Fonction calculer_score 1) [s0]pour i de 1 à long(tel) fairevaleur(tel[i],c,e) ss+c*i
Fin pour 2) calculer_score s 3) Fin
Enseignant : Idoudi Khaled Lycée Secondaire Haffouz Page : 4/6
T.D.O Locaux
Objet T/N Rôle
i Entier Compteur
s Entier Calculer le nombre de chance d’un numéro de téléphone c Entier Stocker un chiffre
e Entier Contient la position de l’erreur
Algorithme de la procédure Tri_Score 1) Répéter[Echangefaux]
pour i de 1 à n-1 faire
si Tscore[i]<Tscore[i+1] alors
PROC PermutScore(Tscore[i],Tscore[i+1]) PROC PermutTel(Ttel[i],Ttel[i+1]) Echangevrai
Fin Si Fin Pour Nn-1
Jusqu’à non(echange) ou (n=1) 2) Fin Trier
T.D.O Locaux
Objet T/N Rôle
i Entier Compteur
echange booléen Vérifier si on effectuer un parcours sans échange PermutScore Procédure Permuter deux cases dans le tableau TScore PermutTel Procédure Permuter deux cases dans le tableau Ttel
Algorithme de la procédure PermutScore 1) auxx2) xy 3) yaux
4) Fin PermutScore T.D.O Locaux
Objet T/N Rôle
aux Entier Variable auxiliaire
Algorithme de la procédure PermutTel 1) auxx2) xy 3) yaux
4) Fin PermutTel T.D.O Locaux
Objet T/N Rôle
aux T_TEL Variable auxiliaire
Algorithme de la procédure Afficher 1) Pour i de 1 à N faireEcrire(Ttel[i]) Fin Pour
2) Fin Afficher T.D.O Locaux
Objet T/N Rôle
i Entier Compteur
Enseignant : Idoudi Khaled Lycée Secondaire Haffouz Page : 5/6
Programme Pascal
PROGRAM JEU;
USES wincrt ; TYPE
T_Tel=string[8];
TABTel=Array[1..50] of T_Tel;
TABScore=Array[1..50] of integer;
VAR
n:integer;
Ttel:TABTel ; Tscore:TABScore;
PROCEDURE Saisir(VAR N :integer);
BEGIN repeat
Write('Donner le nombre de participants: ');
Readln(N) ;
until(N>=5)and(N<=50);
END;
PROCEDURE Remplir_participant(n:integer ; VAR Ttel: TABTel);
VAR i :integer ;
FUNCTION verif(tel:T_Tel):Boolean;
VAR i:integer;
BEGIN i:=2;
While (tel[i] in ['0'..'9']) and (i<length(tel) do i:=i+1;
verif :=( length(tel)<>8 ) and (tel[i] in ['0'..'9']) and (tel[1] ='2' );
END;
BEGIN
for i :=1 to n do begin
writeln('==> Participant n° ',i);
repeat Write('N°Tel: ');
Readln(Ttel[i]);
Until verif(Ttel[i]);
end;
END;
FUNCTION calculer_score(tel:T_Tel):integer;
VAR i,s,c,e:integer;
BEGIN s:=0;
for i:=1 to length(tel) do begin
val(tel[i],c,e);
s:=s+c*i;
end;
calculer_score:=s;
END;
Enseignant : Idoudi Khaled Lycée Secondaire Haffouz Page : 6/6
PROCEDURE Remplir_Score(n:integer; Ttel:TABTel ; VAR Tscore:TABScore);
VAR i :integer ; BEGIN
for i :=1 to n do
Tscore[i]:= calculer_score(Ttel[i]);
END;
PROCEDURE PermutScore(VAR x,y:integer);
VAR aux :integer ; BEGIN
aux :=x ; x :=y ; y :=aux ; END;
PROCEDURE PermutTel(VAR x,y:T_Tel);
VAR aux :T_Tel ; BEGIN
aux :=x ; x :=y ; y :=aux ; END;
PROCEDURE Trier(n:integer ; VAR Ttel:TABTel; VAR Tscore:TABScore) ; VAR i :integer ;
echange:boolean;
BEGIN repeat
echange:=false;
for i:=1 to n-1 do begin
if Tscore[i]<Tscore[i+1] then begin
PermutScore(Tscore[i],Tscore[i+1]) ; PermutTel(Ttel[i],Ttel[i+1]) ; echange:=true;
end;
end;
n:=n-1;
until not(echange) or (n=1);
END;
PROCEDURE Afficher(n:integer;Ttel:TABTel);
VAR i :integer ; BEGIN
for i:=1 to n do writeln(Ttel[i]);
END;
BEGIN Saisir(N);
Remplir_participant(N, Ttel);
Remplir_Score(n,Ttel,Tscore);
writeln;
Trier(N, Ttel,Tscore);
writeln('============ Résultat du jeu ===============');
Afficher (round(n*0.3),Ttel);
END.