Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 5 Esercitazione: 2 novembre 2005 Esercizi sulle funzioni Esercizio 1: media di numeri reali (uso funzioni e struct) Le seguenti dichiarazioni definiscono i tipi che descrivono un insieme numeri con parte intera e parte decimale rappresentati utilizzando la notazione scientifica con mantissa ed esponente: si intende che un numero rappresentato da una struttura di tipo numero abbia valore pari a mantissa * 10 esponente. #define NO_NUMERI 500 typedef struct long int mantissa; int esponente; numero; typedef struct int nsignificativi; numero double lista [NO_NUMERI]; media; archivionumeri; /* lunghezza della parte iniziale dell array lista che effettivamente contiene numeri significativi */ Si assuma che in una struttura di tipo archivionumeri i campi nsignificativi e lista abbiano dei valori definiti (a esempio siano stati letti dall ingresso o calcolati in qualche modo) mentre il valore del campo media sia inizialmente indefinito. Si scriva un frammento di codice, includendo eventuali dichiarazioni di variabili aggiuntive, che assegni al campo media della struttura di tipo archivionumeri il valore della media dei numeri significativi memorizzati nell archivio. A tale scopo si faccia uso della seguente funzione: double potenza (int base, int esponente) che permette di calcolare il valore del numero basepotenza. NB: non è richiesta l implementazione della funzione potenza. archivionumeri arch; int i; double s, d;... s = 0.0; for ( i = 0; i < arch.nsignificativi; i ++ ) d = arch.lista[i].mantissa * potenza (10, arch.lista[i].esponente); s = s + d; arch.media = s / arch.nsignificativi; - 1 -
Esercizio 2: funzione di ricerca binaria /* Ricerca binaria di uno studente universitario per numero di matricola e stampa dei dati associati allo studente trovato. */ Si scriva un programma che: 1. chiede all'utente quanti studenti universitari memorizzare Ogni studente ha un nome, un indirizzo e un numero di matricola. 2. memorizza i vari studenti in un array di studenti. Si suppone che l'utente sia disciplinato e inserisca gli studenti ordinati in modo crescente per numero di matricola. 3. chiede all'utente un numero di matricola per eseguire una ricerca sugli studenti precedentemente memorizzati. La ricerca è una funzione che riceve in ingresso l'array e un numero di matricola. La funzione restituisce la posizione dello studente (l'indice) nell'array. 4. Se lo studente ricercato per matricola esiste, si stampino i dati associati (nome e indirizzo). # define MAX_STUDENTI 5 // dimensione massima dell'array di studenti # define MAX_NUM_CHAR 30 // dimensione massima di una stringa /* dichiarazione del tipo globale String */ typedef char String[MAX_NUM_CHAR]; /* dichiarazione del tipo globale boolean */ typedef enumfalse, true boolean; /* dichiarazione globale del tipo Studente */ typedef struct String nome; String indirizzo; int matricola; Studente; /* dichiarazione del tipo globale ArrayStudenti */ typedef Studente ArrayStudenti[MAX_STUDENTI]; /* funzione che esegue una ricerca binaria fra gli studenti dell'array studenti per numero di matricola matr. Il parametro numstudenti indica il numero di studenti effettivamente memorizzati nell'array. Torna la posizione dello studente all'interno dell'array (l'indice del vettore) oppure -1 per indicare che lo studente - 2 -
*/ con il numero di matricola matr passato in ingresso non è stato trovato. int ricercabinariastudente(arraystudenti studenti, int numstudenti, int matr) int inizio, fine, trovato, posizione; Studente studente; void main() inizio = 0; fine = numstudenti; trovato = false; while (trovato == false && inizio < fine) if (trovato == false) return -1; else return posizione; posizione = (fine + inizio)/2; studente = studenti[posizione]; if (studente.matricola == matr) trovato = true; else if (matr > studente.matricola) // ricerco nella metà superiore dell'array inizio = posizione + 1; else fine = posizione; // ricerco nella metà inferiore dell'array int matricola; int risultatoricerca, i, numstudenti; ArrayStudenti array; printf("quanti studenti vuoi memorizzare nell'array? "); scanf("%d", &numstudenti); for (i=0; i<numstudenti; i++) printf("\nnome studente "); scanf("%s", &(array[i].nome)); printf("\nindirizzo studente "); scanf("%s", &(array[i].indirizzo)); printf("\nmatricola studente "); scanf("%d", &(array[i].matricola)); printf("inserisci un numero di matricola per eseguire la ricerca: "); scanf("%d", &matricola); risultatoricerca = ricercabinariastudente(array, numstudenti, matricola); if (risultatoricerca == -1) printf("studente con numero di matricola %d inesistente", matricola); else printf("\n\nstudente con numero di matricola %d in posizione %d", matricola, risultatoricerca); printf("\nstudente trovato %s %s ", array[risultatoricerca].nome, array[risultatoricerca].indirizzo); / - 3 -
Esercizio 3: funzione incrementa data Date le seguenti dichiarazioni di tipo e la seguente definizione del sottoprogramma bisestile: typedef struct int giorno; int mese; int anno; data; typedef enum falso, vero boolean; /* restituisce il valore vero se l'intero passato come parametro rappresenta un anno bisestile, falso altrimenti */ boolean bisestile (int anno) if((anno % 4 == 0 && anno % 100!= 0) (anno % 400 == 0)) return vero; else return falso; Si sviluppi una funzione che, data una data d passata come parametro, restituisce al chiamante una nuova data ottenuta incrementando d di un giorno. Per esempio, se la data d è 31 (valore del campo giorno) 12 (valore del campo mese) 2004 (valore del campo anno), il sottoprogramma restituisce un valore di tipo data i cui campi giorno, mese ed anno sono pari rispettivamente a: 1 Gennaio 2005. Si chiami il sottoprogramma bisestile per decidere, in base al valore dell anno, se il mese di Febbraio è costituito da 28 o 29 giorni. Si sviluppi un main che acquisisce da tastiera i valori di 10 date, li memorizza in un array di date e, per tutte le date presenti nell array che sono precedenti al 12/11/2005, richiama la funzione incrementa stampando a video il risultato della chiamata. #define MAXDATE 5 // definizione del tipo strutturato data typedef struct int giorno; int mese; int anno; data; // definizione del tipo boolean typedef enum falso, vero boolean; // definizione del tipo ArrayDate typedef data ArrayDate[MAXDATE]; /* funzione che restituisce il valore vero se l'intero passato come parametro rappresenta un anno bisestile, falso altrimenti */ boolean bisestile (int anno) if((anno % 4 == 0 && anno % 100!= 0) (anno % 400 == 0)) return vero; else return falso; // funzione che, fornita in ingresso una data, // fornisce in uscita la data successiva. data incrementa(data d) - 4 -
// SE il mese ha 31 giorni if (d.mese!=2 && d.mese!=4 && d.mese!=6 && d.mese!=9 && d.mese!=11) d.giorno = (d.giorno % 31) + 1; // aggiornamento giorno // SE il mese NON è febbraio => mese ha 30 giorni else if(d.mese!=2) d.giorno = (d.giorno % 30) + 1; // aggiornamento giorno // se il mese è febbraio e l'anno è bisestile else if(bisestile(d.anno) == vero) d.giorno = (d.giorno % 29) + 1; // aggiornamento giorno // altrimenti, se mese è febbraio ma anno NON bisestile else d.giorno = (d.giorno % 28) + 1; // aggiornamento giorno // se il nuovo valore di giorno è 1 if(d.giorno == 1) // aggiornamento mese d.mese = (d.mese % 12) + 1; // aggiornamento anno if(d.mese == 1) d.anno++; return d; // main void main() ArrayDate date; int contatore = 0; /* richiedo l'inserimento di MAXDATE */ for(contatore =0; contatore < MAXDATE; contatore++) printf("inserisci la data %d", contatore+1); printf("\n giorno :"); scanf("%d",&date[contatore].giorno); printf(" mese :"); scanf("%d",&date[contatore].mese); printf(" anno :"); scanf("%d",&date[contatore].anno); /* per ogni data precedente l'12/11/2005 richiamo la funzione incrementa */ for(contatore=0; contatore < MAXDATE; contatore++) if (date[contatore].anno < 2005) date[contatore] = incrementa(date[contatore]); else if(date[contatore].anno == 2005) if (date[contatore].mese < 11) date[contatore] = incrementa(date[contatore]); else if (date[contatore].mese == 11) if(date[contatore].giorno < 12) date[contatore] = incrementa(date[contatore]); /*visualizzo le date modificate */ for(contatore=0; contatore < MAXDATE; contatore++) printf("%d/%d/%d\n",date[contatore].giorno,date[contatore].mese,date[contatore].anno); - 5 -
/* Uso del ciclo DO WHILE Esercizio 4: uso do-while Si sviluppi un programma che acquisisce da tastiera 9 cifre binarie e converte il numero corrispondente, considerato come numero naturale, in base 10. */ /* SENZA DO WHILE */ #include <math.h> #define DIM 9 void main() int cifra, i, ris; ris = 0; for(i=0; i<dim; i++) /*TRASFORMAZIONE IN DO WHILE */ #include <math.h> #define DIM 9 void main() int cifra, i, ris; ris = 0; for(i=0; i<dim; i++) scanf("%d", &cifra); while(cifra!=0 && cifra!=1) scanf("%d", &cifra); ris = ris + cifra*pow(2, DIM-1-i); printf ("Il valore trovato e`: %d", ris); do scanf("%d", &cifra); while(cifra!=0 && cifra!=1); ris = ris + cifra*pow(2, DIM-1-i); printf ("Il valore trovato e`: %d", ris); Esercizio 5 Con riferimento al seguente frammento di codice tradurre in una frase del linguaggio italiano la condizione che governa l istruzione if, esprimendola come proprietà aritmetica del valore correntemente assegnato alla variabile i. int i; for ( i = 10; i < 30; i++ ) if ( ( i >= 18 ) && ( i < 24 ) ( i % 2 == 0) ) printf ( %d \n, i); R. Il valore della variabile i è compreso tra 18 incluso e 24 escluso oppure tale valore è pari Quali numeri vengono stampati quando il codice viene eseguito? R. 10, 12, 14, 16, 18, 19, 20, 21, 22, 23, 24, 26, 28. Si sviluppi la funzione che calcoli il fattoriale di un Numero. Si sviluppi un main che utilizza tale funzione per Esercizio 6: funzione fattoriale - 6 -
Calcolare il fattoriale di dieci valori acquisiti da tastiera // funzione fattoriale int fattoriale(int n) int ris; if(n<0) return -1; ris = 1; while(n>0) ris = ris * n; n = n-1; return ris; // main che richiama la funzione void main() int val; int f; int cont; for(cont = 0; cont < 10; cont++) scanf("%d", &val); // chiamata alla funzione f = fattoriale(val); printf("%d! = %d\n", val, f); - 7 -