Inscription / Connexion Nouveau Sujet
Niveau terminale
Partager :

Algorithmie

Posté par
enolaweird
14-11-15 à 17:51

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

Posté par
mathafou Moderateur
re : Algorithmie 14-11-15 à 18:08

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

Posté par
enolaweird
re : Algorithmie 14-11-15 à 18:28

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é"?

Posté par
mathafou Moderateur
re : Algorithmie 14-11-15 à 19:08

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

Posté par
enolaweird
re : Algorithmie 14-11-15 à 19:31

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...

Posté par
mathafou Moderateur
re : Algorithmie 14-11-15 à 19:35

oui, là c'est bon

Posté par
enolaweird
re : Algorithmie 15-11-15 à 09:01

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)?

Posté par
enolaweird
re : Algorithmie 15-11-15 à 09:14

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....

Posté par
pgeod
re : Algorithmie 15-11-15 à 09:24

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

Posté par
enolaweird
re : Algorithmie 15-11-15 à 09:30

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? "

Posté par
pgeod
re : Algorithmie 15-11-15 à 09:36

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.

Posté par
enolaweird
re : Algorithmie 15-11-15 à 09:40

D'accord, j'étais complètement partie sur autre chose

Merci, je vais essayer comme cela!

Posté par
enolaweird
re : Algorithmie 15-11-15 à 09:45

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!

Posté par
pgeod
re : Algorithmie 15-11-15 à 09:49

Posté par
enolaweird
re : Algorithmie 15-11-15 à 09:51

Je vous souhaite une bonne fin de week-end!

Posté par
mathafou Moderateur
re : Algorithmie 15-11-15 à 10:49

"je trouve beaucoup de réponses..."

oui :

Citation :
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


en effet 8(x0-5)+5(y0+8) = 8x0 -40 + 5y0 + 40 = 8x0 + 5y0 = 430
de sorte que toutes les solutions (dans Z) sont données par x = x0 - 5k, y = y0 + 8k où k parcourt Z

"un peu moins" () si on ne prend que les solutions dans N
vu que x maxi 430/8 53
on va trouver "en gros" 53/5 une dizaine de solutions

Posté par
J-P Posteur d'énigmes
re : Algorithmie 15-11-15 à 11:21

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.  

Posté par
mathafou Moderateur
re : Algorithmie 15-11-15 à 12:32

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

Posté par
enolaweird
re : Algorithmie 15-11-15 à 13:16

Citation :
on peut donc coder


Là cela devient intéressant... comment y parvenir?? (là par contre je ne m'y connais vraiment pas, c'est juste de la pure curiosité)

Posté par
mathafou Moderateur
re : Algorithmie 15-11-15 à 13:29

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"

Posté par
enolaweird
re : Algorithmie 15-11-15 à 14:10

D'accord, merci pour l'information

Posté par
J-P Posteur d'énigmes
re : Algorithmie 15-11-15 à 14:56

Citation :
"certes, mais on ne demande pas d'améliorer l'algorithme pour résoudre le problème autrement, mais de le compléter "


Ben oui, mais quand quelque chose est mal pensé, indiquer une meilleure manière d'arriver à résoudre le problème ne devrait pas être mis de coté.

Mais ce serait alors le cas dans presque tous les exercices prémâchés par les profs actuels.

Posté par
mathafou Moderateur
re : Algorithmie 15-11-15 à 15:06

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.

Posté par
J-P Posteur d'énigmes
re : Algorithmie 16-11-15 à 09:09

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.

Posté par
pgeod
re : Algorithmie 16-11-15 à 12:39

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.

Posté par
J-P Posteur d'énigmes
re : Algorithmie 16-11-15 à 12:52

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 :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1742 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !