Ripasso esercizi di laboratorio

OBIETTIVO DELLA LEZIONE
La lezione non ha contenuti teorici, ma consiste in un ripasso degli esercizi di programmazione visti nel corso che presentano ancora qualche aspetto ancora da chiarire o approfondire.

Lab

Domande Parte A
Rispondi alle seguenti domande.
--------------------------------------------------------------------------------
1. Un programma scritto in Fortran, C o Java e'


- un file di testo
- una sequenza di istruzioni in linguaggio macchina
- un insieme di 0 e 1
- una sequenza di numeri binari che il processore puo' interpretare

--------------------------------------------------------------------------------

2. La definizione di una etichetta puo' essere posta:

- ovunque, tanto e' una sostituzione che avviene a livello di pre-compilazione, 
  ma e' prassi inserirla sopra il main del programma
- solo sopra il main del programma

--------------------------------------------------------------------------------
3. La seguente porzione di codice (x=8) e'

- una espressione
- una istruzione

--------------------------------------------------------------------------------
4. Quali delle seguenti espressioni sono vere (anche piu' di una)?

- Una espressione non ha mai effetti sulle variabili
- (x==3) e' una istruzione di controllo
- Una istruzione e' una espressione con un punto e virgola alla fine
--------------------------------------------------------------------------------

5. L'espressione   'a[x = n *2, y = n++] = (b = 27) + (c = (f = e - 3));'   
   e' corretta?

- Si'
- No

--------------------------------------------------------------------------------
6. Qualunque dato allocato in un programma C in esecuzione e' semplicemente un insieme di bit:
- si'
- no
--------------------------------------------------------------------------------
7. Una variabile carattere memorizzata in un programma C in realta' e' scritta come un numero intero:
- no
- si'
--------------------------------------------------------------------------------
8. Quale delle seguenti parole riservate serve per dichiarare variabili di tipo built-in?
- if
- union
- enum
- void
- double
--------------------------------------------------------------------------------
9. La memoria che viene impiegata da un programma e' stata allocata dal:
- programma stesso
- dal sistema operativo
- da nessuno dei due, e' pronta dall'avvio della macchina

--------------------------------------------------------------------------------
10. Le funzioni allocano i loro parametri formali:
- sullo heap
- sullo stack
- nell'area del programma

--------------------------------------------------------------------------------
11. Il segmento di memoria che contiene il programma puo' crescere se il programma ha necessita'
- No
- Si'
--------------------------------------------------------------------------------
12. Avendo dichiarato int x[100]; che differenza c'e' tra x e x[0]?
- x e' un indirizzo, mentre x[0] e' il primo dato contenuto nell'array
- Nessuna, sono entrambi riferimenti all'indirizzo prima cella

--------------------------------------------------------------------------------
13. Avendo la seguente dichiarazione: float * p; si evince che p e':
- nulla, la riga e' sbagliata
- un puntatore a float
- un puntatore flottante
- un puntatore con un cast a float

--------------------------------------------------------------------------------
14. Avendo definito int i; e int *pi; cosa vuole dire che e' possibile fare in modo che pi punti a i?
- Che pi e' una cella che conterra' l'indirizzo della variabile i
- Che saranno la stessa cosa e potro' intercambiarli nel codice.
--------------------------------------------------------------------------------
15. Il prototipo di una funzione e':
- uno strumento che il compilatore usa per definire i tipi di dato in ingresso e uscita alla funzione
- una funzione solo abbozzata, appunto allo stato di prototipo
- una nota per gli sviluppatori futuri

--------------------------------------------------------------------------------
16. Il prototipo di una funzione finisce sempre con un ";".
- Vero
- Falso, finisce con una graffa aperta a cui segue il codice della funzione

--------------------------------------------------------------------------------
17. La definizione di una funzione ha come prima riga il prototipo della funzione stessa.
- Falso, il prototipo puo' non contenere il nome dei parametri formali, quindi non sempre sono uguali
- Vero, sono sempre uguali

--------------------------------------------------------------------------------
18. Nel prototipo i parametri formali ...
- si inseriscono solo a scopo documentativo, il compilatore li ignora e guarda solo il 
  TIPO dei dati passati
- devono sempre essere inclusi altrimenti il compilatore non riesce ad usarlo

--------------------------------------------------------------------------------
19.  I file che includiamo con la direttiva #include possono essere delle semplici 
    collezioni di prototipi di funzioni.
- Vero, il codice delle funzioni potrebbe essere gia' compilato in una libreria
- Falso, se alla fine vogliamo compilare il nostro codice che usa quelle funzioni 
  allora nel file incluso deve esserci TUTTO il codice

--------------------------------------------------------------------------------
20. Le variabili che definiamo in una funzione sono visibili all'esterno e quindi 
dobbiamo stare attenti con i nomi delle variabili perche' non si confondano con quelli del main.
- Falso, proprio non si vedono e quindi non esiste questo problema
- Vero, meglio usare sempre nomi diversi

--------------------------------------------------------------------------------
21.  Usare delle variabili globali e' sempre una buona idea che risolve spesso 
    problemi di strutturazione del codice
- Falso, e' sinonimo di cattiva progettazione del codice, generano errori imprevisti e 
  difficili da debuggare, sono da evitare come la peste.
- Vero, e' sempre consigliabile definire molte variabili globali. Infatti avendo 
  il nome TUTTO IN MAIUSCOLO non possono essere confuse con le altre
--------------------------------------------------------------------------------
22. La funzione fscanf non puo' essere usata per leggere i dati dallo standard input:

- vero
- falso

--------------------------------------------------------------------------------
23. Tutti i file devono essere aperti prima di essere letti o scritti, per questo motivo 
stdin, stdout e lo standard error devono essere aperti con una fopen prima di essere usati:

- vero
- falso

--------------------------------------------------------------------------------
24. Tutti i file devono essere chiusi prima della uscita dal main con fclose:

- vero
- falso

--------------------------------------------------------------------------------
25. Per trovare un record in un file ad accesso casuale non e' necessario scorrere tutti 
gli altri record nel file

- vero
- falso

--------------------------------------------------------------------------------
26. La funzione fseek deve essere usata solo per trovare l'inizio del file:

- vero
- falso

--------------------------------------------------------------------------------
27. L'istruzione malloc(n):

- alloca n interi in memoria
- alloca n byte in memoria
- alloca la memoria della variabile n	

--------------------------------------------------------------------------------
28. Dopo l'istruzione x = (4>9) ? 7 : 88; la variabile intera x contiene:	

- 7
- 88
- (4>9)								

--------------------------------------------------------------------------------
29. La funzione clock() restituisce un valore che si riferisce

- al tempo relativo che il programma e' stato effettivamente in esecuzione
- ad un tempo assoluto

--------------------------------------------------------------------------------
30. La funzione sprintf() e' equivalente alla printf eccetto che l'output sara' memorizzato su 
una stringa invece che stampato a terminale.	

- vero
- falso

-------------------------------------------------------------------------------



Esercizio 1
Data la traccia sotto riportata completare il codice in modo di aumentare di 1 tutti gli interi pari e diminuire di 1 tutti quelli dispari nell'array vettore[] di dimensione dim. Riportare come risultato il numero che comparira' a monitor. Per esempio un vettore che contiene gli elementi {4,56,3,78,23} dopo essere stato aggiornato deve contenere gli elementi {5,57,2,79,22} .
-------- dati di prova -----------
Prima di consegnare il risultato prova a definire 
int vettore[] = {4,56,3,78,23}  ;
int dim = 5;

Se il tuo programma funziona correttamente, dovresti ottenere: 2573
---------------------------------------


#include <stdio.h>
#include <stdlib.h>


float CalcolaRisultato(int vettore[], int dim);

int main()
{

 int vettore[]= {6,5,4,3,3,1,14,67,89,105,24,56,78, 9,
 6,5,4,3,2,1,14,67,89,100,24,56,78,9,6,5,4,
 3,2,11,14,67,89,100,24,56,78, 9,
 6,5,4,3,2,1,14,67,89,100,24,56,78,9,6,5,4,3,2,1,14,
 67,89,100,24,46,78, 9,
 2,1,14,67,89,100,24,56,78, 9,
 6,5,4,37,2,1,14,67,89,100,24,56,78,
 9,6,5,4,5,2,1,14,67,89,100,24,56,78, 9,
 6,5,4,3,2,1,14,67,89,100,24,56,78,9,6,5,4,3,2,1,14,67,89,102,24,56,78, 9,
 6,5,4,3,2,1,14,67,89,67,89,100,24,5,79,9,6,5,4,3,2,1,
 104,24,56,78,9,6,5,4,3,2,1,14,67,89,100,24,56,78, 9,
 6,5,4,3,2,1,14,68,89,100,24,56,79,9,6,5,4,3,2,1,14,67,89,100,24,56,78, 9,
 6,5,4,3,12,1,14,67,89,100,24,56,78,9,6,5,4,3,
 6,5,4,3,5,1,14,67,89,100,24,56,
 6,5,4,3,2,1,14,67,89,100,24,56,78,9,6,5,4,3,112,1,14,67,89,100,124,56,78, 9,
 6,5,4,3,2,1,14,67,89,100,24,56,78,9,6,
 5,4,3,2,1,14,67,89,100,24,56,78, 9,
 6,5,4,3,2,14,14,67,89,100,24,56,78,9,6,5,4,3,2,21,14,67,89,100,24,56,78, 9,
 14,67,89,100,24,56,78, 9,6,5,4,3,2,1,14,
 6,5,4,3,2,1,14,67,89,190,24,56,78,9,6,5,4,3,2,1,14,67,89,100,24,56,78, 9,
 78,9,6,5,4,3,2,1,14,67,89,104,24,56,78, 9,
 6,5,4,3,2,1,14,67,89,100,24,56,78,9,6,5,4,3,2,1,14,67,89,100,24,56,78, 9,
 6,5,5,3,2,1,14,67,89,100,24,56,78,9,6,5,4,3,21,1,
 14,67,89,100,24,56,78, 9,
 6,5,4,3,2,1,14,67,99,100,24,56,78,9,6,5,4,0,2,1,14,67,89,110,24,56,78, 9
 };
 
 int dim =462;    // il vettore contiene dim elementi !
 float risultato;

 
  
 // ----- inizio dell'esercizio -------

 // Scrivi il codice che incrementa tutti gli interi pari e decrementa tutti quelli dispari 
 // nell'array vettore[]
 // N.B. la soluzione corretta deve stare dentro l'array vettore[] 


 // ----- fine dell'esercizio -------


 // NON TOCCARE TUTTE LE RIGHE QUI SOTTO
 risultato = CalcolaRisultato(vettore, dim);
 printf("\nrisultato da copiare ed incollare = %d \n\n" , (int) risultato );
 getchar();
 exit(0);
}  // main

float CalcolaRisultato(int vettore[], int dim)
{
   int i;
   float divisore, dividendo=0;
   for(i=0;i < dim; i++)
   {
      dividendo += i * vettore[i];
   }
   divisore = (dim +1)*dim/2; 
   return 100*dividendo/divisore; 
   
}


Soluzione
risultato da copiare ed incollare = 3389
Esercizio 2
Esegui le seguenti attivita':
  • salva il testo sotto riportato nel file telefonate.txt ;
  • scrivi il programma Contatelefonate.c che accede al file telefonate.txt e calcola il numero di telefonate effettuate a un cellulare e il numero di quelle effettuate verso un numero fisso;
  • calcola come risultato il maggiore tra questi due numeri.
Per stabilire se il telefono e' un cellulare o un fisso si consiglia di utilizzale la funzione strcmp(s1,s2) che restituisce 0 se le due stringhe sono uguali, un numero negativo se s1 e' minore di s2 in ordine lessicografico e un numero positivo altrimenti. Nota bene: il file telefonate.txt e' composto da stringa tabulatore numeroconvirgola tabulatore stringa tabulatore stringa FINERIGA
Ad esempio con il seguente file

02334023402 12.22 milano 4minuti 
333402340 0.23 cellul 4minuti 
0554023402 02.23 firenze 3minuti 
06334023402 12.22 roma 4minuti
 
si hanno tre telefonate verso il fisso e una verso un cellulare (soluzione -> 3) 

---- testo da incollare nel file telefonate.txt ----- 
0234023402 02.23 milano 3minuti 
02334023402 12.22 milano 4minuti 
333402340 0.23 cellul 4minuti 
0554023402 02.23 firenze 3minuti 
06334023402 12.22 roma 4minuti 
333402340 0.23 cellul 4minuti 
0234023402 02.23 milano 3minuti 
024334023402 12.12 milano 4minuti 
333402340 0.23 cellul 4minuti 
02354023402 02.23 milano 3minuti 
06334023402 12.22 roma 4minuti 
3337402340 0.23 cellul 4minuti 
0234023402 02.73 milano 3minuti 
06334023402 12.22 roma 4minuti 
0554023403 02.23 firenze 3minuti 
3833402340 0.23 cellul 4minuti 
0234023402 02.23 milano 3minuti 
02334023402 12.22 milano 4minuti 
3333402340 0.23 cellul 4minuti 
0234023402 02.23 milano 3minut
0554023403 02.23 firenze 3minuti 
02334023402 12.22 milano 4minuti 
3363402340 0.23 cellul 4minuti 
0234023402 02.23 milano 3minuti 
02334023402 12.22 milano 4minuti 
333402340 0.23 cellul 4minuti 
02534023402 02.23 milano 3minuti 
02334023402 12.22 milano 4minuti 
333402340 0.23 cellul 4minuti 
02334023402 12.22 milano 4minuti 
333402340 0.23 cellul 4minuti 
0554023402 02.23 firenze 3minuti 
06334023402 12.22 roma 4minuti 
333402340 0.23 cellul 4minuti 
0234023402 02.23 milano 3minuti 
024334023402 12.12 milano 4minuti 
333402340 0.23 cellul 4minuti 
333402340 0.23 cellul 4minuti 
333402340 0.23 cellul 4minuti 
0234023402 02.23 milano 3minuti 
023344023402 12.22 milano 4minuti 
333402340 0.43 cellul 4minuti 
0234023402 02.23 milano 3minuti 
055334023402 12.22 firenze 4minuti 
34333402340 0.23 cellul 4minuti 
0234023402 02.23 milano 3minuti 
02334023402 12.22 milano 4minuti 
333402340 0.23 cellul 4minuti 
02324023402 02.23 milano 3minuti 
05533402340 12.22 firenze 4minuti 
3333402340 0.23 cellul 4minuti 
06364023402 02.23 roma 3minuti 
02334023402 12.22 milano 4minuti 
333402340 0.23 cellul 4minuti 
0234023402 02.23 milano 3minuti 
02334023402 12.22 milano 4minuti 
333402340 0.23 cellul 4minuti 
02324023402 02.23 milano 3minuti 
02334023402 12.22 milano 4minuti 
333402340 0.23 cellul 4minuti 
3337402340 0.23 cellul 4minuti 
0234023402 02.73 milano 3minuti 
02334023402 12.22 milano 4minuti 
05533402340 12.22 firenze 4minuti 
3833402340 0.23 cellul 4minuti 
0634023402 02.23 roma 3minuti 
02334023402 12.22 milano 4minuti 


Soluzione
risultato da copiare ed incollare = 44
Esercizio 3
Scrivi un programma che:
  1. conta quanti caratteri ci sono nel file COSTITUZ.TXT (63 KB) ;
  2. conta quante volte compare la lettera minuscola 'r' seguita dalla minuscola 'a' ;
  3. calcola come FLOAT la frequenza di occorrenza della lettera 'i' (e' indifferente se maiuscola o minuscola);
  4. restituisce come soluzione (con due decimali dopo la virgola) il FLOAT contenete il prodotto delle due quantita' appena calcolate nei punti 2.e 3.


Soluzione
risultato da copiare ed incollare = 45.23
Esercizio 4
Utilizzando codice sotto riportato come traccia si scriva un programma che contiene una funzione ricorsiva int magia(int n) che si basa sulla funzione ricorsiva magia(n):
  1. magia(0) vale 1;
  2. se n>0, allora magia(n) vale (magia(n-1)+100) se n e' pari e (2*magia(n-1)) se n e' dispari;
Il risultato e' quello restituito a monitor dal codice.
#include <stdio.h>

int magia(int n);

int main() //NON MODIFICARE IL MAIN
{
  printf("la soluzione e' --> %d", magia(13));
  fflush(stdin);
  getchar();
  return(0);
}

// ----- inizio dell'esercizio -------

// Inserisci la funzione ricorsiva magia.
 
// ----- fine dell'esercizio -------



Soluzione
la soluzione e'--> 12728
Esercizio 5
Si utilizzi il codice sotto riportato per risolvere l'esercizio. Data il vettore di caratteri (stringa) v[] inizializzato nel codice dell'esercizio:
  • si costruisca una seconda stringa str inserendo un carattere '_' tra ogni carattere di v[] (si consiglia l'uso della funzione sprinf());
  • si utilizzi la funzione strcat (per inserire in fondo alla stringa str la stringa " FINE STRINGA ": copiala esattamente con gli spazi!);
  • si utlizzi la funzione sprinf() e strlen() per inserire in fondo alla stringa str il suo numero complessivo di caratteri.
-------- dati di prova -----------
Prima di consegnare il risultato si provi a definire 
char v[20]= {'E','s','a','m','e',' ','d','i',' ','l','a','b','o','r','a','t','o','r','i','o'}; 

Se il programma e' corretto la variabile str conterra' la stringa: 

E_s_a_m_e_ _d_i_ _l_a_b_o_r_a_t_o_r_i_o FINE STRINGA 53

Se il tuo programma funziona correttamente, dovresti ottenere: 7839

NB la soluzione che devi inserire e' quella calcolata con la stringhe inizializzata nel codice sottostante
---------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

float CalcolaRisultato(char stringa[]);

int main()
{

 char v[51]={'P','r','o','v','a',' ','d','i',' ','e','s','a','m','e',' ',
 'p','e','r',' ','i','l',' ','l','a','b','o','r','a','t','o','r','i','o',
 ' ','d','i',' ','p','r','o','g','r','a','m','m','a','z','i','o','n','e'}; 
 // vettore di 51 posizione che contiene caratteri
                                 
 char str[1000]=""; // stringa nella quale va inserito il risultato finale
 
 float risultato;
 int i;
 
 // ----- inizio dell'esercizio -------
 
 // 1) si costruisca una seconda stringa str 
 // inserendo un carattere '_' tra ogni carattere di v[]
 
 
 // 2) si utlizzi la funzione strcat(per inserire in fondo 
 // alla stringa str la stringa " FINE STRINGA "
 
 
 
 // 3) si  utlizzi la funzione sprinf() e strlen() per inserire
 // in fondo alla stringa str il suo numero complessivo di caratteri.


  // ----- fine dell'esercizio -------


 
 // NON TOCCARE TUTTE LE RIGHE QUI SOTTO
 risultato = CalcolaRisultato(str);
 printf("\nrisultato da copiare ed incollare = %d \n\n" , (int) risultato );
 getchar();
 exit(0);
}  // main

float CalcolaRisultato(char stringa[])
{
   int i;
   float divisore, dividendo=0;
   int dim = strlen(stringa);
   for(i=0;i < dim; i++)
   {
      dividendo += i * (int)stringa[i];
   }
   divisore = (dim +1)*dim/2; 
   return 100*dividendo/divisore; 
   
}





Soluzione
risultato da copiare ed incollare = 8656




Informazioni sul sito