Informatica A (per gestionali) A.A. 2004/2005 Esercizi C e diagrammi a blocchi Preparazione prima prova intermedia Indice 1 Array ........................................................ 3 1.1 Filtraggio .............................................................................................................................. 3 1.2 Trasformazione .................................................................................................................... 3 2 Struct e array ............................................... 5 2.1 Offerte fornitori .................................................................................................................... 5 2.2 GPS ...................................................................................................................................... 6 2.3 Esami studenti ...................................................................................................................... 7 3 Diagramma a blocchi e traccia di esecuzione .................. 8 3.1..................................................................................................................................................... 8 2 1 Array 1.1 Filtraggio Testo L’utente inserisce un array di numeri reali non negativi (un numero negativo indica la fine della fase di inserimento). L’elaboratore calcola la seguente formula: v[i] (v[i-1] + v[i] + v[i+1]) / 3 e visualizza l’array così filtrato. Quando i corrisponde ai “bordi” dell’array, assumere che v[i-1] (oppure v[i+1]) valga zero. Implementazione #include <stdio.h> void main() { unsigned int tot = 0, i; float n, precedente, successivo, numeri[100]; printf ("Numero non negativo: "); scanf ("%f", &n); while (n >= 0) { numeri[tot] = n; tot++; printf ("Numero non negativo: "); scanf ("%f", &n); } for (i = 0; i < tot; i++) { if (i == 0) { precedente = 0; } else { precedente = numeri[i - 1]; } if (i == tot - 1) { successivo = 0; } else { successivo = numeri[i + 1]; } printf ("%f\n", (precedente+numeri[i]+successivo)/3.0); } } 1.2 Trasformazione 3 Testo L’utente inserisce un array di numeri interi, di lunghezza desiderata. Chiamando v l’array e indicando con m la posizione dell’ultima cella inserita (l’array sarà quindi composto da m+1 celle), il programma applica il seguente calcolo: - per ogni i, in v[i] ed in v[m-i] si inserisce il valore v[i]+v[m-i] Implementazione #include <stdio.h> void main() { const unsigned int MAX = 100; unsigned int tot, m, i; int numeri[MAX], temp; printf ("Quanti numeri: "); scanf ("%u", &tot); /* saranno riempite tot celle, da 0 a tot-1 */ for (i = 0; i < tot; i++) { printf ("Numero:"); scanf ("%d", &numeri[i]); } m = tot - 1; for (i = 0; i <= m / 2; i++) { temp = numeri[i] + numeri[m - i]; numeri[i] = temp; numeri[m - i] = temp; } for (i = 0; i < tot; i++) { printf ("%d\n", numeri[i]); } } 4 2 Struct e array 2.1 Offerte fornitori Testo Il programma permette di inserire un certo numero di offerte di fornitori: - codice fornitore (numero naturale) - Nome fornitore (stringa) - importo offerta in euro (numero float) Quando l’utente inserisce 0 come codice fornitore, l’inserimento ha termine. Il programma cerca e visualizza l’offerta migliore (la più economica). Implementazione #include <stdio.h> void main() { const unsigned int MAX_OFFERTE = 1000, MAX_CAR = 20; typedef char Stringa[MAX_CAR]; typedef struct { unsigned int codFornitore; Stringa nomeFornitore; float importo; } Offerta; Offerta arrayOfferte[MAX_OFFERTE], nuovaOfferta; int numOfferte = 0, j; float offertaMin; unsigned int posizOffertaMin; printf ("Codice fornitore: "); scanf ("%u", &nuovaOfferta.codFornitore); printf ("Nome fornitore: "); scanf ("%s", nuovaOfferta.nomeFornitore); printf ("Importo offerta (euro): "); scanf ("%f", &nuovaOfferta.importo); while (nuovaOfferta.codFornitore != 0) { arrayOfferte[numOfferte] = nuovaOfferta; numOfferte++; printf ("Codice fornitore: "); scanf ("%u", &nuovaOfferta.codFornitore); printf ("Nome fornitore: "); scanf ("%s", nuovaOfferta.nomeFornitore); printf ("Importo offerta (euro): "); scanf ("%f", &nuovaOfferta.importo); } offertaMin = arrayOfferte[0].importo; posizOffertaMin = 0; for (j = 1; j < numOfferte; j++) 5 { if (arrayOfferte[j].importo < offertaMin) { offertaMin = arrayOfferte[j].importo; posizOffertaMin = j; } } printf ("Cod.fornitore:%u,nome:%s,importo:%f\n", arrayOfferte[posizOffertaMin].codFornitore, arrayOfferte[posizOffertaMin].nomeFornitore, arrayOfferte[posizOffertaMin].importo); } 2.2 GPS Testo Un esempio di calcolo dell’occupazione in memoria di variabili strutturate Un sistema GPS calcola e memorizza in un array una serie di coordinate geografiche. Sapendo che: - Le variabili di tipo int occupano 16 bit - Le variabili di tipo float occupano 32 bit - Le variabili di tipo char occupano 8 bit Ed avendo definito i seguenti tipi strutturati: typedef struct { unsigned int unsigned int unsigned int unsigned int } Coordinata; gradi; minuti; secondi; frazSecondi; typedef struct { Coordinata latitudine; Coordinata longitudine; float altitudine; float distanzaPercorsa; char unitaMisuraDistanza[2]; } Punto; Calcolare quanti byte sono occupati dalla variabile percorso definita nel seguente modo: Punto percorso[1000]; Soluzione 16 x 4 = 64 bit per le variabili di tipo Coordinata 64 x 2 + 32 x 2 + 8 x 2 = 208 bit per le variabili di tipo Punto La variabile percorso è un array di 1000 celle di tipo Punto e quindi occupa: 208 x 1000 = 208000 bit, ovvero 208000 / 8 = 26000 byte. Ricordiamo che 1 byte = 8 bit. 6 2.3 Esami studenti Testo Definizione di tipi strutturati e calcolo dell’occupazione in memoria. Si definisca il tipo strutturato Esame che permetta di rappresentare le informazioni riguardanti un esame superato da un certo studente. Esame è composto dai seguenti dati: codiceCorso: una sequenza di 6 caratteri, votoRiportato: numero intero non negativo, annoAccademico: numero intero non negativo; Si definisca il tipo strutturato Studente che permetta di rappresentare informazioni riguardanti tutti gli esami superati da un certo studente. Studente è composto dai seguenti dati: matricola: una sequenza di 6 caratteri, vettEsamiSuperati: un vettore composto da 30 celle di tipo Esame, numeroEsamiSuperati: numero intero non negativo. Si definisca inoltre la variabile vettStudenti, che permetta di rappresentare l’insieme degli studenti ad una certa università. L’università in questione potrà gestire un massimo di 1000 studenti. Supponendo di riferirsi ad una architettura in cui una variabile di tipo char occupi 1 byte e un intero occupi 2 byte, calcolare l’occupazione in memoria della variabile vettStudenti. Soluzione typedef struct { char codiceCorso[6]; unsigned int votoRiportato; unsigned int annoAccademico; } Esame; typedef struct { char matricola[6]; Esame vettEsamiSuperati[30]; unsigned int numeroEsamiSuperati; } Studente; Studente vettStudenti[1000]; Occupazione di memoria: Esame: 6 caratteri x 1 byte + 1 intero x 2 byte + 1 intero x 2 byte = 10 byte Studente: 6 caratteri x 1 + 30 Esame x 10 byte + 1 intero x 2 byte = 308 byte Quindi, vettStudenti: 1000 Studente x 308 byte = 308000 byte. 7 3 Diagramma a blocchi e traccia di esecuzione 3.1 A) Sia data una sequenza di numeri interi positivi diversi da zero. I valori sono letti in input da tastiera. La fine dell’input è indicata dall’inserimento dello 0. Si calcoli: a. Il numero di coppie di numeri consecutivi uguali b. Il numero di coppie in cui il secondo numero e’ divisore del primo, ma non uguale c. Si visualizzi un messaggio che dica quale tipo di coppie tra i due precedenti è presente in numero maggiore. Ad esempio, se la sequenza letta in input è 5 5 5 5 5 2 3 12 6 2, allora l’algoritmo calcolerà 4 come n.ro di coppie di interi uguali e 2 come n.ro di coppie in cui il secondo numero è divisore del primo e visualizzerà il messaggio: “La sequenza contiene un numero maggiore di coppie di numeri uguali”. B) Si costruisca la traccia di esecuzione del programma in corrispondenza della sequenza di ingresso: 4 4 4 2 9 NOTA: non è necessario controllare che i dati di ingresso siano maggiori o uguali a zero Inizio A 0 divis = 0; ugua = 0 1 Leggi d1 3 V 2 15 “Sequenza non esiste” F d1 != 0 12 ugua > divis 5 d2 != 0 4 d1 == d2 F “Più coppie uguali” 18 Fine F V 6 Fine 14 “Più coppie con divisore” V V Leggi d2 16 “Nessuna coppia” ugua!= 0 || F 11 divis != 0 13 18 8 F V ugua++ 7 d1 % d2 == 0 F V divis++ 9 d1 = d2 10 A 8 Nº blocco Prox blocco 1 2 2 3 3 4 4 5 5 6 V 6 7 V 7 10 10 4 4 5 5 6 V 6 7 V 7 10 10 4 4 5 5 6 V 6 8 F 8 9 V 9 10 10 4 4 5 5 6 V 6 8 F 8 10 F 10 4 4 5 5 11 F 11 12 V (1) (2) 12 13 V (1) (2) 13 18 18 - test d1 d2 divis ugua 0 0 4 V 4 1 4 4 2 4 2 1 2 9 9 0 9