La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

INFORMATICA Esercizi. © Piero Demichelis 2 Esempio: giorni nellanno Realizzare un programma che legga da tastiera lanno di riferimento e la sigla del.

Presentazioni simili


Presentazione sul tema: "INFORMATICA Esercizi. © Piero Demichelis 2 Esempio: giorni nellanno Realizzare un programma che legga da tastiera lanno di riferimento e la sigla del."— Transcript della presentazione:

1 INFORMATICA Esercizi

2 © Piero Demichelis 2 Esempio: giorni nellanno Realizzare un programma che legga da tastiera lanno di riferimento e la sigla del primo giorno di quellanno (1 gennaio) composta dai primi tre caratteri del nome (ad esempio: 2003 mer) e visualizzi sul video una tabella in cui sono indicati, per ogni mese dellanno, quante volte occorre ciacun giorno della settimana. Si rammenta che sono bisestili gli anni divisibili per 4 ma, tra quelli multipli di 100, solo quelli che sono divisibili per 400.

3 © Piero Demichelis 3 Esempio: giorni nellanno Esempio di tabella in uscita: 2003 gen feb mar apr mag giu lug ago set ott nov dic lun 4 4 mar 4 4 mer 5 ecc. gio 5 ven 5 sab 4 dom 4

4 © Piero Demichelis 4 Esempio: giorni nellanno Analisi ­Il modo più semplice per risolvere il problema è forse quello di utilizzare lo stesso algoritmo che per primo viene in mente, ovvero di contare le occorrenze giorno per giorno a partire dal 1 gennaio e fino al 31 dicembre tenedo conto dei mesi e della loro durata (con controllo se si tratta di anno bisestile). ­Identificheremo i vari giorni della settimana con un indice (0 per lunedì, 1 per martedì, ecc.) per cui dovremo convertire la stringa di tre caratteri di input nellindice corrispondente (di lì comincia lanno). ­La base dati sarà una matrice di interi (giorni della settimana x mesi) che riempiremo con due cicli for annidati: quello esterno controlla i mesi, quello interno la durata del mese. ­La durata della settimana (da 0 a 6) la controlliamo noi con un contatore da 0 a 6. Deve pertanto essere resettato a 0 ogni volta che raggiunge 7!

5 © Piero Demichelis 5 Esempio: giorni nellanno #include main() { int anno, data, day, mese; char giorno[4]; /* 3 caratteri + fine stringa */ /* vettore contenente la durata (numero giorni) di ogni mese */ int dur_mese[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int occ[7][12]; /* matrice risultato: giorni della settimana x mesi */ /* Input dei dati da tastiera */ printf ("\n Anno: "); scanf ("%d", &anno); printf ("\n Che giorno è il primo gennaio?: "); scanf ("%s", giorno);

6 © Piero Demichelis 6 Esempio: giorni nellanno /* Controlla se è un anno bisestile */ if ((anno % 4) == 0) /* divisibile per 4? */ { if ((anno % 100) == 0) /* si, divisibile per 100? */ { if ((anno % 400) == 0) /* si, divisibile per 400? */ dur_mese[1] = 29; /* si, bisestile */ } else dur_mese[1] = 29; /* divisibile per 4 e non per 100, bisestile! */ }

7 © Piero Demichelis 7 Esempio: giorni nellanno /* Converte la sigla del primo giorno dell'anno in un indice (da 0 a 6) */ switch (giorno[0]) { case 'l': {day = 0; break;} /* lunedì */ case 'm': if (giorno[1] == 'a') {day = 1; break;} /* martedì */ else {day = 2; break;} /* mercoledì */ case 'g': {day = 3; break;} /* giovedì */ case 'v': {day = 4; break;} /* venerdì */ case 's': {day = 5; break;} /* sabato */ case 'd': day = 6; /* domenica */ }

8 © Piero Demichelis 8 Esempio: giorni nellanno /* Inizializza la matrice risultato con tutti zeri */ for (mese = 0; mese < 12; mese++) for (data = 0; data < 7; data++) occ[data][mese] = 0; /* algoritmo di calcolo delle occorrenze */ for (mese = 0; mese < 12; mese++) for (data = 1; data <= dur_mese[mese]; data++) { occ[day][mese]++; day++; if (day == 7) day = 0; /* fine settimana, ricomincia dallinizio */ }

9 © Piero Demichelis 9 Esempio: giorni nellanno printf (" %d\n", anno); /* Stampa risultato */ printf (" gen feb mar apr mag giu lug ago set ott nov dic\n"); for (day = 0; day < 7; day++) { switch (day) { case(0):{printf ("lun "); break;} case(1):{printf ("mar "); break;} case(2):{printf ("mer "); break;} case(3):{printf ("gio "); break;} case(4):{printf ("ven "); break;} case(5):{printf ("sab "); break;} case(6):printf ("dom "); } /* fine switch */ for (mese = 0; mese < 12; mese++) printf (" %d ", occ[day][mese]); printf ("\n"); } /* fine for (day = 0;... */ }

10 © Piero Demichelis 10 Esempio: codice 2 su 5 Generare tutti i codici 2 su 5 (5 bit, di cui due bit devono essere a 1 e tre bit a zero), li si memorizzi in un'opportuna base dati e li si visualizzi sul videoterminale. (Si rammenti che i codici binari possono essere visti come numeri interi (senza segno), per cui è sufficiente generare tutti i codici di 5 bit e poi scartare quelli che non soddisfano la condizione di avere 2 bit ad uno e 3 a zero.) Successivamente confrontare i codici a due a due e, per ciascuna coppia, confrontare i bit a parità di posizione, conteggiando il numero di bit diversi tra di loro (il numero di bit diversi viene detto distanza tra i codici). Il programma calcoli e stampi il massimo e il minimo della distanza tra i codici.

11 © Piero Demichelis 11 Esempio: codice 2 su 5 #include void main() { int codOK, num, i, j, k, bitauno; int massimo, minimo, dist; int matrice[32][5]; /* calcola tutti i codici 2 su 5 e li salva in */ /* matrice scartando le combinazioni illegali */

12 © Piero Demichelis 12 Esempio: codice 2 su 5 codOK = 0; for (i=0; i<32; i++) { bitauno = 0; num = i; for (j=1; j<=5; j++) { matrice[codOK][j] = num % 2; if (matrice[codOK][j] == 1) bitauno++; num /= 2; }

13 © Piero Demichelis 13 Esempio: codice 2 su 5 if (bitauno == 2) { for (j=1; j<=5; j++) printf ("%d", matrice[codOK][j]); printf ("\n"); codOK++; } /* Cerca la distanza massima e minima */

14 © Piero Demichelis 14 Esempio: codice 2 su 5 massimo = 0; minimo = 5; for (i = 0; i <= codOK-1; i++) { for (k=i+1; k<=codOK; k++) { dist = 0; for (j=1; j<=5; j++) if (matrice[i][j] != matrice[k][j]) dist++; if (dist > massimo) massimo = dist; if (dist < minimo) minimo = dist; } printf ("massimo = %d minimo = %d \n", massimo, minimo); }

15 © Piero Demichelis 15 Esempio: punti nel piano In un file, il cui nome va richiesto da tastiera, ci sono le coordinate X e Y di una serie di punti appartenenti a un piano cartesiano. Non si conosce a priori il numero di punti: si supponga siano meno di 100. Leggere il file, calcolare la distanza dall'origine di ogni singolo punto, quindi riordinare i punti rispetto alla distanza dall'origine (dal più vicino al più lontano). Infine visualizzarli su monitor e salvarli (un punto per riga) in un file il cui nome va anchesso richiesto da tastiera.

16 © Piero Demichelis 16 Esempio: punti nel piano Ad esempio se il file dei punti si chiama PUNTI.DAT e contiene: sul monitor dovrà apparire: Punto 1: , > Punto 2: , > Punto 3: , > Punto 4: , >

17 © Piero Demichelis 17 Esempio: punti nel piano #include #define NMAX 100 typedef enum {FALSO, VERO} boolean; struct modello { double x; double y; double dist; }; /* prototipo della funzione di riordinamento */ void bubble (struct modello punti[ ], int n)

18 © Piero Demichelis 18 Esempio: punti nel piano main() { FILE *input, *output; int i, j, np; char nomefile[20]; struct modello punti[NMAX]; /* Legge il nome del file */ printf (\nNome del file che contiene i punti: "); scanf ("%s", nomefile); /* Apre il file in lettura */ if ((input = fopen (nomefile,"r")) == NULL) { printf ("\nErrore apertura file %s", nomefile); exit (0); }

19 © Piero Demichelis 19 Esempio: punti nel piano np = 0; while (!feof (input)) { fscanf (input, "%lf%lf", &punti[np].x, &punti[np].y) punti[np].dist = sqrt (punti[np].x * punti[np].x + punti[np].y * punti[np].y); np++; } fclose (input); bubble (punti, np);

20 © Piero Demichelis 20 Esempio: punti nel piano /* Operazioni finali: chiede il nome del file di output e lo crea */ printf (\nNome del file di output: "); scanf ("%s", nomefile); if ((output = fopen (nomefile, w")) == NULL) { printf ("\nErrore creazione file %s", nomefile); exit (1); } /* visualizza la sequenza di punti sul monitor e la salva nel file */ for (i = 0; i < np; i++) { printf (\nPunto %3d: %9.4lf,%9.4lf %10.4lf", i+1, punti[i].x, punti[i].y, punti[i].dist); fprintf (output, \nPunto %3d: %9.4lf,%9.4lf %10.4lf", i+1, punti[i].x, punti[i].y, punti[i].dist); } fclose(output); }

21 © Piero Demichelis 21 Esempio: punti nel piano void bubble (struct modello punti[ ], int n) { struct modello provv; int ind; boolean ord; ord = FALSO; while (!ord) { ord = VERO; for (ind = 0; ind < n-1; ind++) if (punti[ind].dist > punti[ind+1].dist) { provv = punti[ind]; punti[ind] = punti[ind+1]; punti[ind+1] = provv; ord = FALSO; } }

22 © Piero Demichelis 22 Prenotazione di un teatro In un file POSTI.DAT è contenuta la disposizione dei posti a sedere di un teatro, rappresentata come una matrice. Il numero di posti a sedere nel teatro è di 50 file da 30 posti ciascuna. Inizialmente, tutti i posti del teatro sono liberi. Questo è rappresentato nel file da un valore 0 in corrispondenza di ogni posto. In un secondo file PRENOT.DAT è contenuta la sequenza delle richieste di prenotazione dei posti da parte dei clienti. Il numero di tali richieste NON è noto a priori. Le richieste nel file sono specificate secondo il seguente formato: numero_fila numero_posto Le file ed i posti sono numerati a partire da 1.

23 © Piero Demichelis 23 Prenotazione di un teatro Scrivere un programma C che, dopo aver letto il primo file, processi le richieste di prenotazione e scriva su schermo la situazione finale dei posti a sedere, nello stesso formato del primo file (si rappresenti con 1 il posto occupato). Nel processare le richieste, si deve tenere conto del fatto che alcune richieste possono essere duplicate, perché alcuni posti potrebbero essere richiesti più frequentemente. Il programma dovrà inolte fornire su schermo il numero di posti rimasti liberi e il numero di prenotazioni non andate a buon fine.

24 © Piero Demichelis 24 Prenotazione di un teatro Esempio: (matrice 5x5 per semplicità): POSTI.DAT PRENOT.DAT Output Numero prenotazioni fallite: 1

25 © Piero Demichelis 25 Prenotazione di un teatro #include #define POSTI "POSTI.DAT" #define PRENOT "PRENOT.DAT" #define NFILE 50 #define NCOL 30 main() { int teatro[NFILE][NCOL]; FILE *in, *out; int fi, co, i, j, liberi=0, nook=0;

26 © Piero Demichelis 26 Prenotazione di un teatro /* Apre il file contenente il teatro */ if ((in = fopen (POSTI, "r")) == NULL) { printf ("\nErrore apertura %s ", POSTI); exit (1); } /* Legge il file contenente il teatro (1=occupato, 0=libero) */ for (i = 0; i < NFILE; i++) for (j = 0; j < NCOL; j++) if (fscanf (in, "%d", &teatro[i][j]) != 1) { printf ("\nErrore lettura fila %d, posto %d\n", i+1, j+1); exit (2); } fclose (in);

27 © Piero Demichelis 27 Prenotazione di un teatro /* Apre il file delle prenotazioni */ if ((in = fopen (PRENOT, "r")) == NULL) { printf ("\nErrore apertura %s ", PRENOT); exit (3); } /* Legge le prenotazioni: a ogni lettura controlla se il posto è libero o no. Se libero lo occupa se già occupato lo segnala sul monitor */ i = 0; while (!feof (in)) { if (fscanf (in, "%d %d", &fi, &co) != 2) { printf ("\nErrore lettura prenotazione numero %d\n", i+1); exit (4); }

28 © Piero Demichelis 28 Prenotazione di un teatro i++; /* conta le righe per leventuale output derrore */ if (teatro [fi-1][co-1] == 0) /* posto libero? */ teatro [fi-1][co-1] = 1; /* si, lo occupa */ else { printf ("Posto num. %d della fila %d già prenotato\n", co, fi); nook++; } } /* fine di while (!feof(in))……..*/ fclose (in);

29 © Piero Demichelis 29 Prenotazione di un teatro /* Operazioni finali: apre POSTI.DAT per salvare la nuova situazione prenotazioni: segnala prenotazioni mancate e posti liberi */ if ((out = fopen (POSTI, "w")) == NULL) { printf ("\nErrore apertura %s", POSTI); exit (5); } printf ("\nSituazione prenotazioni:\n"); for (i = 0; i < NFILE; i++) { for (j = 0; j < NCOL; j++) { printf ("%2d", teatro[i][j]); /* Visualizza sul monitor la situazione */ fprintf (out, "%2d", teatro[i][j]); /* Salva in la situazione nel file */ }

30 © Piero Demichelis 30 Prenotazione di un teatro /* Fine riga su monitor e nel file */ printf ("\n"); fprintf (out, "\n"); } fclose (out); printf("\nNumero di prenotazioni non esaudite: %d\n", nook); /* Conta il numero di posti liberi */ for (i = 0; i < NFILE; i++) for ( j = 0; j < NCOL; j++) if (teatro[i][j] == 0) liberi++; printf ("Numero posti liberi: %d\n", liberi); }


Scaricare ppt "INFORMATICA Esercizi. © Piero Demichelis 2 Esempio: giorni nellanno Realizzare un programma che legga da tastiera lanno di riferimento e la sigla del."

Presentazioni simili


Annunci Google