HACKING 120% {Hacking, programmazione, computer & molto altro}

Costruire un quadrato

« Older   Newer »
  Share  
view post Posted on 22/10/2011, 19:18     +1   -1
Avatar

Water can take unforseen forms.

Group:
Founder
Posts:
5,273
Reputation:
+1,147
Location:
Shabang

Status:


Costruire un quadrto dato il lato, usando gli asterschi, esempio:

lato = 6

CODICE
#######
#######
#######
#######
#######
#######
 
Web  Top
view post Posted on 22/10/2011, 19:54     +1   -1
Avatar

Water can take unforseen forms.

Group:
Founder
Posts:
5,273
Reputation:
+1,147
Location:
Shabang

Status:


Anche io ci sto lavorando

Risolto, postate anche le vostre soluzioni..
 
Web  Top
S!cK
view post Posted on 23/10/2011, 17:51     +1   -1




oddio, che algoritmo difficile o.o
SPOILER (click to view)
void rettangolo(int altezza, int largezza)
{
for(int i = 0; i < altezza; i++)
{
for(int j = 0; j < larghezza; j++)
cout << '*';
cout << endl;
}
}
 
Top
view post Posted on 29/10/2011, 15:35     +1   -1
Avatar

Water can take unforseen forms.

Group:
Founder
Posts:
5,273
Reputation:
+1,147
Location:
Shabang

Status:


Vabbe, atwa non posta, quindi:
CODICE
lato = input('lato: ')
a = 0
while a < lato:
   for x in range(1,lato):
       print '#',
   a += 1
   print '#'


Rettangolo:

CODICE
base = input('base: ')
h = input('altezza: ')
a = 0
while a < h:
   for x in range(1,base):
       print '#',
   a += 1
   print '#'
 
Web  Top
S!cK
view post Posted on 30/10/2011, 00:20     +1   -1




perchè usare due funzioni (o script, penso sia il temine più appropriato) quando con una puoi fare entrambe le cose?
 
Top
view post Posted on 30/10/2011, 08:43     +1   -1
Avatar

Water can take unforseen forms.

Group:
Founder
Posts:
5,273
Reputation:
+1,147
Location:
Shabang

Status:


Sick, non capisco, comunque l' ho migliorato e l' ho messo in un loop infinito:

CODICE
def myfun(a):
   a = input('metti un numero: ')
   for x in range(a):
       for x in range(a):
           print '#',
       print
       
while 2%2 == 0:
   b = 0
   myfun(b)


CODICE
def myfun(a,b):
   a = input('Altezza: ')
   b = input('Base: ')
   for x in range(a):
       for x in range(b):
           print '#',
       print
   print
       
while 2%2 == 0:
   c = 0
   d = 0
   myfun(c,d)
 
Web  Top
*Atwa*
view post Posted on 30/10/2011, 10:32     +1   -1




CITAZIONE (Wet Water @ 29/10/2011, 15:35) 
Vabbe, atwa non posta, quindi:

Se proprio ci tieni:
CODICE
def figura(lato,altezza)
           for x in range(altezza):
               print '%­s%­s%­s' %('#'*lato')

Riguardandola è meglio così :indifferente:
:lol:

ciaociao

Edited by *Atwa* - 1/11/2011, 13:37
 
Top
S!cK
view post Posted on 30/10/2011, 10:36     +1   -1




non si chiama loop infinito, ma funzione ricorsiva.
inoltre, va contro la definizione di algoritmo:
"[...]Da questa definizione si evincono le due proprietà fondamentali dell'algoritmo:
la sequenza di istruzioni finita (finitezza);
essa deve portare ad un risultato (effettività); fanno eccezione alcune formule matematiche molto particolari che permettono fino a due risultati." - wikipedia
ora mi chiedo: per quale motivo stampi il quadrato/rettangolo all'infinito?

quali sono le definizioni di rettangolo e quadrato?
rettangolo: quadrilatero con tutti gli angoli congruenti.
quadrato: quadrilatero con tutti gli angoli e i lati congruenti (poligono regolare)

l'unica differenza riguarda i lati, ma il modo per costruirli è lo stesso.
quindi, si può dire che il quadrato, non è altro che un rettangolo con base e altezza congruenti (o uguali).
quindi, se rileggi il mio sorgente, puoi capire che se invochi la mia funzione con 2 numeri diversi otterrai un rettangolo, se sono uguali invece un quadrato.

altra nota: in due cicli for, usi lo stesso nome della variabile di iterazione. se vuoi un consiglio, onde evitare problemi in futuro, usa nomi diversi per i cicli innestati.

comunque, se vuoi un consiglio, quando studi, ragiona un po' e analizza i tuoi algoritmi:
SPOILER (click to view)
riguardo ai due cicli for:
- uso due variabili con lo stesso nome.
> mettiamo caso che io debba stampare il valore di x. la print, quale x prende?

riguardo alla ricorsività:
- usi un while 2%2 == 0
> la condizione è sempre vera, visto che il resto della divisione 2/2 è sempre 0.
perchè usare una espressione quando puoi scrivere un semplice true?
- richiami la funzione all'interno di un ciclo while infinito
> la seconda funzione che invochi, chiama un while, nel quale richiama ancora se stessa, e così all'infinito. ergo, il while non verrà mai chiuso, quindi è inutile metterlo
- hai deciso di fare una funzione ricorsiva
> non hai messo una condizione di fine. la ricorsività (una funzione che richiama se stessa) è un discorso molto difficile e mangia molte risorse a livello computazionale. è buona regola evitare questo approccio se non si sa come affrontarlo.
- sempre riguardo la ricorsività:
> usi due variabili (c e d) inizializzate a 0 e le passi come parametri. ora, usare 4 variabili al posto di 2 è un enorme spreco di memoria (proporzionalmente parlando). inoltre, a e b sono inutilizzati dopo i due for, quindi perchè non usarli?

riguardo le funzioni:
- def myfun(a, b)
> usa nomi più precisi per indicare l'operato della tua funzione: myfun è troppo generico. in questo caso, può andar bene, ma quando ti ritrovi con sorgenti grossi potresti confonderti e sbagliare
- ripetendo quello che ho detto prima:
> se non riesci ancora a capire perchè la mia funzione può stampare sia un rettangolo che un quadrato, ti propongo questo esercizio: scrivere una funzione che stampa un quadrilatero chiedendo in ingresso altezza e base. richiamarla successivamente passando come parametri h = 3, b = 2 e h = 4, b = 4
 
Top
view post Posted on 30/10/2011, 11:58     +1   -1
Avatar

Water can take unforseen forms.

Group:
Founder
Posts:
5,273
Reputation:
+1,147
Location:
Shabang

Status:


si, lo so ho capito, un quadrato è un rettangolo particolare, quindi entra nella funzione del rettangolo

CITAZIONE
non si chiama loop infinito, ma funzione ricorsiva.
inoltre, va contro la definizione di algoritmo:
"[...]Da questa definizione si evincono le due proprietà fondamentali dell'algoritmo:
la sequenza di istruzioni finita (finitezza);
essa deve portare ad un risultato (effettività); fanno eccezione alcune formule matematiche molto particolari che permettono fino a due risultati." - wikipedia
ora mi chiedo: per quale motivo stampi il quadrato/rettangolo all'infinito?

Qui non è quello p.p non hai capito, io richiamo la funzine all' inifinito, ti faccio un esempio con quello che volevi tu:

CITAZIONE
>>>
Altezza: 3
Base: 4
# # # #
# # # #
# # # #

Altezza: 4
Base: 4
# # # #
# # # #
# # # #
# # # #

Altezza: 5
Base: 6
# # # # # #
# # # # # #
# # # # # #
# # # # # #
# # # # # #

Altezza:

Cioè, la funzione continuerà ad agire...

il resto lo commento dopo
 
Web  Top
S!cK
view post Posted on 31/10/2011, 12:44     +1   -1




ascolta, tu richiami la funzione all'infinito. ma è la funzione stessa che si richiama. quindi è inutile quel ciclo, e comunque va contro la definizione di algoritmo.
 
Top
*Atwa*
view post Posted on 31/10/2011, 15:07     +1   -1




CITAZIONE (Wet Water @ 30/10/2011, 08:43)
Sick, non capisco, comunque l' ho migliorato e l' ho messo in un loop infinito:

CODICE
def myfun(a):
   a = input('metti un numero: ')
   for x in range(a):
       for x in range(a):
           print '#',
       print
       
while 2%2 == 0:
   b = 0
   myfun(b)


CODICE
def myfun(a,b):
   a = input('Altezza: ')
   b = input('Base: ')
   for x in range(a):
       for x in range(b):
           print '#',
       print
   print
       
while 2%2 == 0:
   c = 0
   d = 0
   myfun(c,d)

CITAZIONE (S!cK @ 31/10/2011, 12:44) 
ascolta, tu richiami la funzione all'infinito. ma è la funzione stessa che si richiama. quindi è inutile quel ciclo, e comunque va contro la definizione di algoritmo.

Ergo:
CODICE
def myfun(a,b):
   for x in range(a):
       for x in range(b):
           print '#',
       print
   a = input('Altezza: ')
   b = input('Base: ')
   myfun(a,b)

myfun(4,4)

anche se si potrebbe migliorare xD...
Che poi non ho capito se i parametri non ti servono o non li metti o li metti preimpostati..
 
Top
S!cK
view post Posted on 1/11/2011, 11:47     +1   -1




ok, atwa ha capito il discorso del while inutile. rimane comunque il fatto che è una funzione ricorsiva senza condizione di terminazione: prima o poi dovrà smettere di invocare se stessa, o sbaglio?
ma d'altronde, per costruire un quadrato non c'è bisogno di scrivere una funzione ricorsiva... o meglio, questa non è la soluzione ricorsiva per il problema dato
 
Top
*Atwa*
view post Posted on 1/11/2011, 13:38     +1   -1




CITAZIONE (S!cK @ 1/11/2011, 11:47) 
ok, atwa ha capito il discorso del while inutile. rimane comunque il fatto che è una funzione ricorsiva senza condizione di terminazione: prima o poi dovrà smettere di invocare se stessa, o sbaglio?
ma d'altronde, per costruire un quadrato non c'è bisogno di scrivere una funzione ricorsiva... o meglio, questa non è la soluzione ricorsiva per il problema dato

CODICE
def myfun(b,c):
       if c == 0:
               return c
       print '# '*b
       myfun(b,c-1)

 
Top
view post Posted on 2/11/2011, 15:02     +1   -1
Avatar

Water can take unforseen forms.

Group:
Founder
Posts:
5,273
Reputation:
+1,147
Location:
Shabang

Status:


def myfun(b,c):
if c == 0:
return c
print '# '*b
myfun(b,c-1)


Geniale
 
Web  Top
S!cK
view post Posted on 3/11/2011, 21:39     +1   -1




non geniale, ricorsivo. notare che la ricorsività è un grande spreco di memoria... in rari casi conviene. è comunque buona regola di ogni programmatore allenarsi con la ricorsività u.u
 
Top
30 replies since 22/10/2011, 19:18   394 views
  Share