Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Suggerimenti es 3 hw 4

v
val9 (9770 points)
6 30 53
in Es3 by (9.8k points)
Buongiorno,
Cercavo qualche consiglio sulla risoluzione del terzo esercizio.
Grazie
1.0k views
closed

2 Answers

Best answer
_andrea_ (45670 points)
13 42 297
by (45.7k points)
selected by
Per generare l'albero parti dal presupposto che la radice ce l'hai, ed è il nome della cartella che ti viene passata. Poi vai avanti così, per ogni file/cartella che hai nella directory corrente:
Se è un file, aggiungi il file ai nodi della directory e ti fermi
Se è una cartella, la aggiungi ai figli e richiami la ricorsione su quella cartella
Queste cose le fai con la libreria os per esempio os.listdir per avere la lista di file/cartelle oppure os.path.isfile per sapere se ciò su cui hai chiamato la ricorsione è un file o no (se non lo è allora è una cartella)
v
val9 (9770 points)
6 30 53
by (9.8k points)
Fino alla creazione dell'albero non ho riscontrato problemi, il punto è come creo l'immagine a partire dall'albero?
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Beh quello è il vero problema. Io ho diviso il problema in step, cioè prima ho risolto la prima parte, poi la seconda e così via. La mia divisione è stata questa:
1) ottengo le dimensioni dell'immagine e la inizializzo tutta nera
2) a partire dal nome ottengo i 30 interi per ottenere 10 colori da disegnare e li metto in una matrice
3) usando l'immagine creata e sapendo come generare la lista di 10 pixel, uso una funzione ricorsiva che mi disegna prima di tutto i figli
4) ottengo così un'immagine che ha solo le parti finali dell'albero, cioè solo i file e le cartelle vuote
5) dopo aver capito come disegnare i figli nelle posizioni giuste passo a disegnare anche i padri
6) ottengo così un'immagine nera ma con i file e le cartelle disegnate nei punti giusti
7) capisco come disegnare i collegamenti tra padre e figlio
8) ottengo un'immagine con tutti i nodi e i collegamenti (sia da 10 che da 5) bianchi al posto giusto
9) capisco come disegnare anche in verticale
10) immagine finita
Calcola che ognuno di questi step rappresenta la sequenza che ho usato per scrivere il programma, non sono varie funzioni. Tutti questi passi funzionano insieme ma per implementarli ho seguito questi step. Ovviamente ho abagliato varie volte e ci ho messo tanto a capire come fare tutto. Seguili in questo ordine perché sono già dal più facile al più difficile. Assicurati di averne finito uno prima di passare al successivo. Ah, e non provarli sul tester. Provali avviando sempre l'esercizio sulla cartella Informatica. Io ho lavorato solo su quella e una volta finiti questi step su quella cartella, ho avviato il test e funzionava su tutte
v
val9 (9770 points)
6 30 53
by (9.8k points)
Come fai a sapere dove disegnare i figli se ancora non hai disegnato i padri?
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Sapendo quanti padri hai superato puoi sapere dove disegnare i figli. Comunque hai ragione, diciamo che gli step di disegnare i padri e i figli si possono fare insieme. Io però ho trovato più facile farlo così
v
val9 (9770 points)
6 30 53
by (9.8k points)
quindi, non posso evitare di usare la ricorsione almeno due volte all'interno del programma o sbaglio?
_andrea_ (45670 points)
13 42 297
by (45.7k points)
penso di no ma non mi preoccuperei di quello, prima vedi come risolverlo. anche io al primo esercizio la usavo tante volte, poi mi sono accorto che si poteva usare una in meno. l'importante all'inizio è che riesci a passare i test, anche se in tanto tempo. comunque penso che in questo caso 2 sia il minimo, o meglio forse anche una volta sarebbe possibile, ma non ci penserei per ora. sicuramente per creare l'albero delle directory la devi usare, e quello non te lo toglie nessuno. per disegnare i nodi invece...forse lì impegnandosi si potrebbe togliere ma non sono molto sicuro, anzi quasi per niente
v
val9 (9770 points)
6 30 53
by (9.8k points)

Che tipo di ragionamento hai fatto per determinare l'altezza dell'immagine ?

_andrea_ (45670 points)
13 42 297
by (45.7k points)
Beh intanto ho notato che l'altezza dipende direttamente dal numero di foglie. Fai una tabella dove metti il numero di foglie da una parte e la relativa altezza dall'altra e vedi che relazione c'è tra questi due numeri (trovi le dimensioni nel test03 o anche nei nomi dei test quando li lanci alla console)
v
val9 (9770 points)
6 30 53
by (9.8k points)
Invece, per quanto riguarda gli step 3 e 4, in che modo disegni le foglie? Come determini la posizione esatta in cui tracciarle?
_andrea_ (45670 points)
13 42 297
by (45.7k points)
La colonna dipende dalla profondità a cui si trovano nell'albero e la riga dipende sempre dalle foglie
v
val9 (9770 points)
6 30 53
by (9.8k points)
In che senso dipende dalle foglie?

Nel caso in cui ci sia solo una cartella insieme a diversi file che la precedono in ordine alfabetico, come fai a dare la precedenza alla cartella  (es. "Processori" in "Informatica/Hardware/Architetture")?
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Devi andare in ordine alfabetico. Credo che se un file venga prima di una cartella devi fare prima quello
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Ok ho notato ora che effettivamente le cartelle vengono prima. In questo caso non lo so, io ho solo fatto un sorted sulla listid e viene così da solo
f
federicoAg (1910 points)
1 7 16
by (1.9k points)
Prima di tutto devi crearti una funzione ricorsiva che ti generi la directory sottoforma di classe albero (occhio, ci possono essere file/cartelle con lo stesso nome ma in path completamente diversi)

dopodiché puoi copiarti tranquillamente i metodi che hai usato per l'esercizio 2 e 1, se li hai risolti con una classe albero, per le operazioni successive: calcolare l'altezza e la larghezza (vedi che c'è uno schema tra foglie/altezza e profondità dell'albero/larghezza)

per finire si deve tradurre il tutto in una matrice e fare l'immagine, vedi la logica delle immagini di esempio, c'è sempre uno schema
v
val9 (9770 points)
6 30 53
by (9.8k points)
Il mio problema è proprio tradurre tutto in un'immagine..