Laboratorio di Programmazione 2
C.L. Matematica
PROGRAMMA
(provvisorio, riferito all'a.a.20/21. ) |
|
1)
Strutture dati dinamiche e algoritmi ricorsivi.
3) Il
linguaggio Python e i pacchetti Numpy, Scipy e Matplotlib
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
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.
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
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
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
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)
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:
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.
· 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.
· 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 !! |
|
|