Sei sulla pagina 1di 5

Informatica 13/07/2012

Nome e Cognome
Matricola

Programmazione
Si realizzi un programma strutturato in linguaggio C che permetta di gestire le statistiche di una
partita di calcio. Le informazioni sono contenute in un file il cui nome viene passato da linea di
comando. Tale file contiene, uno per riga e separati da spazi: nome e cognome del giocatore, ruolo,
chilometri percorsi, passaggi completati, tiri effettuati, goal fatti, falli fatti e falli subiti. Ad
esempio, il file pu contenere:
!"#$%&'%(($&)$*+,(%#+&-./&-0&1&1&20&0&
345"&6+#)$&)$*+,(%#+&7.8&01&2&1&/1&21&
9,)#+"&:$",5;$&5+,<#%5"=>$(<"&8.?&@1&0&2&-&0&
A"B#$C$%&D",<","&"<<"55",<+&7.1&/0&0&2&E&/1&
34$F$&G"HH")$,%&>%#<$+#+&1.0&/0&1&1&1&?&
Si facciano le seguenti assunzioni:
Il numero di righe del file non pu essere maggiore di 14
I campi I%=+ e J%F,%=+ sono lunghi al pi 30 caratteri e non possono contenere spazi
Il ruolo pu essere: portiere, difensore, centrocampista o attaccante
I chilometri percorsi sono rappresentati come numeri reali con la precisione di una cifra
decimale
I restanti valori sono rappresentati come valori interi.
Il programma pu ricevere da linea di comando uno dei seguenti parametri:
1. il flag "-a" e una stringa di caratteri che indica il cognome di un giocatore (si supponga non
ci siano omonimie); in questo caso, il programma deve restituire a video tutte le statistiche
relative al giocatore specificato.
2. il flag -b e una stringa di caratteri che indica un ruolo; in questo caso, il programma deve
restituire le statistiche di tutti i calciatori che giocano in quel ruolo.
3. il flag "-c"; in questo caso, il programma deve visualizzare l'indicazione di tutti i giocatori
che hanno fatto il massimo numero di goal.
Esempio, se il file dell'esempio precedente, contenente i risultati della gara, si chiama
(<"<$(<$5;+.<K<:
JLMN&>#%F.+K+&(<"<$(<$5;+.<K<&O"&6+#)$&
l'output del programma dovr essere il seguente:
345"&6+#)$L&P=&7.8Q&>"(("FF$&01Q&<$#$&2Q&F%"H&1Q&*"HH$&*"<<$&/1Q&*"HH$&(4B$<$&21&
oppure:
JLMN&>#%F.+K+&(<"<$(<$5;+.<K<&OB&)$*+,(%#+&
l'output del programma dovr essere il seguente:
!"#$%&'%(($L&P=&-./Q&>"(("FF$&-0Q&<$#$&1Q&F%"H&1Q&*"HH$&*"<<$&20Q&*"HH$&(4B$<$&0&
345"&6+#)$L&P=&7.8Q&>"(("FF$&01Q&<$#$&2Q&F%"H&1Q&*"HH$&*"<<$&/1Q&*"HH$&(4B$<$&21&
&
%>>4#+L&&
&
JLMN&>#%F.+K+&(<"<$(<$5;+.<K<&O5&
l'output del programma dovr essere il seguente:
9,)#+"&:$",5;$&5+,<#%5"=>$(<"&2&F%"H&
A"B#$C$%&D",<","&"<<"55",<+&2&F%"H

So120903_TurnoA_A.c

07/06/13 11.31

/* Soluzione Tema d'esame Informatica del 3/9/2012, Turno A, Vers. A


*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NOME 20
#define MAX_GIOCATORI 15
#define MAX_NOME_FILE 30
#define NON_PRESENTE -2
typedef struct
{
char nome[MAX_NOME+1];
char cognome[MAX_NOME+1];
char ruolo[MAX_NOME+1];
float kilometri;
int passaggi;
int tiri;
int goal;
int falli_fatti;
int falli_subiti;
}tipo_giocatore;
void stampatutto(tipo_giocatore basedati[],int num_elem);
int trova_cognome(tipo_giocatore basedati[],int num_elem,char str[]);
void trova_stampa_ruolo(tipo_giocatore basedati[],int num_elem,char str[]
);

int main(int argc,char*argv[])


{
tipo_giocatore giocatore[MAX_GIOCATORI];
FILE *filein;
char nomefile[MAX_NOME_FILE];
int i;
int num_dati;
int errore;
char cognome[MAX_NOME+1];
char ruolo[MAX_NOME+1];
char comando;
int ind_giocatore;

if(argc>2)
strcpy(nomefile,argv[1]);
else
{
printf("Introduci nome file\n");
scanf("%s",nomefile);
getchar();
}

Page 1 of 4

So120903_TurnoA_A.c

07/06/13 11.31

if((filein=fopen(nomefile,"r"))==NULL)
{
printf("Errore , file non trovato\n");
exit(EXIT_FAILURE);
}
i=0;
while((fscanf(filein,"%s%s%s%f%d%d%d%d%d",giocatore[i].nome,giocatore[i].
cognome,giocatore[i].ruolo
,&giocatore[i].kilometri,&giocatore[i].passaggi,&giocatore[i
].tiri,&giocatore[i].goal
,&giocatore[i].falli_fatti,&giocatore[i].falli_subiti)!=EOF)
&&i<MAX_GIOCATORI)
i++;
num_dati=i;
fclose(filein);
if(argc<3)
{
errore=1;
while(errore)
{
errore=0;
printf("Introduci il comando [a/b/c] e il parametro del comando
[cognome/ruolo/NULLA]\n");
scanf("%c",&comando);
switch(comando)
{
case 'a':
case 'A':
scanf("%s",cognome);
break;
case 'b':
case 'B':
scanf("%s",ruolo);
break;
case 'c':
case 'C':
break;
default:
printf("Errore, riprova\n");
errore=1;
}
while(getchar()!='\n');
}
}
else
{
switch(comando=argv[2][1])
{
case 'a':
case 'A':
if(argc==4)

Page 2 of 4

So120903_TurnoA_A.c

07/06/13 11.31

strcpy(cognome,argv[3]);
else
{
printf("Errore manca il nome\n");
exit(EXIT_FAILURE);
}
break;
case 'b':
case 'B':
if(argc==4)
strcpy(ruolo,argv[3]);
else
{
printf("Errore manca il ruolo\n");
exit(EXIT_FAILURE);
}
break;
case 'c':
case 'C':
break;
default:
printf("Comando sconosciuto");
exit(EXIT_FAILURE);
}
}
switch(comando)
{
case 'c':
case 'C':
stampatutto(giocatore,num_dati);
break;
case 'a':
case 'A':
if((ind_giocatore=trova_cognome(giocatore,num_dati,cognome))!=
NON_PRESENTE)
printf("%s %s :\n%s, km %2.2f, passaggi %d, tiri %d, goal %d
\nfalli fatti %d, falli subiti %d\n"
,giocatore[ind_giocatore].nome,giocatore[ind_giocatore
].cognome
,giocatore[ind_giocatore].ruolo,giocatore
[ind_giocatore].kilometri
,giocatore[ind_giocatore].passaggi,giocatore
[ind_giocatore].tiri
,giocatore[ind_giocatore].goal,giocatore[ind_giocatore
].falli_fatti
,giocatore[ind_giocatore].falli_subiti);
else
printf("Giocatore non presente\n");
break;
case 'b':
case 'B':
trova_stampa_ruolo(giocatore,num_dati,ruolo);
}
return EXIT_SUCCESS;
}

Page 3 of 4

So120903_TurnoA_A.c

07/06/13 11.31

void stampatutto(tipo_giocatore giocatore[],int num_elem)


{
int i;
for(i=0;i<num_elem;i++)
printf("%s %s :\n%s, km %2.2f, passaggi %d, tiri %d, goal %d\
nfalli fatti %d, falli subiti %d\n",giocatore[i].nome,
giocatore[i].cognome,giocatore[i].ruolo
,giocatore[i].kilometri,giocatore[i].passaggi,giocatore[i].
tiri,giocatore[i].goal
,giocatore[i].falli_fatti,giocatore[i].falli_subiti);
return;
}

int trova_cognome(tipo_giocatore basedati[],int num_elem,char str[])


{
int ind;
int i;
ind=NON_PRESENTE;
for(i=0;i<num_elem;i++)
if(strcmp(basedati[i].cognome,str)==0)
ind=i;
return ind;
}
void trova_stampa_ruolo(tipo_giocatore giocatore[],int num_elem,char str
[])
{
boolean presente;
int i;
presente=FALSO;
for(i=0;i<num_elem;i++)
if(strcmp(giocatore[i].ruolo,str)==0)
{
printf("%s %s :\n%s, km %2.2f, passaggi %d, tiri %d, goal %d
\nfalli fatti %d, falli subiti %d\n",giocatore[i].nome,
giocatore[i].cognome,giocatore[i].ruolo
,giocatore[i].kilometri,giocatore[i].passaggi,giocatore[i].
tiri,giocatore[i].goal
,giocatore[i].falli_fatti,giocatore[i].falli_subiti);
presente=VERO;
}
if(!presente)
printf("Nessuno giocatore ha il ruolo spacificato, oppure non
esiste\n");
return;
}

Page 4 of 4