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.
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; }
risultato da copiare ed incollare = 3389
Esercizio 2
Esegui le seguenti attivita':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
- 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.
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
risultato da copiare ed incollare = 44
Esercizio 3
Scrivi un programma che:
- conta quanti caratteri ci sono nel file COSTITUZ.TXT (63 KB) ;
- conta quante volte compare la lettera minuscola 'r' seguita dalla minuscola 'a' ;
- calcola come FLOAT la frequenza di occorrenza della lettera 'i' (e' indifferente se maiuscola o minuscola);
- restituisce come soluzione (con due decimali dopo la virgola) il FLOAT contenete il prodotto delle due quantita' appena calcolate nei punti 2.e 3.
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):Il risultato e' quello restituito a monitor dal codice.
- magia(0) vale 1;
- se n>0, allora magia(n) vale (magia(n-1)+100) se n e' pari e (2*magia(n-1)) se n e' dispari;
#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 -------
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; }
risultato da copiare ed incollare = 8656