You are on page 1of 56

Conseils pour crire du code

Problme rsoudre
Soit un tableau T:
int T[NB];
crire le code qui dcale les lments de T, tel que:
l'lment l'indice i se retrouve l'indice i-1,
le premier lment du tableau se retrouve la dernire place.
Par exemple:
Si le tableau contenait les valeurs: 0 1 2 3 4 (avec NB = 5),
il contiendra 1 2 3 4 0 aprs le dcalage.

1. Faire un schma;
2. Dcomposer le problme en problmes plus simples;
3. Rflchir sur un exemple, sans penser aux boucles ou
aux conditions;
4. Gnraliser, en crivant cette fois les boucles et les
conditions;
5. Vrifier le programme sur un exemple.

Schma
T:

Soit un tableau T:
int T[NB];
crire le code qui dcale les lments de T, tel que:
l'lment l'indice i se retrouve l'indice i-1,
le premier lment du tableau se retrouve la dernire place.
Par exemple, si le tableau contenait les valeurs: 1 2 3 4 5 (avec NB = 5), il contiendra
2 3 4 5 1 aprs ce dcalage.

Dcomposer le problme

T:

1
2

Il faut:
1. dcaler les lments 0, 1, ... vers la gauche;
2. grer correctement l'lment d'indice 0.

Dcaler les lments 0, 1, ... vers la gauche


Raisonner sur un exemple
T:

Dans le cas d'un tableau 5 lments (NB = 5), il faut:


copier T[1] dans T[0],
T[2] dans T[1]...
jusque T[4] dans T[3]:
T[0]
T[1]
T[2]
T[3]

=
=
=
=

T[1];
T[2];
T[3];
T[4];

Dcaler les lments 0, 1, ... vers la gauche


Gnraliser (1)
T:

Gnralisons un tableau NB lments (au lieu de 5):


"T[3] = T[4];" devient
T[NB-2] = T[NB-1];
T[0] = T[1];
T[1] = T[2];
...
T[NB-2] = T[NB-1];

Dcaler les lments 0, 1, ... vers la gauche


Gnraliser (2)
T:

Remplaons:
T[0] = T[1];
T[1] = T[2];
...
T[NB-2] = T[NB-1];

par une boucle for:


for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}
Une autre possibilit est:
for(int i(1); i < NB; ++i) {
T[i-1] = T[i];
}

Grer correctement l'lment d'indice 0


T:

2
Une premire solution est de faire (pour un tableau 5 lments):
T[4] = T[0];
ce qui se gnralise pour un tableau NB lments en:
T[NB-1] = T[0];

Premire solution
T:

T[NB-1] = T[0];
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}

Vrifier le code sur un exemple


T:

NB

5
T[NB-1] = T[0];
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}

Vrifier le code sur un exemple


T:

NB

5
T[NB-1] = T[0];
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}

Vrifier le code sur un exemple


T:

NB

5
T[NB-1] = T[0];
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}

Vrifier le code sur un exemple


T:

NB

5
T[NB-1] = T[0];
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}

Vrifier le code sur un exemple


T:

NB

5
T[NB-1] = T[0];
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}

Vrifier le code sur un exemple


T:

NB

5
T[NB-1] = T[0];
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}

Vrifier le code sur un exemple


T:

NB

5
T[NB-1] = T[0];
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}

Vrifier le code sur un exemple


T:

NB

5
T[NB-1] = T[0];
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}

!
T:

alors qu'on voulait:

Que s'est-il pass ?


T:

L'instruction:
T[NB-1] = T[0];
a effac le 4 avant que la boucle puisse le copier l'indice 3.
Comment corriger le code ?
T[NB-1] = T[0];
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}

Solution
T:

1.

2.
temp

3.

Il faut:
1. sauvegarder la valeur de T[0] dans une variable intermdiaire;
2. on peut maintenant dcaler les lments avec la boucle for;
3. recopier la valeur sauvegarde de T[0] dans T[NB-1].

Solution
T:

1.

2.
temp

3.

Il faut:
1. sauvegarder la valeur de T[0] dans une variable intermdiaire:
int temp(T[0]);
2. on peut maintenant dcaler les lments avec la boucle for:
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}
3. recopier la valeur sauvegarde (dans temp) de T[0] dans T[NB-1]:
T[NB-1] = temp;

Vrifier le code sur un exemple


NB

T:

int temp(T[0]);
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}
T[NB-1] = temp;

Vrifier le code sur un exemple


NB

T:

4
temp

int temp(T[0]);
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}
T[NB-1] = temp;

Vrifier le code sur un exemple


NB

T:

temp
i
int temp(T[0]);
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}
T[NB-1] = temp;

Vrifier le code sur un exemple


NB

T:

temp
i
int temp(T[0]);
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}
T[NB-1] = temp;

Vrifier le code sur un exemple


NB

T:

temp
i
int temp(T[0]);
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}
T[NB-1] = temp;

Vrifier le code sur un exemple


NB

T:

temp
i
int temp(T[0]);
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}
T[NB-1] = temp;

Vrifier le code sur un exemple


NB

T:

4
temp

int temp(T[0]);
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}
T[NB-1] = temp;

Vrifier le code sur un exemple


NB

T:

0
temp

int temp(T[0]);
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}
T[NB-1] = temp;

Vrifier le code sur un exemple


NB

T:

0
temp

int temp(T[0]);
for(int i(0); i < NB-1; ++i) {
T[i] = T[i+1];
}
T[NB-1] = temp;

Exercices
1. Dcalage dans l'autre sens:
0 1 2 3 4 devient 4 0 1 2 3.
2. crire le code qui inverse les lments du tableau:
0 1 2 3 4 devient 4 3 2 1 0

Dcalage vers la droite


crire le code qui dcale les lments de T vers la droite:
T:

En adaptant le programme prcdent:


int temp(T[NB-1]);
for(int i(0); i < NB 1; ++i) {
T[i+1] = T[i];
}
T[0] = temp;

Vrifier le code sur un exemple


NB

T:

int temp(T[NB-1]);
for(int i(0); i < NB 1; ++i) {
T[i+1] = T[i];
}
T[0] = temp;

Vrifier le code sur un exemple


NB

T:

5
temp

int temp(T[NB-1]);
for(int i(0); i < NB 1; ++i) {
T[i+1] = T[i];
}
T[0] = temp;

Vrifier le code sur un exemple


NB

T:

5
temp

int temp(T[NB-1]);
for(int i(0); i < NB 1; ++i) {
T[i+1] = T[i];
}
T[0] = temp;

Vrifier le code sur un exemple


NB

T:

5
temp

int temp(T[NB-1]);
for(int i(0); i < NB 1; ++i) {
T[i+1] = T[i];
}
T[0] = temp;

Vrifier le code sur un exemple


NB

T:

5
temp

int temp(T[NB-1]);
for(int i(0); i < NB 1; ++i) {
T[i+1] = T[i];
}
T[0] = temp;

Vrifier le code sur un exemple


NB

T:

5
temp

int temp(T[NB-1]);
for(int i(0); i < NB 1; ++i) {
T[i+1] = T[i];
}
T[0] = temp;

Vrifier le code sur un exemple


NB

T:

5
temp

int temp(T[NB-1]);
for(int i(0); i < NB 1; ++i) {
T[i+1] = T[i];
}
T[0] = temp;

Vrifier le code sur un exemple


NB

T:

5
temp

int temp(T[NB-1]);
for(int i(0); i < NB 1; ++i) {
T[i+1] = T[i];
}
T[0] = temp;

Vrifier le code sur un exemple


T:

Au lieu de

Dcalage vers la droite


T:

temp

Nouvelle tentative:
int temp(T[NB-1]);
for(int i(NB 1); i > 0; --i) {
T[i] = T[i-1];
}
T[0] = temp;
Vrifiez sur l'exemple que cette version est correcte !

Inverser les lments du tableau


On peut procder en changeant les lments de T 2 par 2:
T:

On change le premier lment avec le dernier, le deuxime avec l'avant


dernier, etc...

Dcomposer
On peut procder en changeant les lments de T 2 par 2:
T:

On change le premier lment avec le dernier, le deuxime avec l'avant


dernier, etc...
Pour un tableau de 5 lments:
T[0] = T[4];
T[4] = T[0];
T[1] = T[3];
T[3] = T[1];

Dcomposer
On peut procder en changeant les lments de T 2 par 2:
T:

On change le premier lment avec le dernier, le deuxime avec l'avant


dernier, etc...
Pour un tableau de 5 lments:
temp = T[0];
T[0] = T[4];
T[4] = temp;
temp = T[1];
T[1] = T[3];
T[3] = temp;

Dcomposer
On peut procder en changeant les lments de T 2 par 2:
T:

On change le premier lment avec le dernier, le deuxime avec l'avant


dernier, etc...
Pour un tableau de NB lments:
temp = T[0];
T[0] = T[4];
T[4] = temp;
temp = T[1];
T[1] = T[3];
T[3] = temp;

Dcomposer
On peut procder en changeant les lments de T 2 par 2:
T:

On change le premier lment avec le dernier, le deuxime avec l'avant


dernier, etc...
Pour un tableau de NB lments:
temp = T[0];
T[0] = T[NB-1];
T[NB-1] = temp;
temp = T[1];
T[1] = T[3];
T[3] = temp;

Dcomposer
On peut procder en changeant les lments de T 2 par 2:
T:

On change le premier lment avec le dernier, le deuxime avec l'avant


dernier, etc...
Pour un tableau de NB lments:
temp = T[0];
T[0] = T[NB-1];
T[NB-1] = temp;
temp = T[1];
T[1] = T[NB-2];
T[NB-2] = temp;

Dcomposer
On peut procder en changeant les lments de T 2 par 2:
T:

temp = T[0];
T[0] = T[NB-1];
T[NB-1] = temp;
temp = T[1];
T[1] = T[NB-2];
T[NB-2] = temp;

for(int i(0); i < ??; ++i) {


int temp = T[i];
T[i] = T[??];
T[??] = temp;
}

Dcomposer
On peut procder en changeant les lments de T 2 par 2:
T:

temp = T[0];
T[0] = T[NB-1];
T[NB-1] = temp;
temp = T[1];
T[1] = T[NB-2];
T[NB-2] = temp;

for(int i(0); i < ??; ++i) {


int temp = T[i];
T[i] = T[??];
T[??] = temp;
}

Dcomposer
On peut procder en changeant les lments de T 2 par 2:
T:

temp = T[0];
T[0] = T[NB-1];
T[NB-1] = temp;
temp = T[1];
T[1] = T[NB-2];
T[NB-2] = temp;

for(int i(0); i < ??; ++i) {


int temp = T[i];
T[i] = T[NB-1];
T[NB-1] = temp;
}

Dcomposer
On peut procder en changeant les lments de T 2 par 2:
T:

temp = T[0];
T[0] = T[NB-1];
T[NB-1] = temp;
temp = T[1];
T[1] = T[NB-2];
T[NB-2] = temp;

for(int i(0); i < ??; ++i) {


int temp = T[i];
T[i] = T[NB-1-i];
T[NB-1-i] = temp;
}

Dcomposer
On peut procder en changeant les lments de T 2 par 2:
T:

temp = T[0];
T[0] = T[NB-1];
T[NB-1] = temp;
temp = T[1];
T[1] = T[NB-2];
T[NB-2] = temp;

for(int i(0); i < NB/2; ++i) {


int temp = T[i];
T[i] = T[NB-1-i];
T[NB-1-i] = temp;
}

Dcomposer
On peut procder en changeant les lments de T 2 par 2:
T:

Que se passe-t-il si NB est pair ?


for(int i(0); i < NB/2; ++i) {
int temp = T[i];
T[i] = T[NB-1-i];
T[NB-1-i] = temp;
}

Dcomposer
On peut procder en changeant les lments de T 2 par 2:
T:

Que se passe-t-il si on fait ?


for(int i(0); i < NB; ++i) {
int temp = T[i];
T[i] = T[NB-1-i];
T[NB-1-i] = temp;
}

You might also like