NF01 - Automne 2014 Examen Médian - 1 heure 30 Polycopié papier autorisé, autres documents interdits Calculatrices, téléphones, traducteurs et ordinateurs interdits! Utilisez trois copies séparées, une copie par Partie Partie n 1, copie séparée (6 points) : Emprunt bancaire Une personne désireuse de faire un emprunt pour l achat d une maison voudrait connaître les mensualités de remboursement en fonction du taux d intérêt du prêt bancaire, de la durée du prêt (15 ou 20 ans) et du montant de l emprunt (prix de la maison). Cette personne s est fixée un plafond c'est-à-dire un montant de mensualité qu elle ne veut pas dépasser. Elle a récemment visité 25 maisons dont le prix est donné en euros. Ecrire un programme en Pascal qui demande le plafond maximum, le taux d intérêt de la banque, puis pour chaque maison, demande son prix et affiche le montant des mensualités correspondant à 15 et à 20 ans de remboursement. L affichage se fera uniquement si celui-ci ne dépasse pas le plafond donné par l utilisateur. Le programme affichera ensuite combien de maisons visitées répondent à son critère. La formule de calcul des mensualités d un prêt est la suivante : Remarques importantes : - L opérateur «puissance» n existe pas en Pascal. A vous de calculer x n. - On n utilise pas de tableaux. Solution PROGRAM exomedianemprunt; const nbmens15 = 180; {nombre de mensualites 15 ans} nbmens20 = 240; {nombre de mensualites 20 ans} var taux: real; {donnée } prix: real; {donnée pour 25 maisons} plafond : real; {donnée} mens15,mens20: real; {résultat : valeur de la mensualité pour 15 et 20 ans} nbmaisons: integer; {résultat : nombre de maisons qui vont bien} i,j : integer; {variables de boucles}
puis : real; {calcul la puissance dnas la formule} writeln('donner le taux bancaire SVP :'); readln(taux); taux:=taux/100; {si taux en pourcentage} writeln('donner le plafond a ne pas depassser pour les mensualités'); readln(plafond); nbmaisons :=0; for i:=1 to 25 do writeln('donner le prix de la maison :'); readln(prix); {remarque le calcul de la puissance ne depend que du taux, donc pourrais etre sorti de la boucle principale} puis := 1; for j:=1 to nbmens15 do puis:= puis*(1+ taux/12); {writeln('puis:', puis); } mens15 := (prix *taux/12 * puis) /(puis-1); for j:=nbmens15+1 to nbmens20 do puis:= puis*(1+ taux/12); {writeln('puis:', puis); } mens20 := (prix *taux/12 * puis) /(puis-1); {affichage et calcul du nombre de maison} if (mens15<plafond) then nbmaisons :=nbmaisons+1; writeln('mensualité pour 15 ans mens15); if (mens20<plafond) then writeln('mensualité pour 20 ans pour la maison ', i,' = ', pour la maison ', i,' = ', mens20); end else if (mens20<plafond) then writeln('mensualité pour 20 ans pour la maison ', i,' = ', mens20); nbmaisons :=nbmaisons+1; writeln('nombres de maisons possibles ', nbmaisons); readln; readln; Partie n 2, copie séparée (7 points) : Lancés de dés 1) Dans une première version du jeu, deux joueurs s affrontent. A chaque tour de la partie, les deux joueurs jouent : chaque joueur effectue un lancé d un seul dé. On compare alors leurs résultats. Quand les résultats sont identiques, on ne fait rien, et on passe au tour suivant. Quand le lancé de l un joueurs surpasse celui de l autre, on ajoute le résultat de ce lancé au score de son auteur. De plus, si ce résultat est égal à 6, l auteur de ce lancé peut continuer, au sein de ce même tour, à lancer aussi longtemps qu il obtient 6, et naturellement à chaque fois son score particulier est augmenté du résultat de chaque lancé. Une fois tout cela effectué, on passe alors au tour suivant et le même cycle repr Le jeu s arrête au bout de 30 tours. A la fin, on affiche les scores obtenus par les deux joueurs, et bien sûr on précise qui est le vainqueur (celui qui a obtenu le plus gros score).
Ecrire le programme en PASCAL pour mettre en œuvre ce jeu Remarque : à défaut d avoir des lancés vraiment aléatoires, on rentre la valeur de chaque lancé directement par une lecture au clavier. 2) Dans une deuxième version du jeu, il n y a plus qu un seul joueur. Celui-ci lance en même temps deux dés dont les faces sont numérotées de 1 à 6. A chaque lancé : - dans le cas où la somme des deux dés est un nombre premier différent de 2, on ajoute au score total du joueur cette somme multipliée par deux. - dans le cas où les deux dés sont égaux, on soustrait leur somme du score total. - dans les cas restants, on ajoute simplement leur somme au score total. Ce processus doit être interrompu lorsque ce joueur atteint ou dépasse le score total de 100 ou lorsqu il a effectué 40 lancés. A la fin, on affiche le score total atteint par ce joueur ainsi que le nombre de coups mis pour y parvenir. Programmer en PASCAL cette seconde partie du jeu Remarques : - à défaut d avoir un lancé vraiment aléatoire, on rentre la valeur du dé directement par une lecture au clavier. - On n utilise pas de tableaux. Program P1 ; var i, score1, score2, n1, n2 : integer ; score1 := 0 ; score2 := 0 ; for i := 1 to 30 do readln(n1) ; readln(n2) ; if n1 > n2 then while n1 = 6 do end then readln(n1) ; score1 := score1 + n1 ; score1 := score1 + n1 ; else if n2 > n1 readln(n2) ; while n2 = 6 do score2 := score2 + n2 ;
score2 := score2 + n2 ; writeln( score du 1er joueur, score1, score du 2ème joueur, score2) ; if score1 = score2 then writeln( il n y a pas de vainqueur ) else if score1 > score2 then writeln( le vainqueur est le joueur 1 ) else writeln( le vainqueur est le joueur 2 ) ; Program P2 ; var i, score, d, dé1, dé2 : integer ; score := 0 ; i := 0 ; repeat i := i + 1 ; readln(dé1) ; readln(dé2) ; d := d1 + d2 ; if (d = 3) or (d = 5) or (d = 7) or (d = 11) then score := score + 2 * d else if dé1 = dé2 then score := score d else score := score + d until (i = 40) or (score >= 100) ; writeln( le score obtenu est :, score, avec un nombre de coups égal à :,i) ; Partie n 3, copie séparée (7 points) : Achat en ligne Le numéro d'une carte bancaire est généré suivant un algorithme particulier. Ainsi la vérification du numéro peut être effectuée suivant les règles suivantes : T 1. Dans un premier temps il faut vérifier si le nombre de chiffres du numéro correspond au type de carte déclarée Master Card (16 chiffres), VISA (13 chiffres), American Express (15 chiffres)
T 2. Dans un deuxième temps la vérification suivante est réalisée : Op 0. Les chiffres qui se trouvent aux places paires du numéro de la carte sont multipliés par 2 Op 1. La somme des chiffres de ces produits est calculée Op 2. A cette somme sont ajoutés les chiffres restants (qui n'ont pas été multipliés par 2) Op 3. Si le nombre obtenu en Op 2. se termine par 0, alors le numéro de la carte est valide On vous demande de réaliser un programme PASCAL qui permet la saisie des informations relatives à la carte utilisée et la vérification de la validité du numéro entré. Votre programme doit permettre de : 1. Saisir le type de carte utilisée. Le programme doit accepter seulement une des cartes Master Card, VISA ou American Express. L'utilisateur a le droit de se tromper, mais la poursuite des opérations ne doit pas être possible avant la saisie d'un nom de carte valide. 2. Après avoir entré le type de carte, l'utilisateur doit entrer le numéro de la carte. Votre programme doit accepter seulement un numéro de longueur valide (longueur calculée par votre programme) : 16 chiffres pour une Master Card, 13 chiffres pour une VISA, 15 chiffres pour une American Express. L'utilisateur a le droit de se tromper, mais la poursuite des opérations ne doit pas être possible avant la saisie d'un numéro de carte de longueur valide. 3. Après la validation des deux premières étapes, votre programme doit vérifier la validité du numéro de la carte suivant l'algorithme de vérification de code présenté précédemment. Remarque : Les opérations Op 0, Op 1 et Op 2 peuvent être effectuées dans la même boucle. L'utilisation des fonctions MOD (permet la récupération du reste de la division) et DIV (permet la récupération de la partie entière de la division) de la division Euclidienne peut faciliter la construction de votre programme. 4. Votre programme doit afficher si le type de carte et le numéro proposés sont valides. Le déroulement de cette vérification est illustré par l'exemple suivant : une carte Master Card avec le N 4794 0132 4276 3821. T 1. Le numéro de carte est composé de 16 chiffres ce qui correspond bien au nombre de chiffres du numéro d'une carte Master Card valide. T 2. Op 0. Op 1. Op 2. Les chiffres qui sont aux places paires sont multipliés par 2 (les chiffres soulignés pour l'exemple 4794 0132 4276 3451) : 4*2 = 8; 9*2 = 18; 0*2 = 0; 3*2 = 6; 4*2 = 8; 7*2 = 14; 3*2 = 6; 5*2 =10 La somme des chiffres des résultats de ces produits est calculée: (8) + (1+8) + (0) +(6) + (8) + (1+4) + (6) + (1+0) = 43 Au résultat (43) de l'op 1. sont ajoutés les chiffres qui n'ont pas été considérés précédemment (7, 4, 1, 2, 2, 6, 4, 1) :
Op 3. 43 + 7 + 4 + 1 + 2 + 2 + 6 + 4 + 1 = 70 Le nombre (70) obtenu en Op 2. se termine par 0 et donc nous avons bien un numéro de carte Master Card valide. Remarque : On n utilise pas de tableaux. Program credit; var Number, Temp_Number : int64; N, pointer, Chiffre, sum :integer; carte : string; Nb_ch, T_ch : integer; repeat writeln('type de carte VISA, Master Card, Amercian Exress'); readln(carte); until (carte = 'VISA') or (carte = 'Master Card') or (carte = 'American Express'); repeat writeln('veuillew entrer votre numero de carte:'); readln(number); Temp_Number := Number; N :=0; while (Temp_Number <>0) do Temp_Number := Temp_Number DIV 10; N := N + 1; until ((carte = 'VISA') and (N = 13)) or ((carte = 'Master Card') and ( N = 16)) or ((carte = 'American Express') and ( N = 15)); sum := 0; Chiffre := 0; Temp_Number := Number; for pointer := 1 to N do Chiffre := Temp_Number mod 10; Temp_Number := Temp_Number DIV 10; if (pointer <> 1) and (pointer mod 2 = 0) then Chiffre := Chiffre*2; sum := sum + Chiffre div 10 + Chiffre mod 10; end else sum := sum + Chiffre; writeln('sum =',sum); if (sum mod 10 = 0) then writeln('carte valide') else writeln('carte invalide'); readln;