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; {lectura de arrays paralelos de manera simultánea} FOR i:=1 to MaxPersonas DO gotoxy(10,5); ClrEol; WRITE(i,'.- Nombre : ','Edad : '); gotoxy(23,5);readln(nombres[i]) ; gotoxy(48,5);readln(edades[i]) {ordenación} FOR i:=1 to MaxPersonas-1 DO FOR j:=i+1 to MaxPersonas DO IF edades[i]>edades[j] THEN 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 gcerveri@frlp.utn.edu.ar
WRITELN(nombres[i]:10,' ',edades[i]:3) {escritura de los arrays paralelos} Readkey 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; {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 ReadLn(alumno[i]); {lectura de vector} col:=22;promedio:=0; FOR j:=1 to MaxExamen-1 DO 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 gcerveri@frlp.utn.edu.ar
examen[i,j+1]:=promedio/3; WRITE(promedio/3:3:2); inc(ren); col:=5 {Ordenación} FOR i:=1 to MaxAlumno-1 DO FOR j:=i+1 to MaxAlumno DO IF examen[i,maxexamen]<examen[j,maxexamen] THEN {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 {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 WRITE(alumno[i]); col:=22; FOR j:=1 to MaxExamen DO WRITE(examen[i,j]:3:2); col:=col+10 col:=5; inc(ren) readkey Página 3 de 12 Ing. Gustavo J.A. Cerveri JTP gcerveri@frlp.utn.edu.ar
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; {lectura de arrays paralelos de manera simultánea} FOR k:=1 to MaxMateria DO 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 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 gcerveri@frlp.utn.edu.ar
ReadLn(examen[i,j,k]); {lectura de matríz} promedio:=promedio+examen[i,j,k]; col:=col+10 examen[i,j+1,k]:=promedio/3; WRITE(promedio/3:3:2); inc(ren); col:=5 gotoxy(15,22); WRITE('Presione una tecla para continuar...'); ReadKey {ordenación} FOR k:=1 to MaxMateria DO FOR i:=1 to MaxAlumno-1 DO FOR j:=i+1 to MaxAlumno DO IF examen[i,maxexamen,k]<examen[j,maxexamen,k] THEN {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 {Recorrido de matríz y vector} FOR k:=1 to MaxMateria DO 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 WRITE(alumno[i]); col:=22; FOR j:=1 to MaxExamen DO WRITE(examen[i,j,k]:3:2); Página 5 de 12 Ing. Gustavo J.A. Cerveri JTP gcerveri@frlp.utn.edu.ar
col:=col+10 col:=5; inc(ren) gotoxy(15,22); WRITE('Presione una tecla para continuar...'); readkey 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); IF ( nro=0 or nro=1) THEN WRITELN (nro); ELSE bina(nro div 2); WRITELN( nro mod 2); VAR a: integer; WRITELN ('Ingrese el nro a covertir'); readln (a); bina(a); readkey; 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 gcerveri@frlp.utn.edu.ar
PROGRAM inser; USES CRT; type vec=array [1..5] of integer; PROCEDURE lista (VAR x:vec); VAR j: integer; FOR j:=1 to 5 DO WRITELN('vec(',j,')=', x[j]); readkey; PROCEDURE insercion( VAR vector:vec); VAR i,j, index: integer; FOR i:= 2 to 5 DO index:= vector[i]; j:=i; while ((j>1) and (vector[j-1]>index)) DO vector[j]:=vector[j-1]; j:=j-1; vector[j]:=index; lista (vector); VAR a:vec; j: integer; a[1]:=-1; a[2]:=0; a[3]:=5; a[4]:=3; a[5]:=-5; insercion (a); lista (a); 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 gcerveri@frlp.utn.edu.ar
WRITELN ('Escriba 5 numeros para hacer su media aritmetica: '); FOR i := 1 TO 5 DO READLN(num); arr_num[i]:=num; FOR i:=1 TO 5 DO media:= media + arr_num[i]; media:= media / i; WRITELN ('La media aritmetica es: ',media:5:2); 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; val_max:=arr_num[1,1]; 67 FOR i:=1 TO 3 DO FOR j:=1 TO 3 DO IF arr_num[i,j] > val_max THEN val_max:=arr_num[i,j]; pos_max_i:=i; pos_max_j:=j; WRITELN( 'VALOR MAXIMO: ', val_max:3, ' POSICION: ', pos_max_i:3,pos_max_i:3); 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 gcerveri@frlp.utn.edu.ar
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; suma_pos:=0; suma_neg:=0; FOR i:=1 TO 3 DO FOR j:=1 TO 3 DO IF arr_num[i,j] < 0 THEN suma_neg:=suma_neg+arr_num[i,j] ELSE suma_pos:=suma_pos+arr_num[i,j] WRITELN('SUMA POSITIVOS: ', suma_pos:5); WRITELN('SUMA NEGATIVOS: ', suma_neg:5); 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: 3 6 7 8 9 0 0 0 0 0 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; i:=1; FOR j:=1 TO 5 DO FOR i:=1 TO 1 DO cuad:=sqr(arr_num[i,j]); arr_num[2,j]:= cuad; WRITELN (arr_num[2,j]); 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 gcerveri@frlp.utn.edu.ar
1 7 0 5 6 0 6 4 0 7 3 0 0 0 0 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} total := 0; FOR i:=1 TO 5 DO 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; WRITELN (''); FOR j:=1 TO 2 DO 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; WRITELN (''); WRITELN ('La suma total es: ',total); 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 Página 10 de 12 Ing. Gustavo J.A. Cerveri JTP gcerveri@frlp.utn.edu.ar
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; 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') readkey 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} 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 gcerveri@frlp.utn.edu.ar
tf: Real; Begin 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} 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); Página 12 de 12 Ing. Gustavo J.A. Cerveri JTP gcerveri@frlp.utn.edu.ar