Caratteristiche fondamentali del software scientifico:
Efficienza, Accuratezza, Affidabilità, Modularità, API standard, Portabilità, Facilità d’uso, Facilità di manutenzione
Problem Solving:
Formulazione del problema P, Descrizione di P mediante un modello matematico:M(P) approssimazione di M(P) mediante metodi numerici Mh(P), Sviluppo dell’algoritmo risolutivo Mh(P),Implementazione in uno specifico ambiente di calcolo
Da che cosa dipende il tempo di esecuzione di un software?
Un’ implementazione efficiente dipende oltre che dal numero di operazioni floating-point anche dagli accessi alla MEMORIA
T1 = Nmem x tmem + N flop x t flop mem=tempo di accesso alla memoria, flop=tempo operazioni floating point
Nmem & Nflop: dipende dall’algoritmo; tmem & tflop: dipende dalla tecnologia.
Continua a leggere “Introduzione al Calcolo Scientifico”
Tags: calcolo scientifico
L’ heapsort è un algoritmo di ordinamento iterativo ed in-place proposto da Williams nel 1964, che si basa su strutture dati ausiliarie.
L’ heapsort per eseguire l’ordinamento, utilizza una struttura chiamata heap (mucchio); un heap è rappresentabile con un albero binario in cui tutti i nodi seguono una data proprietà, detta priorità. Esso è completo almeno fino al penultimo livello dell’albero e ad ogni nodo corrisponde uno ed un solo elemento.
In uno heap decrescente (utilizzato per ordinare ad esempio un array in senso crescente) ogni nodo padre contiene un valore maggiore o uguale a quello dei suoi due figli diretti, di conseguenza risulterà maggiore anche di tutti i nodi che si trovano nel sottoalbero di cui esso è la radice; questo non implica affatto che nodi a profondità maggiore contengano valori minori di quelli a profondità minore.
Quindi in ogni istante, in un heap decrescente, la radice contiene il valore maggiore.
Questa struttura è molto usata, in particolare, per l’ordinamento di array.
In questo caso si considera come radice l’elemento iniziale di indice 1; inoltre i figli di un nodo con indice j, avranno indice rispettivamente 2j, quello sinistro, 2j+1 quello destro.
Continua a leggere “Implementazione C di Heap Sort”
Tags: sort
Quicksort è un ottimo algoritmo di ordinamento ricorsivo in place che, come merge sort, si basa sul paradigma divide et impera. La base del suo funzionamento è l’utilizzo ricorsivo della procedura partition: preso un elemento da una struttura dati (es. array) si pongono gli elementi minori a sinistra rispetto a questo e gli elementi maggiori a destra.
Il Quicksort, termine che tradotto letteralmente in italiano indica ordinamento rapido, è l’algoritmo di ordinamento che ha, in generale, prestazioni migliori tra quelli basati su confronto; è stato sottoposto a un’analisi matematica approfondita ed estremamente precisa, tanto che le sue prestazioni sono state comprese a fondo e il suo comportamento è stato descritto in modo molto accurato.
Continua a leggere “Implementazione C del Quicksort”
Tags: ordinamento, sort
Questo articolo tratta la gestione delle stringhe e, in generale, dei vettori multidimensionali nel linguaggio C.
Allocazione di memoria del vettore
Sappiamo che nel linguaggio c dichiariamo un vettore con l’istruzione
int vett[n];
in questo modo creiamo un vettore chiamato vett di n elementi:
vett[0] , vett[1] , … , vett[n-1]
Supponiamo, con n=5, di riempire il vettore in questo modo:
Risulterà che:
0
1
2
3
4
| vett[0] = 10 = *vett
vett[1] = 11 = *vett+1
vett[2] = 12 = *vett+2
vett[3] = 13 = *vett+3
vett[4] = 14 = *vett+4 |
Continua a leggere “Array Multidimensionali in C”
Tags: puntatori, stringhe, vettori
Input /output e gestione dei file
Iniziamo la lezione dicendo subito che per INPUT/OUTPUT si intende l’ insieme delle operazioni di
ingresso ed uscita, ossia lo scambio di informazioni tra il programma e le unita’ periferiche del
calcolatore.
Nel linguaggio C l’ I/O e’ interamente implementato mediante funzioni della libreria standard.
Il linguaggio C vede i file come un flusso (stream) sequenziale di byte. Uno stream dal punto di vista
tecnico e’ una implementazione software in grado di gestire le informazioni relative all’interazione a
basso livello con la periferica associata, in modo che il programma possa trascurare di che periferica si
tratti.
Ogni file termina con un marcatore di fine file detto
EOF( end-of-file) definito in <stdio.h> come una costante simbolica uguale a -1.
Continua a leggere “Gestione dei File nel linguaggio C”
Tags: c, file