Partie n 1 Problème n 1 (3 points) : Diagramme de Conway On désire donner une définition syntaxique du langage constitué des mots suivants : acb, aacccccccbb, aaabbb, aaaaaaccbbbbbb, 1) Donner une formule pour définir ce langage. 2) Définir le diagramme de Conway associé. Solution : Problème n 2 (4 points) : Que Fait ce Programme? Vous disposez du programme ci-dessous. Ce programme respecte la syntaxe Pascal, mais il est mal présenté et les commentaires ont été oubliés. Vous devez retrouver l algorithme et donner des exemples d utilisation. PROGRAM que_fait_le_programme_suivant ; Var x, y, resultat, reste : integer; Begin Writeln('Donner la valeur de x'); Readln(x); Writeln('Donner la valeur de y'); Readln(y); Resultat:=1; While (y<>0) do Begin Reste := y mod 2; If (reste=0) then x:=x*x; y:=y div 2; else resultat:=resultat*x; y:=y-1; ; ; Writeln('Le résultat est =', resultat); readln. 1) Réécrire ce programme en respectant les règles d indentation du langage Pascal. 2) Exécuter le programme avec x=2 et y=4 et x=4 et y=3. Pour les deux applications numériques donner les valeurs de x, y, Resultat et Reste pour chaque itération. 3) Expliquer le calcule réalisé pas ce programme en fonction des variables d entrées. 4) Ajouter des commentaires dans ce programme.
Solution : Ce programme calcule resultat=x^y PROGRAM que fait le programme suivant ; Var x, y, resultat, reste : integer; Begin Writeln('Donner la valeur de x'); Readln(x); Writeln('Donner la valeur de y'); Readln(y); Resultat:=1; While (y<>0) do Reste := y mod 2; If (reste=0) then x:=x*x; y:=y div 2; else { Cas de y impair } resultat:=resultat*x; y:=y-1; ; ; Writeln('Le résultat est =', resultat); readln; readln; readln. Partie n 2 (7 points) : Structures alternatives 1) Jour du lemain : écrire un programme pascal qui demande à utilisateur d'entrer une date (JJ/MM/AAAA) et affiche le jour du lemain. Rappel : Soit une année A : Si A n'est pas divisible par 4, l'année n'est pas bissextile. Si A est divisible par 4, l année est bissextile sauf si A est divisible par 100 à moins que A ne soit divisible par 400.
Réponse : Program jour_du_lemain; var jour, mois, annee : integer; {données d'entrée} maxj : integer; {prra le nombre des jours d'un mois donné} jour_d, mois_d, annee_d : integer; {données de sortie} writeln('veuillez entrer une date, dans le format (jj mm aaaa)'); readln(jour,mois,annee); {calcul du jour maxi pour les mois} case mois of 1, 3, 5, 7, 8, 10, 12 : maxj := 31; 4, 6, 9, 11 : maxj := 30; 2 : if ((annee mod 4) = 0 )and( (annee mod 400 = 0 )or( annee mod 100 <> 0 ) ) then maxj := 29 else maxj := 28; ; {case of} {vérifie si on est dans la discontinuité -- fin de mois} if jour = maxj then if mois = 12 then jour_d := 1; mois_d := 1; annee_d := annee + 1; else jour_d := 1; mois_d := mois + 1; annee_d := annee; else {si pas dans la discontinuité, jour du lemain est juste "le jour d'après"} jour_d := jour + 1; mois_d := mois; annee_d := annee; ; {affichage des résultats} writeln('le jour du lemain est : ',jour_d,'/',mois_d,'/',annee_d); readln;{astuce sur Dev-Pascal pour garder la console ouverte pant qu'on lise les résultats}.
2) On veut calculer les dépenses relatives à l'utilisation d un scooter ou d une moto en vue de la déclaration d impôts sur les revenus 2012. Ces dépenses peuvent être évaluées par l'application d'un barème kilométrique annuellement publié par l'administration et donné dans le tableau ci-dessous (ou d représente la distance parcourue). Puissance Jusqu'à 3000 km De 3001 à 6000 km Au-delà de 6000 km administrative 1 ou 2 CV d x 0,318 (d x 00,080) + 714 d x 00199 3, 4 ou 5 CV d x 00,378 (d x 00,066) + 936 d x 00,222 Plus de 5 CV d x 00,489 (d x 00,063) + 1278 d x 00,276 Ecrire le programme qui demande à l utilisateur de rentrer la puissance administrative de son véhicule ainsi que le nombre de kilomètres parcourus durant l année 2012 avec ce même véhicule et affiche l évaluation des dépenses selon le calcul administratif. Solution : program frais_reelles; var cv : integer; d, frais : real; writeln('veuillez indiquer le nombre des quilomètres parcourus pant l''année'); readln(d); writeln('veuillez indiquer la puissance fiscal de votre véhicule'); readln(cv); writeln('le montant des frais s''élève à : '); if d <= 3000 then case cv of 1, 2 : writeln(d*0.318); 3, 4, 5 : writeln(d*0.378); otherwise writeln(d*0.489); else if (d > 3000) and (d <= 6000) then case cv of 1, 2 : writeln((d*0.080)+714); 3, 4, 5 : writeln((d*0.066)+936); otherwise writeln((d*0.063)+1278); else case cv of 1, 2 : writeln(d*0.199); 3, 4, 5 : writeln(d*0.222); otherwise writeln(d*0.276); ; readln;.
Partie n 3 (6 points) : Jeu de Nim Le jeu de Nim, popularisé dans un film des années soixante, admet différentes variantes. En voici la plus simple : on joue à deux joueurs. On dispose 17 allumettes sur une table. A tour de rôle, chaque joueur pr 1, 2 ou 3 allumettes. L un des joueurs commence, l autre réplique et ainsi de suite. Le perdant est celui qui est obligé de prre la dernière allumette. 1) Ecrire un programme en Pascal qui contrôle l exécution de ce jeu avec deux joueurs dont vous entrerez les noms. Le programme gère les allumettes et demande à chaque joueur ce qu il veut jouer. Ce programme doit en particulier s arrêter dès que l un des joueurs a perdu, auquel cas le vainqueur devra être proclamé, ou dès que l un des joueurs pr plus d allumettes qu il n est autorisé. Dans ce cas, un message d avertissement sera affiché. Program JEU_DE_NIM ; {------------------------------} var nom1, nom2 : string ; n, allu : integer ; writeln( entrez le nom du premier joueur ) ; readln(nom1) ; writeln( entrez le nom du premier joueur ) ; readln(nom2) ; allu := 17 ; repeat writeln(nom1, combien d allumettes prenez-vous? ) ; readln(n) ; if n>3 then writeln(nom2, vous avez gagné la partie ) else allu := allu n ; if allu = 0 then writeln(nom2, vous avez gagné la partie ) else writeln(nom2, combien d allumettes prenez-vous? ) ; readln(n) ;
if n>3 then writeln(nom1, vous avez gagné la partie ) else allu := allu n ; if allu=0 then writeln(nom1, vous avez gagné la partie ) ; ; until (allu = 0) or (n >3) ; writeln( game over ) ;. Remarque : à noter qu il existe une version plus concise, mais un petit peu plus technique, où un seul joueur est considéré à chaque itération. 2) Déterminez un principe qui assure la victoire à celui qui ne commence pas la partie (trouver l algorithme général ou la méthode pour que celui qui ne commence pas la partie gagne à tous les coups). le joueur qui joue en second gagne s il laisse à chaque fois un nombre entier d allumettes n de la forme n = 4k+1, avec k entier. En effet, ceci est toujours possible car le nombre de départ est précisément de cette forme. k diminuant à chaque itération, vira nécessairement le moment où k=0 : le premier joueur sera alors contraint de prre la dernière allumette restante.