Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 27-10-2016 15:25:07

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

[Python & tous langages] Exo sympa : enfants et interrupteurs

Bonjour à tous,

Voici un sujet trouvé sur un forum dédié à la programmation Python.

Devoir de vacances en Python  (classe : Terminale S option ISN) :

276 lampes sont numérotées de 1 à 276. Pour passer le temps, 25 enfants appuient sur les interrupteurs à tour de rôle. Le premier enfant presse chaque interrupteur. Le second presse les boutons 2,4,6, etc, (il presse les interrupteurs ayant un numéro multiple de 2). Le troisième appuie sur les interrupteurs 3, 6, 9, etc, (multiples de 3). Le quatrième presse tous les interrupteurs ayant un numéro multiples de 4, et ainsi de suite jusqu'au 25ème enfant. Avant le passage du premier enfant, toutes les ampoules sont éteintes.
1. Combien d'ampoules seront allumées après le passage des 25 enfants ?
2. Proposer une évolution du programme permettant à l'utilisateur de faire varier le nombres d'enfants.
3. Proposer une évolution du programme permettant à l'utilisateur de faire varier le nombre d'ampoules.

J'ajoute un pt'it quelque chose à la Q1 : Et lesquelles ?

A vous lire


Arx Tarpeia Capitoli proxima...

En ligne

#2 28-10-2016 03:26:54

tibo
Membre expert
Inscription : 23-01-2008
Messages : 1 097

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

Salut,

juste un petit code avant d'aller me coucher

nbLum=input("Nombre de lumieres : ")
nbEnf=input("Nombre d'enfants : ")
lum=[0]*nbLum
for i in range(nbEnf):
    for j in range(nbLum):
        if ((j+1)%(i+1)==0):
            lum[j]=(lum[j]+1)%2
print(lum)
 

Voilà 2 mois que je fais que du C à cause de la formation ISN...
Et quel plaisir de retourner à Python !!!
Tellement plus... simple !

Dernière modification par tibo (28-10-2016 03:27:18)


A quoi sert une hyperbole?
----- A boire de l'hypersoupe pardi !

Hors ligne

#3 28-10-2016 08:54:28

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

Salut,


Ma version

Attation ! le résultat de input() est un string...

#!/usr/bin/env python
# -*- coding: UTF8 -*

interrupt,nbenfants=276,25
Ampoules=["_"]+[0]*interrupt

for enfant in range(1,nbenfants+1):
    for appui in range(enfant,interrupt+1,enfant):
        Ampoules[appui]=(Ampoules[appui]+1)%2

print ("          Il y a",Ampoules.count(1),"ampoules allumées. \nEn voici les nos :")
for i,amp in enumerate(Ampoules[1:]):
    if amp:
        print (i+1,end=" ")

En anglais, on qualifie Python de très user friendly, du moins au début...
Je n'aime pas le C.

@+


Arx Tarpeia Capitoli proxima...

En ligne

#4 28-10-2016 12:54:45

freddy
Membre chevronné
Lieu : Paris
Inscription : 27-03-2009
Messages : 7 457

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

Salut

Remarque :
d'un strict point de vue arithmétique, c'est un très joli sujet !


De la considération des obstacles vient l’échec, des moyens, la réussite.

Hors ligne

#5 28-10-2016 16:31:04

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

Salut,

Je suis bien d'accord avec ta remarque.
Déjà avec 25 gamins et 276 interrupteurs, il est hors de question de remplir 276 colonnes : il est nécessaire de réfléchir un peu...

@+


Arx Tarpeia Capitoli proxima...

En ligne

#6 28-10-2016 17:07:27

tibo
Membre expert
Inscription : 23-01-2008
Messages : 1 097

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

Je viens de voir ta remarque.

Attation ! le résultat de input() est un string...

J'ai vérifié et en fait c'est du type de ce que rentre l'utilisateur :


tibo@tiboNetwork:~/$ python
Python 2.7.11+ (default, Apr 17 2016, 14:00:29)
[GCC 5.3.1 20160413] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a=input()
5
>>> a
5
>>> type(a)
<type 'int'>
>>> b=input()
"toto"
>>> b
'toto'
>>> type(b)
<type 'str'>
>>> c=input()
5.1
>>> c
5.1
>>> type(c)
<type 'float'>
>>> d=input()
[4,5,9]
>>> d
[4, 5, 9]
>>> type(d)
<type 'list'>
>>>
 

Mais ça a peut-être changé avec la version 3

Dernière modification par tibo (28-10-2016 17:09:11)


A quoi sert une hyperbole?
----- A boire de l'hypersoupe pardi !

Hors ligne

#7 28-10-2016 18:09:51

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

Aven

Oui, le input() est déconseillé avec les versions 2.x : pour une question de sécurité à ce que disent les spécialistes... Il est recommandé d'utiliser raw_input() qui donne un string... J'avais oublié !
Effectivement dans les versions 3.x (j'ai la 3.5 avec numpy, matplotlib et Scipy ajoutés) raw_input() a été abandonné laissant la place au seul input() qui offre un string en sortie.
De même en 2.x, tu avais xrange() plus rapide que range() parce que xrange() ne calculait pas d'abord tous les nombres. En contrepartie, il était limité...
Les versions 3.x ont rationnalisé et laissé que le seul range() qui se comporte comme le faisait xrange()...
Print est devenu une fonction mais print() marche en 2.x.
Encore un changement : en Python 2.x,
>>> 3/5
0
>>> 6/4
1
En 3.x
Mais
>>> 3.0/5
0.6
>>> 6.4
1.5
>>> 6//4
1
Pour obtenir le même comportement en 2.x, on ajoute un import :

from __future__ import division

@+


Arx Tarpeia Capitoli proxima...

En ligne

#8 29-10-2016 11:11:14

jpp
Membre
Inscription : 31-12-2010
Messages : 1 105

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

salut.

Ne connaissant rien à la programmation , alors par l'arithmétique et manuellement :
soit E le nombre d'enfants et L le nombre de lampes .
pour chaque N° de lampe , je cherche tous les diviseurs de N qui sont <E+1
1)  Si ce nombre de diviseurs est impair , alors la lampe N finira allumée
2) Si ce nombre de diviseurs est pair , elle finira éteinte.

mais manuellement ça risque d'être long .

Hors ligne

#9 29-10-2016 12:50:27

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

Ave,

mais manuellement ça risque d'être long

...
Je dirais même plus, longuet... : 6/7 lignes en Python (et on doit pouvoir faire mieux).
J'aurais pris le pb à l'envers (pas vraiment cherché donc pas optimal).
Après le passage, du 1er gamin, toutes les lampes sont allumées et la n° 1 le restera
A partir du n°2 la 2 sera éteinte et le restera et pour n de 1 à 276, on appuiera sur 2n, 3n, 4 n...
J'aurais répertorié le nombre d'appuis sur chaque interrupteur et appliqué un modulo 2...

jpp, qu'est-ce qui t'empêche de te mettre à la programmation ? Ça ne t'inspire pas ? Surtout qu'avec Python et un esprit logique et structuré, ça avance assez vite !

@+


Arx Tarpeia Capitoli proxima...

En ligne

#10 30-10-2016 15:07:10

jpp
Membre
Inscription : 31-12-2010
Messages : 1 105

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

salut yoshi .

j'ai téléchargé python 3.4.5 mais n'arrive pas à l'ouvrir . Donc j'ai tout supprimé.
j'avais visionné auparavant 3h de vidéo pour commencer quelque chose .
Que me conseilles-tu comme logiciel python (parce qu'il y en a cent versions)? et surtout comment l'ouvre - t -on ?
                                                                                                merci.

n.b.   je suis un  boulet en informatique.    je suis sur Windows 8-1

Dernière modification par jpp (30-10-2016 15:10:23)

Hors ligne

#11 30-10-2016 15:32:17

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

Salut,

téléchargé python 3.4.5 mais n'arrive pas à l'ouvrir

Pas très clair : qu'est-ce que tu entends par : je n'arrive pas à l'ouvrir.
Version Python que je te conseille :
https://www.python.org/ftp/python/3.5.2 … -amd64.exe
Pour installer.
Clic droit sur le fichier et choisis Exécuter en tant qu'Administrateur : ton problème doit être celui-ci...
Ce sont les restrictions de Windows.
Et choisis de l'installer pour tous les utilisateurs, même si tu es le seul sur ta bécane ; ça te permettra de me localiser plus facilement ultérieurement (ou à moi de t'aider à...).
Si tu l'as fait, vois-tu une icône sur le bureau pour lancer Python ?
Si oui, no pb...
S non, je t'indiquerai comment en mettre une...

Ensuite pour ton apprentissage, télécharge ce bouquin (gratuit) conçu pour un débutant absolu :
https://inforef.be/swi/download/apprendre_python3_5.pdf
Au début, tu vas te familiariser avec les notions de base et l’Éditeur (IDLE) par défaut.

Franchement, quand tu commences à programmer, tu prends un plaisir fou à voir la machine exécuter ce que tu lui demandes via le logiciel...

@+

Dernière modification par yoshi (30-10-2016 19:09:07)


Arx Tarpeia Capitoli proxima...

En ligne

#12 31-10-2016 08:49:53

jpp
Membre
Inscription : 31-12-2010
Messages : 1 105

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

salut .

@yoshi : je te remercie encore . j'ai téléchargé python et le manuel via les 2 liens que tu m'as indiqués.

Il me reste maintenant à cogiter , mais je sais que ça ne va pas être de la tarte pour un débutant  comme moi.



                                                                  à plus.

Hors ligne

#13 31-10-2016 10:03:10

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

Re,

Bah !
Il y a une chose que j'ai apprise : quand on programme, il faut être patient, il est rare que ça marche du 1er coup et c'est très frustrant au début, mais on finit par on prendre son parti (bien obligé)...
Le bouquin est très bien conçu pour un débutant intégral.

T'as bien une icône Python sur ton bureau ?
tibo, moi et d'autres, on sera là pour te soutenir, n'hésite pas...

@+


Arx Tarpeia Capitoli proxima...

En ligne

#14 04-11-2016 13:02:35

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

Re,


Alors jpp, ça avance ?

@+


Arx Tarpeia Capitoli proxima...

En ligne

#15 04-11-2016 19:37:50

jpp
Membre
Inscription : 31-12-2010
Messages : 1 105

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

salut yoshi .

ben , ça suit son ptit bonhomme de chemin . je suis retourné à l'age de 6 ans (apprentissage d'un second langage) .
non ! je blague .

Hors ligne

#16 04-11-2016 20:11:29

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

Salut,

Je comprends...
Les débuts ne sont pas très marrants.

Je me souviens de mes débuts au Kendo (où on apprend les différentes marches qui y sont utilisées) ou les échecs...
J'en ai bavé.

@+


Arx Tarpeia Capitoli proxima...

En ligne

#17 05-11-2016 09:27:42

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

Re,

Swinnen le dit, mais n'insiste pas assez :
la clé de voûte de Python, c'est l'indentation...
C'est l'indentation qui permet de déterminer les blocs.
L'indentation peut se faire au début avec des espaces ou des tabulations. Dans les versions précédentes de Python, on disait : jamais les deux. D'autant qu'on ne voit pas la différence et que ça déclenchait un message d'erreur...
J'ai voulu voir si le message d'erreur indiquait la ligne fautive (sinon bonjour la recherche à l'aveugle ; ça m'était arrivé) mais je viens de tester : j'ai mélangé les espaces et la touche TAB. Python n'a pas râlé !
Tant pis (ou tant mieux), mais je conserverai mes habitudes...

As-tu attaqué la notion de boucle (boucle while et boucle for) ?

@+


Arx Tarpeia Capitoli proxima...

En ligne

#18 05-11-2016 14:33:51

jpp
Membre
Inscription : 31-12-2010
Messages : 1 105

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

salut.

@yoshi  : pourrais-tu m'expliquer ce qui ne va pas dans ma syntaxe .

>>> a = 20
>>> if (a>100):
             print ("a dépasse la centaine")
        else:                                                 l'écriture de else me génère déjà une erreur de syntaxe
             print ("a ne dépasse pas la centaine")

sur le bouquin page 23  les 3 points  " . . . " sont en début de ligne . chez moi il n'y sont pas ; lorsque je les mets , j'ai toujours
un message d'erreur.

>>> a = 20
>>> if (a > 100):
...         print("a dépasse la centaine")
...    else:
...         print("a ne dépasse pas cent")  --> ça , c'est l'exemple dans le cours.

pourquoi ce message d'erreur systématique ; les parenthèses après if sont - elles en trop ?

de toute façon ,  quelque soit le décalage  de "else"  , il génère toujours une erreur de syntaxe.

                                                                                               merci .

Dernière modification par jpp (05-11-2016 15:04:26)

Hors ligne

#19 05-11-2016 15:35:18

tibo
Membre expert
Inscription : 23-01-2008
Messages : 1 097

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

Salut,

48571389py.png
a priori pas de raison que ça plante...

Il ne faut pas d'espace du tout devant le else:
(et encore moins des points)

[edit]
Je viens de regarder le tuto de Swinen, et effectivement il met des "..." dans ses exemples sur IDLE.
Je ne sais pas à quoi ça correspond. Il ne faut pas en mettre.

Dernière modification par tibo (05-11-2016 15:37:13)


A quoi sert une hyperbole?
----- A boire de l'hypersoupe pardi !

Hors ligne

#20 05-11-2016 15:46:54

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

Salut,

Non, les parenthèses ne sont pas la cause du problème : elles sont inutiles, c'est tout (mais ça marche quand même avec...)

Oui, j'ai pu constater aussi que les ... n'apparaissent pas : je n'ai jamais su pourquoi, il prétendait le contraire, même dans les versions antérieures de Python (y compris la branche 2.x)

C'est juste un problème d'indentation...
l'éditeur IDLE est un peu pénible, et quoi qu'en dise Swinnen, il a une logique à part...
Le prompt  >>> ne produit pas une vraie indentation.
Il est là et l'espace après juste pour te dire que tu as la main.
Donc en fait, ton if a >100 n'est pas indenté de 4 espaces, c'est une illusion...
Pour éviter les soucis, fais comme ça :

>>> if a >100: # Là tu appuies sur ENTREE et tu tapes le print :

 
>>> if a > 100:
           print ("a dépasse la centaine")

Là tu retapes ENTREE et ton curseur est aligné sous le print
Tu appuies sur la touche retour arrière qui te ramènes au point où devrait être le if s'il n'y avait pas ce satané >>>+espace
Et tu contines, tu tapes le else:
Puis ENTREE (tu es correctement indenté)
Et tu pas tapes le print, puis à la fin, ENTREE 2 fois.
Tu utilises la console Windows, il faut savoir que l'indentation y est de 8 espaces.
Contournement de ce souci
1. Tu ouvres le Bloc-notes de Windows et tu tapes tes commandes en respectant ton identation.
    Comme ceci :

if (a>100):
    print ("a dépasse la centaine")
else:
        print ("a ne dépasse pas la centaine")

  Et tu copies le tout et tu colles dans la console juste après le >>> à l'endroit du curseur clignotant.
  Puis ENTREE 2 fois.  Mêne un copier/coller de ce que j'ai écrit ci-dessus marche...

2. Depuis ta console, tu cliques sur File, puis sur New file : une page blanche s'ouvre.
    La tu tapes normalement ce que tu vois ci-dessus.
    Cela fait tu vas à File, et tu choisis SAVE ou SAVE AS, tu choisis un nom et tu valides.
    Puis tu appuies sur F5 ou clic Run puis Run File

L'indentation standard est de 4 espaces, mais tu peux choisir ce que tu veux pourvu que tu t'y tiennes dans un même scrpit.

Essaie les 2 méthodes avec ça :

if (a>100):
    print ("a dépasse la centaine")
else:
        print ("a ne dépasse pas la centaine...")
        if a >50:
                print ("mais il est plus grand que 50 !")
        else:
                print ("et même pas la cinquantaine")           

Le copier.coller de mon essai donne ça :

>>> a=60
>>> if (a>100):
    print ("a dépasse la centaine")
else: -----------------------> à partir d'ici l'appui sur ENTREE te donnera l'indentation correcte
        print ("a ne dépasse pas la centaine...")
        if a >50:
                print ("mais il est plus grand que 50 !")
        else:
                print ("et même pas la cinquantaine")

               
a ne dépasse pas la centaine...
mais il est plus grand que 50 !
>>>

A partir des deux points suivant le 1er else, l'appui sur ENTREE te donnera à chaque fois) l'indentation correcte0
Je n'utilise plus la console que pour des essais rapides (je m'en sers comme calculette)...

J'ai été clair ?

@+


Arx Tarpeia Capitoli proxima...

En ligne

#21 05-11-2016 19:25:58

jpp
Membre
Inscription : 31-12-2010
Messages : 1 105

Re : [Python & tous langages] Exo sympa : enfants et interrupteurs

re . 
       
SyntaxError: invalid syntax
>>> a = 20
>>> if (a>20):
         print("a dépasse la centaine")
        else:
        
SyntaxError: unindent does not match any outer indentation level


>>>
>>> a=20
>>> if a>100:
    print("a dépasse la centaine")
else:
    print("a ne dépasse pas la centaine")

   
a ne dépasse pas la centaine
>>>

c'est ok ; j'en tiendrais compte par la suite .
                                                                      et merci encore à tous les deux.

Hors ligne

Pied de page des forums