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