Beruflich Dokumente
Kultur Dokumente
FACULTAD DE CIENCIAS
Escuela Profesional de Matem
atica
El Lenguaje de Programaci
on Delphi
Apuntes de clase
Realizado por:
Edgard Kenny Venegas Palacios
Lima - Per
u
2009
Indice general
1. Algoritmos y Programaci
on Estructurada
1.1. Concepto y caractersticas de un algoritmo . . . .
1.1.1. Propiedades de los algoritmos . . . . . . . .
1.1.2. Caractersticas de los algoritmos . . . . . .
1.2. Representaci
on de un algoritmo . . . . . . . . . . .
1.2.1. Implementaci
on y analisis de los algoritmos
1.3. Entradas y salidas de datos . . . . . . . . . . . . .
1.4. Ejercicios propuestos . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
2
2
3
5
6
2. Partes de un programa
2.1. Variables y constantes . . . . . . . . . . . . . . . . . . .
2.1.1. Identificadores v
alidos . . . . . . . . . . . . . . .
2.2. Tipos de variables . . . . . . . . . . . . . . . . . . . . .
2.2.1. Tipos de datos numericos . . . . . . . . . . . . .
2.3. Declaraci
on de variables . . . . . . . . . . . . . . . . . .
2.3.1. Asignaci
on de valores en el cuerpo del programa
2.3.2. Ingreso de datos por el usuario . . . . . . . . . .
2.4. Tipos de operadores . . . . . . . . . . . . . . . . . . . .
2.4.1. Operadores aritmeticos . . . . . . . . . . . . . .
2.4.2. Operadores l
ogicos . . . . . . . . . . . . . . . . .
2.5. Funciones matem
aticas . . . . . . . . . . . . . . . . . . .
2.6. Los operadores div y mod . . . . . . . . . . . . . . . .
2.7. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
7
7
8
8
9
9
11
13
13
13
14
16
18
3. Estructuras de control
3.1. Estructuras selectivas . . . . . . . . . . . . . .
3.1.1. Sentencia IF . . . . . . . . . . . . . . .
3.2. Estructuras selectivas de m
ultiples alternativas
3.2.1. El Enunciado IF Anidado . . . . . . . .
3.2.2. La Sentencia Case . . . . . . . . . . . .
3.3. Estructuras repetitivas . . . . . . . . . . . . . .
3.3.1. La Sentencia FOR . . . . . . . . . . . .
3.3.2. La sentencia while . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
19
19
19
23
23
24
26
28
29
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6. Procedimientos y Funciones
6.1. Par
ametros por valor y referencia
6.2. Ejercicios propuestos . . . . . . .
6.3. Tecnicas de ordenaci
on . . . . . .
6.3.1. Selecci
on . . . . . . . . .
6.3.2. Inserci
on . . . . . . . . .
6.3.3. Burbuja . . . . . . . . . .
6.4. Ejercicios propuestos . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
35
35
36
36
36
36
37
37
42
.
.
.
.
.
43
43
43
45
48
51
.
.
.
.
.
.
.
53
55
57
57
58
59
61
61
7. Registros
63
7.1. Declaraci
on de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
7.2. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Bibliografa
67
ii
Introducci
on
Delphi es uno de los lenguajes llamados de alto nivel, porque una sola de sus instrucciones equivale a millares de c
odigo de maquina.
Delphi esta basado en el lenguaje Pascal, cuyas capacidades fueron extendidas para convertirlo en un lenguaje orientado a objetos; que en la actualidad es la metodologa de
programaci
on m
as difundida y utilizada.
El objetivo de de este manual es mostrar las caractersticas y estructura de un algoritmo
para la soluci
on de problemas concretos.
Ademas, hay que resaltar que un primer curso de programacion estructurada permite
obtener los conocimientos necesarios para analizar problemas de manera creativa y de
plasmarlas a traves de un programa codificado, como es en este caso el lenguajes visual
Delphi.
Captulo 1
Algoritmos y Programaci
on
Estructurada
En matem
aticas, ciencias de la computacion y disciplinas relacionadas, un algoritmo
es una lista bien definida, ordenada y finita de operaciones que permite hallar la solucion
a un problema. Dado un estado inicial y una entrada, a traves de pasos sucesivos y bien
definidos se llega a un estado final, obteniendo una solucion.
En la vida cotidiana se emplean algoritmos en multitud de ocasiones para resolver diversos problemas. Algunos ejemplos se encuentran en los instructivos (manuales de usuario),
los cuales muestran algoritmos para usar el aparato en cuestion o inclusive en las instrucciones que recibe un trabajador por parte de su patron. Tambien existen ejemplos de ndole
matematico, como el algoritmo de la division para calcular el cociente de dos n
umeros, el
algoritmo de Euclides para calcular el maximo com
un divisor de dos enteros positivos,
o el m
etodo de Gauss para resolver un sistema lineal de ecuaciones.
La importancia de un algoritmo radica en mostrar la manera de llevar a cabo procesos
y resolver mec
anicamente problemas matematicos o de otro tipo.
1.1.
El concepto de algoritmo, aunque similar y obviamente relacionado, no debe confundirse con el concepto de programa. Mientras el primero es la especificacion de un
conjunto de pasos (operaciones, instrucciones, ordenes, etc.) orientados a la resolucion de
un problema (metodo), el segundo es ese conjunto de operaciones especificadas en un determinado lenguaje de programaci
on y para un computador concreto, susceptible de ser
ejecutado (o compilado o interpretado). Un algoritmo, estrictamente hablando, no puede
ejecutarse hasta que se implementa, ya sea en un lenguaje de programacion, en un circuito electrico, en un aparato mec
anico, usando papel y lapiz, o en alg
un otro modelo de
computaci
on.
E. Kenny Venegas P.
1.1.1.
El cientfico de computaci
on Donald Knuth ofrecio una lista de cinco propiedades, que
son ampliamente aceptadas como requisitos para un algoritmo:
1. Car
acter finito. Un algoritmo siempre debe terminar despues de un n
umero finito
de pasos.
2. Precisi
on. Cada paso debe estar precisamente definido; las operaciones a llevar a
cabo deben ser especificadas de manera rigurosa y no ambigua para cada caso.
3. Entrada. Un algoritmo tiene cero o mas entradas: cantidades que le son dadas antes
de que el algoritmo comience, o dinamicamente mientras el algoritmo corre.
4. Salida. Un algoritmo tiene una o mas salidas: cantidades que tienen una relacion
especfica con las entradas.
5. Eficacia. Todas las operaciones a realizar en un algoritmo deben ser de tal modo que
puedan ser hechas de manera exacta y en un tiempo finito por un hombre usando
lapiz y papel.
1.1.2.
A continuaci
on mencionamos las caractersticas de los algoritmos:
Finitos: Debe acabar en alg
un momento.
Eficientes: Deben ocupar la mnima memoria y minimizar el tiempo de ejecucion.
Legibles: El texto que lo describe debe ser claro, tal que permita entenderlo y leerlo
facilmente.
Modificables: Estar
an dise
nados de modo que sus posteriores modificaciones sean
faciles de realizar, incluso por programadores diferentes a sus propios autores.
Modulares: La filosofa utilizada para su dise
no debe favorecer la division del problema en m
odulos peque
nos.
1.2.
Representaci
on de un algoritmo
1.2. Representaci
on de un algoritmo
Los diagramas de flujo son usados para representar algoritmos peque
nos, ya que abarcan
mucho espacio y su construcci
on es laboriosa. Por su facilidad de lectura son usados como introducci
on a los algoritmos, descripcion de un lenguaje y descripcion de procesos a
personas ajenas a la computaci
on.
A continuaci
on describimos los smbolos usados en los diagramas de flujo:
Un pseudoc
odigo es la descripcion de un algoritmo que asemeja a un lenguaje de
programaci
on pero con algunas convenciones del lenguaje natural. Tiene varias ventajas
con respecto a los diagramas de flujo, entre las que se destaca el poco espacio que se requiere para representar instrucciones complejas. El pseudocodigo no esta regido por ning
un
estandar. Pseudo viene de falso y por ende es un codigo al que aunque es entendible no se
aplica al proceso que debe realizar la maquina.
La descripci
on de un algoritmo usualmente se hace en tres niveles:
1. Descripci
on de alto nivel. Se establece el problema, se selecciona un modelo
matem
atico y se explica el algoritmo de manera verbal, posiblemente con ilustraciones y omitiendo detalles.
2. Descripci
on formal. Se usa pseudocodigo para describir la secuencia de pasos que
encuentran la soluci
on.
3. Implementaci
on. Se muestra el algoritmo expresado en un lenguaje de programaci
on especfico o alg
un objeto capaz de llevar a cabo instrucciones.
La m
aquina de Turing es un modelo matematico, dise
nado por Alan Turing, que
formaliza el concepto de algoritmo. A este modelo se le refiere comunmente como la descripcion de m
as bajo nivel por el hecho de que no utiliza ninguna expresion coloquial.
1.2.1.
Implementaci
on y an
alisis de los algoritmos
Muchos algoritmos son ideados para implementarse en un programa. Sin embargo, los
algoritmos pueden ser implementados en otros medios, como una red neuronal, un circuito
electrico o un aparato mec
anico. Algunos algoritmos inclusive se dise
nan especialmente
para implementarse usando l
apiz y papel. El algoritmo de multiplicacion tradicional, el
E. Kenny Venegas P.
algoritmo de Euclides, la criba de Eratostenes y muchas formas de resolver la raz cuadrada son solo algunos ejemplos.
Como medida de la eficiencia de un algoritmo, se suelen estudiar los recursos (memoria y tiempo) que consume el algoritmo. El analisis de algoritmos se ha desarrollado para
obtener valores que de alguna forma indiquen (o especifiquen) la evolucion del gasto de
tiempo y memoria en funci
on del tama
no de los valores de entrada.
El analisis y estudio de los algoritmos es una disciplina de las ciencias de la computacion
y, en la mayora de los casos, su estudio es completamente abstracto sin usar ning
un tipo
de lenguaje de programaci
on ni cualquier otra implementacion; por eso, en ese sentido,
comparte las caractersticas de las disciplinas matematicas. As, el analisis de los algoritmos se centra en los principios b
asicos del algoritmo, no en los de la implementacion
particular. Una forma de plasmar (o algunas veces codificar) un algoritmo es escribirlo
en pseudoc
odigo o utilizar un lenguaje muy simple tal como lexico, cuyos codigos pueden
estar en el idioma del programador.
Todo pseudoc
odigo consta de 3 partes: nombre, cabecera y cuerpo.
Ejemplo 1.1
Nombre:
Cabecera:
Cuerpo del algoritmo:
Uses
declaraci
on de bibliotecas
Type
declaraci
on de arreglos y nuevos tipos de variables
Cabecera
Const
declaraci
on de constantes
Var
declaraci
on de variables
begin
..
Cuerpo
.
end.
1.3.
Algoritmo
_
Ingles
Programa
_
Lenguaje Maquina
Computadora
_
Lenguaje Maquina
Ejemplo 1.2
write(Hola, Mundo);
Lo que hace escribir el texto Hola, Mundo en la pantalla del computador, es decir
se visualizar
a
Hola, Mundo
Ejemplo 1.3
writeln(Adios, Mundo);
A diferencia del anterior, el cursor estara en la siguiente lnea, por lo tanto, la salida
sera la siguiente:
Adios, Mundo
Para que el usuario pueda ingresar caracteres debera utilizar el comando readln (leer).
Este comando tambien se utiliza para visualizar la pantalla hasta que el usuario presione
enter. Es por ello que siempre se coloca readln antes del end para detener la ejecucion
del programa.
Se debe colocar un punto y coma ( ; ) despues de utilizar los comandos write, writeln
y readln. Aunque no es necesario colocar ; antes del end. En realidad no hay diferencia si
coloca o no el ; antes de un end.
Para la
optima comprensi
on de los comandos definidos anteriormente debemos introducir el concepto de variables.
E. Kenny Venegas P.
1.4.
Ejercicios propuestos
Captulo 2
Partes de un programa
2.1.
Variables y constantes
2.1.1.
Identificadores v
alidos
Los identificadores deben cumplir varios requisitos (los cuales se asemejan a los requisitos que debe tener el nick de un usuario de correo electronico):
Solo deben contener caracteres alfanumericos y los caracteres y
El primer car
acter debe ser una letra o subrayado.
Jose (correcto).
E. Kenny Venegas P.
123abc (incorrecto).
raiz 23 (correcto).
byte (incorrecto).
Un identificador no es sensible a las may
usculas, por ejemplo, un identificador cono
MinMax puede escribirse de cualquiera de las siguientes maneras:
Minmax
minMax
minmax
MINMAX
MiNmAx
Al declarar una variable, tras el identificador que servira como nombre, indicaremos el
tipo de dato que podremos almacenar en ella.
2.2.
Tipos de variables
2.2.1.
Rango de valores
-128 a 127
0 a 255
-32768 a 32767
0 a 65535
-2147483648 a 2147483647
1.2e-38 a 3.4e38
2.2e-308 a 1.8e308
Ocupacion
8 bits
8 bits
16 bits
16 bits
32 bits
32 bits
64 bits
2.3. Declaraci
on de variables
2.3.
Declaraci
on de variables
Sintaxis
Var < Identificador > : < Tipo de variable > ;
Ejemplo 2.2
cad
Raiz 12
Edad
Opcion
2.3.1.
:
:
:
:
string;
real;
integer;
char;
Asignaci
on de valores en el cuerpo del programa
Sintaxis
< Nombre de la variable > := < Valor de la variable > ;
Donde := es el operador de asignacion. Cuando queremos asignar el valor de una
variable del tipo char o string, colocaremos el caracter o caracteres entre apostrofes.
Ejemplo 2.3
Program Prueba;
var
a: integer; b: real;
c: char; d: string;
e,f: boolean;
begin
a:=5; // 5 es el valor de a
b:=3.25; // 3.25 es el valor de b
c:=1; { 1 es el valor de c }
d:=11; (* 11 es el valor de *)
e:=True; // El valor de e es verdadero
f:=False; { El valor de f es falso }
end.
Observaciones
No hay error si b:=5; pero si a := 3.25; estara mal ya que a debe ser entero.
No hay error si d:=1; pero si c:= 11; estara mal ya que c debe ser un caracter.
E. Kenny Venegas P.
Podemos colocar m
as de un identificador en la asignacion del tipo de variables si los
separamos por comas (,) como en el ejemplo anterior al definir e y f.
Los comentarios se usan para describir una o mas instrucciones en el programa y no
son ejecutados por el programa. Si es un comentario corto podemos utilizar //, en todo
caso podemos escribir el comentario dentro de llaves o dentro de (* *), los cuales se usan
en comentarios largos, como en el ejemplo anterior.
Si queremos visualizar en la pantalla el valor de una variable podemos utilizar el comando write o writeln, para ello escribiremos el nombre de la variable entre parentesis
despues de alguno de estos comandos. Es decir:
Sintaxis
Write ( < nombre de la variable > ); Writeln ( < nombre de la variable > ) ;
Ejemplo 2.4
program Prueba1;
var
entero : integer;
b: boolean;
begin
Entero := 5;
B:=False;
Writeln (a = );
Write (entero);
Writeln (b);
Readln;
end.
La pantalla de salida ser
a:
a=
5False
Ejemplo 2.5
10
2.3. Declaraci
on de variables
program Prueba2;
var
a : integer;
begin
a := 3;
Write (a = );
Writeln( a );
Writeln;
a := 5;
Write (Ahora a = );
Writeln ( a );
Readln;
end.
La pantalla de salida ser
a:
a=3
Ahora a = 5
2.3.2.
11
E. Kenny Venegas P.
Readln (a);
Write ( a = );
Write (a);
Readln;
end.
Primero la pantalla de salida ser
a:
Ingrese un entero:
Ingrese un entero:
3
a=3
Ejemplo 2.7
program Prueba;
var
nombre: string;
edad: integer;
begin
Write (Escriba su nombre: );
Readln (nombre);
Write (Escriba su edad: );
Readln (edad);
Writeln (Su nombre es ,nombre, y su edad es ,edad );
Readln;
end.
Primero la pantalla de salida ser
a:
Escriba su nombre:
12
En el ejemplo anterior utilizamos dos variables cuyos valores son ingresados por el
usuario y estos valores son mostrados acompa
nados de textos que se separan de las variables mediante comas.
2.4.
Tipos de operadores
2.4.1.
Operadores aritm
eticos
+
*
/
2.4.2.
And
Or
Not
Xor
:
:
:
:
suma
resta
producto
divisi
on
Operadores l
ogicos
(
(
(
(
y)
o)
negaci
on )
o exclusivo )
Ejemplo 2.8
( 4 < 5 ) and ( 3 >= 2 )
( -1 < > 1 ) or ( 3 < 2 )
Not ( 4 < 5 )
( 1 > = 0 ) xor ( 1 < 0 )
True
True
False
True
Tambien podemos m
as de dos operadores logicos, por ejemplo:
( ( 1 < > 0 ) or ( 1 > 2 ) ) and ( 4 < 3 )
Not ( ( 1 > = 2 ) and ( 0 < = -1) )
13
False
True
E. Kenny Venegas P.
2.5.
Funciones matem
aticas
:
:
:
:
:
:
:
:
:
:
:
:
:
Seno
Coseno
Tangente
Exponencial
Al cuadrado
Raz cuadrada
Logaritmo neperiano
Valor absoluto
Arco tangente
Arco seno
Arco coseno
Seno hiperb
olico
Coseno hiperb
olico
< funci
on > ( < variable > ) ;
< funci
on > ( < valor numerico > ) ;
Observaciones
Las funciones Abs y Sqr , respetan el tipo de variable, es decir, si la variable es real
(entera), el resultado tambien sera real (entera).
Para utilizar las funciones Tan, ArcSin, ArcCos, Sinh y Cosh debemos incluir la
biblioteca Math.
Ejemplo 2.9
program Prueba ;
var
a, b: integer ;
c, d: real ;
begin
a :=
b :=
c :=
d :=
2;
sqr(a) ;
-3.5;
abs(c) ;
14
Para
3+1
2 ,
Ejemplo 2.10
Escribir un programa en Delphi que calcule la suma y el producto de las races del
polinomio cuadr
atico: x2 ax + ln b, donde a y b son ingresados por el usuario.
program Ejemplo1;
{$APPTYPE CONSOLE}
var
a,b: real;
begin
Write (Ingrese el valor de a: );
Readln (a);
Write (Ingrese el valor de b: );
Readln (b);
Writeln (El valor de la suma de las races es ,sqrt(a));
Writeln (El valor del producto de las races es ,ln(b));
Readln;
end.
Para ver la salida de un programa se debe incluir la instruccion {$APPTYPE CONSOLE}
al inicio de la cabecera del programa como en el ejemplo anterior. Supongamos que ingresamos a = 2 y b = 4, entonces al final de ejecutar el programa anterior se visualizara en
la pantalla:
15
E. Kenny Venegas P.
Ingrese el valor de a: 2
Ingrese el valor de b: 4
El valor de la suma de las races es 1.414213562373E+0000
El valor del producto de las races es 1.38629436111989E+0000
En la pantalla se mostrar
a la salida:
1.10
1.41
2.6.
Hay otros operadores aritmeticos definidas en Delphi como div y mod, los cuales estan
definidos como el cociente y el residuo de una division entera respectivamente. Es decir,
dados a y b n
umeros enteros existen n
umeros enteros q y r, tal que : a = q b + r, donde
0 = r < b. Entonces q = a div b y r = a mod b.
Sintaxis:
<Variable de tipo entero> := <Variable de tipo entero> div <Variable de tipo entero>
;
16
17
E. Kenny Venegas P.
En el segundo ejemplo podemos ver que no fue necesario introducir las variables una
por una, pues en Delphi se puede introducir varias variables a la vez con el comando
Readln si separamos las variables mediante comas.
2.7.
Ejercicios propuestos
1. Dados a, b y c n
umeros reales, elabore un programa que muestre las races (reales o
complejas) de la ecuaci
on cuadratica
ax2 + bx + c = 0.
2. Haga un algoritmo que calcule la suma y producto de dos polinomios cuadraticos.
Para ello el programa debe pedir los coeficientes de los terminos independientes,
lineales y cuadr
aticos de los polinomios y debe mostrar los coeficientes de ambos
resultados.
18
Captulo 3
Estructuras de control
3.1.
Estructuras selectivas
3.1.1.
Sentencia IF
19
E. Kenny Venegas P.
Si la condici
on es verdadera, entonces ejecuta la accion Si (o acciones si son varias).
Si la condici
on es falsa, entonces no se hace nada.
Ejemplo 3.1 Construir un algoritmo tal, que dado como dato la calificaci
on de un alumno
en un examen, escriba Aprobado en caso que esa calificaci
on fuese mayor o igual que
10.
Algoritmo Calificaci
on
Variables
cal: entero
Inicio
Leer (cal)
Si cal >= 10 entonces
Escribir ("Aprobado")
Fin_si
Fin
Estructura If Doble
Es una estructura l
ogica que permite controlar la ejecucion de varias acciones y se
utilizan cuando se tienen dos opciones de accion, por la naturaleza de estas se debe ejecutar
una o la otra, pero no ambas a la vez, es decir, son mutuamente excluyentes.
20
Ejemplo 3.3 Dado como dato el sueldo de un trabajador, aplicar un aumento del 15 %
si su sueldo es inferior a $1000 y 12 % en caso contrario, luego imprimir el nuevo sueldo
del trabajador.
Program Multiplo2;
{$APPTYPE CONSOLE}
Var
a,b: integer;
Begin
21
E. Kenny Venegas P.
Write (Ingrese un entero positivo: ) ;
Readln (a) ;
If ( a>0 ) then
Begin
b:= a mod 2 ;
If (b = 0) then
Write ( a, es multiplo de 2)
Else
Write ( a, no es multiplo de 2) ;
End;
Readln
End.
Observaciones:
1. Si el n
umero de sentencias es 1 se puede obviar el Begin - End.
2. Antes de un Else no hay ;.
3. Al final del End hay ;.
4. No es obligatorio colocar ; antes de un End.
5. No se puede visualizar las vocales tildadas.
Ejemplo 3.4 Elabore un pseudoc
odigo que diga si un n
umero real est
a o no en el intervalo
[-1 1].
Algoritmo Intervalo;
Variables
x: real
Inicio
Escribir (Ingrese un numero real: )
Leer (x)
Si (x=-1) y (x=1) entonces
Escribir (x, est
a en el intervalo [ -1 , 1 ])
Sino
Escribir (x, no est
a en el intervalo [ -1 , 1 ])
Fin
Ejemplo 3.5 Haga un programa que pida el ingreso de 2 n
umeros y calcule el mayor de
ellos.
Program Mayor2;
{$APPTYPE CONSOLE }
Var
a,b: real;
22
3.2.
Estructuras selectivas de m
ultiples alternativas
Se ha visto que el compilador puede escoger entre dos alternativas. En algunos casos,
el compilador debe escoger entre una lista con mas de dos alternativas. Hay dos metodos:
IF anidado y Case .
3.2.1.
El Enunciado IF Anidado
En la soluci
on de problemas encontramos numerosos casos en los que luego de tomar
una decisi
on y marcar el camino correspondiente a seguir, es necesario tomar otra decision. Dicho proceso puede repetirse varias veces. En aquellos problemas en donde un
bloque condicional incluye otro bloque condicional se dice que un bloque esta anidado
dentro del otro.
Sintaxis:
If < condicion 1 > then
< sentencia 1 >
Else If < condicion 2 > then
< sentencia 2 >
Else If < condicion 3 > then
< sentencia 3 >
.
.
.
Else
< sentencia n > ;
Ejemplo 3.6 Elabore un programa que pida el ingreso de un n
umero entero y diga si es
positivo, cero o negativo. En el caso que sea positivo diga adem
as si es par o impar.
Program IF_Anidado;
{$APPTYPE CONSOLE }
Var
23
E. Kenny Venegas P.
n: integer;
Begin
Write ( Ingrese un numero entero: ) ;
Readln (n) ;
If (n<0) then
Write ( El numero es negativo )
Else if ( n = 0 ) then
Write ( El numero es cero )
Else if ( n mod 2 = 0 ) then
Write ( El numero es positivo y par )
Else
Write ( El numero es positivo e impar );
Readln
End.
3.2.2.
La Sentencia Case
Con frecuencia es necesario que existan mas de dos elecciones posibles. Este problema
se podra resolver por estructuras selectivas simples, dobles o anidadas, pero si el n
umero
de alternativas es grande puede plantear serios problemas de escritura y de legibilidad.
Usando la estructura de decisi
on m
ultiple se evaluara una expresion que podra tomar n
valores distintos, 1, 2, 3, . . . , n y seg
un que elija uno de estos valores en la condicion, se
realizara una de las n acciones o lo que es igual, el flujo del algoritmo seguira solo un
determinado camino entre los n posibles. Esta estructura se representa por un selector el
cual si toma el valor 1 ejecutar
a la accion 1, si toma el valor 2 ejecutara la accion 2, si
toma el valor N realizar
a la acci
on N .
100V,
100V ,
V al(N um.V ) =
100/V,
0,
siN um = 1;
siN um = 2;
siN um = 3;
en otro caso.
Veamos la representaci
on de tal algoritmo en un diagrama de flujo y en el diagrama NS.
24
Sintaxis:
Case <selector> of
Opci
on 1 : sentencia
Opci
on 2 : sentencia
Opci
on 3 : sentencia
.
.
Opci
on n : sentencia
Else
Sentencia n+1
End;
1;
2;
3;
Observaci
on:
El selector debe ser de tipo ordinal, es decir entero o caracter.
25
E. Kenny Venegas P.
Ejemplo 3.8 Implemente el algoritmo del ejemplo anterior.
Program ValCase;
{$APPTYPE CONSOLE}
Var
num,v: integer;
val: real;
Begin
Writeln(Ingrese los valores de "num" y "val" en ese orden:);
Readln(num,v);
Case num of
1: val:= 100*v;
2: val:= exp(ln(100)*v);
3: val:= 100/v
Else
val:= 0;
End;
Write(El valor de "val" es ,val:6:3);
Readln
End.
Ejemplo 3.9 Elabore un programa que diga si el da de hoy hay o no clases
Program DiaCase;
{$APPTYPE CONSOLE }
Var
cad: string;
op: char;
Begin
Write (Ingrese la primera letra del dia de hoy: );
Readln(op);
Case op of
l,L: cad:=Hay clases pues es lunes;
j,J: cad:=Hay clases pues es jueves
Else
cad:= Hoy no hay clases ;
End;
Writeln (cad);
Readln
End.
3.3.
Estructuras repetitivas
Nos permiten ejecutar una secuencia de instrucciones repetidamente usando una condicion de control o variable, para determinar cuando debe detenerse la ejecucion. Hay tres
26
27
E. Kenny Venegas P.
3.3.1.
La Sentencia FOR
Ejemplo 3.10 Hacer un algoritmo que calcule la suma de los cuadrados de los primeros
100 enteros y escribir el resultado. Se desea resolver el problema usando la sentencia For.
28
Program SumaCuadrados;
{$APPTYPE CONSOLE}
Var
suma,i: integer;
Begin
suma:=0;
for i:=1 to 100 do
suma:=suma+sqr(i);
Write(El valor de la suma es ,suma);
Readln
End.
3.3.2.
La sentencia while
29
E. Kenny Venegas P.
Observe en el diagrama de flujo, que se necesita una variable contadora (un ndice), para
llevar la cuenta de las veces que entramos al cuerpo del ciclo. Tambien es importante notar
que esta variable se inicializa antes de entrar al cuerpo del ciclo y dentro del cuerpo se
incrementa en una cantidad constante, por lo general en uno.
Esta variable a la vez, nos sirve para compararla con el valor dado en la condicion, cuando
se cumple la condici
on, se sale del ciclo.
Ejemplo 3.12 Haga un algoritmo que calcule la suma de los cuadrados de los primeros
100 n
umeros enteros utilizando la estructura Mientras.
30
opcional
3.3.3.
La Sentencia REPEAT
31
E. Kenny Venegas P.
Las reglas para la construcci
on de esta estructura usando Repetir, nos dicen que debemos
declarar una variable contador que debe inicializarse antes del ciclo e incrementarse dentro
del ciclo. A diferencia de la estructura Mientras, la condicion ahora estara colocada al final
del bucle para que primero ejecutamos la instruccion y luego preguntamos si la condicion
se cumple. Esto quiere decir, que en esta estructura el bucle se realizara por lo menos
una vez. Tambien podr
as observar que la condicion esta al reves, porque el bucle se repite
hasta que la condici
on se cumpla. En el bucle Mientras, la condicion se evaluaba mientras
era cierta.
Ejemplo 3.14 Hacer un algoritmo que calcule la suma de los cuadrados de los primeros
100 n
umeros enteros utilizando la estructura Repeat.
Sintaxis:
32
33
E. Kenny Venegas P.
3.4.
Ejercicios propuestos
x < 1
|x|/ 1 x,
cos(x) ln(1 + x2 ), 1 x 5
f (x) =
tan(x3 x2 ),
x>5
2. Elabore un programa que pida el ingreso de x R y determine si x dom(f ), donde
q
p
f (x) = sen(1 + x2 ) 125 x3 .
3. Elabore un programa que pida el ingreso de n n
umeros positivos y muestre su media
aritmetica, geometrica y arm
onica.
4. Realice un programa que pida el ingreso de la parte real e imaginaria de un n
umero
complejo z = a + bi y muestre la parte real e imaginaria de z n , donde n es ingresado
por el usuario.
5. Haga un programa que halle y muestre todos los n
umeros de la forma aabb, donde
a y b son dgitos distintos, tal que aabb sea un cuadrado perfecto.
34
Captulo 4
CARACTERES:
Una variable del tipo Char , almacena un caracter que puede ser ledo por el teclado.
Observaci
on:
Es distinto poner 2 que 2, pues 2 representa una variable del tipo char o string,
mientras 2 es una variable del tipo integer o real.
Existe una biyecci
on entre el conjunto de caracteres y el conjunto {1, 2, . . . , 255}, a tal
biyeccion se le conoce como c
odigo ASCII.
Por ejemplo: @ = ALT + 64 (s
olo en Windows).
Note que: <caracter asociado>=CHR (<n
umero entero entre 1 y 255>)
Program Cadena;
{$APPTYPE CONSOLE}
35
E. Kenny Venegas P.
Var A : string
Begin
Write ( Ingresa tu nombre );
Read ( A );
Write ( HOLA );
Write ( A );
Write ( Como estas ? );
Readln
End.
4.1.1.
Se usar
a la funci
on LENGTH para conocer la cantidad de caracteres de una cadena.
<longitud de la cadena>=LENGTH(<Variable de tipo String>);
Por ejemplo, dentro de un programa tendremos:
Cad := algoritmo; // Cad es una variable del tipo String
Lon := LENGTH (Cad); // Lon es una variable del tipo Integer
En este ejemplo, el valor de de Lon es 9.
4.1.2.
Concatenaci
on de cadenas
4.2.
Conversi
on de tipos
Lo que hemos estado trabajando hasta el momento es la entrada y salida de informacion del modo consola. Para visualizar la informacion en ventanas debemos utilizar
una conversi
on de nuestras variables al tipo cadena (string) y ademas usar los comandos
inputbox y showmessage.
4.2.1.
Conversi
on de cadena a n
umero
En adelante trabajaremos con mayor frecuencia con variables del tipo string, es por
ello que en algunos casos convertiremos variables del tipo integer o real a variables del tipo
36
4.2. Conversi
on de tipos
string y viceversa.
Para convertir una cadena a entero: StrToInt
Para convertir una cadena a reales: StrToFloat
Para convertir un entero a cadena: IntToStr
Para convertir un real a cadena: FloatToStr
4.2.2.
Inputbox y Showmessage
Para utilizar los comandos Inputbox y Showmessage necesitamos incluir las librerias
SysUtils y Dialogs (o en todo caso Qdialogs).
Con el comando Inputbox leeremos las cadena cad de la siguiente forma:
cad:=Inputbox(<cad1>,<cad2>,<cad3>);
donde cad1 es una cadena que se visualizara como ttulo de la ventana, cad2 es una
cadena que solicita el ingreso del dato y cad3 es una cadena que se muestra como valor
tentativo a ingresar.
El comando Showmessage sirve para mostrar una el valor de una cadena en una ventana.
Veamos algunos ejemplos en los siguientes ejercicios resueltos:
4.2.3.
Ejercicios Resueltos
37
E. Kenny Venegas P.
prom: real;
Begin
n:=StrToInt(InputBox(Lectura de n
umeros,
Ingrese el primer n
umero:,));
m:=StrToInt(InputBox(Lectura de n
umeros,
Ingrese el segundo n
umero:,));
p:=StrToInt(InputBox(Lectura de n
umeros,
Ingrese el tercer n
umero:,));
prom:=(n+m+p)/3;
ShowMessage(El promedio de los n
umeros ingresados es
+FloatToStr(prom));
{ ShowMessage(El promedio de +IntToStr(n)+, +IntToStr(m)+ y
+IntToStr(p)+ es +FloatToStr(prom)); }
End.
2. Elabore un programa que calcule el factorial de un n
umero ingresado por teclado.
Program factorial;
Uses
SysUtils,dialogs;
Var
i,n,f:integer;
Begin
repeat
n:=strtoint(inputbox(,Ingrese un n
umero natural
menor que 20,));
until (n>=0);
f:=1;
for i:=2 to n do
f:=f*i;
showmessage(El factorial de +inttostr(n)+ es +inttostr(f));
End.
3. Haga un programa que verifique si un n
umero ingresado es primo o no.
Program primo;
Uses SysUtils,Dialogs;
Var n,i,k:integer; r:real;
Begin
n:=StrToInt(InputBox(,Ingrese un n
umero,));
r:=sqrt(n); i:=1; k:=0;
while (i<=r) and (k=0) do
begin
i:=i+1;
38
4.2. Conversi
on de tipos
if (n mod i = 0) then
k:=1;
end;
if (k=0) then
ShowMessage(IntToStr(n)+ si es un n
umero primo)
else
ShowMessage(IntToStr(n)+ no es un n
umero primo)
End.
4. Elabore un programa que pida el ingreso de un n
umero en base 2 y lo convierta a
base 10.
Program change_of_base;
Uses
SysUtils,Dialogs;
Var
n,m,p:integer;
cad:string;
Begin
cad:=InputBox(Lectura del n
umero,Ingrese el n
umero
en base 2:,);
n:=StrToInt(cad);
m:=n mod 10;
p:=2;
while (n>0) do
begin
n:=n div 10;
m:=m+(n mod 10)*p;
p:=p*2;
end;
ShowMessage(cad+ convertido a base 10 es +IntToStr(m));
End.
5. Haga el programa anterior verificando si el n
umero esta ingresado en base 2 y utilizando variables del tipo string.
Program change_of_base;
Uses
SysUtils,Dialogs;
Var
i,n:integer; m:real;
cad:string;
Begin
cad:=InputBox(Lectura del n
umero,Ingrese el n
umero
39
E. Kenny Venegas P.
en base 2:,);
n:=length(cad);
i:=1;
while (i<=n) and (StrToInt(cad[i])<=1) do
i:=i+1;
if (i=n+1) then
begin
m:=0;
for i:=n downto 1 do
m:=m+StrToInt(cad[i])*exp(ln(2)*(n-i));
ShowMessage(cad+ convertido a base 10 es +FloatToStr(m));
end
else showmessage(El n
umero ingresado no est
a en base 2);
End.
6. Elabore un programa que pida un n
umero real x y un n
umero natural n y calcule la
suma.
Program suma_exp;
Uses SysUtils,Dialogs;
Var
i,k,n:integer; x,fx,sum:real;
Begin
x:=StrToFloat(InputBox(,Ingrese un numero real:,));
n:=StrToInt(InputBox(,Ingrese un numero natural:,));
Sum:=0; k:=1; fx:=1;
for i:=1 to n do
begin
k:=k*i;
fx:=fx*x;
sum:=sum+fx/k;
end;
ShowMessage(La suma es +FloatToStr(sum))
End.
7. Haga un programa que calcule los divisores propios de un n
umero ingresado por el
usuario.
Program div_propios;
Uses
SysUtils,Dialogs;
Var
i,n:integer;
cad:string;
40
4.2. Conversi
on de tipos
Begin
n:=StrToInt(InputBox(,Ingrese un numero natural:,));
for i:=1 to (n div 2) do
If (n mod i = 0) then
cad:=cad+IntToStr(i)+#9;
ShowMessage(Los divisores propios de +IntToStr(n)+
son:+#13+cad);
End.
8. Elabore un programa que muestre los n primeros n
umeros terminos de la sucesion
de Fibonacci, donde n es ingresado por el usuario.
Program Fibonnacci;
Uses SysUtils,dialogs;
Var i,a,b,temp,n:integer; S:string;
Begin
n:=strtoint(inputbox(Sucesi
on de Fibonacci,
Ingrese el n
umero de t
erminos,));
S:=1; a:=1;
if n>1 then
begin
S:=S+#9+1; b:=1;
for i:=3 to n do
begin
temp:=b;
b:=a+b;
a:=temp;
S:=S+#9+inttostr(b);
end;
end;
showmessage(La sucesi
on de Fibonacci es+#13+S);
End.
9. Dise
nar un programa tal que dados como datos una variable de tipo entero y una
del tipo real, obtenga el resultado de la siguiente funcion:
Program ValCase;
Uses SysUtils,Dialogs;
Var
num: integer;
v,val: real;
Begin
num:=StrToInt(InputBox(,Ingrese un n
umero entero:,));
v:=StrToFloat(InputBox(,Ingrese un n
umero real positivo:,));
41
E. Kenny Venegas P.
Case num of
1: val:= 100*v;
2: val:= exp(ln(100)*v);
3: val:= 100/v
Else
val:= 0;
End;
ShowMessage(El valor de la funci
on ser
a+#13+FloatToStr(val))
End.
4.3.
Ejercicios propuestos
42
Captulo 5
Vectores y Matrices
Para hacer uso de vectores o matrices, Delphi ha definido array, que en castellano
significa arreglo. Un array es un tipo de variable definida por el usuario, similar a una
cadena, con la diferencia de que en vez de caracteres sus elementos pueden ser cualquier
tipo de variable.
5.1.
5.1.1.
Arreglos Est
aticos
Vectores
43
E. Kenny Venegas P.
type vector=array[1..max] of integer;
Var i,n:integer; A:vector; S:string;
Begin
n:=strtoint(inputbox(,Ingrese la dimensi
on del vector,));
for i:=1 to n do
begin
// Definiendo el vector A:
A[i]:=strtoint(inputbox(A[+inttostr(i)+],Ingrese valor,));
S:=S+inttostr(A[i])+#9; // Conversi
on de A a la cadena S
end;
showmessage(El vector A es+#13+S)
End.
Ejemplo 5.3 Program norma;
Uses SysUtils, Dialogs;
const max=20;
type vector=array[1..max] of integer;
Var i,n:integer; norm:real;
A:vector; S:string;
Begin
n:=strtoint(inputbox(,Ingrese la dimensi
on del vector,));
norm:=0;
for i:=1 to n do
begin
A[i]:=strtoint(inputbox(A[+inttostr(i)+],Ingrese valor,));
S:=S+inttostr(A[i])+#9; // Conversi
on de A a la cadena S
norm:=norm+sqr(A[i]);
end;
norm:=sqrt(norm);
showmessage(El vector A es+#13+S)
End.
Ejemplo 5.4 Program Fibonnacci;
Uses SysUtils, Dialogs;
const max=20;
type vector=array[1..max] of integer;
Var i,n:integer; A:vector; S:string;
Begin
n:=strtoint(inputbox(Sucesi
on de Fibonacci,
Ingrese el n
umero de t
erminos,));
A[1]:=1; S:=1;
if n>1 then
begin
A[2]:=1; S:=S+#9+1;
44
5.1.2.
Matrices
45
E. Kenny Venegas P.
Ejemplo 5.6 Program ejemplo;
Uses sysutils,dialogs;
Type matriz=array[1..6,1..8] of integer;
Var A: matriz;
Begin
A[1,1]:=2; A[1,2]:=3; A[2,1]:=5; A[2,2]:=7;
End.
Ejemplo 5.7 Programa que pide el ingreso de cada elemento de una matriz cuadrada:
Program matricial;
Uses SysUtils,dialogs;
const max=20;
type matriz=array[1..max,1..max] of integer;
var i,j,n:integer; A:matriz; S:string;
Begin
n:=strtoint(inputbox(,Ingrese el orden de la matriz,));
// Lectura de los elementos de la matriz:
for i:=1 to n do
begin
for j:=1 to n do
begin
A[i,j]:=strtoint(inputbox(A[+inttostr(i)+,
+inttostr(j)+],Ingrese valor,));
S:=S+inttostr(A[i,j])+#9;
end;
S:=S+#13;
end;
showmessage(La matriz A es+#13+S)
End.
Ejercicio: Modificar para una matriz no cuadrada, calcular la suma de los elementos.
Ejemplo 5.8 Elabore un programa que pida el ingreso de dos matrices cuadradas, muestrelas y calcule su suma.
Program suma_matrices;
Uses SysUtils,dialogs;
const max=20;
Type matriz=array[1..max,1..max] of integer;
var i,j,n:integer; A,B:matriz; S1,S2,S:string;
Begin
S1:=La matriz A es+#13;
S2:=La matriz B es+#13;
n:=strtoint(inputbox(,Ingrese el orden de la matriz,));
46
Ejemplo 5.9 Haga un programa que construya aleatoriamente dos arreglos unidimensionales: A y B, tal que A contiene elementos reales del 0 al 10 con un solo decimal y B
elementos enteros del 1 al 10, adem
as sume A y B.
Program aleatorio;
Uses SysUtils,dialogs;
const max=20;
Type vector=array[1..max] of real;
Var i,n:integer; A,B:vector; S,S1,S2:string;
Begin
n:=strtoint(inputbox(,Ingrese la dimensi
on del vector,));
S1:=El vector A es+#13;
S2:=El vector B es+#13;
randomize;
for i:=1 to n do
begin
A[i]:=trunc(100*random)/10; // Tambi
en A[i]:=trunc(random(101))/10;
B[i]:=random(10)+1;
S1:=S1+floattostr(A[i])+#9;
47
E. Kenny Venegas P.
S2:=S2+floattostr(B[i])+#9;
S:=S+floattostr(A[i]+B[i])+#9;
end;
showmessage(S1+#13+#13+S2+#13+#13+El vector A+B es+#13+S)
End.
5.2.
Arreglos Din
amicos
48
// -10+20*random;
// formatfloat(0.00,A[i])+#9;
49
E. Kenny Venegas P.
for j:=0 to n-1 do
begin
A[n*i+j]:=random(m+n);
B[n*i+j]:=random(m+n);
S1:=S1+inttostr(A[n*i+j])+#9;
S2:=S2+inttostr(B[n*i+j])+#9;
S:=S+inttostr(A[n*i+j]+B[n*i+j])+#9;
end;
S1:=S1+#13; S2:=S2+#13; S:=S+#13;
end;
showmessage(S1+#13+S2+#13+La matriz A+B es+#13+S)
End.
Ejemplo 5.14 Programa que genera una matriz aleatoriamente definiendo un arreglo
din
amico cuyos elementos son vectores.
Program matriz_d_random;
Uses
SysUtils,Dialogs;
Type
vector = array of real;
matriz = array of vector;
Var
A:matriz; i,j,n,m:integer; S:string;
Begin
n:=strtoint(inputbox(,Ingrese el n
umero de filas,));
m:=strtoint(inputbox(,Ingrese el n
umero de columnas,));
setlength(A,n); // Genera las "n" filas de A
Randomize;
for i:=0 to n-1 do
begin
setlength(A[i],m); // Genera los "m" elementos de la fila "i"
for j:=0 to m-1 do
begin
A[i,j]:=-10+20*random;
S:=S+formatfloat(0.00,A[i,j])+#9;
end;
S:=S+#13;
end;
Showmessage(S);
End.
50
5.3.
Ejercicios propuestos
Iniciar i = 1.
Hallar el menor elemento de A[i] A[i + 1] . . . A[n].
Intercambiar el elemento hallado en el item (b) con el termino A[i].
Aumentar i en 1.
Si i > n terminar el programa, en caso contrario regresar al paso (b).
ui+1
i
X
hvj , ui i
= vi+1
uj ,
huj , uj i
j=1
51
i = 1, . . . , n 1
E. Kenny Venegas P.
10. Elabore un programa que pida el ingreso de n pares ordenados (xi , yi ), i = 1, . . . , n
y halle la ecuaci
on de la recta que minimice la suma de las distancias al cuadrado
de los puntos (xi , yi ) a dicha recta.
52
Captulo 6
Procedimientos y Funciones
Un procedimiento es un subprograma que puede interactuar con los datos y simplifica
los programas extensos. Su sintaxis es:
Procedure nombre procedimiento(variables de entrada);
Una funci
on es un procedimiento que puede devolver un valor (solo una variable). Su sintaxis es:
Function nombre funcion(variables de entrada): variable salida;
Las variables que se definen dentro de un procedimiento o funcion son llamadas variables locales, mientras que las variables definidas en el programa principal son llamadas
variables globales.
53
E. Kenny Venegas P.
n:=strtoint(inputbox(,Ingrese un n
umero natural
menor que 20,));
showmessage(El factorial de +inttostr(n)+ es
+inttostr(fact(n)));
End.
Ejemplo 6.2 Programa que lee los elementos de un arreglo y luego los muestra:
Program leer_imprimir;
Uses SysUtils, Dialogs;
Type vector = array of real;
Var A:vector; n:integer;
Procedure leer(var A:vector; var n:integer);
var i:integer;
begin
n:=strtoint(inputbox(,Ingrese la dimensi
on del vector A:,));
Setlength(A,n);
for i:=1 to n do
A[i]:=strtofloat(inputbox(A[+inttostr(i)+],Ingrese,));
end;
Procedure imprimir(var A:vector; var n:integer);
var s:string; i:integer;
begin
s:=El vector ingresado es+#13;
for i:=1 to n do
s:=s+floattostr(A[i])+#9;
showmessage(s);
end;
Begin // Inicio del programa principal
leer(A,n); imprimir(A,n);
End.
Ejemplo 6.3 Programa que eval
ua un polinomio cuyos coeficientes est
an en una arreglo:
Program val_polinomio;
Uses SysUtils,Dialogs;
Type polinomio = array of real;
Var i,n:integer; x:real;
P:polinomio; S:string;
Function val(var P:polinomio; var x:real): real;
Var i:integer; v,fx:real;
54
6.1.
Par
ametros por valor y referencia
Un par
ametro de entrada es el valor de una variable de entrada de un procedimiento
o funcion y se pueden dividir en:
Par
ametros de entrada por valor, si solo adquiere el valor del parametro ingresado
en el programa principal.
Par
ametros de entrada por referencia, si es permitida la modificacion del parametro
ingresado en el programa principal.
Cuando los par
ametros de entrada son por valor no es necesario colocar var antes de las
variables de entrada, mientras que si son parametros de referencia debemos incluir var
antes de las variables de entrada.
55
E. Kenny Venegas P.
Program factorial_recursivo;
Uses SysUtils,Dialogs;
Var n:integer;
Function fact(n:integer): integer;
// colocar y quitar "var" (ver cambios)
Var f:integer;
begin
f:=n;
if (n>1) then
begin
n:=n-1;
f:=f*fact(n);
end;
fact:=f; // fact:=n;
end;
Begin // Inicio del programa principal
n:=strtoint(inputbox(,Ingrese un n
umero natural
menor que 20,));
showmessage(El factorial de + inttostr(n) +
es +inttostr(fact(n)));
End.
Ejemplo 6.5 Programa que dice si un n
umero es primo o no (mencionando quien lo
divide).
Program primos;
Uses SysUtils,Dialogs;
Type v2=array[1..2] of integer;
var n:integer; p:v2;
Function primo(n:integer):v2; // par
ametro de entrada por valor
var i,k:integer; r:real;
begin
r:=sqrt(n);
i:=1; k:=0;
while (i<r) and (k=0) do
begin
i:=i+1;
if (n mod i = 0) then
k:=1;
end;
primo[1]:=k; primo[2]:=i;
56
6.2.
Ejercicios propuestos
6.3.
T
ecnicas de ordenaci
on
57
E. Kenny Venegas P.
Dados n n
umeros reales: x1 , x2 , x3 , . . . , xn colocarlos en orden creciente.
Veremos algunas tecnicas de ordenacion como los metodos de seleccion, insercion y burbuja.
6.3.1.
Selecci
on
Algoritmo Ordenaci
on por selecci
on
Variables
i,j,n,m : enteros
x : arreglo de reales
Inicio
Leer x
n = tama~
no de x
Desde i = 1 hasta i = n-1 hacer
m = i
Desde j = i+1 hasta j = n hacer
Si x[j] < x[m] entonces m = j
Fin_desde
Intercambiar x[i] por x[m]
Fin_desde
Mostrar x
Fin
Implementaci
on del metodo de ordenacion por seleccion:
Program ordenacion_seleccion;
Uses SysUtils,Dialogs;
Type vector=array[1..20] of real;
var A:vector; n:integer; cad:string;
Procedure leer(var A:vector; var n:integer);
var i:integer;
begin
n:=strtoint(inputbox(,Ingrese la dimensi
on del vector A:,));
for i:=1 to n do
A[i]:=strtofloat(inputbox(A[+inttostr(i)+],Ingrese,));
end;
Procedure intercambiar(var a,b:real);
var temp:real;
begin
temp:=a;
58
6.3.2.
Inserci
on
59
E. Kenny Venegas P.
j = 1
mientras x[j-1] > v hacer
x[j] = x[j-1]
x[j] = v
fin_mientras
fin_desde
Mostrar x
Fin
Veamos la implementaci
on del metodo de insercion (con inser como un procedimiento
o funcion).
Program ordenacion_insercion;
Uses SysUtils,Dialogs;
Type vector=array[1..20] of real;
var A,B:vector; n:integer; cad:string;
Procedure leer(var A:vector; n:integer);
var i:integer;
begin
for i:=1 to n do
A[i]:=strtofloat(inputbox(A[+inttostr(i)+],Ingrese,));
end;
Function s(A:vector; n:integer):string;
var cad:string; i:integer;
begin
for i:=1 to n do
cad:=cad+floattostr(A[i])+#9;
s:=cad+#13;
end;
Procedure inser(var A:vector; n:integer);
// Function inser(A:vector; n:integer):vector;
var i,j:integer; v:real;
begin
for i:=2 to n do
begin
v:=A[i]; j:=i;
while (j>1) and (A[j-1]>v) do
begin
A[j]:=A[j-1];
j:=j-1;
60
6.3.3.
Burbuja
Algoritmo Ordenaci
on burbuja
Variables
i,j,n,m : enteros
x : arreglo de reales
Inicio
Leer x
n = tama~
no de x
Desde i = n hasta i = 2 hacer
Desde j = 1 hasta j = i-1 hacer
Si x[j] > x[i+1]
intercambiar x[j] por x[j+1]
Fin_si
Fin_desde
Fin_desde
Mostrar x
Fin
Ejercicio: Implementar el algoritmo anterior.
6.4.
Ejercicios propuestos
1. Modifique los algoritmos de seleccion, insercion y burbuja para que ordenen alfabeticamente un arreglo de cadenas. (Obs. En Delphi es permitida la comparacion
de cadenas.)
61
E. Kenny Venegas P.
2. Elabore un programa que cuente el n
umero de intercambios realizados al ordenar un
arreglo haciendo uso de
a) Metodo de Selecci
on.
b) Metodo de Inserci
on.
c) Metodo de la Burbuja.
3. Modifique los algoritmos de seleccion, insercion y burbuja para que muestren como
se va ordenando el arreglo original paso por paso.
4. Implemente el siguiente algoritmo, el cual es el metodo de ordenacion mergesort(x, n):
Si n < 2 retornar
m = n div 2
l = x[1..m]
r = x[m + 1..n]
mergesort(l, m)
mergesort(r, n m)
i=1
j=1
para k = 1, . . . , n
si li < rj entonces
xk = li ; i = i + 1
sino
xk = rj ; j = j + 1
5. Implemente el siguiente algoritmo, el cual es el metodo de ordenacion quicksort(r, s)
Si s < r retornar
v = xr
i=r
j =s+1
repetir
repetir i = i + 1 hasta que xi v
repetir j = j + 1 hasta que xi < v
cambiar xi con xj
hasta j < i
cambiar xi con xj
cambiar xi con xs
quicksort(r, i 1)
quicksort(i + 1, s)
62
Captulo 7
Registros
Los registros son la generalizaci
on de los arreglos, as como los arrays son las generalizaciones de las cadenas. Un registro es un arreglo unidimensional, en donde cada elemento
de ese arreglo puede ser cualquier tipo de variable, inclusive un arreglo. Cada elemento de
un arreglo se denominar
a campo.
7.1.
Declaraci
on de registros
Un registro se puede definir dentro de Type o como una variable (dentro de Var), con
la diferencia de que en Type se colocara = Record y dentro de Var ira : Record.
Veamos algunos ejemplos:
Ejemplo 7.1 A continuaci
on definiremos el registro Amigo dentro como una variable
y con tres campos (Nombre, Edad y Telef ):
Program registro_amigo;
Uses SysUtils, Dialogs;
Var Amigo : Record
Nombre : String;
Edad
: Byte;
Telef : Integer;
End;
Begin
Amigo.Nombre := Luis Salazar;
Amigo.Edad
:= 20;
Amigo.Telef := 3456789;
Showmessage(amigo.nombre+ tiene +inttostr(amigo.edad));
Showmessage(y su n
umero telef
onico es +inttostr(amigo.telef));
End.
Ejemplo 7.2 El siguiente programa dir
a si aprob
o o desaprob
o un alumno en el curso
indicado.
63
E. Kenny Venegas P.
Program registro_alumno;
Uses SysUtils, Dialogs;
Type
// Observe que aqu
se define el registro "Alumno" dentro del Type.
Alumno = Record
Nombre : String;
Curso : String;
Nota
: Byte;
End;
Var
Alm:Alumno; cad:string;
Begin
Alm.Nombre := inputbox(,Ingrese el nombre del alumno:,);
Alm.Curso := inputbox(,Ingrese el curso que lleva,);
Alm.Nota
:= strtoint(inputbox(,Ingrese el promedio:,));
if (Alm.Nota < 10) then
cad := desaprobar
a
else
cad := aprobar
a ;
showmessage(alm.nombre+cad+alm.curso+ con +inttostr(alm.nota));
End.
Ejemplo 7.3 El siguiente programa muestra datos acerca de los Egresados de la Facultad
de Ciencias:
Program registros_egresados;
Uses SysUtils, dialogs;
Type Alumnos = Record
Nombre
: String;
Especialidad : String; // N1,N2,N3
o N5
Ponderado
: Byte;
End;
Promocion = Array [1..100] of Alumnos;
vector = Array [1..100] of byte;
Var
promo: promocion; cad: string; op:char;
N1,N2,N3,N5:vector; i,j1,j2,j3,j5,n: integer;
Function print(var Alm:Alumnos):string;
begin
print := #13 + alm.nombre + #9 + alm.especialidad + #9
+ inttostr(alm.Ponderado);
end;
Begin
64
7.1. Declaraci
on de registros
n:=strtoint(inputbox(,N
umero de egresados de la Facultad
de Ciencias:,));
j1:=0; j2:=0; j3:=0; j5:=0;
for i:=1 to n do
begin
promo[i].nombre := inputbox(,Ingrese el nombre completo
del alumno:,);
promo[i].especialidad := inputbox(,Ingrese el c
odigo de
la especialidad:,);
promo[i].ponderado := strtoint(inputbox(,Ingrese el
promedio ponderado:,));
cad:=promo[i].especialidad; op:=cad[2];
case op of
1: begin
j1:=j1+1; N1[j1]:=i;
end;
2: begin
j2:=j2+1; N2[j2]:=i;
end;
3: begin
j3:=j3+1; N3[j3]:=i;
end;
5: begin
j5:=j5+1; N5[j5]:=i;
end;
else showmessage(Ingrese un c
odigo de especialidad
perteneciente a Ciencias);
end;
end;
showmessage(Hay +inttostr(j1)+ egresados de la Especialidad
de F
sica.+#13+ Hay +inttostr(j2)+ egresados de
la Especialidad de Matem
atica.+#13+ Hay +inttostr(j3)+
egresados de la Especialidad de Qu
mica.+#13+
Hay +inttostr(j5)+ egresados de la Especialidad de
Ing. F
sica.);
cad := Los alumnos egresados agrupados por especialidad son
+ #13 + #13 + Apellidos y Nombres + #9 + Esp + #9 +
Ponderado + #13;
for i:= 1 to j1 do
cad := cad + print(promo[N1[i]]);
for i:= 1 to j2 do
cad := cad + print(promo[N2[i]]);
for i:= 1 to j3 do
cad := cad + print(promo[N3[i]]);
65
E. Kenny Venegas P.
for i:= 1 to j5 do
cad := cad + print(promo[N5[i]]);
showmessage(cad)
End.
7.2.
Ejercicios propuestos
66
Bibliografa
[1] CANTO, Marco. La Biblia del Delphi
[2] CHARTE, Francisco. Programacion con Delphi, 1996.
[3] LLACUA PERA, Javier Ita. Programando con Objetos en Pascal.
[4] LUCCHESI, Cl
audio et al. Aspectos Teoricos da Computacao, 1979.
[5] MELCHOR ESPINOZA, Victor. Aprenda a Programar con Deplhi, 2004.
[6] PERRY, Greg. Aprendiendo Principios de Programacion en 24 horas, 1999.
67