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

Do you need help?

Notice Board

Esercitazione HomeWork

o
orlandoalessio1998 (7730 points)
7 24 36
in Programmare in Python by (7.7k points)
Domanda forse un po' banale: nel considerare le stringe delle date, devo considerare possibile anche la stringa ("18a-24-199o") e quindi creare un'ulteriore controllo carattere per carattere oppure considero le date tutte nel formato gg-mm-aaaa senza possibilità di errori oltre al superamento del limite di giorni/mesi?
1.2k views
closed

4 Answers

Best answer
francesco.dev (33560 points)
22 51 129
by (33.6k points)
selected by

Ciao orlandoalessio1998!

Il professore non ha specificato se va trattato questo tipo di problema (tant'è vero che neanche consideriamo gli anni bisestili!)
Però se poi tu vuoi creare un codice ancora più performante che preveda questo controllo, sei libero di farlo!

Nei commenti ho capito che vuoi cimentarti nel realizzare tale controllo, bene! Ti do qualche dritta:
Ricorda che stiamo considerando una lista con un numero di elementi non per forza omogenei (ovvero non sono per forza dello stesso tipo);
Ricorda che bisogna procedere a piccoli passi (come ci ha consigliato il professore)! Ovvero prima risolvi un semplice problema come il controllo se la data inserita è valida o meno a livello di formato, poi vai avanti nella risoluzione del problema.
Quindi il primo passo, dopo aver chiesto in input le date, è quella di creare un algoritmo che riesca a verificare se una data inserita è valida o meno, ovvero se contiene i caratteri giusti!
Esempio: se l'utente inserisce "17-a2-1992" è chiaramente sbagliato!

Ora, io ho già creato tale algoritmo, ma darti la soluzione sarebbe inutile perché non ti farebbe capire né il ragionamento e né renderebbe quest'ultimo effettivamente tuo!
Quindi ti consiglio di "sbatterci un po' la testa" e capire come fare.
Tanto per qualsiasi problema io sono qui, sempre disponibile ad aiutarti!

- Francesco Pio Scognamiglio

LeonardoEmili (35740 points)
14 65 155
by (35.7k points)

Ciao  orlandoalessio1998,

al posto tuo effettuerei un controllo sui numeri inseriti prima di convertirli in stringa. Esistono svariati metodi che puoi applicare a una data variabile, te ne segnalo uno che è:

.isinstance()

Questo è un metodo estremamente semplice da utilizzare che si aspetta come primo parametro il dato da controllare e come secondo la classe del tipo di dato, nel tuo caso int.

Per qualsiasi cosa anche banale non esitare a chiedere!

Buona serata,

Leonardo Emili

francesco.dev (33560 points)
22 51 129
by (33.6k points)
Sì, è esatto! Ti rispondo ora perché stavo immaginando ad una possibile soluzione e l'ho trovata. Devi partire dal concetto di stringa e cercare di analizzare l'intera data! Ora, dopo questi consigli, prova a trovare qualcosa oppure chiedimi pure!
edoardo (7090 points)
19 52 67
by (7.1k points)
Ciao a tutti, scusatemi se m'intrometto. Non so se possa essere una soluzione, ma io il problema l'ho risolto creando un dizionario con i vari mesi e controllando semplicemente se l'intero fosse una chiave di quel dizionario. Se non lo è, restituisce "*". Può essere anche questa una valida soluzione?
francesco.dev (33560 points)
22 51 129
by (33.6k points)
Ciao Edoardo! Non scusarti, fai bene a scrivere se trovi dei problemi. Il dizionario che proponi, nel caso in cui contenga le chiavi rappresentanti i vari mesi, in realtà risolve un altro tipo di problema. Invece orlandoalessio1998 voleva fare dei controlli sulla stringa di inserimento, ovvero vedere se il formato della data è valido:
Esempio1: data 17-08-1990 è un formato corretto.
Esempio2: data 1b-09-2000 è sbagliato perché presenta un carattere diverso dai numeri ed i trattini.
Quindi lui vuole creare un algoritmo che fa questo determinato controllo, ora, io gli ho dato qualche dritta ma non gli passerò mai il codice perché non imparerebbe niente. Quindi se riesce ad arrivare alla soluzione da solo, sicuramente gli resterà molto di più!
edoardo (7090 points)
19 52 67
by (7.1k points)
Perfetto, grazie =) Forse potresti dare un'occhiata alle regular expression (in c# ricordo Regex). Magari potrebbero esserti d'aiuto!
francesco.dev (33560 points)
22 51 129
by (33.6k points)
Grazie a te per il consiglio! Buona serata :)
V
Vlad (4580 points)
2 14 24
by (4.6k points)

Gran bella domanda, vediamo se ci risponde anche il prof

Per come la vedo io questi controlli non sono necessari per fare bene gli homeworks... ho l'impressione che questo tipo di prova serva per vedere se siamo in grado di scrivere delle funzioni valide e veloci, non si tratta di un programma completo rivolto ad un pubblico esterno (dove dei controlli simili sono praticamente indispensabili).

Infatti il nostro punteggio viene calcolato in base alla correttezza del nostro output, all'intricatezza e alla velocità del nostro codice (http://q2a.di.uniroma1.it/grades).
Dei controlli di questo tipo potrebbero penalizzarci per quanto riguarda la velocità. Sapendo già quali valori vengono inseriti in input nelle nostre funzioni, io mi sono sempre concentrato sulla soluzione più snella e veloce, evitando di aggiungere codice superfluo.  Comunque il dubbio mi resta, aspettiamo una risposta "ufficiale"

andrea.sterbini (207940 points)
756 1270 2377
by (208k points)
Lo vediamo domani in laboratorio :)
V
Vlad (4580 points)
2 14 24
by (4.6k points)
Non ci sarò, però mi auguro che qualcuno dei presenti riporti sul forum ciò che verrà detto a lezione
francesco.dev (33560 points)
22 51 129
by (33.6k points)
Vlad hai ragione, però è anche vero che a volte uscire fuori dagli schemi ci aiuta a capire fino in forno determinate cose!
Denis (2230 points)
4 13 23
by (2.2k points)
Mi piacerebbe avere la risposta a questo quesito dal mio punto di vista interessante, anche perché è vero che conosciamo i valori di input, ma è vero anche che questi non sono gli unici test effettuati.
Se qualcuno può riportare quanto spiegato, gliene sarei grato.
Zannabbianca (1180 points)
3 10 17
by (1.2k points)
Ciao, io pensavo che invece di cercare di prevedere tutti i possibili errori che si possono commettere quando si inserisce una data nel formato sbagliato, che si potrebbero usare i blocchi "try" e "except". Se siete familiari con il C o con Java avrete sentito dei blocchi try e catch, utili per catturare ogni tipo di errore, ad esempio l'errore ValueError. In python l'except è l'equivalente del catch.

Facendo:
try:
    "Operazione da controllare"
except ValueError:
    print('formato data non valido!')

In questo modo risparmiamo molte linee di codici a mio parere inutili

Spero di non aver fatto errori e di essere stato utile!
andrea.sterbini (207940 points)
756 1270 2377
by (208k points)
Non avendoli ancora spiegati non pretendo che li usiate ... :)