Topic: Aiuto cicli  (Letto 1755 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Claudio_F

  • python sapiens sapiens
  • ******
  • Post: 1.157
  • Punti reputazione: 2
    • Mostra profilo
Re: Aiuto cicli
« Risposta #75 il: Novembre 24, 2013, 16:51 »
Citazione da: spiritoserio
se tolgo il 'break' continua a chiedermi il numero anche se <= 20....

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.'

Questo non va bene, a me funziona regolarmente, il codice è corretto e il comportamento anche (anche se ancora non verifica l'inserimento di zero o di valori negativi):

print num_righe_e_colonne()

INSERIRE Numero: ugewtyugewgfe
-------->> Non hai inserito un NUMERO INTERO, RIPETI.
INSERIRE Numero: 789
INSERIRE Numero: 21
INSERIRE Numero: 5
5


La ricorsione non serve... (non deve servire! :O)



Citazione
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 

[codice]if (riga in (1, num_righe, (num_righe+1)/2, colonna)
    or colonna in (1, num_colonne, (num_colonne+1)/2, num_colonne-riga+1)):
[/codice]
« Ultima modifica: Novembre 24, 2013, 17:17 da Claudio_F »

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #76 il: Novembre 24, 2013, 21:22 »
Cosi non controlla i valori negativi...provvedo. :D
[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]

edit:

corretto tutto , ora verifica anche i numeri negativi:

[codice]
if num_righe_colonne > 0 <= 20:

[/codice]
« Ultima modifica: Novembre 25, 2013, 00:26 da spiritoserio »

Offline Claudio_F

  • python sapiens sapiens
  • ******
  • Post: 1.157
  • Punti reputazione: 2
    • Mostra profilo
Re: Aiuto cicli
« Risposta #77 il: Novembre 25, 2013, 17:54 »
Citazione
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.'

Certo che così va bene, ma la ricorsione in questo caso è "un optional", non deve essere obbligatoria, altrimenti c'è qualcosa che non va a livello di interprete :dont-know:



Citazione
corretto tutto , ora verifica anche i numeri negativi:
if num_righe_colonne > 0 <= 20:

Così controlli solo che num_righe_colonne sia maggiore di zero... e che zero sia  minore o uguale a venti.

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #78 il: Novembre 25, 2013, 18:29 »
Citazione
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.'

Certo che così va bene, ma la ricorsione in questo caso è "un optional", non deve essere obbligatoria, altrimenti c'è qualcosa che non va a livello di interprete :dont-know:



Citazione
corretto tutto , ora verifica anche i numeri negativi:
if num_righe_colonne > 0 <= 20:

Così controlli solo che num_righe_colonne sia maggiore di zero... e che zero sia  minore o uguale a venti.

Ciao Claudio ,

e' vero , finalmente ci sono arrivato.
La ricorsione è un optional perchè finquando non si verifica il 'return' (che ferma il 'while') la ricorsione avviene automaticamente :D infatti funziona.

Ora per i  numeri negativi vedo cosa fare.

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #79 il: Novembre 25, 2013, 19:06 »
Che ne pensi se uso la funzione:

[codice]abs()[/codice]

[codice]return abs(num_righe_colonne)[/codice]

[codice]
def num_righe_e_colonne():
    while True:
        try:
            num_righe_colonne = int(raw_input('INSERIRE Numero: '))
            if num_righe_colonne <= 20:
                return abs(num_righe_colonne) # Se negativo ritorna num positivo.
            else:
                print '-------->> Devi inserire un numero inferiore a 21 e non NEGATIVO.'
        except ValueError:
            print '-------->> Non hai inserito un NUMERO INTERO, RIPETI.'     


[/codice]
« Ultima modifica: Novembre 25, 2013, 19:12 da spiritoserio »

Offline Claudio_F

  • python sapiens sapiens
  • ******
  • Post: 1.157
  • Punti reputazione: 2
    • Mostra profilo
Re: Aiuto cicli
« Risposta #80 il: Novembre 25, 2013, 21:51 »
Citazione da: spiritoserio
Che ne pensi se uso la funzione:
[codice]abs()[/codice]

Ti boccio!  :devil:

Non ha senso la scritta "inserire un numero inferiore a 21 e non NEGATIVO" quando poi qualsiasi numero negativo viene trasformato in positivo e passa lo stesso... e se uno scrive -5000?

Trasformare i numeri negativi in positivi ha stesso senso di trasformare numeri maggiori di 20 in minori applicando arbitrariamente una formula matematica, che so, continuare a dividere per 2 finché scendiamo sotto il 20 per far passare comunque qualsiasi cosa. No. Se l'utente ha inserito qualcosa di errato, l'inserimento va rifiutato.

A far bene quella funzione dovrebbe essere più generale (usabile anche in ogni altro programma che richieda l'inserimento "sicuro" di un numero intero), e magari accettare un range ben specifico di valori, tra un limite inferiore e uno superiore che le vengono forniti.

La funzione potrebbe chiamarsi int_input, ed essere usata ad esempio in questo modo:
[codice]numero_righe = int_input('Inserire il numero di righe (da 3 a 20): ', 3, 20)
numero_colonne = int_input('Inserire il numero di colonne (da 3 a 20): ', 3, 20)
[/codice]



<RICORSIONE>

La ricorsione non è un ciclo, un ciclo non è ricorsione (almeno riferendosi alle chiamate ricorsive):

- una funzione con un ciclo interno semplicemente cicla, ma è sempre e solo un'unica funzione in esecuzione

- una funzione chiamata ricorsivamente invece è una catena di funzioni avviate e sospese in attesa che l'ultima della serie raggiunga una condizione di ritorno. È come avere una funzione A che chiama una funzione B che chiama una funzione C; quando C ritorna allora B riprende e ritorna, allora anche A riprende e ritorna. Nelle chiamate ricorsive tutte le funzioni hanno lo stesso nome, abbiamo una funzione A che chiama una funzione A che chiama una funzione A; quando l'ultima A ritorna allora riprende l'esecuzione della penultima A e così via all'indietro fino alla prima.

</RICORSIONE>
« Ultima modifica: Novembre 25, 2013, 21:57 da Claudio_F »

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #81 il: Novembre 25, 2013, 22:28 »
Ti boccio!  :devil:

Non ha senso la scritta "inserire un numero inferiore a 21 e non NEGATIVO" quando poi qualsiasi numero negativo viene trasformato in positivo e passa lo stesso... e se uno scrive -5000?

Trasformare i numeri negativi in positivi ha stesso senso di trasformare numeri maggiori di 20 in minori applicando arbitrariamente una formula matematica, che so, continuare a dividere per 2 finché scendiamo sotto il 20 per far passare comunque qualsiasi cosa. No. Se l'utente ha inserito qualcosa di errato, l'inserimento va rifiutato.

A far bene quella funzione dovrebbe essere più generale (usabile anche in ogni altro programma che richieda l'inserimento "sicuro" di un numero intero), e magari accettare un range ben specifico di valori, tra un limite inferiore e uno superiore che le vengono forniti.

La funzione potrebbe chiamarsi int_input, ed essere usata ad esempio in questo modo:
[codice]numero_righe = int_input('Inserire il numero di righe (da 3 a 20): ', 3, 20)
numero_colonne = int_input('Inserire il numero di colonne (da 3 a 20): ', 3, 20)
[/codice]

Che cattivo  :devil:
Hai ragione mi sono perso tra i 1000 ragionamenti per i numeri negativi.... infatti pensandoci mi rendo conto di aver fatto una cavolata  :quiet:
con abs non controlla piu nulla :D

ok prendo spunto dalla tua dritta e faro' su qualcosa :D

ma cosi fa' proprio cosi schifo ? funziona bene.

[codice]
def num_righe_e_colonne():
    while True:
        try:
            num_righe_colonne = int(raw_input('Inserire numero da 10 a 20:'))
            if  num_righe_colonne > 9 <= 20:
                return num_righe_colonne
            else:
                print '-------->> Inserire numero da 10 a 20:'
        except ValueError:
            print '-------->> Non hai inserito un NUMERO INTERO, RIPETI.'     
   

[/codice]
« Ultima modifica: Novembre 25, 2013, 23:27 da spiritoserio »

Offline Claudio_F

  • python sapiens sapiens
  • ******
  • Post: 1.157
  • Punti reputazione: 2
    • Mostra profilo
Re: Aiuto cicli
« Risposta #82 il: Novembre 26, 2013, 19:44 »
Citazione da: spiritoserio
funziona bene.

Mica no... cosa fa se inserisci 21?

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #83 il: Novembre 26, 2013, 20:19 »
Citazione da: spiritoserio
funziona bene.

Mica no... cosa fa se inserisci 21?

[codice]
if  num_righe_colonne > 9 and num_righe_colonne <= 20:
[/codice]

cosi verifica ....  :fingers-crossed: