Programmazione 1    (P-Z) a.a. 2007-08


Docente: R. Silvestri
Esercitatore: A. Carosi
Tutor: J. Stefa


Avviso
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 carosi@di.uniroma1.it) e si effettua in stanza 322 (di fronte all'aula seminari) al terzo piano del Dipartimento di Informatica in via Salaria 113.


Esercitazioni del 30 ottobre 2007

Esercizio 1

Scrivere un programma che sfrutta una funzione ricorsiva per:
1) ribaltare una stringa di caratteri (fornire una funzione di stampa della stringa ottenuta).
2) trovare il numero di occorrenze di un carattere in una stringa.
3) passare da una rappresentazione binaria di un numero, ad una rappresentazione decimale.

Esercizio 2

Scrivere un programma che data una matrice 50x50, 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 [0,0], e che possa muoversi eseguendo di volta in volta un singolo passo nelle sole direzioni nord, sud, est ed ovest.
L'utente deve inserire di volta in volta una scelta di movimento valida o di stampa. Le possibili scelte sono: 4 indica lo spostamento ad est, 2 lo spostamento a sud, 6 lo spostamento ad ovest, 8 lo spostamento a nord e 5 la stampa su schermo della matrice (che indica con un * la posizione attuale del cursore, ed uno 0 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 [3,49], e viene premuto il tasto 2, la prossima posizione sarà la [3,0]).
Nota: fornire una versione del programma che sfrutti una funzione ricorsiva.


Esercizio 3

Scrivere un programma che preso in input un testo (ovvero una stringa di caratteri che comprende i newline), lo memorizza in un vettore di stringhe. Assumendo che ogni liena sia al massimo lunga 200 caratteri e che il testo non sia più lungo di 1000 linee, il programma deve stampare il testo con le linee in ordine inverso.
Ad esempio:

Input: Output:
Io programmo in C
o programmo in CI
 programmo in CIo
programmo in CIo 
ogrammo in CIo pr
grammo in CIo pro
rammo in CIo prog
ammo in CIo progr
mmo in CIo progra
mo in CIo program
o in CIo programm
 in CIo programmo
in CIo programmo 
n CIo programmo i
 CIo programmo in
CIo programmo in 
Io programmo in C
Io programmo in C
CIo programmo in 
 CIo programmo in
n CIo programmo i
in CIo programmo 
 in CIo programmo
o in CIo programm
mo in CIo program
mmo in CIo progra
ammo in CIo progr
rammo in CIo prog
grammo in CIo pro
ogrammo in CIo pr
programmo in CIo 
 programmo in CIo
o programmo in CI
Io programmo in C


Nota: si consiglia di memorizzare il simbolo di newline sostituendolo con il carattere vuoto '\0', e di utilizzare un file di testo preso in input dal programma con il comando Linux di redirezione (<).









Soluzioni



Soluzione Esercizio 1

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); 
}

Soluzione Esercizio 2

#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");
}

Soluzione Esercizio 3

#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;
      }
    }
  }
}

-- RiccardoSilvestri - 31 Oct 2007

Edit | Attach | Watch | Print version | History: r2 < r1 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r2 - 2007-11-04 - RiccardoSilvestri






 
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback