Inscription / Connexion Nouveau Sujet
Niveau seconde
Partager :

Programme sous Python

Posté par
YoyoElb
12-01-18 à 22:22

Bonjour je suis actuellement en pleine galere pour un dm de maths et jai vraiment besoin d'aide.

Le plan est muni d'un repère orthonomé (O, I, J)
On se donne un entier naturel "n" non nul
On se propose de compter le nombre de points à coordonnées entières contenus dans le disque de rayon de centre O et de rayon (racinne carée de "n")
Voici l exemple de la figure correspondante lorsque n=4
(On voit que le disque touche le 2,2, -2 et -2)

Question 1: Elaborer un programme sous Python qui demande a l utilisateur de donner le nombre "n", et qui renvoie le nombre de points a coordonees entieres contenus dans le disque de rayon de centre O et de rayon (racine carree de "n")

Posté par
Glapion Moderateur
re : Programme sous Python 12-01-18 à 22:41

Bonsoir,
c'est pas très difficile, tu demandes n
puis tu testes tous les nombres i et j allant de 1 à partie entière de racine de n (avec deux boucles).
si i²+j² < n alors tu incrémentes une variable
et à la fin tu l'affiches

Posté par
YoyoElb
re : Programme sous Python 12-01-18 à 22:58

Wow jai pas trop compris de ou commencer

Posté par
YoyoElb
re : Programme sous Python 12-01-18 à 22:58

YoyoElb @ 12-01-2018 à 22:58

Wow jai pas trop compris de ou commencer
et surtout appuyer ou

Posté par
Glapion Moderateur
re : Programme sous Python 12-01-18 à 23:15

Citation :
appuyer ou

tu as déjà fait un algorithme dans ta vie ?

appuyer où ça fait mal

Posté par
YoyoElb
re : Programme sous Python 12-01-18 à 23:17

Glapion @ 12-01-2018 à 23:15

Citation :
appuyer ou

tu as déjà fait un algorithme dans ta vie  ?

appuyer où ça fait mal
En gros jai compris jusqua n=demande("Entrer un nombre") et cest tout

Posté par
mathafou Moderateur
re : Programme sous Python 12-01-18 à 23:20

bonjour,

reste à décider si le disque est ouvert ou fermé (si son pourtour est compté ou pas) pour savoir si on met < n ou bien n

et puis ....
Programme sous Python

Posté par
YoyoElb
re : Programme sous Python 12-01-18 à 23:25

Bonjour merci pour votre aide mais moi le probleme est que je ne comprend pas quel est le programme que je dois ecrire

Posté par
mathafou Moderateur
re : Programme sous Python 13-01-18 à 00:04

celui décrit par Glapion :

pour chaque valeur de i de 1 au rayon du cercle
pour chaque valeur de j de 1 au rayon du cercle
# i et j sont les coordonnée d'un point à coordonnée entières
si i²+j² < n # si ce point est intérieur au disque, (Pythagore, distance à l'origine < rayon)
le compter
# (fin du si)
# (fin de la boucle pour j)
# (fin de la boucle pour i)
compléter et afficher le nombre de points total

ceci est le "squelette" de l'algorithme, en français ordinaire (en langage dit "naturel")
décrivant les opérations à effectuer

on doit toujours commencer par ça.
mettre en forme la méthode en la décrivant explicitement


il ne (te) reste plus qu'à mettre ça en forme avec des détails de programmation (comment compter ... comment écrire "pour" etc),
en accord avec la syntaxe du langage Python (voir doc)
et à tenir compte de mon petit dessin :
les points comptabilisés par cet algorithme sont les seuls points à coordonnées positives strictement)
et pas tous les points à coordonnées entières (dans ) du disque

et puis à décider si < n ou si n
points strictement intérieurs au disque
ou bien points dans le disque y compris son pourtour (y compris sur le cercle)

Posté par
YoyoElb
re : Programme sous Python 13-01-18 à 08:58

Ah c'est bon merci beaucoup Glapion et mathafou !

Posté par
mathafou Moderateur
re : Programme sous Python 13-01-18 à 09:11

si tu mets n = 1000000 tu devrais obtenir à peu de chose près 1000000 fois pi
3141549 points alors que 1000000 fois pi = 3141593 arrondi à l'entier le plus proche

Posté par
carpediem
re : Programme sous Python 13-01-18 à 13:14

salut

une remarque en complément de la solution proposée par mathafou:

une seule boucle suffit :

si 0 < i < n (ou n) alors le nombre de points à ordonnées entière et positive (de la droite x = i) est E(\sqrt {n^2 - i^2}) ...

ce qui évite une deuxième boucle et permet de gagner du temps ...




mathafou : je pense que tu as utilisé ggb pour la figure de 23h20 ... mais comment as-tu fait la partie colorée ?

merci par avance

Posté par
mathafou Moderateur
re : Programme sous Python 13-01-18 à 13:38

attention, le n de l'énoncé est déja le carré du rayon.
(le rayon est racine de n)

tu as parfaitement raison pour l'accélération et la réduction du nombre de boucles
je ne faisais que détailler l'algo proposé par Glapion

HS : la partie colorée a été composée par morceaux (polygone et arcs de cercles)
plus subtil est la création d'une figure dynamique avec un curseur pour la valeur de n
faut chercher comment marchent les "séquences" et les "listes" avec Geogebra pour savoir comment générer les points en nombre variable et colorier différemment (et tant qu'à faire les compter) les points intérieurs et les points extérieurs.
je ne me suis pas foulé et la parte "observée" est juste un rectangle dans cette nouvelle mouture,
qui montre d'ailleurs mieux l'algo "Glapion" avec le balayage pour x de 1 à R et y de 0 à R = les points du rectangle rose, frontière comprise.

Programme sous Python

je vais mettre le fichier ggb sur GeogebraTube
lien dès que c'est fait.

Posté par
mathafou Moderateur
re : Programme sous Python 13-01-18 à 13:47

c'est fait :

Posté par
YoyoElb
re : Programme sous Python 13-01-18 à 13:53

Me revoila , apres beaucoup de tentatives , j'aurai bien besoin d'aide de quelqun ou d'un document pour tout mettre en language python, je patoge enormement

Posté par
mathafou Moderateur
re : Programme sous Python 13-01-18 à 14:00

qu'as tu commencé à écrire ? qu'as tu essayé d'écrire ?
c'est en corrigeant ses propres erreurs et errements qu'on apprend, pas en "lisant" des trucs tout faits.
(parce que il y a plusieurs façons de "rédiger", donc il vaut mieux partir du tien, même s'il ne marche pas, et on te dira pourquoi)

Posté par
YoyoElb
re : Programme sous Python 13-01-18 à 14:02

En gros on fait python ya super longtemps en debut d annee , et justement ce dm il nous la donné a faire quand on veux dans l annee et sa comptera comme une note et jen ai besoin ^^

Posté par
mathafou Moderateur
re : Programme sous Python 13-01-18 à 14:13

oui et alors ?
qu'as tu commencé à écrire en Python ? ...
"rien" n'est pas crédible : "apres beaucoup de tentatives"
lesquelles précisément ?

Posté par
carpediem
re : Programme sous Python 13-01-18 à 14:15

mathafou : merci .. mais comment as-tu fait ce quart de cercle coloré et avec les arrondis aux "coins" (d'ailleurs à deux sur trois) de ta première figure ...

Posté par
YoyoElb
re : Programme sous Python 13-01-18 à 14:18

Bah en gros jai demarer en mode lycee normal , jai essayer de rentrer ce que tu ma dit mais justement mon probleme est de transcrire jai essayer plusieurs mots et jy arrive pas

Posté par
mathafou Moderateur
re : Programme sous Python 13-01-18 à 14:58

mais encore une fois qu'as tu précisément essayé

"pour chaque valeur de i de 1 au rayon du cercle"
il faut donc déja le calculer ce rayon du cercle !!
et donc lui donner un nom : par exemple on va l'appeler r

"... à partie entière de racine de n" disait Glapion

c'est ça "r" ! la partie entière de racine de n
donc en Python ça s'écrira r = floor(sqrt(n))

"pour chaque valeur de i de 1 à r (inclus)"
"pour" va se traduire

soit par une boucle explicitement "fabriquée" :
i = 1
while (i <=n):
...
i = i+1

soit par la syntaxe du "pour" de Python
for i in range(1,r+1):
...
pas besoin d'incrémenter i
attention que la borne supérieure du "range" est non comprise, d'où r+1 pour avoir jusqu'à r inclus
etc
vas y...

Posté par
YoyoElb
re : Programme sous Python 13-01-18 à 15:14

Donc:
from lycee import*
n=demande("entrer un nombre")
r=floor(sqrt(r))
for i in range(1,r+1):
        ...

Posté par
alb12
re : Programme sous Python 13-01-18 à 15:32

salut,
encore un sujet interessant
mis à la sauce Xcas (Firefox) sans optimisation

Posté par
YoyoElb
re : Programme sous Python 13-01-18 à 15:37

Wow cest quoi ce que tu viens de faire

Posté par
mathafou Moderateur
re : Programme sous Python 13-01-18 à 16:04

comme on demande de le faire avec Python, donner un programme tout fait avec Xcas est juste "pour info"

from lycee import*
n=demande("entrer un nombre")
r=floor(sqrt(r))
for i in range(1,r+1):
...

continues

que doit il y avoir dans cette première boucle "for" là ?

rappel du "squelette" à traduire

entrée de n et calcul de r
pour chaque valeur de i de 1 au rayon du cercle
pour chaque valeur de j de 1 au rayon du cercle
# i et j sont les coordonnée d'un point à coordonnée entières
si i²+j² <= n # si ce point est intérieur au disque, bord compris, (Pythagore, distance à l'origine <= rayon)
le compter
# (fin du si)
# (fin de la boucle pour j)
# (fin de la boucle pour i)
compléter et afficher le nombre de points total


on a fait ce qui est en rouge
dans cette boucle il y a donc une deuxième boucle (à la place des "..." de là où on en est)

(même si carpediem a signalé qu'on pouvait le faire avec une seule boucle et une autre méthode, savoir faire des boucles imbriquées est important)

"trucs intéressants" à propos de ce sujet, mais HS de l'exo
il y des truc sur pi etc, on en reparlera à la fin et pas avant
peinture Geogebra : j'ai crée une autre discussion là dessus peintures Geogebra (carpediem)

Posté par
YoyoElb
re : Programme sous Python 13-01-18 à 16:11

On doit faire pythagore?

Posté par
mathafou Moderateur
re : Programme sous Python 13-01-18 à 16:40

on doit traduire ce qui est écrit
"Pythagore" c'est pour expliquer pourquoi on calcule i²+j²

tu sembles ne pas comprendre la démarche globale et générale pour faire des algorithmes

1) analyse mathématique du problème
choix d'une méthode mathématique pour le résoudre
à ce stade toute la partie mathématique, ce qu'on calcule et pourquoi on le calcule et comment doit être parfaitement clair
sinon ce n'est même pas la peine de continuer.
à ce stade on vérifie déja que la méthode théorique marche effectivement sur des exemples.

ici on a décidé qu'on allait tester pour chaque point d'un certain rectangle si il était dans le disque ou pas
c'est à dire si sa distance à l'origine était <= n ou pas (c'est là Pythagore)
et de les compter

2) on formalise en français cela sous la forme d'un squelette d'algorithme "en langage naturel"
qui décrit explicitement ce qu'il faut faire pour réaliser cette méthode
on peut y laisser des "commentaires" pour rappeler le pourquoi du comment défini dans la phase 1

3) on le traduit dans le langage qu'on veut
à ce stade on ne se pose plus la question de pourquoi on utilise Pythagore !!
c'est la réflexion mathématique de la première étape qui dit ça.
là aussi on peut (et même on doit) mettre des commentaires expliquant pourquoi on fait ça, à quoi sert telle variable etc

la phase 1 a été en gros faite par le message de Glapion du 12-01-18 à 22:41
mais peut être n'avais tu pas compris ausi bei que cela doit l'être à cette étape
d'où mes dessins pour illustrer la méthode sur des exemples

je t'ai fait la phase 2 le 13-01-18 à 00:04

et maintenant on traduit ça (phase 3) en Python
ce n'est que de la traduction compte tenu des contraintes du langage

sauter des étapes ou tout faire en vrac dan ce processus de réflexion, est le plantage, ou le blocage, assuré.

Posté par
YoyoElb
re : Programme sous Python 13-01-18 à 16:44

Justement jai beaucoup de mal avec cette "traduction"

Posté par
mathafou Moderateur
re : Programme sous Python 13-01-18 à 16:56

il y a marqué "pour" ... donc ça se traduit par un deuxième "for" à l'intérieur du premier

traduire c'est pas réinventer
c'est traduire dans une autre langue (Python) ce qui est déja écrit (= la même chose) en français

from lycee import*
n=demande("entrer un nombre")
r=floor(sqrt(r))
for i in range(1,r+1):
for j in range(1,r+1):
...

Posté par
YoyoElb
re : Programme sous Python 13-01-18 à 16:57

Mais oui punaise cest evident

Posté par
YoyoElb
re : Programme sous Python 13-01-18 à 17:13

Maintenant je dois traduire sa?
le compter
       # (fin du si)
    # (fin de la boucle pour j)
# (fin de la boucle pour i)

Posté par
mathafou Moderateur
re : Programme sous Python 13-01-18 à 17:31

pour compter quelque chose il te faut une variable supplémentaire
que tu initialise à 0 tout au début
et "le compter" se traduira par
cette_variable = cette_variable +1

ou en "raccourci Python"
cette_variable += 1

tu l'appelles comme tu veux, c'est ton algorithme, mais il est recommandé que son nom reflète sa fonction : compter un nombre de points


quant aux "# fin trucmuche"
c'est le mécanisme d'indentation de Python qui définit les fin de blocs d'instructions
(contrairement à d'autres langages ou il y a des mots clkés explicites pour ça)

on peut les mettre en commentaires (commençant par # en Python) qui ne seront pas interprétés par Python
juste pour nous, pour voir au premier coup d'oeil en lisant la programme où sont les boucles.

Posté par
YoyoElb
re : Programme sous Python 13-01-18 à 17:42

Commment initialisee

Posté par
mathafou Moderateur
re : Programme sous Python 13-01-18 à 17:52

????
réfléchis !!!
à croire que tu n'as jamais écrit le moindre algorithme en quoi que ce soit de ta vie
ni sur calculette ni rien.


initialiser ça veut dire donner une valeur initiale à la variable
donc un :
variable = cette valeur

placé tout au début (avant les boucles)

Posté par
YoyoElb
re : Programme sous Python 13-01-18 à 17:58

Donc:

from lycee import*
n=demande("entrer un nombre")
r=floor(sqrt(r))
print(cette_variable)
for i in range(1,r+1):
    for j in range(1,r+1):
cette_variable

Posté par
alb12
re : Programme sous Python 13-01-18 à 22:32

Moralite
Quand un posteur veut un programme:
soit on ne donne rien
soit on donne tout
soit on y passe la nuit

Posté par
Glapion Moderateur
re : Programme sous Python 13-01-18 à 22:50

Et là il a craqué le YoyoElb

Posté par
mathafou Moderateur
re : Programme sous Python 14-01-18 à 08:59

faut dire que ... sans commentaire
recopier un

Citation :
initialiser ça veut dire donner une valeur initiale à la variable
donc un :
variable = cette valeur

placé tout au début (avant les boucles)
en
print(cette_variable)

faut vraiment le faire !!! désolant.

enfin, bof, maintenant le sujet est clos


[HS par rapport à l'exo propremment dit]
une remarque à propos de la relation avec pi :
la limite de nb_points/n quand n tend vers l'infini est pi
intuitivement évident car l'aire est à peu près une somme de carrés d'aire 1, autant de carrés que de points entiers dans le disque

une façon de calculer nb points, qui ne gagne rien en efficacité mais est "amusante" est

nb = 1+4([n/1] - [n/3] + [n/5] - [n/7] ...)

avec [x] = partie entière de x
cette somme infinie s'arrête quand [n/(2k+1)] devient nulle car tous les suivants sont nuls aussi

on ne cherchera pas à démontrer cette formule ici (!)

d'où un algorithme possible pour faire ça (en Python) :

# nombre de points à coordonnées entières dans un disque de rayon sqrt(n)
from math import *
# pour avoir floor etc

n = int(input("n = ")) # un nombre entier, cercle x²+y² = n
nb = 1 # nombre de points, le centre en est toujours un
e = 1 # alternance de signes
k = 1 # nombres impairs
while (k<=n): # tant que la partie entière de n/k est non nulle
nb += 4*e*floor(n/k)
k += 2 # nombre impair suivant
e *= -1 # signes alternés
# fin de la boucle
print(nb," points")


et la remarque sur pi :
la limite de nb/n est 4(1 - 1/3 + 1/5 - 1/7 + ...) = 4*arctan(1) = pi

car on reconnait dans le calcul de la somme la série de arctan(x)

évidement au niveau de l'exo un simple balayage avec les coordonnées suffit et donne un programme aussi simple mais surtout explicable et compréhensible à ce niveau.
même si certains petits pièges sur les bornes sont à éviter soigneusement ...



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 1674 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 !