Example #1
0
void jugar(int **tab)
{
    int i,j,pos;
    bool bandera = true;

    while(bandera)
    {
        printf("\nSeleccione la posicion i , j  separadas por un espacio\n");
        scanf("%d",&i);
        scanf("%d",&j);
        i -= 1;
        j -= 1;

        if(i<TAM && j< TAM && i>=0 && j>=0)
        {
            if((*tab)[posicion(i,j)]!=0)
                    printf("\nPosicion ocupada: Elije otra\n");
            else
            {
                (*tab)[posicion(i,j)] = O;
                bandera = false;
            }
        }
    }
}
void declaracionboolean() { //boolean variable := [true,false,0,1]
  int i;
  if (token==ident) {
    //ve a buscarlo a la tabla de símbolos
    i=posicion();
    if (i==0) {
      error(11); //error 11: identificador no declarado
    }
    else if (buscarElemento(i) -> tipo != VARIABLE)
      error(12); //error 12: no están permitidas las asignaciones a constantes o a procedimientos
    obtoken();
    if (token==asignacion) {
      //mejora del tipo "adivinación" de la intención del programador
      obtoken();
      switch(token){
      case truetok: break;
      case falsetok: break;
      default: error(40); break; //No coinciden tipos
      }
      obtoken();
      if(token == puntoycoma){
        obtoken();
      }else{
        error(5); //punto y coma
      }
    }
    else
      error (3) ; //error 3: el identificador debe ir seguido de ":=" 
  }
  else
    error(4) ; //error 4: Boolean, Const, Var y Procedure deben ir seguidos de un identificador
}
//declaracionconst
//se checa que se tenga una definición de constante. si está bien
//el identificador se pone en la tabla de símbolos, otro caso
//el programador cometió un error al construir la definición de constante
void declaracionconst() {
  int i;
  if (token==ident) {
    i=posicion();
    if (i!=0) {
      error(41); //error 11: No se deben redefinir objetos
    }

    obtoken();
    if ( (token==igl) || (token==asignacion) ) {
      //mejora del tipo "adivinación" de la intención del programador
      if (token==asignacion) 
        error(1); //error 1: usar '=" en vez de ":=". es la misma técnica que en C & C++ se usa para if (x=) por if (x==)
      obtoken();
      if (token == entero || token == real) {
        poner(CONSTANTE);
        obtoken();
      }
      else
        error(2) ; //error 2: debe ir seguido de un número
    }
    else
      error (3) ; //error 3: el identificador debe ir seguido de "=" 
  }
  else
    error(4) ; //error 4: Const, Var y Procedure deben ir seguidos de un identificador
}
Example #4
0
//factor
void factor()
{
 int i;
 if (token==ident) {
    i=posicion();
    if (i==0) 
       error(11); //error 11: Identificador no declarado
    else
       if (tabla[i].tipo==PROCEDIMIENTO)
	      error(21); //error 21: Una expresión no debe contener un identificador de procedimiento
	obtoken();
 }
 else 
    if (token==entero || token == real) 
       obtoken();
    else
       if (token==parena) {
          obtoken();
          expresion();
		  if (token==parenc)
             obtoken();
          else
             error(22); //error 22: Falta un paréntesis de cierre  
       }
	   else 
		  error(23); //error 23: El factor anterior no puede ir seguido de este símbolo 
}
Example #5
0
void imprimir(int **tab)
{
    int i, j;
    for(i=0; i<TAM; i++)
    {
        printf("\n");
        for(j=0; j<TAM; j++)
        {
            if((*tab)[posicion(i,j)]==X)
                printf("X\t");
            else if((*tab)[posicion(i,j)]==O)
                printf("O\t");
            else
                printf("-\t");
        }
    }
    printf("\n");
}
void Celda::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
    QPair<int,int> posicion(pos.y()/65,pos.x()/65);
    set<QPair<int,int> > movPosibles = juego->getMovimientosPosibles(juego->getTurno());   
    if (movPosibles.find(posicion) != movPosibles.end())
    {
        p = pen();
        QPen newPen(Qt::SolidLine);
        newPen.setWidth(3);
        setPen(newPen);
        entroHover = 1;
    }
}
//declaracionvar
//se checa que se tenga una declaración de variable. si está bien
//el identificador se pone en la tabla de símbolos, otro caso  
//el programador cometió un error al construir la declaración de variable
void declaracionvar() {
  int i;
  if (token==ident) {
    i=posicion();
    if (i!=0) {
      error(41); //error 11: No se deben redefinir objetos
    }

    poner(VARIABLE);
    obtoken();
  }
  else
    error(4) ; //error 4: Const, Var y Procedure deben ir seguidos de un identificador 
}
Example #8
0
void alta (char *nomfich)
{
    FILE *fiche;
    registro regaux, regalta, indice;
    int posi = 0, sgte1;

    // Abre el fichero
    fiche = fopen (nomfich, "r+b");
    // Lee el indice
    fread (&indice, sizeof (registro), 1, fiche);
    // Introduce la clave
    printf ("Introduce la clave y el dato del registro: ");
    scanf ("%d %d %c", &regalta.clave, &regalta.dato);
    // Calcula la posición de la clave
    posi = posicion (regalta.clave);
    // Lee el registro de esa posición
    fseek (fiche, posi * sizeof (registro), SEEK_SET);
    fread (&regaux, sizeof (registro), 1, fiche);
    // Se posiciona posi en el último registro con un valor
    while (regaux.activo && regaux.sgte) {
        posi = regaux.sgte;
        fseek (fiche, posi * sizeof (registro), SEEK_SET);
        fread (&regaux, sizeof (registro), 1, fiche);
    }
    // Ajustar la lista de espacios libres
    fseek (fiche, (indice.sgte) * sizeof (registro), SEEK_SET);
    fread (&regaux, sizeof (registro), 1, fiche);   // 1º registro libre
    sgte1 = regaux.sgte;

    regalta.activo = SI;
    regalta.sgte = 0;
    //se situa en el registro a dar de alta y lo escribe
    fseek (fiche, (indice.sgte) * sizeof (registro), SEEK_SET);
    fwrite (&regalta, sizeof (registro), 1, fiche);

    indice.sgte = sgte1;
    fseek (fiche, 0, SEEK_SET);
    fwrite (&indice, sizeof (registro), 1, fiche);
    printf ("Registro dado de alta.\n");

}
//factor
void factor(int toksig[])
{
  int i;
  int setpaso[NOTOKENS]; //conjunto de paso por valor
  
  test(tokinifact,toksig,24); //error(24): Una expresión no puede empezar con este símbolo
  
  while (tokinifact[token]==1) {
    //mientras el token sea un símbolo inicial de factor...
    if (token==ident) {
      i=posicion();
      if (i==0) {
        copia_set(setpaso,toksig);
        setpaso[parenc]=1; //setpaso=parenc+toksig
        funcion(setpaso);
        //error(11); //error 11: Identificador no declarado  
      }else if (buscarElemento(i) -> tipo==PROCEDIMIENTO)
        error(21); //error 21: Una expresión no debe contener un identificador de procedimiento
      obtoken();
    }
    else if (token == entero || token == real) 
      obtoken();          
    else if (token==parena) {
      obtoken();
      copia_set(setpaso,toksig);
      setpaso[parenc]=1; //setpaso=parenc+toksig
      
      expresion(setpaso);
      
      if (token==parenc)
        obtoken();
      else
        error(22); //error 22: Falta un paréntesis de cierre  
    };
    
    init_set(setpaso);  //conjunto vacío
    setpaso[parena]=1;  //setpaso=parena
    test(toksig,setpaso,23); //error(23): El factor anterior no puede ir seguido de este simbolo o falta un punto y coma
  }
}
Example #10
0
void funcion(int toksig[]) {
  int i;
  if (strcmp(lex, "READ")   == 0 ||
      strcmp(lex, "READLN") == 0) {
    obtoken();
    if (token == parena) {
      obtoken();
      if (token == ident) {
        i = posicion();
        if (i == 0) { // no se encontro el identificador
          error(11); // identificador no declarado
        }
        else if (buscarElemento(i) -> tipo==PROCEDIMIENTO) {
          error(21); //error 21: identificador de procedimiento
        }
        else { // era un identificador valido
          obtoken();
          if (token == parenc) {
            // todo nice
            obtoken();
          }
          else
            error(27);// se esperaba un parentesis de cierre 
        }
      }
      else
        error(28);
    }
    else
      error(26); // se esperaba una lista de argumentos
  }
  else if (strcmp(lex, "WRITE")   == 0 ||
           strcmp(lex, "WRITELN") == 0 ){
    obtoken();
    if (token == parena) {
      obtoken();
      if (token == string) {
        obtoken();
        if (token == coma) {
          obtoken();
        }
        else
          error(5); // falta coma o punto y coma
      }
      
      if (token == ident) {
        i = posicion();
        if (i == 0) { // no se encontro el identificador
          error(11); // identificador no declarado
        }
        else if (buscarElemento(i) -> tipo==PROCEDIMIENTO) {
          error(21); //error 21: identificador de procedimiento
        }
        else { // era un identificador valido
          obtoken();
          if (token == parenc) {
            // todo nice
            obtoken();
          }
          else
            error(27);
        }
      }
      else
        error(28);
    }
    else
      error(26); // se esperaba una lista de argumentos
  }
  //random
  else if (strcmp(lex, "RND")   == 0 ||
           strcmp(lex, "CLRSCR") == 0 ||
           strcmp(lex, "HALT") == 0  ){
    obtoken();
    if (token == parena) {
      obtoken();
      if (token == parenc) {
        obtoken();
      }
      else
        error(27);//se esperaba parentesis de cierre
    }
  }
  
  //pitagoras
  else if (strcmp(lex, "PITAG")   == 0 ){
    obtoken();
    if (token == parena) {
      obtoken();
      if (token == ident) {
        obtoken();
        if (token == coma) {
          obtoken();
          if (token == ident) {
            obtoken();
            if (token == coma) {
              obtoken();
              if (token == ident) {
                obtoken();
                if (token == parenc) {
                  obtoken();
                }
                else
                  error(27); // se esperaba parentesis de cierre
              }
              else
                error(36); // se esperaba un identificador
            }
            else
              error(5); // falta coma o punto y coma
          }
          else
            error(36); // se esperaba un identificador
        }
        else
          error(5); // falta coma o punto y coma
      }
      else
        error(36); // se esperaba un identificador
    }
    else
      error(37); // se esperaba parentesis de apertura
  }
	else
    error(11); // identificador no declarado
}
Example #11
0
//instruccion 
void instruccion(int toksig[])
{
  int i;
  int setpaso[NOTOKENS]; //conjunto de paso por valor
  int vacio[NOTOKENS];   //conjunto vacío
  
  init_set(vacio);
  
  if (token==ident) {
    if (esFuncion()) {
      copia_set(setpaso,toksig);
      funcion(setpaso);
    }
    else {
      //ve a buscarlo a la tabla de símbolos
      i=posicion();
      if (i==0) {
        error(11); //error 11: identificador no declarado
      }
      else if (buscarElemento(i) -> tipo != VARIABLE)
        error(12); //error 12: no están permitidas las asignaciones a constantes o a procedimientos
      obtoken();
      if (token==asignacion)
        obtoken();
      else
        error(13); //error 13: se esperaba el operador de asignación 
      
      copia_set(setpaso,toksig);
      expresion(setpaso);
    }
  } 
  else if (token==calltok) {
    obtoken();
    if (token!=ident)
      error(14); //error 14: "CALL" debe ir seguido de un identificador 
    else {
      //buscar el nombre del procedimiento en la tabla de símbolos
      i=posicion();
      if (i==0)
        error(11); //error 11: Identificador no declarado 
      else if (buscarElemento(i) -> tipo!=PROCEDIMIENTO)
        error(15); //error 15 : No tiene sentido llamar a una constante o a una variable
      obtoken();
    }
  } 
  else if (token==iftok) {
    obtoken();
    copia_set(setpaso,toksig);
    setpaso[thentok]=setpaso[dotok]=1; //setpaso=thentok+dotok+toksig
    condicion(setpaso);
    if (token==thentok)
      obtoken();
    else
      error(16); //error 16: Se esperaba un "THEN" 
    
    copia_set(setpaso,toksig);
    instruccion(toksig);
  } 
  else if (token==begintok) {
    obtoken();
    copia_set(setpaso,toksig);
    setpaso[puntoycoma]=setpaso[endtok]=1; //setpaso=puntoycoma+endtok+toksig
    instruccion(setpaso);
    
    while (token==puntoycoma || token==calltok || token==begintok || token==iftok || token==whiletok || token == fortok) {
      //aquí el while 'inserta' el punto y coma para continuar compilando cuando no lo encuentre
      //el compilador detecta la omisión clásica del punto y coma
      if (token==puntoycoma)
        obtoken();
      else
        error(10); //error 10: Falta un punto y coma entre instrucciones
      
      copia_set(setpaso,toksig);
      setpaso[puntoycoma]=setpaso[endtok]=1; //setpaso=puntoycoma+endtok+toksig
      instruccion(setpaso);
    }
    
    if (token==endtok)
      obtoken();
    else
      error(17); //error 17: Se esperaba un "END" o un punto y coma 
  } 
  else if (token==whiletok) {
    obtoken();
    
    copia_set(setpaso,toksig);
    setpaso[dotok]=1;//setpaso=dotok+toksig
    
    condicion(setpaso);
    
    if (token==dotok) 
      obtoken();
    else
      error(18); //error 18: Se esperaba un "DO" 
    
    copia_set(setpaso,toksig);
    instruccion(setpaso);         
  }
  else if (token == fortok) {
    obtoken();
    
    copia_set(setpaso,toksig);
    setpaso[dotok]=1;//setpaso=dotok+toksig
    
    if (token == ident) {
      i = posicion();
      if (i == 0) { // no se encontro el identificador
        error(11); // identificador no declarado
      }
      else if (buscarElemento(i) -> tipo==PROCEDIMIENTO) {
        error(21); //error 21: identificador de procedimiento
      }
      else { // era un identificador valido
        obtoken();
        if (token == intok) {
          obtoken();
          if (token == entero) {
            obtoken();
            if (token == dospuntos) {
              obtoken();
              if (token == entero) {
                obtoken();
                if (token == dotok) {
                  obtoken();
                  copia_set(setpaso,toksig);
                  instruccion(setpaso);
                }
                else {
                  error(18);
                }
              }
              else {
                error(38); // se esperaba un numero entero
              }
            }
            else {
              error(39); // se esperaban dos puntos
            }
          }
          else {
            error(38); // se esperaba un numero entero
          }
        }
        else {
          error(29); // se esperaba un IN despues del FOR
        }
      }
    }
    else
      error(28);
    
  } else if (token == booleantok) {
    obtoken();
    declaracionboolean();
  } else if (token == codigoptok) {
    obtoken();
    declaracioninline();
  }
  
  //comprobación explícita de que los tokens que viene son sucesores de instrucción  
  copia_set(setpaso,toksig);
  test(setpaso,vacio,19); //error(19): Un simbolo incorrecto sigue a una instrucción
}	      
Example #12
0
void alta (char *nomfich)
{
    FILE *fiche;
    registro regaux, regalta, indice;
    int posi = 0, sgte1, posi2, band = 0;

    // Abre el fichero
    fiche = fopen (nomfich, "r+b");
    // Lee el indice
    fread (&indice, sizeof (registro), 1, fiche);
    // Introduce la clave
    printf ("Introduce la clave y el dato del registro: ");
    scanf ("%d %d", &regalta.clave, &regalta.dato);
    // Calcula la posición de la clave
    posi = posicion (regalta.clave);
    if (posi == 0)
        posi = 10;
    // Lee el registro de esa posición
    fseek (fiche, posi * sizeof (registro), SEEK_SET);
    fread (&regaux, sizeof (registro), 1, fiche);
    // Se posiciona posi en el último registro con un valor
    posi2 = posi;
    if (regaux.activo) {
        if (regaux.sgte)

            while (regaux.sgte) {
                posi = regaux.sgte;
                fseek (fiche, posi * sizeof (registro), SEEK_SET);
                fread (&regaux, sizeof (registro), 1, fiche);
                posi2 = posi;
            }

        if (regaux.clave == regalta.clave)
            band = 1;
        else {
            posi = indice.sgte;
            regaux.sgte = indice.sgte;
            fseek (fiche, posi2 * sizeof (registro), SEEK_SET);
            fwrite (&regaux, sizeof (registro), 1, fiche);
        }
    }
    if (!band) {
        // Completa el registro
        regalta.activo = SI;
        regalta.sgte = 0;
        // Decide según está en z. principal o de colisiones
        if (posi) {

            if (posi > REGISTROS) {
                fseek (fiche, posi * sizeof (registro), SEEK_SET);
                fread (&regaux, sizeof (registro), 1, fiche);
                indice.sgte = regaux.sgte;
                fseek (fiche, 0, SEEK_SET);
                fwrite (&indice, sizeof (registro), 1, fiche);
            }

            fseek (fiche, posi * sizeof (registro), SEEK_SET);
            fwrite (&regalta, sizeof (registro), 1, fiche); // 1º registro libre

            printf ("Registro dado de alta.\n");
        }
        else
            printf ("No hay espacio.");
    }
    else
        printf ("La clave ya existe.");
    getch ();
    fclose (fiche);
}
Example #13
0
void baja (char *nomfich)
{
    FILE *fiche;
    registro regbaja, regaux, regaux2, regaux3, indice;
    int num, posi, posi2 = 0, aux;

    fiche = fopen (nomfich, "r+b");
    printf ("Introduzca la clave a dar de baja: ");
    scanf ("%d", &num);

    fseek (fiche, 0, SEEK_SET);
    fread (&indice, sizeof (registro), 1, fiche);
    regaux.sgte = indice.sgte;
    regaux.activo = NO;
    regaux.clave = 0;
    regaux.dato = 0;

    posi = posicion (num);
    fseek (fiche, posi * sizeof (registro), SEEK_SET);
    fread (&regbaja, sizeof (registro), 1, fiche);
    if (regbaja.activo) {
        while ((num != regbaja.clave) && (regbaja.sgte)) {
            posi2 = posi;
            posi = regbaja.sgte;
            fseek (fiche, posi * sizeof (registro), SEEK_SET);
            fread (&regbaja, sizeof (registro), 1, fiche);
        }
        if (num == regbaja.clave) {
            if (posi2) {        //zona de colisiones
                fseek (fiche, posi * sizeof (registro), SEEK_SET);
                fread (&regaux3, sizeof (registro), 1, fiche);
                fseek (fiche, posi2 * sizeof (registro), SEEK_SET);
                fread (&regaux2, sizeof (registro), 1, fiche);

                aux = regaux2.sgte;
                regaux2.sgte = regaux3.sgte;
                regaux.sgte = indice.sgte;
                indice.sgte = aux;

                fseek (fiche, 0, SEEK_SET);
                fwrite (&indice, sizeof (registro), 1, fiche);

                fseek (fiche, posi2 * sizeof (registro), SEEK_SET);
                fwrite (&regaux2, sizeof (registro), 1, fiche);
                fseek (fiche, posi * sizeof (registro), SEEK_SET);
                fwrite (&regaux, sizeof (registro), 1, fiche);

            }
            else {              //zona principal
                if (regbaja.sgte) { //si tiene continuacion
                    fseek (fiche, regbaja.sgte * sizeof (registro), SEEK_SET);
                    fread (&regaux2, sizeof (registro), 1, fiche);
                    fseek (fiche, regbaja.sgte * sizeof (registro), SEEK_SET);
                    fwrite (&regaux, sizeof (registro), 1, fiche);

                    fseek (fiche, posi * sizeof (registro), SEEK_SET);
                    fwrite (&regaux2, sizeof (registro), 1, fiche);
                    fseek (fiche, 0, SEEK_SET);
                    indice.sgte = regbaja.sgte;
                    fwrite (&indice, sizeof (registro), 1, fiche);
                }
                else {          //si sólo está esa clave
                    regaux.sgte = 0;
                    fseek (fiche, posi * sizeof (registro), SEEK_SET);
                    fwrite (&regaux, sizeof (registro), 1, fiche);
                }
            }
            printf ("Registro dado de baja.");
        }
        else
            printf ("No se ha encontrado la clave dada.");
    }
    else
        printf ("La clave especificada no estaba dada de alta.");
    getch ();
    fclose (fiche);
}
Example #14
0
// energia mecanica
TFloat energiaMecanica(const Datos& d, TFloat t) {
    TFloat dos_tf=TFloat(2.0,pr);
    return posicion(d, t)*g + velocidad(d,t)*velocidad(d,t) / dos_tf;
}
Example #15
0
void reconocedor(FILE * archivo,FILE * tmp){
	//Se encarga de obtener los nombres y valores definidos por el #define
	rewind(archivo);
	int _estaDefinido=0;
	char guardar[33];
	char guardar2[33];
	char *nombre[_totalDefine];
	char *valor[_totalDefine];
	int pos; 
	palabras palabras = escaner(archivo);
	int esta=0;

	while (palabras!=FIN){
	
		switch(palabras){
			case NOT_COMMENT:
				clear_buffer();
				buffer_char(c);
				fprintf(tmp,"/%s",token_buffer);
				break;
						

			case DEFINE:
				//No se pasa con el & debido a que la estructura ya es *guardar
				if (raro==1){
				memset(guardar2, '\0', sizeof(guardar2));
				escaner(archivo);
				pos= posicion(nombre);
				asignar_nombre(guardar,archivo);
				nombre[pos]=strdup(guardar);
				
				asignar_valor(guardar2,archivo);
				valor[pos]=strdup(guardar2);

				if (pos==cont){
					cont ++;
				}
				raro=0;
			}
			break;
	case ANYWORD:
				esta =0;
				int i=0;
				for (i<cont;i++;){
					if (strcmp(nombre[i],token_buffer)==0){
						fprintf(tmp, "%s",valor [i]);
						esta=1;
					}
				}
				if (esta==0){
					fprintf(tmp, "%s", token_buffer);
				}
				break;
					
			case PUNTUACTION:
				//signo_puntuacion=0;
			
				if (strlen(token_buffer)==0){
					buffer_char(c);
					fprintf(tmp,"%s",token_buffer);
					break;
				}
				else{
					_estaDefinido = 0;
		
				//Si no esta definido solo imprimo
				if (_estaDefinido == 0){
					fprintf(tmp,"%s",token_buffer);
					
				
					clear_buffer();
					buffer_char(c);
					fprintf(tmp,"%s", token_buffer);
					break;

				}
				break;
			}
	

			case ESPACIO:
				imprimir_espacios();
				break;
				default:
					break;
			
		
	}

	palabras = escaner(archivo);
	
	//Llamamos a cambiador para reescribir el texto por su respectivo valorr
}}
Example #16
0
//instruccion 
void instruccion()
{
 int i;
 if (token==ident) {
    //ve a buscarlo a la tabla de símbolos
    i=posicion() ;
    if (i==0)
       error(11); //error 11: identificador no declarado 
    else 
       if (tabla[i].tipo != VARIABLE)
          error(12); //error 12: no están permitidas las asignaciones a constantes o a procedimientos
    obtoken();
    if (token==asignacion)
        obtoken();
    else
       error(13) ; //error 13: se esperaba el operador de asignación 

    expresion();	   
 } 
 else 
    if (token==calltok) {
       obtoken();
       if (token!=ident)
          error(14); //error 14: "CALL" debe ir seguido de un identificador 
       else {
            //buscar el nombre del procedimiento en la tabla de símbolos
            i=posicion();
            if (i==0)
	           error(11); //error 11: Identificador no declarado 
            else
	           if (tabla[i].tipo!=PROCEDIMIENTO)
	              error(15); //error 15 : No tiene sentido llamar a una constante o a una variable 
            obtoken();
       }
    } 
	else
       if (token==iftok) {
	      obtoken();
		  condicion();
		  if (token==thentok)
	         obtoken();
	      else
	         error(16); //error 16: Se esperaba un "THEN" 
		  instruccion();
       } 
	   else
	      if (token==begintok) {
	         obtoken();
			 instruccion();
			 while (token==puntoycoma) {
	               obtoken();
	               instruccion();
	         }
	         if (token==endtok)
	            obtoken();
	         else
	            error(17); //error 17: Se esperaba un "END" o un punto y coma 
	      } 
		  else
	         if (token==whiletok) {
	           	obtoken();
				condicion();
				if (token==dotok) 
	               obtoken();
	            else
	               error(18); //error 18: Se esperaba un "DO" 
				instruccion();				          
			 }
}