Laboratorio di Programmazione 2

C.L. Matematica

 

 

Gruppo Facebook:       LP2 @ Unina

 

PROGRAMMA (provvisorio)  

1) Strutture dati dinamiche e algoritmi ricorsivi.

2) Programmazione multithreading e introduzione al calcolo ad alte prestazioni

3) Struttura e funzionalita' dei sistemi operativi



ATTIVITA' DI LABORATORIO

1) Gauss (scadenza 16/10/2016)

 

scrivere una function C per la risoluzione di un sistema di equazioni lineari (alg. Gauss + back substitution) con la seguente testata:

    int linesolve(int N, int LD, float A[][LD], float B [], float X [])

  N: ordine del sistema

  LD: leading dimension

  A: matrice dei coefficienti

  B: vettore dei termini noti

  X: vettore soluzione

  valori di ritorno:

      0: soluzione calcolata

      1: errore (es: matrice singolare)

 

Inserire nella cartella nomecognome di Dropbox solo il file linesolve.c che contiene la funzione linesolve ed altre, eventuali, funzioni necessarie. Altri file verranno cancellati. Assicurarsi della correttezza dei nomi del file e della funzione

 

Risultati prima consegna

 

 

2) Rubrica (scadenza 30/10/2016) scrivere le function C per la gestione di una rubrica telefonica organizzata secondo una lista ordinata
I nodi  hanno la seguente struttura

struct nodo{
char nome [10];
char numero[10];
struct nodo * pt;
}


le funzioni hanno le seguenti specifiche:

- void crearubrica(struct nodo **head)                                                                        crea una rubrica vuota
- void visualize(struct nodo **head)     
                                                                    visualizza la rubrica
- int finditem(struct nodo ** head, char nome[ ], char numero[ ])     cerca l'elemento nome e restituisce numero
- int removeitem(struct nodo ** head, char nome[ ])                  
rimuove il nodo contenente nome
- void insertitem(struct nodo ** head, char nome[ ], char numero [ ])
inserisce un nodo con nome e numero dati
- int updateitem(struct nodo ** head, char nome[ ], char numero [ ])
 aggiorna il nodo contenente nome con un nuovo numero

nessuna funzione deve contenere istruzioni di lettura e stampa, fatta eccezione per visualize, che stampa tutta la rubrica (nome e numero). La stampa all'interno di visualize deve essere fatta con la seguente istruzione:      
printf("Nome = %S, Numero = %s \n", ... , ... ); (inserire al posto dei puntini il nome e il numero  da stampare e non utilizzare altre istruzioni di stampa all'interno della function)

le funzioni intere 
finditem, removeitem, e updateitem   restituiscono 0 se ok,   -1 se non trovano il nodo su cui operare

Inserire nella propria  cartella nomecognome di Dropbox solo il file rubrica.c che contiene le funzioni assegnate  ed altre, eventuali, funzioni necessarie. Altri file verranno cancellati. Assicurarsi della correttezza dei nomi del file e delle funzioni

Risultati seconda consegna

 

3) Integratore automatico Ricorsivo (scadenza 20/11/2016) scrivere una function ricorsiva C per un integratore automatico con la seguente testata

   

int intautric(float A, float B, int MAXFUN, float TOL,  float *Q, float *E, int *N, float FUN(float))

 

   A  estremo inferiore dell'intervallo di integrazione (input)

   B  estremo superiore dell'intervallo di integrazione (input)

   MAXFUN massimo numero di valutazioni di funzione (input)

   TOL   tolleranza assoluta richiesta (input)

   Q  stima dell'integrale (input e output. Porre nel main Q=0)

   E  stima dell'errore (input e output. Porre nel main E=0)

   N  numero di valutazioni di funzioni (input e output. Porre nel main N=0)

   FUN  funzione integranda  

    valori di ritorno: 0= tolleranza raggiunta,   1= superato MAXFUN

 

utilizzare la function quadra presente nella propria cartella nomecognome Dropbox per il calcolo della stima dell'integrale e dell'errore in un sottointervallo

 

testare la function almeno con i seguenti dati

 f1(x) = 4/(1+ x^2) nell'intervallo [0,1], TOL = 0.0001, MAXFUN = 200. Risultati: ret = 1, N=201,  Q=2.875299

 f1(x) = 4/(1+ x^2) nell'intervallo [0,1], TOL = 0.0001, MAXFUN = 300. Risultati: ret = 0, N=219,  Q=3.141577

Inserire nella propria  cartella nomecognome di Dropbox solo il file intautric.c che contiene la funzione assegnata (senza la function  quadra  e senza la function per la funzione integranda)  ed altre, eventuali, funzioni necessarie. Altri file verranno cancellati. Assicurarsi della correttezza dei nomi del file e delle funzioni. Non inserire stampe nella function.

Risultati  terza consegna

 

4) matmat (scadenza 4/12/2016)

 

scrivere 6  function C per l'operazione matriciale  C = C+A*B:

    void  matmatijk(int LDA, int LDB, int LDC, float A[][LDA], float B [][LDB], float C[][LDC], int N, int M, int P)

    void  matmatjik(int LDA, int LDB, int LDC, float A[][LDA], float B [][LDB], float C[][LDC], int N, int M, int P)

    void  matmatikj(int LDA, int LDB, int LDC, float A[][LDA], float B [][LDB], float C[][LDC], int N, int M, int P)

    void  matmatkij(int LDA, int LDB, int LDC, float A[][LDA], float B [][LDB], float C[][LDC], int N, int M, int P)

    void  matmatkji(int LDA, int LDB, int LDC, float A[][LDA], float B [][LDB], float C[][LDC], int N, int M, int P)

    void  matmatjki(int LDA, int LDB, int LDC, float A[][LDA], float B [][LDB], float C[][LDC], int N, int M, int P)

  LDA: leading dimension della matrice A

  LDB: leading dimension della matrice B

  LDC: leading dimension della matrice C

  A: matrice di dimensione NxM

  B: matrice di dimensione MxP

  C: matrice di dimensione NxP

  N: numero righe di A e di C

  M: numero colonne di A e di righe di B

  N: numero colonne di B e di C

 

le 6  function differiscono nella disposizione degli indici dei 3 cicli for costituenti il corpo della function

 

Utilizzare  ciascuna function per il prodotto di  matrici quadrate di ordine N=M=P=10, 20, 30,...,500 (50 esecuzioni), e determinare la function che effettua il maggior numero di operazioni al secondo. A tal fine utilizzare la function get_cur_time()   presente nel file c_timer.c  e  c_timer.h disponibili nella propria cartella Dropbox

 

Inserire nella cartella nomecognome di Dropbox solo il file matmat.c che contiene le 6 function. Altri file verranno cancellati. Assicurarsi della correttezza dei nomi del file e della funzione

Risultati quarta consegna

 

 

5) matmat thread(scadenza 18/12/2016)

 

scrivere una  function C per l'operazione matriciale  C = C+A*B utilizzando una griglia con thread NT=NTROW*NTCOL:

    void  matmatthread(int LDA, int LDB, int LDC, float A[][LDA], float B [][LDB], float C[][LDC], int N, int M, int P, int NTROW, int NTCOL)

   

  LDA: leading dimension della matrice A

  LDB: leading dimension della matrice B

  LDC: leading dimension della matrice C

  A: matrice di dimensione NxM

  B: matrice di dimensione MxP

  C: matrice di dimensione NxP

  N: numero righe di A e di C

  M: numero colonne di A e di righe di B

  N: numero colonne di B e di C

  NTROW: numero di righe nella griglia di thread

  NTCOL: numero di colonne nella griglia di thread

 

 

Utilizzare  la  function per il prodotto di  matrici quadrate di ordine N=M=P=500 , con 1, 2 e 4 thread (3 esecuzioni distinte). Nel caso di 1 thread l'esecuzione e' equivalente alla tradizionale esecuzione di un programma per il calcolo del prodotto di due matrici. Nel caso di piu'  thread, le matrici vengono  immaginate  suddivise in blocchi  e il calcolo di C  si esegue effettiuando  un prodotto "a blocchi", in maniera coerente con le dimensioni delle matrici .

 

Ad esempio, con NT = 4 thread,  il thread 0 deve calcolare il blocco C(0,0) , corrispondente alle prime 250 righe e 250 colonne di C , mediante il prodotto tra

matrice composta dalle prime 250 righe (e tutte le colonne)  di A, e la

matrice composta dalle prime 250 colonne (e tutte le righe)  di B

utilzzando la function matmatikj sviluppata in occasione della consegna 4

 

Calcolare i tempi di esecuzione con 1, 2 e 4 thread con la function get_cur_time()   presente nel file c_timer.c  e  c_timer.h disponibili nella propria cartella Dropbox

 

Inserire nella cartella nomecognome di Dropbox solo il file matmatthread.c che contiene la function assegnata e le altre function ausiliarie (ad es. matmatikj). Altri file verranno cancellati. Assicurarsi della correttezza dei nomi del file e della funzione

Risultati quinta consegna

 


BIBLIOGRAFIA GENERALE

Silberschatz , Galvin, Gagne - Sistemi Operativi: concetti ed esempi - Pearson ed. (disponibile versione digitale in inglese)

Kerninghan, Ritchie - Linguaggio C: principi di programmazione e manuale di riferimento  - Pearson ed.  (disponibile versione digitale in inglese)

Cormen, Leiserson, Rivest, Stein - Introduzione agli algoritmi e strutture dati, 3a ed. - McGrow Hill (disponibile versione digitale in inglese)

 

SLIDE (2014)

 



SOFTWARE DI SUPPORTO

Per chi non dispone di una macchina con s.o. Linux, in  via sperimentale, viene fornita una piattaforma software  di supporto che replica l'ambiente disponibile nel  laboratorio didattico e che puo' essere utilizzata per lavorare a casa. Si tratta di una "macchina   virtuale" , (cioe' un programma,  con tutte le funzionalita' di un vero calcolatore) che esegue un sistema operativo Linux (Ubuntu) e che puo' essere eseguito  sul  proprio computer, qualunque sia il sistema operativo (Windows, Mac OS o anche Linux stesso). A tal fine e' necessario installare sul proprio computer un software di interfacciamento (chiamato anche Supervisore, oppure Virtual Machine Player) tra il proprio sistema operativo e il calcolatore virtuale.

 passi per installare il Supervisore

  • scaricare gratuitamente il supervisore ( VMware Player ) da http://www.vmware.com/go/downloadplayer/, selezionando il sistema operativo che si possiede

  • far partire il  VMware Player’s Installer (doppio click sul file scaricato)

  • se appare la finestra intitolata User Account Control , selezionare  Yes.

  • all'apparire della finestra VMware Player Setup selezionare  Next.

  • accettare i termini della licenza e selezionare nuovamente Next

  • alla richiesta di selezionare della  cartella per l'installazione (Destination Folder), selezionare  Next.

  • alla richiesta di aggiornamenti del software (Software updates) selezionare Next

  • Alla richiesta di eventuali collegamenti (Shortcuts), selezionare  Next. (eventualmente deselezionare  Quick Launch  e/o  Start Menu Programs folder .)

  • alla richiesta di esecuzione delle operazioni richieste (Perform the Requested Operations), selezionare  Continue.

  • al termine dell'installazione  (Setup Wizard Complete) ,  selezionare Restart Now , oppure  Continue.



 passi per installare
la Macchina virtuale LabProgMachine

  • Scaricare gratuitamente  la macchina virtuale  wpage.unina.it/lapegna/educational/LABPROG/LabProgMachine.rar  Il file ha dimensioni maggiori di   1GB  e puo' richiedere qualche minuto a secondo della velocita' di connessione

  • decomprimere il file (ad esempio sul Desktop)

  • eseguire il supervisore  VMware Player (ad es. doppio click sul collegamento presente su desktop) .  Se richiesti, accettare i termini di utilizzo ed ignorare altri eventuali messaggi

  • nella finestra di VMware Player selezionare Open a Virtual Machine, e accedere alla cartella Xubuntu_  dove e' stata decompressa la macchina virtuale

  • selzionare la macchina virtuale Xubuntu  e poi Apri. Quindi Play Virtual Machine

  • Aspettare qualche istante (circa 30 sec) e immettere user come password dell'utente mostrato

 

PER LE CONSEGNE ( IMPORTANTE ! )

Le consegne avverranno, in via sperimentale, attraverso il servizio  cloud Dropbox, gia' installato nella macchina virtuale LabProgMachine

operazioni da esegure 1 sola volta !

 

1)  Se non lo si dispone, crearsi un account Dropbox su  www.dropbox.com e accedere

2)  accedere alla sezione "condivisione" del menu presente sulla sinistra nella  pagina principale,

3)  cliccare su "Nuova cartella condivisa"  e poi su "Avanti"

4)  dare alla cartella condivisa il nome nomecognome  ovviamente usando il proprio nome e cognome

5)  invitare come membro con cui condividere la cartella  marco.lapegna@unina.it

 

6)  avviare la macchina virtuale ed aggiornare Dropbox all'ultima versione con il comando 

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

7) Avviare Dropobox (dalla sezione internet del menu principale) e collegare la macchina virtuale con Dropbox, inserendo  le credenziali  definite al punto 1)