Forum >> Principianti >> Ho iniziato da poco (seguito corso on line), non sono un programmatore e non riesco a correggere il codice che ho scritto. Qualcuno può aiutarmi?

Pagina: 1

#https://www.programmareinpython.it/esercizi-python/
#Esercizio 13:
#Scrivi una funzione che converta in secondi un dato numero di giorni, ore e minuti,
# passati dall'utente tramite funzione input.

#... l'ho scritto, si blocca e non riesco a capire cosa sbaglio

def f_Converti (xGiorni, xOre, xMinuti, xSecondi):
yContinua = True
xConverti = dict()

xChiedi = xGiorni
#Verifico il valore inserito dall'utente
f_Verifica (xChiedi)
if yContinua:
xConverti["Giorni"] = xGiorni

xChiedi = xOre
#Verifico il valore inserito dall'utente
f_Verifica (xChiedi)
if yContinua:
xConverti["Ore"] = xOre

xChiedi = xMinuti
#Verifico il valore inserito dall'utente
f_Verifica (xChiedi)
if yContinua:
xConverti["Minuti"] = xMinuti

xChiedi = xSecondi
#Verifico il valore inserito dall'utente
f_Verifica (xChiedi)
if yContinua:
xConverti["Secondi"] = xSecondi

if yContinua:
for key, value in xConverti.items():
print(f"{value} {key}")
xTotale = ((xGiorni * 24 + xOre) * 60 + xMinuti) * 60 + xSecondi
print('In totale fanno' + xTotale + ' secondi')
#End def f_Converti (xGiorni, xOre, xMinuti, xSecondi):

def f_Verifica(xChiedi):
xNumeri = ('.', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
# Verifico il valore inserito
for i in range(0, len(xChiedi)):
if xChiedi[i:i + 1] not in xNumeri:
yContinua = False
print(xChiedi + ' non è un numero')
# End if xVerDigt in xNumeri:
# End for i in range (0, len(xChiedi)):
return yContinua
# End def f_Verifica(xChiedi):

xGiorni = input('Inserisci il numero di Giorni \n')
xOre = input('Inserisci il numero di Ore \n')
xMinuti = input('Inserisci il numero di Minuti \n')
xSecondi = input('Inserisci il numero di Secondi \n')
f_Converti (xGiorni, xOre, xMinuti, xSecondi)
Ho guardato il Tuo codice (la prossima volta usa il tasto "code" dell'editor) e decisamente ha molte lacune, la prima è la non coerenza dello script con la traccia, i secondi non dovrebbero far parte dell'input utente.

Sorvolando, ed eseguendolo, diviene evidente la mancanza di valorizzazione della variabile "yContinua" nella funzione "f_Verifica(xChiedi)" che in caso di valore "True" Ti da un errore per referenza senza assegnamento, risolvibile inserendo un "yContinua = True" prima del ciclo for nella funzione.

Purtroppo, però, esistono problemi ancor più grossi, il primo è che non vedo considerata la circostanza che la funzione built-in input restituisce una stringa e poi, in generale, l'organizzazione logica dello script fa pensare ad una pesante mancanza di concetti base ...

Per riscontro sono andato sul sito dove hai prelevato l'esercizio ed ho guardato la soluzione li proposta : leggerla Ti avrebbe dato indicazioni utili anche se debbo criticare anch'essa dato che non considera che vi sono 24 ore in un giorno e 60 minuti in un'ora, pertanto input maggiori di tali limiti o negativi andrebbero considerati errati, anche se potrebbero comunque dare risultati corretti in caso di valori positivi.

Non conosco la qualità ed il livello delle "lezioni" che hai seguito su quel sito ma il Tuo script non mi fa pensare bene, suggerirei l'utilizzo di un buon libro o, almeno, di qualcuno dei testi introduttivi presenti nel canale "DOCUMENTAZIONE" di questo sito, anche se ne ho letto critiche suggerirei "Pensare da informatico" ed il tutorial, li trovi in questa pagina.

Non so se hai già affrontato argomenti quali "match" o i type-hints, comunque Ti faccio un esempio di come lo avrei affrontato io, considerando anche le mancanze accennate per la soluzione fornita nel sito proponente l'esercizio, perché Tu possa valutarne la differenza logica rispetto allo script da Te redatto.

# -*- coding: utf-8 -*-

def get_value(target: str) -> int:
    ''' Rileva e converte input utente
        Param: target -> str in DHM'''
    tokens = {'D': 'i giorni', 'H': 'le ore', 'M': 'i minuti'}
    not_passed = True
    while not_passed:
        try:
            user_input = int(input(f'inserire {tokens[target]}: '))
            match target:
                case 'H':
                    if user_input < 0 or user_input >= 24:
                        raise ValueError('Ora non valida')
                case 'M':
                    if user_input < 0 or user_input >= 60:
                        raise ValueError('Minuti non validi')
            not_passed = False
        except ValueError as e:
            print(e, 'riprova')
    return user_input

def to_seconds(days: int, hours: int, minutes: int) -> int:
    ''' Converte un aggregato di giorni-ore-minuti in secondi. '''
    return days * 24 * 3600 + hours * 3600 + minutes * 60


if __name__ == '__main__':
    values = []
    elements = 'DHM'
    for e in elements:
        values.append(get_value(e))
    print(f'in totale : {to_seconds(*values)} secondi')
Spero Ti sia utile

Ciao

Fatti non foste a viver come bruti...


Pagina: 1



Esegui il login per scrivere una risposta.