Esercizio 1: Puntatori impiegati che sono manager

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Esercizio 1: Puntatori impiegati che sono manager"

Transcript

1 Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 10 Esercitazione: 25 gennaio 2006 Esercizi di riepilogo Problema: Esercizio 1: Puntatori impiegati che sono manager Si considerino le seguenti definizioni di tipo: // definizione del tipo boolean typedef enumfalse, true boolean; // definizione del tipo Impiegato typedef struct Impiegato; Stringa nome; Stringa cognome; int eta; boolean ismanager; // Manager (1) oppure no (0) // definizione del tipo ArchImpiegati typedef struct Impiegato impiegati[num_max]; int numimpiegati; ArchImpiegati; // definizione del tipo 'puntatore a impiegato' typedef Impiegato *PImpiegato; Si sviluppi un programma che: - legga NUM_IMPIEGATI da tastiera e li inserisca in una variabile di tipo ArchImpiegati. - assegni a un array di puntatore a impiegato (cioè, gli elementi dell array sono di tipo Pimpiegato) gli indirizzi degli impiegati che SONO anche manager. - stampi a video, iterando sull array di cui sopra, i dettagli di tutti gli impiegati che sono anche manager. Soluzione: #include <stdio.h> // lunghezza massima di una stringa # define LENGTH 30 // numero massimo di impiegati in archivio # define NUM_MAX 5 // definizione del tipo Stringa typedef char Stringa[LENGTH]; - 1 -

2 // definizione del tipo boolean typedef enumfalse, true boolean; // definizione del tipo Impiegato typedef struct Impiegato; Stringa nome; Stringa cognome; int eta; boolean ismanager; // definizione del tipo ArchImpiegati typedef struct Impiegato impiegati[num_max]; int numimpiegati; ArchImpiegati; // definizione del tipo 'puntatore a impiegato' typedef Impiegato *PImpiegato; // prototipo procedura initarchivio void initarchivio(archimpiegati *archivio); // prototipo procedura stampaimpiegatiarchivio void stampaimpiegatiarchivio(archimpiegati archivio); // prototipo funzione trovamanager int trovamanager(archimpiegati archivio, PImpiegato array[]); // prototipo procedura stampamanager void stampamanager(pimpiegato array[], int dim); void main() ArchImpiegati archivio; // archivio di impiegati PImpiegato arrayimp[num_max]; // array di puntatori a impiegati int contmanager; // lettura di tutti gli impiegati da standard input initarchivio(& archivio); // stampa a video di tutti gli impiegati in archivio stampaimpiegatiarchivio(archivio); // ritrovamento di tutti gli impiegati contmanager = trovamanager(archivio, arrayimp); // stampa dei soli manager (usando l'array di puntatori) stampamanager(arrayimp, contmanager); // fine main // definizione della procedura initarchivio void initarchivio(archimpiegati *archivio) - 2 -

3 int i; // numero degli impiegati da inserire in archivio printf("numero impiegati in archivio?"); scanf("%d", &archivio->numimpiegati); // lettura degli impiegati in archivio for (i=0; i<archivio->numimpiegati; i++) printf(" inserisci impiegato %d \n\n", (i+1)); printf("\n Nome:"); scanf("%s", archivio->impiegati[i].nome); printf("\n Cognome:"); scanf("%s", archivio->impiegati[i].cognome); printf("\n Età:"); scanf("%d", &archivio->impiegati[i].eta); printf("\n Manager (1) oppure no (0):"); scanf("%d", &archivio->impiegati[i].ismanager); // definizione procedura stampaimpiegatiarchivio void stampaimpiegatiarchivio(archimpiegati archivio) printf("\n\n\n\n"); int i; // scrittura degli impiegati in archivio su standard output (tutti) for (i=0; i<archivio.numimpiegati; i++) printf("impiegato %d ", (i+1)); printf("nome: %s cognome: %s eta: %d manager (si=1, no=0) %d", archivio.impiegati[i].nome, archivio.impiegati[i].cognome, archivio.impiegati[i].eta, archivio.impiegati[i].ismanager); // definizione funzione trovamanager int trovamanager(archimpiegati archivio, PImpiegato array[]) int cont = 0; int i; for (i=0; i<archivio.numimpiegati; i++) if (archivio.impiegati[i].ismanager == 1) array[cont] = &archivio.impiegati[i]; cont++; return cont; // torna il numero di elementi nell'array, cioè il numero dei manager // definizione procedura stampamanager void stampamanager(pimpiegato array[], int dim) int i; printf("numero di manager: %d ", dim); - 3 -

4 for (i=0; i<dim; i++) printf("\n\n-- Dati Manager:--"); printf("nome: %s ", array[i]->nome); printf("cognome: %s ", array[i]->cognome); printf("eta: %d ", array[i]->eta); Esercizio 2: Liste inserisci in coda ricorsiva Problema: Codificare l algoritmo ricorsivo di inserimento in coda a una lista. Vengono fornite le seguenti definizioni di tipo: typedef struct int a; int b; TipoDato; typedef enum falso, vero boolean; typedef struct El TipoDato d; struct El *next; ElemLista; typedef ElemLista *Lista; Soluzione: void inserisciincodaric(lista *l, TipoDato dato) Lista punt; // se lista è vuota allora inserire in coda è come inserire in testa if (listavuota(*l) == vero) punt = malloc(sizeof(elemlista)); punt->next = NULL; punt->d = dato; *l = punt; // oppure, senza fare queste quattro istruzioni, all'interno di questo ramo if è possibile chiamare // direttamente la inserisciintesta(l, dato); else inserisciincodaric(&((*l)->next), dato); - 4 -

5 Problema: Esercizio 3: File ricerca di una parola in un file di testo Dato un file F1 si realizzi un programma che, acquisita una parola P da standard input, ricerchi P all interno del file dato e stampi sul dispositivo standard di output il numero delle occorrenze di P nel file F1. Per ogni ricerca eseguita sul file F1, il programma deve salvare la storia delle ricerche eseguite su un altro file F2. Ad esempio, nel caso della ricerca della parola Pippo sul file F1 dia come risultato 15 occorrenze, il programma deve scrivere sul file F2 la seguente stringa: Ricerca di Pippo. Numero occorrenze: 15. Si vuole inoltre che il file F2 dia traccia di tutte le ricerche eseguite dal programma, anche quelle effettuate in esecuzioni passate del programma stesso. Soluzione: #include <stdio.h> #include <string.h> #define MAX 80 /* ricerca di parole in un file di testo */ typedef char stringa[max]; void main() FILE *f1; FILE *f2; char nomef1[10]; char nomef2[10]; // nome del file in cui ricercare la parola // nome del file in cui memorizzare le ricerche eseguite stringa P, S; int cont=0; printf("inserire il nome del file: "); scanf("%s", nomef1); f1=fopen(nomef1, "r"); if (f1==null) printf("errore nell'apertura del file!\n"); else // apertura in modalità append, in quanto il file tiene traccia // anche di ricerche eseguite in precedenza

6 printf("inserire il nome del file su cui memorizzare le ricerche: "); scanf("%s", nomef2); f2 = fopen(nomef2, "a"); if (f2==null) printf("errore nell'apertura del file per mantenere le ricerche"); fclose(f1); else printf("\nquale parola si vuole ricercare? "); scanf("%s", P); fscanf(f1, "%s", S); while (!feof(f1)) if (strcmp(s,p)==0) printf("\nho trovato %s!\n",p); cont++; fscanf(f1, "%s", S); printf("il numero di occorrenze di %s e` %d.\n", P, cont); // scrittura anche su file f2 della ricerca effettuata, per poterne tener traccia fprintf(f2, "Ricerca di %s. Numero occorrenze: %d\n", P, cont); if (ferror(f2) == 1) printf("errore durante tentativo di memorizzazione della ricerca effettuata"); if (fclose(f1)!=0) printf( Errore nella chiusura del file f1 ); if (fclose(f2)!=0) printf( Errore nella chiusura del file f2 ); Esercizio 4: File ricerca e stampa di dati anagrafici presenti su file di testo Problema: Scrivere un programma che legga da un file di testo ("dati.txt") dei dati su persone (vedi oltre) e visualizzi soltanto quelli relativi a persone con un'età compresa tra emin ed emax (lette da terminale). Il tipo persona è definito come segue: - 6 -

7 typedef struct char cognome[20]; char nome[20]; int eta; persona; Si supponga che i dati siano memorizzati per righe, con i campi separati da spazi; per esempio: Rossi Mario 57 Bianchi Fausto 45 Neri Bruno 26 Soluzione: #include <stdio.h> #include <stdlib.h> typedef struct char cognome[20]; char nome[20]; int eta; persona; void main() FILE *fp; int emin,emax; persona p; if ((fp=fopen("dati.txt","r")) == NULL) printf("errore nell'apertura del file"); else printf("\neta' minima: "); scanf("%d",&emin); printf("\neta' massima: "); scanf("%d",&emax); while (fscanf(fp,"%s%s%d",p.cognome,p.nome,&p.eta) > 0) if (p.eta >= emin && p.eta <=emax) printf("\n%s\t%s\t%d",p.cognome,p.nome,p.eta); if (fclose(fp)!= 0) printf("errore nella chiusura del file"); - 7 -

8 - 8 -

Esercizio 1 File: ordinamento di un archivio di studenti (file binario)

Esercizio 1 File: ordinamento di un archivio di studenti (file binario) Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 9 Esercitazione: 19 gennaio 2005 Esercizi sui file e sulle liste. Scaletta Esercizio 1 File: ordinamento di un archivio

Dettagli

Esercizio 1 Liste: calcolo del numero di elementi ripetuti in una lista

Esercizio 1 Liste: calcolo del numero di elementi ripetuti in una lista Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 11 Esercitazione: 27 gennaio 2005 Esercizi su liste, ricorsione, file. Scaletta Esercizio 1 Liste: calcolo del numero di

Dettagli

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Esercizio 1: funzione con valore di ritorno di tipo puntatore Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 7 Esercitazione: 14 dicembre 2005 Esercizi su ricorsione, manipolazione stringhe, strutture dinamiche Problema: Esercizio

Dettagli

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length); Fondamenti di Informatica L-A (A.A. 004/005) - Ingegneria Informatica Prof.ssa Mello & Prof. Bellavista I Prova Intermedia del 11/11/004 - durata h - COMPITO B Esercizio 1 (punti 1) Una associazione di

Dettagli

Esercizio 1 Liste: calcolo perimetro di un poligono

Esercizio 1 Liste: calcolo perimetro di un poligono Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 12 Esercitazione: 28 gennaio 2005 Esercizi su liste, ricorsione, file. Scaletta Esercizio 1 Liste: calcolo perimetro di

Dettagli

Informatica 1. Prova di recupero 21 Settembre 2001

Informatica 1. Prova di recupero 21 Settembre 2001 Informatica 1 Prova di recupero 21 Settembre 2001 Si risolvano i seguenti esercizi. Ai fini della determinazione del voto finale il loro punteggio andrà sommato al punteggio del laboratorio. Il tempo complessivo

Dettagli

acquisizione numero elementi del primo insieme e del secondo insieme, finché elprimoinsieme oppure elsecondoinsieme > EL_INS

acquisizione numero elementi del primo insieme e del secondo insieme, finché elprimoinsieme oppure elsecondoinsieme > EL_INS Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 3 Esercitazione: 20 ottobre 2004 Esercizi su array e applicazione delle regole di conversione di tipo Esercizi presenti:

Dettagli

Esercitazione 11. Liste semplici

Esercitazione 11. Liste semplici Esercitazione 11 Liste semplici Liste semplici (o lineari) Una lista semplice (o lineare) è una successione di elementi omogenei che occupano in memoria una posizione qualsiasi. Ciascun elemento contiene

Dettagli

Strutture Dinamiche. Fondamenti di Informatica

Strutture Dinamiche. Fondamenti di Informatica Strutture Dinamiche Fondamenti di Informatica 1 Indice Allocazione e de-allocazione di memoria Liste e loro gestione Companies, srl 2 Allocazione e cancellazione di memoria malloc (sizeof (TipoDato));

Dettagli

Esercitazione 6. Array

Esercitazione 6. Array Esercitazione 6 Array Arrays Array (o tabella o vettore): è una variabile strutturata in cui è possibile memorizzare un numero fissato di valori tutti dello stesso tipo. Esempio int a[6]; /* dichiarazione

Dettagli

Laboratorio di Programmazione

Laboratorio di Programmazione Laboratorio di Programmazione (Laurea triennale in matematica) Lezione 21 Strutture dinamiche Gli array ci permettono di memorizzare un insieme di dati dello stesso tipo Deve essere noto staticamente il

Dettagli

Esercizio 1 (15 punti)

Esercizio 1 (15 punti) Esercizio 1 (15 punti) Corsi di laurea in Ingegnera Elettronica e Ingegneria Gestionale Fondamenti di Programmazione / Fondamenti di Informatica I Prova scritta del 16 giugno 2017 Il noto gioco MasterMind

Dettagli

Programmazione I - Laboratorio

Programmazione I - Laboratorio Programmazione I - Laboratorio Esercitazione 6 - Liste Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti di.unipi.it 2. Dipartimento

Dettagli

Esercizi. Stringhe. Stringhe Ricerca binaria

Esercizi. Stringhe. Stringhe Ricerca binaria Politecnico di Milano Esercizi Stringhe Stringhe Array di caratteri Funzioni: strcpy() strcmp() strlen() char stringaa[10], stringab[10]; strcpy(stringaa, stringab); Copia if (strcmp(stringaa, stringab)

Dettagli

È dato un file di testo PEOPLE.TXT che più di 20), una persona per riga

È dato un file di testo PEOPLE.TXT che più di 20), una persona per riga Esercizio i 1: Strutture tt e file Esercizio - lettura/filtro/scrittura È dato un file di testo PEOPLE.TXT che contiene i dati di una serie di persone (non più di 20), una persona per riga Si vuole realizzare

Dettagli

Scrittura formattata - printf

Scrittura formattata - printf Esercizi su Input/Output con formato FormattedIO 1 Scrittura formattata - printf Funzione printf int printf ( , ) La funzione restituisce un valore intero uguale ai caratteri

Dettagli