Corriges Des Exercices Algorithme TOUS LES NIVEAUX
Corriges Des Exercices Algorithme TOUS LES NIVEAUX
Corriges Des Exercices Algorithme TOUS LES NIVEAUX
D COUVREZ
Aprs A 1 B A + 3 A 3
Exercice 1.2
Aprs A 5 B 3 C A + B A 2 C B A La valeur des variables est : A = 5 B = ? A = 5 B = 3 A = 5 B = 3 A = 2 B = 3 A = 2 B = 3 C C C C C = = = = = 1 ? ? 8 8 -
Exercice 1.3
Aprs A 5 B A + 4 A A + 1 B A 4 La valeur des variables est : A = 5 B = ? A = 5 B = 9 A = 6 B = 9 A = 6 B = 2 -
Exercice 1.4
Aprs A 3 B 10 C A + B B A + B A C La valeur des variables est : A = 3 B = ? A = 3 B = 10 A = 3 B = 10 A = 3 B = 13 A = 13 B = 13 C C C C C = = ? = ? = 13 = 13 13 -
Exercice 1.5
Aprs A 5 B 2 La valeur des variables est : A = 5 B = ? A = 5 B = 2
A B B A
A = 2 A = 2
B = 2 B = 2
Les deux dernires instructions ne permettent donc pas dchanger les deux valeurs de B et A, puisque lune des deux valeurs (celle de A) est ici crase. Si lon inverse les deux dernires instructions, cela ne changera rien du tout, hormis le fait que cette fois cest la valeur de B qui sera crase. -
Exercice 1.6
Dbut C A A B B C Fin On est oblig de passer par une variable dite temporaire (la variable C). -
Exercice 1.7
Dbut D C C B B A A D Fin En fait, quel que soit le nombre de variables, une seule variable temporaire suffit -
Exercice 1.8
Il ne peut produire quune erreur dexcution, puisquon ne peut pas additionner des caractres. -
Exercice 1.9
Exercice 2.2
Variables nb, carr en Entier Dbut Ecrire "Entrez un nombre :" Lire nb carr nb * nb Ecrire "Son carr est : ", carr Fin En fait, on pourrait tout aussi bien conomiser la variable carr en remplaant les deux avantdernires lignes par : Ecrire "Son carr est : ", nb*nb C'est une question de style ; dans un cas, on privilgie la lisibilit de l'algorithme, dans l'autre, on privilgie l'conomie d'une variable. -
Exercice 2.3
Variables nb, pht, ttva, pttc en Numrique Dbut Ecrire "Entrez le prix hors taxes :" Lire pht Ecrire "Entrez le nombre darticles :" Lire nb Ecrire "Entrez le taux de TVA :" Lire ttva pttc nb * pht * (1 + ttva)
Ecrire "Le prix toutes taxes est : ", pttc Fin L aussi, on pourrait squeezer une variable et une ligne en crivant directement. : Ecrire "Le prix toutes taxes est : ", nb * pht * (1 + ttva) C'est plus rapide, plus lger en mmoire, mais un peu plus difficile relire (et crire !) -
Exercice 2.4
Variables t1, t2, t3, t4 Dbut t1 "belle Marquise" t2 "vos beaux yeux" t3 "me font mourir" t4 "damour" Ecrire t1 & " " & t2 & " Ecrire t3 & " " & t2 & " Ecrire t2 & " " & t3 & " Ecrire t4 & " " & t1 & " Fin en Caractre
t3 t4 t1 t2
t4 t1 t4 t3 -
Exercice 3.2
Variables m, n Dbut Ecrire "Entrez Lire m, n Si (m > 0 ET n Ecrire "Leur Sinon Ecrire "Leur Finsi Fin en Entier deux nombres : " > 0) OU (m < 0 ET n < 0) Alors produit est positif" produit est ngatif"
Exercice 3.3
Variables a, b, c en Caractre Dbut Ecrire "Entrez successivement trois noms : " Lire a, b, c Si a < b ET b < c Alors Ecrire "Ces noms sont classs alphabtiquement" Sinon Ecrire "Ces noms ne sont pas classs" Finsi Fin -
Exercice 3.4
Variable n en Entier Dbut Ecrire "Entrez un nombre : " Lire n Si n < 0 Alors Ecrire "Ce nombre est ngatif" SinonSi n = 0 Alors Ecrire "Ce nombre est nul" Sinon Ecrire "Ce nombre est positif" Finsi Fin
Exercice 3.5
Variables m, n en Entier Dbut Ecrire "Entrez deux nombres : " Lire m, n Si m = 0 OU n = 0 Alors Ecrire "Le produit est nul" SinonSi (m < 0 ET n < 0) OU (m > 0 ET n > 0) Alors Ecrire "Le produit est positif" Sinon Ecrire "Le produit est ngatif" Finsi Fin Si on souhaite simplifier lcriture de la condition lourde du SinonSi, on peut toujours passer par des variables boolennes intermdiaires. Une astuce de sioux consiste galement employer un Xor (c'est l'un des rares cas dans lesquels il est pertinent) -
Exercice 3.6
Variable age en Entier Dbut Ecrire "Entrez lge de lenfant : " Lire age Si age >= 12 Alors Ecrire "Catgorie Cadet" SinonSi age >= 10 Alors Ecrire "Catgorie Minime" SinonSi age >= 8 Alors Ecrire "Catgorie Pupille" SinonSi age >= 6 Alors Ecrire "Catgorie Poussin" Finsi Fin On peut videmment crire cet algorithme de diffrentes faons, ne serait-ce quen commenant par la catgorie la plus jeune. -
Exercice 4.2
Variables h, m en Numrique Dbut Ecrire "Entrez les heures, puis les minutes : " Lire h, m m m + 1 Si m = 60 Alors m 0 h h + 1 FinSi Si h = 24 Alors h 0 FinSi Ecrire "Dans une minute il sera ", h, "heure(s) ", m, "minute(s)" Fin -
Exercice 4.3
Variables h, m, s en Numrique Dbut Ecrire "Entrez les heures, puis les minutes, puis les secondes : " Lire h, m, s s s + 1
Si s = 60 Alors s 0 m m + 1 FinSi Si m = 60 Alors m 0 h h + 1 FinSi Si h = 24 Alors h 0 FinSi Ecrire "Dans une seconde il sera ", h, "h", m, "m et ", s, "s" Fin -
Exercice 4.4
Variables n, p en Numrique Dbut Ecrire "Nombre de photocopies : " Lire n Si n <= 10 Alors p n * 0,1 SinonSi n <= 30 Alors p 10 * 0,1 + (n 10) * 0,09 Sinon p 10 * 0,1 + 20 * 0,09 + (n 30) * 0,08 FinSi Ecrire "Le prix total est: ", p Fin -
Exercice 4.5
Variable sex en Caractre Variable age en Numrique Variables C1, C2 en Boolen Dbut Ecrire "Entrez le sexe (M/F) : " Lire sex Ecrire "Entrez lge: " Lire age
C1 sex = "M" ET age > 20 C2 sex = "F" ET (age > 18 ET age < 35) Si C1 ou C2 Alors Ecrire "Imposable" Sinon Ecrire "Non Imposable" FinSi Fin -
Exercice 4.6
Cet exercice, du pur point de vue algorithmique, n'est pas trs mchant. En revanche, il reprsente dignement la catgorie des s pigs. En effet, rien de plus facile que d'crire : si le candidat a plus de 50%, il est lu, sinon s'il a plus de 12,5 %, il est au deuxime tour, sinon il est limin. H h h... mais il ne faut pas oublier que le candidat peut trs bien avoir eu 20 % mais tre tout de mme limin, tout simplement parce que l'un des autres a fait plus de 50 % et donc qu'il n'y a pas de deuxime tour !... Moralit : ne jamais se jeter sur la programmation avant d'avoir soigneusement men l'analyse du problme traiter. Variables A, B, C, D en Numrique Variables C1, C2, C3, C4 en Boolen Dbut Ecrire "Entrez les scores des quatre prtendants :" Lire A, B, C, D C1 A > 50 C2 B > 50 ou C > 50 ou D > 50 C3 A >= B et A >= C et A >= D C4 A >= 12,5 Si C1 Alors Ecrire Elu au premier tour" Sinonsi C2 ou Non(C4) Alors Ecrire Battu, limin, sorti !!! SinonSi C3 Alors Ecrire "Ballotage favorable" Sinon Ecrire "Ballotage dfavorable" FinSi Fin -
Exercice 4.7
L encore, on illustre l'utilit d'une bonne analyse. Je propose deux corrigs diffrents. Le premier suit l' pas pas. C'est juste, mais c'est vraiment lourd. La deuxime version s'appuie sur une vraie comprhension d'une situation pas si embrouille qu'elle n'en a l'air. Dans les deux cas, un recours aux variables boolennes are srieusement l'criture. Donc, premier corrig, on suit le texte de l' pas pas : Variables age, perm, acc, assur en Numrique Variables C1, C2, C3 en Boolen Variable situ en Caractre Dbut Ecrire "Entrez lge: " Lire age Ecrire "Entrez le nombre d'annes de permis: " Lire perm Ecrire "Entrez le nombre d'accidents: " Lire acc Ecrire "Entrez le nombre d'annes d'assurance: " Lire assur C1 age >= 25 C2 perm >= 2 C3 assur > 5 Si Non(C1) et Non(C2) Alors Si acc = 0 Alors situ "Rouge" Sinon situ "Refus" FinSi Sinonsi ((Non(C1) et C2) ou (C1 et Non(C2)) Alors Si acc = 0 Alors situ "Orange" SinonSi acc = 1 Alors situ "Rouge" Sinon situ "Refus" FinSi Sinon Si acc = 0 Alors situ "Vert" SinonSi acc = 1 Alors situ "Orange" SinonSi acc = 2 Alors situ "Rouge"
Sinon situ "Refus" FinSi FinSi Si C3 Alors Si situ = "Rouge" Alors situ "Orange" SinonSi situ = "Orange" Alors situ "Orange" SinonSi situ = "Vert" Alors situ "Bleu" FinSi FinSi Ecrire "Votre situation : ", situ Fin Vous trouvez cela compliqu ? Oh, certes oui, a l'est ! Et d'autant plus qu'en lisant entre les lignes, on pouvait s'apercevoir que ce galimatias de tarifs recouvre en fait une logique trs simple : un systme points. Et il suffit de comptabiliser les points pour que tout s'claire... Reprenons juste aprs l'affectation des trois variables boolennes C1, C2, et C3. On crit : P 0 Si Non(C1) Alors P P + 1 FinSi Si Non(C2) Alors P P + 1 FinSi P P + acc Si P < 3 et C3 Alors P P - 1 FinSi Si P = -1 Alors situ "Bleu" SinonSi P = 0 Alors situ "Vert" SinonSi P = 1 Alors situ "Orange" SinonSi P = 2 Alors situ "Rouge" Sinon situ "Refus" FinSi
Exercice 4.8
En ce qui concerne le dbut de cet algorithme, il ny a aucune difficult. Cest de la saisie bte et mme pas mchante: Variables J, M, A, JMax en Numrique Variables VJ, VM, B en Booleen Dbut Ecrire "Entrez le numro du jour" Lire J Ecrire "Entrez le numro du mois" Lire M Ecrire "Entrez l'anne" Lire A C'est videmment ensuite que les ennuis commencent La premire manire d'aborder la chose consiste se dire que fondamentalement, la structure logique de ce problme est trs simple. Si nous crons deux variables boolennes VJ et VM, reprsentant respectivement la validit du jour et du mois entrs, la fin de l'algorithme sera d'une simplicit biblique (lanne est valide par dfinition, si on vacue le dbat byzantin concernant lexistence de lanne zro) : Si VJ et VM alors Ecrire "La date est valide" Sinon Ecrire "La date n'est pas valide" FinSi Toute la difficult consiste affecter correctement les variables VJ et VM, selon les valeurs des variables J, M et A. Dans l'absolu, VJ et VM pourraient tre les objets d'une affectation monstrueuse, avec des conditions atrocement composes. Mais franchement, crire ces conditions en une seule fois est un travail de bndictin sans grand intrt. Pour viter d'en arriver une telle extrmit, on peut srier la difficult en crant deux variables supplmentaires : B : variable boolenne qui indique s'il s'agit d'une anne bissextile JMax : variable numrique qui indiquera le dernier jour valable pour le mois entr. Avec tout cela, on peut y aller et en ressortir vivant. On commence par initialiser nos variables boolennes, puis on traite les annes, puis les mois, puis les jours. On note "dp" la condition "divisible par" :
B A dp 400 ou (non(A dp 100) et A dp 4) Jmax 0 VM M >= 1 et M =< 12 Si VM Alors Si M = 2 et B Alors JMax 29 SinonSi M = 2 Alors JMax 28 SinonSi M = 4 ou M = 6 ou M = 9 ou M = 11 Alors JMax 30 Sinon JMax 31 FinSi VJ J >= 1 et J =< Jmax FinSi Cette solution a le mrite de ne pas trop compliquer la structure des tests, et notamment de ne pas rpter l'criture finale l'cran. Les variables boolennes intermdiaires nous pargnent des conditions composes trop lourdes, mais celles-ci restent nanmoins srieuses. Une approche diffrente consisterait limiter les conditions composes, quitte le payer par une structure beaucoup plus exigeante de tests imbriqus. L encore, on vite de jouer les extrmistes et l'on s'autorise quelques conditions composes lorsque cela nous simplifie l'existence. On pourrait aussi dire que la solution prcdente "part de la fin" du problme (la date est elle valide ou non ?), alors que celle qui suit "part du dbut" (quelles sont les donnes entres au clavier ?) : Si M < 1 ou M > 12 Alors Ecrire "Date Invalide" SinonSi M = 2 Alors Si A dp 400 Alors Si J < 1 ou J > 29 Alors Ecrire "Date Invalide" Sinon Ecrire "Date Valide" FinSi SinonSi A dp 100 Alors Si J < 1 ou J > 28 Alors Ecrire "Date Invalide" Sinon Ecrire "Date Valide" FinSi SinonSi A dp 4 Alors Si J < 1 ou J > 29Alors Ecrire "Date Invalide" Sinon
Ecrire "Date Valide" FinSi Sinon Si J < 1 ou J > 28 Alors Ecrire "Date Invalide" Sinon Ecrire "Date Valide" FinSi FinSi SinonSi M = 4 ou M = 6 ou M = 9 ou M = 11 Alors Si J < 1 ou J > 30 Alors Ecrire "Date Invalide" Sinon Ecrire "Date Valide" FinSi Sinon Si J < 1 ou J > 31 Alors Ecrire "Date Invalide" Sinon Ecrire "Date Valide" FinSi FinSi On voit que dans ce cas, l'alternative finale (Date valide ou invalide) se trouve rpte un grand nombre de fois. Ce n'est en soi ni une bonne, ni une mauvaise chose. C'est simplement une question de choix stylistique. Personnellement, j'avoue prfrer assez nettement la premire solution, qui fait ressortir beaucoup plus clairement la structure logique du problme (il n'y a qu'une seule alternative, autant que cette alternative ne soit crite qu'une seule fois). Il convient enfin de citer une solution trs simple et lgante, un peu plus difficile peut-tre imaginer du premier coup, mais qui avec le recul apparat comme trs immdiate. Sur le fond, cela consiste dire qu'il y a quatre cas pour qu'une date soit valide : celui d'un jour compris entre 1 et 31 dans un mois 31 jours, celui d'un jour compris entre 1 et 30 dans un mois 30 jours, celui d'un jour compris entre 1 et 29 en fvrier d'une anne bissextile, et celui d'un jour de fvrier compris entre 1 et 28. Ainsi : B (A dp 4 et Non(A dp 100)) ou A dp 400 K1 (m=1 ou m=3 ou m=5 ou m=7 ou m=8 ou m=10 ou m=12) et (J>=1 et J=<31) K2 (m=4 ou m=6 ou m=9 ou m=11) et (J>=1 et J=<30) K3 m=2 et B et J>=1 et J=<29 K4 m=2 et J>=1 et J=<28 Si K1 ou K2 ou K3 ou K4 Alors Ecrire "Date valide"
Sinon Ecrire "Date non valide" FinSi Fin Tout est alors rgl avec quelques variables boolennes et quelques conditions composes, en un minimum de lignes de code. La morale de ce long exercice - et non moins long corrig, c'est qu'un problme de test un peu compliqu admet une pliade de solutions justes... ...Mais que certaines sont plus astucieuses que d'autres ! -
Exercice 5.1
Variable N en Entier Debut N 0 Ecrire "Entrez un nombre entre 1 et 3" TantQue N < 1 ou N > 3 Lire N Si N < 1 ou N > 3 Alors Ecrire "Saisie errone. Recommencez FinSi FinTantQue Fin -
Exercice 5.2
Variable N en Entier Debut N 0 Ecrire "Entrez un nombre entre 10 et 20" TantQue N < 10 ou N > 20 Lire N Si N < 10 Alors Ecrire "Plus grand !" SinonSi N > 20 Alors Ecrire "Plus petit !" FinSi FinTantQue Fin -
Exercice 5.3
Variables N, i Debut Ecrire "Entrez Lire N Ecrire "Les 10 Pour i N + 1 Ecrire i i Suivant Fin en Entier un nombre : " nombres suivants sont : " N + 10
Exercice 5.4
Variables N, i en Entier Debut Ecrire "Entrez un nombre : " Lire N Ecrire "La table de multiplication de ce nombre est : " Pour i 1 10 Ecrire N, " x ", i, " = ", n*i i Suivant Fin -
Exercice 5.5
Variables N, i, Som en Entier Debut Ecrire "Entrez un nombre : " Lire N Som 0 Pour i 1 N Som Som + i i Suivant Ecrire "La somme est : ", Som Fin -
Exercice 5.6
Variables N, i, F en Entier Debut Ecrire "Entrez un nombre : " Lire N F 1 Pour i 2 N F F * i i Suivant Ecrire "La factorielle est : ", F Fin -
Exercice 5.7
Variables N, i, PG en Entier Debut PG 0 Pour i 1 20 Ecrire "Entrez un nombre : " Lire N Si i = 1 ou N > PG Alors PG N FinSi i Suivant Ecrire "Le nombre le plus grand tait : ", PG Fin En ligne 3, on peut mettre nimporte quoi dans PG, il suffit que cette variable soit affecte pour que le premier passage en ligne 7 ne provoque pas d'erreur. Pour la version amliore, cela donne : Variables N, i, PG, IPG en Entier Debut PG 0 Pour i 1 20 Ecrire "Entrez un nombre : " Lire N Si i = 1 ou N > PG Alors PG N IPG i FinSi i Suivant Ecrire "Le nombre le plus grand tait : ", PG Ecrire "Il a t saisi en position numro ", IPG Fin -
Exercice 5.8
Variables N, i, PG, IPG en Entier Debut N 1 i 0 PG 0 TantQue N <> 0
Ecrire "Entrez un nombre : " Lire N i i + 1 Si i = 1 ou N > PG Alors PG N IPG i FinSi FinTantQue Ecrire "Le nombre le plus grand tait : ", PG Ecrire "Il a t saisi en position numro ", IPG Fin -
Exercice 5.9
Variables E, somdue, M, Reste, Nb10E, Nb5E En Entier Debut E 1 somdue 0 TantQue E <> 0 Ecrire "Entrez le montant : " Lire E somdue somdue + E FinTantQue Ecrire "Vous devez :", somdue, " euros" Ecrire "Montant vers :" Lire M Reste M - somdue Nb10E 0 TantQue Reste >= 10 Nb10E Nb10E + 1 Reste Reste 10 FinTantQue Nb5E 0 Si Reste >= 5 Nb5E 1 Reste Reste 5 FinSi Ecrire "Rendu de la monnaie :" Ecrire "Billets de 10 E : ", Nb10E Ecrire "Billets de 5 E : ", Nb5E Ecrire "Pices de 1 E : ", reste Fin
Exercice 5.10
Spontanment, on est tent d'crire l'algorithme suivant : Variables N, P, i, Num, Dno1, Dno2 en Entier Debut Ecrire "Entrez le nombre de chevaux partants : " Lire N Ecrire "Entrez le nombre de chevaux jous : " Lire P Num 1 Pour i 2 N Num Num * i i Suivant Dno1 1 Pour i 2 N-P Dno1 Dno1 * i i Suivant Dno2 1 Pour i 2 P Dno2 Dno2 * i i Suivant Ecrire "Dans lordre, une chance sur ", Num / Dno1 Ecrire "Dans le dsordre, une sur ", Num / (Dno1 * Dno2) Fin Cette version, formellement juste, comporte tout de mme deux faiblesses. La premire, et la plus grave, concerne la manire dont elle calcule le rsultat final. Celui-ci est le quotient d'un nombre par un autre ; or, ces nombres auront rapidement tendance tre trs grands. En calculant, comme on le fait ici, d'abord le numrateur, puis ensuite le dnominateur, on prend le risque de demander la machine de stocker des nombres trop grands pour qu'elle soit capable de les coder (cf. le prambule). C'est d'autant plus bte que rien ne nous oblige procder ainsi : on n'est pas oblig de passer par la division de deux trs grands nombres pour obtenir le rsultat voulu. La deuxime remarque est qu'on a programm ici trois boucles successives. Or, en y regardant bien, on peut voir qu'aprs simplification de la formule, ces trois boucles comportent le mme nombre de tours ! (si vous ne me croyez pas, crivez un exemple de calcul et biffez les nombres identiques au numrateur et au dnominateur). Ce triple calcul (ces trois boucles) peut donc tre ramen(es) un(e) seul(e). Et voil le travail, qui est non seulement bien plus court, mais aussi plus performant : Variables N, P, i, A, B en Numrique Debut Ecrire "Entrez le nombre de chevaux partants : "
Lire N Ecrire "Entrez le nombre de chevaux jous : " Lire P A 1 B 1 Pour i 1 P A A * (i + N - P) B B * i i Suivant Ecrire "Dans lordre, une chance sur ", A Ecrire "Dans le dsordre, une chance sur ", A / B Fin -
Exercice 6.2
Tableau Debut Truc(0) Truc(1) Truc(2) Truc(3) Truc(4) Truc(5) en Caractre "a" "e" "i" "o" "u"
Exercice 6.3
Tableau Notes(8) en Numrique Variable i en Numrique Pour i 0 8 Ecrire "Entrez la note numro ", i + 1 Lire Notes(i) i Suivant Fin -
Exercice 6.4
Cet algorithme remplit un tableau avec six valeurs : 0, 1, 4, 9, 16, 25. Il les crit ensuite lcran. Simplification : Tableau Nb(5) en Numrique Variable i en Numrique Dbut Pour i 0 5 Nb(i) i * i Ecrire Nb(i) i Suivant Fin -
Exercice 6.5
Cet algorithme remplit un tableau avec les sept valeurs : 1, 3, 5, 7, 9, 11, 13. Il les crit ensuite lcran. Simplification : Tableau N(6) en Numrique Variables i, k en Numrique Dbut N(0) 1 Ecrire N(0) Pour k 1 6 N(k) N(k-1) + 2 Ecrire N(k)
k Suivant Fin -
Exercice 6.6
Cet algorithme remplit un tableau de 8 valeurs : 1, 1, 2, 3, 5, 8, 13, 21 -
Exercice 6.7
Variable S en Numrique Tableau Notes(8) en Numrique Debut s 0 Pour i 0 8 Ecrire "Entrez la note n ", i + 1 Lire Notes(i) s s + Notes(i) i Suivant Ecrire "Moyenne :", s/9 Fin -
Exercice 6.8
Variables Nb, Nbpos, Nbneg en Numrique Tableau T() en Numrique Debut Ecrire "Entrez le nombre de valeurs :" Lire Nb Redim T(Nb-1) Nbpos 0 Nbneg 0 Pour i 0 Nb - 1 Ecrire "Entrez le nombre n ", i + 1 Lire T(i) Si T(i) > 0 alors Nbpos Nbpos + 1 Sinon Nbneg Nbneg + 1 Finsi i Suivant
Ecrire "Nombre de valeurs positives : ", Nbpos Ecrire "Nombre de valeurs ngatives : ", Nbneg Fin -
Exercice 6.9
Variables i, Som, N en Numrique Tableau T() en Numrique Debut (on ne programme pas la saisie du tableau, dont on suppose quil compte N lments) Redim T(N-1) Som 0 Pour i 0 N - 1 Som Som + T(i) i Suivant Ecrire "Somme des lments du tableau : ", Som Fin -
Exercice 6.10
Variables i, N en Numrique Tableaux T1(), T2(), T3() en Numrique Debut (on suppose que T1 et T2 comptent N lments, et quils sont dj saisis) Redim T3(N-1) Pour i 0 N - 1 T3(i) T1(i) + T2(i) i Suivant Fin -
Exercice 6.11
Variables i, j, N1, N2, S en Numrique Tableaux T1(), T2() en Numrique Debut
On ne programme pas la saisie des tableaux T1 et T2. On suppose que T1 possde N1 lments, et que T2 en possde T2) S 0 Pour i 0 N1 1 Pour j 0 N2 1 S S + T1(i) * T2(j) j Suivant i Suivant Ecrire "Le schtroumpf est : ", S Fin -
Exercice 6.12
Variables Nb, i en Numrique Tableau T() en Numrique Debut Ecrire "Entrez le nombre de valeurs : " Lire Nb Redim T(Nb-1) Pour i 0 Nb - 1 Ecrire "Entrez le nombre n ", i + 1 Lire T(i) i Suivant Ecrire "Nouveau tableau : " Pour i 0 Nb 1 T(i) T(i) + 1 Ecrire T(i) i Suivant Fin -
Exercice 6.13
Variables Nb, Posmaxi en Numrique Tableau T() en Numrique Ecrire "Entrez le nombre de valeurs :" Lire Nb Redim T(Nb-1) Pour i 0 Nb - 1 Ecrire "Entrez le nombre n ", i + 1
Lire T(i) i Suivant Posmaxi 0 Pour i 0 Nb - 1 Si T(i) > T(Posmaxi) alors Posmaxi i Finsi i Suivant Ecrire "Element le plus grand : ", T(Posmaxi) Ecrire "Position de cet lment : ", Posmaxi Fin -
Exercice 6.14
Variables Nb, i, Som, Moy, Nbsup en Numrique Tableau T() en Numrique Debut Ecrire "Entrez le nombre de notes saisir : " Lire Nb Redim T(Nb-1) Pour i 0 Nb - 1 Ecrire "Entrez le nombre n ", i + 1 Lire T(i) i Suivant Som 0 Pour i 0 Nb - 1 Som Som + T(i) i Suivant Moy Som / Nb NbSup 0 Pour i 0 Nb - 1 Si T(i) > Moy Alors NbSup NbSup + 1 FinSi i Suivant Ecrire NbSup, " lves dpassent la moyenne de la classe" Fin -
Exercice 7.2
On suppose que N est le nombre dlments du tableau. Tri par insertion : Pour i 0 N - 2 posmaxi = i Pour j i + 1 N - 1 Si t(j) > t(posmaxi) alors posmaxi j Finsi j suivant temp t(posmaxi) t(posmaxi) t(i) t(i) temp i suivant Fin Tri bulles : Yapermut Vrai TantQue Yapermut Yapermut Faux Pour i 0 N - 2 Si t(i) < t(i + 1) Alors temp t(i) t(i) t(i + 1) t(i + 1) temp Yapermut Vrai Finsi i suivant FinTantQue Fin -
Exercice 7.3
On suppose que n est le nombre dlments du tableau pralablement saisi Pour i 0 (N-1)/2
Exercice 7.4
Ecrire "Rang de la valeur supprimer ?" Lire S Pour i S N-2 T(i) T(i+1) i suivant Redim T(N1) Fin -
Exercice 7.5
N est le nombre d'lments du tableau Dico(), contenant les mots du dictionnaire, tableau pralablement rempli. Variables Sup, Inf, Comp en Entier Variables Fini en Boolen Dbut Ecrire "Entrez le mot vrifier" Lire Mot On dfinit les bornes de la Algorithme : Exercices Niveau du tableau considrer Sup N - 1 Inf 0 Fini Faux TantQue Non Fini Comp dsigne l'indice de l'lment comparer. En bonne rigueur, il faudra veiller ce que Comp soit bien un nombre entier, ce qui pourra s'effectuer de diffrentes manires selon les langages. Comp (Sup + Inf)/2 Si le mot se situe avant le point de comparaison, alors la borne suprieure change, la borne infrieure ne bouge pas.
Si Mot < Dico(Comp) Alors Sup Comp - 1 Sinon, c'est l'inverse Sinon Inf Comp + 1 FinSi Fini Mot = Dico(Comp) ou Sup < Inf FinTantQue Si Mot = Dico(Comp) Alors Ecrire "le mot existe" Sinon Ecrire "Il n'existe pas" Finsi Fin -
Exercice 8.2
Cet algorithme remplit un tableau de la manire suivante: X(0, 0) = 1 X(0, 1) = 2 X(0, 2) = 3 X(1, 0) = 4
X(1, 1) = 5 X(1, 2) = 6 Il crit ensuite ces valeurs lcran, dans cet ordre. -
Exercice 8.3
Cet algorithme remplit un tableau de la manire suivante: X(0, 0) = 1 X(1, 0) = 4 X(0, 1) = 2 X(1, 1) = 5 X(0, 2) = 3 X(1, 2) = 6 Il crit ensuite ces valeurs lcran, dans cet ordre. -
Exercice 8.4
Cet algorithme remplit un tableau de la manire suivante: T(0, 0) = 0 T(0, 1) = 1 T(1, 0) = 1 T(1, 1) = 2 T(2, 0) = 2 T(2, 1) = 3 T(3, 0) = 3 T(3, 1) = 4 Il crit ensuite ces valeurs lcran, dans cet ordre. -
Exercice 8.5
Version a : cet algorithme remplit un tableau de la manire suivante: T(0, 0) = 1 T(0, 1) = 2 T(1, 0) = 3 T(1, 1) = 4 T(2, 0) = 5 T(2, 1) = 6 T(3, 0) = 7 T(3, 1) = 8
Il crit ensuite ces valeurs lcran, dans cet ordre. Version b : cet algorithme remplit un tableau de la manire suivante: T(0, 0) = 1 T(0, 1) = 5 T(1, 0) = 2 T(1, 1) = 6 T(2, 0) = 3 T(2, 1) = 7 T(3, 0) = 4 T(3, 1) = 8 Il crit ensuite ces valeurs lcran, dans cet ordre. -
Exercice 8.6
Variables i, j, iMax, jMax en Numrique Tableau T(12, 8) en Numrique Le principe de la recherche dans un tableau deux dimensions est strictement le mme que dans un tableau une dimension, ce qui ne doit pas nous tonner. La seule chose qui change, c'est qu'ici le balayage requiert deux boucles imbriques, au lieu d'une seule. Debut ... iMax 0 jMax 0 Pour i 0 12 Pour j 0 8 Si T(i,j) > T(iMax,jMax) Alors iMax i jMax j FinSi j Suivant i Suivant Ecrire "Le plus grand lment est ", T(iMax, jMax) Ecrire "Il se trouve aux indices ", iMax, "; ", jMax Fin -
Exercice 8.7
Variables i, j , posi, posj, i2, j2 en Entier Variables Correct, MoveOK en Boolen
Tableau Damier(7, 7) en Boolen Tableau Mouv(3, 1) en Entier Le damier contenant un seul pion, on choisit de le coder l'conomie, en le reprsentant par un tableau de boolens deux dimensions. Dans chacun des emplacements de ce damier, Faux signifie l'absence du pion, Vrai sa prsence. Par ailleurs, on emploie une mchante astuce, pas obligatoire, mais bien pratique dans beaucoup de situations. L'ide est de faire correspondre les choix possibles de l'utilisateur avec les mouvements du pion. On entre donc dans un tableau Mouv deux dimensions, les dplacements du pion selon les quatre directions, en prenant soin que chaque ligne du tableau corresponde une saisie de lutilisateur. La premire valeur tant le dplacement en i, la seconde le dplacement en j. Ceci nous pargnera par la suite de faire quatre fois les mmes tests. Debut Choix 0 : pion en haut droite Mouv(0, 0) -1 Mouv(0, 1) -1 Choix 1 : pion en haut droite Mouv(1, 0) -1 Mouv(1, 1) 1 Choix 2 : pion en bas gauche Mouv(2, 0) 1 Mouv(2, 1) -1 Choix 3 : pion en bas droite Mouv(3, 0) 1 Mouv(3, 1) 1 Initialisation du damier; le pion nest pour le moment nulle part Pour i 0 7 Pour j 0 7 Damier(i, j) Faux j suivant i suivant Saisie de la coordonne en i ("posi") avec contrle de saisie Correct Faux TantQue Non Correct Ecrire "Entrez la ligne de votre pion: " Lire posi Si posi >= 0 et posi <= 7 Alors Correct vrai
Finsi Fintantque Saisie de la coordonne en j ("posj") avec contrle de saisie Correct Faux TantQue Non Correct Ecrire "Entrez la colonne de votre pion: " Lire posj Si posj >= 0 et posj <= 7 Alors Correct Vrai Finsi Fintantque Positionnement du pion sur le damier virtuel. Damier(posi, posj) Vrai Saisie du dplacement, avec contrle Ecrire "Quel dplacement ?" Ecrire " - 0: en haut gauche" Ecrire " - 1: en haut droite" Ecrire " - 2: en bas gauche" Ecrire " - 3: en bas droite" Correct Faux TantQue Non Correct Lire Dep Si Dep >= 0 et Dep <= 3 Alors Correct Vrai FinSi FinTantQue i2 et j2 sont les futures coordonnes du pion. La variable boolenne MoveOK vrifie la validit de ce futur emplacement i2 posi + Mouv(Dep, 0) j2 posj + Mouv(Dep, 1) MoveOK i2 >= 0 et i2 <= 7 et j2 >= 0 et j2 <= 7 Cas o le dplacement est valide Si MoveOK Alors Damier(posi, posj) Faux Damier(i2, j2) Vrai Affichage du nouveau damier Pour i 0 7 Pour j 0 7
Si Damier(i, j) Alors Ecrire " O "; Sinon Ecrire " X "; FinSi j suivant Ecrire "" i suivant Sinon Cas o le dplacement nest pas valide Ecrire "Mouvement impossible" FinSi Fin -
Exercice 9.2
Vous tiez prvenus, c'est bte comme chou ! Il suffit de se servir de la fonction Len, et c'est rgl : Variable Mot en Caractre Variable Nb en Entier Debut Ecrire "Entrez un mot : " Lire Mot Nb Len(Mot)
Exercice 9.3
L, on est oblig de compter par une boucle le nombre d'espaces de la phrase, et on en dduit le nombre de mots. La boucle examine les caractres de la phrase un par un, du premier au dernier, et les compare l'espace. Variable Bla en Caractre Variables Nb, i en Entier Debut Ecrire "Entrez une phrase : " Lire Bla Nb 0 Pour i 1 Len(Bla) Si Mid(Bla, i , 1) = " " Alors Nb Nb + 1 FinSi i suivant Ecrire "Cette phrase compte ", Nb + 1, " mots" Fin -
Exercice 9.4
Solution 1 : pour chaque caractre du mot, on pose une trs douloureuse condition compose. Le moins que l'on puisse dire, c'est que ce choix ne se distingue pas par son lgance. Cela dit, il marche, donc aprs tout, pourquoi pas. Variable Bla en Caractre Variables Nb, i, j en Entier Debut Ecrire "Entrez une phrase : " Lire Bla Nb 0 Pour i 1 Len(Bla) Si Mid(Bla, i, 1) = "a" ou Mid(Bla, i, 1) = "e" ou Mid(Bla, i, 1) = "i" ou Mid(Bla, i, 1) = "o" ou Mid(Bla, i, 1) = "u" ou Mid(Bla, i, 1) = "y" Alors Nb Nb + 1 FinSi
i suivant Ecrire "Cette phrase compte ", Nb, " voyelles" Fin Solution 2 : on stocke toutes les voyelles dans une chane. Grce la fonction Trouve, on dtecte immdiatement si le caractre examin est une voyelle ou non. C'est nettement plus sympathique... Variables Bla, Voy en Caractre Variables Nb, i, j en Entier Debut Ecrire "Entrez une phrase : " Lire Bla Nb 0 Voy "aeiouy" Pour i 1 Len(Bla) Si Trouve(Voy, Mid(Bla, i, 1)) <> 0 Alors Nb Nb + 1 FinSi i suivant Ecrire "Cette phrase compte ", Nb, " voyelles" Fin -
Exercice 9.5
Il n'existe aucun moyen de supprimer directement un caractre d'une chane autrement qu'en procdant par collage. Il faut donc concatner ce qui se trouve gauche du caractre supprimer, avec ce qui se trouve sa droite. Attention aux paramtres des fonctions Mid, ils n'ont rien d'vident ! Variable Bla en Caractre Variables Nb, i, j en Entier Dbut Ecrire "Entrez une phrase : " Lire Bla Ecrire "Entrez le rang du caractre supprimer : " Lire Nb L Len(Bla) Bla Mid(Bla, 1, Nb 1) & Mid(Bla, Nb + 1, L Nb) Ecrire "La nouvelle phrase est : ", Bla Fin -
Exercice 9.6
Sur l'ensemble des exercices de cryptographie, il y a deux grandes stratgies possibles : - soit transformer les caractres en leurs codes ASCII. L'algorithme revient donc ensuite traiter des nombres. Une fois ces nombres transforms, il faut les reconvertir en caractres. - soit en rester au niveau des caractres, et procder directement aux transformations ce niveau. C'est cette dernire option qui est choisie ici, et pour tous les exercices de cryptographie venir. Pour cet exercice, il y a une rgle gnrale : pour chaque lettre, on dtecte sa position dans l'alphabet, et on la remplace par la lettre occupant la position suivante. Seul cas particulier, la vingt-sixime lettre (le Z) doit tre code par la premire (le A), et non par la vingt-septime, qui n'existe pas ! Variables Bla, Cod, Alpha en Caractre Variables i, Pos en Entier Dbut Ecrire "Entrez la phrase coder : " Lire Bla Alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Cod "" Pour i 1 Len(Bla) Let Mid(Bla, i, 1) Si Let <> "Z" Alors Pos Trouve(Alpha, Let) Cod Cod & Mid(Alpha, Pos + 1, 1) Sinon Cod Cod & "A" FinSi i Suivant Bla Cod Ecrire "La phrase code est : ", Bla Fin -
Exercice 9.7
Cet algorithme est une gnralisation du prcdent. Mais l, comme on ne connat pas d'avance le dcalage appliquer, on ne sait pas a priori combien de "cas particuliers", savoir de dpassements au-del du Z, il va y avoir. Il faut donc trouver un moyen simple de dire que si on obtient 27, il faut en ralit prendre la lettre numro 1 de l'alphabet, que si on obtient 28, il faut en ralit prendre la numro 2, etc. Ce moyen simple existe : il faut considrer le reste de la division par 26, autrement dit le modulo. Il y a une petite ruse supplmentaire appliquer, puisque 26 doit rester 26 et ne pas devenir 0. Variable Bla, Cod, Alpha en Caractre Variables i, Pos, Dcal en Entier
Dbut Ecrire "Entrez le dcalage appliquer : " Lire Dcal Ecrire "Entrez la phrase coder : " Lire Bla Alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Cod "" Pour i 1 Len(Bla) Let Mid(Bla, i, 1) Pos Trouve(Alpha, Let) NouvPos Mod(Pos + Dcal, 26) Si NouvPos = 0 Alors NouvPos 26 FinSi Cod Cod & Mid(Alpha, NouvPos, 1) i Suivant Bla Cod Ecrire "La phrase code est : ", Bla Fin -
Exercice 9.8
L, c'est assez direct. Variable Bla, Cod, Alpha en Caractre Variables i, Pos, Dcal en Entier Dbut Ecrire "Entrez lalphabet cl : " Lire Cl Ecrire "Entrez la phrase coder : " Lire Bla Alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Cod "" Pour i 1 Len(Bla) Let Mid(Bla, i, 1) Pos Trouve(Alpha, Let) Cod Cod & Mid(Cl, Pos, 1) i Suivant Bla Cod Ecrire "La phrase code est : ", Bla Fin -
Exercice 9.9
Le codage de Vigenre nest pas seulement plus difficile briser; il est galement un peu plus raide programmer. La difficult essentielle est de comprendre quil faut deux boucles: lune pour parcourir la phrase coder, lautre pour parcourir la cl. Mais quand on y rflchit bien, ces deux boucles ne doivent surtout pas tre imbriques. Et en ralit, quelle que soit la manire dont on l'crit, elle nen forment quune seule. Variables Alpha, Bla, Cod, Cl, Let en Caractre Variables i, Pos, PosCl, Dcal en Entier Dbut Ecrire "Entrez la cl : " Lire Cl Ecrire "Entrez la phrase coder : " Lire Bla Alpha "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Cod "" PosCl 0 Pour i 1 Len(Bla) On gre la progression dans la cl. Jai effectu cela " la main" par une boucle, mais un joli emploi de la fonction Modulo aurait permis une programmation en une seule ligne! Poscl Poscl + 1 Si PosCl > Len(Cl) Alors PosCl 1 FinSi On dtermine quelle est la lettre cl et sa position dans lalphabet LetCl Mid(Cl, PosCl, 1) PosLetCl Trouve(Alpha, LetCl) On dtermine la position de la lettre coder et le dcalage appliquer. L encore, une solution alternative aurait t demployer Mod : cela nous aurait pargn le Si Let Mid(Bla, i, 1) Pos Trouve(Alpha, Let) NouvPos Pos + PosLetCl - 1 Si NouvPos > 26 Alors NouvPos NouvPos 26 FinSi Cod Cod & Mid(Alpha, NouvPos, 1) i Suivant Bla Cod Ecrire "La phrase code est : ", Bla Fin
Exercice 9.10
On en revient des choses plus simples... Variable Nb en Entier Ecrire "Entrez votre nombre : " Lire Nb Si Nb/2 = Ent(Nb/2) Alors Ecrire "Ce nombre est pair" Sinon Ecrire "Ce nombre est impair" FinSi Fin -
Exercice 9.11
a) b) c) d) e) f) Glup Glup Glup Glup Glup Glup Alea() * 2 Alea() * 2 - 1 Alea() * 0,30 + 1,35 Ent(Alea() * 6) + 1 Alea() * 17 10,5 Ent(Alea()*6) + Ent(Alea()*6) + 2 -
Exercice 10.2
Variable Truc en Caractre Variable i en Entier Debut Ouvrir "Exemple.txt" sur 5 en Lecture
Tantque Non EOF(5) LireFichier 5, Truc Pour i 1 Len(Truc) Si Mid(Truc, i, 1) = "/" Alors Ecrire " " Sinon Ecrire Mid(Truc, i, 1) FinSi i Suivant FinTantQue Fermer 5 -
Exercice 10.3
Variables Nom * 20, Prnom * 17, Tel * 10, Mail * 20, Lig en Caractre Debut Ecrire "Entrez le nom : " Lire Nom Ecrire "Entrez le prnom : " Lire Prnom Ecrire "Entrez le tlphone : " Lire Tel Ecrire "Entrez le nom : " Lire Mail Lig Nom & Prnom & Tel & Mail Ouvrir "Adresse.txt" sur 1 pour Ajout EcrireFichier 1, Lig Fermer 1 Fin -
Exercice 10.4
L, comme indiqu dans le cours, on passe par un tableau de strutures en mmoire vive, ce qui est la technique la plus frquemment employe. Le tri - qui est en fait un simple test - sera effectu sur le premier champ (nom). Structure Bottin Nom en Caractre * 20 Prnom en Caractre * 15 Tel en Caractre * 10 Mail en Caractre * 20
Fin Structure Tableau Mespotes() en Bottin Variables MonPote, Nouveau en Bottin Variables i, j en Numrique Debut Ecrire "Entrez le nom : " Lire Nouveau.Nom Ecrire "Entrez le prnom : " Lire Nouveau.Prnom Ecrire "Entrez le tlphone : " Lire Nouveau.Tel Ecrire "Entrez le mail : Lire Nouveau.Mail On recopie l'intgralit de "Adresses" dans MesPotes(). Et aprs tout, c'est l'occasion : quand on tombe au bon endroit, on insre subrepticement notre nouveau copain dans le tableau. Ouvrir "Adresse.txt" sur 1 pour Lecture i -1 insr Faux Tantque Non EOF(1) i i + 1 Redim MesPotes(i) LireFichier 1, MonPote Si MonPote.Nom > Nouveau.Nom et Non Insr Alors MesPotes(i) Nouveau Insr Vrai i i + 1 Redim MesPotes(i) FinSi MesPotes(i) MonPote FinTantQue Fermer 1 Si Non Insr Alors i i + 1 Redim MesPotes(i) MesPotes(i) Nouveau Insr Vrai FinSi Et le tour est quasiment jou. Il ne reste plus qu' rebalancer tel quel l'intgralit du tableau MesPotes dans le fichier, en crasant l'ancienne version. Ouvrir quot;Adresse.txt" sur 1 pour Ecriture Pour j 0 i
Exercice 10.5
C'est un peu du mme tonneau que ce qu'on vient de faire, quelques variantes prs. Il y a essentiellement une petite gestion de flag pour faire bonne mesure. Structure Bottin Nom en Caractre * 20 Prnom en Caractre * 15 Tel en caractre * 10 Mail en Caractre * 20 Fin Structure Tableau Mespotes() en Bottin Variables MonPote en Bottin Variables Ancien, Nouveau en Caractre*20 Variables i, j en Numrique Variable Trouv en Boolen Debut Ecrire "Entrez le nom modifier : " Lire Ancien Ecrire "Entrez le nouveau nom : " Lire Nouveau On recopie l'intgralit de "Adresses" dans Fic, tout en recherchant le clampin. Si on le trouve, on procde la modification. Ouvrir Adresse.txt sur 1 pour Lecture i -1 Trouv Faux Tantque Non EOF(1) i i + 1 Redim MesPotes(i) LireFichier 1, MonPote Si MonPote.Nom = Ancien.Nom Alors Trouv Vrai MonPote.Nom Nouveau FinSi MesPotes(i) MonPote FinTantQue Fermer 1
On recopie ensuite l'intgralit de Fic dans "Adresse" Ouvrir "Adresse.txt" sur 1 pour Ecriture Pour j 0 i EcrireFichier 1, MesPotes(j) j Suivant Fermer 1 Et un petit message pour finir ! Si Trouv Alors Ecrire "Modification effectue" Sinon Ecrire "Nom inconnu. Aucune modification effectue" FinSi Fin -
Exercice 10.6
L, c'est un tri sur un tableau de structures, rien de plus facile. Et on est bien content de disposer des structures, autrement dit de ne se coltiner qu'un seul tableau... Structure Bottin Nom en Caractre * 20 Prnom en Caractre * 15 Tel en caractre * 10 Mail en Caractre * 20 Fin Structure Tableau Mespotes() en Bottin Variables Mini en Bottin Variables i, j en Numrique Debut On recopie l'intgralit de "Adresses" dans MesPotes... Ouvrir "Adresse.txt" sur 1 pour Lecture i -1 Tantque Non EOF(1) i i + 1 Redim MesPotes(i) LireFichier 1, MesPotes(i) FinTantQue Fermer 1 On trie le tableau selon l'algorithme de tri par insertion dj tudi, en utilisant le champ Nom de la structure :
Pour j 0 i - 1 Mini MesPotes(j) posmini j Pour k j + 1 i Si MesPotes(k).Nom < Mini.Nom Alors mini MesPotes(k) posmini k Finsi k suivant MesPotes(posmini) MesPotes(j) MesPotes(j) Mini j suivant On recopie ensuite l'intgralit du tableau dans "Adresse" Ouvrir "Adresse.txt" sur 1 pour Ecriture Pour j 0 i EcrireFichier 1, MesPotes(j) j suivant Fermer 1 Fin -
Exercice 10.7
Bon, celui-l est tellement idiot qu'on n'a mme pas besoin de passer par des tableaux en mmoire vive. Variable Lig en Caractre Dbut Ouvrir "Tutu.txt" sur 1 pour Ajout Ouvrir Toto.txt sur 2 pour Lecture Tantque Non EOF(2) LireFichier 2, Lig EcrireFichier 1, Lig FinTantQue Fermer 2 Ouvrir Tata.txt sur 3 pour Lecture Tantque Non EOF(3) LireFichier 3, Lig EcrireFichier 1, Lig FinTantQue Fermer 3 Fermer 1 Fin
Exercice 10.8
On va liminer les mauvaises entres ds la recopie : si l'enregistrement ne prsente pas un mail valide, on l'ignore, sinon on le copie dans le tableau. Structure Bottin Nom en Caractre * 20 Prnom en Caractre * 15 Tel en caractre * 10 Mail en Caractre * 20 Fin Structure Tableau Mespotes() en Bottin Variable MonPote en Bottin Variables i, j en Numrique Debut On recopie "Adresses" dans MesPotes en testant le mail... Ouvrir "Adresse.txt" sur 1 pour Lecture i -1 Tantque Non EOF(1) LireFichier 1, MonPote nb 0 Pour i 1 Len(MonPote.Mail) Si Mid(MonPote.Mail, i, 1) = "@" Alors nb nb + 1 FinSi i suivant Si nb = 1 Alors i i + 1 Redim MesPotes(i) MesPotes(i) MonPote FinSi FinTantQue Fermer 1 On recopie ensuite l'intgralit de Fic dans "Adresse" Ouvrir "Adresse.txt" sur 1 pour Ecriture Pour j 0 i EcrireFichier 1, MesPotes(j) j Suivant Fermer 1 Fin
Exercice 10.9
Une fois de plus, le passage par un tableau de structures est une stratgie commode. Attention toutefois, comme il s'agit d'un fichier texte, tout est stock en caractre. Il faudra donc convertir en numrique les caractres reprsentant les ventes, pour pouvoir effectuer les calculs demands. Pour le traitement, il y a deux possibilits. Soit on recopie le fichier l'identique dans un premier tableau, et on traite ensuite ce tableau pour faire la somme par vendeur. Soit on fait le traitement directement, ds la lecture du fichier. C'est cette option qui est choisie dans ce corrig. Structure Vendeur Nom en Caractre * 20 Montant en Numrique Fin Structure Tableau MesVendeurs() en Vendeur Variables NomPrec * 20, Lig, Nom en caractre Variables Somme, Vente en Numrique On balaye le fichier en faisant nos additions. Ds que le nom a chang (on est pass au vendeur suivant), on range le rsultat et on remet tout zro Debut Ouvrir "Ventes.txt sur 1 pour Lecture i -1 Somme 0 NomPrc "" Tantque Non EOF(1) LireFichier 1, Lig Nom Mid(Lig, 1, 20) Vente CNum(Mid(Lig, 21, 10) Si Nom = NomPrec Alors Somme Somme + Vente Sinon i i + 1 Redim MesVendeurs(i) MesVendeurs(i).Nom NomPrec MesVendeurs(i).Montant Somme Somme 0 NomPrec Nom FinSi FinTantQue Et n'oublions pas un petit tour de plus pour le dernier de ces messieurs-dames
i i + 1 Redim MesVendeurs(i) MesVendeurs(i).Nom NomPrec MesVendeurs(i).Montant Somme Fermer 1 Pour terminer, on affiche le tableau l'cran Pour j 0 i Ecrire MesVendeurs(j) j suivant Fin -
Exercice 11.2
Fonction NbVoyelles(Mot en Caractre) Variables i, nb en Numrique nb 0 Pour i 1 Len(Mot) Si Trouve("aeiouy", Mid(Mot, i, 1)) <> 0 Alors nb nb + 1 FinSi i suivant Renvoyer nb FinFonction -
Exercice 11.3
Fonction Trouve(a, b) Variable i en Numrique Dbut i 1 TantQue i < Len(a) - Len(b) et b <> Mid(a, i, Len(b)) i i + 1 FinTantQue Si b <> Mid(a, i, Len(b)) Alors Renvoyer 0 Sinon Renvoyer i FinFonction -
Exercice 11.4
Fonction PurgeSimple(a, b) Variable Sortie en Caractre Variable i en Numrique Dbut Sortie '' Pour i 1 Len(a) Si Mid(a, i, 1) <> b Alors Sortie Sortie & Mid(a, i, 1) FinSi i suivant Renvoyer Sortie FinFonction -
Exercice 11.5
Fonction PurgeMultiple(a, b) Variable Sortie en Caractre Variable i en Numrique Dbut Sortie '' Pour i 1 Len(a) Si Trouve(b, Mid(a, i, 1)) = 0 Alors Sortie Sortie & Mid(a, i, 1) FinSi
Exercice 11.6
Fonction TriTableau(T, n) Variables i, posmini, temp en Numrique Dbut Pour i 0 n-2 posmini i Pour j i + 1 n-1 Si t(j) < t(posmini) Alors posmini j Finsi j suivant temp T(posmini) T(posmini) T(i) T(i) temp i suivant Renvoyer T FinFonction -
Exercice 11.7
Fonction TableauCroissant(T, n) Variable i en Numrique Variable Flag en Boolen Dbut Flag VRAI i 0 TantQue Flag et i < n-1 Flag T(i) < T(i+1) i i+1 FinTantQue Renvoyer Flag FinFonction -
Exercice 11.8
Procdure Inversion(X en Numrique par rfrence, Y en Numrique par rfrence) Variable Temp en Numrique Dbut Temp X X Y Y Temp FinProcdure -
Exercice 11.9
Fonction TriTableau(T, n, Variables i, pos, temp en Dbut Pour i 0 n-2 pos i Pour j i + 1 n-1 Si Croissant Alors Si t(j) < t(pos) pos j Finsi Sinon Si t(j) > t(pos) pos j Finsi Finsi j suivant temp T(pos) T(pos) T(i) T(i) temp i suivant Renvoyer T FinFonction Croissant) Numrique
Alors
Alors
Fonction TousDiffrents
Aucune difficult particulire pour ce module. Il suffit de respecter le cahier des charges : Fonction TousDiffrents(T(8) en num) en boolen Pour i 0 7 Pour j i+1 8
Procdure RemplitGrille
L non plus, rien signaler. On peut mme dire que c'est tout ballot. Procdure RemplitGrille(T(8, 8) en num par rfrence) Pour i 0 8 Pour j 0 8 T(i, j) Ent(Alea()*9)+1 j suivant i suivant FinProcdure
Fonction VerifLignes
L, tout le truc consiste trononner notre tableau en 9 lignes successives. Et chaque fois, on envoie la ligne la fonction TousDifferents. Si celle-ci retourne FAUX, la fonction VerifLignes, elle aussi, s'interrompt en renvoyant faux. Fonction VerifLignes(Grille(8, 8) en num) en boolen Tableau Ligne(8) en Num Pour i 0 8 Pour j 0 8 Ligne(j) Grille(i, j) j suivant Si TousDifferents(Ligne()) = faux Alors Renvoyer Faux FinSi i suivant Renvoyer Vrai FinFonction
Fonction VerifColonnes
Bon, une fois que le prcdent est fait, c'est presque du copier-coller un dtail prs, et c'est fingers in ze nose.
Fonction VerifColonnes(Grille(8, 8) en num) en boolen Tableau Colonne(8) en Num Pour j 0 8 Pour i 0 8 Ligne(i) Grille(i, j) i suivant Si TousDifferents(Ligne()) = faux Alors Renvoyer Faux FinSi j suivant Renvoyer Vrai FinFonction
Fonction VerifSousGrilles
Le mcanisme fondamental est videmment le mme que pour les deux fonctions prcdentes. Le truc pnible, c'est de raliser le dcoupage des 9 carrs de 3x3. Premire solution (barbare) on fait plein d'affectations la main. Deuxime solution (fte) on comprend que tout cela obit un schma rgulier, et on s'en sort avec une jolie srie de boucles imbriques. Fonction VerifSousGrilles(Grille(8, 8) en num) en boolen Tableau SousGrille(8) en Num Pour ancrei 0 6 pas 3 Pour ancrej 0 6 pas 3 Pour decali 0 2 Pour decalj 0 2 SousGrille(decali*3 + decalj) Grille(ancrei + decali, ancrej + decalj) decalj suivant decali suivant Si TousDifferents(SousGrille()) = faux Alors Renvoyer Faux FinSi ancrej suivant ancrei suivant Renvoyer Vrai FinFonction
Procdure principale
Avec ce qu'on a ralis prcdemment, c'est de la gnognote. On fait simplement gnrer la grille par la procdure idoine, et on recommence aussi longtemps que l'une des trois vrifications au moins nous dit que le rsultat cloche. Le tout tient en cinq lignes. Procdure principale() Tableau Grille(8, 8) en Num Appeler RemplitGrille(Grille()) Tant Que Non VerifLignes(Grille()) ou Non VerifColonnes(Grille()) ou Non VerifSousGrilles(Grille()) Appeler RemplitGrille(Grille()) FinTantQue> FinProcdure
D COUVREZ