Correzione prova pratica del 9 luglio 2003
Correzione prova pratica del 9 luglio 2003
Istruzioni:
il commento iniziale rappresenta il giudizio complessivo sul programma. Nei commenti trovate:
- FIXME: segnalazione di un errore, non necessariamente sono tutti segnalati e non necessariamente sono tutti presi in considerazione
per il voto finale
- TODO: segnala l'assenza di parti di codice
- XXX: segnala qualcosa di non chiaro o inutile ai fini del codice, commenti di ordine generale, errori di battitura o suggerimenti
Il codice presentato non è necessariamente identico a quello consegnato in quanto possono essere state effettuate modifiche per
renderlo compilabile e/o per la corretta indentazione.
//XXX (7.5) lettura file corretta anche se farraginosa, controllo con errori semantici
/* autore oliviero carlo matricola 150878 090703- CARLO.OLIVIERO@LIBERO.IT
esame di fondamenti di informatica,corso di laurea in ingegneria */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX 10
#define DIM 2
/*costruisco una struttura per ricevere i valori di x e o */
struct elemento {int valr;
int valc;
};
int mat[DIM][DIM]; //FIXME dimensioni della matrice sbagliate
int controllo(void);
main()
{struct elemento tris[MAX];
int i,j,flag,finito,rig,col;
char c,buf[DIM];
FILE *fp;
fp=fopen("tris.txt","r");
if(fp==NULL){printf("Si e verificato un errore nell'apertura del file");
return 0;
}
i=0; j=0; flag=0;
/* inizio il ciclo per l'acquisizione dei dati dal file
e li carico in una struttura tris */
while((c=fgetc(fp))!=EOF){
if(isdigit(c) && flag==0)
{buf[i]=c;
i++;
buf[i]='\0';
flag=1;
tris[j].valr=atoi(buf);
i=0;
}
else if(isdigit(c) && flag==1)
{buf[i]=c;
i++;
buf[i]='\0';
flag=0;
tris[j].valc=atoi(buf);
j++;
i=0;
}
} //FIXME questa parte si risolveva con un unica fscanf() all'interno del while
fclose(fp);
/*inizializzo la matrice ad un valore differente da quelli che
usero*/
for(rig=0;rig<=DIM;rig++)
for(col=0;col<=DIM;col++)
mat[rig][col]=2;
flag=0; finito=0; i=0;
/* finche leggo valori li carico nella matrice
dove 1 rappresenta la x ed 0 la o*/
while( i<j)
{ if(flag==0)
{rig=tris[i].valr; //FIXME alcune istruzioni potevano essere portate fuori dai blocchi if/else
col=tris[i].valc;
mat[rig][col]=1;
i++; flag=1;
}
else if(flag==1)
{rig=tris[i].valr;
col=tris[i].valc;
mat[rig][col]=0;
flag=0;
i++;
}
}
/* una volta acquisiti i dati chiamo la funzione controllo
se mi restituisce -1- allora vince x se mi restituisce 2
allora vince -o- altrimenti con 0 partita patta */
finito=controllo();
if(finito==0)
printf("partita patta");
else if(finito==1)
printf("partita vinta da x");
else
printf("partita vinta da 0");
}
/* funzione di controllo */
int controllo(void)
{int rig,col,flag,i;
/* controllo righe */
col=0;
for(rig=0;rig<=DIM;rig++)
if(mat[rig][col]==mat[rig][col+1]==mat[rig][col+2]) //FIXME mi dispiace ma le condizioni in C non si fanno cosi' (neanche in c++)
{if(mat[rig][col]==1)
flag=1;
else
flag=2;
return (flag);
}
/*controllo colonne */
rig=0;
for(col=0;col<=DIM;col++)
if(mat[rig][col]==mat[rig+1][col]==mat[rig+2][col])
{if(mat[rig][col]==1)
flag=1;
else
flag=2;
return (flag);
}
/*controllo diagonale */
rig=0; col=0;
if(mat[rig][col]==mat[rig+1][col+1]==mat[rig+2][col+2]) //FIXME a cosa servono rig e col qui?
{if(mat[rig][col]==1)
flag=1;
else
flag=2;
return (flag);
} //FIXME e l'altra diagonale?
return 0;
}
Se avete commenti o osservazioni su questa pagina
mandate un messaggio di posta elettronica a
bertozzi@CE.UniPR.IT