• Aucun résultat trouvé

Corrigé du test algorithmique n

N/A
N/A
Protected

Academic year: 2022

Partager "Corrigé du test algorithmique n"

Copied!
4
0
0

Texte intégral

(1)

Corrigé du test algorithmique n 2

Exercice 1 : transformations de chaînes de caractères

É

CHANGE DE LETTRES

1) Une simple boucle explore la chaînech, et change le caractère courant si celui-ci est un’A’:

procedure AversE (var ch : s t r i n g ) ; var i : integer;

begin

for i := 1 to length ( ch ) do

i f ch [ i ] = ’A ’ then ch [ i ] := ’E ’ end; { AversE }

2) Il suffit de transformer un peu le test interne :

procedure AaversEe (var ch : s t r i n g ) ; var i : integer;

begin

for i := 1 to length ( ch ) do i f ch [ i ] = ’A ’

then ch [ i ] := ’E ’ else i f ch [ i ] = ’ a ’

then ch [ i ] := ’ e ’ end; { AversE }

J

AVANAISE

Ici, la chaîne retournée est construite caractère par caractère, par concaténation avec l’opérateur+. Le premier exemple montre l’utilisation astucieuse d’unefactorisationdeifimbriqués, le second l’utilisation d’uncase.

procedure javanaise ( ch : s t r i n g ; var chr : s t r i n g ) ; var

i : integer; a : char; begin

chr := ’ ’ ;

for i := 1 to length ( ch ) do begin a := ch [ i ]

i f ( a = ’A ’ ) or ( a = ’E ’ ) or ( a = ’ I ’ ) or ( a = ’O ’ ) or ( a = ’U ’ ) or ( a = ’ Y ’ ) then chr := chr + a + ’V ’ + a

else chr := chr + ch [ i ] end;

end; { javanaise }

(2)

procedure javanaisecase ( ch : s t r i n g ; var chr : s t r i n g ) ; var i : integer;

begin

chr := ’ ’ ;

for i := 1 to length ( ch ) do case ch [ i ] of

’A ’ : chr := chr + ’AVA ’ ;

’E ’ : chr := chr + ’EVE ’ ;

’ I ’ : chr := chr + ’ I V I ’ ;

’O ’ : chr := chr + ’OVO ’ ;

’U ’ : chr := chr + ’UVU ’ ;

’ Y ’ : chr := chr + ’YVY ’ ; else chr := chr + ch [ i ] end;

end; { javanaisecase }

Exercice 2 : remplissage de tableaux

R

EMPLISSAGE DE TABLEAUX Pour remplir un tableau, on utilise une boucle simple.

1) La procédure la plus simple : on met toutes les cases à0.

procedure i n i t _ t a b l e a u (var t : tableau ) ; var i : integer;

begin

for i := 1 to N do t [ i ] := 0 end; { i n i t _ t a b l e a u }

2) On peut procéder de deux façons différentes :

• initialiser toutes les cases à0puis changer le0de la case d’indiceien1: procedure unun_tableau (var t : tableau ; i : integer) ; var k : integer;

begin

for k := 1 to N do t [ k ] := 0;

t [ i ] := 1

end; { unun_tableau }

• mettre directement la bonne valeur dans chaque case à l’aide d’un test :

procedure unun_tableau_bis (var t : tableau ; i : integer) ; var k : integer;

begin

for k := 1 to N do

i f k= i then t [ k ] := 1 else t [ k ] := 0 end; { unun_tableau_bis }

La première version semble préférable, puisqu’elle évite la répétition du test à l’intérieur de la boucle.

La seconde méthode n’est meilleure que si l’on ne peut pas revenir en arrière (cas de l’écriture d’un fichier séquentiel), ou si le coût de l’écriture est largement supérieur à celui d’un test (cas de l’écriture sur un support très lent, et non bufferisé).

(3)

3) Voici deux versions de cette procédure de remplissage alterné :

• une première version, astucieuse, profite du fait que si xprend l’une des deux valeurs 0 ou1, 1-xprend l’autre :

procedure unzeroalt_tableau (var t : tableau ) ; var k : integer;

begin

t [ 1 ] := 1;

for k := 2 to N do t [ k ] := 1−t [ k−1]

end; { unzeroalt_tableau }

• une deuxième version qui limite au maximum les accès au tableaut: procedure unzeroalt_tableau_bis (var t : tableau ) ; var

k , d : integer; begin

d := 1;

for k := 1 to N do begin t [ k ] := d ;

i f d = 1 (∗ On change l a valeur de d ∗) then d := 0

else d := 1 end

end; { unzeroalt_tableau_bis }

R

EMPLISSAGE DE MATRICES

Le remplissage d’une matrice nécessite l’usage de deux boucles imbriquées, une qui explore les lignes, l’autre les colonnes.

1) L’initialisation à0est la procédure la plus simple :

procedure i n i t _ m a t r i c e (var a : matrice ) ; var i , j : integer;

begin

for i := 1 to P do for j := 1 to Q do

a [ i , j ] := 0 end; { i n i t _ m a t r i c e }

2) On reprend la première version de la procédure similaire pour les tableaux :

procedure unun_matrice (var a : matrice ; i , j : integer) ; var k , l : integer;

begin

for k := 1 to P do for l := 1 to Q do

a [ k , l ] := 0;

a [ i , j ] := 1

end; { unun_matrice }

(4)

3) Pour les mêmes raisons que précédemment, la version directe ne doit être préférée que si les écritures sont bien plus coûteuses que les tests.

• Première version :

procedure lico_mat_deux_temps (var a : matrice ; i , j : integer) ; var k , l : integer;

begin

for k := 1 to P do for l := 1 to Q do

a [ k , l ] := 0;

for k := 1 to P do a [ k , j ] := 1;

for l := 1 to Q do a [ i , l ] := 1 end; { lico_mat_deux_temps }

• deuxième version :

procedure l i c o _ m a t _ d i r e c t (var a : matrice ; i , j : integer) ; var k , l : integer;

begin

for k := 1 to P do for l := 1 to Q do

i f ( k= i ) or ( l = j ) then a [ k , l ] := 1 else a [ k , l ] := 0 end; { l i c o _ m a t _ d i r e c t } 4) On reprend l’astuce de la partie sur les tableaux.

procedure unzero_alt_matrice (var a : matrice ) ; var i , j , ds : integer;

begin

ds := 1; (∗ ds c o n t i e n t l a valeur de l a première ∗) (∗ case de l a l i g n e courante . ∗) for i := 1 to P do begin

a [ i , 1 ] := ds ; (∗ Première case de l a l i g n e j ∗) for j := 2 to Q do (∗ On r e m p l i t l a l i g n e j ∗)

a [ i , j ] := 1−a [ i , j−1];

ds := 1−ds (∗ On change l a valeur de ds ∗) end

end; { unzero_alt_matrice }

Références

Documents relatifs

b) Ecrire un algorithme qui permet de calculer puis d'afficher l'image d'un réel saisit en entrée, lorsque c'est possible.. En déduire l'ensemble de

Sommaire Introduction Syst` emes r´ epartis Notion de temps Algorithmes r´ epartis Complexit´ e(s) Mod´ elisation des r´ eseaux. Mod´elisation

On fera l’hypothèse suivante : le délai de propagation des messages entre les sites est connu et est égal à 3, (c'est à dire que quel que soit le message envoyé d'un site à

[r]

lente et limitante par sa vitesse) : départ du nucléofuge et formation d’un carbocation plan. rapide) : attaque du réactif nucléophile sur le carbocation, des

2 Le composé J est inactif à cause des contraintes stériques imposées par la

De plus, une entité chargée (RS - ) est meilleur nucléophile que la molécule neutre correspondante (CH 3 SH). Pour une SN 2 , on utilise des nucléophiles forts. c) CH 3 SH est

Écrire une fonction tableauprem(n,f) qui donne le tableau de valeurs d’une fonction f (comme dans le TD n°1 du thème Fonction), pour x entier variant de 0 à n, avec un test