Topic: Aiuto cicli  (Letto 1890 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 #45 il: Novembre 18, 2013, 20:22 »
penso di essere arrivato alla perfezione (grazie a voi) di cio' che avevo chiesto all'inizio.

Versione 2.0 terminata!  :party:
È tempo di una versione 3.0 che preveda quanto dicevi prima:

Per ora il codice funziona fino a 10 sto ragionando su come fargli prendere il numero di righe :D

In realtà anche il numero di colonne, così sarebbe totalmente a discrezione dell'utente decidere cosa stampare

Edit:

mi stampa solo fino a 9 se metto 20 si ferma a 9 :(

È normale, la diagonale completa la puoi vedere solo se si tratta di un quadrato, quindi 10x10, 20x20, ma non 20x10.

Un altra cosa: se stai usando Python 2.x, al posto di input() usa raw_imput().
Quest'ultimo restituisce una stringa, per convertirla in numero int(raw_imput())

input() non fa quello che pensi tu in Python 2.x.
Va usato invece in Python 3.x dove fa quello che immagini.

Edit2: e quando ti occuperai di avere anche più di 10 colonne (la versione 3.0),
attenzione anche alla variabile spazio dove il moltiplicatore non è più fisso a 10, ma appunto varia del numero di colonne che stabilisci.

Edit3: rieditato ulteriormente parte del messaggio, meglio rileggerlo tutto.  ;)
Finalmente verisone 3.0 ultimata.
Purtroppo se nella shell inserisco 30 (non ingrandita) la formattazione viene persa comunque , stessa cosa nella shell  ingrandita se imposto 50 ...formattazione persa.
Ma a questo punto penso che sia normale.

Nella versione 4.0 imposterò un limite ai valori in input. :D

[codice]

# Versione 3.0 :D

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_righe+1):
            if colonna == riga or riga in(1, num_righe):
                print '%*s' % (spazio, riga*colonna),
            elif colonna == num_righe or colonna in(1,num_righe):
                print '%*s' % (spazio, riga*colonna),
            else:
                print '%*s' % (spazio, ''),
           
        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 18, 2013, 20:31 da spiritoserio »

Offline Claudio_F

  • python sapiens sapiens
  • ******
  • Post: 1.157
  • Punti reputazione: 2
    • Mostra profilo
Re: Aiuto cicli
« Risposta #46 il: Novembre 18, 2013, 20:35 »
Citazione da: spiritoserio"
[codice]
if colonna == riga or riga in(1, num_righe):
    print '%*s' % (spazio, riga*colonna),
elif colonna == num_righe or colonna in(1,num_righe):
    print '%*s' % (spazio, riga*colonna),
[/codice]

Secondo me queste condizioni, che se verificate eseguono esattamente la stessa operazione, si possono compattare in un solo if ;)

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #47 il: Novembre 18, 2013, 21:15 »
Citazione da: spiritoserio"
[codice]
if colonna == riga or riga in(1, num_righe):
    print '%*s' % (spazio, riga*colonna),
elif colonna == num_righe or colonna in(1,num_righe):
    print '%*s' % (spazio, riga*colonna),
[/codice]

Secondo me queste condizioni, che se verificate eseguono esattamente la stessa operazione, si possono compattare in un solo if ;)

Vero , allora farò  la versione 3.1  prima della 4.0 :D
ora ci gioco un po' e poi pubblichero' il codice con il tuo prezioso consiglio :D
Grazie.

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #48 il: Novembre 18, 2013, 22:09 »
Citazione da: spiritoserio"
[codice]
if colonna == riga or riga in(1, num_righe):
    print '%*s' % (spazio, riga*colonna),
elif colonna == num_righe or colonna in(1,num_righe):
    print '%*s' % (spazio, riga*colonna),
[/codice]

Secondo me queste condizioni, che se verificate eseguono esattamente la stessa operazione, si possono compattare in un solo if ;)

sono arrivato a questo:

[codice]
if riga in(1,num_righe) or colonna in(1,num_righe) or colonna == riga:
[/codice]

edit: ma l'if tradotto in italiano come potrei rappresentarlo ? mi piacerebbe capire il suo funzionamento perchè ci sono arrivato si ragionando ma piu che altro per tentativi.

cioè if = se ...pero' quel IN mi confonde il ragionamento.
« Ultima modifica: Novembre 18, 2013, 22: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 #49 il: Novembre 18, 2013, 22:54 »
Attenzione che il programma ha un piccolo bug: la riga 6, quella del for sulle colonne è
[codice]for colonna in range(1, num_colonne+1):[/codice]
e non
[codice]for colonna in range(1, num_righe+1):[/codice]

edit: ma l'if tradotto in italiano come potrei rappresentarlo ? mi piacerebbe capire il suo funzionamento perchè ci sono arrivato si ragionando ma piu che altro per tentativi.

cio' if = se ...pero' quel IN mi confonde il ragionamento.

L'operatore in fa un test di appartenenza che può restituire True o False:
[codice]>>> stringa = "dammi il cinque"
>>> if "dammi" in stringa:
   print "OK!"

OK![/codice]

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #50 il: Novembre 18, 2013, 23:16 »
Attenzione che il programma ha un piccolo bug: la riga 6, quella del for sulle colonne è
[codice]for colonna in range(1, num_colonne+1):[/codice]
e non
[codice]for colonna in range(1, num_righe+1):[/codice]

edit: ma l'if tradotto in italiano come potrei rappresentarlo ? mi piacerebbe capire il suo funzionamento perchè ci sono arrivato si ragionando ma piu che altro per tentativi.

cio' if = se ...pero' quel IN mi confonde il ragionamento.

L'operatore in fa un test di appartenenza che può restituire True o False:
[codice]>>> stringa = "dammi il cinque"
>>> if "dammi" in stringa:
   print "OK!"

OK![/codice]

Grazie risolto  :D

if riga in( 1, 10) in pratica verifica se esiste l'1 e il 10 giusto ?
e se non esiste passa all'oR giusto?

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #51 il: Novembre 18, 2013, 23:26 »
Codice versione migliorata:

[codice]
# Versione 3.2 :D
# ciclo if minimizzato (grazie Claudio)
# corretto bug in for colonna ( grazie Paolo)


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 == riga:
                print '%*s' % (spazio, riga*colonna),
            else:
                print '%*s' % (spazio, ''),
           
        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 18, 2013, 23:28 da spiritoserio »

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re: Aiuto cicli
« Risposta #52 il: Novembre 20, 2013, 09:24 »
Nella versione 4.0 imposterò un limite ai valori in input. :D

Ma stai facendo una gara di versioni con Emacs?

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #53 il: Novembre 22, 2013, 22:18 »
Codice versione migliorata:

[codice]
# Versione 3.2 :D
# ciclo if minimizzato (grazie Claudio)
# corretto bug in for colonna ( grazie Paolo)


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 == riga:
                print '%*s' % (spazio, riga*colonna),
            else:
                print '%*s' % (spazio, ''),
           
        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]

Rieccomi....

ho giocato ancora un po' con questo esempio , però nel provare ad invertire la riga mi sono bloccato , le ho provate tutte ma nulla
un aiuto a livello di ragionamento( no codice)?!?!?!?

Offline Claudio_F

  • python sapiens sapiens
  • ******
  • Post: 1.157
  • Punti reputazione: 2
    • Mostra profilo
Re: Aiuto cicli
« Risposta #54 il: Novembre 23, 2013, 00:04 »
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

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #55 il: Novembre 23, 2013, 00:14 »
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

ho un dubbio , forse mi sono espresso male.
in pratica ho il quadrato di numeri con la linea obliqua che parte da sinistra e va verso destra , ho provato a farla partire da destra verso sinistra ma nulla.
ho provato a giocare con reversed(range(n,n,-1) ma......  :confused:

grazie.

Offline Claudio_F

  • python sapiens sapiens
  • ******
  • Post: 1.157
  • Punti reputazione: 2
    • Mostra profilo
Re: Aiuto cicli
« Risposta #56 il: Novembre 23, 2013, 00:20 »
Citazione da: spiritoserio
ho provato a farla partire da destra verso sinistra ma nulla.

E io ti ho scritto la soluzione per non toccare minimamente i range già presenti ;)

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #57 il: Novembre 23, 2013, 11:45 »
Citazione da: spiritoserio
ho provato a farla partire da destra verso sinistra ma nulla.

E io ti ho scritto la soluzione per non toccare minimamente i range già presenti ;)

non so se c'ho capito come usare il tuo indizio , ho provato a fare cosi.

[codice]n = num_colonne - colonne+1
[/codice]

poi

[codice]print '%*s' % (spazio, riga*n),[/codice]

cosi mi stampa da 10 a 1 però la riga obliqua parte sempre da sinistra verso destra a scendere....io invece vorrei che il quadrato partisse sempre da 1 a 10
ma la colonna obliqua partisse da destra a sinistra a scendere....

vorrei questo:

[codice]
1    2     3     4     5    6    7   8   9  10
2                                            18  20
3                                        24      30
4                                   28           40
5                              30                50
6                         35                     60
7                  28                            70
8           24                                   80
9    18                                          90
10  20  30  40  50  60  70  80  90 100
[/codice]

l'indentazione del quadrato è quella che è però rende l'idea....
« Ultima modifica: Novembre 23, 2013, 11:56 da spiritoserio »

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re: Aiuto cicli
« Risposta #58 il: Novembre 23, 2013, 12:23 »
Citazione da: spiritoserio
ho provato a farla partire da destra verso sinistra ma nulla.
E io ti ho scritto la soluzione per non toccare minimamente i range già presenti ;)

non so se c'ho capito come usare il tuo indizio , ho provato a fare cosi.
[codice]n = num_colonne - colonne+1
[/codice]
poi
[codice]print '%*s' % (spazio, riga*n),[/codice]

No, siamo leggermente fuori strada.  :angel:

Il print resta pari pari, quello che cambia è esclusivamente il momento in cui deve stampare,
e cioè le le condizione sotto cui deve stampare che nel tuo programma sono le righe:
[codice]if riga in (1,num_righe) or colonna in (1,num_colonne) or colonna == riga:
    print '%*s' % (spazio, riga*colonna),
else:
    print '%*s' % (spazio, '')[/codice]
Ragioniamoci insieme.
Questo il risultato che vuoi (tra l'altro creato dal tuo programma cambiando appunto opportunamente le condizioni):
[codice]  1   2   3   4   5   6   7   8   9  10
  2                              18  20
  3                          24      30
  4                      28          40
  5                  30              50
  6              30                  60
  7          28                      70
  8      24                          80
  9  18                              90
 10  20  30  40  50  60  70  80  90 100[/codice]
Ora guarda la prima e l'ultima riga: sono le stesse degli altri quadrati e sono stampate dalla prima parte della condizione,
[codice]riga in (1,num_righe) or colonna in (1,num_colonne)[/codice]
quindi quella va bene. Rimane da sistemare l'ultima condizione dopo l'or:
[codice]or colonna == riga[/codice]
Concentriamoci sulla seconda riga del quadrato che è anche la prima ad essere stampata da quest'ultima condizione:
in cosa è diversa dalla precedente? Guardandola, quali sono i valori di riga e colonna per cui avviene la stampa del numero 18?

Edit: in particolare colonna quanto vale in funzione di riga? Aiutati con quanto ti ha detto Claudio_F.
« Ultima modifica: Novembre 23, 2013, 12:36 da Giornale di Sistema »

Offline spiritoserio

  • python habilis
  • **
  • Post: 51
  • Punti reputazione: 0
    • Mostra profilo
Re: Aiuto cicli
« Risposta #59 il: Novembre 23, 2013, 13:28 »

Ora guarda la prima e l'ultima riga: sono le stesse degli altri quadrati e sono stampate dalla prima parte della condizione,
[codice]riga in (1,num_righe) or colonna in (1,num_colonne)[/codice]
quindi quella va bene. Rimane da sistemare l'ultima condizione dopo l'or:
[codice]or colonna == riga[/codice]
Concentriamoci sulla seconda riga del quadrato che è anche la prima ad essere stampata da quest'ultima condizione:
in cosa è diversa dalla precedente? Guardandola, quali sono i valori di riga e colonna per cui avviene la stampa del numero 18?

Edit: in particolare colonna quanto vale in funzione di riga? Aiutati con quanto ti ha detto Claudio_F.

heeheheh

allora riga=2 e colonna= 9
         riga=3 e colonna = 8
         e cosi via.....

pero' non riesco a capire come modificare colonna == riga.