Help urgent projet étudiant tableau bidimentionel

Signaler
-
Messages postés
14768
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
-
Bonjour,

Nous avons quelques incertitudes quant à un de nos algorithmes et avons pensé à vous pour nous éclairer. Nous travaillons sur le langage python.

Cet algorithme a pour but d’aider un agriculteur. Au préalable il a entré un relevé de températures sur plusieurs mois dans un tableau 2 dimensions, une dimension pour les jours, une autre pour les mois. Dans cet algorithme, l’utilisateur entre une période à analyser : premier jour J1 du premier mois M1 jusqu’au dernier jour J2 du mois M2.

Puis nous avons défini une fonction pour transférer les données de température dans un autre tableau à une dimension pour ensuite trouver les températures minimales, maximales et la moyenne des températures.

Nous avons un problème pour passer du tableau à 2 dimensions et transférer ces données vers un tableau 1 dimension. Notre algorithme n’aboutit pas, nous avons un message d’erreur.

Avez-vous des idées, ou des conseils pour améliorer et faire aboutir notre algorithme ?

Voici le script :
M2019 = [[2,4, -1, 6, 3, 10, 7, 9, 4, -3, 0, -1, 8, 11, 7, 4, 4, 9, 2, 7, 12, 9, 11, 8, 5, 9, 10, 9, 8, 9, 7], 
  [9, 11, 10, 15, 12, 7, 9, 8, 14, 12, 12, 13, 9, 15, 10, 7, 9, 8, 9, 11, 18, 16, 12, 17, 20, 13, 13, 15, 10, 9], 
  [13,10,16,22,20,15,21,14, 24, 22, 19, 21, 15, 17, 18, 20, 20, 22, 25, 24, 26, 19, 22, 21, 24, 15, 18, 17, 23, 20, 21 ]]

#on va demander à l'utilisateur quelle valeurs il veut comparer
J1=(input("saisir le jour de début période :"))
# On veut convertir la variable en un entier, on utilise donc la fonction int qui prend en paramètre la variable
J1 = int(J1)
J1=J1-1
M1=(input("saisir le mois de début de période :"))
# On veut convertir la variable en un entier, on utilise donc la fonction int qui prend en paramètre la variable
M1 = int(M1)
M1=M1-1

#on répère l'opération
J2=(input("saisir le jour de fin de période :"))
J2 = int(J2)
J2=J2-1
M2=(input("saisir le mois de fin de période :"))
M2 = int(M2)
M2=M2-1

#fonction min
def min(t) :
    iMin= 0 #cas évident
    n = len(t)
    for i in range (1,n) :
        if t[i]<t[iMin] :
               iMin=i
               return iMin
def max (t) : 
 iMax= 0 #cas évident
 n= len (t)
 for i in range (1,n) :
  if t[i] > t[iMax] :
   iMax = i
 return iMax


#maintenant on fait une fonction pour faire le tableau de la période demandée

def ConsTR(M2019, J1, M1, J2, M2): # définition de la fonction
    TR = []
    for i in range (M1, M2 + 1):
        if (i == M1):
            for j in range (J1, 32):
                TR.append(M2019[i][j])

        elif (i < M2):
            for j in range (1,32):
                TR.append(M2019[i][j]) 
       
        elif (i == M2):
            for j in range (1,J2+1):
                TR.append(M2019[i][j]) 
                
                return TR
      
TR = ConsTR (M2019, J1, M1, J2, M2)
print (TR[0])

x = min (TR[0])
y = max(TR[0])

print (x)
print (y)

3 réponses

Messages postés
14768
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
433
Bonjour

Tout d'abord indiquer une urgence sur un forum est contre productif.
Le lecteur passe quand il passe et cette indication n'y change rien.
Par contre, quand il voit ça, il peut être tenté de se dire
Encore un qui se réveille au dernier moment, tant pis pour lui
et ne pas répondre.
Donc, on n'affiche pas d'urgence, ça fait rater des réponses.

Ensuite, il y a un truc primordial en Python => l'indentation. Pour qu'elle soit conservée sur le site, il faut utiliser les balises de code. Là, c'est @karamel qui a édité ton message à 16:32 pour les mettre. Pour tes prochains posts, ce petit tuto explique comment bien les utiliser https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Tu peux le remercier

Je ne code pas en Python, je réponds parfois à des questions simples sur le forum.
Et dans ton cas, je ne sais pas si je serais capable de t'aider.
Cependant, trouve le principe pas forcément super logique.

Bon, le tableau à 2 dimensions, admettons, moi j'aurais fait écrit un objet contenant une date et la température et j'aurais fait une liste avec des instances de cet objets.
Déjà on peut travailler, dès le premier jour de relevé (faut pas une année entière comme là), c'est plus facile de découper une période et on peut même travailler sur plusieurs années.
Mais soit.

Ce qui m'interpelle vraiment, c'est de partir d'une tableau à deux entrées, de parcourir toutes les données pour constituer une liste, puis de parcourir cette liste pour chercher l'index de la valeur mini, et recommencer pour l'index de la valeur max.

Je pense que ce serait plus optimisé (et p'tet même plus simple) de tout faire en un seul "parcours".

Tu initialises un jour et un moi mini et maxi au valeurs de départ.
Tu parcours toutes les données tout en testant si la valeur actuelle devient mini ou maxi.
Et voila.

Messages postés
14768
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
433
Bon en fait, l'erreur est assez simple à trouver
Surtout que le message d'erreur (que tu n'as d'ailleurs pas mentionné) est assez clair

File "main.py", line 49, in ConsTR
TR.append(M2019[i][j])
IndexError: list index out of range

Il veut dire que tu veux accéder à un index qui n'existe pas, littéralement l'index est en dehors de l'intervalle, sous entendu l'intervalle d'index existant.

        if (i == M1):
            for j in range (J1, 32): #y'a 32 jours dans un moi?
                print(j)
                TR.append(M2019[i][j])
>
Messages postés
14768
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020

Merci pour cette réponse aussi rapide et inespérée.
En effet oui mon message est urgent, c’est pour un projet à rentre, on y travaille depuis plusieurs semaines et ce travaille constitue une goutte d’eau dans ce qu’on a fait. Bref, peut-être que c’est contre productif mais je ne demande pas de jugement la dessus.

Ensuite, pour cette boucle in range, on doit rajouter n+1 en python il me semble, et comme mes tableaux sont de 31 jours, 31+1 =32 selon moi. Le problème n’est donc pas celui ci.

Ce message étant le premier que je poste sur un forum d’aide je suis assez confuse de recevoir tant de négativité ... c’est vraiment dommage!!
S’il y a d’autres choses, surtout ne pas hésiter.
Messages postés
14768
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
433
Je ne voulais pas être négatif, mais constructif.
Je t'ai expliqué comment mieux rédiger tes prochains messages, pour augmenter tes chances de réponses, et aussi comment lire correctement un message d'erreur.

Et si si, le premier problème (y'en a d'autres, mais un truc à la fois) vient bien du 32.
comme mes tableaux sont de 31 jours,
déjà ça c'est inexact, dans l'année, il y a des mois de 28 (29), 30 et 31 jours donc mettre une valeur de fin fixe ne marchera que pour une partie des mois.

Ensuite, la fonction range, retourne une suite de valeurs entières.
Le premier paramètre est la valeur de départ, le second, le nombre de valeurs retournée.
Donc
range(0,32)
va retourner une liste de 0 à 31, or l'index du 31ème enregistrement est 30.
De plus, si je demande de commencer au 15 du moi, J1 vaut 14 et
range(14,32)
va retourner une liste de 14 à 45.

Donc, ça ne peut jamais être 32, mais en plus ça dépend du tableau que tu es entrain de lire et du jour de départ.

D'accord je comprend mieux maintenant !
j'ai corrigé 2/3 éléments, mais pourquoi la fonction .append ne fonctionne pas ?
Messages postés
14768
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
433
Il faudrait que tu postes ton code actuel, parce que de mon côté, avec ton code d’origine, je n’ai pas eu de problème avec append.