Ejercicios de Programación - Soluciones

No sirve absolutamente de nada mirar las soluciones, si previamente no lo habéis intentado resolver

Vuestras soluciones no tienen por qué ser iguales a éstas, pueden ser diferentes y estar bien, preguntad a vuestro profesor.

Dado un nº de autobuses, y las plazas por autobús, escribir su capacidad

algoritmo
  var
    autobuses, plazas, capacidad: entero
  fvar
    Escribir ("Introduce el número de autobuses:")
    Leer (autobuses)
    Escribir ("Número de plazas por autobús:")
    Leer (plazas)
    capacidad := autobuses * plazas
    Escribir ("Se pueden transportar ", capacidad, " personas")
falgoritmo


Dada una cantidad de libros y de personas, repartidlos y decir cuántos sobran

algoritmo
  var
    libros, personas, reparto, sobrante: entero
  fvar
    Escribir ("Introduce el número de libros: ")
    Leer (libros)
    Escribir ("Número de personas: ")
    Leer (personas)
    reparto := libros / personas             {división entera}
    sobrante := libros mod personas      {resto de la división}
    Escribir ("Libros por personas:", reparto, " y sobran:", sobrante)
falgoritmo


Dada una cantidad en céntimos (leyendo un sólo nº), escribir su cambio minimizando el número de monedas de euro, 20centimos, 5c y 1c

algoritmo
  var
    centimos: entero
  fvar
    Escribir ("Introduce la cantidad de céntimos: ")
    Leer (céntimos)
    Escribir (céntimos / 100, " euros")               {división entera}
    céntimos := céntimos mod 100                   {el resto de céntimos quitados los euros}
    Escribir (céntimos / 20, " monedas de 20 céntimos")
    céntimos := céntimos mod 20
    Escribir (céntimos / 5, " monedas de 5 céntimos")
    Escribir (céntimos mod 5, " monedas de 1 céntimo")
falgoritmo


Leer el radio y escribir el perímetro de la circunferencia

algoritmo
  var
    radio, perimetro: real
  fvar
    Escribir ("Introduce el radio: ")
    Leer (radio)
    perimetro := 2,0 * 3,14 * radio        {todos los números deben ser reales}
    Escribir ("La circunferencia de radio ", radio, "es ", perimetro)
falgoritmo

program circunferecia;
var
    radio perimetro: real;
begin
    write ('Introduce el radio:  ');
    read (radio);
    perimetro := 2.0 * 3.14 * radio
    Writeln ('La circunferencia de radio ', radio, 'es ', perimetro);
end.


Pasar una cantidad entera de Ptas a Euros, con solo dos decimales y redondeo en el tercer decimal

algoritmo
  var
    ptas: entero
    euro: real
  fvar
    Escribir ("Introduce la cantidad en pesetas: ")
    Leer (ptas)
    euro := AReal (ptas) / 166,386   {euros con una cantidad indefinida de decimales}
    euro := euro + 0,005                 {redondeo en el tercer decimal}
    euro := euro * 100,0                 {paso dos decimales a la parte entera}
    euro := AReal (AEntero(euro))  {Convierto a entero para perder los decimales, y vuelvo a convertir a real}
    euro := euro / 100,0                 {vuelvo a poner los dos decimales originales en la parte decimal}
    Escribir (euro, " euros")
falgoritmo


Dado un nº de 3 cifras, decir si es capicúa

algoritmo
  var
   
n: entero
  fvar
    Leer
(n)
    si
(n < 100) o (n > 999) entonces
        Escribir
("Número no válido, debe tener 3 cifras")
    sino
        si 
(x / 100) = (x mod 10) entonces   {1ª cifra = tercera cifra}
            Escribir
("sí")
        sino
            Escribir
("no")
        fsi
    fsi
falgoritmo

Leer tres números reales y escribir el mayor

algoritmo
  var
    num1, num2, num3: entero
  fvar
    Escribir ("Introduce tres números: ")
    Leer (num1, num2, num3)
    si num1 > num2 y num1 > num3 entonces
       Escribir ("El mayor es ", num1)
    sino
       si num2 > num3 entonces          {no miro num1 porque ya sé que no es}
           Escribir ("El mayor es ", num2)
       sino
          Escribir ("El mayor es ", num3)
falgoritmo

program mayor_de_3;
var
    num1, num2, num3: integer;
begin
    write ('Introduce tres numeros: ');
    read (num1, num2, num3);
    if (num1 > num2) and (num1 > num3) then begin
        Writeln ('El mayor es ', num1);
    end
    else begin
        if (num2 > num3) then begin
            Writeln ('El mayor es ', num2);
        end
        else begin
            Writeln ('El mayor es ', num3);
        end;
    end;
end.


Leer tres números reales y escribirlos de menor a mayor

algoritmo
  var
    num1, num2, num3, aux: entero
  fvar
    Escribir ("Introduce tres números: ")
    Leer (num1, num2, num3)
    {A veces un buen análisis del problema nos puede ahorrar mucho trabajo}
    {   y en este caso evitar liarnos con gran cantidad de si-sino enhebrados}

    si num1 > num2 entonces    {si num1 y num2 están desordenados, los intercambio}
       aux := num1
       num1 := num2
       num2 := aux
    fsi
    si num2 > num3 entonces    {si num2 y num3 están desordenados, los intercambio}
       aux := num2
       num2 := num3
       num3 := aux
    fsi
    si num1 > num2 entonces    {repito con num1 y num2, por si num2 hubiera cambiado en el paso anterior}
       aux := num1
       num1 := num2
       num2 := aux
    fsi
    {si no lo veis, haced una traza}
    Escribir (num1, num2, num3)
falgoritmo


Dados 3 números reales a, b y c escribir las raíces, si son reales, de la ecuación de segundo grado ax2 + bx + c = 0

algoritmo
  var
    a, b, c, discriminante: real
  fvar
    Escribir ("Introduce los tres coeficientes de la ecuación de segundo grado, a, b, c: ")
    Leer (a, b, c)
    discriminante := b*b - 4,0*a*c
    si discriminante < 0 entonces
       Escribir ("No tiene soluciones reales")
    sino
       Escribir ((-b + raíz(discriminante)) / (2.0*a))
       Escribir ((-b - raíz(discriminante)) / (2.0*a))
    fsi
falgoritmo


Dado f(x) = 3x2 + 5x – 3 escribir los f(x) para x en [1..100]

algoritmo
  var
    x: entero
  fvar
    x := 1
    mientras x <= 100 hacer
       Escribir (3*x*x + 5*x - 3)
       x := x+1
    fmientras
falgoritmo


RECUERDA: No sirve absolutamente de nada mirar las soluciones si previamente no habéis intentado resolverlo vosotr@s


Dada una secuencia de notas acabada en –1.0 calcular el porcentaje de aprobados

algoritmo
  var
    aprobados, total: entero    
    
nota: real  
  fvar

    aprobados := 0
    total := 0
    Leer (nota)
    mientras nota <> -1.0 hacer
       si nota >= 5.0 entonces
          aprobados := aprobados + 1
       fsi
       total := total +1
       Leer (nota)
    fmientras
    Escribir ((AReal(aprobados) / AReal(total)) *100,0)
falgoritmo

program porcentaje_aprobados;
var
    aprobados, total: integer;
    nota: real;
begin
    aprobados := 0;
    total := 0;
    read (nota);
    while nota <> -1.0 do begin
        if nota >= 5.0 then begin
          aprobados := aprobados + 1;
        end;
        total := total +1;
        read (nota);
    end;
    Write ((aprobados/total)*100,0);
end


Dada una frase acabada en '.' contar cuantas veces aparece la secuencia "LA"

algoritmo
  var
    anterior, actual: carácter
    
contador: entero
  fvar
    contador := 0
    anterior := 'X'                {cualquier valor diferente de 'L', para que no cuente si la primera letra de la frase es una 'A'}
    Leer (actual)
    mientras actual <> '.' hacer
       si anterior = 'L' y actual = 'A' entonces
          contador := contador +1
       fsi
       anterior := actual         {Avanzo una sola letra en la secuencia}
       Leer (actual)
    fmientras
    Escribir (contador)
falgoritmo


Dado un texto acabado en '#' reescribirlo eliminando los comentarios que están entre {...}, teniendo en cuenta que puede haber varios niveles de comentarios

algoritmo
  const
    FIN = '#'
  fconst
  var
    letra: carácter
    
contador: entero
  fvar
    contador := 0
    Leer (letra)
    mientras letra <> FIN hacer
       si letra = '{' entonces                         {se abre un comentario}
          contador := contador +1
       sino
            si
letra = '}' entonces                      {se cierra un comentario}
              contador := contador -1
          fsi
       fsi
       si contador = 0 y letra <> '}' entonces   {si es 0, está fuera de comentarios, salvo que sea la última llave}
          Escribir (letra)                                         {si no, no lo escribe por estar dentro de un comentario}
       fsi
       Leer (letra)
    fmientras
    Escribir ('#')                                          {escribo también el último carácter, el centinela}
falgoritmo


RECUERDA: Mejor saber resolver ejercicios sencillos, que entender la solución de ejercicios complejos


Dada una secuencia de notas acabada en -1.0 decir si hay algún sobresaliente

algoritmo
  const
    FIN = -1.0
  fconst
  var
    nota: real
    
haysobresaliente: booleano
  fvar
    haysobresaliente := falso
    Leer (nota)
    mientras nota <> FIN  y no haysobresaliente hacer
       si nota >= 9.0 entonces  
          haysobresaliente := cierto
         sino
             Leer (nota)
       fsi
    fmientras
    si haysobresaliente entonces
        Escribir ("Hay al menos un sobresaliente")
    sino
       Escribir ("No hay sobresalientes")
    fsi
falgoritmo

program hay_sobresaliente;
const
    FIN = -1.0
fconst
var

    nota: real;
    haysobresaliente: boolean;
begin
    haysobresaliente := false;
    read (nota);
    while (nota <> FIN) and (not haysobresaliente) do begin
        if nota >= 9.0 then begin 
            haysobresaliente := true;
        end
        else begin
            read(nota);
        end;
    end;
    if haysobresaliente then begin
        Writeln ('Hay al menos un sobresaliente');
    end
    else begin
        Writeln ('No hay sobresalientes');
    end;
end.


Dada una secuencia de 100 notas decir si hay más de 10 suspensos

algoritmo
  const
    MAX = 100
    MAX_SUSPENSOS = 10
  fconst
  var

    nota: real
    
cont_notas, cont_suspensos: entero
  fvar
    cont_suspensos := 0
    cont_notas := 1
    mientras cont_notas <= MAX  y cont_suspensos <= MAX_SUSPENSOS hacer       
       {en lugar de usar el esquema de busqueda con booleanos, ponemos la codición directamente en el mientras}
       Leer (nota)
       si nota < 5.0 entonces  
          cont_suspensos := cont_suspensos + 1
       fsi
        
cont_notas := cont_notas + 1
    fmientras
    si cont_suspensos > 10 entonces
        Escribir ("Hay más de 10 suspensos")
    sino
        Escribir ("No hay más de 10 suspensos")
    fsi
falgoritmo


Dada un nº de DNI y una secuencia de DNI - nota, decir la nota del DNI

algoritmo  {buscar_DNI en secuencia con centinela  0 }
 const
    FIN = 0
fconst
var
    DNI, buscar: entero
    nota: real
    encontrado: booleano
fvar
    Escribir (“DNI a buscar: “)
    Leer (buscar)
    encontrado := falso
    Leer (DNI)
    mientras (DNI <> FIN) y (no encontrado) hacer
        Leer (nota)
        si DNI = buscar entonces
            encontrado := cierto
        sino
            Leer (DNI)
        fsi
    fmientras
    si encontrado entonces
        Escribir (“La nota de “, buscar, “ es “, nota)
    sino
        Escribir (“El DNI “, buscar, “ no está matriculado”)
    fsi
falgoritmo

algoritmo   {búsqueda de DNI, con 50 alumnos}
 const
    LONG = 50
fconst
var
    DNI, buscar: entero  
    nota: real
    I: entero
    encontrado: booleano
 fvar
    Escribir (“DNI a buscar: “)
    Leer (buscar)
    encontrado := falso
    I := 1
    mientras (I <= LONG) y (no encontrado) hacer
        Leer (DNI, nota)
        si DNI = buscar entonces
            encontrado := cierto
        fsi
        I := I+1
    fmientras
    si encontrado entonces
        Escribir (“La nota de “, buscar, “ es “, nota)
    sino
        Escribir (“El DNI “, buscar, “ no está matriculado”)
    fsi
falgoritmo
 
program busca_DNI;   {buscar_DNI en secuencia con centinela  0 }
 const
    FIN = 0;
 var
    DNI, buscar: longInt;  // el tipo integer no acepta nº largo, debe ser longInt
    nota: real;
    encontrado: boolean;
   
 begin
    Write ('DNI a buscar: ');
    read (buscar);
    encontrado := false;
    read (DNI);
    while (DNI <> FIN) and (not encontrado)do begin
        read (nota);
        if DNI = buscar then begin
            encontrado := true;
        end
        else begin
            read (DNI);
        end;
    end;
    if encontrado then begin
        Writeln ('La nota de ', buscar, ' es ', nota:1:2);
    end
    else begin
        Writeln ('El DNI ', buscar, ' no estA matriculado');
    end;
end.
 
program busca_DNI;
 const
    LONG = 50;
 var
    DNI, buscar: longInt;  // el tipo integer no acepta nº largo, debe ser longInt
    nota: real;
    I: integer;
    encontrado: boolean;
   
 begin
    Write ('DNI a buscar: ');
    read (buscar);
    encontrado := false;
    I := 1;
    while (I <= LONG) and (not encontrado)do begin
        read (DNI, nota);
        if DNI = buscar then begin
            encontrado := true;
        end;
        I := I+1;
    end;
    if encontrado then begin
        Writeln ('La nota de ', buscar, ' es ', nota:1:2);
    end
    else begin
        Writeln ('El DNI ', buscar, ' no está matriculado');
    end;
end.



Combinación: Contabilidad de 12 meses, y por cada una secuencia de ingresos - gastos acabada en -1

algoritmo     {Primero de combinación}
const
    FIN = -1
fconst
var
    ingreso, gasto, beneficio: entero
fvar
    beneficio:= 0
    Leer (ingreso)
    mientras ingreso <> FIN hacer
        Leer (gasto)
        beneficio := beneficio + ingreso - gasto
        Leer (ingreso)
    fmientras
    Escribir (“Contabilidad total: ”, beneficio)
falgoritmo

algoritmo     {Segundo de combinación}
const
    MESES = 12
    MAXIMO = 1000
    MINIMO =-1000
fconst
var
    mes, mesmax, mesmin, max, min, beneficio: entero
fvar
    max := MINIMO
    min := MAXIMO
    mes := 1
    mientras mes <= MESES hacer
        Leer (beneficio)
        si beneficio > max entonces
            max := beneficio
            mesmax := mes
        fsi
        si beneficio < min entonces
            min := beneficio
            mesmin := mes
        fsi
        mes := mes +1
    fmientras
    Escribir (“Mes máximo beneficio: “, mesmax)
    Escribir (“Mes mínimo beneficio: “, mesmin)
falgortmo

algoritmo   {combinación de los dos ejercicios simples}
 const
    MESES = 12
    MAXIMO = 1000
    MINIMO =-1000
    FIN = -1
 fconst
 var

    mes, mesmax, mesmin, max, min, beneficio: entero
    ingreso, gasto: entero
 fvar
    max := MINIMO
    min := MAXIMO
    mes := 1
    mientras mes <= MESES  hacer
        beneficio:= 0
        Leer (ingreso)
        mientras ingreso <> FIN  hacer
            Leer (gasto)
            beneficio := beneficio + ingreso - gasto
            Leer (ingreso)
        fmientras
        si beneficio > max entonces
            max := beneficio
            mesmax := mes
        fsi
        si beneficio < min entonces
            min := beneficio
            mesmin := mes
        fsi
        mes := mes +1
    fmientras
    Escribir (“Mes máximo beneficio: “, mesmax)
    Escribir (“Mes mínimo beneficio: “, mesmin)
falgoritmo

program combina1;
 const
    FIN = -1;
 var
    ingreso, gasto, beneficio: integer;
 begin
    beneficio:= 0;
    read (ingreso);
    while ingreso <> FIN do begin
        read (gasto);
        beneficio := beneficio + ingreso - gasto;
        read (ingreso);
    end;
    Writeln ('Contabilidad total: ', beneficio);
end.

program combina2;
 const
    MESES = 12;
    MAXIMO = 1000;
    MINIMO =-1000;
 var
    mes, mesmax, mesmin, max, min, beneficio: integer;
 begin
    max := MINIMO;
    min := MAXIMO;
    mes := 1;
    while mes <= MESES do begin
        read (beneficio);
        if beneficio > max then begin
            max := beneficio;
            mesmax := mes;
        end;
        if beneficio < min then begin
            min := beneficio;
            mesmin := mes;
        end;
        mes := mes +1;
    end;
    writeln ('Mes mAximo beneficio: ', mesmax); // no usar acentos, los escribe mal
    writeln ('Mes mInimo beneficio: ', mesmin);
end.

program combinacion_completa;
 const
    MESES = 12;
    MAXIMO = 1000;
    MINIMO =-1000;
    FIN = -1;
 var
    mes, mesmax, mesmin, max, min, beneficio: integer;
    ingreso, gasto: integer;

 begin
    max := MINIMO;
    min := MAXIMO;
    mes := 1;
    while mes <= MESES do begin
        beneficio:= 0;
        read (ingreso);
        while ingreso <> FIN do begin
            read (gasto);
            beneficio := beneficio + ingreso - gasto;
            read (ingreso);
        end;
        if beneficio > max then begin
            max := beneficio;
            mesmax := mes;
        end;
        if beneficio < min then begin
            min := beneficio;
            mesmin := mes;
        end;
        mes := mes +1;
    end;
    writeln ('Mes mAximo beneficio: ', mesmax); // no usar acentos, los escribe mal
    writeln ('Mes mInimo beneficio: ', mesmin);
end.


Escribir un procedimiento que dado un carácter, si es mayúscula lo pase a minúscula

procedimiento AMinuscula (e_s c: Carácter)     //parámetro de entrada/salida
// si c es mayúscula lo pasa a minúscula, si no, no hace nada
        si ('A'<= c) y (c<='Z') entonces       
            c := ACarácter (AEntero(c)-AEntero('A')+AEntero('a'))
        fsi
fprocedimiento

procedure AMinuscula (var c:char); 
// si c es mayúscula lo pasa a minúscula, si no, no hace nada
begin
    if ('A'<= c) and (c<='Z') then begin 
        c := Chr (Ord(c)-Ord('A')+Ord('a'));
    end;
end;



Hacer una función que dados 2 números calcule su potencia por medio de productos

función potencia (ent base, exponente: entero): entero
{Recibe dos números, el exponente debe ser positivo}

{Devuelve la base elevada al exponente}
  var
     resultado: entero
  fvar
    resultado := 1
    mientras exponente > 0 hacer
       resultado := resultado * base
         exponente := exponente - 1
    fmientras
    potencia := resultado
falgoritmo

function potencia (ent base, exponente: integer): integer;
{Recibe dos números, el exponente debe ser positivo}
{Devuelve la base elevada al exponente}
  var
     resultado: integer;
  begin
    resultado := 1;
    while exponente > 0 do begin
       resultado := resultado * base;
       exponente := exponente - 1;
    end;
    potencia := resultado;
end;


Escribir una función que calcule el máximo común divisor de dos números por medio del algoritmo de Euclides

función mcd (ent a, b: entero): entero
{Recibe dos números positivos}
{Devuelve su máximo común divisor}
    mientras a <> b hacer
       si a > b entonces
          a := a-b
       sino
          b := b-a
       fsi
    fmientras
    mcd := a
falgoritmo


Dado un recorrido como una secuencia de puntos (x,y), reales, acabada en el pto (-1.0, -1.0), calcular la distancia recorrida (siempre habrá al menos 2 puntos)

program recorrido;
 function distancia (x1, y1, x2, y2: real):real;
 // calcula la distancia entre dos puntos
    begin
        distancia := sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
    end;
 var
    x1,y1,x2,y2,total: real;
begin
    total := 0.0;
    read (x1, y1);
    read (x2, y2);     // si no dijeran que hay más de dos puntos se podría copiar (x1,y1) en (x2,y2)
    while (x2 <> -1.0) and (y2 <> -1.0) do begin
        total := total + distancia (x1, y1, x2, y2);
        x1 := x2;         //guardo el punto anterior, y leo el nuevo punto
        y1 := y2;
        read (x2, y2);
    end;    
    writeln ('Distancia recorrida: ', total:1:2);
end.


Leer una palabra (secuencia de hasta 20 caracteres acabada en blanco) y escribirla al revés

algoritmo
   const MAX = 20 fconst
   tipos
    Tpalabra == tabla [1..MAX] de carácter
   ftipos
   var
    pal: Tpalabra
    c: carácter
    I: entero
   fvar
     I := 0        
     Leer (c) 
     mientras c <> '  ' hacer       
        I := I +1            
        pal [I] := c             
        Leer (c)      
    fmientras   
    mientras I > 0 hacer
        Escribir (pal[I])
        I := I -1        {decreciendo}
     fmientras
falgoritmo
    

Definir una matriz 5 x 5, y hacer un subprograma que devuelva su matriz traspuesta

tipos
    matriz5x5 == tabla [1..5, 1..5] de entero
ftipos

función
traspuesta (ent mat: matriz5x5): matriz5x5
{Recibe una matriz}

{Devuelve su traspuesta}
  var
    trasp: matriz5x5
    I, J: entero
  fvar
    I := 1
    mientras I <= 5 hacer   
       J := 1
       mientras J <= 5 hacer   
          trasp [I,J] := mat [J,I]
          J := J+1
       fmientras
       I := I +1
    fmientras
    traspuesta := trasp
falgoritmo

Realizar la misma función, pero haciendo la traspuesta sobre la misma matriz, sin usar otra matriz auxiliar, si no intercambiando valores (cuidado de no intercambiarlos dos veces)


Matriz producto


procedimiento MultiplicarMatrices (ent mat1, mat2: Tmatriz, sal matriz: Tmatriz)
   var    
        fila,col, I: entero   
    fvar
        fila:=1
        mientras fila ≤ MAX hacer
            col:=1
            mientras col ≤ MAX hacer
                matriz [fila,col] := 0
                I:=1
                mientras I ≤ MAX hacer
                    matriz [fila,col] := matriz [fila,col] + mat1 [fila,I] + mat2 [I,col]
                    I:=I+1
                fmientras
                col:=col+1
            fmientras
            fila:=fila+1
        fmientras
fprocedimiento