Do you need any help?

Ridurre complessità ciclomatica HW2

twgever (15190 points)
7 27 105
asked Oct 22, 2020 in HW2 obbligatorio by twgever (15,190 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
296 views

6 Answers

Best answer
f
fabrizio.alba (1150 points)
4 11 20
answered Oct 23, 2020 by fabrizio.alba (1,150 points)
selected Nov 18, 2020 by twgever
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 (15190 points)
7 27 105
commented Oct 23, 2020 by twgever (15,190 points)
e come lo articolo il dizionario?
f
fabrizio.alba (1150 points)
4 11 20
commented Oct 23, 2020 by fabrizio.alba (1,150 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
commented Oct 24, 2020 by Marco Freddi (1,420 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
commented Oct 24, 2020 by purupuddu (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)
2 5 39
answered Oct 22, 2020 by giacomo_venturini (6,680 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
answered Oct 22, 2020 by giordano_sannino (13,650 points)
prova a pensare se puoi raggrupparne alcuni
g
giacomo_venturini (6680 points)
2 5 39
commented Oct 22, 2020 by giacomo_venturini (6,680 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)
4 8 14
answered Oct 23, 2020 by GiovanniChiara (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)
2 4 10
commented Oct 23, 2020 by Rebs99 (2,290 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 (15190 points)
7 27 105
commented Oct 23, 2020 by twgever (15,190 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 (15190 points)
7 27 105
commented Oct 23, 2020 by twgever (15,190 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)
10 20 84
answered Oct 23, 2020 by Loriv3 (7,970 points)
Funzioni , funzioni, funzioni. Più riesci a raggruppare in funzioni più il tuo codice avrà un netto miglioramento
SimoneBd96 (3030 points)
5 11 33
answered Oct 23, 2020 by SimoneBd96 (3,030 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 (15190 points)
7 27 105
commented Oct 23, 2020 by twgever (15,190 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)
5 11 33
commented Oct 23, 2020 by SimoneBd96 (3,030 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