Prima di leggere questo, La prego di leggere il file 'README PRINCIPALE.md', che contiene anche una procedura dettagliata su come aprire ed utilizzare questi programmi
Il programma rappresenta una versione avanzata del progetto denominato 'ITS Prodigi V1.0'. Consente all'utente di accedere sia come amministratori che come studenti e di effettuare una serie di operazioni amministrative e studentesche
Mentre completavo il mio primo progetto, ho avuto l'idea di espandere il programma basandolo su quello. In effetti, i due progetti hanno alcune somiglianze. Inoltre, ritenevo che il primo progetto fosse troppo generico e poco personale, oltre ad essere relativamente semplice.
Ho iniziato a lavorare su questo progetto qualche mese fa e sono riuscito a "completarlo" verso la fine di ottobre. Tuttavia, utilizzo il termine "completarlo" tra virgolette perché mancano ancora molte funzionalità che avevo in mente di implementare. Volevo aggiungere ulteriori funzionalità, ma a causa delle limitazioni di tempo, non ho potuto farlo.
Inoltre, per sviluppare un programma completo in Java, sarebbe necessaria l'implementazione di un'interfaccia grafica (GUI) e la gestione di un database, competenze che al momento mi mancano. Pertanto, nonostante il programma funzioni, è ancora molto rudimentale nella sua implementazione.
Nonostante ciò, spero che questo progetto e gli altri possano dimostrare la mia passione per la programmazione.
Ho cercato di commentare il programma nel modo più dettagliato possibile, spiegando accuratamente le funzionalità dei metodi, delle variabili e delle classi coinvolte, e le relazioni tra di loro.
La creazione di questo programma è stata una sfida per me, e spero che possa risultare di Suo gradimento!
Il programma è costituito da cinque classi principali: Main, Studente, StudenteController, Insegnamento ed InsegnamentoController.
Tuttavia, nel programma sono presenti un totale di sette file. Oltre alle suddette cinque classi, vi sono due file di testo, utilizzati come semplici database per memorizzare i dati degli studenti e degli insegnamenti. Questi file sono denominati "Studenti.txt" e "Insegnamenti.txt", rispettivamente.
Dopo aver avviato il programma, gli utenti hanno la possibilità di accedere come amministratori o come studenti.
Per gli amministratori, le credenziali predefinite sono le seguenti: nome utente "admin" e password "123".
Se un utente desidera accedere come studente, è necessario fornire informazioni personali, tra cui una password e un ID studentesco.
Nel caso in cui non siano ancora presenti profili studenteschi nel database ("Studenti.txt"), il programma segnalerà l'assenza di tali dati e richiederà all'utente di crearne uno prima di procedere.
Si tenga presente che i dati immessi verranno memorizzati nel file "Studenti.txt" solo al termine della sessione, includendo sia la password che l'ID studentesco. Per ulteriori dettagli, è possibile consultare la sezione "Per salvare le modifiche, uscire dal programma".
Questa stessa procedura si applica ai dati relativi agli insegnamenti.
Per semplicità, alcuni dati studenteschi e relativi agli insegnamenti sono già stati inseriti.
Una volta effettuato l'accesso come amministratore, è possibile eseguire una serie di operazioni relative agli insegnamenti e agli studenti. Queste operazioni comprendono l'aggiunta di nuovi insegnamenti o studenti, la modifica dei loro dati, l'iscrizione degli studenti agli insegnamenti e la visualizzazione dei resoconti, tra le altre.
Se un utente decide di accedere come studente, le operazioni disponibili sono più limitate. Gli studenti non possono modificare i dati relativi agli insegnamenti, aggiungere nuovi insegnamenti o studenti. Tuttavia, hanno la possibilità di modificare le proprie informazioni personali, iscriversi o ritirarsi da un insegnamento e consultare i vari resoconti disponibili.
Il programma offre numerose funzionalità, ma mi concentrerò sulla dimostrazione delle sue principali caratteristiche.
Cominciamo dalla pagina iniziale.
Ottimo, ora esploreremo le tre opzioni disponibili. Supponiamo che desideriamo accedere come studente, quindi digitiamo "2" e vediamo se il programma funziona e ci consente di entrare come studente:
Ops! In realtà, non è possibile accedere come studente al momento poiché il database degli studenti, indicato dal file "Studenti.txt", è attualmente vuoto.
Questo significa che è necessario avviare la sessione come amministratore prima di poter procedere, in modo da poter aggiungere gli studenti necessari
Abbiamo tentato di accedere al programma come amministratore, ma al primo tentativo non ci siamo riusciti poiché avevamo inserito erroneamente il nome utente.
Successivamente, inserendo correttamente il nome utente e la password dell'amministratore, siamo riusciti ad accedere con successo al programma!
Proviamo ad aggiungere un nuovo studente per esplorare il programma dal punto di vista di uno studente:
Ottimo! Siamo riusciti ad aggiungere con successo il nuovo studente, e abbiamo ricevuto una notifica di conferma dell'operazione!
Inoltre, è importante notare che se l'utente inserisce un valore numerico non accettato dal sistema (nel nostro caso, il numero del trimestre deve essere compreso tra 1 e 4), il programma segnala l'errore e richiede un nuovo input:
Ora usciamo per salvare i dati inseriti nel file 'Studenti.txt'. Se riapriamo il file, noteremo subito che contiene esattamente ciò che abbiamo digitato in precedenza!
Ora, facciamo clic di nuovo su 'Run Main' per accedere come studente!
Inseriamo le credenziali dello studente che abbiamo appena creato. Siamo riusciti ad accedere al programma!
Cominciamo visualizzando prima di tutto i nostri dati:
Mi indica correttamente che non sono iscritto a nessun insegnamento!
Ottimo, adesso mi iscrivo a alcuni insegnamenti che mi interessano:
Ci sono tre insegnamenti a cui possiamo iscriverci!
Se apriamo il file 'Insegnamenti.txt', troveremo invece più di tre insegnamenti disponibili. Il motivo è che avevamo impostato il trimestre dello studente come '3'. Pertanto, il programma ci consente di selezionare solo gli insegnamenti del terzo trimestre!
Supponiamo che vogliamo iscriverci a due insegnamenti:
Ora immaginiamo di voler visualizzare il nostro resoconto completo, anche per verificare se le modifiche sono state salvate.
Ok, gli insegnamenti sono stati registrati correttamente!
Ehi, aspetta un attimo, abbiamo cambiato idea: l'insegnamento "Sistemi Low code/no code" non ci piace più. Vogliamo ritirarci da questo corso!
Vediamo se tutto è andato a buon fine!
Perfetto, sembra che l'insegnamento 'Sistemi Low code/no code' sia stato rimosso!
Promuovere lo studente al prossimo trimestre, aggiornando questo dato e gli insegnamenti a cui può iscriversi
Dopo 3 mesi, desideriamo promuovere lo studente al quarto semestre. Ora procediamo con la modifica dei suoi dati!
Torniamo indietro e chiudiamo il programma per salvare la modifica:
Ora verifichiamo se lo studente può selezionare gli insegnamenti del quarto trimestre!
Perfetto! La modifica del trimestre è stata effettuata con successo!
Ora, lo studente si avvicina alla fine del corso e ha passato anche gli esami del quarto trimestre. Procediamo con la registrazione dei voti dello studente
Eseguiamo la stessa operazione anche per gli altri due insegnamenti.
Ora i voti dello studente sono: 70, 75 e 80
Ora diamo un'occhiata alla sintesi dei dati dello studente
Bene! Tutto sembra funzionare!!!
La pagina 'Main' è ricca di metodi che guidano il flusso del programma e gestiscono l'interazione con l'utente.
Ogni metodo svolge una funzione specifica all'interno del flusso del programma e offre un menu di opzioni per l'utente. La classe "Main" è dedicata alla gestione di varie interazioni con amministratori e studenti.
il metodo “main(String[] args)"" e' Il punto di ingresso principale del programma, che gestisce l'inizializzazione e il menu principale.
Altri metodi della pagina Main che gestiscono il flusso delle operazioni sono i seguenti:
- “stampiMenuPrincipale()”: Visualizza il menu principale del programma e gestisce la selezione dell'opzione.
- “adminLogin()”: Gestisce l'accesso dell'amministratore al sistema, richiedendo nome utente e password.
- “studenteLogin()”: Gestisce l'accesso degli studenti richiedendo l'ID studente e la password, verificando le credenziali e avviando le operazioni studentesche se l'accesso avviene con successo.
- “adminOperazioni()”: Gestisce le operazioni amministrative dopo l'accesso dell'amministratore, fornendo un menu di opzioni.
- “adminAmministraInsegnamenti()”: Gestisce le operazioni di amministrazione dei corsi, fornendo un menu di opzioni relative ai corsi.
- “adminAmministraStudenti()”: Gestisce le operazioni di amministrazione degli studenti, consentendo di aggiungere, eliminare, modificare, visualizzare o ottenere un resoconto specifico degli studenti.
- “studenteOperazioni(Studente studente1)”: Gestisce le operazioni disponibili per gli studenti autenticati, consentendo loro di visualizzare i resoconti, gestire i propri dati, terminare la sessione o chiudere il programma.
- “visualizziStudenteResoconti(Studente studente1)”: Gestisce le operazioni relative ai resoconti degli studenti, consentendo loro di visualizzare i corsi a cui sono iscritti, i corsi disponibili per l'iscrizione, il resoconto completo o tornare indietro.
- “studenteAmministraSuoiDati(Studente studente1)”: Gestisce le operazioni di gestione dei dati personali degli studenti, consentendo loro di cambiare l'ID studente, la password, iscriversi o ritirarsi da un insegnamento.
La classe "Studente" gestisce le informazioni e le operazioni relative agli studenti, inclusi i soliti metodi get e set delle variabili, l'aggionamento dei valori delle variabili, alcuni metodi di sintesi ed infine alcuni metodi speciali.
I variabili principali della classe includono:
- idStudente e password: Un identificatore unico per ogni studente e la password dello studente
- nome e cognome: Il nome e il cognome dello studente.
- corsoStudente: Il corso a cui lo studente è iscritto.
- numeroTelefono: Il numero di telefono dello studente.
- età: L'età dello studente.
- trimestre: Il trimestre in cui si trova lo studente.
- insegnamentiIscritti: Una mappa che associa gli insegnamenti agli eventuali voti ottenuti.
Il costruttore inizializza l'oggetto "Studente" con i dati personali e verifica che i parametri trimestre e età siano validi.
I metodi di questa classe sono numerosi. Cerco di sintetizzare in seguito:
I get e set metodi per restituire ed impostare i valori dlle variabili dichiarate, come getIdStudente(), setIdStudente(), getPassword(), setPassword() eccetera.
i metodi per aggiornare i valori delle variabile dichiarate. Vengono chiamati qualora l'utente sceglie di aggiornare/reimpostare i valori delle variabili dichiarate.
Ad esempio aggiorniPassword() che serve per aggionare la password esistente dello studente. aggiorniTrimestre() per aggionare la trimestre esistente dello studente. etc.
Questi metodi chiamano i rispettivi metodi get dopo aver ricevuto l'input digitato dall'utente tramite la tastiera. Ad esempio, il metodo aggiorniNome() va a chiamare il metodo setNome.
Vengono prevvisti vari messaggi all'utente per chiedergli di inserire con la tastiera il valore nuovo
Alla fine, vengono prevvisti vari messagi all'utente per notificare la riuscita dell'operazione, come ad esempio ""Nome aggiornato a XXX"
Un metodo speciale denominato modifichiStudente() è progettato per restituire un elenco di opzioni per consentire all'utente di selezionare quale variabile desidera modificare nel contesto degli studenti.
Il metodo genera un elenco di opzioni con testi come "1- Modifica ID studente", "7- Modifica numero di telefono dello/a studente", "10- Torna indietro".
Inizialmente, il metodo richiama il metodo opzioneValida() presente nella classe principale per verificare la validità del valore inserito dall'utente, assicurandosi che sia un numero all'interno dell'intervallo previsto.
Dopo che l'utente ha digitato il numero corrispondente all'opzione desiderata, avrà l'opportunità di inserire il nuovo valore per aggiornare l'attuale valore della variabile.
Questo metodo funziona grazie a una serie di condizioni "else if" che controllano uno per uno i valori numerici inseriti dall'utente. Quando una di queste condizioni risulta vera, viene chiamato il metodo di aggiornamento corrispondente.
Alla fine dell'aggiornamento, il metodo offre la possibilità di chiamare nuovamente se stesso per effettuare ulteriori modifiche o di tornare indietro nel menu, garantendo un processo di modifica fluido e intuitivo.
Successivamente, la classe contiene alcuni metodi per effettuare operazioni di sintesi.
Ho provato a fare un riassunto di questi metodi aggiuntivi qui sotto:
-
”calcoliMedia()”: Calcola la media dei voti dello studente in tutti gli insegnamenti a cui è iscritto.
-
”stampiStudenteInsegnamenti(ArrayList< Insegnamento> insegnamenti)”: Stampa l'elenco degli insegnamenti a cui lo studente è iscritto, inclusi dettagli come l'ID dell'insegnamento, il nome, il trimestre e il voto dello studente.
-
”stampiResocontoCompleto()”: Stampa un resoconto completo delle informazioni dello studente, compresi dettagli come l'ID dello studente, il numero di trimestri, il nome, il cognome, il corso, il numero di telefono, l'età e una lista degli insegnamenti a cui è iscritto con i relativi voti e la media (se ci sono insegnamenti iscritti).
L'ultima tipologia dei metodi serve per restituire/impostare alcuni campi speciali.
- ”iscrivitiAInsegnamento(Insegnamento insegnamento, boolean admin)”: Consente allo studente di iscriversi a un insegnamento specifico, con la possibilità di inserire un voto (se l'utente è un amministratore).
- ”ritiratiDaInsegnamento(Insegnamento insegnamento, boolean flag)”: Consente allo studente di ritirarsi da un insegnamento specifico.
- ”ritiratiDaTuttiInsegnamenti()”: Ritira lo studente da tutti gli insegnamenti a cui è iscritto.
- ”getVoto(Insegnamento insegnamento)”: Restituisce il voto dello studente per un insegnamento specifico.
- ”setVoto(Insegnamento insegnamento, double voto)”: Imposta il voto dello studente per un insegnamento specifico.
- ”aggiorniInsegnamentoTrimestre(Insegnamento insegnamento)”: Consente all'utente di aggiornare il voto dello studente per un insegnamento specifico.
La classe StudenteController svolge un ruolo fondamentale nella gestione degli studenti nel sistema.
Questa classe contiene principalmente metodi statici per gestire gli oggetti Studente, come la lettura dei dati da un file, l'aggiunta di nuovi studenti, l'eliminazione di studenti esistenti, la memorizzazione dei dati degli studenti, ed il login.
I variabili della classe sono:
- “studenti”: Un ArrayList che archivia gli oggetti “Studente”. Contiene tutti gli studenti registrati nel sistema.
- “listaIdUtenti”: Un HashSet che archivia gli ID degli studenti per il controllo univoco. Questo set viene utilizzato per verificare che gli ID degli studenti siano univoci.
Ci sono due get metodi:
- “getStudenti()”: Restituisce l'ArrayList di tutti gli studenti.
- “getIdStudente()”: Restituisce l'HashSet contenente gli ID degli studenti.
Il metodo “leggiDati()” legge i dati degli studenti da un file di testo chiamato "Studenti.txt" e li carica nell'applicazione. In questo file, sono memorizzati i dati degli studenti in un formato CSV.
Questo metodo divide i dati degli studenti e degli insegnamenti a cui sono iscritti e crea oggetti “Studente” corrispondenti.
- “aggiungiStudente()”: Permette di aggiungere un nuovo studente all'elenco degli studenti. Richiede l'inserimento di tutte le informazioni necessarie per creare un nuovo oggetto “Studente”, verificando che l'ID studente sia univoco.
- “eliminiStudente(Studente studente)”: Rimuove uno studente dall'elenco degli studenti, compresa la cancellazione della sua iscrizione da tutti gli insegnamenti.
- “selezioniStudente(ArrayList< Studente> studenti)”: Permette all'utente di selezionare uno studente dall'elenco fornito.
Il metodo “stampiDatiStudente(ArrayList< Studente> studenti)” stampa i dati degli studenti presenti nell'elenco fornito in una tabella formattata.
- “memorizziDati()”: Memorizza i dati degli studenti nel file "Studenti.txt", in modo che possano essere recuperati in sessioni successive.
- “login(String idStudente, String password)”: Verifica le credenziali di accesso di uno studente confrontando l'ID studente e la password forniti con quelli registrati. Restituisce l'oggetto “Studente” corrispondente se le credenziali sono corrette, altrimenti restituisce “null”.
La classe “Insegnamento” contiene le variabili fondamentali per aiutare all'utente a gestire insegnamenti di una scuola.
Fornisce metodi per gestire e aggiornare le informazioni relative all'insegnamento, inclusi l'identificatore, il nome, la descrizione, il corso associato, i punteggi massimo e minimo, il punteggio di sufficienza, e il trimestre in cui si tiene l'insegnamento.
Consentirà inoltre di iscrivere e rimuovere studenti da questo insegnamento e visualizzare gli studenti iscritti.
I variabili della classe sono i seguenti:
- “id”: Identificatore univoco dell'insegnamento.
- “nome”: Nome dell'insegnamento.
- “descrizione”: Descrizione dell'insegnamento.
- “corsoInsegnamento”: Corso a cui è associato l'insegnamento.
- “votoMassimo”: Il massimo punteggio ottenibile in questo insegnamento.
- “votoMinimo”: Il punteggio minimo accettabile per superare l'insegnamento.
- “sufficienza”: Il punteggio minimo per ottenere la sufficienza in questo insegnamento.
- “trimestre”: Il trimestre in cui si tiene l'insegnamento.
- “studentiIscritti”: Una lista degli studenti iscritti a questo insegnamento.
Nella classe sono presenti molti get e set metodi per restituire ed impostare i valori delle variabili dichiarate, come getId(), setIdStudente(), setId(String id), eccetera.
La prossima tipologia dei metodi serve per modificare alcuni campi speciali
- “iscriviStudenteInInsegnamento(Studente studente)”: Iscrive uno studente a questo insegnamento.
- “rimuoviStudenteDaInsegnamento(Studente studente)”: Rimuove uno studente da questo insegnamento.
- “rimuoviTuttiStudentiDaInsegnamento()”: Rimuove tutti gli studenti da questo insegnamento. Questo metodo verrà utilizzato quando si modifica il trimestre dell'insegnamento.
Metodi di aggiornamento come aggiorniDescrizione() con funzionalita' simile a quelli della classe "Studente"
Un metodo per effettuare operazioni di sintesi:
- “visualizziStudentiIscritti()”: Visualizza la lista degli studenti iscritti a questo insegnamento.
La classe “InsegnamentoController” è responsabile della gestione degli insegnamenti all'interno del sistema ed è utilizzata per leggere, memorizzare e manipolare le informazioni sugli insegnamenti.
- “insegnamenti”: Una lista di oggetti “Insegnamento” per memorizzare tutti gli insegnamenti.
- “insegnamentiId”: Una mappa che associa gli ID degli insegnamenti agli oggetti “Insegnamento” corrispondenti.
- “leggiDati()”: Legge i dati degli insegnamenti da un file chiamato "Insegnamenti.txt" e li carica nella lista degli insegnamenti e nella mappa degli insegnamenti ID.
- “memorizziDati()”: Crea un FileWriter per memorizza i dati degli insegnamenti nel file di testo "Insegnamenti.txt".
Il metodo modifichiInsegnamento() restituisce una lista delle opzioni per selezionare quale variabile il cui valore l'utente desidera modificare.
Il suo funzionamento e' molto simile/uguale al metodo modifichiStudente() della classe Studente
- “getInsegnamenti()”: Restituisce la lista di tutti gli insegnamenti disponibili.
- “getIdInsegnamento()”: Restituisce la mappa degli insegnamenti associati ai loro ID.
- “getInsegnamentoConId(String id)”: Restituisce un insegnamento specifico dato il suo ID.
- “getDettagliInsegnamenti(ArrayList< Insegnamento> insegnamenti)”: Visualizza i dettagli degli insegnamenti nella lista specificata.
- “aggiungiInsegnamento()”: Permette di aggiungere un nuovo insegnamento alla lista degli insegnamenti disponibili.
- “rimuoviInsegnamento(Insegnamento insegnamento)”: Rimuove un insegnamento dalla lista degli insegnamenti.
- “selezioniInsegnamento(ArrayList insegnamenti, Studente studente)”: Permette all'utente di selezionare un insegnamento dalla lista degli insegnamenti disponibili.