Bonjour à tous, je souhaite exécuter la fonction ci-jointe mais ça me marque des erreurs quelque soient les corrections apportées, pourriez-vous m'aider s'il vous plaît ?Pièce jointe 642549Pièce jointe 642551
Version imprimable
Bonjour à tous, je souhaite exécuter la fonction ci-jointe mais ça me marque des erreurs quelque soient les corrections apportées, pourriez-vous m'aider s'il vous plaît ?Pièce jointe 642549Pièce jointe 642551
Déjà, il faudrait montrer comment elle est appelée... et comment l'appelant "charge" le module exo.py pour que Moitie soit défini.
note: " exos d'algorithmique - cahier d'algorithmique" n'a aucun rapport avec Python. Dire "pourquoi ça lève l'exception NameError?" serait mieux. Dit autrement, pourquoi vous écrivez des lignes de Python est sans rapport avec le soucis que vous avez (et le pourquoi vous demandez de l'aide).
- W
Dit autrement : mettre un titre sans rapport avec le problème est signe de flemmardise (je me foule pas à chercher un titre correct) et surtout n'aide pas la communauté (si un jour un autre a le même souci il n'aura pas l'idée de venir ici voir s'il y a eu une solution)
J'ai modifié l'intitulé de la discussion, c'est la première fois que je poste un message sur ce site donc c'est normal mais en faisant des erreurs qu'on apprend, n'est-ce pas ?
À présent, seriez-vous en mesure de me venir en aide parce que là, je sèche et je commence sérieusement à me lasser de ces exos, merci à vous
C'est une autre erreur que le NameError initial.
Vous voyez que ça râle en exécutant l'instruction n = 0 dans la fonction moitie à la ligne 5 qui contient n += 1.
=> le code exécuté ne correspond pas au code que vous montrez.
Après ça vous pouvez toujours demander de l'aide mais comme on ne va pas se déplacer pour voir ce que vous faites, il va falloir mettre plus de rigueur à exposer le problème que vous avez.
Note: le premier étant que vous utilisez un éditeur sophistiqué sans trop comprendre ce qu'il se passe sous le capot. Débutez avec un engin plus rustique histoire de comprendre les bases avant d'y ajouter un voile plus ou moins épais par dessus.
- W
Tu ne t'es pas creusé le citron beaucoup plus !!!
Non pas normal. Tu es assez grand pour pouvoir déduire tout seul que c'est le titre qui donne l'idée. Tu irais voir au cinéma un film qui s'intitule "un film"?
Accessoirement il y a plein d'autres topics qui peuvent te servir d'exemple.
Faudrait voir comment tu appelles la fonction (déjà dit par wiztricks) car je n'arrive pas à reproduire (d'ailleurs les règles précisent qu'on poste ses codes dans les topics au lieu de mettre des copies d'écran car ça permet déjà un copier/coller au lieu de tout se retaper à la mano). Le truc ne semble pas aimer que tu réaffectes "n" alors que c'est un paramètre de fonction. Et le n+=1 ne semble pas super sain (en plus de n'être franchement pas super intelligent vu que n doit récupérer les valeurs du range). Pas perspicace non plus de boucler sur une évaluation de V qui ne change pas durant la boucle. :?
Si déjà tu te lasses des études que tu as choisies je me demande ce que ça va donner dans la vie active. Ils seront content de te voir arriver ceux avec qui tu bosseras...
c'est quoi ce truc ?Code:import none
De toute façon, ce script ne fait que définir une fonction, mais il faut qu'elle soit appelée ailleurs, donc vous ne montrez pas tout ou vous n'expliquez pas suffisamment ce que vous avez fait.
Laissez tomber, je vais me débrouiller tout seul, après tout, ça ne serait pas gratifiant si je passais toujours mon temps
à demander de l'aide mais même si ce ne sont que des exos niveau débutant, je trouve ça quand même très frustrant
d'avoir passé deux jours quasi complet à buter dessus sans avoir trouvé la bonne réponse, le bon algorithme quoi.
Je peux quand même vous afficher l'exo en image pour que vous puissiez me donner votre avis sur la question, svp ?
Sans me donner la réponse, juste avoir votre avis
Tenez, je vous pose ça là Pièce jointe 642554
Les captures d'écran n'aident pas beaucoup. Il vaut mieux poster le code en texte, en utilisant les balises prévues à cet effet. Ça permet aux intervenants de tester le code de leur côté, et reproduire le problème. Mais vous devez fournir tous les éléments du problème et expliquer clairement comment vous lancez le truc.
Je crois quand même que c'est plus un problème de maîtrise de l'environnement de développement que de Python ici.
Voici mon énième test qui a abouti à un résultat mais certainement pas celui escompté:
Code:
1
2
3
4
5
6
7 def moitie(N): V = 0 while V >= (V * 0.5): for n in range(0,100): V = N * 0.98 ** n print(n) return round(V)
Après, vous n'avez pas dit quel résultat vous cherchiez à obtenir seulement des erreurs rencontrées...
Le but des exercices que vous faites est de vous familiariser avec les messages d'erreurs et vous forcer à apprendre à relire le code que vous avez écrit pour comprendre pourquoi il ne fait pas ce que vous voulez. Si on fait ce travail là à votre place, vous n'apprendrez pas grand chose (et autant attendre le corrigé).
Mais pour l'instant, vous en êtes toujours à essayer de décrire votre problème de façon intelligible qui est la première étape pour comprendre ce qui se passe et imaginer une solution (ça fait aussi partie de ce que vous devez apprendre).
note: comme on n'a pas eu les mêmes cours que vous, impossible de savoir ce qu'il faut calculer. Et comme je vous l'ai dit plus haut: ici on parle des soucis que vous avez avec Python et on ne fera pas vos exercices. Si vous ne comprenez pas l'énoncé, c'est pas vraiment un sujet python et il y a plein de façons de construire une solution. Si la méthode que vous avez retenue est raisonnable, vous allez la traduire en ce que vous connaissez de Python (qui n'a rien à voir avec le python qu'on peut pratiquer).
- W
Il s'agit d'un exercice progressif. On te demande une première fonction qui fait un certain travail (calculer le nombre de bactéries vivantes après n secondes), puis une seconde fonction qui doit donner le temps pour tuer la moitié des bactéries initiales. Il est clair que cette seconde fonction doit appeler la première et évaluer son résultat (combien mortes en 1 seconde, en 2 secondes, en 3 secondes etc).
Le prof s'en fout de ces bactéries et du temps pour qu'elles disparaissent, ce qu'il veut c'est que tu sois capable de construire les éléments de base puis les utiliser pour construire des éléments plus complexes.
Si par exemple je demande une fonction carre() et une autre cube(), on peut écrire def cube(n): return n*n*n mais je serai plus content si on m'écrit def cube(n): return n*carre(n)...
Entendu, merci pour vos réponses, bonne soirée à vous
J'ai enfin résolu le problème, en fin de compte c'était vraiment évident comme solution
je pose le code ici:
C'est ce à quoi je songeais au départ mais ça me paraissait bien trop facile comme réponseCode:
1
2
3
4
5
6
7
8 def moitie(n,N): V = N while V >= 500000: V = N * 0.98**n n = (n + 1) print(V) print(n) return round(V)
comme quoi, pourquoi s'embêter à vouloir faire compliqué quand on peut faire simple :arf:
Essaye d'appeler moitie(50, ...) juste pour voir si le résultat est le même...
Et écrire 500000 en dur n'est pas fameux (ou alors c'est une fonction qui calcule combien de temps le nombre de bactéries initial quel qu'il soit tombe sous les 500000 mais ce n'est pas ce qui est écrit dans l'énoncé).
Accessoirement renvoyer "V" (nombre de bactéries) alors qu'elle soit renvoyer un nombre de secondes...:?
En réalité le plus évident c'est de résoudre directement l'équation N*0.98**n = N/2 ce qui donne n=log(1/2)/log(0.98)=34.31 soit 35 si on arrondit à l'entier immédiatement supérieur (et si comme je le crois tu as eu 36 alors tu as une erreur de plus). On remarquera d'ailleurs que N en réalité n'a absolument aucune importance (on aura toujours 35 secondes même avec seulement 10 bactéries au départ).
Donc désolé, c'est peut-être évident mais ça ne conviendra pas car tu n'utilises pas la première fonction écrite. Comme je l'ai dit, le but n'est pas d'avoir un résultat mais un travail de construction et ce travail n'y est pas. Mais bon si à toi ça te convient tu verras ce que te dit ton prof...
En fait, c'est ce sur quoi je bossais quand j'étais en remise à niveau TSI-I mais ça fait bien quelques années maintenant que j'ai quitté la formation,
et comme j'ai quelques projets en tête, le seul moyen d'y parvenir c'est de savoir programmer, du coup, j'ai ressorti mon vieux cahier d'exos dans
l'optique de le compléter de mon côté.
Après, je suis d'accord avec toi, je savais qu'il y avait d'autres solutions possibles, j'en suis parfaitement conscient,
mais je n'étais pas certain que celle-ci fonctionne non plus, ceci étant, c'est en persévérant et en travaillant régulièrement
que je serais en mesure de trouver des solutions optimisées et adaptées à mes problèmes.
Réfléchissez un peu: pourquoi 2 paramètres alors que moitie attend juste un nombre de bactéries pour retourner un nombre de secondes?
Si N est le nombre de bactéries, la condition le 500_000 dans la condition V >= 500000 n'a de sens que si le nombre de bactéries au départ est 1_000_000. Et dans ce cas, pourquoi passer le nombre de bactéries en paramètres, si c'est pas 1_000_000, le résultat sera faux.
Dans le code, V est le nombre de bactéries après n secondes. Si la fonction doit retourner un nombre de secondes, c'est plutôt n qu'elle doit retourner (pas V)!
Tout ça ce sont des incohérences entre ce qu'on vous demande et ce que fait le code où ce qui pèche est le manque de rigueur (et ça n'a rien à voir avec Python).
Dernière boulette: imaginez l'exécution de vos instructions dans la boucle.
A l'étape i, on calcule V = N * 0.98**n puis on incrémente n avant de tester la condition pour éventuellement sortir. Du coup, le nombre de secondes a été incrémenté avant qu'on ait testé le V et le résultat sera une seconde de trop (et faux).
Là on est plus dans la logique programmation, j'écris une boucle avec condition ou une variable doit être incrémentée à chaque itération.
Quelle doit être la valeur initiale? Quand incrémenter la variable quand c'est en relation avec la condition de sortie?
Et avec tout çà pas sûr que le résultat soit juste car je me suis contenté de lire le code que vous avez écrit...
- W
Pour le 500 000, je me suis basé sur ce que disait la fin de l'énoncé qui disait moitié de la population initiale,
j'ai quand même eu une longue hésitation et puis je me suis dit que ça faisait probablement référence à la
quantité de la consigne précédente puis j'ai fini par partir sur cette hypothèse.
quant à la fonction bacteries, c'est la solution qui a été donnée en correction à l'époque et elle n'émanait pas de moi
par conséquent, étant donné que c'était la solution de correction, je n'ai pas creusé plus loin de mon côté, mais avec
le recul, j'me dis que j'aurais peut-être dû.
La fonction donne la bonne réponse, mais c'est un coup de chance.
Une fonction doit être 'cohérente', et autonome.
Lance ton programme, avec l'instruction moitie(35000000) ;
Ca va te dire au bout de combien temps on divise le nombre de bactéries de moitié, si au début il y a 35000000 bactéries.
Normalement.
C'est à ça que sert une fonction.
Est-ce que le résultat te semble correct ?
Si on commence avec 10 bactéries, au bout d'une seconde, on aura 9 bactéries (et pas 9.8) ; au bout de 2 secondes, on aura 8 bactéries, ... et au bout de 5 secondes on aura 5 bactéries.
Donc avec 10 bactéries au départ, on tombe à la moitié au bout de 5 secondes seulement.
La formule avec des log() est valable pour des très grands nombres, mais pas pour des petits.
Justement, la fonction doit donner la bonne réponse quelle que soit cette population. Si on lui passe 150 bactéries, elle doit trouver au bout de combien de temps ça passe à 75, pas à 500000 (cf mon exemple).
Oui. Même si la solution n'est pas de toi, tu dois t'en servir pour la suite de l'exercice
En réalité même pas, elle donne 36 alors que la bonne réponse est 35. Faute à l'incrément de n qui se fait une fois de trop.
Bon bah, maintenant je le saurais pour la suite, si ça me paraît trop facile, c'est que ce n'est pas la bonne réponse,
le prochain exo est encore plus compliqué, là je vais vraiment transpirer pour trouver la solution,
en tout cas, merci pour votre aide et votre temps, je vous souhaite une excellente journée :).
Absolument pas !!! Ce n'est absolument pas ce qui a été dit ici !!!
Si tu regardes mon code, la première fonction fait une ligne et la seconde en fait trois. Tester n=1 seconde, n=2 secondes, n=3 secondes et etc jusqu'à trouver n tel que bacterie(N, n) devienne inférieur à N/2 c'est pas super complexe comme fonction (je ne veux pas employer l'adjectif "facile" mais franchement il y a de quoi !!!)
Ce qu'il te faut c'est éviter de mettre du code au hasard. Si on te dit "cette fonction reçoit un truc" alors ce n'est pas pour écrire def fct(trucA, trucB) sans savoir ce que représente "trucA" ou "trucB" ni surtout pourquoi en mettre deux alors qu'elle ne doit en recevoir qu'un seul. Ton tout premier code montrait que tu avais quelque part saisi l'idée mais si on te demande "une" recherche alors il ne faut pas écrire "deux" boucles. Si je te place 15 bouteilles et que je te demande laquelle contient de la bière, tu vas les examiner une à une et faire un seul tour, pas 225.
Accessoirement utiliser "n" et "N" pour deux entités différentes n'aide pas non plus à bien conceptualiser les choses. Toutefois là ce n'est pas non plus entièrement de ta faute (le créateur de l'énoncé aurait pu y penser de lui-même)
Ah, on est bien d'accord, j'osais pas le dire pour éviter de me prendre une prune facile mais déjà je trouve que l'énoncé est UN PETIT PEU vague, mais en attendant, tu as dit dans un tes messages précédents que ce n'était pas au niveau de la programmation que je devais faire un travail mais au niveau de la rigueur et je ne sais plus quoi, tu aurais des conseils pour m'aider à m'améliorer ?
Ne pas passer à la partie 2 tant que tu n'as pas terminé (et testé) la partie 1. Quand tu as des soucis de résultat tu rajoutes des print() avant et après pour vérifier si les valeurs reçues et renvoyées correspondent. Ne pas démarrer une fonction en écrivant def fct(xxx, yyy) sans savoir au minimum ce que représentent "xxx" et "yyy" pour toi et pour la fonction. Ne pas écrire for n in range(...) sans savoir ce que ça implique ce qui évite ensuite d'écrire n+=1. Ne pas boucler sur "tant que V aura/n'aura pas telle valeur" sans modifier ensuite quelque part dans la boucle ladite valeur "V".
Le reste vient avec l'habitude
J'en prends bonne note, merci pour ton retour, j'ai une dernière question, à l'époque où j'ai fait la remise à niveau, le prof nous a mis directement dans le bain avec la programmation mais nous n'avions aucune notion d'algorithmique mes camarades et moi, est-il essentiel d'avoir des notions d'algorithmique AVANT de passer à la programmation (d'où le cahier d'exercices et dans ce cas-là, c'est le prof qui n'a pas fait son travail correctement) ou bien est-il possible "d'apprendre sur le tas" au risque de s'en tirer TRÈS souvent les cheveux ?
L'algorithmique au sens propre c'est la formalisation d'une solution dans un langage fictif ressemblant aux langages réels. Ce langage aura des instructions comme "TANT QUE FAIRE ... FIN FAIRE" ou "SI ALORS SINON FIN SI".
Cela permet de former son cerveau à la résolution de problèmes informatiques sans avoir vraiment de langage pour ça (ni même d'ordinateur, on fait alors tout sur papier).
Si tu as déjà un ordi et un langage de disponible, ça devient alors inutile d'en apprendre un autre "imaginaire" alors que tu en as un de réel à ta disposition. L'algorithmique c'est un peu comme les roulettes de stabilisation d'un vélo. Ca peut servir un peu au début mais faut apprendre à s'en passer vite.
Ensuite ce qu'il faut faire, c'est connaitre le comportement des instructions de contrôle if/while/for surtout que ce sont des instructions qu'on retrouve dans quasiment tous les langages (au-moins dans tous les langages sérieux et non les langages tels que "brainfuck" faits pour amuser les nerds)
D'accord, donc en fin de compte, il n'y a qu'en pratiquant régulièrement et en prenant les problèmes avec une bonne dose de recul que je serais en mesure d'aller loin et d'être plus rapide sur la résolution de problèmes, si j'ai bien compris
La programmation est un apprentissage de l'algorithmique. Ouvrez un tuto qui propose des exercices corrigés et essayez de faire les exos sans regarder la solution. Cela va vous familiariser avec les messages d'erreurs et à la relecture critique de ce que vous avez écrit: c'est un bon apprentissage de la rigueur!
Comment tester que ce que vous avez codé fonctionne tel qu'attendu fait partie du boulot... Car ça oblige à réfléchir a ce que le code doit faire et à imaginer les différentes étapes à suivre dans le traitement pour obtenir le résultat. De plus impossible de coder sans avoir une idée de ce à quoi le code devra ressembler.
Puis à ce moment là, vous pouvez comparer ce que vous avez fait avec le corriger et s'ils sont différents, essayer de comprendre pourquoi sera très instructif.
La programmation ne se réduit pas aux algorithmes ou à l'écriture du code.
C'est partir d'un besoin exprimé en français et le retraduire/reformuler une ou plusieurs fois de façon à ce qu'on puisse construire une solution.
Et on s'assure à chaque étape de reformulation de retrouver l'expression du besoin de départ.
Une solution étant l'assemblage de petits bouts, comment découper le problème en morceaux histoire de pouvoir les fabriquer indépendamment les uns des autres puis arriver à les assembler sans trop de déconvenues? C'est çà "programmer": fabriquer un plan de construction de la solution qui pourra nous guider pour réaliser pas à pas, de façon sure.
Dit autrement, écrire 10 lignes de code, c'est pas pareil qu'en écrire 1.000 ou 100.000: il faudra d'autres savoir faire qui entrent aussi dans ce qu'on appelle "programmer".
- W
J'ai compris, merci à vous Wiztricks