Besoin d'aide

Resolution de probleme

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour

J'essaie de resoudre le probleme suivant:

Votre robot doit partir de la case de gauche (en orange), aller chercher les anneaux (les ronds sur fond bleu) dans l'ordre (de gauche à droite) et les ramener un par un à la case de départ.

http://www.france-ioi.org/algo/task.php?idChapter=644&idTask=1893&sTab=task&iOrder=18

Il me semble qu'il faudrait integrer un "n" qui ferait en sorte que le nombre de repetitions augmente de "+1" a chaques fois (1..2..3..4..). Sinon la manoeuvre "droite ramasser gauche deposer" ne fait bien sur que se repeter au niveau de la premiere case comme defini par la boucle, sans se decaler progressivement vers la droite.

Il est impossible de transformer les instructions "droite(), ramasser(), gauche(), deposer()" en variables pour faire quelque chose a peu pres dans ce genre:

int n =droite();

for (int n = 1; n <= 10; n = n + 1)

C est la que je suis coincé :(

Édité par dan233

+0 -0

int n =droite();

Quel sens donnerais-tu à cette instruction ?

Il ne faut pas paniquer, et ne pas écrire ton code au hasard. Oublie le langage que tu as appris, oublie le fait que tu doives écrire du code, et concentre-toi sur le principe de la tâche à accomplir. Que va faire ton robot ? D'abord il se déplace une fois vers la droite, ramasse l'anneau, revient vers la gauche et dépose l'anneau. Ensuite il se déplace deux fois, etc. etc.

Qu'est-ce qui augmente ? Comment en tenir compte dans ton programme ? Concrètement, il faut que tu découpes ton problème en sous-tâches : ramener tous les anneaux, c'est faire 4 "choses", une fois pour chaque anneau. Quelles sont ces "choses", comment tu écris leur code, et comment tu les combines ?

+1 -0
Auteur du sujet

int n =droite();

Quel sens donnerais-tu à cette instruction ?

katana

"n" affiché avec la boucle ci dessus donne les chiffres de 1 à 10.

Je ne connais pas d'autres moyen de faire augmenter une repetition de (par exemple) "+1" à chaque fois. D'ou ma tentative futile de transformer "droite()" en varibale "n" qui je l'esperais serait manipulable de la meme maniere que "n" que je peux faire augmenter de +1 a chaque fois comme ici:

int n=1; n<=10; n = n+ 1;

Je comprend bien que droite() etc.. sont des instructions et non des chiffres et ne sont donc pas manipulables de la meme maniere. Ceci dit je ne vois actuellement pas comment aborder le probleme autrement.. Merci

Édité par dan233

+0 -0

J'ai rien compris. Est-ce que tu as écrit ça pour pouvoir répéter droite à l'aide de la boucle ? Tu as raison de considérer qu'il faudra répéter l'instruction droite(); (plus exactement il faudra pouvoir l'exécuter un nombre croissant de fois). Cependant, ça n'est pas comme ça que les boucles fonctionnent.

Je me demande si tu as bien compris comment utiliser le for. Est-ce que tu pourrais m'écrire un programme qui affiche 10 fois "bonjour", par exemple ?

Pour revenir à ton problème, une autre façon de comprendre comment le résoudre serait d'essayer d'imaginer l'exécution dans ta tête, en déroulant les boucles. Essaye de faire ça, aussi.

+1 -0

Un truc qu'on t'apprend quand tu as des cours de programmation scolaires est de TOUJOURS écrire du pseudocode avant le reste. Là tu es parti sur du code directement, et tu t'embrouilles. katana a raison, il faut commencer par décrire tes étapes pour 3 anneaux, sans faire de boucle. Comme ça tu verras un motif apparaître. Ensuite ça sera plus facile d'exprimer ça en Python ou autre.

+1 -0
Auteur du sujet

J'ai rien compris. Est-ce que tu as écrit ça pour pouvoir répéter droite à l'aide de la boucle ? Tu as raison de considérer qu'il faudra répéter l'instruction droite(); (plus exactement il faudra pouvoir l'exécuter un nombre croissant de fois). Cependant, ça n'est pas comme ça que les boucles fonctionnent.

Je me demande si tu as bien compris comment utiliser le for. Est-ce que tu pourrais m'écrire un programme qui affiche 10 fois "bonjour", par exemple ?

Oui.

for (int loop = 1; loop <= 10; loop = loop +1) {

System.out.println("Bonjour"); }

Ce qui m'amène precisément à ce que j'essayais maladroitement d'expliquer plus haut.. La connaissance de cette simple manip ne me permet pas de faire autre chose que:

for (int loop = 1; loop <= 2; loop = loop + 1)

{

droite();

}

ramasser()

for (int loop = 1; loop <= 2; loop = loop + 1)

{

gauche();

}

deposer();

for (int loop = 1; loop <= 3; loop = loop + 1)

{

droite();

}

ramasser();

for (int loop = 1; loop <= 3; loop = loop + 1)

{

gauche();

}

Je me doute bien que ce n'est pas le but de l'exercise et qu'il y a un systeme plus optimisé.

J'imagine que la partie "loop <=.." de la boucle devrait augmenter de maniere croissante :)

Édité par dan233

+0 -0

Oui.

1
2
3
4
for (int loop = 1; loop <= 10; loop = loop +1)
{
    System.out.println("Bonjour");
}

Ce qui m'amène precisément à ce que j'essayais maladroitement d'expliquer plus haut.. La connaissance de cette simple manip ne me permet pas de faire autre chose que:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
for (int loop = 1; loop <= 2; loop = loop + 1)
{
    droite();
}
ramasser()          
for (int loop = 1; loop <= 2; loop = loop + 1)
{
    gauche();
}
deposer();
for (int loop = 1; loop <= 3; loop = loop + 1)
{
    droite();
}
ramasser();
for (int loop = 1; loop <= 3; loop = loop + 1)
{
    gauche();
} 

Je me doute bien que ce n'est pas le but de l'exercise et qu'il y a un systeme plus optimisé.

J'imagine que la partie "loop <=.." de la boucle devrait augmenter de maniere croissante :)

dan233

J'ai corrigé l'indentation et mis des blocs de code pour pas que la courbe du chômage des opticiens et ophtalmos s'inverse :p . Je t'invite à lire ceci pour apprendre comment faire ça.

Tu as l'air d'avoir compris comment faire en fait. Comme tu le dis, tu dois augmenter le déplacement à chaque nouvel anneau. C'est toujours le même code qui se répète:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
for (int loop = 1; loop <= n; loop += 1)
{
    droite();
}
ramasser()        
for (int loop = 1; loop <= n; loop += 1)
{
    gauche();
}
deposer();

(avec des n croissants). Tu es sur la bonne voie, alors un indice pour que tu trouves la solution seul: tu as le droit de faire des boucles imbriquées (i.e une boucle dans une boucle).

P.S: x +=1est plus concis que x = x + 1

Édité par anonyme

+1 -0
Auteur du sujet

Grimur. Merci pour ta réponse!

Je suis parvenu a resoudre le problème.

C'est en exposant mon raisonnement ici que j'ai commencé a percevoir que loop <= n; faisait partie de la solution.

Avant ton message je ne comprenais pas que l'on pouvait modifier loop <=..; indépendamment du reste.

Donc merci pour les indices :)

Édité par dan233

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte