Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi A - F > Fondamenti di architettura e programmazione
 
Compitino Laboratorio martedì 25 novembre[Capra]
Clicca QUI per vedere il messaggio nel forum
Andrewz
Vi descrivo le richieste dell'esercitazione di oggi.


1) Il contesto era una fantomatica Lotteria per cui i vincitori erano coloro i quali avevano la data di nascita uguale a una certa data estratta. La richiesta era:
Costruire nella classe Lotteria con:
-un metodo statico

public static Data estraiData();

che estragga una data a caso tra l'anno 1920 e il 2007 tenendo conto però del fatto che esistono gli anni bisestili (un anno è bisestile se è divisibile per 4), perciò non devono uscire date come 29 febbraio se l'anno non è bisestile o come 31 settembre ,31 novembre.
- un metodo main che estragga n date con n deciso dall'utente e le visualizzi.

2)Costruire una classe di libreria Appuntamento i cui oggetti sono appuntamenti caratterizzati da una Data, un Orario e una Stringa contenente una nota.

Il prof forniva una collezione di prototipi di metodi da sviluppare (i piu comuni come getData(),setOrario() etc...) inoltre chiedeva un metodo compareTo() e un metodo statico parse() che data una stringa costruisse un Appuntamento.

3)Costruire un'applicazione che calcoli la lunghezza media delle parole contenute in un file di testo

4)Costruire un metodo toString in una classe ArrayChar che dato un array di caratteri restituisca la stringa formata dall'accostamento di tutti i caratteri presenti nell'array.

(so che c'era l'altro thread aperto, così metto in rilievo il testo e se ne può parlare! come vi è andato? :) )

ViPah
Era particolarmente ostico il parse, per il resto era fattibile...

Fedilla
oh! grazie Andrewz di aver messo su cosa vi ha chiesto!
perchè almeno ho un'idea più concreta! :D

p.s. alors avete potuto consultare gli appunti?

Andrewz
Era abbastanza difficile ma alla fine l'ho svolto tutto... Il mio consiglio a coloro che si devono esercitare per giovedì è: cercate di fare gli esercizi che non avete fatto in classe e guardare le soluzioni solo se proprio non riuscite a farli.

Dico ciò perchè non mi è sembrato che il prof fosse molto incline ad aiutarci nella stesura del codice...cioè se si avevano dubbi sulla comprensione del testo era prontissimo a spiegare meglio l'esercizio però non dava molti consigli su come completare il codice...
Perciò purtroppo dovete cercare di essere il più possibile autonomi nello svolgere gli esercizi perchè è difficile che il prof vi dia una grossa mano!

ViPah
Esatto, piu che altro impratichirsi e imparare gli errori piu frequenti e sapere come risolverli....quante bestemmie per una cazzo di graffa dimenticata in 5 if uno dietro l'altro...

Emily89
Figo, questa sera stessa cercherò di farli grazie mille!

Emily89
Ragazzi ma io nel primo non so neanche da dove devo cominciare! La vedo dura giovedì :(

Giutu
uhm...

public class Blablabla .... look:

ViPah
emily per aiutarti fallo prima su carta, cioè pensa al ragionamento che fai nella tua testa e scrivilo.


math.random() restituisce un numero tra 0 e 1. Quindi moltiplicalo per 2008 e ti uscira un numero tra 0 e 2007.

metti questo in un do while o un for e fallo uscire dal ciclo solo quando l'anno riportato sarà tra 1920 e 2007.

Parti da questo!

Emily89
Mi sono messa d'impegno e penso di essere vicina alla soluzione del primo, solo che non capisco come si possa usare il metodo isInAnnoBisestile() se la data è ancora da costruire... mha, mi sa che ho fatto un macello.. se fossi stata al turno di oggi mi sarei disperata, beati voi che dite che era fattibile..

ViPah
Emily ma cazzo :D

if anno%4=0 && mese=2
//anno bisestile, quindi se il mese estratto è 2, febbraio avrà 29 giorni
giorno= math.random()*29 //o trenta, vedila come vuoi...

Emily89
Siii ci sono arrivata ieri notte a letto alla soluzione, mi succede sempre così XD Ma voi avete già avuto esperienza in programmazione? Perchè io nella mia vita passata zero... Provengo da un Liceo Sientifico!

ViPah
qualcosina con visualbasic, quindi praticamente da zero, visto che è un linguaggio che non c'entra una beata minchia :D

Emily89
Bè, almeno sei già nelle mentalità giusta.. la mia testa invece, con tutte le materie letterarie che abbiamo fatto, è ancora tra le nuvole!!

lik2006
io mi trovo peggio in mate
cmq scusate se scrivo qui ma come funziona il test di inglese?
ho aperto un thread in "lingua inglese" e nex ha risposto..
http://www.ccdinf.unimi.it/it/avvisi/6113.html

magicorla
Originally posted by ViPah
emily per aiutarti fallo prima su carta, cioè pensa al ragionamento che fai nella tua testa e scrivilo.


math.random() restituisce un numero tra 0 e 1. Quindi moltiplicalo per 2008 e ti uscira un numero tra 0 e 2007.

metti questo in un do while o un for e fallo uscire dal ciclo solo quando l'anno riportato sarà tra 1920 e 2007.

Parti da questo!


ancora meglio:

classe random, crei un oggetto
next.int(88) ti restituisce un numero fra 0 e 87, ci sommi 1920 e il gioco è fatto

o con math.random moltiplichi per 87 (mi sembra) e sommi ancora 1920

pirata1
Grazie mille, ho provato a farli... All'inizio bisogna pensarci un po, ma nn son difficilissimi.
Un consiglio per il primo es. della data da estrarre:
int x = (int)((Math.random()*(2008-1920))+1920);

In questo modo, prendo il range da 1920 a 2007.
Grazie per aver messo il testo della prova :D

ViPah
personalmente, mi sembra molto piu intuitivo moltiplicarlo per 2008 e fare un while...

Andrewz
..peccato che con il while come dici tu è possibile (una probabilità remota) che non estragga mai una data nel range richiesto...inoltre il computer fatica in modo notevolmente maggiore in quanto deve attuare un ciclo fino a che non esce una data compresa nell'intervallo dovuto, cosa facilmente aggirabile con la linea di codice suggerita dagli altri.

Mi accodo ai sostenitori del (int)(Math.random()*88)+1920; :)

pirata1
Originally posted by Andrewz
..peccato che con il while come dici tu è possibile (una probabilità remota) che non estragga mai una data nel range richiesto...inoltre il computer fatica in modo notevolmente maggiore in quanto deve attuare un ciclo fino a che non esce una data compresa nell'intervallo dovuto, cosa facilmente aggirabile con la linea di codice suggerita dagli altri.

Mi accodo ai sostenitori del (int)(Math.random()*88)+1920; :)

Hmm bo, nn ho ben capito :D
Pero vabbe mi sembrano simili, cmq lo provero :)

ViPah
perchè secondo te il pc fa fatica a moltiplicare 2008 * 0<x<1? farà un milione di calcoli al secondo se ha un processore lento -.-''

Andrewz
è diverso: se tu metti un ciclo while che ti calcola

int anno;
while (anno<1920){

anno=(Math.random()*2008);
}

il programma calcola n volte l'istruzione finchè non esce un numero compreso nell'intervallo che vuoi (in questo caso 1920-2007).Perciò il computer svolge l'istruzione n volte prima di trovare il numero che tu cerchi, contro la unica volta necessaria se si utilizza l'istruzione :
(Math.random()*88)+1920;.

Sono d'accordo che i computer di oggi sono molto veloci e di questo problema se ne possono fregare alla grande, però da un punto di vista di efficienza del codice è innegabile che eseguire una istruzione una volta è assolutamente più auspicabile che eseguirla almeno una volta.

Per concludere:le due soluzioni funzionano entrambe e a questi livelli di programmazione sono esattamente equivalenti, ma nel caso di un programma molto più complicato in cui il computer deve eseguire grandissime quantità di istruzioni non avrebbe tanto senso utilizzare la ripetizione di un gruppo di istruzioni per risolvere un problema per il quale ne occorrerebbe in realtà una sola !




ViPah
Son d'accordo con te, ma il problema si sarebbe posto nel caso di calcoli abnormi, il primo milione di numeri primi o cose del genere...

Andrewz
ok siamo d'accordo però siamo d'accordo anche che più un codice è efficiente maggiore è la sua qualità :)

magicorla
Originally posted by ViPah
Son d'accordo con te, ma il problema si sarebbe posto nel caso di calcoli abnormi, il primo milione di numeri primi o cose del genere...


guarda, ci hanno fatto capire piu volte anche a lezione che la cosa da fare è trovare l'algoritmo piu efficente possibile... (esempio dell'algoritmo di euclide per l'MCD mi pare)..


il tuo metodo si può paragonare a fare pari e dispari con un dado a 20 facce aspettando che esca 1 per il dispari, e 2 per il pari..scartando gli altri risultati... non è meglio interpretare anche gli altri? (appunto pari e dispari) :-D

in linea strettamente teorica fra l'altro l'algoritmo col while potrebbe anche non avere soluzione, o averla dopo qualche minuto....è vero che è statisticamente impossibile, ma non è da escludere... piu che altro perchè per analogia rischi di portarti un errore simile in programmi piu avanzati dove questo problema può saltare fuori


ti faccio un esempio, metti di voler applicare questo programma "lotteria" ad un asilo, quindi con bambini nati fra il 2002 e il 2004.
per il tuo ciclo WHILE ci sono solamente 3 soluzioni su 2004 possibilità. Non mi intendo di statistica, però se dovessimo estrare 10 bambini si rischia nell'ordine delle 8mila operazioni..o sbaglio?

ViPah
Non può avere soluzione è una cagata, è un ipotesi remotissima che non si verificherà quasi mai. Al test del programma, appena schiacciavo "invio" andava, anche con 100 date mi restituiva subito l'output. Sull'efficienza del programma ok, ma con un codice e un problema di questa entità, le due soluzioni sono equivalenti...Tantè che alla fine ho usato anche io la tecnica del 88 che rendeva il codice piu leggibile, visto che mi era rimasto un poco di tempo

Andrewz
ahahah dai questa discussione sta durando da tanto e direi che va bene così, alla fine siamo un po tutti d'accordo vedo...

Piuttosto..chissà com'era il compitino di oggi!

ViPah
hihihi, stasera sentiremo le bestemmie :D

magicorla
Originally posted by ViPah
Non può avere soluzione è una cagata, è un ipotesi remotissima che non si verificherà quasi mai. Al test del programma, appena schiacciavo "invio" andava, anche con 100 date mi restituiva subito l'output. Sull'efficienza del programma ok, ma con un codice e un problema di questa entità, le due soluzioni sono equivalenti...Tantè che alla fine ho usato anche io la tecnica del 88 che rendeva il codice piu leggibile, visto che mi era rimasto un poco di tempo


ti ho scritto anche io che è STASTICAMENTE impossibile...non c'è bisogno di scrivere che è una cagata...dato che era un esempio tecnico

comunque so anche io che il tuo metodo è efficente, ma si sta ragionando su un fatto di "logica" e penso che piu avanti ci servirà molto rendersi conto al volo che fra i 2 la cosa migliore da fare sia estrarre un numero con l'88... perchè magari il tuo metodo oltre che essere efficente è piu leggibile per noi novizi (se lo leggo lo capisco al volo, mentre l'altro ci metterei un po di piu),però logicamente non è la cosa migliore da fare...

comunque dato che siamo tutti daccordo penso che possiamo anche finirla qui,senza stare a discutere troppo su una cosa che abbiamo capito entrambi! :-D

lik2006
qualcuno sa qualcosa del test di inglese?

http://www.ccdinf.unimi.it/it/avvisi/6113.html

Giutu
si sa che ci si iscrive e non c'è il corso prima

lik2006
ma nn si sa su cos'è?

ViPah
stasera quel gran figo di capra mette fuori i voti! (cosi ha detto...)

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate