LABORATORIO DI ALGORITMI E STRUTTURE DATI A-L - A.A: 2016/2017 Ingegneria e scienze informatiche - Cesena Docente: Greta Sasso - Altervista

Pagina creata da Giorgio Bruni
 
CONTINUA A LEGGERE
LABORATORIO DI ALGORITMI
E STRUTTURE DATI A-L

Ingegneria e scienze informatiche – Cesena
A.A: 2016/2017
Docente: Greta Sasso
Presentazione

 Docente:
     Greta Sasso
     greta.sasso2@unibo.it
 Orario e luogo delle lezioni:
     Laboratorio Vela, Giovedì dalle 10 alle 13
 Ricevimento :
     Prima della lezione in laboratorio
 Sito del corso: http://labasd1617.altervista.org/
Il corso

 Obiettivi:
     Sviluppare le capacità di base per lo sviluppo di
      algoritmi efficienti per la risoluzione di problemi su
      strutture dati complesse
 Prerequisiti:
     Conoscenza del linguaggio ANSI C
Descrizione progetto

 È prevista una prova di laboratorio. Per poter accedere alla
  prova scritta e necessario aver superato la prova di
  laboratorio.
 La prova di laboratorio consiste nello sviluppo di un progetto,
  da realizzare in linguaggio ANSI C, con relativa relazione
  scritta.
 Il progetto deve essere consegnato obbligatoriamente entro
  una settimana prima della prova scritta.
 Una volta consegnato e corretto, il progetto resta valido per
  tutte le prove scritte seguenti (per i successivi due anni solari).
Esempio di legenda per lo
 pseudocodice

   Strutture di controllo iterative (ciclo da 1 a n, incluso):
for espressione do       while espr do              if espr then
...//corpo               ...//corpo                 ...//corpo
end for                  end while                  else
                                                    ...//corpo
                                                    end if
Tempo di calcolo in secondi
Numero di istruzioni eseguite
Ripasso
Passaggio dei parametri - Indirizzo

 Nel passaggio di parametri per riferimento/ indirizzo alla
  funzione viene passato l’indirizzo e non il valore
  dell’argomento.
 Fornisce la possibilità di avere più valori di ritorno modificando
  direttamente delle variabili esterne alla funzione ( passate non
  per copia ma per indirizzo )
 Per poter passare un indirizzo in fase di chiamata della
  funzione occorrerà utilizzare dei parametri di tipo puntatore
 void sum(int a , int b, int*ris){        //chiamata
     *ris= a+b;                           int a=4;
 }                                        int ris;
                                          sum(a,3, &ris);
                                          printf(“%d\n“, ris);
                                          //valore stampato: 7
Ripasso: Gli Array

 Gli array/ vettori sono strutture dati in grado di memorizzare lo stesso
  tipo di dati in modo sequenziale, accessibile con un unico nome
 Statici: la dimensione è conosciuta sin dall’inizio e non può essere
  modificata
 Dinamici: Si può creare l’array in qualsiasi momento allocando
  memoria nell’heap, e si ha la possibilità di modificare la dimensione.
     Malloc: funzione che alloca un quantitativo di byte (parametro in input) e
      restituisce l’indirizzo dell’area allocata ( della prima cella del vettore )
         Realloc : funzione che realloca un’area di memoria con la possibilità che venga
          cambiato completamente l’indirizzo di memoria precedente
         Entrambe le funzioni possono fallire e in questo caso restituiscono NULL ( Controllo!)

     Free : funzione utilizzata per deallocare un’area di memoria dato un indirizzo
Ripasso: I File

 I file sono strutture sequenziali
 Ogni riga termina con un carattere di newline ‘\n’. Al termine del
  file si ottiene EOF
 Per poter accedere ad un file occorre avere un collegamento ad
  un file, quindi utilizzeremo i puntatori a FILE
 Per aprire un file si utilizza la funzione fopen che vuole in ingresso il
  nome del file ( stringa) e una stringa rappresentante la modalità di
  apertura.
 Per chiudere un file si utilizza la funzione fclose
I file: lettura

 Modalità di apertura, read "r"
 Nel caso in cui il file non esista o per altri problemi di I/O la funzione
  fopen ritornerà il valore NULL ( Ricordarsi di controllare l’eventualità)
 La lettura di un file corrisponde all’intenzione di ottenere dei dati in
  input da una sorgente esterna. Con la funzione scanf siamo abituati a
  ottenere dei dati in input da tastiera e a memorizzarlo nel nostro
  programma. Per i file è la stessa cosa: si utilizza la funzione fscanf , fgets,
  …                      //apertura file in lettura
                        FILE* ptr;
    Esempio.txt         int a;
    1 2 5 8 3           Ptr = fopen("esempio.txt" , "r");
    4 12 456 8          if ( ptr==NULL ) return (-1);
                        fscanf (ptr , “%d“, &a);
                        printf(“%d\n“, a);
                        //stampa del primo numero contenuto nel file: 1
Controllare la fine del file

• La funzione fscanf ritorna il valore EOF nel caso in cui si è
  tentato di leggere qualcosa da un file, ma il file è stato già letto
  tutto
• Int feof(FILE* f) : questa funzione accetta come parametro in
  input il puntatore al file e come valore di ritorno 0 se non
  raggiunto L’EOF, altrimenti un numero diverso da 0
I file: scrittura

 Modalità di apertura, write " w" .
 Se il file non esiste, questo sarà creato in automatico. Per problemi di I/O
  la funzione fopen ritornerà il valore NULL ( Ricordarsi di controllare
  l’eventualità).
 La scrittura di un file corrisponde all’intenzione di ottenere dei dati in
  output l mio programma verso il file. Con la funzione printf siamo abituati
  stampare a video (output) dei dati . Per i file è la stessa cosa: si utilizza la
  funzione fprintf, fputs,…
 //apertura file in scrittura
 FILE* ptr;     int a=5;                           nuovo.txt
 ptr = fopen("nuovo.txt" , "r");                   Ciao a tutti 5
 if( ptr == NULL) return (-1);
 fprintf(ptr,“ciao a tutti %d \n“, &a);
IDE – Visual Studio

 Visual Studio è un ambiente di sviluppo integrato (Integrated
  development environment o IDE) sviluppato da Microsoft
 Supporta diversi tipi di linguaggio: C, C++, C#, F#, Visual Basic
  .Net, Html e JavaScript, … e che permette la realizzazione di
  applicazioni, siti web, applicazioni web e servizi web
 Esistono le versioni a pagamento ma anche le versioni gratuite
  ( Visual Studio Express) che presentano le funzionalità di base
 Potenti strumenti a disposizione per il Debug dei programmi
 Alternative : Code::Blocks, Devc++, …
Visual Studio – Nuovo progetto

 File -> Nuovo Progetto ->
  Visual c++ -> Progetto
  Win32 Console
  Application
 Specificare il nome del
  progetto
 Confermare
o Next
o Selezionare il tipo di
  applicazione «applicazione
  console»
o Selezionare Progetto Vuoto
o Fine

o Una volta fatto questo il progetto sarà creato vuoto.
o Create quindi un file main.c all’interno della cartella File di Origine
o Cliccate col tasto destro -> aggiungi -> nuovo elemento
o Esecuzione di un programma:
Esecuzione di un programma:
Disabilitare Warnings di visual studio
A volte potrebbe capitare con l’utilizzo delle funzioni scanf, printf, fscanf, … di ottenere un errore del tipo
” This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use
_CRT_SECURE_NO_WARNINGS. See online help for details”

Per eliminare questi warnings andare nelle proprietà del progetto

Inserire la stringa
_CRT_SECURE_NO_WARNINGS
E confermare le modifiche

NB: Per modificare questa voce occorre aver
Creato prima almeno un file .c / .cpp
1) Leggere da un file di testo 10 numeri interi, memorizzarli
   all’interno di un vettore e calcolare la somma degli elementi.
       - Solo in questo step si dia per scontato che il file contenga almeno 10
         numeri interi
       - Il file lo potete creare e inserire nella cartella del vostro progetto. Ad
         esempio :       ..Studio 2015\Projects\Esercizio1\Esercizio1 oppure da
         visual studio nella cartella resource ( risorse) del progetto
    2° step: Preso in input da tastiera un numero positivo leggere da
     un file quel quantitativo di numeri memorizzandoli all’interno di un
     vettore, e calcolare il valore medio.

  [ Esercizi Proposti – 1.1 ]
L’esercizio sembra semplice, ma occorre considerare alcuni casi
che si potrebbero verificare portando a situazioni impreviste, ad
errori o a interruzione del programma:
    Cosa succede se l’utente inserisce un numero negativo come
     dimensione?
    Cosa succede se l’utente inserisce un carattere e non un intero?
    Cosa succede se nel file non sono presenti abbastanza numeri?
    Cosa succede se il file non esiste o se non è più disponibile
     memoria nel programma?

 Analisi del problema
Testing dei programmi

 Obiettivo di eliminare eventuali
  malfunzionamenti tramite l’esecuzione del
  codice stesso
 Progettazione di test: selezionare dei casi
  significativi di input e verificare porzioni di
  codice critiche e output finali
 Debugging : per localizzare e rimuovere i
  problemi che causano i malfunzionamenti
    Debugging con visual studio
    Stampa di messaggi a video per monitorare
     l’esecuzione
Debug
• Per aggiungere un punto di interruzione ( breakpoint) cliccare in
  corrispondenza della linea di codice di cui si vuole fermare
  l’esecuzione, comparirà un pallino rosso.

• Per avviare il debug basta cliccare sul pulsante di avvio del
  programma visto in precedenza.
Utility – Numeri Pseudo Casuali

//srand( 550 ); // inizializzazione
srand( time( NULL )); // inizializza con orologio(casuale)

printf("%d\n", rand() % (max+1));
double x=((double)rand()/(double)RAND_MAX); // compreso in
[0.0,1.0]
int a = rand()%100; // compreso in [0,100]
int b = rand()%100+50; // compreso in [50,150]
Utility – Stringa casuale

/*Generazione di una parola di una dimensione data. I
caratteri generati sono da a-z ( carattere minuscoli) */
char* randomWord( int dim) {
   int i;
   char* string = (char*)malloc((1 + dim) * sizeof(char));
   if (string == NULL) return "random";
   for (i = 0; i < dim; i++)
       string[i] = rand() % 25 + 97; // ASCII code
   string[i] = '\0';
   return string;
}
Prima di iniziare

Con il crescere della complessità degli argomenti e degli
esercizi, gli algoritmi risolutivi non saranno immediati.
  1) Analisi del problema: input  output.
     o È utile individuare esempi di input significativi per il problema
     o Di grande aiuto è la decisione dei test già in questa fase
  2) Progettazione dell’algoritmo
  3) Implementazione
  4) Testing e verifica
2) 3° step: Data la sequenza di numeri letta dal file, calcolare in
   modo iterativo Il valore massimo, e il valore minimo, tramite
   apposite funzioni.

Test significativi
    Cosa succede se la sequenza è formata dal medesimo numero?
    Cosa succede se la sequenza è formata da soli numeri negativi?

    Calcolare il tempo di esecuzione e il numero di istruzioni eseguite per i cicli
    utilizzati nella ricerca del massimo e nella somma.
     Come varia l’algoritmo se l’insieme degli elementi è ordinato in ordine
      crescente? Quanto costa?

    [ Esercizi Proposti – 1.2 ]
2) 5° step: Aggiungere la ricerca di un elemento sviluppando
   una funzione che ritorni 1 o 0 nel caso in cui l’elemento sia
   presente o meno all’interno del vettore.

  [ Esercizi Proposti – 1.3 ]
 Dati a e n numeri interi calcolare an usando un
  algoritmo iterativo

[ Esercizi Proposti – 1.4 ]
Domande e discussione

 Domande?
Puoi anche leggere