Strumenti Utente

Strumenti Sito


informatica:sol:laboratorio17:esercitazionib:esercitazione1

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Prossima revisione
Revisione precedente
informatica:sol:laboratorio17:esercitazionib:esercitazione1 [20/02/2017 alle 05:30 (8 anni fa)] – creata Massimo Torquatiinformatica:sol:laboratorio17:esercitazionib:esercitazione1 [22/02/2017 alle 11:16 (8 anni fa)] (versione attuale) – [Esercizio 3] Massimo Torquati
Linea 5: Linea 5:
  
 ===== Illustrazione uso gdb ===== ===== Illustrazione uso gdb =====
-Vediamo come si usa il debugger [[http://www.gnu.org/software/gdb| gdb]] usando il codice ''usodebug.c'' contenuto in {{:informatica:sol:laboratorio16:esercitazionia:debug.tgz| questo}} tarball. I comandi principali di ''gdb'' da ricordare sono: \\+Vediamo come si usa il debugger [[http://www.gnu.org/software/gdb| gdb]] usando il codice ''usodebug.c'' contenuto in {{:informatica:sol:laboratorio17:esercitazionib:debug.tgz| questo}} tarball. I comandi principali di ''gdb'' da ricordare sono: \\
 - run ( r ), break <file:linea> ( b ), step ( s ), next ( n ), print <variabile> ( p ), set args <argomenti>, backtrace ( bt ), finish, continue ( c ), quit ( q ).  - run ( r ), break <file:linea> ( b ), step ( s ), next ( n ), print <variabile> ( p ), set args <argomenti>, backtrace ( bt ), finish, continue ( c ), quit ( q ). 
  
Linea 28: Linea 28:
 <code> <code>
 int main(int argc, char *argv[], char *envp[]); int main(int argc, char *argv[], char *envp[]);
 +</code>
 +
 +===== Esercizio 3 =====
 +
 +Scrivere una funzione 'mystrcat' con la seguente segnatura:
 +<code c>
 +const char *mystrcat(char* buffer, int buffer_size, char *prima, ...);
 +</code>
 +La funzione prende un buffer, la lunghezza del buffer ed almeno uno stringa. Le stringhe possono essere un numero variabile (>1). La funzione concatena tutte le stringhe nel 'buffer' e ritorna il buffer stesso.
 +ATTENZIONE alla gestione della memoria!
 +
 +Utilizzare il seguente main:
 +<code c>
 +#include <stdarg.h>
 +#include <stdio.h>
 +#include <string.h>
 +#include <stdlib.h>
 +
 +#define RIALLOCA(buf, newsize) \
 +    <inserire il codice per riallocare buf> 
 +     
 +char* mystrcat(char *buf, size_t sz, char *first, ...) {
 +  <implementare il codice>
 +}  
 +     
 +int main() {
 +  char *buffer=NULL;
 +  RIALLOCA(buffer, 16);  // macro che effettua l'allocazione
 +  buffer[0]='\0';
 +  buffer = mystrcat(buffer, 16, "prima stringa", "seconda", "terza molto molto molto lunga", "quarta", "quinta lunga", "ultima!",NULL);
 +  printf("%s\n", buffer);     
 +  free(buffer);
 +  return 0;
 +}
 +</code>
 +NOTA: Che cosa puo' succedere al programma se invece di 
 +<code c>
 + printf("%s\n", buffer);
 +</code> 
 +si fosse scritto:
 +<code> 
 + printf("%s\n", mystrcat(buffer, 16, "prima stringa", "seconda", "terza molto molto molto lunga", "quarta", "quinta lunga", "ultima!",NULL));
 +</code>
 +
 +===== Per chi ha bisogno di prendere dimestichezza con il C (homeworks) =====
 +
 +===== Esercizio 4 =====
 +
 +Scrivere un programma che, dato un array di N elementi interi, costruisca un albero binario di ricerca (cioè per ogni nodo dell'albero, l'elemento del nodo è maggiore di tutti gli elementi del sottoalbero di sinistra e minore o uguale di tutti gli elementi del sottoalbero di destra). 
 +Implementare le seguenti funzioni:
 +<code c>
 +struct node_t *buildTree(long elem, struct node_t *t); // costruisce l'albero e restituisce il nodo radice
 +long getMin(struct node_t *root);       // restituisce il valore minimo
 +long getMax(struct node_t *root);       // restituisce il valore massimo
 +void printInOrder(struct node_t *root); // stampa gli elementi in modo ordinato
 +void deleteTree(struct node_t *root);   // cancella tutti i nodi dell'albero
 +</code>
 +
 +Definire il tipo 'struct node_t' opportunamente. Implementare tutte le funzioni usando la ricorsione.
 +
 +===== Esercizio 5 =====
 +
 +Non utilizzando la funzioni di libreria 'getopt' (man 3 getopt), scrivere un programma che effettua il parsing della linea di comando e che riconosce le seguenti opzioni: 
 +<code c>
 +-n <numero> -s <stringa> -m <altro-numero> -h. 
 +</code>
 +Il programma dovrà stampare le opzioni riconosciute con il relativo argomento. L'opzione -h non ha argomento e corrisponde al messaggio di help (program usage). Se e' presente l'opzione -h dovra' essere stampato solo il messaggio di usage cioè:
 +<code c>
 +nome-programma -n <numero> -s <stringa> -m <numero> -h
 +</code>
 +Se ci sono opzioni non riconosciute queste dovranno essere stampate a video
 +con il messaggio "opzione X non riconosciuta". Per convertire le stringhe in interi usare la funzione
 +di libreria //atoi// (vedere man 3 atoi) o meglio ancora la funzione //strtol// (vedere man strtol).  
 +Testare il programma con i seguenti casi (supponiamo che l'eseguibile si chiami cmdlineparsing):
 +<code c>
 +cmdlineparsing -n 10 -m 11 -s 'ciao mondo' 
 +cmdlineparsing -n 10 -h     // deve stampare il messaggio di usage 
 +cmdlineparsing -n 10 -k 12  // k e' una opzione non riconosciuta
 +cmdlineparsing ----n 10 -s-s 'ciao mondo'  // deve stampare -n: 10 e -s: -s
 +cmdlineparsing -n10 -m11 -s'ciao mondo'  // deve stampare gli argomenti come nel primo caso
 +cmdlineparsing -n -m 11   // deve stampare un messaggio di errore per -n
 </code> </code>
informatica/sol/laboratorio17/esercitazionib/esercitazione1.1487568648.txt.gz · Ultima modifica: 20/02/2017 alle 05:30 (8 anni fa) da Massimo Torquati

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki