#### TP n°3: Algorithmes de base sur les listes ####
#################


### INTRODUCTION AUX LISTES ###

## Question 1 
l=[1,3,9,2,-3.5,12,13.1]
for i in range(0,len(l)):
    print(l[i])
## Question 2 
l=[1,3,9,2,-3.5,12,13.1]
for i in range(0,len(l)):
    if l[i]%2==0:
        print(l[i])
## Question 3 
l=[1,3,9,2,-3.5,12,13.1]
for i in range(0,len(l)):
    if l[i]>=10:
        print(i)
## Question 4 
l=[1,3,9,2,-3.5,12,13.1]
for i in range(0,len(l)):
    if l[i]%2==1:
        l[i]=2*l[i]
print(l)
## Question 5 
l=[]
for n in range(0,10):
    l.append(n**2+3*n+2)
print(l)
## Question 6 
def intervalle(x,y):
    l=[]
    if x<=y:
        for i in range(x,y+1):
            l.append(i)
    else:
        for i in range(y,x+1):
            l.append(i)
    return l
## Test de la fonction `intervalle`; **à exécuter sans éditer**
ok=True
if intervalle(3,9)!=[3,4,5,6,7,8,9]: ok=False
if intervalle(7,4)!=[4,5,6,7]: ok=False
if intervalle(-2,2)!=[-2,-1,0,1,2]: ok=False
if intervalle(5,5)!=[5]: ok=False
if ok:
    print("Fonction intervalle: test réussi!")
else:
    print("Fonction intervalle: test échoué!")




### ALGORITHMES DE BASE SUR LES LISTES ###

## Question 7 : Somme des termes d'une liste
def somme_liste(L):
    """ calcule la somme des termes d'une liste
    argument: L: une liste
    renvoie: la somme des éléments """
    s=0
    n=len(L)
    for i in range(n):
        s=s+L[i]
    return s
## Test de la fonction `somme_liste`; **à exécuter sans éditer**
ok=True
if somme_liste([1,2,3])!=6: ok=False # test sur des entiers
if abs(somme_liste([-1.3,0.1,10.4])-9.2)>1e-14: ok=False # test sur des flottants
if somme_liste([])!=0: ok=False # test de la liste vide
if ok:
    print("Fonction somme_liste: test réussi!")
else:
    print("Fonction somme_liste: test échoué!")
## Question 8 : Moyenne des termes d'une liste
def moyenne_liste(L):
    """ calcule la moyenne des termes d'une liste
    argument: L: une liste
    renvoie: la moyenne des éléments """
    s=0
    for i in range(len(L)):
        s=s+L[i]
    return s/len(L)
## Test de la fonction `moyenne_liste`; **à exécuter sans éditer**
ok=True
if abs(moyenne_liste([1,2,3])-2)>1e-14: ok=False # test sur des entiers
if abs(moyenne_liste([-1.3,0.1,10.4])-3.06666666666666666666)>1e-14: ok=False # test sur des flottants
if ok:
    print("Fonction moyenne_liste: test réussi!")
else:
    print("Fonction moyenne_liste: test échoué!")
## Question 9 : Existence d'un terme
def contient_element(L,a):
    """ Teste la présence d'un élément dans une liste 
    argument: L: une liste
              a: un élément
    renvoie: True ou False """
    for i in range(len(L)):
        if L[i]==a:
            return True
    return False
## Test de la fonction `contient_element`; **à exécuter sans éditer**
ok=True
if contient_element([1,2,3,1,5],1)!=True: ok=False 
if contient_element([1,2,3,1,5],5)!=True: ok=False 
if contient_element([1,2,3,1,5],4)!=False: ok=False
if ok:
    print("Fonction contient_element: test réussi!")
else:
    print("Fonction contient_element: test échoué!")
## Question 10 : Nombre d'occurences d'un terme
def compte_element(L,a):
    """ Compte la présence d'un élément dans une liste 
    argument: L: une liste
              a: un élément
    renvoie: le nombre de fois que a apparaît dans L """
    c=0
    for i in range(len(L)):
        if L[i]==a:
            c=c+1
    return c
## Test de la fonction `compte_element`; **à exécuter sans éditer**
ok=True
if compte_element([1,2,3,1,5],1)!=2: ok=False 
if compte_element([1,2,3,1,5],5)!=1: ok=False 
if compte_element([1,2,3,1,5],4)!=0: ok=False
if ok:
    print("Fonction compte_element: test réussi!")
else:
    print("Fonction compte_element: test échoué!")
## Question 11 : Recherche du maximum/minimum
def min_liste(L):
    """ renvoie la valeur min d'une liste
    données: L: la liste des valeurs (de longueur>0)
    renvoie: le minimum """
    min=L[0]
    for i in range(len(L)):
        if L[i]<min:
            min=L[i]
    return min
def max_liste(L):
    """ renvoie la valeur min d'une liste
    données: L: la liste des valeurs (de longueur>0)
    renvoie: le minimum """
    max=L[0]
    for i in range(len(L)):
        if L[i]>max:
            max=L[i]
    return max
## Test de la fonction `min_liste et max_liste`; **à exécuter sans éditer**
ok=True
if min_liste([2,1,3,5,10,3,7])!=1: ok=False # nombres positifs 
if min_liste([0,-2,5,4,-12,10])!=-12: ok=False # signes quelconques
if max_liste([2,1,3,5,10,3,7])!=10: ok=False 
if max_liste([-2,-5,-4,-12,-10])!=-2: ok=False
if max_liste([-2,-5,-4,-1,-10])!=-1: ok=False
if ok:
    print("Fonction min_liste et max_liste: test réussi!")
else:
    print("Fonction min_liste et max_liste: test échoué!")
### AUTRES ALGORITHMES SUR LES LISTES ###
## Question 12 : Miroir d'une liste
def miroir(L):
    L2=[]
    for i in range(len(L)):
        L2.append(L[len(L)-i-1])
    return L2
## Test de la fonction `miroir`; **à exécuter sans éditer**
ok=True
if miroir([1,3,4,5,3])!=[3,5,4,3,1]: ok=False
if miroir([1,3,4,3])!=[3,4,3,1]: ok=False
if miroir([1,1,1])!=[1,1,1]: ok=False
if ok:
    print("Fonction miroir: test réussi!")
else:
    print("Fonction miroir: test échoué!")
## Question 13 : Distance entre deux listes
def distance_listes(L1,L2):
    if len(L1)!=len(L2):
        return -1
    else:
        s=0
        for i in range(len(L1)):
            s=s+(L1[i]-L2[i])**2
        return s
## Test de la fonction `distance_listes`; **à exécuter sans éditer**
ok=True
if distance_listes([1,3,3],[2,2,2.5,0])!=-1: ok=False
if distance_listes([1,3,3,3],[2,2,3,0])!=11: ok=False
if ok:
    print("Fonction distance_listes: test réussi!")
else:
    print("Fonction distance_listes: test échoué!")
## Question 14 : Écart entre deux listes
def ecart_min_listes(L1,L2):
    if len(L1)!=len(L2):
        return -1
    else:
        emin=abs(L1[0]-L2[0])
        for i in range(len(L1)):
            if abs(L1[i]-L2[i])<emin:
                emin=abs(L1[i]-L2[i])
        return emin
## Test de la fonction `ecart_min_listes`; **à exécuter sans éditer**
ok=True
if ecart_min_listes([1,3,3,3],[2,2,2.5,0])!=0.5: ok=False
if ecart_min_listes([1,3,3],[2,2,2.5,0])!=-1: ok=False
if ecart_min_listes([1,3,3,3],[2,2,3,0])!=0: ok=False
if ecart_min_listes([0,0,0,0],[10000,30000,30000,30000])!=10000: ok=False
if ok:
    print("Fonction ecart_min_listes: test réussi!")
else:
    print("Fonction ecart_min_listes: test échoué!")
## Question 15 : Suppression des doublons
def supprime_doublons(L):
    L2=[]
    for i in range(len(L)):
        if contient_element(L2,L[i])==False:
            L2.append(L[i])
    return L2
## Test de la fonction `supprime_doublons`; **à exécuter sans éditer**
ok=True
if supprime_doublons([1,3,4,2,4,3,1,5])!=[1,3,4,2,5]: ok=False
if supprime_doublons([1,2,3])!=[1,2,3]: ok=False
if supprime_doublons([1,1,1,1,1,1,1])!=[1]: ok=False
if ok:
    print("Fonction supprime_doublons: test réussi!")
else:
    print("Fonction supprime_doublons: test échoué!")
### ANALYSE D'UN TABLEAU DE DONNÉES ###

## Question 16 


## Question 17 
for colonne in range(ncol):
    print(datas[10,colonne])
## Question 18 : Température moyenne sur l'ensemble du tableau
somme=0
for ligne in range(0,nli):
    somme=somme+datas[ligne,6]
print("Température moyenne: "+str(somme/nli))
## Question 19 : Température moyenne dans un département
def t_moy_dep(dep):
    """ calcule la température moyenne d'un département 
    arguments: dep: numéro du département
    renvoie: la température moyenne du département sélectionné """
    somme=0
    compteur=0
    for ligne in range(nli):
        if datas[ligne,3]==dep:
            somme=somme+datas[ligne,6]
            compteur=compteur+1
    return somme/compteur

print("Loire: "+str(t_moy_dep(42)))
print("Haute-Loire: "+str(t_moy_dep(43)))
## Question 20 : Température moyenne sur un mois
def t_moy_mois(annee,mois,dep):
    """ calcule la température moyenne d'un département sur un mois particulier
    arguments: annee: numéro de l'année
               mois: numéro du mois
               dep: numéro du département
    renvoie: la température moyenne du mois sélectionné """
    somme=0
    compteur=0
    for ligne in range(nli):
        if datas[ligne,0]==annee and datas[ligne,1]==mois and datas[ligne,3]==dep:
            somme=somme+datas[ligne,6]
            compteur=compteur+1
    return somme/compteur

for mois in range(1,13): # les mois vont de 1 à 12
    print(t_moy_mois(2020,mois,42))
## Question 21 
tmoy_2020=[]
for mois in range(1,13):
    tmoy_2020.append(t_moy_mois(2020,mois,42))
liste_mois=[1,2,3,4,5,6,7,8,9,10,11,12]
import matplotlib.pyplot as plt
plt.figure()
plt.plot(liste_mois,tmoy_2020)
plt.show()
## Question 22 : Histogramme des températures
def extrait_tmoy_annee(annee,dep):
    """ Extrait les températures moyennes de tous les jours d'une année particulière
    arguments: annee: numéro de l'année
               dep: numéro du département
    renvoie: le tableau de toutes les températures moyenne de ce mois """
    liste_tmoy=[]
    for ligne in range(nli):
        if datas[ligne,0]==annee and datas[ligne,3]==dep:
            liste_tmoy.append(datas[ligne,6])
    return liste_tmoy

liste_tmoy_2020=extrait_tmoy_annee(2020,42)
import matplotlib.pyplot as plt
plt.figure()
plt.hist(liste_tmoy_2020,bins="auto")
plt.show()
## Question 23 
def tmin_mois(annee,mois,dep):
    """ renvoie la température min atteinte lors d'un mois particulier
    arguments: annee: numéro de l'année
               mois: numéro du mois
               dep: numéro du département
    renvoie: la température minimale """
    min=1000 # valeur extrême
    for ligne in range(nli):
        if datas[ligne,0]==annee and datas[ligne,1]==mois and datas[ligne,3]==dep:
            if min>datas[ligne,4]:
                min=datas[ligne,4]
    return min
def tmax_mois(annee,mois,dep):
    """ renvoie la température max atteinte lors d'un mois particulier
    arguments: annee: numéro de l'année
               mois: numéro du mois
               dep: numéro du département
    renvoie: la température maximale """
    max=-1000 # valeur extrême
    for ligne in range(nli):
        if datas[ligne,0]==annee and datas[ligne,1]==mois and datas[ligne,3]==dep:
            if max<datas[ligne,4]:
                max=datas[ligne,4]
    return max
l_min=[]
l_max=[]
for mois in range(12):
    l_min.append(tmin_mois(2020,mois+1,42))
    l_max.append(tmax_mois(2020,mois+1,42))
import matplotlib.pyplot as plt
plt.figure()
plt.plot(l_min,color="blue",label="Tmin")
plt.plot(l_max,color="red",label="Tmax")
plt.legend()
plt.show()
