Partage
  • Partager sur Facebook
  • Partager sur Twitter

transformer un algorithme en une fonction

29 octobre 2020 à 9:40:35

Bonjour, je dois transformer l'algorithme ci-dessous en une fonction informatique def ... return mais malgré plusieurs essais je n'y arrive pas, il y a toujours quelque chose qui cloche. Pourriez-vous m'aider? Merci par avance.

from random import randint, random

p= randint(1,3)

for i in range(1,11):

    if p==1:

        a=random()

        if a < 0.75:

            p=2

        else:

            p=3

    elif p==2 :

        a=random()

        if a < 0.75:

            p=3

        else:

            p=1

    else:

        a=random()

        if a < 0.75:

            p = 1

        else:

            p = 2

    print (p, end =" ")



-
Edité par Darine.15 29 octobre 2020 à 12:14:18

  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2020 à 11:16:16

Bonjour,

Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Merci de colorer votre code à l'aide du bouton Code

Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: python;">Votre code ici</pre>.

Merci de modifier votre message d'origine en fonction.

Liens conseillés

  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2020 à 11:52:35

Bonjour. Tu dois créer une fonction, c'est à dire créer chacun des éléments caractéristiques d'une fonction. Qu'est-ce qui caractérise une fonction ? Un ou plusieurs arguments, dont la valeur n'est pas connue à l'heure de l'écriture du code. Ensuite un ensemble d'actions à effectuer en utilisant ces arguments, cet ensemble d'actions est, lui, connu à l'heure de l'écriture du code. Pour finir, un résultat.

def nom(les arguments):

    # des actions décrites ici

    return resultat

Par exemple :

def imc(taille, poids):

    r = poids / taille**2

    return r

# on ne connaît pas à l'avance la taille ou le poids de l'utilisateur, l'utilisateur, lui, ne connaît pas la formule pour calculer l'imc, mais il peut quand même calculer son imc comme ça : imc(180, 75)

Dans ton cas, le corps de la fonction (l'ensemble d'actions) est déjà donné. Tu dois te poser la question : quelle est la variable qui stockera la valeur que l'utilisateur va entrer ? Quel est le résultat qu'il veut obtenir ?

(Indice : dans un énoncé d'exercice on écrirait sûrement, "soit une personne de taille 'taille' et de poids 'poids', décrivez un algorithme qui calcule son imc")

  • Partager sur Facebook
  • Partager sur Twitter

typage structurel ftw

29 octobre 2020 à 11:58:16

D'accord je comprend mieux merci beaucoup de votre réponse. Est ce que je peux vous montrer ce que j'ai fait?
  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2020 à 12:00:43

Bonjour.

Qu'est-ce qui cloche car ton code est fonctionnel mais étant donné que l'on ne sait pas ce que tu souhaites avoir en sortie, il est difficile de te guider.

  • Partager sur Facebook
  • Partager sur Twitter

PB68

29 octobre 2020 à 12:12:13

En fait, ce code est un algorithme et mon professeur veut que je le transforme en fonction informatique du type def... return. Le problème est que j'ai du mal à utiliser from import random* dans une fonction. Voila ce que j'essaie d'arranger ^pour que ça fonctionne. 

from random import*

def fourmis (p):

    p= randint(1,3)

    return p  

for i in range(1,11):

    p= randint(1,3)

if p==1:

    a=random()

    if a < 0.75:

        p=2

    else:

        p=3

elif p==2:

    a=random()

    if a < 0.75:

        p=3

    else:

        p=1

elif p==3:

    a=random()

    if a < 0.75:

        p = 1

    else:

        p = 2

return p 



-
Edité par Darine.15 29 octobre 2020 à 12:14:59

  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2020 à 12:22:49

Il ne faut pas mettre les imports dans la fonction.
Les imports c'est en début de fichier.

Sinon peux-tu donner l'énoncé complet ? Car là j'ai du mal à voir les paramètres qu'il faut donner à la fonction (trop de valeurs hard codées...)

  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2020 à 12:27:36

D'accord, comment je les mets en début de fichier?

Enoncé:

Une fourmi parcourt de manière aléatoire les côtes d'un triangle équilatéral direct ABC. Sa position initiale sur l'un des sommets A, B ou C est décidée de manière aléatoire et équiprobable. Ensuite, quand elle se trouve sur un sommet elle se déplace vers l'un des deux autres sommets. La probabilité qu'elle se déplace dans le sens trigonométrique est 3/4.

Les sommets A, B et C du triangle sont repérés respectivement par les nombres 1, 2 et 3.

Compléter l'algorithme afin de prévoir les autres positions initiales possibles de la fourmi.
Coder cet algorithme en langage python et tester le programme obtenu.

 un nombre aléatoire égal à 1, 2 ou 3
Si p = 1 alors
|    a  un nombre aléatoire de [0 ; 1[
|    Si a < 0.75 alors
|    |   p   2
|    Sinon   
|    |   p   3 
fin Si...

merci beaucoup 

-
Edité par Darine.15 29 octobre 2020 à 12:30:15

  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2020 à 13:29:47

Darine.15 a écrit:

Bonjour, je dois transformer l'algorithme ci-dessous en une fonction informatique def ... return

L'algorithme n'est pas le code Python mais le machin qui à partir de la position p = 1, 2 ou 3 courante calculera la position suivante.

Et si on appelle machin fonction, on pourra écrire:

from random import randint
def machin(p):
    ...
    return p

p = randint(1, 3)
for i in range(11):
    p = machin(p)
    print(p, end=' ')

Reste à remplacer les ... par un bout de la séquence d'instructions que vous avez déjà.

-
Edité par mps 29 octobre 2020 à 13:31:16

  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2020 à 13:35:55

D'accord, je comprends merci beaucoup. Donc si je ne me trompe pas il faut d'abord définir la fonction puis la variable?



-
Edité par Darine.15 29 octobre 2020 à 19:31:07

  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2020 à 13:46:04

Tu parles de la variable p ?

Ça n'a aucune influence, la variable pourrait s'appeler autrement que p en dehors de la fonction.

Darine.15 a écrit:

D'accord, comment je les mets en début de fichier?

Ils sont déjà en début de fichier dans ton code. Le début du fichier, c'est en haut, donc rien à changer pour toi, laisse les imports tout en haut et définis la fonction après.

-
Edité par LoupSolitaire 29 octobre 2020 à 13:48:08

  • Partager sur Facebook
  • Partager sur Twitter

Blond, bouclé, toujours le sourire aux lèvres...

29 octobre 2020 à 13:46:53

Je viens de le réécrire et ça marche. Vraiment merci beaucoup à tous, j'étais totalement perdue et la je viens de comprendre un point plutôt important qu'on n'a pas pu étudier en cours à cause du confinement donc c'est super.


"Tu parles de la variable p ?

Ça n'a aucune influence, la variable pourrait s'appeler autrement que p en dehors de la fonction."


Non, ce que je veux dire par là c'est que je ne peux pas écrire ce qui est noté ci-dessous directement après def machin (p):. C'est faux et c'est ça qui me bloquait.

def machin(p):
   p= randint(1,3)
for i in range(1,11):
    p= fourmis(p)
    print(p,end="")
...( le reste des instructions )





-
Edité par Darine.15 29 octobre 2020 à 14:08:15

  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2020 à 16:13:16

attention aux indentations; il faut, je suppose que tout le code soit dans la fonction, donc les indentations doivent suivre.

ça devrait ressembler à quelque chose comme ça: (on pourrait rajouter dans fourmis, la boucle du nombre de position à suivre, en lui passant ce nombre en paramètre)

from random import*
 
pos= randint(1,3)
for i in range(1,11):
    pos = fourmis(pos) # je suppose qu'on veut suivre le mouvement de la fourmi sur 10 déplacements successifs
    print(pos)

def fourmis(p):
    if p==1:
        a=random()
        if a < 0.75:
            p=2
        else:
            p=3
    elif p==2:
        a=random()
        if a < 0.75:
            p=3
        else:
            p=1
    elif p==3:
        a=random()
        if a < 0.75:
            p = 1
        else:
            p = 2
 return p



  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2020 à 19:22:28

J'en prend note merci. De plus, ça n'a rien à voir avec python mais je ne comprend pas pourquoi si p=1 et a<0.75 p=2, car si la probabilité est inférieure à 3/4 alors p=3.  Merci de votre réponse.

-
Edité par Darine.15 29 octobre 2020 à 19:23:47

  • Partager sur Facebook
  • Partager sur Twitter
30 octobre 2020 à 7:46:26

C'est dans l'énoncé...

Sinon pourquoi pas un truc cyclique ? Pour éviter d'écrire 3 fois la même chose :

def fourmis(p):
    a = random()
    if a < 0.75:
        p += 1
    else:
        p -= 1
    p = (p - 1) % 3 + 1
    return p



-
Edité par thelinekioubeur 30 octobre 2020 à 7:47:14

  • Partager sur Facebook
  • Partager sur Twitter
30 octobre 2020 à 10:33:12

Darine.15 a écrit:

J'en prend note merci. De plus, ça n'a rien à voir avec python mais je ne comprend pas pourquoi si p=1 et a<0.75 p=2, car si la probabilité est inférieure à 3/4 alors p=3.  Merci de votre réponse.

-
Edité par Darine.15 il y a environ 15 heures


j'ai repris le code que vous aviez posté, je n'ai pas vérifié si c'était cohérent avec ce qui était demandé;

dans l'énoncé que vous nous avez copié, c'est pourtant bien ce qui est demandé:

p ←← un nombre aléatoire égal à 1, 2 ou 3
Si p = 1 alors
| a ←← un nombre aléatoire de [0 ; 1[
| Si a < 0.75 alors
| | p ←← 2
| Sinon
| | p ←← 3
fin Si...

  • Partager sur Facebook
  • Partager sur Twitter
30 octobre 2020 à 15:21:44

Oui justement c'est écrit dans l'énoncé mais je ne comprends pas pourquoi, est-ce par rapport à python?
  • Partager sur Facebook
  • Partager sur Twitter
30 octobre 2020 à 16:58:44

bah non, l'énoncé c'est un algorithme qui peut donc transposé dans n'importe quel langage

Dans l'énoncé, c'est dit que la fourmi à 75% de chance de tourner dans le sens trigonométrique, donc il est a supposé que l'on passe de 1 à 2 en se tournant dans le sens trigonométrique (il y a du avoir des études de fait sur les fourmis, ou c'est un juste un exemple pour fournir un énoncé ^^ )

  • Partager sur Facebook
  • Partager sur Twitter
31 octobre 2020 à 3:11:52

@thelinekioubeur:
Ceci devrait fonctionner. Je me trompe?
from random import *
p = (randint(0,2) + choices([1,2], weights=[0.75, 0.25], k=1)[0]) % 3 + 1
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

31 octobre 2020 à 9:04:09

Ça semble correct mais c'est pas très beau :lol:

Mais c'est bien vu pour l'utilisation de choices.

C'est un peu plus clair sur deux lignes :

def fourmis(p):
    p += choices([1, 2], [3, 1])[0]
    p = (p - 1) % 3 + 1
    return p



-
Edité par thelinekioubeur 31 octobre 2020 à 9:10:32

  • Partager sur Facebook
  • Partager sur Twitter
31 octobre 2020 à 10:47:15

umfred a écrit:

bah non, l'énoncé c'est un algorithme qui peut donc transposé dans n'importe quel langage

Dans l'énoncé, c'est dit que la fourmi à 75% de chance de tourner dans le sens trigonométrique, donc il est a supposé que l'on passe de 1 à 2 en se tournant dans le sens trigonométrique (il y a du avoir des études de fait sur les fourmis, ou c'est un juste un exemple pour fournir un énoncé ^^ )


oui mais justement pour passer de 1 à 2 et de 2 à 3 il faut que la probabilité soit de 75% et pas inférieure, non? Parceque là, ce qui est écrit dans l'énoncé est contradictoire: la probabilité d'aller dans le sens trigonométrique est de 75% et pourtant dans le code c'est écrit si p==1 et a<0.75 alors p=2. En fait je ne comprend vraiment pas à quoi correspond a.

-
Edité par Darine.15 31 octobre 2020 à 10:48:04

  • Partager sur Facebook
  • Partager sur Twitter
31 octobre 2020 à 13:01:03

La variable a est un nombre aléatoire entre 0 et 1.
  • Partager sur Facebook
  • Partager sur Twitter

Blond, bouclé, toujours le sourire aux lèvres...

31 octobre 2020 à 15:03:24

Je ne vois pas ce qui est contradictoire. Si la fourmi tourne dans le sens trigonométrique elle va de 1 vers 2, ou de 2 vers 3, ou de 3 vers 1.

Ou bien il faut un croquis ?
L'énoncé dit :

Les sommets A, B et C du triangle sont repérés respectivement par les nombres 1, 2 et 3.

-
Edité par thelinekioubeur 31 octobre 2020 à 15:04:50

  • Partager sur Facebook
  • Partager sur Twitter
31 octobre 2020 à 17:25:30

Je n'ai pas saisi tout de suite que le paramètre 'weights' pouvait être positionnel.
Ensuite, la proportion [3, 1] est la même que ]0.75, 0.25]
Je l'ai mis de cette façon pour illustrer l'énoncé du problème.
Il me semble avoir vu dans la doc de choices que tout était ramené à des float.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

2 novembre 2020 à 11:19:33

Darine.15 a écrit:

umfred a écrit:

bah non, l'énoncé c'est un algorithme qui peut donc transposé dans n'importe quel langage

Dans l'énoncé, c'est dit que la fourmi à 75% de chance de tourner dans le sens trigonométrique, donc il est a supposé que l'on passe de 1 à 2 en se tournant dans le sens trigonométrique (il y a du avoir des études de fait sur les fourmis, ou c'est un juste un exemple pour fournir un énoncé ^^ )


oui mais justement pour passer de 1 à 2 et de 2 à 3 il faut que la probabilité soit de 75% et pas inférieure, non? Parceque là, ce qui est écrit dans l'énoncé est contradictoire: la probabilité d'aller dans le sens trigonométrique est de 75% et pourtant dans le code c'est écrit si p==1 et a<0.75 alors p=2. En fait je ne comprend vraiment pas à quoi correspond a.

-
Edité par Darine.15 31 octobre 2020 à 10:48:04


je pense qu'on peut le voir de 2 façons soit a supérieur à 0.25, soit a inférieur à 0.75 (dans les 2 cas, on a 75% d'avoir une valeur de a dans l'intervalle choisie ([0.25-1[ ou [0-0.75[)
  • Partager sur Facebook
  • Partager sur Twitter
2 novembre 2020 à 17:59:24

On peut représenter l'intervalle de probabilité comme une règle de longueur 1 unité.
Si notre point tombe dans la zone 0 - 0.75, on se déplace dans le sens trigonométrique.
Si le point tombe dans la zone 0.75 - 1, on se déplace dans le sens contraire.
La probabilité de tomber dans la zone 0 - 0.75 est justement 0.75.
Et la probabilité de tomber dans la zone 0.75 - 1 est de 0.25.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

4 novembre 2020 à 16:37:06

Je viens de lire tous vos messages et finalement j'ai compris merci beaucoup. Donc maintenant l'énoncé ne me paraît plus contradictoire et j'ai compris le rôle de a.
  • Partager sur Facebook
  • Partager sur Twitter
11 décembre 2023 à 14:32:45

de but répeter lire(ch) jusqu'a long(ch) !=" " et long(ch)<=20 p=0 pour i de 0 a long(ch)-1 faire si majus (ch[i])!=[A,E,U,O,U,I,Y] alors p=0 si non si majus(ch[i])="A" alors p=p+1 si non si majus(ch[i])="E" alors p=p+5 si non si majus(ch[i])="U" alors p=p+21 si non si majus(ch[i])="O" alors p=p+15 si non si majus(ch[i])="I" alors p=p+9 si non p=p+25 fin si écrire("les points de mot est", p)
  • Partager sur Facebook
  • Partager sur Twitter
11 décembre 2023 à 16:15:27

difficilement lisible ton algo, et surtout 3 ans de retard :p
  • Partager sur Facebook
  • Partager sur Twitter
11 décembre 2023 à 16:27:34

Bonjour,

Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération
  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)