Orario
Da Tesine Linguaggi e Traduttori.
Contents |
Introduzione
Il progetto ha come obbiettivo la realizzazione di un linguaggio che ci permette di assegnare i corsi nelle aule disponibili di un ateneo. Inoltre, sarà possibile interrogare la base di dati definita in precedenza, la quale descrive i docenti, i corsi , le aule e i laboratori di un dato ateneo.
Descrizione del programma
In base alla descrizione dei corsi sostenuti in un ateneo, la disponibilità delle aule e laboratori se neccessario e considerando la disponibilità dei docenti,il programma prova di distribuireire i vari corsi alle aule e laboratori. Il file di input è diviso in 2 parti.
La prima sezione contiene le caratteristiche di un ateneo:
- le aule e i laboratori di cui dispone;
- i corsi sostenuti durante il periodo didattico per il quale si vuole generare l'orario;
- i docenti che insegnano al interno del ateneo.
Un aula è caratterizzata da:
- nome aula (una lettera maiuscola seguita da un numero compreso tra 1 e 29);
- sede (una sequenza di caratteri racchiusa fra “<” e “>”che inizia con una maiuscola e la quale può contenere spazi e può finire con un numero preceduto da un “n” o “n°”);
- capienza (un numero maggiore di 0 );
- dotazioni (un insieme di valori fra {retroproiettore , pc-prof , sistema-audio,…}).
La sintassi per definire un aula o una sequenza di aule è la seguente :
aule : nome_aula , sede , capienza , { dotazione, dotazione , … } ;
…
nome_aula , sede , capienza , { dotazione, dotazione , … }.
Il nome, la sede e la capienza sono attributi obbligatori mentre le dotazioni sono opzionali e la loro presenza è indicata dalle parentesi graffe.
Per agevolare la ricerca delle aule con dotazioni speciali si è deciso di implementarle in oggetti di tipo laboratorio. Le differenze tra un laboratorio e un'aula sono costituite dai nomi e dalle dotazioni. Nel caso dei laboratori le dotazioni sono più variate e se sono specifiche solo dei lab devono essere seguite dal loro numero. I nomi devono cominciare con la parola chiave lab e può essere seguita da una sequenza di lettere e/o un numero . Viste le caratteristiche comune dei laboratori e delle aule, gli oggetti che gli implementano estendono la classe Place.
La sintassi per definire un laboratorio o una sequenza di laboratori è la seguente :
laboratori : nome_lab , sede , capienza , { dotazione_lab - numero, dotazione , … } ;
…
nome_ lab , sede , capienza , { dotazione-numero, dotazione-numero , … }.
Un docente è caratterizzato da:
- nome
- cognome
- specializzazione
- matricola
Il nome e il cognome sono delle stringhe che possono contenere solo lettere a-zA-Z àèéòù' , la prima lettera deve essere maiuscola.
La specializzazione deve fare parte di un insieme di valori {INF, MAT, ELE , … }.
La matricola è composta da una D seguita da una sequenza di almeno 5 e massimo 7 cifre.
La sintassi per definire un professore o una sequenza di professore è la seguente :
docenti : nome_prof , cognome , matricola , specializzazione ;
...
nome_prof , cognome , matricola , specializzazione.
Un corso è caratterizzato da :
- codice (2 cifre seguite da tre lettre maiuscole )
- nome ( stringhe che possono contenere solo lettere a-zA-Z àèéòù', la prima lettera deve essere maiuscola e possono finire con un numero )
- matricola docente
- numero crediti (CFU seguito da un numero positivo minore di 30)
- numero studenti iscritti (numero positivo)
- numero ore teoriche (OT seguito da un numero)
- apparecchiatura necessaria per lo svolgimento del corso in aula ( elenco di elementi appartenenti allo stesso insieme di valori delle dotazioni delle aule)
- numero ore in laboratorio (OL seguito da un numero)
- apparecchiatura necessaria per lo svolgimento del corso in laboratorio ( elenco di elementi appartenenti allo stesso insiemi di valori delle dotazioni dei laboratori)
- numero studenti per postazione di lavoro
L'elenco della apparecchiature, il numero di ore in laboratorio e numero di studenti per postazione possono essere omesse nel caso in cui il corso non preveda esercitazioni.
La sintassi per la definizione dei corsi è la seguente :
codice, nome, matricola-docente , numero crediti , numero studenti iscritti , numero ore teoriche ,
{apparecchiatura aula , … , apparecchiatura aula } ,
( numero ore in laboratorio -> apparecchiatura lab, … , apparecchiatura lab ,
numero studenti per postazione di lavoro ) ;
…
codice, nome, matricola-docente , numero crediti , numero studenti iscritti , numero ore teoriche ,
{apparecchiatura aula , … , apparecchiatura aula } ,
( numero ore in laboratorio -> apparechiatura lab, … , apparechiatura lab ,
numero studenti per postazione di lavoro ).
Nella seconda sezione si possono inserire una o più query per interrogare la base di dati definita prima. Le query hanno la seguente sintassi:
oggetto condizioni
L’oggetto – rappresenta la tabella che si vuole interrogare e quindi può assumere i valori docenti, corsi, aule o laboratori. Le condizioni definiscono il filtro che si vuole definire sulle tabelle, queste variano a seconda del oggetto specifico (come specificato in seguito); sono legate dagli operatori logici AND, OR e NOT; possono essere parentesizzate e utilizzano gli operatori relazionali:
- di uguaglianza ("==");
- di disuaglianza ("!=");
- di maggioranza (">");
- di minoranza ("<");
- di maggioranza o uguaglianza (">=");
- di minoranza o uguaglianza ("<=")
e l’operatore “INC” –include- che può essere usato anche insieme alla negazione NOT Le parentesi tonde obbligatorie nel caso di condizioni composte da operatori logici diversi , in modo da indicare l’ordine di precedenza. Nel caso degli operatori di uguaglianza e disuguaglianza il tipo di dato del filtro deve soddisfare le regole del tipo di dato confrontato. Per gli altri operatori si accettano anche stringhe generiche o numeri. Le stringhe generiche devono essere racchiuse tra doppi apici. Le condizioni sono case sensitive. I docenti possono essere filtrati in base al nome , cognome, matricola e dipartimento. Per far riferimento ai rispettivi campi della tabella si useranno le parole chiavi :
NOME, COGNOME, MATRICOLA, DIP
Le aule possono essere filtrate in base al nome , la sede, alla capienza e alla presenza o no delle dotazioni . Per far riferimento ai rispettivi campi della tabella si useranno le parole chiavi :NOMEA , SEDEA, NPERS o nel caso delle dotazioni le parentesi graffe
I laboratori possono essere filtrati secondo gli stessi campi delle aule permettendo in più il filtro sul numero di ogni dotazione. Per far riferimento ai rispettivi campi della tabella si useranno le parole chiavi :NOMEL , SEDEL, CAPIENZAL, NDOT o le parentesi graffe per indicare l’insieme delle dotazioni.
I corsi possono essere filtrati in base al codice, al nome, al numero di lezioni di teoria o di pratica,al peso in crediti , al numero di studenti iscritti, al docente che lo insegna ,alle dotazioni che richiede o al numero di studenti per postazione . Le parole chiavi per accedere a tali informazioni saranno COD, NCORSO, OTEORIA, OPRATICA, CFU, DOCENTE, ISCRITTI,STUDXPOST e le parentesi graffe per indicare l’insieme delle dotazioni richieste.
Le varie query sono separate dal “;” (punto e virgola) .
Nel linguaggio di input è possibile aggiungere commenti inserendo i caratteri ‘//’ per la riga da commentare.
Linguaggio di input
Il testo di input è suddiviso in due sezioni . La prima sezione è composto dalla definizione delle quattro liste caratteristiche del ateneo ed è terminato dalla parola chiave “FINE” . Le liste devono comparire nel seguente ordine: aule , laboratori , docenti e corsi La seconda sezione è opzionale e può contenere i comandi per l’interrogazione dei dati definiti in precedenza. Esempio file di input:
aule :
A1 , <Ducca Degli Abruzzi n24> , 200 ;
A2 , <Ducca Degli Abruzzi n24> , 100 ;
A3 , <Ducca Degli Abruzzi n24> , 50 ;
B20 , <Alenia>,30,{retroproiettore} ;
L9, <Ducca Degli Abruzzi n°24>, 300,{retroproiettore,pc-prof,sistema-audio} .
laboratori :
lab1 ,<Ducca Degli Abruzzi n24>,120 ,{ pc - 34 ,pc-prof,retroproiettore};
lab2 ,<Ducca Degli Abruzzi n24>,70 ,{ pc - 34 ,pc-prof,retroproiettore};
labCLA20 , <Alenia>,30,{retroproiettore} .
docenti :
Luca , Fabretti ,D12345, INF ;
Fabrizio, Carlo,D123456,ELE;
Caire, Elena, D1324011,MAT;
Varagna , Eleonora,D11100,CLA.
corsi :
02CMX, Analisi matematica 2, D1324011, CFU9, 150, OT70,{retroproiettore,sistema-audio};
03ACX, Informatica di base, D12345, CFU10, 100, OT140, {retroproiettore,pc-prof,sistema-audio},(OL50->pc,pc-prof,3);
01AML, Sistemi a microprocessori, D123456, CFU5, 170, OT120;
02MCX, Algoritmi e programmazione avanzata, D12345, CFU10, 90, OT120,{retroproiettore,pc-prof,sistema-audio}(OL50->pc,pc-prof,3);
01FGL, Fisica applicata, D123456, CFU5, 40, OT120;
04GCT, Lingua inglese, D11100, CFU5, 25, OT0, (OL40->retroproiettore,1)
? aule NOMEA INC "A";
laboratori (NOMEL<=lab2 OR SEDEL==Alenia) AND CAPIENZAL<100 AND {pc} AND NOT {pc-prof};//errore q1 :
? aule NOMEA IND "A"; //errore sull operatore
? laboratori (NOMEL<=lab2 OR SEDEL==Alenia);
? laboratori CAPIENZAL<100;
? laboratori {pc};
? laboratori NOT{pc-prof};
? laboratori (NOMEL<=lab2 OR SEDEL==Alenia) AND CAPIENZAL<100 AND {pc} AND NOT {pc-prof};// si aspetta il risultato lab4
? laboratori (NOMEL<=lab2 OR SEDE==Alenia) AND CAPIENZAL<100 AND {pc} AND NOT {pc-prof};//errore nella seconda codizione del or
? laboratori NOMEL!=labCLA20 AND NDOT pc>40 ;
? aule SEDEA!=Alenia AND NOMEA<=A5 AND NPERS > 50 AND {sistema-audio} AND ({retroproiettore,pc-prof} OR NOT{lavagna-luminosa}) ;
//errore su cchiave campo NPERS al interno di una sequenza di AND
? aule SEDEA!=Alenia AND NOMEA<=A5 AND PERS > 50 AND ({sistema-audio} OR {retroproiettore,pc-prof} OR NOT{lavagna-luminosa});
? docenti DIP==ELE AND(NOME<L OR COGNOME==Eleonora ) AND MATRICOLA>D11200;
? docenti DIP=="A" AND(NOME<L OR COGNOME INC Ele ) AND MATRICOLA>D11200 ;
//errore manca parentesi
? docenti DIP=="A" AND(NOME<L OR COGNOME INC Ele AND MATRICOLA>D11200 ;
? corsi ((COD >02CMX AND (OTEORIA>100 OR OPRATICA <50)) OR DOCENTE==D123457 )AND CFU>=5;
? corsi ((COD <="02" AND (OTEORIA==50 OR OPRATICA <50)) OR DOCENTE>="D123" )AND CFU>=5 OR (STUDXPOST>2 AND ISCRITTI <100);
//errore sul tipo dato dei crediti
? corsi ((COD <="02" AND (OTEORIA==50 OR OPRATICA <50)) OR DOCENTE>="D123" )AND CFU>=CFU5 OR (STUDXPOST>2 AND ISCRITTI <100);
FINE
Per il testo precedente, il programma produrrà in output :
Codice del Corso Descrizione
- 01AML Sistemi a microprocessori
- 02CMX Analisi matematica 2
- 03ACX Informatica di base
Implementazione
Il progetto è stato suddiviso in diversi file : • scanner.jflex : compie un analisi lessicale del linguaggio di input specificato in precedenza. • parser.cup : contiene l'implementazione del parser in Cup, effettua l'analisi sintattica del testo (sulla base della grammatica specificata), ed esegue le azioni semantiche per produrre l'output desiderato. • Aula.java, Laboratorio.java, Place.java, Docente.java e Corso.java : classi java che implementano i diversi oggetti utilizzati per la gestione delle strutture dati.
Strutture dati utilizzate: • HashMap -> utilizzate per memorizzare i dati relativi alle aule, laboratori, docenti e corsi, indicizzate per nomi. • LinkedList -> utilizzate per memorizzare le varie dotazioni delle aule e dei laboratori.
Generazione del orario
Dopo aver caricato tutte le informazioni delle aule,laboratori, corsi e docenti nelle corrispondenti HashMap, vengono memorizzate al interno delle LinkedList gli elenchi dei :
- codici dei corsi ordinati in maniera crescente del numero di studenti iscritti
- nome aule e nomi laboratori ordinati in modo decrescente alla loro capienza.
Queste liste servono per assegnare ai corsi le aule e i laboratori più piccoli che li possono contenere e allo stesso tempo per dare precedenza ai corsi più grandi.
La logica di assegnazione delle aule e dei laboratori è la seguente: Si scandisce tutto l’elenco dei corsi ordinati in base agli studenti iscritti e per ogni corso cerca prima l’aula libera più piccola contenente le dotazioni richieste e la quale lo può contenere e la occupa.
Abbiamo imposto che lo stesso corso non può avere più di 2 lezioni al giorno e una volta che ad un corso le viene assegnato un’aula si cerca di utilizzare la stessa anche nelle lezioni successive favoreggiando le fasce mattutine. Se una sola aula non riesce a coprire tutte le lezioni del corso si passa alla seguente aula più piccola.
Tenendo presente che non solo lo stesso corso non si può svolgere allo stesso tempo in 2 aule diverse, ma neanche il professore di un corso non può sostenere un altro corso in concomitanza, si occupa anche la fascia oraria del docente.
Per memorizzare le assegnazioni delle aule, dei laboratori ma anche dei professori per certe fasce orarie abbiamo utilizzato delle HashMap indicizzate dai nomi e rispettivamente dalla matricola e contenenti dei diagrammi( matrici bidimensionali di stringhe, dove le righe indicano i giorni della settimana e le colone le fasce orarie ) .
Se un corso prevede anche lezioni in laboratorio e si è riuscito a coprire le lezioni in aula si usa la stessa logica per assegnare anche i laboratori, se invece non è stato possibile trovare le aule per le lezioni teoriche non si assegnano neanche i laboratori. A differenza delle aule, nel caso dei laboratori non basta che sia capiente e abbia le dotazioni richieste , ma deve soddisfare anche la condizione dei numero di studenti per postazione di lavoro. Cioè, il numero di dotazioni deve essere maggiore o uguale al numero di studenti iscritti al corso diviso per il numero di studenti per postazione.
Implementazione delle query Per ogni campo che può essere un filtro è stato implementata una funzione la quale, ricevendo come parametri i dati del filtro, scandisce la lista di tutti i record dell’entità richiesta, realizza il confronto del campo indicato( e il contenuto del filtro) e se soddisfa le condizioni richieste lo inserisce in una LinkedList che vera alla fine restituita. Come abbiamo già accennato nella sezione di descrizione della semantica delle query, se per gli operatori di uguaglianza (“==”) e diversità (“!=”) i dati del confronto devono soddisfare le regole del tipo di dato del filtro, nel caso di tutti gli altri operatori i dati possono essere delle stringhe generiche o numeri.
Limiti
Il programma presenta delle limitazioni:
- le dotazioni dei laboratori e delle aule come anche le specializzazioni dei docenti devo appartenere al set specificato e per giungerne altri si deve modificare lo scanner ;
- le matricole dei docenti che compaiono nella descrizione di un corso devono comparire anche nel elenco dei professori;
Nonostante la presenza di tali limiti, si cercherà di gestire gli errori derivanti da essi in modo da bloccare il meno possibile l'esecuzione del programma.
Gestione degli errori sintattici e semantici
Se nelle dichiarazioni delle dotazioni delle aule (laboratori) o nelle dichiarazione delle dotazioni richieste dei corsi si cerca di inserire dotazioni non riconosciute dallo scanner come tali , viene segnalato l’errore e il programma continua ignorando tale dotazione. Nel caso delle dotazioni di laboratorio, se non viene riconosciuto il numero di postazioni si segnala l’errore in output e il programma continua considerando come numero di postazioni di tale dotazione la capienza del laboratorio. Se si assegna ad un corso, la matricola di un docente che non è stato dichiarato in precedenza, il programma stampa un messaggio di errore e continua l’esecuzione senza prendere in considerazione tale corso. Nella sezione delle query, se si prova di inserire un campo non riconosciuto per l’entità dichiarata al inizio della query, questo viene ignorato e si segnala l’errore in uscita.
Istruzioni per il download, la compilazione e l'esecuzione
La compilazione e l'esecuzione dell'applicazione richiede la presenza di Java sulla macchina.
Il download dei sorgenti è disponibile al link [1] .
Rispettivamente per compilare ed eseguire il progetto, estrarre l'archivio in una directory di destinazione, e digitare i seguenti comandi:
- su UNIX:
./compile.sh
./run.sh {path_input_file} - su Windows:
compile.bat
run.bat {path_input_file}
Dove {path_input_file} è il percorso del file di ingresso.
Per l'operazione di cleaning, nella directory base del progetto digitare:
- su UNIX:
./clean.sh
- su Windows:
./clean.bat

