Ejemplos de Programas ASPLE (supuestamente) correctos:


  1. CALCULA LA SUMA DE LOS N PRIMEROS NUMEROS ENTEROS.
    begin
        int N, TOTAL, X;
        input N;
        TOTAL := 0;
        X := 1;
        if (1 <= N) then
             while (X <= N) do
                  TOTAL := TOTAL + X;
                  X := X + 1
             end
        fi;
        output TOTAL
    end
    

  2. COMPROBACION DE OPERADORES LOGICOS.
    begin
        bool X, Y, AND, OR;
        input X;
        input Y;
        AND := X * Y;
        OR := X + Y;
        output AND;
        output OR
    end
    

  3. DETERMINAR EL MENOR DE DOS NUMEROS ENTEROS.
    begin
        int X, Y;
        input X;
        input Y;
        if (Y <= X) then
             output Y
        else
             output X
        fi
    end
    
    CON EL PROGRAMA ANTERIOR PODEMOS OBTENER:

    A) La división entera de dos números: dados A y B, podemos devolver el cociente y el resto;

    B) A partir de A) podemos obtener el MCD de dos números utilizando el algoritmo de Euclides.

    Obs: El problema es que como en ASPLE no podemos definir funciones (o subrutinas), ni tampoco tenemos instrucciones del tipo GOTO, cada vez que necesitemos saber, por ejemplo, si A es menor que B, debemos introducir el código correspondiente en el lugar apropiado del programa que estemos escribiendo. Esto hará que programas a priori sencillos como los descritos en A) y B) sean mucho mayores de lo que cabría esperar.


  4. DETERMINAR EL MENOR DE DOS NUMEROS ENTEROS UTILIZANDO PUNTEROS.
    begin
        int X, Y;
        ref int SMALLEST;
        input X;
        input Y;
        if (Y <= X) then
             SMALLEST := Y
        else
             SMALLEST := X
        fi
    end
    
    Aunque este programa no tiene ningún "output" y por lo tanto no saca nada por pantalla, es mßs apropiado que el 3) para los objetivos que se plantean en 3.A) y 3.B).


  5. DIVISION ENTERA: DADOS DOS NUMEROS ENTEROS, DIVIDENDO Y DIVISOR, (en ese orden) DEVUELVE EL COCIENTE Y EL RESTO (también en ese orden).
    begin
        int DIVIDENDO, DIVISOR, COCIENTE, RESTO;
        int COUNT, MUL;
        ref int SMALLEST;
        input DIVIDENDO;
        input DIVISOR;
        COCIENTE := 0;        /* inicializamos las variables */
        RESTO := DIVIDENDO;
        /* para inicializar SMALLEST tenemos que ejecutar el codigo de 5) */
        /* estamos calculando el menor entre RESTO y DIVISOR              */
        if (RESTO = DIVISOR) then
             SMALLEST := DIVISOR   /* mirar obs. 2 al final */
        else
             if (RESTO <= DIVISOR) then
                  SMALLEST := RESTO
             else
                  SMALLEST := DIVISOR
             fi
        fi;
        while (SMALLEST = DIVISOR) do
             COCIENTE := COCIENTE + 1;
             MUL := COCIENTE * DIVISOR;
             COUNT := 0;                    /* este trozo es necesario pues no */
             while (MUL + 1 <= DIVIDENDO) do /* disponemos de la resta      */
                  COUNT := COUNT + 1;
                  MUL := MUL + 1
             end;
             RESTO := COUNT;
             /* dentro del bucle debemos calcular el menor entre RESTO y DIVISOR */
             if (RESTO = DIVISOR) then
                  SMALLEST := DIVISOR   /* mirar obs. 2 al final */
             else
                  if (RESTO <= DIVISOR) then
                       SMALLEST := RESTO
                  else
                       SMALLEST := DIVISOR
                  fi
             fi
        end;
        output COCIENTE;
        output RESTO
    end
    

    Observaciones:

    1) evidentemente, hay que eliminar todos los comentários del programa;
    2) siendo iguales RESTO y DIVISOR, desde el punto de vista del código que calcula el menor de ellos sería indiferente devolver uno u otro. Sin embargo, en este caso queremos que devuelva el DIVISOR, para que entre en el bucle una vez más, ya que si el RESTO y el DIVISOR son iguales esto significa que el DIVISOR todavía cabe una vez en el DIVIDENDO, y además la división es exacta;
    3) Si el ejecutable generado no devuelve los valores esperados, aqui tenéis una tabla con todos los valores que asumen las variables del programa cuando se introducen 9 y 4 como input y que puede ser útil para debugging.

         DIVIDENDO DIVISOR COCIENTE RESTO     COUNT MUL     SMALLEST
         9         4       0        9         0     4       -> DIVISOR
                           1        5         1     5       -> DIVISOR
                           2        1         2     6       -> RESTO
                                              3     7
                                              4     8
                                              5     9
                                              0     8
                                              1     9
    
  6. Comprueba si un número de cuatro cifras es capicúa.
    begin
      int NUMCUATROCIFRAS, DIVIDENDO, DIVISOR, COCIENTE, RESTO;
      int COUNT, MUL;
      int UNO, DOS, TRES, CUATRO;
      bool CAPICUA;
      ref int SMALLEST;
    
      input NUMCUATROCIFRAS;
      CAPICUA := false;
    
      DIVIDENDO := NUMCUATROCIFRAS;
      DIVISOR := 1000;
    
      COCIENTE := 0;
      RESTO := DIVIDENDO;
      if (RESTO = DIVISOR) then
           SMALLEST := DIVISOR
      else
           if (RESTO <= DIVISOR) then
                SMALLEST := RESTO
           else
                SMALLEST := DIVISOR
           fi
      fi;
      while (SMALLEST = DIVISOR) do
           COCIENTE := COCIENTE + 1;
           MUL := COCIENTE * DIVISOR;
           COUNT := 0;
           while (MUL + 1 <= DIVIDENDO) do
                COUNT := COUNT + 1;
                MUL := MUL + 1
           end;
           RESTO := COUNT;
           if (RESTO = DIVISOR) then
                SMALLEST := DIVISOR
           else
                if (RESTO <= DIVISOR) then
                     SMALLEST := RESTO
                else
                     SMALLEST := DIVISOR
                fi
           fi
      end;
      UNO := COCIENTE;
      DOS := RESTO;
    
      DIVIDENDO := DOS;
      DIVISOR := 100;
    
      COCIENTE := 0;
      RESTO := DIVIDENDO;
      if (RESTO = DIVISOR) then
           SMALLEST := DIVISOR
      else
           if (RESTO <= DIVISOR) then
                SMALLEST := RESTO
           else
                SMALLEST := DIVISOR
           fi
      fi;
      while (SMALLEST = DIVISOR) do
           COCIENTE := COCIENTE + 1;
           MUL := COCIENTE * DIVISOR;
           COUNT := 0;
           while (MUL + 1 <= DIVIDENDO) do
                COUNT := COUNT + 1;
                MUL := MUL + 1
           end;
           RESTO := COUNT;
           if (RESTO = DIVISOR) then
                SMALLEST := DIVISOR
           else
                if (RESTO <= DIVISOR) then
                     SMALLEST := RESTO
                else
                     SMALLEST := DIVISOR
                fi
           fi
      end;
      DOS := COCIENTE;
      TRES := RESTO;
    
      DIVIDENDO := TRES;
      DIVISOR := 10;
    
      COCIENTE := 0;
      RESTO := DIVIDENDO;
      if (RESTO = DIVISOR) then
           SMALLEST := DIVISOR
      else
           if (RESTO <= DIVISOR) then
                SMALLEST := RESTO
           else
                SMALLEST := DIVISOR
           fi
      fi;
      while (SMALLEST = DIVISOR) do
           COCIENTE := COCIENTE + 1;
           MUL := COCIENTE * DIVISOR;
           COUNT := 0;
           while (MUL + 1 <= DIVIDENDO) do
                COUNT := COUNT + 1;
                MUL := MUL + 1
           end;
           RESTO := COUNT;
           if (RESTO = DIVISOR) then
                SMALLEST := DIVISOR
           else
                if (RESTO <= DIVISOR) then
                     SMALLEST := RESTO
                else
                     SMALLEST := DIVISOR
                fi
           fi
      end;
      TRES := COCIENTE;
      CUATRO := RESTO;
    
      if ( (UNO = CUATRO) * (DOS = TRES) ) then
        CAPICUA := true
      fi;
    
      output UNO;
      output DOS;
      output TRES;
      output CUATRO;
      output CAPICUA
    end
    

  7. Conversión de un número en una base dada a DECIMAL.
    begin
      int DECIMAL, I, J ;
      int NUMCIFRAS, CIFRA ;
      int BASE, BI ;
      int RESTA, EXP ;
    
      input BASE ;
      input NUMCIFRAS ;
    
      DECIMAL := 0 ;
      I := 0 ;
    
      while ( I + 1 <= NUMCIFRAS ) do
        input CIFRA ;
        RESTA := 0;
        EXP := I + 1;
        while (EXP + 1 <= NUMCIFRAS) do
             RESTA := RESTA + 1 ;
             EXP := EXP + 1
        end;
    
        J := 0 ;
        BI := 1 ;
        while (J + 1 <= RESTA) do
          BI := BI * BASE ;
          J := J + 1
        end ;
        DECIMAL := DECIMAL + (CIFRA * BI) ;
        I := I + 1
      end ;
    
      output DECIMAL
    end
    

  8. Números de Fibonacci.
    begin
      int FA, FB, FC, I;
      int NUMERO;
      int FIBONACCI;
    
      input NUMERO;
      FC := 0;
      FB := 1;
    
      if (NUMERO=0) then
        FIBONACCI := 0
    
      else if (NUMERO=1) then
        FIBONACCI := 1
    
      else
        I := 2;
        while (I <= NUMERO) do
          FA := FB + FC ;
          FC := FB ;
          FB := FA ;
          FIBONACCI := FA ;
          I  := I + 1
        end
      fi
      fi;
    
      output FIBONACCI
    end
    

  9. Conversión de segundos a formato HORAS, MINUTOS, SEGUNDOS.
    begin
      int NUMERO, DIVIDENDO, DIVISOR, COCIENTE, RESTO;
      int COUNT, MUL;
      int HORAS, MINUTOS, MINUTOSTMP, SEGUNDOS;
      ref int SMALLEST;
    
      input NUMERO;
      DIVIDENDO := NUMERO;
      DIVISOR := 60;
    
      COCIENTE := 0;
      RESTO := DIVIDENDO;
      if (RESTO = DIVISOR) then
           SMALLEST := DIVISOR
      else
           if (RESTO <= DIVISOR) then
                SMALLEST := RESTO
           else
                SMALLEST := DIVISOR
           fi
      fi;
      while (SMALLEST = DIVISOR) do
           COCIENTE := COCIENTE + 1;
           MUL := COCIENTE * DIVISOR;
           COUNT := 0;
           while (MUL + 1 <= DIVIDENDO) do
                COUNT := COUNT + 1;
                MUL := MUL + 1
           end;
           RESTO := COUNT;
           if (RESTO = DIVISOR) then
                SMALLEST := DIVISOR
           else
                if (RESTO <= DIVISOR) then
                     SMALLEST := RESTO
                else
                     SMALLEST := DIVISOR
                fi
           fi
      end;
      MINUTOSTMP := COCIENTE;
      SEGUNDOS := RESTO;
    
      DIVIDENDO := MINUTOSTMP;
      DIVISOR := 60;
    
      COCIENTE := 0;
      RESTO := DIVIDENDO;
      if (RESTO = DIVISOR) then
           SMALLEST := DIVISOR
      else
           if (RESTO <= DIVISOR) then
                SMALLEST := RESTO
           else
                SMALLEST := DIVISOR
           fi
      fi;
      while (SMALLEST = DIVISOR) do
           COCIENTE := COCIENTE + 1;
           MUL := COCIENTE * DIVISOR;
           COUNT := 0;
           while (MUL + 1 <= DIVIDENDO) do
                COUNT := COUNT + 1;
                MUL := MUL + 1
           end;
           RESTO := COUNT;
           if (RESTO = DIVISOR) then
                SMALLEST := DIVISOR
           else
                if (RESTO <= DIVISOR) then
                     SMALLEST := RESTO
                else
                     SMALLEST := DIVISOR
                fi
           fi
      end;
      HORAS := COCIENTE;
      MINUTOS := RESTO;
    
      output HORAS;
      output MINUTOS;
      output SEGUNDOS
    end
    

  10. Raíz entera de un número.
    begin
    
      int NUMERO;
      int RADICANDO;
      int CONTADORRADICANDO;
      int RAIZN;
      int TMP;
      int RESTO;
    
      int DIFERENCIA, SUSTRAENDO;
    
      input NUMERO;
      input RADICANDO;
      RAIZN := 0 ;
      RESTO := 0 ;
      TMP := 0 ;
    
      while ( TMP + 1 <= NUMERO ) do
        RAIZN := RAIZN + 1 ;
    
        TMP := 1 ;
        CONTADORRADICANDO := 0 ;
        while ( CONTADORRADICANDO + 1 <= RADICANDO ) do
          TMP := TMP * RAIZN ;
          CONTADORRADICANDO := CONTADORRADICANDO + 1
        end
    
      end;
    
      if ( TMP = NUMERO ) then RESTO := 0
      else
    
        DIFERENCIA := 0;
        SUSTRAENDO := 1;
        while (SUSTRAENDO + 1 <= RAIZN) do
             DIFERENCIA := DIFERENCIA + 1 ;
             SUSTRAENDO := SUSTRAENDO + 1
        end;
    
        RAIZN := DIFERENCIA ;
    
        TMP := 1 ;
        CONTADORRADICANDO := 0 ;
        while ( CONTADORRADICANDO + 1 <= RADICANDO ) do
          TMP := TMP * RAIZN ;
          CONTADORRADICANDO := CONTADORRADICANDO + 1
        end;
    
        DIFERENCIA := 0;
        SUSTRAENDO := TMP;
        while (SUSTRAENDO + 1 <= NUMERO) do
             DIFERENCIA := DIFERENCIA + 1 ;
             SUSTRAENDO := SUSTRAENDO + 1
        end;
    
        RESTO := DIFERENCIA
    
      fi ;
    
      output (RAIZN) ;
      output (RESTO)
    
    end
    

    Última modificación: 24 de Mayo de 1999