<h1>Programmazione 1 <small> (P-Z) a.a. 2007-08</small></h1> <br> <big>Docente: R. Silvestri<br> Esercitatore: A. Carosi<br> Tutor: J. Stefa</big> <br> <br> <center><b>Avviso</b></center> <div align="justify"> <blockquote> Vista l'esigenza nata da alcuni di voi di discutere sugli esercizi proposti in laboratorio, riporto qui quanto scritto nella sezione "FAQ" del sito Twiki: il mio orario di ricevimento è su prenotazione (all'indirizzo email <tt>carosi@di.uniroma1.it</tt>) e si effettua in stanza 322 (di fronte all'aula seminari) al terzo piano del Dipartimento di Informatica in via Salaria 113. </blockquote> </div> <br> <h2>Esercitazioni del 30 ottobre 2007</h2> <b>Esercizio 1</b> <div align="justify"> <blockquote> Scrivere un programma che sfrutta una funzione ricorsiva per:<br> 1) ribaltare una stringa di caratteri (fornire una funzione di stampa della stringa ottenuta).<br> 2) trovare il numero di occorrenze di un carattere in una stringa.<br> 3) passare da una rappresentazione binaria di un numero, ad una rappresentazione decimale. </blockquote> </div> <br> <b>Esercizio 2</b> <div align="justify"> <blockquote> Scrivere un programma che data una matrice <tt>50</tt>x<tt>50</tt>, traccia il percorso di un cursore mobile in base agli spostamenti indicati da tastiera. Nel programma si può supporre che il cursore parta dalla posizione <tt>[0,0]</tt>, e che possa muoversi eseguendo di volta in volta un singolo passo nelle sole direzioni <tt>nord</tt>, <tt>sud</tt>, <tt>est</tt> ed <tt>ovest</tt>.<br> L'utente deve inserire di volta in volta una scelta di movimento valida o di stampa. Le possibili scelte sono: <tt>4</tt> indica lo spostamento ad <tt>est</tt>, <tt>2</tt> lo spostamento a <tt>sud</tt>, <tt>6</tt> lo spostamento ad <tt>ovest</tt>, <tt>8</tt> lo spostamento a <tt>nord</tt> e <tt>5</tt> la stampa su schermo della matrice (che indica con un <tt>*</tt> la posizione attuale del cursore, ed uno <tt>0</tt> per le posizioni restanti). Il cursore, nel momento in cui si trova ad uscire dalla matrice, dovrà necessariamente rientrare dal lato opposto a quello di uscita (ad esempio se si trova nella posizione <tt>[3,49]</tt>, e viene premuto il tasto <tt>2</tt>, la prossima posizione sarà la <tt>[3,0]</tt>). <br><strong>Nota:</strong> fornire una versione del programma che sfrutti una funzione ricorsiva. </blockquote> </div> <br> <b>Esercizio 3</b> <div align="justify"> <blockquote> Scrivere un programma che preso in input un testo (ovvero una stringa di caratteri che comprende i <tt>newline</tt>), lo memorizza in un vettore di stringhe. Assumendo che ogni liena sia al massimo lunga <tt>200</tt> caratteri e che il testo non sia più lungo di <tt>1000</tt> linee, il programma deve stampare il testo con le linee in ordine inverso.<br> Ad esempio: <br><br> <TABLE width="100%" cellspacing="0" border="0" cellpadding="0" align="left"> <tr> <TD> <strong>Input:</strong> </TD> <TD> <strong>Output:</strong> </TD> </tr> <tr> <TD> <tt> Io programmo in C<br> o programmo in CI<br> programmo in CIo<br> programmo in CIo <br> ogrammo in CIo pr<br> grammo in CIo pro<br> rammo in CIo prog<br> ammo in CIo progr<br> mmo in CIo progra<br> mo in CIo program<br> o in CIo programm<br> in CIo programmo<br> in CIo programmo <br> n CIo programmo i<br> CIo programmo in<br> CIo programmo in <br> Io programmo in C </tt> </TD> <td> <tt> Io programmo in C<br> CIo programmo in <br> CIo programmo in<br> n CIo programmo i<br> in CIo programmo <br> in CIo programmo<br> o in CIo programm<br> mo in CIo program<br> mmo in CIo progra<br> ammo in CIo progr<br> rammo in CIo prog<br> grammo in CIo pro<br> ogrammo in CIo pr<br> programmo in CIo <br> programmo in CIo<br> o programmo in CI<br> Io programmo in C </tt> </td> </tr> </TABLE> <br> <br> <strong>Nota:</strong> si consiglia di memorizzare il simbolo di <tt>newline</tt> sostituendolo con il carattere vuoto <tt>'\0'</tt>, e di utilizzare un file di testo preso in input dal programma con il comando Linux di redirezione (<tt><</tt>). </blockquote> </div> <br> <br> <br> <br> <br> <br> <br> <br> <big><b>Soluzioni</b></big> <br> <br> <br> <br> <b>Soluzione Esercizio 1</b> <div align="justify"> <blockquote> <tt><pre> void invert(char str[], int low, int up) { // i valori iniziali di low e up, sono rispettivamente // il primo indice e l'ultimo indice del vettore str (es. // per str = "Io programmo in C", low = 0 e up = 16). char tmp; if (low >= up) return; tmp = str[low]; str[low] = str[up]; str[up] = tmp; invert(str, low + 1, up - 1); } int occurr(char str[], char x, int index) { // il valore di index, alla prima chiamata della funzione // deve corrispondere alla lunghezza del vettore str - 1 // (ultimo indice del vettore). if (index < 0) return 0; if (str[index] == x) return 1 + occurr(str, x, index - 1); return occurr(str, x, index - 1); } int to_dec(short int str[], int index, int pos) { // il valore di index e pos, alla prima chiamata della funzione // deve corrispondere rispettivamente al primo e ultimo indice // del vettore (es. per str = "10100", index = 0 e pos = 4). if (pos < 0) return 0; return str[index] * pow(2.0, (double)pos) + to_dec(str, index + 1, pos - 1); } </pre></tt> </blockquote> <strong></strong> </div> <br> <b>Soluzione Esercizio 2</b> <div align="justify"> <blockquote> <tt><pre> #include <stdio.h> #define MATRIX 50 void printTopo(char[][MATRIX]); int main(void) { char command; int r, c; char topo[MATRIX][MATRIX]; for (r = 0; r < MATRIX; r++) { for (c = 0; c < MATRIX; c++) { topo[r][c] = '0'; } } int pos_c = 0; int pos_r = 0; topo[0][0] = '*'; while ((command = getchar()) != '0') { topo[pos_r][pos_c] = '0'; if (command == '5') { topo[pos_r][pos_c] = '*'; printTopo(topo); } else if (command == '4') { if (--pos_c < 0) pos_c = MATRIX - 1; } else if (command == '6') { if (++pos_c >= MATRIX) pos_c = 0; } else if (command == '8') { if (--pos_r < 0) pos_r = MATRIX - 1; } else if (command == '2') { if (++pos_r >= MATRIX) pos_r = 0; } topo[pos_r][pos_c] = '*'; } } void printTopo(char t[][MATRIX]) { int r, c; for (r = 0; r < MATRIX; r++) { for (c = 0; c < MATRIX; c++) { printf ("%c", t[r][c]); } printf ("\n"); } printf ("\n"); } </pre></tt> </blockquote> </div> <br> <b>Soluzione Esercizio 3</b> <div align="justify"> <blockquote> <tt><pre> #include <stdio.h> #include <stdlib.h> #define MAX_LINES 10000 #define MAX_LEN 200 void print(char [][MAX_LEN]); int main(void) { char text[MAX_LINES][MAX_LEN] = {{'\0', '\0'}}, c; int line = 0, i = 0; while ((c = getchar()) != EOF) { text[line][i] = '\0'; if (c == '\n') { line++; i = 0; } else { text[line][i] = c; i++; } } print (text); return 0; } void print (char txt[][MAX_LEN]) { int l, i; for (l = MAX_LINES - 1; l >= 0; l--) { if (txt[l][0] == '\0') continue; for (i = 0; i < MAX_LEN; i++) { if (txt[l][i] != '\0') printf ("%c", txt[l][i]); else { printf ("\n"); break; } } } } </pre></tt> </blockquote> </div> <br> -- Users.RiccardoSilvestri - 31 Oct 2007
This topic: Programmazione1
>
WebHome
>
Prog1PZ
>
DiarioPZ0708
>
Eser301007
Topic revision: r2 - 2007-11-04 - RiccardoSilvestri
Copyright © 2008-2025 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki?
Send feedback