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

Do you need help?

Ridurre complessità ciclomatica HW2

twgever (17470 points)
8 29 105
in HW2 obbligatorio by (17.5k points)
ho appena consegnato l'esercizio, e ho passato tutti i test, solo che ho notato che il mio programma ha una complessità ciclomatica di 26.

Chiaramente, è perchè, per assegnare i valori delle lettere, ho implementato una funzione con 5 elif e, come condizioni, diversi or.

avete qualche consiglio che mi possa aiutare a diminuire questo numero ridicolo?

Grazie in anticipo
604 views
closed

6 Answers

Best answer
f
fabrizio.alba (1150 points)
4 11 20
by (1.2k points)
selected by
Personalmente, per calcolare il punteggio di un parola, ho realizzato una funzione a parte che sfrutta i dizionari.

Mi resta da scrivere il resto... ^_^
twgever (17470 points)
8 29 105
by (17.5k points)
e come lo articolo il dizionario?
f
fabrizio.alba (1150 points)
4 11 20
by (1.2k points)
Il punteggio come chiave, la relativa lista delle lettere come valore.

Iterando poi la parola sulle coppie chiave/valore, cerchi le corrispondenze e man mano incrementi il punteggio della parola
Marco Freddi (1420 points)
1 2 16
by (1.4k points)
Se ti serve un po' di sintassi e conoscenza delle funzioni per il dizionario prova qui: https://www.w3schools.com/python/python_dictionaries.asp
p
purupuddu (460 points)
1 2 4
by (460 points)

@fabrizio.alba è 1000 volte più comodo fare il contrario credo. Se la chiave è la lettera puoi accedere subito al punteggio. L'unica seccatura è scrivere 26 coppie a mano.

g
giacomo_venturini (6680 points)
3 6 40
by (6.7k points)
spezza in funzioni!
cerca di accorpare funzionalità simili in una funzione unica usata più volte, questo ovviamente ha più effetto se riesci a spostare if, for, while eccetera in funzioni diverse
giordano_sannino (13650 points)
7 16 81
by (13.7k points)
prova a pensare se puoi raggrupparne alcuni
g
giacomo_venturini (6680 points)
3 6 40
by (6.7k points)
corretto, se cicli più volte sulla stessa lista puoi cercare di lavorare sul trovare il modo di effettuare le varie operazioni in un solo ciclo
GiovanniChiara (830 points)
6 8 14
by (830 points)
Scusami per l'ignoranza, chiedo a te che hai già completato l'esercizio. Quando chiedi se più lettere sono in una parola con l'or, non ti ritorna una delle lettere stesse? Mi servirebbe un T/F per poter andare avanti (sono ancora all'inizio). Grazie
R
Rebs99 (2290 points)
4 4 10
by (2.3k points)
Penso lo abbia implementato chiedendosi se la lettera che considera in un dato momento è contenuta in una stringa costituita dalle sole lettere che valgono gli stessi punti. In caso affermativo assegna il valore corrispondente.
twgever (17470 points)
8 29 105
by (17.5k points)
invece no, ho fatto una serie di or, è per questo che voglio ridurre la complessità. devo trovare una maniera per verificare se una lettera sia presente o meno in una lista. Mi diminuirebbe la complessita ciclomatica di tipo 20
twgever (17470 points)
8 29 105
by (17.5k points)

quello che ho fatto io con gli or è stato: se la lettere è questa o questa o questa, allora dai 1 punto, se la lettera è questa o questa, dai 3 punti ecc.

te lo sconsiglio come metodo, infatti è quello che sto cercando di eliminareangry

Loriv3 (7970 points)
13 21 84
by (8.0k points)
Funzioni , funzioni, funzioni. Più riesci a raggruppare in funzioni più il tuo codice avrà un netto miglioramento
SimoneBd96 (3030 points)
6 12 33
by (3.0k points)

Il mio consiglio è di pensare bene ad un altra struttura per quanto riguarda la "rappresentazione" dell'associazione punteggio lettera, sicuramente ne esiste una che riduce la complessità e il numero di controlli da fare, io ho fatto una cosa simile a la tua, ora non so com'è fatto il tuo codice anche se ho un idea generale, quello che  ti consiglio come ha detto il collega, è anche di spezzare in funzioni per ottenere più leggibilità, con una leggibilità maggiore, e un problema scomposto, sicuramente avrai una visione più pulita del codice che ti permetterà di trovare soluzioni più "eleganti"

Buon lavoro!

twgever (17470 points)
8 29 105
by (17.5k points)

purtroppo, ho già articolato in funzioni, tante da poter capire facilmente cosa succede in ciascuna, ma non troppe per evitare di perdere troppo tempo con diverse chiamate di funzione.

L'unico mio problema è, appunto, questa funzione che mi calcola il punteggio. L'ultima cosa che mi manca è trovare questa struttura più efficiente, e poi non ci penso piùlaugh

SimoneBd96 (3030 points)
6 12 33
by (3.0k points)
se guardi bene in quello che ti ho scritto (molto velato eh) ti ho dato una dritta esplicita, ovviamente non te lo volevo dire in modo chiaro, altrimenti ti avrei influenzato, spero che la dritta ti possa aiutare