UTN – FRLP – Ing. en Sistemas de Información – Algoritmos y Estructura de Datos Trabajos Prácticos – Curso 2010 Práctico de Pascal Nº 2 Ejercicios para la ejercitación del Lenguaje Pascal Objetivo: Es que los alumnos conozcan un lenguaje de programación, donde puedan ejercitar los conocimiento adquiridos hasta ahora en los TP de Pseudocodigo. En nuestra página encontrara un conjunto de apuntes de lenguaje pascal en la sección Apuntes. La versión que vamos a tomar como referencia es el FreePascal.org Descarga: http://www.freepascal.org/download.var Ejercicios 1. El siguiente programa captura 10 edades y nombres por medio de arrays paralelos y los muestra ordenados en forma ascendente PROGRAM Paralelo_edades; USES Crt; CONST MaxPersonas = 10; VAR edades : array [1..MaxPersonas] of byte; nombres : array [1..MaxPersonas] of string [10]; aux_nom : string[10]; i,j,aux_edad :byte; BEGIN ClrScr; {lectura de arrays paralelos de manera simultánea} FOR i:=1 to MaxPersonas DO BEGIN gotoxy(10,5); ClrEol; WRITE(i,'.- Nombre : ','Edad : '); gotoxy(23,5);ReadLn(nombres[i]) ; gotoxy(48,5);ReadLn(edades[i]) END; {ordenación} FOR i:=1 to MaxPersonas-1 DO BEGIN FOR j:=i+1 to MaxPersonas DO BEGIN IF edades[i]>edades[j] THEN BEGIN aux_edad :=edades[i]; edades[i] :=edades[j]; edades[j] :=aux_edad; aux_nom :=nombres[i]; nombres[i]:=nombres[j]; nombres[j]:=aux_nom END Página 1 de 12 Ing. Gustavo J.A. Cerveri – JTP [email protected] UTN – FRLP – Ing. en Sistemas de Información – Algoritmos y Estructura de Datos Trabajos Prácticos – Curso 2010 END; WRITELN(nombres[i]:10,' ',edades[i]:3) {escritura de los arrays paralelos} END; Readkey END. Esquema como se distribuyen los vectores: Arreglos Paralelos 2. El siguiente programa captura las calificaciones de 5 alumnos en 3 exámenes, y despliega en pantalla los promedios ordenados en forma descendente PROGRAM Matriz_Vector; Uses Crt; Const MaxAlumno = 5; MaxExamen = 4;{Columna 4 almacena el promedio} Var Alumno :array[1..MaxAlumno] of string[10]; examen :array[1..MaxAlumno,1..MaxExamen] of real; aux_examen :array[1..MaxExamen] of real; {reserva 20 posiciones de memoria de datos reales : 5 filas por 4 columnas} promedio :real; aux_alumno :string [10]; i,j,col,ren :byte; BEGIN ClrScr; {Lectura de arrays paralelos de manera simultánea} gotoxy(5,5);WRITE('Nombre'); gotoxy(20,5);WRITE('Examen1 Examen2 Examen3 Promedio'); col:=5;ren:=6; FOR i:=1 to MaxAlumno DO BEGIN gotoxy(col,ren); ReadLn(alumno[i]); {lectura de vector} col:=22;promedio:=0; FOR j:=1 to MaxExamen-1 DO BEGIN gotoxy(col,ren); ReadLn(examen[i,j]); {lectura de matríz} promedio:=promedio+examen[i,j]; col:=col+10 Página 2 de 12 Ing. Gustavo J.A. Cerveri – JTP [email protected] UTN – FRLP – Ing. en Sistemas de Información – Algoritmos y Estructura de Datos Trabajos Prácticos – Curso 2010 END; examen[i,j+1]:=promedio/3; gotoxy(col,ren);WRITE(promedio/3:3:2); inc(ren); col:=5 END; {Ordenación} FOR i:=1 to MaxAlumno-1 DO FOR j:=i+1 to MaxAlumno DO BEGIN IF examen[i,MaxExamen]<examen[j,MaxExamen] THEN BEGIN {Intercambio de nombres en vector} aux_alumno:=alumno[i]; alumno[i] :=alumno[j]; alumno[j] :=aux_alumno; {Intercambio de calificaciones en matríz} move(examen[i],aux_examen,SizeOf(aux_examen)); move(examen[j],examen[i],SizeOf(aux_examen)); move(aux_examen,examen[j],SizeOf(aux_examen)) END END; {Recorrido de matriz y vector} gotoxy(25,14);WRITE('Datos ordenados'); gotoxy(5,16);WRITE('Nombre'); gotoxy(20,16);WRITE('Examen1 Examen2 Examen3 Promedio'); col:=5;ren:=17; FOR i:=1 to MaxAlumno DO BEGIN gotoxy(col,ren); WRITE(alumno[i]); col:=22; FOR j:=1 to MaxExamen DO BEGIN gotoxy(col,ren); WRITE(examen[i,j]:3:2); col:=col+10 END; col:=5; inc(ren) END; readkey END. Página 3 de 12 Ing. Gustavo J.A. Cerveri – JTP [email protected] UTN – FRLP – Ing. en Sistemas de Información – Algoritmos y Estructura de Datos Trabajos Prácticos – Curso 2010 Esquema como se distribuyen los vectores: Arreglos (Tablas) 3. El siguiente programa captura calificaciones de 5 alumnos en 3 exámenes de 3 materias distintas, y despliega en pantalla los promedios ordenados en forma descendente PROGRAM 3D; Uses Crt; Const MaxAlumno = 5; MaxExamen = 4; {Columna 4 almacena el promedio} MaxMateria = 3; materia : array[1..3]of string[8]=('Fisica','Ingles','Historia'); VAR Alumno : array [1..MaxAlumno] of string[10]; examen : array [1..MaxAlumno,1..MaxExamen,1..MaxMateria] of real; aux_examen : array [1..MaxExamen]of real; {reserva 60 posiciones de memoria de datos reales : 5 filas por 4 columnas y 3 dimensiones} promedio :real; aux_alumno :string [10]; i,j,k,col,ren : byte; BEGIN ClrScr; {lectura de arrays paralelos de manera simultánea} FOR k:=1 to MaxMateria DO BEGIN ClrScr; gotoxy(34,3);WRITE(materia[k]); gotoxy(5,5);WRITE('Nombre'); gotoxy(20,5);WRITE('Examen1 Examen2 Examen3 Promedio'); col:=5;ren:=6; FOR i:=1 to MaxAlumno DO BEGIN gotoxy(col,ren); IF k=1 THEN ReadLn(alumno[i]) {lectura de vector} ELSE WRITE(alumno[i]); col:=22;promedio:=0; FOR j:=1 to MaxExamen-1 DO Página 4 de 12 Ing. Gustavo J.A. Cerveri – JTP [email protected] UTN – FRLP – Ing. en Sistemas de Información – Algoritmos y Estructura de Datos Trabajos Prácticos – Curso 2010 BEGIN gotoxy(col,ren); ReadLn(examen[i,j,k]); {lectura de matríz} promedio:=promedio+examen[i,j,k]; col:=col+10 END; examen[i,j+1,k]:=promedio/3; gotoxy(col,ren);WRITE(promedio/3:3:2); inc(ren); col:=5 END; gotoxy(15,22); WRITE('Presione una tecla para continuar....'); ReadKey END; {ordenación} FOR k:=1 to MaxMateria DO FOR i:=1 to MaxAlumno-1 DO FOR j:=i+1 to MaxAlumno DO BEGIN IF examen[i,MaxExamen,k]<examen[j,MaxExamen,k] THEN BEGIN {Intercambio de nombres en vector} aux_alumno:=alumno[i]; alumno[i] :=alumno[j]; alumno[j] :=aux_alumno; {intercambio de calificaciones en matríz} move(examen[i,k],aux_examen,SizeOf(aux_examen)); move(examen[j,k],examen[i,k],SizeOf(aux_examen)); move(aux_examen,examen[j,k],SizeOf(aux_examen)) END END; {Recorrido de matríz y vector} FOR k:=1 to MaxMateria DO BEGIN ClrScr; gotoxy(35,4);WRITE(materia[k]); gotoxy(25,5);WRITE('Datos ordenados'); gotoxy(5,6);WRITE('Nombre'); gotoxy(20,6);WRITE('Examen1 Examen2 Examen3 Promedio'); col:=5;ren:=7; FOR i:=1 to MaxAlumno DO BEGIN gotoxy(col,ren); WRITE(alumno[i]); col:=22; FOR j:=1 to MaxExamen DO BEGIN gotoxy(col,ren); WRITE(examen[i,j,k]:3:2); Página 5 de 12 Ing. Gustavo J.A. Cerveri – JTP [email protected] UTN – FRLP – Ing. en Sistemas de Información – Algoritmos y Estructura de Datos Trabajos Prácticos – Curso 2010 col:=col+10 END; col:=5; inc(ren) END; gotoxy(15,22); WRITE('Presione una tecla para continuar....'); readkey END END. Esquema como se distribuyen los vectores: Arreglos (Varias Dimensiones) 4. El siguiente programa captura un numero entero y lo pasa a binario PROGRAM binario; USES crt; PROCEDURE bina (VAR nro:integer); BEGIN IF ( nro=0 or nro=1) THEN WRITELN (nro); ELSE BEGIN bina(nro div 2); WRITELN( nro mod 2); END; END; VAR a: integer; BEGIN WRITELN ('Ingrese el nro a covertir'); readln (a); bina(a); readkey; END. 5. El siguiente programa se aplica el método de inserción para un vector de 5 elemento Página 6 de 12 Ing. Gustavo J.A. Cerveri – JTP [email protected] UTN – FRLP – Ing. en Sistemas de Información – Algoritmos y Estructura de Datos Trabajos Prácticos – Curso 2010 PROGRAM inser; USES CRT; type vec=array [1..5] of integer; PROCEDURE lista (VAR x:vec); VAR j: integer; BEGIN FOR j:=1 to 5 DO WRITELN('vec(',j,')=', x[J]); readkey; END; PROCEDURE insercion( VAR vector:vec); VAR i,j, index: integer; BEGIN FOR i:= 2 to 5 DO BEGIN index:= vector[i]; j:=i; while ((j>1) and (vector[j-1]>index)) DO BEGIN vector[j]:=vector[j-1]; j:=j-1; END; vector[j]:=index; lista (vector); END; END; VAR a:vec; j: integer; BEGIN a[1]:=-1; a[2]:=0; a[3]:=5; a[4]:=3; a[5]:=-5; insercion (a); lista (a); END. 6. Escribir un programa en Pascal que solicite cinco números, los almacene en un array y luego calcule la media aritmética de esos números. PROGRAM Media; USES CRT; VAR arr_num:ARRAY [1..5] of REAL; VAR i, num:INTEGER; VAR media:REAL; Página 7 de 12 Ing. Gustavo J.A. Cerveri – JTP [email protected] UTN – FRLP – Ing. en Sistemas de Información – Algoritmos y Estructura de Datos Trabajos Prácticos – Curso 2010 BEGIN ClrScr; WRITELN ('Escriba 5 numeros para hacer su media aritmetica: '); FOR i := 1 TO 5 DO BEGIN READLN(num); arr_num[i]:=num; END; FOR i:=1 TO 5 DO media:= media + arr_num[i]; media:= media / i; WRITELN ('La media aritmetica es: ',media:5:2); END. 7. Escribir un programa en Pascal que determine la posición de la siguiente matriz en la que se encuentra el valor máximo 23 45 68 34 99 12 25 78 89 PROGRAM Valor_Max USES CRT; CONST arr_num:ARRAY[1..3,1..3] of INTEGER=( (23,45,68), (34,99,12), (25,78,89) ); VAR i,j,val_max,pos_max_i,pos_max_j:INTEGER; BEGIN ClrScr; val_max:=arr_num[1,1]; 67 FOR i:=1 TO 3 DO BEGIN FOR j:=1 TO 3 DO BEGIN IF arr_num[i,j] > val_max THEN BEGIN val_max:=arr_num[i,j]; pos_max_i:=i; pos_max_j:=j; END; END; END; WRITELN( 'VALOR MAXIMO: ', val_max:3, ' POSICION: ', pos_max_i:3,pos_max_i:3); END. 8. Escribir un programa en Pascal que sume, independientemente, los elementos positivos y negativos de la siguiente matriz: -12 23 32 45 -56 -10 25 78 89 Página 8 de 12 Ing. Gustavo J.A. Cerveri – JTP [email protected] UTN – FRLP – Ing. en Sistemas de Información – Algoritmos y Estructura de Datos Trabajos Prácticos – Curso 2010 PROGRAM Sume; USES CRT; CONST arr_num:ARRAY[1..3,1..3] of INTEGER=( (-12,23,-32), (45,-56,-10), (25,78,89) ); VAR i,j,suma_pos,suma_neg:INTEGER; BEGIN suma_pos:=0; suma_neg:=0; ClrScr; FOR i:=1 TO 3 DO BEGIN FOR j:=1 TO 3 DO BEGIN IF arr_num[i,j] < 0 THEN suma_neg:=suma_neg+arr_num[i,j] ELSE suma_pos:=suma_pos+arr_num[i,j] END; END; WRITELN('SUMA POSITIVOS: ', suma_pos:5); WRITELN('SUMA NEGATIVOS: ', suma_neg:5); END. 9. Escribir un programa en Pascal que almacene en la segunda fila de la siguiente matriz los cuadrados de los datos de la primera fila: 36789 00000 PROGRAM Almacene; USES CRT; CONST arr_num:ARRAY [1..2,1..5] of INTEGER=( (3,6,7,8,9), (0,0,0,0,0) ); VAR i,j,cuad:INTEGER; BEGIN ClrScr; i:=1; FOR j:=1 TO 5 DO BEGIN FOR i:=1 TO 1 DO BEGIN cuad:=sqr(arr_num[i,j]); arr_num[2,j]:= cuad; WRITELN (arr_num[2,j]); END; END; END. 10. Escribir un programa en Pascal que sume los elementos de cada una de las filas y de las columnas de la siguiente matriz; el resultado de cada suma se almacenará en la última posición de la fila o columna correspondiente. Además la suma total de todos los elementos de la matriz se almacenará en el elemento de la esquina inferior derecha de la matriz: Página 9 de 12 Ing. Gustavo J.A. Cerveri – JTP [email protected] UTN – FRLP – Ing. en Sistemas de Información – Algoritmos y Estructura de Datos Trabajos Prácticos – Curso 2010 170 560 640 730 000 PROGRAM Ej10; USES CRT; CONST arr_num:ARRAY [1..5,1..3] of INTEGER=( (1,7,0),(5,6,0), (6,4,0),(7,3,0), (0,0,0) ); VAR i,j,total:INTEGER; VAR suma_h,suma_v:INTEGER; {Es la suma horizontal y vertical} BEGIN ClrScr; total := 0; FOR i:=1 TO 5 DO BEGIN suma_h:=0; FOR j:=1 TO 3 DO suma_h:= suma_h + arr_num[i,j]; WRITELN ('La suma de la fila ',i,' es: ',suma_h:3); total:=total + suma_h; END; WRITELN (''); FOR j:=1 TO 2 DO BEGIN suma_v:=0; FOR i:=1 TO 5 DO suma_v:= suma_v + arr_num[i,j]; WRITELN ('La suma de la columna ',j,' es: ',suma_v:3); total:=total + suma_v; END; WRITELN (''); WRITELN ('La suma total es: ',total); END. 11. 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 Nombres (Input, Output); Uses Crt; Const numalumnos = 5; Type tiponotas = record nombre: String; parcial, final: real end; notasclase = array [1..Numalumnos] of tiponotas; VAR I3: notasclase; nota1, nota2: real; alumno: String; index: integer; Begin ClrScr; Página 10 de 12 Ing. Gustavo J.A. Cerveri – JTP [email protected] UTN – FRLP – Ing. en Sistemas de Información – Algoritmos y Estructura de Datos Trabajos Prácticos – Curso 2010 for index := 1 to numalumnos do begin write('Nombre de alumno(',index,'): '); readln(alumno); write('Nota del examen parcial: '); readln(nota1); write('Nota del examen final: '); readln(nota2); WRITELN; with i3[index] DO begin nombre := alumno; parcial := nota1; final := nota2 end end; ClrScr; WRITELN('NOMBRE ':30,'Parcial':10,'Final':10,'Media':10,' CALIFICACION'); for index := 1 to 75 DO write('-'); WRITELN; for index := 1 to numalumnos DO with i3[index] DO begin {Escribir la lista con los resultados.} nota1 := (parcial+final)/2; {Se calcula la media.} write(nombre:30,parcial:10:2,final:10:2); write(nota1:10:2); {Si la nota media es superior a 5, el alumno est aprobado:} if nota1 >= 5 THEN WRITELN(' *** APTO *** ') ELSE WRITELN(' NO APTO') END; readkey END. 12. 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 EJER010; Uses Crt; Const numpersonas = 2; {Cambiando este valor lo podremos hacer para el numero de personas que deseemos} Type caracteristicas = record nombre2, nacionalidad2, sexo2: String; edad2: Integer; c_ojos2: Char; tf2: Real; {Creamos una fila con diferentes apartados} END; personas = Array[1..numpersonas] of caracteristicas; {La copiamos tantas veces como personas haya} VAR persons : personas; nombre, nacionalidad, sexo: String; edad, i: Integer; c_ojos: Char; Página 11 de 12 Ing. Gustavo J.A. Cerveri – JTP [email protected] UTN – FRLP – Ing. en Sistemas de Información – Algoritmos y Estructura de Datos Trabajos Prácticos – Curso 2010 tf: Real; 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') or (sexo = 'h') or (sexo = 'm'); WRITE('Telefono: '); READLN(tf); Repeat WRITE('Color de ojos (A, V, M): '); READLN(c_ojos); c_ojos := UPCASE(c_ojos); Until (c_ojos = 'A') or (c_ojos = 'V') or (c_ojos = 'M'); WRITELN; With persons[i] DO Begin nombre2 := nombre; edad2 := edad; nacionalidad2 := nacionalidad; If (sexo = 'H') or (sexo = 'h') THEN sexo2 := 'S¡ gracias'; tf2 := tf; c_ojos2 := c_ojos; {Almacenamos los datos dentro del array de registro} END; END; textcolor(11); WRITELN('Nombre':14,'Edad':6,'Nacionalidad':14,'Sexo':12,'Telefono':12,'Color Ing. Nahiby Castillo 9 ojos':12); textcolor(7); For i := 1 to numpersonas DO Begin with persons[i] DO Begin WRITELN(nombre2:14,edad2:6,Nacionalidad2:14,sexo2:12,tf2:12:0,c_ojos2:12); END; END; END. Página 12 de 12 Ing. Gustavo J.A. Cerveri – JTP [email protected]