#### TP n°2: Bases de la programmation en Python ####
#################


### L'ENVIRONNEMENT DE PROGRAMMATION ###

### OPÉRATIONS DE BASE ###

### LECTURE ET AFFICHAGE ###

## Question 1 
n=int(input("Entrez un entier: "))
print("Le carré de cet entier est "+str(n**2))
### BRANCHEMENTS CONDITIONNELS ###

## Question 2 
n=float(input("Entrer votre note: "))
if n>=10:
    print("Bravo, vous avez eu la moyenne")
else:
    print("Il va falloir travailler un peu plus")
## Question 3 
n=int(input("Entrez un entier: "))
if n%2==0:
    print("Cet entier est pair")
else:
    print("Cet entier est impair")
## Question 4 
annee=int(input("Entrez une année: "))    
if annee%4!=0:
    bissextile=False
else:
    if annee%100!=0:
        bissextile=True
    else:
        if annee%400==0:
            bissextile=True
        else:
            bissextile=False
if bissextile:
    print("L'année " + str(annee) + " est bissextile")
else:
    print("L'année " + str(annee) + " n'est pas bissextile")
### BOUCLES ###

## Question 5 
for i in range(1,11):
    print(i**2)
## Question 6 
for i in range(3,100,3):
    print(i)
## Question 7 
for i in range(1,11):
    print("*" * i)
## Question 8 
valeur=float(input("Entrez un réel:"))
while valeur>1:
    print(valeur)
    valeur=valeur/2
### LES FONCTIONS ###

## Question 9 
def carre(x : float) -> float :
    """ Calcule le carré d'un réel
    argument: x: réel
    renvoie: le carré de x """
    return x**2
## Test de la fonction `carre`; **à exécuter sans éditer**
ok=True
if carre(2)!=4: ok=False
if carre(-1)!=1: ok=False
if ok:
    print("Fonction carre: test réussi!")
else:
    print("Fonction carre: test échoué!")
## Question 10 
def coupe_note(note : float) -> float:
    """ Conditionne une note entre 0 et 20
    argument: note: réel
    renvoie: la note ramenée entre 0 et 20 """
    if note<0:
        return 0
    else:
        if note>20:
            return 20
        else:
            return note
## Test de la fonction `coupe_note`; **à exécuter sans éditer**
ok=True
if coupe_note(13)!=13: ok=False
if coupe_note(-2)!=0: ok=False
if coupe_note(25)!=20: ok=False
if ok:
    print("Fonction coupe_note: test réussi!")
else:
    print("Fonction coupe_note: test échoué!")
## Question 11 
def somme_entiers(n) -> int:
    """ Calcule la somme des entiers de 1 à n
    argument: n: entier strictement positif
    renvoie: la somme """
    s=0
    for i in range(1,n+1):
        s=s+i
    return s
## Test de la fonction `somme_entiers`; **à exécuter sans éditer**
ok=True
if somme_entiers(5)!=15: ok=False
if somme_entiers(10)!=55: ok=False
if ok:
    print("Fonction somme_entiers: test réussi!")
else:
    print("Fonction somme_entiers: test échoué!")
## Question 12 : Algorithme d'Euclide
def pgcd(a,b) -> int:
    """ renvoie le PGCD de a et b """
    if a<b: # inversion de a et b
        t=b
        b=a
        a=t
    while b>0:
        r=a%b
        a=b
        b=r
    return(a)
## Test de la fonction `pgcd`; **à exécuter sans éditer**
ok=True
if pgcd(10,4)!=2: ok=False
if pgcd(4,10)!=2: ok=False
if pgcd(4,4)!=4: ok=False
if pgcd(11,4)!=1: ok=False
if ok:
    print("Fonction pgcd: test réussi!")
else:
    print("Fonction pgcd: test échoué!")
### LES MODULES (OU BIBLIOTHÈQUES) ###

### EXERCICES DIVERS ###
## Question 13 : Nombres premiers
def est_premier(n) -> bool:
    """ teste si un nombre est premier """
    premier=True
    for i in range(2,n):
        if n%i==0:
            return(False)
    return(True)
## Test de la fonction `est_premier`; **à exécuter sans éditer**
ok=True
if est_premier(10): ok=False
if not(est_premier(13)): ok=False
if est_premier(9): ok=False
if ok:
    print("Fonction est_premier: test réussi!")
else:
    print("Fonction est_premier: test échoué!")
## Question 14 
for i in range(2,101):
    if est_premier(i):
        print(i)
## Question 15 
def compte_premiers(n) -> int:
    """ compte le nombre de nombres premiers entre 2 et n """
    compte=0
    for i in range(2,n+1):
        if est_premier(i):
            compte=compte+1
    return compte
## Test de la fonction `compte_premiers`; **à exécuter sans éditer**
ok=True
if compte_premiers(10)!=4: ok=False
if compte_premiers(20)!=8: ok=False
if ok:
    print("Fonction compte_premiers: test réussi!")
else:
    print("Fonction compte_premiers: test échoué!")
## Question 16 
n=int(input("Entrez un entier: "))
produit=1
for i in range(1,n+1):
    produit=produit*i
print(produit)
## Question 17 
n=int(input("Entrez n: "))
u=1
for i in range(1,n+1):
    u=(u+3)/2
print(u)
## Question 18 : Suite de Syracuse
def duree_Syracuse(u0) -> int:
    """ calcul le nombre de termes de la suite de Syracuse pour atteindre 1 """
    u=u0
    n=0
    while u!=1:
        if u%2==0:
            u=u//2
        else:
            u=3*u+1
        n=n+1
    return(n)
## Test de la fonction `duree_Syracuse`; **à exécuter sans éditer**
ok=True
if duree_Syracuse(3)!=7: ok=False
if duree_Syracuse(123)!=46: ok=False
if ok:
    print("Fonction duree_Syracuse: test réussi!")
else:
    print("Fonction duree_Syracuse: test échoué!")
## Question 19 : Suite de Fibonacci
n=int(input("Entrez un entier: "))
liste=[0,1]
for i in range(2,n):
    liste.append(liste[i-2]+liste[i-1])
print(liste)
## Question 20 : Sapin
def triangle(i , offset):
    """ dessine un triangle d'étoiles
    argument: i: entier
                offset: entier
    ne renvoie rien, mais dessine un triangle de 1 étoiles jusqu'à (2*i+1) étoiles, centré en offset """
    for j in range(i+1):
        print((" "*(offset-j))+("*"*(2*j+1)))
def sapin(n):
    """ dessine un sapin """
    for i in range(1,n+1):
        triangle(i,n)
sapin(4)
