Fondamenti di Informatica
Transcript
Fondamenti di Informatica
Fondamenti di Informatica L-A - Ing. Gestionale/Processi Gestionali Prof. Penzo Soluzione compito B del 23/03/2005 Esercizio 1 Il programma inizializza due vettori V e W di 5 interi con i valori indicati nel testo. Il programma richiama la procedura M5 con parametri attuali i vettori V e W, e la loro dimensione N=5, in corrispondenza dei parametri formali A, B e n. Il controllo passa alla procedura M5 che esegue un ciclo, esaminando il vettore A, e trasferendo gli elementi maggiori o uguali a 5 nel vettore B. Per ogni elemento trasferito, il vettore A viene compattato, spostando a sinistra di una posizione gli elementi rimanenti e completando l’ultimo elemento del vettore con il valore zero. Al termine della procedura il vettore A conterrà solo gli elementi con valore minore di 5, mentre il vettore B conterrà gli elementi con valore maggiore o uguale a 5 originariamente presenti in A. Essendo i parametri attuali V e W passati per definizione per indirizzo in quanto vettori, questi verranno modificati come indicato per la procedura. Il main stamperà quindi le due seguenti sequenze: 3 2 4 0 0 8 5 0 0 0 Esercizio 2 #include<stdio.h> #include<string.h> #define MAXCALCOLATORI 500 typedef typedef typedef typedef enum{server, pc} tipoCalcolatore; enum{AS400, Windows, Linux} tipoSO; enum{operativo, quadro, dirigente, amministrativo} tipoMansione; enum{false, true} boolean; typedef struct{ int numInventario; tipoCalcolatore tipo; tipoSO sistemaOperativo; } calcolatore; typedef struct{ int codice; char nome[20]; char cognome[20]; int numInventarioCalc; char settore[30]; tipoMansione mansione; } utente; // prototipi delle funzioni int numUtentiPerMansione(char filename[], tipoMansione m); void generaFile(calcolatore C[], int numC, char fileServer[], char filePC[]); tipoSO sistemaOperativo(calcolatore C[], int numC, int numInv); void calcolatoriPerSettoreAziendale(char filename[], calcolatore C[], int numC, char s[], int *numA, int *numW, int *numL); void main(){ calcolatore CALCOLATORI[MAXCALCOLATORI]; int numC; // numero di elementi correnti nel vettore CALCOLATORI tipoMansione m; char mansione[20], settore[30]; boolean corretto=false; int n, numA, numW, numL; // punto a) do{ printf("Inserire la mansione (operativo, quadro, dirigente, amministrativo): "); gets(mansione); if(!strcmp(mansione,"operativo")){ m = operativo; corretto = true; } else if(!strcmp(mansione,"quadro")){ m = quadro; corretto = true; } else if(!strcmp(mansione,"dirigente")){ m = dirigente; corretto = true; } else if(!strcmp(mansione,"amministrativo")){ m = amministrativo; corretto = true; } } while(!corretto); n = numUtentiPerMansione("UTENTI.DAT", m); printf("Il numero di utenti con la mansione data e': %d\n",n); // punto b) printf("Inserire il settore aziendale: "); gets(settore); calcolatoriPerSettoreAziendale("UTENTI.DAT", CALCOLATORI, numC, settore, &numA, &numW, &numL); printf("Il numero di calcolatori AS400 e': %d\n", numA); printf("Il numero di calcolatori Windows e': %d\n", numW); printf("Il numero di calcolatori Linux e': %d\n", numL); } // punto 1) int numUtentiPerMansione(char filename[], tipoMansione m){ FILE *fp; utente u; int n=0; fp = fopen(filename,"rb"); if(fp != NULL){ fread(&u,sizeof(utente),1,fp); while(!feof(fp)){ if(u.mansione == m) n++; fread(&u,sizeof(utente),1,fp); } fclose(fp); } else printf("Errore di apertura file!"); return(n); } // punto 2) void generaFile(calcolatore C[], int numC, char fileServer[], char filePC[]){ FILE *fp1, *fp2; int i; fp1 = fopen(fileServer,"wt"); fp2 = fopen(filePC,"wt"); if(fp1!=NULL && fp2!=NULL){ for(i=0;i<numC;i++) if(C[i].tipo == server) fprintf(fp1,"%d\n",C[i].numInventario); else fprintf(fp2,"%d\n",C[i].numInventario); fclose(fp1); fclose(fp2); } else printf("Impossibile aprire entrambi i file!"); } // punto 3) tipoSO sistemaOperativo(calcolatore C[], int numC, int numInv){ int i=0; boolean trovato=false; tipoSO t; while(i<numC && !trovato){ if(C[i].numInventario == numInv){ trovato=true; t=C[i].sistemaOperativo; } } if(!trovato) printf("Calcolatore non trovato!"); return(t); } // punto 4) void calcolatoriPerSettoreAziendale(char filename[], calcolatore C[], int numC, char s[], int *numA, int *numW, int *numL){ FILE *fp; utente u; tipoSO t; *numA=0; *numW=0; *numL=0; fp = fopen(filename,"rb"); if(fp!=NULL){ fread(&u,sizeof(utente),1,fp); while(!feof(fp)){ if(!strcmp(u.settore,s)){ // l'utente appartiene al settore cercato t=sistemaOperativo(C,numC,u.numInventarioCalc); switch(t){ case(AS400): (*numA)++; break; case(Windows): (*numW)++; break; case(Linux): (*numL)++; } } fread(&u,sizeof(utente),1,fp); } } else printf("Errore di apertura file!"); }