Bonsoir,
Je dois rendre un devoir, dans lequel je dois utiliser l'algorithmie. En général, je suis plutôt à l'aise avec les algorithmes, mais là...j'ai du mal à retraduire le problème sous cette forme. L'énoncé est le suivant :
Un groupe d'hommes et de femmes a dépensé 430 pièces de monnaie dans une auberge.
Les hommes ont dépensé 8 pièces chacun et les femmes ont dépensé 5 pièces chacune.
Combien pouvait-il y avoir d'hommes et de femmes dans le groupe ?
Utiliser la fenêtre ci-dessous pour résoudre le problème :
VARIABLES
homme EST_DU_TYPE NOMBRE
femme EST_DU_TYPE NOMBRE
monnaie EST_DU_TYPE NOMBRE
DEBUT_ALGORITHME
POUR homme ALLANT_DE • A •
DEBUT_POUR
POUR femme ALLANT_DE • A •
DEBUT_POUR
FIN_POUR
FIN_POUR
FIN_ALGORITHME
Je pense partir de l'équation suivante : 8x+5y = 430, en essayant de trouver combien d'hommes et de femmes, au minimum et au maximum peuvent entrer dans cette équation (je ne sais pas si je suis bien claire...?)
Il faut que cet algorithme tourne jusqu'à ce qu'il puisse réunir les x et les y pour atteindre 430, aussi je pense utiliser la boucle TANT QUE.
Le problème c'est que j'ai parfois des idées assez logiques mais je ne sais pas les organiser...Si quelqu'un passe par ici...
Je vous remercie
Bonjour,
pour les bornes sur x et sur y
la valeur minimum de y est 1 voire même 2 si on considères que le pluriel de l'énoncé est significatif ou 0 si on est sceptique ou paresseux
et par conséquent la valeur maximale de x est de ...
idem pour x minimum et donc le maximum de y
quant à utiliser une boucle "tant que" ... très mauvaise idée à partir du moment où les boucles sont déja définies par l'énoncé comme des boucles "pour"
il n'y a aucune boucle supplémentaire à ajouter
par contre une structure avec un si ...
cet algorithme donnera toutes les solutions
alors qu'une boucle "tant que" ne donnerait que la première solution.
il y a plusieurs solutions ou aucune, car "on sait que" si x0, y0 est une solution, alors x0-5, y0+8 en est une autre
Je suis d'accord (j'ai oublié de préciser que la plupart du temps mes idées sont "à côté de l'énoncé" )
la valeur maximale de x serait (430-5)/8 si on considère qu'il n'y a qu'une femme...
Quant à l'utilisation d'une boucle SI ce serait sous la forme :
Si x = (de 1 à (430-5)/8), alors y = (...), et il faudra qu'il s'arrête chaque fois que 8x+5y =430...Est-ce que je suis toujours "à côté"?
il n'existe pas de BOUCLE "si"
tu n'as pas compris la différence entre les boucles
qui répètent des blocs d'opérations (c'est ça que veut dire "boucle") pour, tant que, sont des boucles
et une "structure de controle" si [sinon ] qui fait un simple test pour savoir si oui ou non il faut effectuer une fois un certain bloc d'opérations
"Si x = (de 1 à (430-5)/8), alors y = (...)" ne veut rigoureusement rien dire du tout.
il n'y a pas à supprimer des lignes de l'algorithme proposé
les "de à" c'est dans les "pour" qu'il faut les préciser
Excusez-moi, je ne sais vraiment pas pourquoi j'ai employé le terme de "boucle", dans mon esprit c'était simplement le "si" dont vous me parlez.
L'idée était d'utiliser le SI comme cela : Si 8x +5y = 430, "afficher le résultat", sinon "continuez" (à prendre d'autres valeurs pour x et y)
J'ai du mal à être claire, cela veut certainement dire que je ne comprends pas tout ce que j'énonce mais je pense avoir compris "dans le fond" ce qu'il y a à faire. Ma difficulté est de parvenir à l'expliquer et, ainsi, à le traduire...
Merci
mon algorithme serait le suivant (en attendant que j'ai terminé le téléchargement d'algobox)
VARIABLES
homme EST_DU_TYPE NOMBRE
femme EST_DU_TYPE NOMBRE
monnaie EST_DU_TYPE NOMBRE
DEBUT_ALGORITHME
POUR homme ALLANT_DE 1 A (430-5)/8
DEBUT_POUR
homme prend la valeur 1
POUR femme ALLANT_DE 1 A (430-8)/5
DEBUT_POUR
femme prend la valeur 1
SI 8homme+5femme=430
afficher "il y a " afficher homme
afficher "il y a " afficher femme
SINON
homme prend la valeur homme+1
femme prend la valeur femme+1
FIN_POUR
FIN_POUR
FIN_ALGORITHME
Pensez-vous que cela soit correct (je ne sais pas si j'ai correctement utilisé le POUR)?
Je sais qu'il y a une erreur dans mon algorithme, On me dit : erreur : "identifiant directement après un nombre"...
Je pense que l'erreur se situe à la ligne 15 : SI(8homme+5femme==430) ALORS
J'ai beau chercher je ne vois pas où est mon erreur....
Dans les structures de boucles, il y a les
structures TANT QUE ou WHILE
et les
structures POUR ou FOR
Pour les premières il faut incrémenter ou décrémenter la variable de boucle
et ne pas oublier d'initialiser la variable de boucle avant la première entrée
dans la structure de boucle.
Pour les secondes, la variable s'incrémente automatiquement à chaque boucle
et il n'y a pas lieu de donner une valeur initiale à la variable de boucle.
Exemple de boucles équivalentes :
i = 10
TANT QUE (i < 20)
Faire afficher i
i = i + 1
FIN TANT QUE
POUR i variant de 10 à 19
Faire afficher i
FIN DE POUR
Bonjour, merci pour votre réponse!
J'ai corrigé mon algorithme et c'est le suivant :
VARIABLES
h EST_DU_TYPE NOMBRE
f EST_DU_TYPE NOMBRE
monnaie EST_DU_TYPE NOMBRE
DEBUT_ALGORITHME
POUR h ALLANT_DE 1 A (430-5)/8
DEBUT_POUR
h PREND_LA_VALEUR 1
POUR f ALLANT_DE 1 A (430-8)/5
DEBUT_POUR
f PREND_LA_VALEUR 1
SI(h*8+f*5==430) ALORS
DEBUT_SI
AFFICHER "il y a "
AFFICHER h
AFFICHER " hommes"
AFFICHER "il y a "
AFFICHER f
AFFICHER " femmes"
FIN_SI
SINON
DEBUT_SINON
h PREND_LA_VALEUR (430-(f+1)*5)/8
f PREND_LA_VALEUR (430-(h+1)*8)/5
FIN_SINON
FIN_POUR
FIN_POUR
FIN_ALGORITHME
Concernant les boucles TANT QUE, on me les a déconseillées précédemment mais pensez-vous qu'à la place du SI/SINON cela pourrait mieux fonctionner? Car pour le moment, le message suivant s'affiche quand je lance la lecture : "l'algorithme semble boucler longtemps, voulez-vous continuer? "
Tu as lu ce que je viens d'écrire ?
vire les :
h PREND_LA_VALEUR 1
f PREND_LA_VALEUR 1
SINON
DEBUT_SINON
h PREND_LA_VALEUR (430-(f+1)*5)/8
f PREND_LA_VALEUR (430-(h+1)*8)/5
FIN_SINON
et tout devrait aller mieux.
Merci!! je trouve beaucoup de réponses...comme "il y a 5 hommes il y a 78 femmes ou il y a 10 hommes et il y a 70 femmes...."
C'était bien le SINON qui gênait... En tout cas je vous remercie car jamais je n'aurais eu l'idée de le supprimer, pour moi il faisait partie intégrante du SI!
"je trouve beaucoup de réponses..."
oui :
8x + 5y = 430
avec x et y dans N²
430/8 = 53,75
et donc x <= 53
y = (430-8x)/5
Il suffit donc de faire une boucle pour x allant de 0 à 53, et de vérifier pour chaque passage dans la boucle si (430-8x)/5 est entier ... Si oui, alors afficher le x et le y correspondant.
VARIABLES
x EST_DU_TYPE NOMBRE
y EST_DU_TYPE NOMBRE
DEBUT_ALGORITHME
POUR x ALLANT_DE 0 A 53
DEBUT_POUR
SI ((430-8*x)/5 == floor((430-8*x)/5)) ALORS
DEBUT_SI
AFFICHER "x = "
AFFICHER x
AFFICHER " et y = "
AFFICHERCALCUL* (430-8*x)/5
FIN_SI
FIN_POUR
FIN_ALGORITHME
Sauf distraction.
certes, mais on ne demande pas d'améliorer l'algorithme pour résoudre le problème autrement, mais de le compléter
les deux boucles "pour" sont, dans un objectif didactique de faire des boucles imbriquées, imposées par l'énoncé
ce qui suit n'est pas vraiment à lire car ces réponses risquent de ne pas forcément être appréciées par le prof :
nota : on peut aussi transformer une boucle 'pour' de telle façon qu'elle se comporte exactement comme un 'si', exécutant une seule fois la boucle si blabla et 0 fois sinon.
puisque en vrai une boucle 'pour' est la traduction de
V prend la valeur initiale
tant que la condition V fin est réalisée
faire ...
V prend la valeur V+1
fin tant que
que V soit un entier ou pas et donc une boucle 'pour' codée ainsi
pour y de (430-8*x)/5 à floor((430-8*x)/5) faire
afficher x, y
semble certes "étrange" mais se comporte exactement comme un
y prend la valeur (430-8*x)/5
si (y == floor(y))
afficher x, y
avec des boucles pour imposées formellement par l'énoncé on peut donc coder
(pas sur que ce soit du goût du prof) :
VARIABLES
x EST_DU_TYPE NOMBRE
y EST_DU_TYPE NOMBRE
mes EST_DU_TYPE CHAINE
DEBUT_ALGORITHME
POUR x ALLANT_DE 1 A 430/8
DEBUT_POUR
POUR y ALLANT_DE (430-8*x)/5 A floor((430-8*x)/5)
DEBUT_POUR
mes PREND_LA_VALEUR "x = "+x+", y = "+y
AFFICHER* mes
FIN_POUR
FIN_POUR
FIN_ALGORITHME
***Algorithme lancé***
x = 5, y = 78
x = 10, y = 70
x = 15, y = 62
x = 20, y = 54
x = 25, y = 46
x = 30, y = 38
x = 35, y = 30
x = 40, y = 22
x = 45, y = 14
x = 50, y = 6
***Algorithme terminé***
j'ai en plus utilisé une astuce pour afficher du texte formaté dans une chaine plutôt que de faire 4 instructions 'afficher' successives
nota 2 : en prenant en compte la grammaire de l'énoncé, la valeur initiale de x peut être modifiée
ou en supposant que 0 hommes puisse être considéré comme "des hommes"
avec un boucle
POUR x DE 0 à ...
on obtient la solution oubliée x = 0, y = 86
solution mathématiquement exacte, mais qui ne correspond pas grammaticalement à ce qu'on entend pas "des"
"des" devrait être traduit par
POUR x DE 2 à ... (des = au moins deux)
et le test modifié pour s'assurer que y 2 (des = au moins deux), ce qui ici ne change rien au résultat
en modifiant juste la valeur maxi de x
POUR x DE 2 A (430-2*5)/8
je l'ai fait dans l'exemple
replacer le "si" de J-P :
SI ((430-8*x)/5 == floor((430-8*x)/5)) ALORS
par la construction artificielle et "humoristique" (c'est pas un truc à faire en pratique ça !!)
POUR y ALLANT_DE (430-8*x)/5 A floor((430-8*x)/5)
cette boucle "POUR" fait en fait la même chose que le "SI", avec en plus l'affectation de (430-8*x)/5 à y pour éviter de le recalculer une deuxième fois dans son
AFFICHERCALCUL* (430-8*x)/5
remplacé par un simple afficher de la variable y
remplacer dans le cas général ainsi un "SI" par un "POUR" bizarre est à faire au coup par coup en fonction du test précis que l'on veut remplacer. (à faire si on veut passer pour un farfelu, hein, je répète : ce n'est jamais à faire en pratique, l'utilisation d'astuces vaseuses)
savoir le faire est faire la preuve que l'on comprend parfaitement ce qu'il se passe dans le fonctionnement du "POUR"
le but de l'exercice n'est pas de résoudre l'équation, mais de faire un algorithme avec des boucles 'pour' imbriquées
alors si l'équation avait été un truc plus compliqué qu'une équation du premier degré, on n'y aurait pas coupé de ces deux boucles 'pour'
(résoudre en y et tester si y est un nombre entier aurait été inextricable)
sauf que trouver un énoncé "avec thème concret" (des gens qui achètent des trucs) n'aurait pas été aussi facile pour le prof !
faut pas trop jeter la pierre aux prof parce qu'ils imposent une méthode de résolution dans un exercice prétexte à étudier cette méthode de résolution là.
surtout quand il s'agit du thème "apprentissage de base des algorithmes" et pas de résoudre des équations de Diophante.
Après "plus de métier" sur les algorithmes et seulement là on pourra laisser la bride sur le cou et demander un algorithme sans en donner (prémâcher) la structure.
Il n'est quand même pas bien difficile d'écrire un énoncé simple qui impose pratiquement l'écriture de 2 boucles imbriquées, ou du moins où l'écriture des 2 boucles est une manière rationnelle de résoudre le problème posé sans être dévoreuse de ressources machine ou de temps d'exécution ou ...
Si on écrit un énoncé où imbriquer deux boucles est un mode de résolution du problème bien plus mauvais qu'utiliser une autre voie ... alors imposer la "mauvaise" manière de résolution est critiquable, cela amènera beaucoup d'étudiants à travailler comme actuellement, c'est à dire sans réfléchir, préférant la facilité à l'efficacité même si celle-ci est mangeuse de ressources et de temps d'exécution.
Chacun sa manière de voir.
Moi j'opte pour un énoncé réfléchi, à la portée de l'étudiant évidemment, mais dont la méthode de résolution, si elle est imposée, est proche de celle qu'elle serait dans un travail bien pensé sans contraintes sur la méthode de résolution.
Et d'autres, se cachent derrière l'apprentissage d'une technique (ici boucles imbriquées), quitte à donner de mauvaises habitudes aux étudiants ... au lieu de réfléchir à un énoncé adéquat qui ferait appliquer la technique (boucles imbriquées) de manière rationnelle.
J.P. T'as sans raison mais on est ici au niveau terminale avec des élèves
qui, de toute façon et c'est sans doute pour ça qu'il viennent sur ce site,
ont des difficultés à faire la différence entre une boucle et une
condition. Pourquoi veux-tu alors tenter de leur expliquer qu'on
pourrait faire mieux. Avec ces élèves, faisons bien... cela suffit.
Je ne veux pas expliquer aux élèves qu'on pourrait faire mieux ... mais plutôt aux profs.
A part risquer de pousser certains étudiants à mal travailler, pourquoi pondre un énoncé et pousser à un type de résolution pas des plus appropriés alors qu'en modifiant un rien cet énoncé, on pourrait pousser vers le même type de résolution mais ce type de résolution étant bonne dans le cadre de l'énoncé modifié ?
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :