INFORMATICA Esercizi.

Slides:



Advertisements
Presentazioni simili
INFORMATICA Altre Istruzioni di I/O
Advertisements

INFORMATICA Algoritmi fondamentali
1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.
Esercitazioni If nidificati
INFORMATICA Strutture condizionali
Uso avanzato di C.
Nel C non esiste un dato primario di tipo stringa; queste sono rappresentate con un array monodimensionale di caratteri (tipo char). Così per definire.
/ fax
Calcolo del minimo comune multiplo (m.c.m.) Luigi Sante
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
Iterazione A. Ferrari.
Sviluppo di programmi strutturati
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
Introduzione al linguaggio C
Introduzione al linguaggio C Dr. Francesco Fabozzi Corso di Informatica.
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
INFORMATICA typedef.
ESERCITAZIONE N. 5 ESERCIZIO N. 1 Autore: Biagio Brattoli S I Corso.
INFORMATICA Strutture iterative
Corso di Fondamenti di programmazione a.a.2009/2010
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Algoritmi Politecnico di Milano
Algoritmi Politecnico di Milano C Primi programmi Politecnico di Milano.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 2 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algoritmi e basi del C Marco D. Santambrogio – Ver. aggiornata al 3 Ottobre 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Tipi di dati strutturati Marco D. Santambrogio – Ver. aggiornata al 4 Marzo 2013.
La settimana nellorologio Lorologio puó essere usato anche per contare i giorni della settimana. a.Dividete lorologio in 7 parti e scrivete invece delle.
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
Esercizio: Copiare un file in un nuovo file mediante le funzioni read e write.
Struct, enum, Puntatori e Array dinamici
Strutture di controllo nel C
Strutture di controllo in C -- Flow Chart --
Esercizi C sui tipi definiti dall’utente
Politecnico di Milano Esercizi Stringhe Ricerca binaria.
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
Esercizi C su array e matrici
Le funzioni.
Febbraio L'intelletto cerca, il cuore trova. George Sand clipartmicrosoft 30 Gen Lun 31 Gen Mar 1 Feb Mer 2 Feb Gio 3 Feb Ven.
Calcolo del Massimo Comun Divisore
Piero Scotto - C141 C14 #6 I VETTORI (#define e const)
Equazione di secondo grado.
Piero Scotto - C141 C14 #09 Gestione stringhe: esercizio. Switch case. Variabili logiche.
Massimo Comun Divisore
14 marzo 2002 Avvisi:.
Esercizi su File.
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
1 Esempi domande di esame. 2 Dato il seguente programma #include int main(){ int *p,j=9,i=5; p=&j; *p=i; printf("%d %d %d\n", i,j,*p); scanf("%d",p);/*
STRUTTURA DEL CORSO Conferimento Titolo LEZIONI FRONTALI STAGE PROJECT WORK W.E. / C.I. 466 ore 450 ore 174 ore Studio individuale + Studio assistito.
GLI ARRAY MONODIMENSIONALI. Utilizzando le nostre attuali conoscenze, proviamo a risolvere il seguente problema: Calcolare la media dei voti conseguiti.
lun mar mer gio ven SAB DOM FEBBRAIO.
Ripetizione La vera potenza dei programmi per computer risiede nella capacità di ripetere lo stesso calcolo o sequenza di istruzioni più volte, ogni volta.
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (II) Istruzioni e strutture di controllo.
Algoritmi e basi del C Struttura di un programma
Operatori di incremento e decremento
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (III)
Il diagramma cartesiano
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algoritmi e basi del C Marco D. Santambrogio – Ver. aggiornata al 24 Agosto 2015.
Polaris office su asus Eee Foglio elettronico icona17 funzioni data-ora e numeri seriali.
L’anno liturgico II parte.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array n-dimensionali e tipi di dati strutturati Marco D. Santambrogio – Ver. aggiornata.
Lavorare con le date Andrea Asta Scopo del progetto Vogliamo riuscire a creare un programma in grado di lavorare con le date, per simulare.
Gennaio 20.. LUNEDÌMARTEDÌMERCOLEDÌGIOVEDÌVENERDÌSABATODOMENICA.
L’Anno Liturgico.
Titolo della roadmap di prodotto
PRESENTAZIONE DATI OTTOBRE 2017 OSSERVATORIO - FCP ASSORADIO
PRESENTAZIONE DATI GENNAIO 2018 OSSERVATORIO - FCP ASSORADIO
PRESENTAZIONE DATI DICEMBRE 2017 OSSERVATORIO - FCP ASSORADIO
Transcript della presentazione:

INFORMATICA Esercizi

Esempio: giorni nell’anno Realizzare un programma che legga da tastiera l’anno di riferimento e la sigla del primo giorno di quell’anno (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 dell’anno, 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.

Esempio: giorni nell’anno 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

Esempio: giorni nell’anno 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 nell’indice corrispondente (di lì comincia l’anno). 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!

Esempio: giorni nell’anno #include <stdio.h>   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);

Esempio: giorni nell’anno /* 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! */

Esempio: giorni nell’anno /* 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 */ }

Esempio: giorni nell’anno /* 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 (data = 1; data <= dur_mese[mese]; data++) { occ[day][mese]++; day++; if (day == 7) day = 0; /* fine settimana, ricomincia dall’inizio */ }

Esempio: giorni nell’anno 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; ... */ }

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.

Esempio: codice 2 su 5 #include <stdio.h> void main() {   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 */

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; }

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 */

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);

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 anch’esso richiesto da tastiera.

Esempio: punti nel piano Ad esempio se il file dei punti si chiama PUNTI.DAT e contiene: 2 2 1 4 3 3 0 1 sul monitor dovrà apparire: Punto 1: 0.0000, 1.0000 -> 1.0000 Punto 2: 2.0000, 2.0000 -> 2.8284 Punto 3: 1.0000, 4.0000 -> 4.1231 Punto 4: 3.0000, 3.0000 -> 4.2426

Esempio: punti nel piano #include <stdio.h> #include <math.h> #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)

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); }

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);

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", } fclose(output); }

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; } }

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.

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.

Prenotazione di un teatro Esempio: (matrice 5x5 per semplicità):   POSTI.DAT PRENOT.DAT Output 0 0 0 0 0 1 2 0 1 1 1 0 0 0 0 0 0 1 3 0 1 1 0 1 0 0 0 0 0 1 4 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 2 3 0 0 0 0 0 2 5 2 2 Numero prenotazioni fallite: 1

Prenotazione di un teatro #include <stdio.h> #include <stdlib.h> #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;

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);

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);

Prenotazione di un teatro i++; /* conta le righe per l’eventuale output d’errore */   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);

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 */

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);