PROGRAM ANIMAL_PROY;
CONST
  MAXIMO=20;
  ANIMALES=MAXIMO;
  CARACTERISTICAS=MAXIMO;

TYPE
  MAXANIMALES=0..ANIMALES;
  MAXCARACTERISTICAS=0..CARACTERISTICAS;
  CONJCARACTERISTICAS=SET OF MAXCARACTERISTICAS;
  CONJANIMALES=SET OF MAXANIMALES;
  NOMBREANIMALS=STRING;
  DESCRCARACTERIS=STRING;
  NOMBREANIMAL=PACKED ARRAY [1..20] OF CHAR;
  DESCRCARACTERISTIC=PACKED ARRAY [1..30] OF CHAR;
  ANIMALRE=RECORD
            NUMREG:MAXANIMALES;
            NOMBRE:NOMBREANIMALS;
            CARACTS:CONJCARACTERISTICAS
           END;
  CARACTERISTICARE=RECORD
                    NUMREG:MAXCARACTERISTICAS;
                    DESCR:DESCRCARACTERIS;
                    ANIMALES:CONJANIMALES;
                   END;
  ANIMALAR=RECORD
            NUMREG:MAXANIMALES;
            NOMBRE:NOMBREANIMAL;
            CARACTS:CONJCARACTERISTICAS
           END;
  CARACTERISTICAAR=RECORD
                    NUMREG:MAXCARACTERISTICAS;
                    DESCR:DESCRCARACTERISTIC;
                    ANIMALES:CONJANIMALES;
                   END;
  ARANIMALES=ARRAY [MAXANIMALES] OF ANIMALRE;
  ARCARACTERISTICAS=ARRAY [MAXCARACTERISTICAS] OF CARACTERISTICARE;
  RESPUESTA=String;

VAR
  ANIMALIN:ARANIMALES;
  CARACTERISTIN:ARCARACTERISTICAS;
  CONT1,CONT2:INTEGER;
  RES:RESPUESTA;
  CAR:CONJCARACTERISTICAS;
  CON:CONJANIMALES;
  ENCONTRADO:BOOLEAN;
  NOMB:NOMBREANIMALS;
  INT:STRING;

FUNCTION YANOJUEGO:BOOLEAN;
BEGIN
  WRITELN;
  WRITELN;
  WRITELN('QUIERES QUE TE ADIVINE OTRO ANIMAL? (SI/NO)');
  READLN(RES);
  WRITELN;
  IF (RES='SI')OR(RES='S') THEN
    YANOJUEGO:=FALSE
  ELSE
    YANOJUEGO:=TRUE;
  WRITELN
END;

PROCEDURE TRANSMIN(VAR PALABRA:STRING);
VAR
  LONGITUD,I:INTEGER;
BEGIN
  LONGITUD:=Length (PALABRA);
  FOR I:= 1 TO LONGITUD DO
    IF (PALABRA[I]>='a')AND(PALABRA[I]<='z') THEN
      PALABRA[I]:=CHR(ORD(PALABRA[I])-ORD('a')+ORD('A'))
END;

FUNCTION NUMCAR(ARCAR:ARCARACTERISTICAS):INTEGER;
VAR
  CONT:INTEGER;
BEGIN
  CONT:=1;
  WHILE (CONT<=CARACTERISTICAS)AND(ARCAR[CONT].NUMREG<>0) DO
    CONT:=SUCC(CONT);
  NUMCAR:=PRED(CONT)
END;

FUNCTION NUMANI(ARANI:ARANIMALES):INTEGER;
VAR
  CONT:INTEGER;
BEGIN
  CONT:=1;
  WHILE (CONT<=ANIMALES)AND(ARANI[CONT].NUMREG<>0) DO
    CONT:=SUCC(CONT);
  NUMANI:=PRED(CONT)
END;
 
PROCEDURE AGRANI(NOM:NOMBREANIMALS;CAR:CONJCARACTERISTICAS);
BEGIN
  IF (NUMANI(ANIMALIN)+1<=ANIMALES) THEN
    BEGIN
      ANIMALIN[NUMANI(ANIMALIN)+1].NUMREG:=NUMANI(ANIMALIN)+1;
      ANIMALIN[NUMANI(ANIMALIN)].NOMBRE:=NOM;
      ANIMALIN[NUMANI(ANIMALIN)].CARACTS:=CAR;
    END;
END;
 

BEGIN
  FOR CONT1:= 1 TO ANIMALES DO
    ANIMALIN[CONT1].NUMREG:=0;
  FOR CONT1:= 1 TO CARACTERISTICAS DO
    CARACTERISTIN[CONT1].NUMREG:=0;
  REPEAT
    WRITELN('PIENSA EN EL NOMBRE DE UN ANIMAL...');
    CAR:=[];
    INT:='';
    ENCONTRADO:=FALSE;
    CONT1:=1;
    WHILE (CONT1<=NUMCAR(CARACTERISTIN))AND(NOT(ENCONTRADO)) DO
    BEGIN
      WRITE('EL ANIMAL ',CARACTERISTIN[CONT1].DESCR,'?');
      READLN(RES);
      IF (RES='SI')OR(RES='S') THEN
      BEGIN
        CAR:=CAR+[CONT1];
        CON:=[NUMANI(ANIMALIN)+1];
        CARACTERISTIN[CONT1].ANIMALES:=CARACTERISTIN[CONT1].ANIMALES+CON;
        FOR CONT2:= 1 TO NUMANI(ANIMALIN) DO
          IF CAR=ANIMALIN[CONT2].CARACTS THEN
          BEGIN
            WRITE('EL ANIMAL QUE PENSASTE ES UN(A)',ANIMALIN[CONT2].NOMBRE,'?');
            READLN(RES);
            IF (RES='SI')OR(RES='S') THEN
              ENCONTRADO:=TRUE
            ELSE 
              INT:=(' DEL (DE LA) '+ANIMALIN[CONT2].NOMBRE)
          END;
      END;
      CONT1:=SUCC(CONT1);
    END;
 
    IF NOT(ENCONTRADO)AND(NUMANI(ANIMALIN)

    Source: geocities.com/v.iniestra/apuntes/tall_prog

               ( geocities.com/v.iniestra/apuntes)                   ( geocities.com/v.iniestra)