Topic: Aiuto cicli  (Letto 1735 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #60 il: Novembre 23, 2013, 14:44 »
 
Se hai un valore Z che varia da 1 a N puoi ottenere un un valore che procede  al contrario da N a 1 con: n = N - Z + 1

dopo un paio d'ore a rileggere questa dritta ci sono arrivato :D

grande ragazzi meraviglioso !
grazie per l'aiuto e per la sopportazione della mia ignoranza ! :D

[codice]
or riga ==  num_colonne-colonna+1
[/codice]

in pratica:

[codice]
riga(2) e uguale a num_colonne(10)-colonna+1(2) ?
[/codice]
« Ultima modifica: Novembre 24, 2013, 12:49 da spiritoserio »

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re: Aiuto cicli
« Risposta #61 il: Novembre 23, 2013, 15:25 »
[codice]
or riga ==  num_colonne-colonna+1
[/codice]

Si, esprimendo riga in funzione di colonna, o al contrario esprimendo colonna in funzione di riga,
che era la formulazione nei tuoi programmi precedenti:
[codice]or colonna == num_colonne - riga + 1[/codice]

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #62 il: Novembre 23, 2013, 15:42 »
[codice]
or riga ==  num_colonne-colonna+1
[/codice]

Si, esprimendo riga in funzione di colonna, o al contrario esprimendo colonna in funzione di riga,
che era la formulazione nei tuoi programmi precedenti:
[codice]or colonna == num_colonne - riga + 1[/codice]


corretto.

però mi sfugge una cosa:

colonna parte da 1 quindi in questo caso colonna come fa ad essere uguale a 10-2=8 ?
non riesco a raffigurare nella mia testa le colonne.

il primo For mi stampa la prima riga da 1 a num_righe , poi la seconda poi la terza e cosi via....
quando arriva a num_righe(MAX) passa a capo e stampa una nuova riga.

ma colonna invece non riesco ad organizzarlo nella mia testa.

quindi se parte da 1 come fa ad essere uguale a num_colonne - riga+1 ?

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re: Aiuto cicli
« Risposta #63 il: Novembre 23, 2013, 16:10 »
Vedi se questa versione del programma che è il tuo con in più
  • una leggera pausa (0.2 secondi) per darti il tempo di vedere il quadrato mentre viene costruito,
  • la stampa di un trattino al posto dello spazio così da vedere visivamente dov'è il programma in quel momento,
ti aiuta a chiarirti le idee:[codice]
def stampa(num_righe, num_colonne):
    spazio = len(str(num_righe*num_colonne))
    for riga in range(1, num_righe+1):
        for colonna in range(1, num_colonne+1):
            if riga in(1,num_righe) or colonna in(1,num_colonne) or colonna == num_colonne - riga + 1:
                print '%*s' % (spazio, riga*colonna),
                sleep(0.2)
            else:
                print '%*s' % (spazio, '-'),
                sleep(0.2)
        print

num_righe = int(raw_input('INSERIRE NUMERO RIGHE: '))
print

num_colonne = int(raw_input('INSERIRE NUMERO COLONNE: '))
print

stampa(num_righe, num_colonne)[/codice]
« Ultima modifica: Novembre 23, 2013, 16:13 da Giornale di Sistema »

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #64 il: Novembre 23, 2013, 17:29 »
Vedi se questa versione del programma che è il tuo con in più
  • una leggera pausa (0.2 secondi) per darti il tempo di vedere il quadrato mentre viene costruito,
  • la stampa di un trattino al posto dello spazio così da vedere visivamente dov'è il programma in quel momento,
ti aiuta a chiarirti le idee:[codice]
def stampa(num_righe, num_colonne):
    spazio = len(str(num_righe*num_colonne))
    for riga in range(1, num_righe+1):
        for colonna in range(1, num_colonne+1):
            if riga in(1,num_righe) or colonna in(1,num_colonne) or colonna == num_colonne - riga + 1:
                print '%*s' % (spazio, riga*colonna),
                sleep(0.2)
            else:
                print '%*s' % (spazio, '-'),
                sleep(0.2)
        print

num_righe = int(raw_input('INSERIRE NUMERO RIGHE: '))
print

num_colonne = int(raw_input('INSERIRE NUMERO COLONNE: '))
print

stampa(num_righe, num_colonne)[/codice]

Grande!
è molto piu bello cosi però sinceramente nn mi chiarisce bene il mio dubbio.

cioe' forse ci sono :

* c = colonna

riga 2
       2         4         6         8         10         12         14        16        18        20
      c1        c2        c3       c4       c5           c6         c7        c7         c8        c9
                                                                                                    |
                                                                                                    |
                                                                                           in questo momento : colonna == num_colonne - riga+1 Giusto?
poi prosegue:

riga 3
     3        6        9         12        15         18          21          24        27        30
                                                                                       |
                                                                                       |
                                                                                 in questo momento : colonna( che vale 8 ) == num_colonne - riga+1 cioè 8 e uguale a 10-2 Giusto?

ecc....
                                                                                       

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re: Aiuto cicli
« Risposta #65 il: Novembre 23, 2013, 18:24 »
cioe' forse ci sono :

* c = colonna

riga 2
       2         4         6         8         10         12         14        16        18        20
      c1        c2        c3       c4       c5           c6         c7        c7         c8        c9
                                                                                                    |
                                                                                                    |
                                                                                           in questo momento : colonna == num_colonne - riga+1 Giusto?

Attenzione che ci sono 2 colonne c7, comunque si, in quel punto a
[codice]colonna == num_colonne - riga + 1[/codice]
sostituendo i numeri e tenendo presente che siamo a colonna 9 abbiamo:
[codice]9 == 10 - 2 + 1
9 == 9[/codice]
La condizione di uguaglianza in effetti è verificata, quindi stampa.

poi prosegue:

riga 3
     3        6        9         12        15         18          21          24        27        30
                                                                                       |
                                                                                       |
                                                                                 in questo momento : colonna( che vale 8 ) == num_colonne - riga+1 cioè 8 e uguale a 10-2 Giusto?

Certo, siamo a colonna 8, e come prima sostituendo i valori,
[codice]8 == 10 - 3 + 1
8 == 8[/codice]
la condizione risulta effettivamente ancora verificata, stampa nuovamente.

Quello che però mi sembra ti stia sfuggendo è il perché di quella relazione matematica fra righe e colonne,
del come ci si è arrivati a scrivere proprio quella e non altre.

Ragioniamoci: osserva nuovamente il quadrato 10x10 iniziando dalla fine della prima riga, c'è un 10.
A che colonna è? Alla numero num_colonne, quella più a destra, la colonna numero 10.

Ora guarda la seconda riga: il nuovo valore, quel 18 è stampato a che colonna?
A colonna 9, cioè num_colonne - 1.

Ok, ma se voglio esprimerlo in termini di righe cosa scrivo?

Sono a riga 2, se scrivessi num_colonne - riga avrei 10 - 2 = 8a colonna, ma siamo alla 9a colonna,
quindi fare semplicemente num_colonne - riga, cioè sottrarre semplicemente il valore della riga così com'è non va bene.

Significa sbagliare di 1 la colonna giusta.

Bene, se sottraggo uno di troppo come correggo? Con num_colonne - riga + 1 così non sottraggo più un 1 di troppo.
Ma è proprio quello che abbiamo scritto nel programma, ecco come ci si è arrivati.

Chiaramente questa relazione vale quando siamo alla seconda riga, ma continua a valere anche per tutte le restanti fino alla fine.

Edit: un suggerimento... inizia a prendere carta e penna e a disegnare le cose su cui stai ragionando,
ti sarà molto più facile che procedere solo con l'immaginazione.
« Ultima modifica: Novembre 23, 2013, 18:33 da Giornale di Sistema »

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #66 il: Novembre 23, 2013, 18:31 »
cioe' forse ci sono :

* c = colonna

riga 2
       2         4         6         8         10         12         14        16        18        20
      c1        c2        c3       c4       c5           c6         c7        c7         c8        c9
                                                                                                    |
                                                                                                    |
                                                                                           in questo momento : colonna == num_colonne - riga+1 Giusto?

Attenzione che ci sono 2 colonne c7, comunque si, in quel punto a
[codice]colonna == num_colonne - riga + 1[/codice]
sostituendo i numeri e tenendo presente che siamo a colonna 9 abbiamo:
[codice]9 == 10 - 2 + 1
9 == 9[/codice]
La condizione di uguaglianza in effetti è verificata, quindi stampa.

poi prosegue:

riga 3
     3        6        9         12        15         18          21          24        27        30
                                                                                       |
                                                                                       |
                                                                                 in questo momento : colonna( che vale 8 ) == num_colonne - riga+1 cioè 8 e uguale a 10-2 Giusto?

Certo, siamo a colonna 8, e come prima sostituendo i valori,
[codice]8 == 10 - 3 + 1
8 == 8[/codice]
la condizione risulta effettivamente ancora verificata, stampa nuovamente.

Quello che però mi sembra ti stia sfuggendo è il perché di quella relazione matematica fra righe e colonne,
del come ci si è arrivati a scrivere proprio quella e non altre.

Ragioniamoci: ssserva nuovamente il quadrato 10x10 iniziando dalla fine della prima riga, c'è un 10.
A che colonna è? Alla numero num_colonne, quella più a destra, la colonna numero 10.

Ora guarda la seconda riga: il nuovo valore, quel 18 è stampato a che colonna?
A colonna 9, cioè num_colonne - 1.

Ok, ma se voglio esprimerlo in termini di righe cosa scrivo? Sono a riga 2, se scrivessi num_colonne - riga avrei 10 - 2 = 8a colonna,
ma siamo alla 9a colonna, quindi fare semplicemente num_colonne - riga, cioè sottrarre semplicemente il valore della riga così com'è significa sbagliare di uno la colonna giusta.

Bene, se sottraggo uno di troppo come correggo? Con num_colonne - riga + 1 così non sottraggo più un 1 di troppo.
Ma è proprio quello che abbiamo scritto nel programma, ecco come ci si è arrivati.

Chiaramente questa relazione vale quando siamo alla seconda riga, ma continua a valere anche per tutte le restanti fino alla fine.


Grazie Paolo ....immenso spiegazione perfetta ....proprio questa spiegazione volevo.....sei fantastico a spiegare :D

NB: Tutte queste dritte le sto mettendo in un pdf le conservo in caso che in futuro mi dimentichi qualcosa.

ora posto la versione 4.0 del programmino perchè intanto sono andato avanti e mi sono meravigliato che usando solo cio' che ho studiato prima di bloccarmi
sui for (righe - colonne) sono riuscito a fare.

[codice]codice completo versione 4.0[/codice]

[codice]
# Versione 4.0 :D
# ciclo if minimizzato (grazie Claudio)
# corretto bug in for colonna ( grazie Paolo)
# inseriti controlli valori
# inserimento menu scelta
# inserito stampa riga obliqua da destra verso sinistra grazie Claudio e Paolo.
# ora all'interno del quadrato si forma una X di numeri :D

from time import *

# funzione che calcola il quadrato

def stampa(num_righe, num_colonne):
    spazio = len(str(num_righe*num_colonne))
    for riga in range(1, num_righe+1):
        for colonna in range(1, num_colonne+1):
            if riga in(1,num_righe) or colonna in(1,num_colonne) or riga == colonna or colonna == num_colonne - riga + 1:
                print '%*s' % (spazio, riga*colonna),
            else:
                print '%*s' % (spazio, ''),
           
        print

# creo il menu per l'utente

def menu():
    print " * -> Premi 1 per provare il programma"
    print " * -> Premi 0 per uscire"


# controllo inserimento righe

def num_righe_inserite():
    while True:
        try:
            num_righe = int(raw_input('INSERIRE NUMERO RIGHE: '))
            if num_righe > 20:
                 print 'Valore massimo inseribile è 20, RIPETI'
            elif num_righe < 21:
                return num_righe
                break
        except ValueError:
            print 'Non hai inserito un NUMERO INTERO, RIPETI.'
            return num_righe_inserite()
           
# controllo inserimento colonne

def num_colonne_inserite():
    while True:
        try:
            num_colonne = int(raw_input('INSERIRE NUMERO colonne: '))
            if num_colonne > 20:
                print 'Valore massimo inseribile è 20, RIPETI'
            elif num_colonne < 21:
                return num_colonne
                break
        except ValueError:
            print 'Non hai inserito un NUMERO INTERO, RIPETI.'
            return num_colonne_inserite()

# scelta utente

def esegui_scelta():
    scelta = int(raw_input('Inserisci scelta: '))
    print
   
    if scelta == 1:
        num_righe = num_righe_inserite()
        print
        num_colonne = num_colonne_inserite()
        print
        stampa(num_righe,num_colonne)
    elif scelta == 0:
        print 'ARRIVEDERCI'
        print 'sto per chiudere il programma...'
        sleep(4)
        exit()
    else:
        print 'stai inserendo un valore non corretto , riprova'
        esegui_scelta()


# richiamo funzioni

menu()
esegui_scelta()
   


[/codice]
« Ultima modifica: Novembre 23, 2013, 18:34 da spiritoserio »

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re: Aiuto cicli
« Risposta #67 il: Novembre 23, 2013, 18:39 »
Grazie Paolo ....immenso spiegazione perfetta ....proprio questa spiegazione volevo.....sei fantastico a spiegare :D

Ehmm... grazie.  :embarrassed:

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.658
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re: Aiuto cicli
« Risposta #68 il: Novembre 23, 2013, 19:33 »
cioe' forse ci sono :

* c = colonna

riga 2
       2         4         6         8         10         12         14        16        18        20
      c1        c2        c3       c4       c5           c6         c7        c7         c8        c9
                                                                                                    |
                                                                                                    |
                                                                                           in questo momento : colonna == num_colonne - riga+1 Giusto?

Attenzione che ci sono 2 colonne c7, comunque si, in quel punto a
[codice]colonna == num_colonne - riga + 1[/codice]
sostituendo i numeri e tenendo presente che siamo a colonna 9 abbiamo:
[codice]9 == 10 - 2 + 1
9 == 9[/codice]
La condizione di uguaglianza in effetti è verificata, quindi stampa.

poi prosegue:

riga 3
     3        6        9         12        15         18          21          24        27        30
                                                                                       |
                                                                                       |
                                                                                 in questo momento : colonna( che vale 8 ) == num_colonne - riga+1 cioè 8 e uguale a 10-2 Giusto?

Certo, siamo a colonna 8, e come prima sostituendo i valori,
[codice]8 == 10 - 3 + 1
8 == 8[/codice]
la condizione risulta effettivamente ancora verificata, stampa nuovamente.

Quello che però mi sembra ti stia sfuggendo è il perché di quella relazione matematica fra righe e colonne,
del come ci si è arrivati a scrivere proprio quella e non altre.

Ragioniamoci: ssserva nuovamente il quadrato 10x10 iniziando dalla fine della prima riga, c'è un 10.
A che colonna è? Alla numero num_colonne, quella più a destra, la colonna numero 10.

Ora guarda la seconda riga: il nuovo valore, quel 18 è stampato a che colonna?
A colonna 9, cioè num_colonne - 1.

Ok, ma se voglio esprimerlo in termini di righe cosa scrivo? Sono a riga 2, se scrivessi num_colonne - riga avrei 10 - 2 = 8a colonna,
ma siamo alla 9a colonna, quindi fare semplicemente num_colonne - riga, cioè sottrarre semplicemente il valore della riga così com'è significa sbagliare di uno la colonna giusta.

Bene, se sottraggo uno di troppo come correggo? Con num_colonne - riga + 1 così non sottraggo più un 1 di troppo.
Ma è proprio quello che abbiamo scritto nel programma, ecco come ci si è arrivati.

Chiaramente questa relazione vale quando siamo alla seconda riga, ma continua a valere anche per tutte le restanti fino alla fine.


Grazie Paolo ....immenso spiegazione perfetta ....proprio questa spiegazione volevo.....sei fantastico a spiegare :D

NB: Tutte queste dritte le sto mettendo in un pdf le conservo in caso che in futuro mi dimentichi qualcosa.

ora posto la versione 4.0 del programmino perchè intanto sono andato avanti e mi sono meravigliato che usando solo cio' che ho studiato prima di bloccarmi
sui for (righe - colonne) sono riuscito a fare.

[codice]codice completo versione 4.0[/codice]

[codice]
# Versione 4.0 :D
# ciclo if minimizzato (grazie Claudio)
# corretto bug in for colonna ( grazie Paolo)
# inseriti controlli valori
# inserimento menu scelta
# inserito stampa riga obliqua da destra verso sinistra grazie Claudio e Paolo.
# ora all'interno del quadrato si forma una X di numeri :D

from time import *

# funzione che calcola il quadrato

def stampa(num_righe, num_colonne):
    spazio = len(str(num_righe*num_colonne))
    for riga in range(1, num_righe+1):
        for colonna in range(1, num_colonne+1):
            if riga in(1,num_righe) or colonna in(1,num_colonne) or riga == colonna or colonna == num_colonne - riga + 1:
                print '%*s' % (spazio, riga*colonna),
            else:
                print '%*s' % (spazio, ''),
           
        print

# creo il menu per l'utente

def menu():
    print " * -> Premi 1 per provare il programma"
    print " * -> Premi 0 per uscire"


# controllo inserimento righe

def num_righe_inserite():
    while True:
        try:
            num_righe = int(raw_input('INSERIRE NUMERO RIGHE: '))
            if num_righe > 20:
                 print 'Valore massimo inseribile è 20, RIPETI'
            elif num_righe < 21:
                return num_righe
                break
        except ValueError:
            print 'Non hai inserito un NUMERO INTERO, RIPETI.'
            return num_righe_inserite()
           
# controllo inserimento colonne

def num_colonne_inserite():
    while True:
        try:
            num_colonne = int(raw_input('INSERIRE NUMERO colonne: '))
            if num_colonne > 20:
                print 'Valore massimo inseribile è 20, RIPETI'
            elif num_colonne < 21:
                return num_colonne
                break
        except ValueError:
            print 'Non hai inserito un NUMERO INTERO, RIPETI.'
            return num_colonne_inserite()

# scelta utente

def esegui_scelta():
    scelta = int(raw_input('Inserisci scelta: '))
    print
   
    if scelta == 1:
        num_righe = num_righe_inserite()
        print
        num_colonne = num_colonne_inserite()
        print
        stampa(num_righe,num_colonne)
    elif scelta == 0:
        print 'ARRIVEDERCI'
        print 'sto per chiudere il programma...'
        sleep(4)
        exit()
    else:
        print 'stai inserendo un valore non corretto , riprova'
        esegui_scelta()


# richiamo funzioni

menu()
esegui_scelta()
   


[/codice]

Hai scritto due funzioni uguali, un po' di refactoring su!

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #69 il: Novembre 23, 2013, 19:39 »
Hai scritto due funzioni uguali, un po' di refactoring su!

Hai ragione :D

grazie ne faro' diventare una soltanto.
Sono alle prime armi non essere troppo cattivo ehhehehehe   :embarrassed:

Offline Claudio_F

  • python sapiens sapiens
  • ******
  • Post: 1.157
  • Punti reputazione: 2
    • Mostra profilo
Re: Aiuto cicli
« Risposta #70 il: Novembre 24, 2013, 11:00 »
In questo topic si fa a gara a chi quota di più?  :devil:


Citazione
def num_righe_inserite(): 
    while True: 
        try: 
            num_righe = int(raw_input('INSERIRE NUMERO RIGHE: ')) 
            if num_righe > 20: 
                 print 'Valore massimo inseribile è 20, RIPETI' 
            elif num_righe < 21: 
                return num_righe 
                break 
        except ValueError: 
            print 'Non hai inserito un NUMERO INTERO, RIPETI.' 
            return num_righe_inserite()


Alcune osservazioni: la chiamata ricorsiva non serve perché la logica è già inserita in un ciclo while. Anche il break è di troppo, perché la funzione termina già con return num_righe. Il doppio controllo >20 <21 è ridondante, perché se non è > di 20 è per definizione già <21.



Prossimi passi (solo per lati uguali e dispari)...

La bandiera inglese (facile):

  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
  2   4                      16                      28  30
  3       9                  24                  39      45
  4          16              32              48          60
  5              25          40          55              75
  6                  36      48      60                  90
  7                      49  56  63                     105
  8  16  24  32  40  48  56  64  72  80  88  96 104 112 120
  9                      63  72  81                     135
 10                  60      80     100                 150
 11              55          88         121             165
 12          48              96             144         180
 13      39                 104                 169     195
 14  28                     112                     196 210
 15  30  45  60  75  90 105 120 135 150 165 180 195 210 225


Il rombo (questo invece è bello difficilotto):

  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
  2                          16                          30
  3                      21      27                      45
  4                  24              40                  60
  5              25                      55              75
  6          24                              72          90
  7      21                                      91     105
  8  16                                             112 120
  9      27                                     117     135
 10          40                             120         150
 11              55                     121             165
 12                  72             120                 180
 13                      91     117                     195
 14                         112                         210
 15  30  45  60  75  90 105 120 135 150 165 180 195 210 225

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #71 il: Novembre 24, 2013, 12:10 »
Versione migliorata

[codice]
# Versione 4.5 :D
# Ciclo if minimizzato (grazie Claudio)
# corretto bug in for colonna ( grazie Paolo)
# Inseriti controlli valori
# Inserimento menu scelta
# Inserito stampa riga obliqua da destra verso sinistra grazie Claudio e Paolo.
# Aggiunto x di numeri all'interno del quadrato
# Ora all'interno del quadrato si forma una X di numeri :D
# Menu e scelta utente in un unica funzione
# Eseguito un refactoring generale per minimizzare il codice ( grazie GlennHK )
# Aggiunto controllo sulla scelta del menu che ora accetta solo 0 e 1 e gestisce il ValueError


from time import *

# Funzione che calcola il quadrato

def stampa(num_righe, num_colonne):
    spazio = len(str(num_righe*num_colonne))
    for riga in range(1, num_righe+1):
        for colonna in range(1, num_colonne+1):
            if riga in(1,num_righe) or colonna in(1,num_colonne) or riga == colonna or colonna == num_colonne - riga + 1:
                print '%*s' % (spazio, riga*colonna),
            else:
                print '%*s' % (spazio, ''),
           
        print
         
# Controllo inserimento dati da parte dell'utente.

def num_righe_e_colonne():
    while True:
        try:
            num_righe_colonne = int(raw_input('INSERIRE Numero: '))
            if num_righe_colonne > 20:
                print '-------->> Valore massimo inseribile è 20, RIPETI'
            elif num_righe_colonne < 21:
                return num_righe_colonne
                break
        except ValueError:
            print '-------->> Non hai inserito un NUMERO INTERO, RIPETI.'
            return num_righe_e_colonne()
   

# Menu + scelta

def esegui_menu():

    # Menu
    print " * -> Premi 1 per provare il programma"
    print " * -> Premi 0 per uscire
"

    # Scelta
    try:
        scelta = int(raw_input('Inserisci scelta: '))
        print
        if scelta <> 1 and  scelta <> 0:
            print '-------->Valore inserito non corretto inserisci 1(Per entrare) o 0(Per uscire): '
            return esegui_menu()
        elif scelta == 1:
            num_righe = num_righe_e_colonne()
            print
            num_colonne = num_righe_e_colonne()
            print
            stampa(num_righe,num_colonne)
        elif scelta == 0:
            print 'ARRIVEDERCI'
            print '-------->> sto per chiudere il programma...'
            sleep(4)
            exit()
    except ValueError:
        print '-------->> Non hai inserito un NUMERO INTERO, RIPETI.'
        return esegui_menu()
           
           


# Richiamo menu per la scelta delle opzioni
esegui_menu()
   


[/codice]

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #72 il: Novembre 24, 2013, 12:14 »
In questo topic si fa a gara a chi quota di più?  :devil:


Citazione
def num_righe_inserite(): 
    while True: 
        try: 
            num_righe = int(raw_input('INSERIRE NUMERO RIGHE: ')) 
            if num_righe > 20: 
                 print 'Valore massimo inseribile è 20, RIPETI' 
            elif num_righe < 21: 
                return num_righe 
                break 
        except ValueError: 
            print 'Non hai inserito un NUMERO INTERO, RIPETI.' 
            return num_righe_inserite()


Alcune osservazioni: la chiamata ricorsiva non serve perché la logica è già inserita in un ciclo while. Anche il break è di troppo, perché la funzione termina già con return num_righe. Il doppio controllo >20 <21 è ridondante, perché se non è > di 20 è per definizione già <21.



Prossimi passi (solo per lati uguali e dispari)...

La bandiera inglese (facile):

  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
  2   4                      16                      28  30
  3       9                  24                  39      45
  4          16              32              48          60
  5              25          40          55              75
  6                  36      48      60                  90
  7                      49  56  63                     105
  8  16  24  32  40  48  56  64  72  80  88  96 104 112 120
  9                      63  72  81                     135
 10                  60      80     100                 150
 11              55          88         121             165
 12          48              96             144         180
 13      39                 104                 169     195
 14  28                     112                     196 210
 15  30  45  60  75  90 105 120 135 150 165 180 195 210 225


Il rombo (questo invece è bello difficilotto):

  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
  2                          16                          30
  3                      21      27                      45
  4                  24              40                  60
  5              25                      55              75
  6          24                              72          90
  7      21                                      91     105
  8  16                                             112 120
  9      27                                     117     135
 10          40                             120         150
 11              55                     121             165
 12                  72             120                 180
 13                      91     117                     195
 14                         112                         210
 15  30  45  60  75  90 105 120 135 150 165 180 195 210 225


hahahahahhaha grande Claudio mi dai una bella gatta da pelare.....a dire il vero avevo gia pensato di rincarare la dose e fare cioè che hai postato  sarà il prossimo passo verso la versione 5 :P

E' vero ci sono molti 'quote' hiihihihihhi

per quanto riguarda le osservazioni che hai fatto , a rileggere il codice hai ragionissimo....correggero' anche queste piccole cose...
pero' grazie a voi sto imparando tantissimo in modo chiaro e semplice.
GRAZIE!

Mi metto a lavoro per cercare di fare quello che hai postato :D

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #73 il: Novembre 24, 2013, 12:34 »
Tolta la ricorsione funziona bene però meno se tolgo il 'break'
perchè continua a chiedermi il numero anche se <= 20....

[codice]
def num_righe_e_colonne():
    while True:
        try:
            num_righe_colonne = int(raw_input('INSERIRE Numero: '))
            if num_righe_colonne <= 20:
                return num_righe_colonne
        except ValueError:
            print '-------->> Non hai inserito un NUMERO INTERO, RIPETI.'
[/codice]

escludendo il break ho fatto cosi per farlo funzionare:

[codice]
def num_righe_e_colonne():
    while True:
        try:
            num_righe_colonne = int(raw_input('INSERIRE Numero: '))
            if num_righe_colonne <= 20:
                return num_righe_colonne
            else:
                print '-------->> Devi inserire un numero inferiore a 21.'
                return num_righe_e_colonne()
        except ValueError:
            print '-------->> Non hai inserito un NUMERO INTERO, RIPETI.' 
[/codice]

quindi in "else" ho dovuto ricorrere alla ricorsione giusto no ? :confused:
« Ultima modifica: Novembre 24, 2013, 12:40 da spiritoserio »

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #74 il: Novembre 24, 2013, 14:52 »
Bandiera inglese

[codice]

def stampa(num_righe, num_colonne):
    spazio = len(str(num_righe*num_colonne))
    for riga in range(1, num_righe+1):
        for colonna in range(1, num_colonne+1):
            if riga in(1,num_righe) or colonna in(1,num_colonne) or riga == colonna or colonna == num_colonne - riga + 1:
                print '%*s' % (spazio, riga*colonna),
            elif riga == (num_righe+1)  / 2  or colonna == (num_colonne+1) /2: # ho preferito fare un elif per non allungare troppo la riga dell if
                print '%*s' % (spazio, riga*colonna),
            else:
                print '%*s' % (spazio, ''),
           
        print

[/codice]

Bandiera italiana (senza colori) :D

[codice]
def stampa(num_righe, num_colonne):
    spazio = len(str(num_righe*num_colonne))
    for riga in range(1, num_righe+1):
        for colonna in range(1, num_colonne+1):
            if riga in(1,num_righe) or colonna in(1,num_colonne):
                print '%*s' % (spazio, riga*colonna),
            elif colonna == (num_colonne+1) /3 or colonna == num_colonne -(num_colonne / 3):
                print '%*s' % (spazio, riga*colonna),
            else:
                print '%*s' % (spazio, ''),
[/codice]

Bandiera bulgara(senza colori) :D

[codice]

def stampa(num_righe, num_colonne):
    spazio = len(str(num_righe*num_colonne))
    for riga in range(1, num_righe+1):
        for colonna in range(1, num_colonne+1):
            if riga in(1,num_righe) or colonna in(1,num_colonne):
                print '%*s' % (spazio, riga*colonna),
            elif riga == (num_righe+1) /3 or riga == num_righe -(num_righe / 3):
                print '%*s' % (spazio, riga*colonna),
            else:
                print '%*s' % (spazio, ''),
           
        print
[/codice]       

Bandiera a scacchi :D

[codice]

def stampa(num_righe, num_colonne):
    spazio = len(str(num_righe*num_colonne))
    for riga in range(1, num_righe+1):
        for colonna in range(1, num_colonne+1):
            if riga in(1,num_righe) or colonna in(1,num_colonne):
                print '%*s' % (spazio, riga*colonna),           
            elif riga == (num_righe+1) /3 or riga == num_righe -(num_righe / 3) or colonna == (num_colonne+1) /3 or colonna == num_colonne -(num_colonne / 3):
                print '%*s' % (spazio, riga*colonna),
            else:
                print '%*s' % (spazio, ''),
           
        print

[/codice]

Claudio mi daresti una dritta per il rombo ?
« Ultima modifica: Novembre 24, 2013, 15:47 da spiritoserio »