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: 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