PYTHON 2.7 FEUILLE n°24 Ter ex TURTLE

                             PYTHON 2.7       FEUILLE n° 24  Ter      sur  Turtle  

           COURS:

                 # Changer un carctère d'une chaîne c'est en fait 

                    créer une chaîne  identique sauf  le caractère en question.

                    En fait la chaîne de départ a été effacée et remplacée. 

                     On ne peut pas directement y changer un caractère.                   

                 Exemple:

                 Soit chaine="maison". 

                On ne veut pas du "s" d'indice 3 dans chaîne .

                Pour l'obtenir on ne peut pas dire:     maison[3]= ""    

                Soit on utilise la commande spéciale de Python 2.7 qui fait ce travail

                                             chaine.replace( ".. .ancien  ... " ," ....nouveau... ")

                en changeant un morceau de chaine par un autre .

               Soit on écrit le programme suivant où l'on voit le processus:                                 

from random import*
def exemple():
      chaine="maison"
      print "chaîne = ", chaine
      C=""
      for i in [0,1,2,4,5]:
           C=C+chaine[i]
      chaine=C
      print "chaîne = ",chaine
      

                                 On obtient en activant exemple()

>>> exemple()
chaine =  maison
chaine =  maion
>>>    

                 Avec replace on écrit:

from random import*
def situation():
       chaine="maison"
       print "chaine = ", chaine
       chaine.replace("s","")            # "s" est remplacé par la chaine vide 
       print "chaine = ",chaine 

                         On obtient pareil:

>>> situation()
chaine =  maison
chaine =  maison

>>>                    

                  # Notion de tuple:                  

                     C'est comme une liste mais avec des parenthèses au lieu de crochets 

                     et l'impossibilité, comme pour les chaines, d'en modifier le contenu.

                      Par exemple:     ( 14,"a", 34, 56, "mai" )

                 # Pour transformer une chaine en un entier il y a la méthode qui consiste à utiliser int(chaîne)

                 Par exemple : int("100") est sensé nous donner l'entier 100

                 Mais il arrive parfois que cela soit refusé par Python avec un message du genre:

                                 ValueError : invalid literal for int() with base 10: 

                Ce n'est donc pas fiable.  Donc il nous faut autre chose.

                 LA METHODE EST:

                Créer un entier dont le string est la chaine "100" de départ.

               On fait balayer, à l'aide d'une boucle for, par la variable i les entiers de 0 à 10000 ,

               voire plus, jusqu'à avoir str(i) qui soit "100".

               Ainsi l'entier i trouvé sera 100.

              La méthode fonctionne pour toute chaine de chiffres .

              #  Il peut nous arriver d'avoir une chaine M du style  M = "100G30"   .

                 Nous souhaitons avoir un entier dont le sring est la partie de la chaine avant le G

                et  un entier dont le sring est la partie de la chaine après  le G.

               On détermine d'abord l'indice i de la lettre G  avec  M.index("G")

               Le morceau de chaine avant  le G est  M[ :i]

               Donc    M[ : i] = "100" 

               Le morceau de chaine après  le G est  M[ i+1 :]

              Donc    M[ i +1 : ] =  "30" 

               On a aussi : G[i] = "G"

              La méthode exposée plus haut  permet alors  d'obtenir  deux entiers dont les

              strings sont de part et d'autre de G

       -----------------------------------------------------------------------------

    EXERCICE 1

          "Archie",  qui est encore très jeune, ne sait pas ce que donne le script,

          en Python 2.7,  suivant .

          Pouvez-vous l'aider ?  

from turtle import*
from random import*
def tour():
      speed("fast")
      width(2)    
         # Les Tours     
      vit()   
      transfert(220,0)    
      vit()

      transfert(100,-90)    
                    # La Facade centrale    
      for k in [10,15,130,135]:
           rect(120,k)
      transfert(98,-90)
      tri(120)
      forward(10)
      tri(100)
      forward(50) 
              # La Rosace   
      circle(28)
      fill=color("purple")
      penup()
      left(90)
      forward(7)
      right(90)
      pendown()
      circle(20)
      for k in range(10,19):
           fill=color("yellow")
           circle(k)
      fill=color("purple"
           # Complément du motif de la tour    
      transfert(5,3)   
      rect(85,3)
      transfert(225,3)   

      rect(85,3)   
           # Les Portes latérales   
      transfert(27,-150)   
      rect(45,60)
      forward(10)
      rect(25,60)
      transfert(250,-150)   
      rect(45,60)
      forward(10)
      rect(25,60)
      transfert(120,-150)    
            # La Porte Principale   
       rect(80,60)
       forward(10)
       rect(60,60)
       left(20)
       forward(33)
       right(40)
       forward(33)   
                  # Le Toit des tours   
       transfert(5,-10)   
       right(-20)    
       rect(90,105)
       transfert(225,-10)
       rect(90,105)
       clocher()
def clocher():    
      transfert(137,-22)
      fill=color("blue")
      left(83)
      forward(180)
      right(166)
      forward(179)

      transfert(0,0)       
def transfert(x,y):
      penup()
      goto(x,y)
      pendown()          
def vit():
       color("red")
       for k in [230,120,220,10,215,115,5]:
           rect(100,k)        
       forward(25)
       right(90)
       depl(25)
       left(90)
       for i in range(3,18,4):
             pendown()
             color("blue")
             rect(i,75)
       depl(35)
       for i  in range(3,18,4):
             pendown()
             color("blue")
             rect(i,75)            
       color("black")
       penup()
def depl(s):
      penup()
      forward(s)
      pendown()
def tri(a):
      for i in range(3):
            forward(a)
            left(120)     
def rect(p,v):
      for i in range(2):
            forward(p)
            right(90)
            forward(v)
            right(90)
      penup

              Pour obtenir la réponse 

             activer tour()

           Vous aurez un aperçu d'un édifice.

                                      Edificeturtle

---------------------------------------------------------------------------------------------------------------------------------------------------------------

       EXERCICE 2

             Donner un script, en Python 2.7,  qui donne un entier dont les chiffres dans l'ordre

            sont ceux de la chaine "100".

--------------------------------------------------------------------------

 REPONSE:

                 On peut proposer :

from random import*
    
def rendentier():    
       chaine=raw_input("Donner une chaîne de chiffres comme 100  ")
       for i in range(100000):
             if str(i)==chaine:
                  print " On obtient " , i  

         Cela donne en activant rendentier()

>>> rendentier()
Donner une chaîne de chiffres comme 100   100
 On obtient  100
>>> 

                   Ici  chaine est un string  car sais par raw_input(  )

                  Le résultat final est  lui un entier dont le str est la chaine

---------------------------------------------------------------------------------------------------------------

     EXERCICE 3

           Donner un script, en Python 2.7 , qui  quand on saisit une chaine,  

           par exemple comme "100G30"  ,   déplace dans l'écran de

           Turtle, la souris avec le même effet que

            goto(100,30 ) mais sans trace.

--------------------------------------------------------------------------------------------

      REPONSE: 

           On peut proposer le script suivant:

from turtle import*
from random import*   
def deplace():

       instr=raw_input("Donner une instruction comme 100G50 ")
       m=instr.index("G")
       if "G" in instr:
             m=instr.index("G")
             deb=instr[:m]
             fin=instr[m+1:]
    # Nous voulons des entiers , pas des str
    # Il arrive que int(deb) et int(fin) ne
    # soient pas acceptés par Python

       for i in range(1000):       
             if str(i) == deb:               
                  x= i
             if str(i)==fin:
                  y=i               
       print x
       print y   

      penup()
      goto(x,y)
      pendown

              Cela donne quand on active  deplace()

>>> deplace()
Donner une 'instruction comme 100G50    100G50
100
50
>>>  

                      La souris s'est déplacée de 50 sans rien marquer à l'écran

                      entre ses deux positins.  Il y a juste le v couché qui indique le sens

---------------------------------------------------------------------------------------

   EXERCICE 4

        Donner un script, en Python 2.7 ,qui quand on saisit les instructions, 

        par exemple,   N  F100 120G20 R90 F100  ,  dessine, automatiquement  

        dans l"écran de Turtle le tracé correspondant.

     Rappel:    120G20  provoque  le déplacement de la souris comme goto( 120 , 20 )

                      le fait mais sans trace.

     ---------------------------------------------------------------

    REPONSE:

             On peut considérer :

from turtle import*
from random import*

def instruction():
        x=0
        y=0
        D=raw_input("instruction de la forme N F20 30G15     : ")
        W=D.split(" ")
        for elem in W:       
              if len(elem)==1:
                   print elem
                   trajet(elem,0,x,y)           
             elif "G" in elem:
                     i=elem.index("G")
                     deb=elem[:i]
                     fin=elem[i+1:]
                     for j in range(1000):
                           if str(j) == deb:
                                x=j                      
                           if str(j)==fin:
                                y=j                     
                     print elem
                     a=elem[i]                
                     trajet(a,0,x,y)
             else:
                    fin=elem[1:]
                    for j in range(1000):
                          if str(j)==fin:
                               m=j
                    print elem[0],m
                    width(3)
                    pencolor("red")
                    trajet(elem[0],m,x,y)    

def trajet(a,m,x,y):    
       if a=="F":
           forward(m)
       elif a=="G":
            penup()
            goto(x,y)
           pendown() 
        elif a=="R":
             right(m)
        elif a=="L":
             left(m)
        elif a=="B":
             backward(m)
        elif a=="U":
              penup()
        elif a=="D":
              pendown
        elif a=="N":
              reset()        
        else:
               print " Cela ne veut rien dire"
               input()  
         

                On obtient en activant instruction()

>>> instruction()
instruction de la forme N F20 30G15     : N F20 30G15 F40 R90 70G-40 F30
N
F 20
30G15
F 40
R 90
70G-40
F 30

>>>        

              On a dans la fenêtre :

                       Automateturtle

---------------------------------------------------------------    

    EXERCICE 5:

     Reprendre l'objectif de l'exercice précédent en permettant de choisir aussi

    directement une épaisseur, une couleur  et un cercle, en écrivant simplement,

      E3  ( pour width(3)  ).  O5  ( pour un cercle de rayon 5) , C4 ( pour la couleur 4 ).

      On conviendra pour cet exercice que:

      1 est pour " red" , 2 pour "blue" , 3 pour "yellow", 4 pour "green",

      5 pour orange" , 6 pour "brown" ,  7 pour purple, 8 pour black.

     REPONSE:

         On peut proposer :

                   On repennd le même programme 

from turtle import*
from random import*

def couleur(m):

       speed(10)       # pour la vitesse de tracé la plus rapide
       if m==1:
            pencolor("red")
       elif m==2:
            pencolor("blue")
       elif m==3:
            pencolor("yellow")
       elif m==4:
            pencolor("green")
       elif m==5:
            pencolor("orange")
       elif m==6:
            pencolor("brown")
       elif m==7:
            pencolor("purple")

       elif m==8:

            pencolor("black")
       else:
             print "Mauvaise couleur"
             input()

def instruction():
        x=0
        y=0
        D=raw_input("Donner une instruction de la forme N W3 C1 F20 3G15 : ")
        W=D.split(" ")
        for elem in W:       
              if len(elem)==1:
                   print elem
                   trajet(elem,0,x,y)           
             elif "G" in elem:
                     i=elem.index("G")
                     deb=elem[:i]
                     fin=elem[i+1:]
                     for j in range(1000):     # Ne pas prendre plus pour ne pas être out of range
                           if str(j) == deb:
                                x=j                      
                           if str(j)==fin:
                                y=j                     
                     print elem
                     a=elem[i]                
                     trajet(a,0,x,y)
             else:
                    fin=elem[1:]
                    for j in range(1000):      # Ne pas prendre plus pour ne pas être out of range
                          if str(j)==fin:
                               m=j
                    print elem[0],m
                    width(3)
                    pencolor("red")
                    trajet(elem[0],m,x,y)    

def trajet(a,m,x,y):    
       if a=="F":
          forward(m)

       elif a=="C":
            couleur(m)
       elif a=="E":
            width(m)
       elif a=="O":
            circle(m)
       elif a=="G":
            penup()
            goto(x,y)
            pendown() 
       elif a=="R":
            right(m)
       elif a=="L":
             left(m)
       elif a=="B":
            backward(m)
       elif a=="U":
            penup()
       elif a=="D":
             pendown
       elif a=="N":
             reset()        
       else:
              print " Cela ne veut rien dire"
              input()  
 

                                On obtient en activant instruction() 

>>> instruction()
Donner une instruction de la forme N W3 C1 F20 3G15     : N E3 C4 F50 C2 O30 C4 F100 C2 O30 C4 F100
N
E 3
C 4
F 50
C 2
O 30
C 4
F 100
C 2
O 30
C 4
F 100

>>> 

                   Cela donne à l'écran:

               Tracautoturtle                 

    Autre exemple:

>>> instruction()                                                                                                                                                                   
Donner une instruction de la forme N W3 C1 F20 3G15 : N E3 C4 F60 C2 O30 C4 F100 C2 O30 C4 F100 C1 200G30

 F30 L90 F40 L90 F225 L90 F40 L90 F15 60G70 L45 F30 100G30 R45 F20
N
E 3
C 4
F 60
C 2
O 30
C 4
F 100
C 2
O 30
C 4
F 100
C 1
200G30
F 30
L 90
F 40
L 90
F 225
L 90
F 40
L 90
F 15
60G70
L 45
F 30
100G30
R 45
F 20

>>> 

                          On obtient la VroumVroum suivante

     Vroumvromturtle 2

------------------------------------------------------------