Laboratorio di Programmazione 2

C.L. Matematica

 

 

 

 

PROGRAMMA (provvisorio, riferito all'a.a.20/21. )

 

1) Strutture dati dinamiche e algoritmi ricorsivi.

2) Programmazione multithreading e introduzione al calcolo ad alte prestazioni

 

3) Il linguaggio Python e i pacchetti Numpy, Scipy e Matplotlib

4) Struttura e funzionalita' dei sistemi operativi



ATTIVITA' DI LABORATORIO 2020 / 2021

0) Gauss (elaborato facoltativo. scadenza : nessuna)

 

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

 

 

1) Rubrica (scadenza 03/04/2022) 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", ... , ... ); (fare copi/incolla dell'istruzione e inserire al posto dei puntini le varibili da stampare da stampare. 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 prima consegna

 

2) Integratore automatico Ricorsivo (scadenza 24/05/22) 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  seconda consegna

 

3) matmat (scadenza 8/5/22)

 

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

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

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

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

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

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

    void  matmatjki(int LDA, int LDB, int LDC, float *A, float *B , float *C, 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

 

void  matmatblock(int LDA, int LDB, int LDC, float *A, float *B , float *C, int N, int M, int P, int dbN, int dbM, int dbP)

 

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 matmat e la function matmatblock. Altri file verranno cancellati. Assicurarsi della correttezza dei nomi del file e della funzione

Risultati terza consegna

 

 

4) matmat thread(scadenza 22/05/22)

 

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, float *B, float *C, int N, int M, int P, int dbN, int dbM, int dbP, 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

   P: numero colonne di B e di C

  dbN:  numero righe blocchi di A e di C

  dbM:   numero colonne blocchi di A e righe blocchi di B

  dpP:   numero colonne blocchi 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 matmatblock   sviluppata in occasione della consegna precedente

 

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 e matmatblock ). Altri file verranno cancellati. Assicurarsi della correttezza dei nomi del file e della funzione

Risultati quarta consegna

 

5) Python (scadenza 12/06/22)

scrivere una funzione PYTHON  per il calcolo di un insieme di prodotti di matrici del tipo C = A*B con la seguente testata:

   

  def  prod(problems, results):

 

     problems: lista di stringhe

     results: lista di stringhe

problems contiene i nomi dei file contenenti i dati di input. Le prime tre linee di ciauscun file rappresentano rispettivamente i valori di N (righe di A), M (colonne di A e righe di B) e P (colonne di B). Gli elementi di A e di B sono disposti nel file uno per riga. Esempio qui

results contiene i nomi dei file contenenti i risultati. Ogni file results[i] contiene il risultato relativo al problema problems[i]. Gli elementi della matrice C sono disposti uno per riga. Esempio qui

La funzione prod   ritorna una lista di interi test (della stessa lunghezza di problems e results), dove test[i] vale 1 (se il file problems[i] esiste) oppure 0 (se il file problems[i] non esiste)

Eseguire i prodotti tra matrici utilizzando la libreria Numpy.

Inserire nella cartella nomecognome di Dropbox solo il file multimat.py che contiene la funzione assegnata e eventuali altre funzioni necessarie. Altri file verranno cancellati. Assicurarsi della correttezza dei nomi del file e della funzione da consegnare

 

Risultati sesta 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)

Mark Lutz - Learning Python, 4th ed - O'reilly (disponibile versione digitale in inglese)

 

SLIDE (2019)

 



COME FARE PER L'ATTIVITA' DI LABORATORIO E PREPARARE LE CONSEGNE?

Parte del corso prevede la conoscenza e l'utilizzo del sistema operativo Linux. E' possibile fare attivita' di laboratorio e preparare le consegne in differenti modi:

1) Chi possiede un calcolatore con il sistema operativo Linux puo' tranquillamente utilizzare tale strumento, eventualmente installando il software Dropbox per le consegne (vedi dopo) e i pacchetti Numpy e Scipy.

2) Per chi possiede un computer con altro sistema operativo e' possibile creare, con l'aiuto di una persona esperta, una "seconda partizione" in cui installare il sistema operativo Linux. Tale soluzione permette di scegliere quale sistema operativo eseguire al momento dell'accensione della macchina. Si segnala che l'operazione di creazione di una seconda partizione all'interno del proprio computer e' particolarmente delicata e con un elevato rischio di perdere le informazioni presenti in esso.

3) Per chi possiede un computer con sistema operativo Windows o Mac OS, un strumento alternativo a quello descritto nel punto 2, e' rappresentato da un ambiente software che replica l'ambiente Linux disponibile nel  laboratorio didattico. Questa soluzione non altera la configurazione del proprio computer e non presenta i rischi descritti nel punto 2. In tale ambiente sono gia' presenti tutti gli strumenti software necessari al corso (compilatori e servizio Dropbox per le consegne). L'ambiente software da installare e' chiamata "macchina  virtuale", ed e' composta da due elementi:

  • il supervisore, anche detto Virtual Machine player  (in pratica una interfaccia software tra il proprio sistema operativo Windows o McOs e il sistema operativo Linux)

  • il sistema operativo Linux da installare nel supervisore

 

 passi per installare il Supervisore (sistema operativo Windows 64 bit. Es.: Windows 8 oppure 10)

·        A) Scaricare gratuitamente il supervisore ( VMware Workstation Player ) da http://www.vmware.com/go/downloadplayer/, selezionando il sistema operativo WIndows 64 bit

·         B) eseguire il  VMware Player’s Installer (doppio click sul file scaricato)

·         C) proseguire con l'installazione accetando le condizioni d'uso e proseguendo sempre con   Next.



 passi per installare il sistema Linux sul Supervisore (sistema operativo Windows 64 bit. Es.: Windows 8 oppure 10)

·        A) 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

·         B) Decomprimere il file (ad esempio sul Desktop). Risultera' disponibile una cartella di nome Lab Prog Machine 2020

·        C) Eseguire il supervisore  VMware Player (ad es. doppio click sul collegamento presente su desktop).  Se richiesti, accettare i termini di utilizzo e selezionare l'uso privato del prodotto.

·         D) Nella finestra di VMware Player selezionare Open a Virtual Machine, e accedere alla cartella Lab Prog Machine 2020  ottenuta precedentemente

·         E) Selzionare il file Lab Prog Machine 2020 e poi Apri.

·         F) Nella finestra principale del supervisore selezionare Play Virtual Machine (Ignorare eventuali richieste di installazione di altro software). Aspettare qualche istante (circa 30 sec) e immettere user come password dell'utente mostrato

 Dopo la prima installazione, le volte successive sara' sufficiente eseguire solo il passo F).

 

 

 

 passi per installare il Supervisore (sistema operativo McOS)

·        A) Scaricare gratuitamente il supervisore ( VirtualBox ) da https://www.virtualbox.org/wiki/Downloads selezionando il sistema operativo OS X host

·         B) eseguire il il programma di installazione (doppio click sul file scaricato)

·         C) proseguire con l'installazione accetando le condizioni d'uso e proseguendo sempre con   Next.

 



 passi per installare il sistema Linux sul Supervisore (sistema operativoMacOS)

·        A) 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

·         B) Decomprimere il file (ad esempio sul Desktop). Risultera' disponibile una cartella di nome Lab Prog Machine 2020

·        C) Eseguire il supervisore  VM VirtualBox (ad es. doppio click sul collegamento presente su desktop).  Se richiesti, accettare i termini di utilizzo e selezionare l'uso privato del prodotto.

·         D) Nella finestra di del Supervisore selezionare Nuova. Nella finestra seguente inserire come Nome "Lab Prog Machine 2020", Tipo del S.O. "Linux" e versione "Ubuntu 64bit". Selezionare "Non aggiungere disco fisso virtuale" (importante). Quindi selezionare: Crea

·         E) Nella finestra seguente, selezionare tra le impostazioni della macchina virtuale ottenuta, la sezione Archiviazione. Selezionare il'icona "aggiungi disco fisso" al controller SATA. Nella finestra ottenuta selezionare l'icona aggiungi e selezionare il file Lab Prog Machine 2020 nella cartella Lab Prog Machine 2020 ottenuta al passo B.

·         F) Nella finestra principale del supervisore selezionare Avvia. Aspettare qualche istante (circa 30 sec) e immettere user come password dell'utente mostrato

 Dopo la prima installazione, le volte successive sara' sufficiente eseguire solo il passo F).

 

 

 

 

4) Chi possiede un calcolatore troppo vecchio, per cui le soluzioni precedenti non funzionano puo' utilizzare numerose piattaforme online che realizzano un sistema Linux virtuale in cui sviluppare i programmi. Tali ambienti permettono poi differenti modi per salvare il proprio lavoro, o nella stessa piattaforma oppure su sistemi cloud di larga diffusione (ad es. google drive). A solo titolo di esempio si riportano:

·         Codinground all'indirizzo  https://www.tutorialspoint.com/online_c_ide.php

·         Repl all'indirizzo https://repl.it/

·         Codeboard all'indirizzo https://codeboard.io/

Dopo lo sviluppo dell'elaborato e' necessario poi copiarlo in Dropbox per la consegna (vedi dopo).

 

PER LE CONSEGNE ( IMPORTANTE ! )

In tutti i casi le consegne avverranno  attraverso il servizio  cloud Dropbox. secondo le istruzioni riportate nella descrizione delle scadenze. Fare attenzione ai nomi del file !!