Ejercicios resueltos en Pascal: Arrays, Registros, Bucles y Condiciones

Ejercicio 1: Contar temperaturas bajo cero

Escribir un programa que lea 5 valores de temperatura, y escriba el número de veces que estuvo bajo 0º.


PROGRAM EJER_002;
Uses Crt;
var 
  temp, i, cont: Integer;
Begin
  WRITELN('Introduzca 5 valores de temperatura:');
  WRITELN;
  cont := 0;
  For i := 0 to 4 do
  Begin
    WRITE('Valor ', i + 1, ' : '); {i + 1 mostrará valores del 1 al 5}
    Readln(temp);
    If temp < 0 then
      inc(cont); {cont = cont + 1}
  End;
  WRITELN;
  WRITE('La temperatura ha estado ', cont);
  If cont = 1 then
    WRITE(' vez bajo 0')
  Else
    WRITE(' veces bajo 0');
End.

Ejercicio 2: Contar notas 0, 5 y 10

Se realiza un examen, se piden las notas del número de alumnos introducidos por el usuario, las cuales pueden ser únicamente enteras entre 0 y 10. Debe decirse cuántos 0, 5 y 10 han aparecido. También deben decirse las notas introducidas que no sean 0, 5 o 10.


PROGRAM EJER_003;
Uses Crt;
var 
  cero, cinco, diez: Integer;
  nota, i, alumnos: Integer;
  notas_no: Array[1..30] of Integer;
Begin
  ClrScr;
  cero := 0;
  cinco := 0;
  diez := 0;
  WRITE('Introduzca el numero de alumnos: '); 
  READLN(alumnos);
  WRITELN;
  WRITELN('Introduzca las calificaciones: (en valores enteros) ');
  WRITELN;
  For i := 1 to alumnos do
  Begin
    WRITE('Alumno: '); 
    READLN(nota);
    If nota = 0 then 
      inc(cero)
    else if nota = 5 then 
      inc(cinco)
    else if nota = 10 then 
      inc(diez)
    else
      notas_no[i] := nota;
  End;
  WRITELN;
  WRITE('Ha habido ', cero);
  If cero = 1 then 
    WRITELN(' cero.') 
  else 
    WRITELN(' ceros.');
  WRITE('Ha habido ', cinco);
  If cinco = 1 then 
    WRITELN(' cinco.') 
  else 
    WRITELN(' cincos.');
  WRITE('Ha habido ', diez);
  If diez = 1 then 
    WRITELN(' diez.') 
  else 
    WRITELN(' dieces.');
  WRITELN;
  WRITELN('Las notas aparecidas que no son 0, 5 o 10 son: ');
  For i := 1 to alumnos DO
    If notas_no[i] <> 0 then 
      WRITE(notas_no[i], ', ');
END.

Ejercicio 3: Contar vocales en una frase

Decir el número de vocales que aparecen en una frase introducida por el usuario. Debe acabar con un punto.


PROGRAM EJER_004;
Uses Crt;
Const 
  vocales: Set of Char = (['A', 'E', 'I', 'O', 'U']);
  {Poniéndolas en mayúsculas conseguimos unificar el valor de las vocales
  y evitamos decir al usuario que las introduzca en mayúsculas o
  minúsculas}
var 
  cont, i: Integer;
  letra: Char;
  frase: Array[1..85] of Char;
Begin
  ClrScr;
  WRITELN('Escriba una frase, acabando con un punto'); 
  WRITELN;
  i := 0;
  cont := 0;
  REPEAT
    inc(i);
    letra := Readkey; {Readkey no mostrará los caracteres en pantalla}
    WRITE(letra); {Debemos incluirlo para que nos muestre los caracteres}
    if UPCASE(letra) in vocales then {preguntamos si la letra introducida es una vocal}
      inc(cont);
    frase[i] := letra; {guardamos el valor de la letra en el array frase}
  UNTIL letra = '.';
  WRITELN;
  WRITELN;
  WRITE('El numero de vocales introducidas es ', cont);
End.


PROGRAM EJER_004_2;
Uses Crt;
Const 
  vocales: Set of Char = (['A', 'E', 'I', 'O', 'U']);
  {Poniéndolas en mayúsculas conseguimos unificar el valor de las vocales
  y evitamos decir al usuario que las introduzca en mayúsculas o
  minúsculas}
var 
  cont, i: Integer;
  letra: Char;
  frase: String; {Es lo único que cambia con respecto a la otra versión}
Begin
  ClrScr;
  WRITELN('Escriba una frase, acabando con un punto'); 
  WRITELN;
  i := 0;
  cont := 0;
  REPEAT
    inc(i);
    letra := Readkey; {Readkey no mostrará los caracteres en pantalla}
    WRITE(letra); {Debemos incluirlo para que nos muestre los caracteres}
    if UPCASE(letra) in vocales then {preguntamos si la letra introducida es una vocal}
      inc(cont);
    frase[i] := letra; {guardamos el valor de la letra en el array frase}
  UNTIL letra = '.';
  WRITELN;
  WRITELN;
  WRITE('El numero de vocales introducidas es ', cont);
End.

Ejercicio 4: Mostrar letras del abecedario en una frase

Pedir que se introduzca una frase, acabada con un punto, en la que se lean las letras del abecedario introducidas y se muestren posteriormente.


PROGRAM EJER005;
Uses Crt;
var 
  caracter: Char;
  abc: String;
  i, longitud: Integer;
Begin
  ClrScr;
  WRITELN('Escriba una frase, terminando con un punto');
  WRITELN;
  i := 0;
  longitud := 0;
  abc:='';
  REPEAT
    caracter := Upcase(Readkey);
    WRITE(caracter);
    If caracter in ['A'..'Z'] then
    Begin
      abc := abc + caracter; {Se concatenan las letras del abecedario}
      inc(i);
    End;
  UNTIL caracter = '.';
  longitud := i;
  WRITELN;
  WRITELN;
  WRITELN('Las letras del abecedario introducidas son: ');
  WRITELN;
  For i := 1 To length(abc) Do
    WRITE(abc[i], ' ');
End.

Ejercicio 5: Invertir una frase

Escribir un programa en Pascal que lea una frase introducida desde el teclado y la escriba al revés.


PROGRAM EJ006;
Uses Crt;
var 
  frase: String; {Se puede hacer con arrays}
  f_inv: String; {Cada uno debe elegir la manera que mejor entienda, y controle, eso sí, siempre hay que dominar las dos formas.}
  i: Integer;
Begin
  ClrScr;
  i := 0;
  WRITELN('Escriba una frase:');
  READLN(frase);
  WRITELN;
  WRITELN;
  For i := 1 to length(frase) do {desde la primera posición de la frase hasta la última almacenamos la frase en una variable}
    f_inv := f_inv + frase[i];
  FOR i := length(frase) downto 1 do
    WRITE(f_inv[i]);
End.


PROGRAM EJER006_2;
Uses Crt;
var 
  frase: String;
  i: Integer;
Begin
  ClrScr;
  i := 0;
  WRITELN('Escriba una frase:');
  WRITELN;
  READLN(frase);
  WRITELN;
  FOR i := length(frase) downto 1 do {Si ponemos "downto 0" nos pasaríamos en un carácter}
    WRITE(frase[i]);
  {Si lo único que quieres es mostrar la cadena de caracteres a la inversa, en esta versión lo hemos hecho únicamente con una variable}
End.

Ejercicio 6: Comparar dos arrays de caracteres

Escribir un programa que compare dos arrays de caracteres y nos diga si son idénticos o no.


PROGRAM EJER007;
Uses Crt;
var 
  frase1, frase2: String;
  index, long1, long2: Integer; {long1 y long2 son la longitud de las cadenas}
  letra: Char;
  iguales: Boolean;
Begin
  ClrScr;
  WRITELN('Introduzca la primera cadena de caracteres, finalizando con un punto');
  WRITELN;
  index := 1;
  long1 := 0;
  long2 := 0;
  frase1:='';
  frase2:='';
  REPEAT
    letra := Readkey;
    write(letra); {Readkey no muestra los caracteres en pantalla, write sí}
    frase1 := frase1 + letra; {vamos almacenando cada letra en la variable}
    index := index + 1;
  UNTIL letra = '.';
  long1 := index-1; {medimos la longitud de la cadena}
  WRITELN;
  WRITELN;
  WRITE('Introduzca la segunda cadena de caracteres, finalizando con un punto');
  WRITELN;
  WRITELN;
  letra := ' ';
  index := 1;
  REPEAT
    letra := Readkey;
    write(letra);
    frase2 := frase2 + letra; {vamos almacenando cada letra en la variable}
    index := index + 1;
  UNTIL letra = '.';
  long2 := index-1; {medimos la longitud de la cadena}
  WRITELN;
  WRITELN;
  If long1 <> long2 then {Si la longitud es distinta, SEGURO que no son iguales}
    WRITELN('Las cadenas de caracteres son distintas')
    {*Pongo dos mensajes distintos para que veamos en qué bucle ha entrado en los diferentes casos que se pueden dar}
  Else
  Begin
    iguales:=true;
    For index := 1 to long1 do
    Begin
      if frase1[index] <> frase2[index] then
      Begin
        iguales:=false;
        WRITE('Las cadenas de caracteres no son iguales');
        {*Pongo dos mensajes distintos para que veamos en qué bucle ha entrado
        en los diferentes casos que se pueden dar}
        exit;
      End;
    End;
  End;
  If iguales = true then 
    WRITELN('Las cadenas de caracteres son iguales');
End.

Ejercicio 7: Sumar valores encima de la diagonal principal de una matriz

Escribir un programa en Pascal que sume los valores que hay por encima de la diagonal principal. Los valores se pueden asignar como una constante.


PROGRAM EJER008;
Uses Crt;
Const 
  N = 4; {Número de filas y columnas de la matriz}
  matriz: Array[1..N, 1..N] of Integer = (
    (1, 2, 3, 4),
    (5, 6, 7, 8),
    (9, 10, 11, 12),
    (13, 14, 15, 16)
  );
  {Declaramos la matriz}
var 
  i, j, suma: Integer;
  {i se corresponde con las filas y j con las columnas}
Begin
  ClrScr; {limpiamos la pantalla}
  {los valores de la diagonal principal son (1,1) (2,2) (3,3) (4,4).
  Como este ejercicio consiste en sumar los valores que hay encima de la diagonal principal, sumaremos: 2 + 3 + 4 + 7 + 8 + 12}
  {Escribimos la matriz original y coloreamos los valores que necesitamos}
  For i := 1 to N Do
  Begin
    For j := 1 to N Do
    Begin
      If j > i then
        TextColor(9) {Cambiando el número elegiremos el color}
      Else
        TextColor(7);
      WRITE(matriz[i, j]:3);
    End;
    WRITELN(' ');
  End;
  WRITELN;
  {Suma de los valores de la primera fila de la matriz}
  suma := 0;
  i := 1;
  FOR j := 2 to N do
  Begin
    suma := suma + matriz[i, j];
    WRITELN(suma); {Lo escribimos para chequear los valores, podríamos escribir un write al final y sería suficiente}
  End;
  {Suma de los valores de la segunda fila}
  i := 2;
  FOR j := 3 to N do
  Begin
    suma := suma + matriz[i, j];
    WRITELN(suma);
  End;
  WRITELN;
  {Suma de los valores de la tercera fila}
  i := 3;
  FOR j := 4 to N do {N ya vale 4, por lo que solo se realiza 1 vez el bucle}
  Begin
    suma := suma + matriz[i, j];
    WRITELN('El resultado final es: ', suma);
  End;
End.

Ejercicio 8: Calcular la nota media de alumnos y mostrar aptitud

Escribir un programa en Pascal que almacene en un array de registros los nombres de los alumnos, sus notas parciales y finales. Hallar la nota media y mostrar un mensaje de APTO si el alumno supera o iguala la calificación de 5 o NO APTO si no lo alcanza. Hacerlo para un número de 5 alumnos.


PROGRAM EJER009;
Uses Crt;
Const 
  numalumnos = 5;
Type 
  tnotas = record
    nombre2: String;
    n_parcial2, n_final2: Real; {Nota parcial y final}
  end;
  {Hacemos una fila dividida en 4 partes:tnotas, nombre2, n_parcial2, n_final2. Es como una tabla de Word, la cual iremos rellenando con los datos obtenidos}
  notas = Array[1..numalumnos] of tnotas;
  {Ahora la copiamos tantas veces como número de alumnos hay, es decir, obtenemos 5 filas iguales}
var 
  clase: notas;
  nombre: String;
  n_parcial, n_final, n_media: Real;
  i: Integer;
Begin
  ClrScr;
  For i := 1 to numalumnos Do
  Begin
    WRITE('Introduzca el nombre del alumno ', i, ' : ');
    READLN(nombre);
    WRITE('Introduzca su nota parcial: ');
    READLN(n_parcial);
    WRITE('Introduzca su nota final: ');
    READLN(n_final);
    WRITELN;
    With clase[i] Do
    Begin
      n_parcial2 := n_parcial;
      n_final2 := n_final;
      nombre2 := nombre;
    End;
  End;
  ClrScr;
  WRITELN('NOMBRE':25, 'Parcial':8, 'Final':8, 'Media':8, 'CALIFICACION':15);
  WRITELN;
  For i := 1 to numalumnos do
    With clase[i] do
    Begin
      n_media := (n_parcial2 + n_final2) / 2;
      WRITE(nombre2:25, n_parcial2:8:2, n_final2:8:2);
      textcolor(14); 
      WRITE(n_media:8:2);
      If n_media >= 5 then
      Begin
        textcolor(11);
        WRITELN('APTO  :-)':15);
      End
      Else
      Begin
        textcolor(1);
        WRITELN('NO APTO :-(':15);
      End;
      textcolor(7);
    End;
End.

Ejercicio 9: Almacenar características de personas en un array de registros

Escribir un programa en Pascal que almacene en un array de registros las características de cada persona: nombre, sexo, edad, peso, color de pelo, color de piel, color de ojos, nacionalidad y teléfono.


PROGRAM EJER_010;
Uses Crt;
Const 
  numpersonas = 1; {Cambiando este valor lo podremos hacer para el número de personas que deseemos}
Type 
  caracteristicas = record
    nombre2, nacionalidad2: String;
    edad2: Integer;
    sexo2, c_pelo2, c_ojos2: Char;
    tf2: Longint;
  end;
  {Creamos una fila con diferentes apartados}
  personas = Array[1..numpersonas] of caracteristicas;
  {La copiamos tantas veces como personas haya}
var 
  persons: personas;
  nombre, nacionalidad: String;
  edad, i: Integer;
  sexo, c_pelo, c_ojos: Char;
  tf: Longint;
Begin
  ClrScr;
  For i := 1 to numpersonas do
  Begin
    WRITELN('Introduzca los datos de la persona numero ', i, ' : ');
    WRITELN;
    WRITE('Nombre:         '); 
    READLN(nombre);
    WRITE('Edad:           '); 
    READLN(edad);
    WRITE('Nacionalidad:   '); 
    READLN(nacionalidad);
    Repeat
      WRITE('Sexo (H, M):    '); 
      READLN(sexo);
    Until (sexo = 'H') or (sexo = 'M');
    WRITE('Teléfono:       '); 
    READLN(tf);
    Repeat
      WRITE('Color de ojos (A, V, M):  '); 
      READLN(c_ojos);
    Until (c_ojos = 'A') or (c_ojos = 'V') or (c_ojos = 'M');
    Repeat
      WRITE('Color de pelo (R, M, C):  '); 
      READLN(c_pelo);
    Until (c_pelo = 'R') or (c_pelo = 'M') or (c_pelo = 'C');
    WRITELN;
    With persons[i] do
    Begin
      nombre2 := nombre;
      edad2 := edad;
      nacionalidad2 := nacionalidad;
      sexo2 := sexo;
      tf2 := tf;
      c_ojos2 := (c_ojos);
      c_pelo2 := (c_pelo);
      {Almacenamos los datos dentro del array de registro}
    End;
  End;
  textcolor(11);
  WRITELN('Nombre':15, 'Edad':6, 'Nacionalidad':15, 'Sexo':6, 'Teléfono':12, 'Color ojos':12, 'Color pelo':12);
  textcolor(7);
  For i := 1 to numpersonas do
  Begin
    with persons[i] do
    Begin
      WRITE(nombre2:15, edad2:6, Nacionalidad2:15, sexo2:6, tf2:12, c_ojos2:12, c_pelo2:12);
    end;
  end;
  Readln;
End.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.