1. Una introducción a la programación.
Un enfoque algorítmico
Anexo I. Programas en Pascal
Jesús J. García Molina
Francisco J. Montoya Dato
José L. Fernández Alemán
María J. Majado Rosales
21 de octubre de 2005
3. Programas en Pascal. Una introducción a la Programación.
1. Introducción
Este documento incluye los programas Pascal que se han obtenido al codicar en este lenguaje de
programación todos los algoritmos que aparecen en el libro Una Introducción a la Programación. Un
enfoque algorítmico, según la conversión descrita en el Capítulo 9 del libro. Por tanto, el lector del
libro dispone de los programas que le permiten analizar el comportamiento de los algoritmos durante la
ejecución.
Los programas han sido creados y probados con las versiones 5.5 y 7.0 de Turbo Pascal de Borland
y con la versión 1.9.2 del entorno Dev-Pascal (compilador Free Pascal) de Bloodshed, sobre los sistemas
operativos Windows 98, 2000 y XP. Si el lector está más habituado a entornos Linux, puede optar por
emplear Free Pascal (fpc) o GNU Pascal (gpc) para Linux.
Las versiones de Turbo Pascal se ejecutan sobre DOS y ya no son soportadas por Borland; la versión
5.5 se puede descargar de forma gratuita del sitio web de Borland
httpXGG™ommunityF˜orl—ndF™omG—rti™leGHDIRIHDPHVHQDHHFhtml pero no la versión 7.0 que es más
cómoda de usar (entorno multiventana, manejo del ratón, etc.). Dev-Pascal es un entorno de pro-
gramación moderno, más potente y amigable, y se puede descargar desde el sitio web de Bloodshed
httpXGGwwwF˜loodshedFnetGdevp—s™—lFhtml.
El lector puede ejecutar los programas a partir del chero p—s™—lFzip que se encuentra en el sitio web
junto a este documento. Los programas están distribuidos en carpetas, una por cada capítulo. El nombre
de los archivos de cada capítulo hace referencia al identicador en el libro del algoritmo que implementa,
por ejemplo, evqT•RFp—s, es el programa para el Algoritmo 6.4 del Capítulo 6.
Puesto que Pascal no dispone del tipo secuencia propiamente dicho, se han implementado unas unida-
des que permiten el manejo de secuencias de caracteres, enteros y reales para el primer y segundo modelos
de acceso secuencial descritos en el Capítulo 5. Los dos últimos modelos se han construido apoyándonos
en el concepto de secuencia intermedia. En la carpeta unit están los archivos fuentes y los archivos objeto
de seis unidades, que corresponden con los dos primeros modelos de cada uno de los tres tipos de datos:
caracteres, enteros y reales.
Cada archivo que contiene una unidad se ha nombrado con el prejo unitms seguido de una letra que
indica el tipo de elemento (c, e o r) y un 1 o 2 para indicar el modelo. Por ejemplo, Unitmse2.pas
es la unidad para secuencias de enteros del segundo modelo y Unitmsc1.pas es la unidad para secuencias
de caracteres del primer modelo.
Las primitivas para el manejo de secuencias se nombran igual que en el libro (EA, Comenzar,
Avanzar, etc.) pero con un sujo que indica el tipo de elemento y el modelo secuencial (ie•wƒgI, ie•wƒiP,
ev—nz—r•wƒ‚P, ev—nz—r•wƒgP, etc.). Para conocer el léxico que puede utilizar se puede consultar la parte
interface del código fuente de cada unidad. El lector interesado también puede escudriñar el código de las
unidades con el objetivo de aprender sobre estructuras de datos dinámicas (se han implementado como
listas).
Se han creado archivos que almacenan secuencias que se utilizan como ejemplo de entrada en la
ejecución de los programas, y que están preparados para que el lector pueda modicarlos. Estos archi-
vos de datos se identican con el prejo datos seguido del identicador del algoritmo. Por ejemplo,
d—tosRFQFtxt corresponde con la entrada de datos del programa evqR•QFp—s. Las secuencias de datos se
almacenan como líneas de caracteres y las secuencias de números con un número por línea de entrada. En
la carpeta con los programas del Capítulo 6 se incluyen dos programas (qixpT•IFp—s y qixpT•RFp—s) que
crean los archivos de datos Pascal para el Algoritmo 6.1 y el Algoritmo 6.4 (también se proporcionan
los programas que permiten la visualización de los dos archivos creados, †i‚pT•IFp—s y †i‚pT•RFp—s).
En los programas no se ha realizado la comprobación de que los datos de entrada son válidos, por lo
3 c ITES PARANINFO
4. Programas en Pascal. Una introducción a la Programación.
que en el caso de una entrada incorrecta, el resultado es impredecible.
En una próxima versión de este documento se incluirá el código de todas las acciones y funciones
del Capítulo 8, así como de la aplicación gestor de archivos indexados que se discute en dicho capítulo.
También estarán disponibles en el sitio web del libro, algoritmos y programas que son soluciones a los
ejercicios del libro, así como la implementación de las unidades del tercer y cuarto modelo de acceso
secuencial.
1.1. Guía de usuario para Turbo Pascal 5.5
Existen numerosos libros que ofrecen información sobre el uso de los entornos de Borland, por ejemplo:
Programación en Turbo Pascal. Versiones 5.5, 6.0, 7.0 de L. Joyanes, McGraw-Hill, 1993, y Programa-
ción en Turbo/Borland Pascal 7 de L. Joyanes, Mc Graw Hill, 1998. Aquí ofrecemos una breve guía para
ejecutar los programas, pero el lector puede consultar esos libros para obtener más detalles. Los pasos
para ejecutar un programa serían:
1. Abrir el entorno desde la ventana del sistema operativo (™Xtpbtur˜o).
2. Establecer el directorio en el que se encuentran los programas (opción Change dir del menú File).
3. Indicar el directorio en el que se encuentran las unidades (añadir directorio en el cuadro de texto
Unit Directories de la opción Directories del menú Options). Este paso sólo sería necesario
realizarlo una vez.
4. Cargar el programa (opción Load del menú File).
5. Ejecutar el programa (opción Run menú Run).
La carpeta unit incluye tanto los archivos fuente de las unidades como los archivos compilados, pero
si fuese necesario compilar una unidad se debe proceder del siguiente modo:
1. Introducir el directorio en el que se almacenan las unidades (añadir directorio en el cuadro de texto
EXE TPU Directory de la opción Directories del menú Options).
2. Cargar el archivo con el código fuente de la unidad, opción Load del menú File.
3. Indicar que la compilación se almacenará en disco con la opción Destination del menú Compile.
4. Compilar con la opción Compile del menú Compile. Si no se indica el directorio en el paso 1, el
archivo objeto (extensión TPU) se almacenará en el mismo directorio que el archivo fuente.
1.2. Guía de usuario para Dev-Pascal
El entorno dispone de una ayuda y un tutorial. Los pasos para ejecutar un programa, una vez abierto
el entorno, serían (existen botones para ejecutar las órdenes, además de teclas rápidas):
1. Establecer el directorio en el que se encuentran las unidades en el cuadro de texto Add the
directory below ... de la opción Compiler options del menú Options. Este paso sólo sería
necesario realizarlo una vez.
2. Cargar el programa (opción Open le del menú File).
ITES PARANINFO c 4
5. Programas en Pascal. Una introducción a la Programación.
3. Compilar el programa (opción Compile del menú Execute).
4. Ejecutar el programa (opción Run del menú Execute).
Para ejecutar los programas que utilizan las máquinas secuenciales bastarían los pasos anteriores si en
el directorio de las unidades se encuentran el archivo fuente de la unidad empleada, ya que se generaría
automáticamente el archivo objeto de la unidad. Si por alguna razón se necesitase compilar las unidades
de forma independiente, los pasos para crear el archivo objeto de una unidad son los siguientes:
1. Crear un proyecto con el nombre de la unidad. Seleccionar Empty project de la opción New
project del menú File. Eliminar el archivo incluido por defecto en el proyecto y cargar el archivo
que contiene el código fuente de la unidad, opción Add to project del menú Project.
2. Habilitar la creación de una DLL en la opción Project options del menú Project.
3. Compilar la unidad mediante la opción Compile del menú Execute.
Sobre los sistemas operativos Windows 2000 y XP, durante la ejecución del programa con la última
versión de Dev-Pascal, el directorio actual es el directorio en que se instala DevPascal (por defecto
™XhevE€—sA y no funciona la opción de establecer como directorio actual aquel en el que se encuentra el
ejecutable. Por tanto, cuando en un programa hay referencias a cheros, o bien se indica la ruta completa,
o bien se ejecuta el programa desde fuera del entorno, por ejemplo, desde el explorador de Windows. Este
problema no se tiene con el sistema operativo Windows 98.
5 c ITES PARANINFO
6. Programas en Pascal. Una introducción a la Programación.
2. Fe de erratas
Hemos encontrado en el libro las erratas que indicamos abajo organizadas por capítulos. En el sitio
web del libro iremos actualizando esta fe de erratas en un chero aparte.
Capítulo 4
Algoritmo 4.4
El segundo argumento de la llamada a la acción is™ri˜ir que escribe el resultado debe ser sum—Gnumilem
en vez de sum—Gnum.
Capítulo 6
Algoritmo 6.17
La función €osin„—˜l— no coincide en el texto y en el algoritmo. El algoritmo válido es el que aparece
en el texto.
En la función godifi™—™ion hay que cambiar nuevo€—rF™ por nuevo€—rFs en la segunda asignación
de la cláusula ix•y„‚y•geƒy de la instrucción ƒiqÚx.
Capítulo 7
Algoritmo 7.13
ist—™— debe denirse
El tipo fuera de la acción r—noi, ya que se utiliza como tipo de los parámetros
origen, intermedio y destino.
r—noi debería ser r—noi@nEID intermedioD origenD destinoA
La segunda llamada a la acción en
vez de r—noi@nEID intermedioD destinoD origenA.
Sección 7.5.4 (Página 377)
En la postcondición de la acción yrden—rs debería decir tk a „viej—k en vez de tk a „viej—k.
Capítulo 8
Sección 8.3 (Página 395)
En la tercera línea debería decir una secuencia de cuatro nodos: en vez de una secuencia de tres
nodos:.
Sección 8.7.4 (Página 464)
En la acción snsert—rer™hivosndex—do hay que cambiar:
ƒs @fus™—r€osi™ionsndi™e@—r™h↑Findi™eD pF™l—veA X €yƒ•x…veA
por:
ƒs @fus™—r€osi™ionsndi™e@—r™h↑Findi™eD pF™l—veA = €yƒ•x…veA
ITES PARANINFO c 6
7. Programas en Pascal. Una introducción a la Programación.
Capítulo 9
Sección 9.7.12 (Página 565)
En la Figura 9.4 el elemento ‘H“‘PW“ debería ser t‘H“‘PW“
7 c ITES PARANINFO
8. Programas en Pascal. Una introducción a la Programación.
3. Listados
3.1. Capítulo 2
§ ¤
program elgoritmoP•IY
(*
* Algoritmo 2.1. Calculo de la nota final de una asignatura
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses ™rtY
var
not—„eori— X realY
not—€r—™ti™— X realY
not—pin—l X realY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 2.1. Calculo de la nota final de una asignatura *****'AY
writeln@'*****'AY
writelnY
write@'Nota de teoria: 'AY
readln@not—„eori—AY
writelnY
write@'Nota de practicas: 'AY
readln@not—€r—™ti™—AY
not—pin—l Xa not—„eori— B HFU C not—€r—™ti™— B HFQY
writelnY
write@'La nota final es: 'AY
writeln@not—pin—lXIXPAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoP•PY
(*
ITES PARANINFO c 8
9. Programas en Pascal. Una introducción a la Programación.
* Algoritmo 2.2. Convertir temperatura Fahrenheit en temperatura Celsius
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses ™rtY
var
tempp—hrenheit X realY (* dato, temperatura en grados Fahrenheit *)
tempgelsius X realY (* resultado, temperatura en grados Celsius *)
procedure gonvertirp—hrenheitgelsiusY
(* PRE 0 = tempFahrenheit = 200 *)
(* POST convierte a grados celsius la temperatura de tempFahrenheit *)
begin
tempgelsius Xa @SFH G WFHA B @tempp—hrenheit E QPFHA
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 2.2. Convertir temperatura Fahrenheit en *****'AY
writeln@'***** temperatura Celsius *****'AY
writeln@'*****'AY
writelnY
write@'Temperatura Fahrenheit (= 0) y (= 200): 'AY
readln@tempp—hrenheitAY
gonvertirp—hrenheitgelsiusY
writeln@'La temperatura en grados Celsius es: 'D tempgelsiusXIXPAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoP•QY
(*
* Algoritmo 2.3. Calculo del salario neto de un trabajador (version 1)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
9 c ITES PARANINFO
10. Programas en Pascal. Una introducción a la Programación.
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses ™rtY
const
sw€…iƒ„y a HFPHY
ƒiq…‚y•wihsgy a HFHSY
gyw€viwix„y•…sx…ixsy a THY
gyw€viwix„y•ex‰y a TY
var
s—l—riof—se X longintY (* dato, sueldo base del trabajador *)
—ntigued—d X wordY (* dato, anyos en la empresa *)
s—l—rioxeto X realY (* resultado, salario percibido por el trabajador *)
s—l—riofruto X longintY (* salario bruto del trabajador *)
des™uentos X realY (* descuentos aplicados *)
procedure g—l™ul—rƒ—l—riofrutoY
(* PRE salarioBase y antiguedad tienen un valor valido *)
(* POST salarioBruto contiene el salario bruto del trabajador *)
var
numerouinquenios X wordY
numeroenyos X wordY
p—gouinquenios X wordY
p—goeyos X wordY
begin
numerouinquenios Xa —ntigued—d div SY
numeroenyos Xa —ntigued—d mod SY
p—gouinquenios Xa numerouinquenios B gyw€viwix„y•…sx…ixsyY
p—goeyos Xa numeroenyos B gyw€viwix„y•ex‰yY
s—l—riofruto Xa s—l—riof—se C p—gouinquenios C p—goeyos
endY
procedure g—l™ul—rhes™uentosY
(* PRE se ha calculado el salario bruto y se ha asignado a salarioBruto *)
(* POST descuentos almacena el valor total de los descuentos sobre el salario bruto *)
begin
des™uentos Xa s—l—riofruto B @sw€…iƒ„y C ƒiq…‚y•wihsgyA
endY
ITES PARANINFO c 10
11. Programas en Pascal. Una introducción a la Programación.
procedure g—l™ul—rƒ—l—rioxetoY
(* PRE salarioBruto y descuentos almacenan, respectivamente, el salario bruto y el
descuento que le corresponde *)
(* POST salarioNeto contiene el salario recibido por el trabajador,
salarioNeto = salarioBruto - descuentos *)
begin
s—l—rioxeto Xa s—l—riofruto E des™uentos
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 2.3. Calculo del salario neto de un *****'AY
writeln@'***** trabajador (version 1) *****'AY
writeln@'*****'AY
writelnY
write@'Introduzca el salario base: 'AY
readln@s—l—riof—seAY
write@'Introduzca la antiguedad: 'AY
readln@—ntigued—dAY
g—l™ul—rƒ—l—riofrutoY
g—l™ul—rhes™uentosY
g—l™ul—rƒ—l—rioxetoY
writeln@'El sueldo neto es: 'D s—l—rioxetoXIXPAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoP•RY
(*
* Algoritmo 2.4. Calculo del salario neto de un trabajador (version 2)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses ™rtY
const
sw€…iƒ„y a HFPHY
11 c ITES PARANINFO
12. Programas en Pascal. Una introducción a la Programación.
ƒiq…‚y•wihsgy a HFHSY
gyw€viwix„y•…sx…ixsy a THY
gyw€viwix„y•ex‰y a TY
var
s—l—riof—se X wordY (* dato, sueldo base del trabajador *)
—ntigued—d X wordY (* dato, anyos en la empresa *)
s—l—rioxeto X realY (* resultado, salario percibido por el trabajador *)
s—l—riofruto X wordY (* salario bruto del trabajador *)
des™uentos X realY (* descuentos aplicados *)
numerouinquenios X wordY
numeroenyos X wordY
p—gouinquenios X wordY
p—goenyos X wordY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 2.4. Calculo del salario neto de *****'AY
writeln@'***** un trabajador (version 2) *****'AY
writeln@'*****'AY
writelnY
write@'Introduzca el salario base: 'AY
readln@s—l—riof—seAY
write@'Introduzca la antiguedad: 'AY
readln@—ntigued—dAY
(* Calculo del salario bruto *)
numerouinquenios Xa —ntigued—d div SY
numeroenyos Xa —ntigued—d mod SY
p—gouinquenios Xa numerouinquenios B gyw€viwix„y•…sx…ixsyY
p—goenyos Xa numeroenyos B gyw€viwix„y•ex‰yY
s—l—riofruto Xa s—l—riof—se C p—gouinquenios C p—goenyosY
(* Calculo de los descuentos y el salario neto *)
des™uentos Xa s—l—riofruto B @sw€…iƒ„y C ƒiq…‚y•wihsgyAY
s—l—rioxeto Xa s—l—riofruto E des™uentosY
writeln@'El sueldo neto es: 'D s—l—rioxetoXIXPAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoP•SY
(*
ITES PARANINFO c 12
13. Programas en Pascal. Una introducción a la Programación.
* Algoritmo 2.5. Expresar una cantidad de bytes en megabytes y kilobytes
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses ™rtY
var
n X longintY (* dato, numero de bytes a descomponer *)
m˜ X longintY (* resultado, numero de megabytes *)
k˜ X HFFIHPRY (* resultado, numero de kilobytes *)
˜ X HFFIHPRY (* resultado, numero de bytes *)
procedure gonvertirY
(* PRE 0 = n *)
(* POST (n = 1048576mb + 1024kb + b) y (0 = kb 1024) y (0 = b 1024) *)
var
r˜ X HFFIHRVSUSY (* resto de bytes *)
begin
m˜ Xa n div IHRVSUTY
r˜ Xa n mod IHRVSUTY
(* E1: n = 1048576 mb + rb y 0 = rb 1048576 *)
k˜ Xa r˜ div IHPRY
˜ Xa r˜ mod IHPR
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 2.5. Expresar una cantidad *****'AY
writeln@'***** de bytes en megabytes y kilobytes *****'AY
writeln@'*****'AY
writelnY
writeln@'Descomposicion en bytes, kilobytes y megabytes'AY
write@'Introduzca un entero (= 0): 'AY
readln@nAY
gonvertirY
writeln@'La descomposicion es:'AY
writeln@' Megabytes: 'D m˜AY
13 c ITES PARANINFO
14. Programas en Pascal. Una introducción a la Programación.
writeln@' Kilobytes: 'D k˜AY
writeln@' Bytes: 'D ˜AY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoP•TY
(*
* Algoritmo 2.6. Dibujar un cuadrado
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses qr—phQD ™rtY
var
l—do X integerY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 2.6. Dibujar un cuadrado *****'AY
writeln@'*****'AY
writelnY
write @'Introduzca la longitud de lado del cuadrado:'AY
readln @l—doAY
(* E0: Indiferente *)
qr—phwodeY (* 320 x 200 modo grafico blanco-negro *)
gle—rƒ™reenY
ƒhow„urtleY (* Muestra la tortuga *)
(* E1: pos = (0, 0), dir = 0, trazo = Verdadero *)
porwd@l—doAY „urn‚ight @WHAY
(* E2: pos = (0, lado), dir = 90, trazo = Verdadero,
se ha dibujado el primer lado *)
porwd@l—doAY „urn‚ight @WHAY
(* E3: pos = (lado, lado), dir = 180, trazo = Verdadero,
se han dibujado dos lados *)
porwd@l—doAY „urn‚ight @WHAY
ITES PARANINFO c 14
15. Programas en Pascal. Una introducción a la Programación.
(* E4: pos = (lado, 0), dir = 270, trazo = Verdadero,
se han dibujado tres lados *)
porwd@l—doAY „urn‚ight @WHAY
(* Ef: pos = (0, 0), dir = 0, trazo = Verdadero,
se ha dibujado el cuadrado *)
writelnY
write @'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoP•UY
(*
* Algoritmo 2.7. Correspondencia entre calificaciones (version 1)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses ™rtY
var
not— X HFFPHY (* nota en la universidad extranjera, 0 = nota = 20 *)
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 2.7. Correspondencia entre calificaciones (version 1)
*****'AY
writeln@'*****'AY
writelnY
write@'Introduzca la nota (= 0) y (= 20): 'AY
readln@not—AY
write@'La calificacion es 'AY
case not— of
PH X write@'matricula de honor'AY
IWD IV X write@'sobresaliente'AY
IUD IT X write@'notable'AY
ISD IR X write@'aprobado'AY
else if not— ` IR then write@'suspenso'A
endY
writelnY
15 c ITES PARANINFO
16. Programas en Pascal. Una introducción a la Programación.
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoP•VY
(*
* Algoritmo 2.8. Correspondencia entre calificaciones (version 2)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses ™rtY
var
not— X integerY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 2.8. Correspondencia entre calificaciones (version 2)
*****'AY
writeln@'*****'AY
writelnY
write@'Introduzca la nota (= 0) y (= 20): 'AY
readln @not—AY
write@'La calificacion es 'AY
case not— of
PH X write@'matricula de honor'AY
IWD IV X write@'sobresaliente'AY
IUD IT X write@'notable'AY
ISD IR X write@'aprobado'AY
HFFIQX write@'suspenso'AY
else write@'no valida'AY
endY
writelnY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
ITES PARANINFO c 16
17. Programas en Pascal. Una introducción a la Programación.
§ ¤
program elgoritmoP•WY
(*
* Algoritmo 2.9. Simulacion de una calculadora simple
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses ™rtY
var
oper—ndoID oper—ndoP X longintY
oper—dor X charY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 2.9. Simulacion de una calculadora simple *****'AY
writeln@'*****'AY
writelnY
write @'Introduzca el primer operando entero: 'AY
readln @oper—ndoIAY
write @'Introduzca el segundo operando entero: 'AY
readln @oper—ndoPAY
write @'Introduzca el operador (+, *, -, /): 'AY
readln @oper—dorAY
write @'El resultado de la operacion es: 'AY
case oper—dor of
'+' X writeln@oper—ndoI C oper—ndoPAY
'*' X writeln@oper—ndoI B oper—ndoPAY
'-' X writeln@oper—ndoI E oper—ndoPAY
'/' X writeln@oper—ndoI div oper—ndoPAY
else writeln@'operador incorrecto'A
endY
writelnY
write @'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoP•IHY
(*
17 c ITES PARANINFO
18. Programas en Pascal. Una introducción a la Programación.
* Algoritmo 2.10. Obtener el mayor de dos numeros enteros
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses ™rtY
var
xD z X longintY
m—yor X longintY
begin
™lrs™rY
(* PRE (x = X) y (z = Z) *)
(* POST ((x = z) = (mayor = X)) y ((z = x) = (mayor = Z)) *)
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 2.10. Obtener el mayor de dos numeros enteros *****'AY
writeln@'*****'AY
writelnY
write @'Introduzca el primer entero: 'AY
readln @xAY
write @'Introduzca el segundo entero: 'AY
readln @zAY
if x ba z then m—yor Xa x
else m—yor Xa zY
writeln @'El numero mayor es: 'D m—yorAY
writelnY
write @'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoP•IIY
(*
* Algoritmo 2.11. Comprobar si una fecha es correcta (version 1)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
ITES PARANINFO c 18
19. Programas en Pascal. Una introducción a la Programación.
* Fecha: 1/9/2005
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses ™rtY
var
di— X wordY
mes X wordY
—nyo X wordY
esfisiesto X booleanY (* indicador de anyo bisiesto *)
fe™h—†—lid— X booleanY (* indicador de fecha valida *)
procedure enyofisiestoY
(* POST esBisiesto es Verdadero si el anyo es bisiesto y Falso en caso contrario *)
begin
esfisiesto Xa @—nyo mod R a HA and @—nyo mod IHH `b HA or
@—nyo mod RHH a HA and @—nyo `b QTHHA
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 2.11. Comprobar si una fecha es correcta (version 1) *****
'AY
writeln@'*****'AY
writelnY
write@'Introduzca el dia: 'AY
readln@di—AY
write@'Introduzca el mes: 'AY
readln@mesAY
write@'Introduzca el anyo: 'AY
readln@—nyoAY
fe™h—†—lid— Xa trueY
if di— ` I then fe™h—†—lid— Xa false
else
case mes of
ID QD SD UD VD IHD IPX (* meses de 31 dias *)
if di— b QI then fe™h—†—lid— Xa falseY
RD TD WD IIX (* meses de 30 dias *)
if di— b QH then fe™h—†—lid— Xa falseY
PX (* mes de febrero *)
begin
enyofisiestoY
if @di— b PWA or @not esfisiesto and @di— b PVAA
then fe™h—†—lid— Xa false
19 c ITES PARANINFO
20. Programas en Pascal. Una introducción a la Programación.
end
else fe™h—†—lid— Xa false
endY
write @di—D '/'D mesD '/'D —nyoAY
if fe™h—†—lid— then writeln@' es una fecha valida'A
else writeln@' no es una fecha valida'AY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoP•IPY
(*
* Algoritmo 2.12. Comprobar si una fecha es correcta (version 2)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses ™rtY
var
di— X wordY
mes X wordY
—nyo X wordY
esfisiesto X booleanY (* indicador de anyo bisiesto *)
fe™h—†—lid— X booleanY (* indicador de fecha valida *)
(* igual que en Algoritmo 2.11 *)
procedure enyofisiestoY
(* POST esBisiesto es Verdadero si el anyo es bisiesto y Falso en caso contrario *)
begin
esfisiesto Xa @—nyo mod R a HA and @—nyo mod IHH `b HA or
@—nyo mod RHH a HA and @—nyo `b QTHHA
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
ITES PARANINFO c 20
21. Programas en Pascal. Una introducción a la Programación.
writeln@'***** Algoritmo 2.12. Comprobar si una fecha es correcta (version 2) *****
'AY
writeln@'*****'AY
writelnY
write@'Introduzca el dia: 'AY
readln@di—AY
write@'Introduzca el mes: 'AY
readln@mesAY
write@'Introduzca el anyo: 'AY
readln@—nyoAY
if di— ` I then fe™h—†—lid— Xa false
else
case mes of
ID QD SD UD VD IHD IPX fe™h—†—lid— Xa di— `a QIY
RD TD WD IIX fe™h—†—lid— Xa di— `a QHY
PX begin
enyofisiestoY
fe™h—†—lid— Xa @di— `a PWA and @esfisiesto or @di— `a PVAAY
end
else fe™h—†—lid— Xa false
endY
write @di—D '/'D mesD '/'D —nyoAY
if fe™h—†—lid— then writeln@ ' es una fecha valida'A
else writeln@ ' no es una fecha valida'AY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoP•IQY
(*
* Algoritmo 2.13. Calculo del salario neto de un trabajador (version 3)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses ™rtY
const
ry‚e•xy‚wev a IHY
ry‚e•iˆ„‚e a IPY
21 c ITES PARANINFO
22. Programas en Pascal. Una introducción a la Programación.
…wf‚ev•ry‚eƒ•iˆ„‚eƒ a IRHY
sw€…iƒ„y•fety a HFITY
sw€…iƒ„y•ev„y a HFPPY
…wf‚ev•ƒ…ivhy a IQHHY
gyw€viwix„y•…sx…ixsy a THY
gyw€viwix„y•ex‰y a TY
var
numeroror—s X wordY (* dato, horas trabajadas en un mes por el empleado id *)
id X wordY (* dato, identificador del empleado *)
—ntigued—d X wordY (* dato, anyos en la empresa *)
s—l—rioxeto X realY (* resultado, salario percibido por el trabajador *)
s—l—riof—se X wordY
s—l—riofruto X wordY
des™uentos X realY
procedure g—l™ul—rƒ—l—riofrutoY
(* PRE numeroHoras y antiguedad tienen un valor *)
(* POST salarioBruto contiene el salario bruto del trabajador *)
var
numerouinquenios X wordY
numeroenyos X wordY
p—gouinquenios X wordY
p—goenyos X wordY
begin
(* calcular sueldo base por horas trabajadas *)
if numeroror—s b …wf‚ev•ry‚eƒ•iˆ„‚eƒ
then s—l—riof—se Xa @numeroror—s E …wf‚ev•ry‚eƒ•iˆ„‚eƒA B ry‚e•iˆ„‚e
C …wf‚ev•ry‚eƒ•iˆ„‚eƒ B ry‚e•xy‚wev
else s—l—riof—se Xa numeroror—s B ry‚e•xy‚wevY
(* calcular gratificacion por antiguedad *)
numerouinquenios Xa —ntigued—d DIV SY
numeroenyos Xa —ntigued—d MOD SY
p—gouinquenios Xa numerouinquenios B gyw€viwix„y•…sx…ixsyY
p—goenyos Xa numeroenyos B gyw€viwix„y•ex‰yY
(* calcular salario bruto *)
s—l—riofruto Xa s—l—riof—se C p—gouinquenios C p—goenyos
endY
procedure g—l™ul—rhes™uentosY
(* PRE salarioBruto almacena el salario bruto calculado *)
(* POST descuentos almacena el valor total de los descuentos sobre el salario
bruto *)
ITES PARANINFO c 22
23. Programas en Pascal. Una introducción a la Programación.
begin
if s—l—riofruto b …wf‚ev•ƒ…ivhy
then des™uentos Xa s—l—riofruto B sw€…iƒ„y•ev„y
else des™uentos Xa s—l—riofruto B sw€…iƒ„y•fety
endY
procedure g—l™ul—rƒ—l—rioxetoY
(* PRE salarioBruto y descuentos almacenan, respectivamente, el salario bruto y el
descuento correspondiente *)
(* POST salarioNeto contiene el salario percibido por el trabajador,
salarioNeto = salarioBruto !descuentos *)
begin
s—l—rioxeto Xa s—l—riofruto E des™uentos
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 2.13. Calculo del salario neto de *****'AY
writeln@'***** un trabajador (version 3) *****'AY
writeln@'*****'AY
writelnY
write@'Identificador del empleado: 'AY
readln@idAY
write@'Numero de horas trabajadas en un mes por el empleado: 'AY
readln@numeroror—sAY
write@'Antiguedad del empleado: 'AY
readln@—ntigued—dAY
g—l™ul—rƒ—l—riofrutoY
g—l™ul—rhes™uentosY
g—l™ul—rƒ—l—rioxetoY
writeln@'El salario del empleado 'D idD ' es: 'D s—l—rioxetoXIXPAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoP•IRY
(*
* Algoritmo 2.14. Dibujar un cuadrado a partir de la posicion de los vertices
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
23 c ITES PARANINFO
24. Programas en Pascal. Una introducción a la Programación.
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses ™rtD gr—phY
type
€unto a record
—˜s X integerY (* valores enteros en lugar de reales *)
ord X integerY
endY
gu—dr—do a record
vID vPD vQD vR X €untoY
endY
var
™ X gu—dr—doY
™gD mg X integerY (* controlador y modo grafico *)
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 2.14. Dibujar un cuadrado a partir *****'AY
writeln@'***** de la posicion de los vertices *****'AY
writeln@'*****'AY
writelnY
(* E0: Indiferente *)
writeln @'Introduzca los puntos de un cuadrado'AY
write @' Punto 1 (abscisa ordenada): 'AY
readln @™FvIF—˜sD ™FvIFordAY
write @' Punto 2 (abscisa ordenada): 'AY
readln @™FvPF—˜sD ™FvPFordAY
write @' Punto 3 (abscisa ordenada): 'AY
readln @™FvQF—˜sD ™FvQFordAY
write @' Punto 4 (abscisa ordenada): 'AY
readln @™FvRF—˜sD ™FvRFordAY
snitqr—ph@™gDmgD'c:tp'AY (* inicializa modo grafico*)
(* E1: pos = (0, 0), dir = 0, trazo = Verdadero;
los puntos de c son vertices de un cuadrado *)
wove„o@™FvIF—˜sD ™FvIFordAY (* mover al vertice v1 *)
ITES PARANINFO c 24
25. Programas en Pascal. Una introducción a la Programación.
(* E2: pos = c.v1, dir = 0, trazo = Verdadero *)
vine„o@™FvPF—˜sD™FvPFordAY (* mover al vertice v2 y traza linea *)
vine„o@™FvQF—˜sD™FvQFordAY (* mover al vertice v3 y traza linea *)
vine„o@™FvRF—˜sD™FvRFordAY (* mover al vertice v4 y traza linea *)
vine„o@™FvIF—˜sD™FvIFordAY (* mover al vertice v1 y traza linea *)
(* Ef: cuadrado dibujado , pos = c.v1, dir = 0, trazo = Verdadero *)
readlnY
™loseqr—phY
endF
¦
¥
§ ¤
program elgoritmoP•ISY
(*
* Algoritmo 2.15. Comprobar si una fecha es correcta (version 3)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Capitulo 2. Secuenciacion y analisis de casos
*)
uses ™rtY
(*$R+*)
type
pe™h— a record
di— X IFFQIY
mes X IFFIPY
—nyo X word
endY
var
f X pe™h—Y (* dato, fecha dia/mes/anyo *)
esfisiesto X booleanY (* indicador de anyo bisiesto *)
fe™h—†—lid— X booleanY (* indicador de fecha valida *)
procedure enyofisiestoY
(* POST esBisiesto es Verdadero si f.anyo es bisiesto y Falso en caso contrario *)
begin
esfisiesto Xa @fF—nyo mod R a HA and @fF—nyo mod IHH `b HA or
@fF—nyo mod RHH a HA and @fF—nyo `b QTHHA
endY
begin
™lrs™rY
25 c ITES PARANINFO
26. Programas en Pascal. Una introducción a la Programación.
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 2.15. Comprobar si una fecha es correcta (version 3) *****
'AY
writeln@'*****'AY
writelnY
write@'Introduzca el dia: 'AY
readln@fFdi—AY
write@'Introduzca el mes: 'AY
readln@fFmesAY
write@'Introduzca el anyo: 'AY
readln@fF—nyoAY
case fFmes of
ID QD SD UD VD IHD IPX fe™h—†—lid— Xa trueY
RD TD WD IIX fe™h—†—lid— Xa fFdi— `b QIY
PX begin
enyofisiestoY
fe™h—†—lid— Xa @fFdi— `a PWA and @esfisiesto or @fFdi— `b PWAA
endY
endY
write @fFdi—D '/'D fFmesD '/'D fF—nyoAY
if fe™h—†—lid— then writeln@' es una fecha valida'A
else writeln@' no es una fecha valida'AY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
ITES PARANINFO c 26
27. Programas en Pascal. Una introducción a la Programación.
3.2. Capítulo 3
§ ¤
program elgoritmoQ•IY
(*
* Algoritmo 3.1. Calcular el perimetro de un cuadrilatero irregular (version 1)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 3. Acciones y funciones
*)
uses ™rtY
type
goorden—d— a realY
€unto a record
x X goorden—d—Y
y X goorden—d—Y
endY
var
pID pPD pQD pR X €untoY
poD pd X €untoY
distD perimetro X realY
procedure hist—n™i—Y
(* PRE po y pd almacenan dos puntos *)
(* POST dist almacena la distancia entre los puntos po y pd *)
begin
dist Xa sqrt@sqr@pdFx E poFxA C sqr@pdFy E poFyAA
endY
procedure veer€unto@var xD y X realY n X shortintAY
begin
write@' Coordenada x del punto 'D nD': 'AY
readln@xAY
write@' Coordenada y del punto 'D nD ': 'AY
readln@yAY
writeln
endY
begin
™lrs™rY
writelnY
27 c ITES PARANINFO
28. Programas en Pascal. Una introducción a la Programación.
writeln@'*****'AY
writeln@'***** Algoritmo 3.1. Calcular el perimetro de un *****'AY
writeln@'***** cuadrilatero irregular (version 1) *****'AY
writeln@'*****'AY
writelnY
writeln@'Introduzca los puntos del cuadrilatero (en orden de adyacencia):'AY
writelnY
veer€unto@pIFxD pIFyD IAY
veer€unto@pPFxD pPFyD PAY
veer€unto@pQFxD pQFyD QAY
veer€unto@pRFxD pRFyD RAY
perimetro Xa HFHY
(* E0 : perimetro = 0 *)
po Xa pIY
pd Xa pPY
hist—n™i—Y
perimetro Xa distY
(* E1 : perimetro = Distancia (p1, p2) *)
po Xa pPY
pd Xa pQY
hist—n™i—Y
perimetro Xa perimetro C distY
(* E2 : perimetro = Distancia (p1, p2) + Distancia (p2, p3) *)
po Xa pQY
pd Xa pRY
hist—n™i—Y
perimetro Xa perimetro C distY
(* E3 : perimetro = Distancia (p1, p2) + Distancia (p2, p3) + Distancia (p3, p4) *)
po Xa pRY
pd Xa pIY
hist—n™i—Y
perimetro Xa perimetro C distY
(* E4 : perimetro = Distancia (p1, p2) + Distancia (p2, p3) +
Distancia (p3, p4) + Distancia (p4, p1) *)
writeln@'El perimetro del cuadrilatero irregular es: 'D perimetroXIXPAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoQ•PY
(*
ITES PARANINFO c 28
29. Programas en Pascal. Una introducción a la Programación.
* Algoritmo 3.2. Calcular el perimetro de un cuadrilatero irregular (version 2)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 3. Acciones y funciones
*)
uses ™rtY
type
goorden—d— a realY
€unto a record
x X goorden—d—Y
y X goorden—d—Y
endY
var
pID pPD pQD pR X €untoY
dID dPD dQD dR X realY
perimetro X realY
procedure hist—n™i—@poD pd X €untoY var dist X realAY
(* PRE po y pd almacenan dos puntos *)
(* POST dist retorna la distancia entre los puntos po y pd *)
begin
dist Xa sqrt@sqr@pdFx E poFxA C sqr@pdFy E poFyAA
endY
procedure veer€unto@var xD y X realY n X shortintAY
begin
write@' Coordenada x del punto 'D nD':'AY
readln@xAY
write@' Coordenada y del punto 'D nD ':'AY
readln@yAY
writeln
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 3.2. Calcular el perimetro de un *****'AY
writeln@'***** cuadrilatero irregular (version 2) *****'AY
29 c ITES PARANINFO
30. Programas en Pascal. Una introducción a la Programación.
writeln@'*****'AY
writelnY
writeln@'Introduzca los puntos del cuadrilatero:'AY
writelnY
veer€unto@pIFxD pIFyD IAY
veer€unto@pPFxD pPFyD PAY
veer€unto@pQFxD pQFyD QAY
veer€unto@pRFxD pRFyD RAY
hist—n™i—@pID pPD dIAY
hist—n™i—@pPD pQD dPAY
hist—n™i—@pQD pRD dQAY
hist—n™i—@pRD pID dRAY
perimetro Xa dI C dP C dQ C dRY
writeln@'El perimetro del cuadrilatero irregular es:'D perimetroXIXPAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoQ•QY
(*
* Algoritmo 3.3. Accion para el intercambio de dos variables
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 3. Acciones y funciones
*)
uses ™rtY
var
xD yX integerY
procedure snter™—m˜i—r@var —D ˜ X integerAY
(* PRE a, b : Entero, a = A, b = B *)
(* POST a = B, b = A *)
var
t X integerY
begin
t Xa —Y
ITES PARANINFO c 30
31. Programas en Pascal. Una introducción a la Programación.
— Xa ˜Y
˜ Xa t
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 3.3. Accion para el intercambio de dos variables *****'AY
writeln@'*****'AY
writelnY
write@'Valor inicial de x: 'AY
readln@xAY
write@'Valor inicial de y: 'AY
readln@yAY
writelnY
snter™—m˜i—r@xD yAY
writeln@'Valor final de x: 'D xAY
writeln@'Valor final de y: 'D yAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoQ•RY
(*
* Algoritmo 3.4. Desplazamiento circular de tres variables
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 3. Acciones y funciones
*)
uses ™rtY
var
—D ˜D ™ X integerY
procedure snter™—m˜i—r@var xD y X integerAY
(* PRE x, y : Entero, x = X, y = Y *)
(* POST x = Y, y = X *)
var
31 c ITES PARANINFO
32. Programas en Pascal. Una introducción a la Programación.
t X integerY
begin
t Xa xY
x Xa yY
y Xa t
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 3.4. Desplazamiento circular de tres variables *****'AY
writeln@'*****'AY
writelnY
(* PRE a, b, c : Entero, a = A, b = B, c = C *)
(* POST a, b, c : Entero, a = B, b = C, c = A *)
writeln@'Introduzca tres enteros separados por espacios'AY
write@'y termine pulsando enter: 'AY
readln@—D ˜D ™AY
writelnY
writeln@'Valor inicial de a, b y c: 'D —D ', 'D˜D ' y 'D ™AY
(* E0 : a = A, b = B, c = C *)
(* E0 = PRE *)
snter™—m˜i—r@—D ˜AY
(* E1 : a = B, b = A, c = C *)
snter™—m˜i—r@˜D ™AY
(* Ef : a = B, b = C, c = A = Post *)
writelnY
writeln@'Desplazamiento circular a la izquierda'AY
writelnY
writeln@'Valor final de a, b y c: 'D —D ', 'D˜D ' y 'D ™AY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoQ•SY
(*
* Algoritmo 3.5. Algoritmo para dibujar dos cuadrados encajados
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
ITES PARANINFO c 32
33. Programas en Pascal. Una introducción a la Programación.
* Capitulo 3. Acciones y funciones
*)
uses ™rtD gr—phQY
type
goorden—d— a integerY (* En Pascal las coordenadas son valores enteros *)
€unto a record
x X goorden—d—Y
y X goorden—d—Y
endY
gu—dr—do a record
pos X €untoY
l—doD —ng X integer
endY
var
™e X gu—dr—doY
procedure hi˜uj—rgu—dr—do@™ X gu—dr—doAY
(* PRE Pantalla y pluma indiferentes *)
(* POST cuadrado c dibujado, PE = Baja, PP = c.pos, ORI = c.ang *)
var
i X integerY
begin
€en…pY
ƒet€osition@™FposFxD ™FposFyAY
ƒetre—ding@™F—ngAY
€enhownY
for i Xa I to R do begin
porwd@™Fl—doAY
„urn‚ight@WHAY
endY
endY
procedure veer@var ™ X gu—dr—doAY
begin
writeln@' CUADRADO'AY
write@' Coordenada x del punto origen: 'AY
readln@™FposFxAY
write@' Coordenada y del punto origen: 'AY
readln@™FposFyAY
write@' Lado del cuadrado: 'AY
readln@™Fl—doAY
write@' Angulo del cuadrado (grados): 'AY
readln@™F—ngAY
writelnY
33 c ITES PARANINFO
34. Programas en Pascal. Una introducción a la Programación.
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 3.5. Algoritmo para dibujar dos cuadrados encajados *****'
AY
writeln@'*****'AY
writelnY
veer@™eAY
qr—phwodeY (* 320 x 200 modo grafico blanco-negro *)
gle—rƒ™reenY
ƒhow„urtleY
hi˜uj—rgu—dr—do@™eAY
™eFl—do Xa ™eFl—do div PY
hi˜uj—rgu—dr—do@™eAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoQ•TY
(*
* Algoritmo 3.6. Calcular el perimetro de un cuadrilatero irregular (version 3)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 3. Acciones y funciones
*)
uses ™rtY
type
goorden—d— a realY
€unto a record
x X goorden—d—Y
y X goorden—d—Y
endY
var
pID pPD pQD pR X €untoY
perimetro X realY
ITES PARANINFO c 34
35. Programas en Pascal. Una introducción a la Programación.
function hist—n™i—@poD pd X €untoA X realY
(* PRE po y pd almacenan dos puntos *)
(* POST retorna la distancia entre los puntos po y pd *)
begin
hist—n™i— Xa sqrt@sqr@pdFx E poFxA C sqr@pdFy E poFyAA
endY
procedure veer€unto@var xD y X realY n X shortintAY
begin
write@' Coordenada x del punto 'D nD':'AY
readln@xAY
write@' Coordenada y del punto 'D nD ':'AY
readln@yAY
writelnY
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 3.6. Calcular el perimetro de un *****'AY
writeln@'***** cuadrilatero irregular (version 3) *****'AY
writeln@'*****'AY
writelnY
writeln@'Introduzca los puntos del cuadrilatero:'AY
writelnY
veer€unto@pIFxD pIFyD IAY
veer€unto@pPFxD pPFyD PAY
veer€unto@pQFxD pQFyD QAY
veer€unto@pRFxD pRFyD RAY
perimetro Xa hist—n™i—@pID pPA C hist—n™i—@pPD pQA C hist—n™i—@pQD pRA C hist—n™i—@
pRD pIAY
writeln@'El perimetro del cuadrilatero irregular es:'D perimetroXIXPAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoQ•UY
(*
* Algoritmo 3.7. Funcion que obtiene el mayor de tres numeros (version 1)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
35 c ITES PARANINFO
36. Programas en Pascal. Una introducción a la Programación.
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 3. Acciones y funciones
*)
uses ™rtY
var
xD yD z X longintY
function w—xQ@—D ˜D ™ X longintA X longintY
begin
if @— ba ˜A and @— ba ™A then w—xQ Xa —
else if @˜ ba —A and @˜ ba ™A then w—xQ Xa ˜
else if @™ ba —A and @™ ba ˜A then w—xQ Xa ™
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 3.7. Funcion que obtiene el mayor de tres numeros (version
1) *****'AY
writeln@'*****'AY
writelnY
writeln@'Introduzca tres enteros separados por espacios'AY
write@'y termine pulsando enter: 'AY
readln@xD yD zAY
writelnY
writeln@'El maximo de 'D xD ', 'D yD ' y 'D zD ' es: 'D w—xQ@xD yD zAAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoQ•VY
(*
* Algoritmo 3.8. Funcion que obtiene el mayor de tres numeros (version 2)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* í Mara J. Majado Rosales
* Fecha: 1/9/2005
ITES PARANINFO c 36
37. Programas en Pascal. Una introducción a la Programación.
* Capitulo 3. Acciones y funciones
*)
uses ™rtY
var
xD yD z X longintY
function w—xP @—D ˜ X longintA X longintY
begin
w—xP Xa @— C ˜ C —˜s @— E ˜AA div P
endY
function w—xQ @—D ˜D ™ X longintA X longintY
begin
w—xQ Xa w—xP@ —D w—xP @˜D ™AAY
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 3.8. Funcion que obtiene el mayor de *****'AY
writeln@'***** tres numeros (version 2) *****'AY
writeln@'*****'AY
writelnY
writeln@'Introduzca tres enteros separados por espacios'AY
write@'y termine pulsando enter: 'AY
readln @xD yD zAY
writelnY
writeln@'El maximo de 'D xD ', 'D yD ' y 'D zD ' es: 'D w—xQ @xD yD zAAY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoQ•WY
(*
* Algoritmo 3.9. Calcular la suma de dos duraciones de tiempo (version 1)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 3. Acciones y funciones
*)
37 c ITES PARANINFO
38. Programas en Pascal. Una introducción a la Programación.
uses ™rtY
(*$R+*) (* Habilita la comprobacion de intervalos *)
{(*$Q+*) Habilita la comprobacion de desbordamiento (solo en version 7.0)}
type
hur—™ion a record
hor— X longintY
minD seg X HFFSW
endY
var
tID tP X hur—™ionY (* entrada de datos *)
tQ X hur—™ionY (* salida de datos *)
procedure ƒum—rhur—™iones@dID dP X hur—™ionY var res X hur—™ionAY
(* La funcion SumarDuraciones mostrada en el libro se codifica
mediante un procedimiento con un parametro paso por referencia,
porque en Pascal una funcion no puede devolver un valor de un
tipo registro *)
var
xD y X HFFIY
begin
y Xa @dIFseg C dPFsegA div THY (* acarreo de segundos *)
x Xa @dIFmin C dPFmin C yA div THY (* acarreo de minutos *)
resFhor— Xa dIFhor— C dPFhor— C xY
resFmin Xa @dIFmin C dPFmin C yA mod THY
resFseg Xa @dIFseg C dPFsegA mod THY
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 3.9. Calcular la suma de dos *****'AY
writeln@'***** duraciones de tiempo (version 1) *****'AY
writeln@'*****'AY
writelnY
writeln@'Introduzca dos duraciones:'AY
writelnY
write@' Horas de la duracion 1: 'AY
readln@tIFhor—AY
write@' Minutos de la duracion 1: 'AY
readln@tIFminAY
write@' Segundos de la duracion 1: 'AY
readln@tIFsegAY
writelnY
write@' Horas de la duracion 2: 'AY
ITES PARANINFO c 38
39. Programas en Pascal. Una introducción a la Programación.
readln@tPFhor—AY
write@' Minutos de la duracion 2: 'AY
readln@tPFminAY
write@' Segundos de la duracion 2: 'AY
readln@tPFsegAY
ƒum—rhur—™iones@tID tPD tQAY
writelnY
writeln@'La suma de las duraciones es: 'D
tQFhor—D '-'D tQFminD '-'D tQFsegAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoQ•IHY
(*
* Algoritmo 3.10. Calcular la suma de dos duraciones de tiempo (version 2)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 3. Acciones y funciones
*)
uses ™rtY
(*$R+*) (* Habilita la comprobacion de intervalos *)
(*$Q+*) (* Habilita la comprobacion de desbordamiento (solo en version 7.0) *)
type
hur—™ion a record
hor— X longintY
minD seg X HFFSW
endY
var
tID tP X hur—™ionY (* entrada de datos *)
tQ X hur—™ionY (* salida de datos *)
procedure ƒum—rhur—™iones@—D ˜ X hur—™ionY var res X hur—™ionAY
(* Las funciones SumarDuraciones y ConvertirSD del Algoritmo 3.10
se codifican mediante un procedimiento con un parametro paso por
referencia, porque en Pascal una funcion no puede devolver un
39 c ITES PARANINFO
40. Programas en Pascal. Una introducción a la Programación.
valor de un tipo registro *)
function gonvertirhƒ@d X hur—™ionA X longintY
begin
gonvertirhƒ Xa QTHH B dFhor— C TH B dFmin C dFseg
endY
procedure gonvertirƒh@n X longintY var res X hur—™ionAY
var
d X hur—™ionY
rh X HFFQSWWY
begin
dFhor— Xa n div QTHHY
rh Xa n mod QTHHY
dFmin Xa rh div THY
dFseg Xa rh mod THY
res Xa d
endY
begin (* de SumarDuraciones *)
gonvertirƒh@gonvertirhƒ@—A C gonvertirhƒ@˜AD resAY
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 3.10. Calcular la suma de dos *****'AY
writeln@'***** duraciones de tiempo (version 2) *****'AY
writeln@'*****'AY
writelnY
writeln@'Introduzca dos duraciones:'AY
writelnY
write@' Horas de la duracion 1: 'AY
readln@tIFhor—AY
write@' Minutos de la duracion 1: 'AY
readln@tIFminAY
write@' Segundos de la duracion 1: 'AY
readln@tIFsegAY
writelnY
write@' Horas de la duracion 2: 'AY
readln@tPFhor—AY
write@' Minutos de la duracion 2: 'AY
readln@tPFminAY
write@' Segundos de la duracion 2: 'AY
readln@tPFsegAY
ƒum—rhur—™iones@tID tPD tQAY
ITES PARANINFO c 40
41. Programas en Pascal. Una introducción a la Programación.
writelnY
writeln@'La suma de las duraciones es: 'D
tQFhor—D '-'D tQFminD '-'D tQFsegAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoQ•IIY
(*
* Algoritmo 3.11. Comprobar si una fecha es valida (version 3)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 3. Acciones y funciones
*)
uses ™rtY
(*$R+*) (* Habilita la comprobacion de intervalos *)
(* $Q+ Habilita la comprobacion de desbordamiento (solo en version 7.0) *)
const
di—swes X array ‘IFFIP“ of integer a
@QID PVD QID QHD QID QHD QID QID QHD QID QHD QIAY
type
pe™h— a record
di— X IFFQIY
mes X IFFIPY
—nyo X wordY
endY
var
f X pe™h—Y (* fecha dia/mes/anyo *)
function enyofisiesto@—nyo X integerA X booleanY
(* PRE anyo es un entero *)
(* POST AnyoBisiesto es verdad si anyo es bisiesto
y falso en caso contrario *)
begin
enyofisiesto Xa @—nyo mod R a HA and @—nyo mod IHH `b HA or
@—nyo mod RHH a HA and @—nyo `b QTHHAY
41 c ITES PARANINFO
42. Programas en Pascal. Una introducción a la Programación.
endY
begin
™lrs™rY
writeln@'Introduzca una fecha'AY
writelnY
write@'Introduzca el dia: 'AY
readln@fFdi—AY
write@'Introduzca el mes: 'AY
readln@fFmesAY
write@'Introduzca el anyo: 'AY
readln@fF—nyoAY
if enyofisiesto@fF—nyoA then di—swes‘P“ Xa PWY
write@fFdi—D '/'D fFmesD '/'D fF—nyoD ' 'AY
if @fFdi— `a di—swes‘fFmes“A then writeln@'es una fecha valida'A
else writeln@'no es una fecha valida'AY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
ITES PARANINFO c 42
43. Programas en Pascal. Una introducción a la Programación.
3.3. Capítulo 4
§ ¤
program elgoritmoR•IY
(*
* Algoritmo 4.1. Calcular el valor medio de las notas de una asignatura
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
*)
uses ™rtY
var
v X realY (* nota leida *)
s X realY (* lleva cuenta de la suma total *)
n X integerY (* lleva cuenta del numero de notas *)
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.1. Calcular el valor medio de ******'AY
writeln@'***** las notas de una asignatura ******'AY
writeln@'*****'AY
writelnY
s Xa HY
n Xa HY
write@'Introduzca una nota (valor 0 para terminar): 'AY
readln@vAY
(* E0 : s = 0 y n = 0 *)
while v ba H do begin
s Xa s C vY
n Xa n C IY
write@'Introduzca una nota (valor 0 para terminar): 'AY
readln@vAY
(* Ei : s = suma de las n notas introducidas hasta este paso
y n = numero de notas introducidas hasta este paso *)
endY
(* Ef : s = suma de todas las notas y n = numero total de
notas introducidas *)
if n b H then writeln@'Valor medio de las notas = 'D sGnXIXPA
else writeln@'No hay valores'AY
43 c ITES PARANINFO
44. Programas en Pascal. Una introducción a la Programación.
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•PY
(*
* Algoritmo 4.2. Calcular el numero de ceros y unos en una secuencia
* de caracteres ceros y unos
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
* Fichero de entrada: datos4_2.TXT
*)
uses ™rtD unitms™IY
var
s X ms™IY (* secuencia de enteros *)
numgeros X integerY (* contador del numero de ceros *)
num…nos X integerY (* contador del numero de unos *)
™ X charY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.2. Calcular el numero de ceros *****'AY
writeln@'***** y unos en una secuencia de caracteres *****'AY
writeln@'*****'AY
writelnY
„r—t—mientosni™i—l•wƒgI@sAY
g—rg—r•pi™hero•wƒgI@sD'datos4_2.TXT'AY
numgeros Xa HY
num…nos Xa HY
write@'La secuencia de entrada es: 'AY
gomenz—r•wƒgI@sAY
while @ie•wƒgI@sA `b wƒgI•w—r™—pinA do begin
write@ie•wƒgI@sAD ' 'AY
if ie•wƒgI@sA a '0' then numgeros Xa numgeros C I
else num…nos Xa num…nos C IY
ev—nz—r•wƒgI@sAY
ITES PARANINFO c 44
45. Programas en Pascal. Una introducción a la Programación.
endY
writelnY
writeln@' Numero de ceros = 'D numgerosAY
writeln@' Numero de unos = 'D num…nosAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•QY
(*
* Algoritmo 4.3. Crear una secuencia de caracteres a partir de otra existente
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
* Fichero de prueba: datos4_3.txt
*)
uses ™rtD unitms™IY
var
sD t X ms™IY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.3. Crear una secuencia de caracteres *****'AY
writeln@'***** a partir de otra existente *****'AY
writeln@'*****'AY
writelnY
„r—t—mientosni™i—l•wƒgI@sAY
„r—t—mientosni™i—l•wƒgI@tAY
g—rg—r•pi™hero•wƒgI@sD'datos4_3.TXT'AY
write@'La secuencia de entrada es: 'AY
gomenz—r•wƒgI@sAY
err—n™—r•wƒgI@tAY
while ie•wƒgI@sA `b wƒgI•w—r™—pin do begin
if ie•wƒgI@sA a '*' then ‚egistr—r•wƒgI@tD '+'A
else ‚egistr—r•wƒgI@tD ie•wƒgI@sAAY
write@ie•wƒgI@sAAY
ev—nz—r•wƒgI@sAY
45 c ITES PARANINFO
46. Programas en Pascal. Una introducción a la Programación.
endY
w—r™—r•wƒgI@tAY
ƒ—lv—r•pi™hero•wƒgI@tD'sal4_3.TXT'AY
writelnY
write@'La secuencia de salida es: 'AY
gomenz—r•wƒgI@tAY
while ie•wƒgI@tA `b wƒgI•w—r™—pin do begin
write@ie•wƒgI@tAAY
ev—nz—r•wƒgI@tAY
endY
writelnY
writeln@'Grabado'AY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•RY
(*
* Algoritmo 4.4. Calcular el valor medio de una secuencia con las notas de una
asignatura
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
* Fichero de entradas: datos4_4.txt
*)
uses ™rtD unitmsrIY
var
s X msrIY
sum— X realY (* lleva cuenta de la suma total de las notas *)
numilem X integerY (* lleva cuenta del numero de notas *)
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.4. Calcular el valor medio de una secuencia *****'AY
writeln@'***** con las notas de una asignatura *****'AY
writeln@'*****'AY
writelnY
ITES PARANINFO c 46
47. Programas en Pascal. Una introducción a la Programación.
„r—t—mientosni™i—l•wƒ‚I@sAY
g—rg—r•pi™hero•wƒ‚I@sD'datos4_4.txt'AY
write@'La secuencia de entrada es: 'AY
gomenz—r•wƒ‚I@sAY
sum— Xa HFHY
numilem Xa HY
(* Eini : suma = 0 y numElem = 0 y ea = Primero (S) y INV = Verdadero *)
while ie•wƒ‚I@sA `b wƒ‚I•w—r™—pin do begin
(* INV 1 = i = Long (Piz) y suma tiene el *)
(* sumatorio desde i=1 hasta Long(Piz) de Si *)
(* y numElem = Long (Piz) y (EA (S) MarcaFin) *)
sum— Xa sum— C ie•wƒ‚I@sAY
numilem Xa numilem C IY
write@ie•wƒ‚I@sAXIXPD ' 'AY
ev—nz—r•wƒ‚I@sAY
endY
(* Efin : INV y (EA (S) = MarcaFin) *)
writelnY
writelnY
if @numilem b HA then write@'Valor medio de las notas = 'D sum—GnumilemXIXPA
else write@'Secuencia vacia'AY
writelnY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•SY
(*
* Algoritmo 4.5. Calcular el numero de pares ceros-unos en una secuencia de caracteres
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
* Fichero de entrada: datos4_5.txt
*)
uses ™rtD unitms™IY
var
s X wƒgIY
numgeros X integerY (* lleva cuenta del numero de '0' *)
47 c ITES PARANINFO
48. Programas en Pascal. Una introducción a la Programación.
num€—res X integerY (* lleva cuenta del numero de pares *)
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.5. Calcular el numero de pares ceros-unos *****'AY
writeln@'***** en una secuencia de caracteres *****'AY
writeln@'*****'AY
writelnY
„r—t—mientosni™i—l•wƒgI@sAY
g—rg—r•pi™hero•wƒgI@sD'datos4_5.txt'AY
write@'La secuencia de entrada es: 'AY
gomenz—r•wƒgI@sAY
numgeros Xa HY
num€—res Xa HY
(* INV y (EA = Primero (S)) *)
while ie•wƒgI@sA `b wƒgI•w—r™—pin do begin
(* INV : numPares = NumPares (Piz), numCeros = NumCeros (Piz) *)
(* INV y (EA_MSC1 MarcaFin) *)
case ie•wƒgI@sA of
'0'X numgeros Xa numgeros C IY
'1'X num€—res Xa num€—res C numgeros
endY
write@ie•wƒgI@sAAY
ev—nz—r•wƒgI@sA
endY
writelnY
writelnY
(* INV y (EA = MarcaFin), numPares = NumPares (S) *)
writeln@'El numero de pares 0-1 es: 'D num€—resAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•TY
(*
* Algoritmo 4.6. Calculo del factorial (version 1)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
ITES PARANINFO c 48
49. Programas en Pascal. Una introducción a la Programación.
*)
uses ™rtY
var
nD i X integerY
f—™tori—l X longintY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.6. Calculo del factorial (version 1) *****'AY
writeln@'*****'AY
writelnY
write@'Introduzca un entero ( 17): 'A Y
readln@nAY
i Xa HY
f—™tori—l Xa IY
while i ` n do begin
(* INV: factorial = i! *)
i Xa i C IY
f—™tori—l Xa f—™tori—l B i
endY
writelnY
writeln@'El factorial de 'D nD ' es: 'D f—™tori—lAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program —lgoritmoR•UY
(*
* Algoritmo 4.7. Calculo del factorial (version 2)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
*)
uses ™rtY
var
49 c ITES PARANINFO
50. Programas en Pascal. Una introducción a la Programación.
nD i X integerY
f—™tori—l X longintY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.7. Calculo del factorial (version 2) *****'AY
writeln@'*****'AY
writelnY
write@'Introduzca un entero ( 17): 'AY
readln@nAY
f—™tori—l Xa IY
for iXa P to n do
f—™tori—l Xa f—™tori—l B iY
(* INV factorial = i! *)
writelnY
writeln@'El factorial de 'D nD ' es: 'D f—™tori—lAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•VY
(*
* Algoritmo 4.8. Calculo del producto mediante sumas sucesivas
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
*)
uses ™rtY
var
—D ˜D produ™to X longintY
i X longintY
begin
™lrs™rY
writelnY
writeln@'*****'AY
ITES PARANINFO c 50
51. Programas en Pascal. Una introducción a la Programación.
writeln@'***** Algoritmo 4.8. Calculo del producto mediante sumas sucesivas *****'A
Y
writeln@'*****'AY
writelnY
write@'Introduzca dos numeros enteros separados por blancos: 'AY
readln @—D ˜AY
produ™to Xa HY
for i Xa I to ˜ do
produ™to Xa produ™to C —Y
(* INV producto = a * i y 1 = i = b *)
(* INV y (i = b), producto = a * b = POST *)
writelnY
writeln@' 'D —D '*'D ˜D '='D produ™toAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•WY
(*
* Algoritmo 4.9. Calculo del cociente y resto de una division entera
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
*)
uses ™rtY
var
pD ™D r X longintY
q X longintY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.9. Calculo del cociente y resto de una division entera
*****'AY
writeln@'*****'AY
writelnY
write@'Introduzca dividendo (= 0) y divisor ( 0) separados por blancos: 'AY
readln@pD qAY
51 c ITES PARANINFO
52. Programas en Pascal. Una introducción a la Programación.
r Xa pY ™ Xa HY
while r ba q do begin
(* INV (p = q * c + r) y (r = 0) *)
r Xa r E qY
™ Xa ™ C IY
endY
(* INV y (r q) = POST *)
writelnY
writeln@'Cociente = 'D ™D ' Resto = 'D rAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•IHY
(*
* Algoritmo 4.10. Calculo del maximo comun divisor
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
*)
uses ™rtY
var
—D ˜D uD v X wordY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.10. Calculo del maximo comun divisor *****'AY
writeln@'*****'AY
writelnY
write@'Introduzca dos enteros ( 0) separados por blancos: 'AY
readln@—D ˜AY
u Xa —Y v Xa ˜Y
while u `b v do begin
(* INV (* mcd (a,b) = mcd (u,v) *)
if @u b vA then u Xa u E v
else v Xa v E uY
endY
ITES PARANINFO c 52
53. Programas en Pascal. Una introducción a la Programación.
(* INV y (u = v) *)
writelnY
writeln@'Maximo comun divisor de 'D —D ' y 'D ˜D ' es: 'D uAY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•IIY
(*
* Algoritmo 4.11. Calculo de las potencias de 2 (version 1)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
*)
uses ™rtY
var
x X integerY (* indice inferior del intervalo de potencias *)
y X integerY (* indice superior del intervalo *)
i X integerY
function €oten™i—P@n X integerAXlongintY
(* PRE: n : Entero = 0 *)
(* POST: Potencia2 = 2^n *)
var
p X longintY
j X integerY
begin
p Xa IY
for j Xa I to n do
p Xa p B PY
(* INV p = 2^j *)
€oten™i—P Xa p
endY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.11. Calculo de las potencias de 2 (version 1) *****'AY
53 c ITES PARANINFO
54. Programas en Pascal. Una introducción a la Programación.
writeln@'*****'AY
writelnY
write@'Introduzca dos enteros (= 0) en orden creciente separados por blancos: 'AY
readln@xD yAY
writelnY
for i Xa x to y do
writeln@'La potencia 'D iD '-esima de 2 es 'D €oten™i—P@iAAY
(* INV se han calculado y mostrado las potencias de 2
en el intervalo [x,i] *)
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•IPY
(*
* Algoritmo 4.12. Calculo de las potencias de 2 (version 2)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
*)
uses ™rtY
var
x X integerY (* indice inferior *)
y X integerY (* indice superior *)
poten™i—P X longintY (* resultado *)
i X integerY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.12. Calculo de las potencias de 2 (version 2) *****'AY
writeln@'*****'AY
writelnY
write@'Introduzca dos enteros (= 0) en orden creciente separados por blancos: 'AY
readln@xD yAY
writelnY
poten™i—P Xa IY
for iXa I to x do
ITES PARANINFO c 54
55. Programas en Pascal. Una introducción a la Programación.
poten™i—P Xa poten™i—P B PY
(* INV potencia2 = 2^i *)
writeln@'La potencia 'D xD '-esima de 2 es 'D poten™i—PAY
for iXa xCI to y do begin
poten™i—P Xa poten™i—P B PY
writeln@'La potencia 'D iD '-esima de 2 es: 'D poten™i—PA
(* INV potencia2 = 2^i y se han mostrado las potencias de 2
en el intervalo [x,i] *)
endY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•IQY
(*
* Algoritmo 4.13. Calculo del termino enesimo de la sucesion de Fibonacci
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
*)
uses ™rtY
var
ultD penult X longintY (* ultimo y penultimo termino de Fibonacci *)
™opi—pi˜o X longintY (* valor Fibonacci en el paso i-1 *)
fi˜o X longintY (* resultado *)
n X integerY (* dato *)
i XintegerY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.13. Calculo del termino enesimo *****'AY
writeln@'***** de la sucesion de Fibonacci *****'AY
writeln@'*****'AY
writelnY
write@'Introduzca un entero (= 0): 'AY
readln@nAY
55 c ITES PARANINFO
56. Programas en Pascal. Una introducción a la Programación.
writelnY
case n of
H X writeln@'El termino 'DnD'-esimo de la sucesion (posicion 'D nCID') es: 1'
AY
I X writeln@'El termino 'DnD'-esimo de la sucesion (posicion 'D nCID') es: 1'
AY
else penult Xa IY ult Xa IY fi˜o Xa PY
for iXaQ to n do begin
™opi—pi˜o Xa fi˜oY
fi˜o Xa fi˜o C ultY
penult Xa ultY
ult Xa ™opi—pi˜o
(* INV (fibo = f(i)) y (ult = f(i-1)) y (penult = f(i-2)),
3 = i = n *)
endY
(* INV y (i = n) *)
writeln@'El termino 'DnD'-esimo de la sucesion (posicion 'D nCID') es: 'D
fi˜oA
endY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•IRY
(*
* Algoritmo 4.14. Comprobar si un numero es primo (version 1)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
*)
uses ™rtY
var
n X longintY (* dato *)
j X integerY
begin
™lrs™rY
writelnY
writeln@'*****'AY
ITES PARANINFO c 56
57. Programas en Pascal. Una introducción a la Programación.
writeln@'***** Algoritmo 4.14. Comprobar si un numero es primo (version 1) *****'AY
writeln@'*****'AY
writelnY
write@'Introduzca un entero ( 0): 'AY
readln@nAY
writelnY
if n a I then writeln @'1 es primo'A
else begin
j Xa PY
while @n mod jA `b H do
j Xa j C IY
(* INV ( i : 2 = i j : (n MOD i) 0) *)
(* INV y (n MOD j = 0) *)
if j a n then writeln @nD ' es primo'A
else writeln @nD ' no es primo'A
endY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•ISY
(*
* Algoritmo 4.15. Comprobar si un numero es primo (version 2)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
*)
uses ™rtY
var
n X longintY
j X integerY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.15. Comprobar si un numero es primo (version 2) *****'AY
writeln@'*****'AY
writelnY
57 c ITES PARANINFO
58. Programas en Pascal. Una introducción a la Programación.
write@'Introduzca un entero ( 0): 'AY
readln@nAY
writelnY
if @n a IA or @n a PA or @n a QA then writeln@nD ' es primo'A
else if @n b QA and @@n mod PA a HA then writeln@nD' es par, no es primo'A
else if @n b QA and @@n mod PA `b HA then begin
j Xa QY
while @@n mod jA `b HA and @j ` @n div jAA do
j Xa j C PY
(* INV (i : 3 = i j : (n MOD i) 0) *)
(* INV y (n MOD j = 0) o (j = (n DIV j))*)
if @n mod jA `b H then writeln@nD ' es primo'A
else writeln@nD ' no es primo'AY
endY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•ITY
(*
* Algoritmo 4.16. Calcular la parte entera de la raiz cuadrada de un entero (version
1)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
*)
uses ™rtY
var
nD r™ X longintY (* n dato de entrada, rc parte entera de la raiz *)
i X longintY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.16. Calcular la parte entera de la raiz cuadrada *****'A
Y
writeln@'***** de un entero (version 1) *****'AY
writeln@'*****'AY
ITES PARANINFO c 58
59. Programas en Pascal. Una introducción a la Programación.
writelnY
write@'Introduzca un entero: 'AY
readln @nAY
writelnY
i Xa IY
while @n ba i B iA do
(* INV ( j : 1 = j i : (j^2 = n)) *)
i Xa i C IY
(* INV y (n i^2) *)
r™ Xa i E IY
writeln@'La parte entera de la raiz cuadrada de 'D nD ' es: 'D r™AY
writelnY
write@'Pulse enter para continuar'AY
readln
endF
¦
¥
§ ¤
program elgoritmoR•IUY
(*
* Algoritmo 4.17. Calcular la parte entera de la raiz cuadrada de un entero (version
2)
* Titulo del libro: Una introduccion a la programacion.
* Un enfoque algoritmico
* Autores del libro: Jesus J. Garcia Molina
* Francisco J. Montoya Dato
* Jose L. Fernandez Aleman
* Maria J. Majado Rosales
* Fecha: 1/9/2005
* Capitulo 4. La iteracion
*)
uses ™rtY
var
nD r™ X longintY (* n dato, rc resultado *)
impD iD ™ X longintY
begin
™lrs™rY
writelnY
writeln@'*****'AY
writeln@'***** Algoritmo 4.17. Calcular la parte entera de la raiz cuadrada *****'A
Y
writeln@'***** de un entero (version 2) *****'AY
writeln@'*****'AY
writelnY
write@'Introduzca un entero (= 0): 'AY
readln @nAY
59 c ITES PARANINFO