(je ne sais pas si vous pouvez le voir si vous n'êtes pas inscrit ?)
Bref le but est de lisser un signal.
On nous donne un nombre de mesures, une différence maximum entre les éléments à atteindre, et les mesures, et on doit ressortir un nombre de lissages nécessaires.
Je vous donne maintenant mon code :
nbMesures = int(input())
diffMax = float(input())
listeMesures = []
listeTempo = [0] * nbMesures
lissage = 0
ecartMax = 0
encore = True
for _ in range(nbMesures) :
mesures = float(input())
listeMesures.append(mesures)
while encore :
for ind in range(nbMesures) :
listeTempo[0] = listeMesures[0]
listeTempo[nbMesures-1] = listeMesures[nbMesures-1]
if 1 <= ind < nbMesures - 1 :
listeTempo[ind] = (listeMesures[ind-1]+listeMesures[ind+1])/2
if abs(listeTempo[ind+1] - listeTempo[ind]) > ecartMax :
ecartMax = abs(listeTempo[ind+1] - listeTempo[ind])
lissage += 1
listeMesures = listeTempo
if ecartMax< diffMax :
encore = False
print(listeMesures)
print(lissage)
Problème : ma boucle est infinie....et je ne comprends pas pourquoi.
Je calcule les moyennes et les mets dans une autre liste, ensuite je calcule l'écart maximum entre mes mesures (lissées), et si l'écart maximum est inférieur à celui demandé j'arrête avec
Il y a pas mal de possibilités d’alléger le code. Ça aidera surement a trouver la raison :
nbMesures = int(input())
diffMax = float(input())
listeMesures = []
listeTempo = [] # pas besoin de le remplir de 0 .. et il faut se mefier du [qqch] * n
lissage = 0
listeMesures = [float(input()) for _ in range(nbMesures)]
while True:
ecartMax = 0 # il faut bien penser a reset l'ecart max à chaque itération ;).. sinon ca break pas
listeTempo[0].append(listeMesures[0]) # pas besoin de mettre ca dans le for loop
for ind in range(1, nbMesures-1) : # du coup tu peux changer le range et virer le if
y = (listeMesures[ind-1]+listeMesures[ind+1])/2
listeTempo.append(y)
ecartMax = max(ecartMax , abs(listeTempo[ind-1] - listeTempo[ind])) # le if peut etre remplacé par un simple max + changement d'index
listeTempo[-1].append(listeMesures[-1]) # pas besoin de mettre ca dans le for loop et -1 recup le dernier aussi
ecartMax = max(ecartMax , abs(listeTempo[-2] - listeTempo[-1])) # ecart avec le dernier index lissage += 1
listeMesures = listeTempo
if ecartMax < diffMax :
break # plus propre que changer le "encore"
print(listeMesures)
print(lissage)
Tu perdra peut etre un tout petit peu de vitesse avec les append vs une liste de 0... A toi de voir ce que tu veux utiliser
Et donc l'erreur vient de fait que tu ne reset pas ecartMax a chaque tour
EDIT : Version avec declaration du tableau
nbMesures = int(input())
diffMax = float(input())
listeMesures = []
listeTempo = [0 for _ in range(nbMesures)]
lissage = 0
listeMesures = [float(input()) for _ in range(nbMesures)]
while True:
ecartMax = 0
listeTempo[0] = listeMesures[0]
for ind in range(1, nbMesures-1) :
y = (listeMesures[ind-1]+listeMesures[ind+1])/2
listeTempo[ind] = y
ecartMax = max(ecartMax , abs(listeTempo[ind-1] - listeTempo[ind]))
listeTempo[-1] = listeMesures[-1]
ecartMax = max(ecartMax , abs(listeTempo[-2] - listeTempo[-1]))
lissage += 1
listeMesures = listeTempo
if ecartMax < diffMax :
break
print(listeMesures)
print(lissage)
Attention, ton code même corrigé, contient encore plusieurs erreurs. La plus embêtante est l'écrasement d'un tableau par l'autre à ta ligne 23 (il faut plutôt les échanger, l'idée étant que tu disposes d'un tableau correct et d'un buffer).
On peut aussi ne pas utiliser de buffer (le tableau temporaire) mais le code est bien plus compliqué.
C'est pour ça qu'il faut faire des tests en remontant depuis les choses évidentes.
Ici si ta boucle est infinie, c'est que ta condition de sortie (l'entrée dans le if ligne 25) ne s'exécute pas:
si elle s'exécute pas, c'est que ecartMax n'est jamais inférieur à diffMax
vu ton code, seule ecartMax varie, diffMax est constante, donc on colle un print(ecartMax) dans la boucle, et on regarde si c'est conforme à ce qu'on voulait.
C'est pour ça qu'il faut faire des tests en remontant depuis les choses évidentes.
Personnellement, quand j'ai une boucle vraiment infinie, je la casse sans trop tarder en une boucle for et j'analyse la condition. Dans le code posté plus haut ça donnerait :
nbMesures = int(input())
diffMax = float(input())
listeMesures = []
listeTempo = [0] * nbMesures
lissage = 0
ecartMax = 0
encore = True
for _ in range(nbMesures):
mesures = float(input())
listeMesures.append(mesures)
#while encore :
for nro in range(15):
print("n°:", nro)
print(listeMesures)
for ind in range(nbMesures):
listeTempo[0] = listeMesures[0]
listeTempo[nbMesures - 1] = listeMesures[nbMesures - 1]
if 1 <= ind < nbMesures - 1:
listeTempo[ind] = (
listeMesures[ind - 1] + listeMesures[ind + 1]) / 2
if abs(listeTempo[ind + 1] - listeTempo[ind]) > ecartMax:
ecartMax = abs(listeTempo[ind + 1] - listeTempo[ind])
lissage += 1
listeMesures = listeTempo
if ecartMax < diffMax:
encore = False
print(encore)
print("---------------------------------------")
print(listeMesures)
print(lissage)
Le problème c'est que.....c'était trop facile mon erreur.
Donc j'ai lu et relu mon code dont j'étais pas très sure, sans penser que ça venait du calcul du maximum....Que normalement je fais les yeux fermés.
Enfin, non, il faut pas, la preuve. Du coup je l'ai pas suffisamment analysé celui-là, j'ai pensé à un truc...mal fait ailleurs.
Je débute, je n'ai pas encore assez d'expérience pour analyser et trouver mes erreurs malheureusement. MAis j'y travaille
Effectivement, il y a une erreur dans le calcul du maximum mais le plus gênant est en amont, c'est ton écrasement de liste. Au passage, il n'est pas nécessaire de calculer le maximum, il suffit juste de comparer les écarts à diffMax.
Attention, ton code même corrigé, contient encore plusieurs erreurs. La plus embêtante est l'écrasement d'un tableau par l'autre à ta ligne 23 (il faut plutôt les échanger, l'idée étant que tu disposes d'un tableau correct et d'un buffer).
On peut aussi ne pas utiliser de buffer (le tableau temporaire) mais le code est bien plus compliqué.
Je n'ai pas crée de compte sur France IOI pour tester le code mais en effet, il y a surement un soupcon à avoir sur cet assignement. Ajouter [:] pour avoir une copie leverait ce risque
Attention, ton code même corrigé, contient encore plusieurs erreurs. La plus embêtante est l'écrasement d'un tableau par l'autre à ta ligne 23 (il faut plutôt les échanger, l'idée étant que tu disposes d'un tableau correct et d'un buffer).
On peut aussi ne pas utiliser de buffer (le tableau temporaire) mais le code est bien plus compliqué.
Je n'ai pas crée de compte sur France IOI pour tester le code mais en effet, il y a surement un soupcon à avoir sur cet assignement. Ajouter [:] pour avoir une copie leverait ce risque
Oui mais ce serait faire une copie à chaque tour de boucle. Ici, il faut un tableau qui dispose de l'état du lissage à chaque étape et un buffer à extrémités fixes qui sert juste à se faciliter les calculs. On fait n-2 écritures par tour de boucle (l'autre tableau étant utilisé en lecture), à la fin de la boucle le buffer contient l'état courant du lissage et il faut donc échanger les deux tableaux comme on échangerait deux pointeurs en C.
Je ne suis pas sûre d'avoir compris tout ce que vous avez dit
Enfin je viens de tester mon programme.....il n'est pas bon, il réussit 13 tests/17. Donc y a un petit truc, quelque part, qui ne va pas.
Edit : en fait, quand il n'y a pas besoin de lissages, c'est à dire quand lissage =0, mon programme sort lissage =1
Faut que je trouve le moyen de comparer les mesures avant le premier lissage. Facile à faire, mais très lourd. Y a surement un moyen de faire ça sans que ce soit lourd.
J'ai modifié mon code, pour rechercher d'abord ecartMax AVANT de lisser. Ce qui est en effet + logique.
Donc ça fonctionne... presque. Mon programme réussit 16 tests/17. Donc y a 1 cas que je n'ai pas géré, mais je ne sais pas lequel. On ne nous donne pas les données fournies pour les tests
Le code :
nbMesures = int(input())
diffMax = float(input())
listeMesures = []
listeTempo = [0] * nbMesures
lissage = 0
ecartMax = 0
encore = True
for _ in range(nbMesures) :
mesures = float(input())
listeMesures.append(mesures)
while encore :
for ind in range(nbMesures) :
if 1 <= ind < nbMesures - 1 :
if abs(listeMesures[ind] - listeMesures[ind-1]) > ecartMax :
ecartMax = abs(listeMesures[ind] - listeMesures[ind-1])
if ecartMax < diffMax :
encore = False
else :
listeTempo[0] = listeMesures[0]
listeTempo[nbMesures-1] = listeMesures[nbMesures-1]
for ind in range(nbMesures) :
if 1 <= ind < nbMesures - 1 :
listeTempo[ind] = (listeMesures[ind-1]+listeMesures[ind+1])/2
lissage += 1
listeMesures = listeTempo
listeTempo = [0] * nbMesures
ecartMax = 0
print(lissage)
Si quelqu'un a une idée de ce qui n'est pas géré...je prends
Edit 3 : c'est bon. C'était la ligne 16, il fallait mettre : if1<=ind <= nbMesures -1:
Ton erreur provient de la ligne 16 (je viens de tester ton code et après rectification, ça passe tous les tests). Au demeurant, cette ligne est assez maladroite vu la ligne 15.
EDIT
Je n'avais pas vu ton edit. Autant remplacer les lignes 15-16 :
forind inrange(nbMesures) :
if1<=ind < nbMesures -1:
par
for ind in range(1, nbMesures) :
Comme te l'avais suggéré conio63.
Sinon, c'est bien d'avoir persévéré même si ton code peut être amélioré et optimisé.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Découverte Python Doc Tkinter Les chaînes de caractères
Blond, bouclé, toujours le sourire aux lèvres...
Découverte Python Doc Tkinter Les chaînes de caractères
Blond, bouclé, toujours le sourire aux lèvres...
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères