Seconda prova informatica 2016 2017

Simulazione Seconda prova svolta

Tema di: Informatica

indirizzo: INFORMATICA E TELECOMUNICAZIONI (Nuovo ordinamento)

Articolazione: INFORMATICA
Anno scolastico: 2016/2017

Testo, svolgimento e spiegazione passo passo della simulazione di seconda prova di esami di stato per l'indirizzo Informatico di un Istituto Tecnico Industriale visualizza e scarica questa pagina in formato PDF


Testo della prova

[nascondi]
Il candidato (che potrà eventualmente avvalersi delle conoscenze e competenze maturate attraverso esperienze di alternanza scuola-lavoro, stage o formazione in azienda) svolga la prima parte della prova e due tra i quesiti proposti nella seconda parte.

Prima Parte

Un’azienda start-up vuole costruire una piattaforma Web che consenta il car pooling tra viaggiatori sul territorio nazionale, con l’obiettivo di diffondere l’uso di una mobilità flessibile e personalizzata in termini di percorsi e costi.

Gli utenti della piattaforma possono essere di due tipi: utenti-autisti (coloro che offrono un passaggio con la propria macchina) e utenti-passeggeri (coloro che usufruiscono del passaggio).

Gli autisti devono registrarsi sul sito ed inserire i propri dati: generalità, numero e scadenza patente di guida, dati dell’automobile utilizzata, recapito telefonico, email, fotografia.

Per ogni viaggio che intendono condividere, gli autisti devono indicare città di partenza, città di destinazione, data ed ora di partenza, contributo economico richiesto ad ogni passeggero, tempi di percorrenza stimati. È responsabilità dell’autista, mano a mano che accetterà passeggeri per un certo viaggio, dichiarare chiuse le prenotazioni per quel viaggio, utilizzando un’apposita funzione sul portale.

L’utente-passeggero si deve registrare sulla piattaforma, indicando cognome e nome, documento di identità, recapito telefonico ed email. La piattaforma fornisce ai passeggeri la possibilità di indicare città di partenza e di destinazione e data desiderata; presenta quindi un elenco di viaggi (per cui non siano ancora chiuse le prenotazioni), ciascuno con le caratteristiche dell’autista e le modalità del viaggio stesso inserite dall’autista (orario, eventuali soste previste alle stazioni di servizio, possibilità di caricare bagaglio o animali, …).

Il passeggero sceglie quindi il viaggio desiderato con il corrispondente autista, anche esaminando il voto medio e i giudizi dei feedback assegnati tramite la piattaforma dai precedenti passeggeri all’autista stesso, e si prenota. Le informazioni sul passeggero vengono inviate per email dalla piattaforma all’autista scelto, il quale può consultare sul portale il voto medio e i giudizi dei feedback ricevuti dal passeggero da parte di precedenti autisti e decidere se accettarlo o meno. Il passeggero di conseguenza riceverà una email di accettazione o di rifiuto della prenotazione effettuata, contenente, in caso di accettazione, un promemoria con città di partenza e destinazione, data e orario del viaggio, dati dell’autista e della sua automobile.

A viaggio effettuato, il passeggero può inserire un feedback sull’autista, espresso sia in forma di voto numerico che di giudizio discorsivo. A sua volta, l’autista può inserire un feedback sul passeggero, espresso sia in forma di voto numerico che di giudizio discorsivo. Sia i voti medi che i singoli giudizi dei feedback ricevuti da ciascun autista sono disponibili ai passeggeri; analogamente, sia i voti medi che i singoli giudizi dei feedback ricevuti da ciascun passeggero sono disponibili agli autisti.

Consegna:

Il candidato, fatte le opportune ipotesi aggiuntive, sviluppi

  1. un'analisi della realtà di riferimento, giungendo alla definizione di uno schema concettuale della base di dati che, a suo motivato giudizio, sia idoneo a gestire la realtà presentata;
  2. il relativo schema logico;
  3. le seguenti interrogazioni espresse in linguaggio SQL:
    1. data una città di partenza, una di arrivo e una data, elencare gli autisti che propongono un viaggio corrispondente con prenotazioni non ancora chiuse, in ordine crescente di orario, riportando i dati dell’auto e il contributo economico richiesto;
    2. dato il codice di una prenotazione accettata, estrarre i dati necessari per predisporre l’email di promemoria da inviare all’utente passeggero;
    3. dato un certo viaggio, consentire all’autista di valutare le caratteristiche dei passeggeri visualizzando l’elenco di coloro che lo hanno prenotato, con il voto medio dei feedback ricevuti da ciascun passeggero, presentando solo i passeggeri che hanno voto medio superiore ad un valore indicato dall’autista;
  4. il progetto di massima della struttura funzionale dell’applicazione Web, realizzando, con appropriati linguaggi a scelta sia lato client che lato server, un segmento significativo dell'applicazione che consente l'interazione con la base di dati.

Seconda parte

  1. In relazione al tema proposto nella prima parte, il candidato integri il modello già realizzato al fine di gestire in automatico il numero di posti disponibili nei vari viaggi, evitando che sia responsabilità dell’autista dichiarare chiuse le prenotazioni sul portale. Nel momento in cui inserisce un viaggio, l’autista dichiara il numero massimo di posti disponibili. Mano a mano che gli autisti accettano le prenotazioni, il sistema visualizzerà solo i viaggi con posti ancora disponibili: a tal fine, una prenotazione non ancora accettata dall’autista non comporta alcun impegno del posto, che resta così ancora disponibile per prenotazioni di altri passeggeri. Per ciascun viaggio, la piattaforma mostrerà il numero dei posti disponibili e il numero delle prenotazioni non ancora accettate. Il candidato sviluppi poi la pagina web, sia lato client che lato server, per fornire ai passeggeri tali informazioni.
  2. In relazione al tema proposto nella prima parte, il candidato immagini di volere documentare al committente l’operatività della piattaforma proposta. A tal fine, imposti una relazione tecnica che presenti le principali caratteristiche dell’applicazione Web in termini di organizzazione e funzionalità. In particolare, imposti la struttura di tale relazione, motivando le scelte e scrivendo un esempio significativo dei relativi contenuti.
  3. Dato il seguente schema relazionale: film (id, titolo, durata, anno di produzione, genere); attore (id, nome, cognome, data_nascita, fotografia); recita (id_film, id_attore, ruolo); il candidato:
    • determini la modalità di gestione del campo ‘fotografia’ che prevede la memorizzazione di una immagine dell’attore in un formato grafico (es. JPG);
    • formalizzi in linguaggio SQL lo schema fisico corrispondente allo schema relazionale, sapendo che:
      1. il campo ‘genere’ ammette solo i seguenti valori: fantasy, giallo, commedia, horror, drammatico, fantascienza, azione;
      2. per la relazione ‘recita’, i campi ‘id_film’ e ‘id_attore’ referenziano rispettivamente la chiave primaria delle relazioni ‘film’ e ‘attore’;
    • discuta l’uso degli indici nel modello fisico di una base di dati e suggerisca con motivato giudizio indici appropriati per questo schema relazionale, definendoli in linguaggio SQL.
  4. Un’azienda desidera sviluppare un’applicazione Web per la prenotazione on-line di eventi culturali, fruibile sia da computer desktop che da dispositivi mobili come tablet e smartphone. Il candidato esponga i punti critici da affrontare relativamente alle differenti proprietà di visualizzazione delle varie tipologie di dispositivi e alla rispettiva fruizione dei contenuti. Illustri possibili misure risolutive, con esempi relativi all’applicazione in questione.


  5. su


Analisi della realtà di riferimento(bozza)

[nascondi]
Si userà il DBMS MYSQL e il linguaggio php per l'implementazione dell'interfaccia grafica (pagina web) e delle interrogazioni al database. Si ipotizza quindi di poter testare il funzionamento del software in un ambiente preinstallato in locale che comprende una piattaforma integrata di sviluppo web (come ad esempio EasyPhp) contenente:
  • il server web Apache
  • il server di database MySQL
  • un interprete di script php
  • e l'interfaccia grafica phpMyAdmin per la creazione delle tabelle e il test delle query in SQL.

Ipotesi aggiuntive:

  1. Si ipotizza che il documento di identità sia necessario anche per la registrazione di un autista. Tale scelta molto vicina al caso reale, rende la progettazione più snella permettendo la creazione di un'unica entità utente che comprende entrambe le tipologie (utente-autista e utente-passeggero) e di un'entità autista contenente solo i dati aggiuntivi necessari per gli autisti
Saranno usati gli stessi strumenti per l'installazione del software dopo la fase di test negli host del cliente. Si prevede in particolare l'uso di un computer server (contenente il server web e il motore MySQL e php) e poi l'uso di un computer client in rete col server per ogni punto di controllo contenente l'interfaccia grafica che interagisce col database situato sul server remoto.

Per trovare altri esempi di analisi della realtà potete dare un'occhiata ad altri svolgimenti della simulazione che trovate alla fine di questo articolo e cioè qui


su


Schema concettuale

[nascondi]
Diagramma Entità Associazioni seconda prova Informatica 2016/2017 apri nella dimensione originale

Note:

  • L'entità utente contiene tutti i dati anagrafici sia di un viaggiatore che di un autista.
  • L'entità autista è un utente (associazione 1-1) con attributi propri (dati dell'automobile, scadenza patente ecc.). Questo evita la ridondanza che si avrebbe con due entità aventi molti attributi in comune e permette ad un autista di essere anche un viaggiatore e anche a un passeggero di diventare un autista.

su


Schema logico

[nascondi]
La progettazione logica sarà fatta elencando le tabelle e le relazioni tra le tabelle

Tabelle


utenti(idutente, nome, cognome, cellulare, email, foto, idtipodoc, numerodoc)
autisti(idutente, numeropatente, scadenza, datiautomobile)
tipidocumento(idtipodoc, tipo)
viaggi(idviaggio, descrizione, idautista, idcomunepartenza, idcomunearrivo, dataorapartenza, costo, prenotazionechiusa)*1
comuni(idcomune, comune)
prenotazioni(idprenotazione, idutente, idviaggio, accettata)*2
feedback(idfeedback, punteggio, commento, idutenteautore, idutentericevente, idviaggio)

Note:

^ *1: per la tabella viaggi le colonne

  • costo serve a memorizzare il contributo previsto per ogni passeggero
  • prenotazionechiusa contiene come valore di default falso ('false') ad indicare che le prenotazioni per quel viaggio sono ancora aperte; l'autista cambierà il valore a vero (true) quando la prenotazione di quel viaggio sarà chiusa
  • descrizione serve a dare eventuali indicazioni ai passeggeri (es: soste previste, possibilità di animali a bordo, capienza o possibilità dei bagagli ecc.)
^ *2: per la tabella prenotazioni le colonne
  • accettata: avrà valore di default falso ('false') ad indicare che la prenotazione non è stata ancora accettata, vero (true) se l'autista accetta la prenotazione dell'utente.

    NB: Quando l'autista chiude le prenotazioni per un certo viaggio (mettendo il campo prenotazionechiusa della tabella viaggio a true), tutte le prenotazioni non accettate degli utenti rimarranno ovviamente tali.

  • idprenotazione è il codice di prenotazione di ogni utente accettato




Relazioni tra le tabelle*

Tabella 1Tabella 2Relazionetramite
utentitipidocumentoM-1idtipodoc
autistiutenti1-1idutente
viaggiautistiM-1idautista
viaggicomuniM-1idcomunepartenza
viaggicomuniM-1idcomunearrivo
prenotazioniutentiM-1idutente
prenotazioniviaggiM-1idviaggio
feedbackutentiM-1idutenteautore
feedbackutentiM-1idutentericevente
feedbackviaggiM-1idviaggio

^ * NB: le relazioni tra le tabelle, sono descritte in maniera non grafica poichè la progettazione concettuale descrive già ampiamente le associazioni tra le entità; ciononostante è opportuno descriverle indicando, per ogni relazione, la maniera nella quale sono collegate, e cioè: o tramite una chiave esterna (nel caso di relazioni uno a uno e uno a molti), oppure tramite un'altra tabella (nel caso di relazione molti a molti). Nella tabella quindi il campo tramite assume proprio: il nome del campo chiave esterna (relazioni 1-1, m-1) o il nome della tabella che fa da "ponte" tra le due. Si intende anche specificare che in genere, la chiave esterna che fa da collegamento (tramite) tra le due tabelle, ha anche lo stesso nome della chiave primaria alla quale si collega.

su


Query SQL

[nascondi]
  1. data una città di partenza, una di arrivo e una data, elencare gli autisti che propongono un viaggio corrispondente con prenotazioni non ancora chiuse, in ordine crescente di orario, riportando i dati dell’auto e il contributo economico richiesto;

    SELECT nome, cognome, cellulare, datiautomobile, costo
    FROM utenti, autisti, viaggi
    WHERE ( ( ( (autisti.idutente=utenti.idutente)
    and (viaggi.idautista=autisti.idutente) )
    and ( (viaggi.idcomunepartenza=comuni.idcomune)
    and (viaggi.idcomunearrivo=comuni.idcomue) ) )
    and ( (prenotazionechiusa=false)
    and (comune=[inserisci città di partenza]
    and comune=[inserisci città di arrivo]) )
    ORDER BY dataorapartenza
  2. dato il codice di una prenotazione accettata, estrarre i dati necessari per predisporre l’email di promemoria da inviare all’utente passeggero;
    SELECT descrizione, dataorapartenza, nome, cognome, cellulare, datiautomobile, costo
    FROM viaggi, autisti, utenti, prenotazioni
    WHERE ( ( (autisti.idutente=utenti.idutente)
    and (viaggi.idautista=autisti.idutente) )
    and ( (accettata=true)
    and (idprenotazione=[inserisci codice prenotazione])) )
    and ( (viaggi.idcomunepartenza=
    (select idcomune from comuni where comune=[inserisci comune partenza]) )
    and (viaggi.idcomunearrivo=
    (select idcomune from comuni where comune=[inserisci comune arrivo]) ) )

  3. dato un certo viaggio, consentire all’autista di valutare le caratteristiche dei passeggeri visualizzando l’elenco di coloro che lo hanno prenotato, con il voto medio dei feedback ricevuti da ciascun passeggero, presentando solo i passeggeri che hanno voto medio superiore ad un valore indicato dall’autista;


    SELECT nome, cognome, AVG(punteggio) as punteggioMedio
    FROM viaggi, utenti, prenotazione, feedback
    WHERE ( ( (prenotazioni.idviaggio=viaggi.idviaggio)
    and (utenti.idutente=prenotazioni.idutente) )
    and (feedback.idutente=utenti.idutente) )
    and (idviaggio=[inserisci codice viaggio])
    GROUP BY idutente HAVING punteggioMedio > [inserisci punteggio medio minimo]
    ORDER BY punteggioMedio

    NB: le query qui presenti non sono state provate, quindi sono possibili errori od omissioni.
    su


Seconda parte

[nascondi]
I punti 1,2 e 4 sono in lavorazione

Punto 3

1)La memorizzazione delle foto avverrà in una cartella del server remoto di nome "fotoattori". Il campo fotografia verrà gestito tramite il tipo varchar (ipotizzando di usare un DBMS MySQL) che contiene di default 255 caratteri. Questi ultimi serviranno per memorizzare di volta in volta (e cioè all'atto dell'inserimento di una nuova foto tramite pagina web) il percorso relativo della foto; ad esempio: "./fotoattori/ClaudiaSchiffer.jpg" oppure in alternativa omettendo il nome della cartella visto che si assume sia "fotoattori" di default e cioè: "./ClaudiaSchiffer.jpg" NB (da non scrivere nel tema): da notare il punto iniziale che sta a indicare la cartella corrente del server 2)

Definizione dello schema fisico (relazioni)

create table film
(
primary key (id) id int unsigned not null auto_increment,
titolo varchar(50) ,
durata DECIMAL(5, 2),
anno_di_produzione YEAR(4),
genere varchar(50),
check (genere in ('fantasy', 'giallo', 'commedia',
'horror', 'drammatico', 'fantascienza', 'azione')),
primary key (id)
);

create table attore
(
id int unsigned not null,
nome varchar(30),
cognome varchar(30),
data_nascita date,
fotografia varchar(50)
primary key (id),
);

create table recita
(
id int unsigned not null,
id_film int not null,
id_attore int not null,
ruolo varchar(50)
primary key (id_film, id_attore),
foreign key (id_film) references film,
foreign key (id_attore) references attore,
);
3)Un indice è una struttura dati ausiliaria che consente di recuperare più velocemente i dati di una tabella, evitandone la lettura dell’intero contenuto tramite una selezione più mirata. Quindi ha senso creare un indice per quei campi sui quali si prevede che l'utente faccia più ricerche. Nel nostro caso si possono prevedere due indici: uno per il campo titolo e uno per il campo cognome per ovvi motivi (un utente cerca in genere o il titolo di un film o il nome di un attore).
La creazione in SQL si fa nel modo seguente:

CREATE INDEX cercatitolo ON Film ('titolo') ;
CREATE INDEX cercaattore ON Attore ('cognome') ;

In alternantiva un indice si può creare all'interno della create table così:
CREATE TABLE 'Film' (
...
titolo varchar(50),
...
INDEX cercatitolo ('titolo')
);

NB (da non scrivere nel tema): ogni indice deve avere un nome a scelta e poi si deve indicare la tabella e il campo indice cioè la instassi generale per la creazione di un indice è:

CREATE INDEX nomeindice ON nometabella ('nomecampo') ;

su