Sei sulla pagina 1di 71

UNIVERSIDAD NACIONAL DE INGENIER

IA
FACULTAD DE CIENCIAS
Escuela Profesional de Matematica
El Lenguaje de Programaci on Delphi
Apuntes de clase
Realizado por:
Edgard Kenny Venegas Palacios
Lima - Per u
2009

Indice general
1. Algoritmos y Programacion Estructurada 1
1.1. Concepto y caractersticas de un algoritmo . . . . . . . . . . . . . . . . . . 1
1.1.1. Propiedades de los algoritmos . . . . . . . . . . . . . . . . . . . . . . 2
1.1.2. Caractersticas de los algoritmos . . . . . . . . . . . . . . . . . . . . 2
1.2. Representacion de un algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.1. Implementacion y analisis de los algoritmos . . . . . . . . . . . . . . 3
1.3. Entradas y salidas de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2. Partes de un programa 7
2.1. Variables y constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.1. Identicadores validos . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2. Tipos de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.1. Tipos de datos numericos . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3. Declaracion de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3.1. Asignacion de valores en el cuerpo del programa . . . . . . . . . . . 9
2.3.2. Ingreso de datos por el usuario . . . . . . . . . . . . . . . . . . . . . 11
2.4. Tipos de operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.4.1. Operadores aritmeticos . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.4.2. Operadores logicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.5. Funciones matematicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.6. Los operadores div y mod . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.7. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3. Estructuras de control 19
3.1. Estructuras selectivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.1.1. Sentencia IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2. Estructuras selectivas de m ultiples alternativas . . . . . . . . . . . . . . . . 23
3.2.1. El Enunciado IF Anidado . . . . . . . . . . . . . . . . . . . . . . . . 23
3.2.2. La Sentencia Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.3. Estructuras repetitivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.3.1. La Sentencia FOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.3.2. La sentencia while . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
i
3.3.3. La Sentencia REPEAT . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.4. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4. Cadenas. Entrada y salida de informacion 35
4.1. Cadenas y caracteres (String y Char) . . . . . . . . . . . . . . . . . . . . . . 35
4.1.1. Longitud de una cadena . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.1.2. Concatenacion de cadenas . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2. Conversion de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.1. Conversion de cadena a n umero . . . . . . . . . . . . . . . . . . . . . 36
4.2.2. Inputbox y Showmessage . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2.3. Ejercicios Resueltos . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.3. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5. Vectores y Matrices 43
5.1. Arreglos Estaticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.1.1. Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.1.2. Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2. Arreglos Dinamicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.3. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6. Procedimientos y Funciones 53
6.1. Parametros por valor y referencia . . . . . . . . . . . . . . . . . . . . . . . . 55
6.2. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.3. Tecnicas de ordenacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.3.1. Seleccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.3.2. Insercion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.3.3. Burbuja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.4. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7. Registros 63
7.1. Declaracion 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 instruc-
ciones equivale a millares de codigo de maquina.
Delphi esta basado en el lenguaje Pascal, cuyas capacidades fueron extendidas para con-
vertirlo en un lenguaje orientado a objetos; que en la actualidad es la metodologa de
programacion mas difundida y utilizada.
El objetivo de de este manual es mostrar las caractersticas y estructura de un algoritmo
para la solucion 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 codicado, como es en este caso el lenguajes visual
Delphi.
0
Captulo 1
Algoritmos y Programaci on
Estructurada
En matematicas, ciencias de la computacion y disciplinas relacionadas, un algoritmo
es una lista bien denida, ordenada y nita de operaciones que permite hallar la solucion
a un problema. Dado un estado inicial y una entrada, a traves de pasos sucesivos y bien
denidos se llega a un estado nal, obteniendo una solucion.
En la vida cotidiana se emplean algoritmos en multitud de ocasiones para resolver diver-
sos 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 instruc-
ciones 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 metodo 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 mecanicamente problemas matematicos o de otro tipo.
1.1. Concepto y caractersticas de un algoritmo
El concepto de algoritmo, aunque similar y obviamente relacionado, no debe con-
fundirse con el concepto de programa. Mientras el primero es la especicacion de un
conjunto de pasos (operaciones, instrucciones, ordenes, etc.) orientados a la resolucion de
un problema (metodo), el segundo es ese conjunto de operaciones especicadas en un de-
terminado lenguaje de programacion 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 cir-
cuito electrico, en un aparato mecanico, usando papel y lapiz, o en alg un otro modelo de
computacion.
1
E. Kenny Venegas P.
1.1.1. Propiedades de los algoritmos
El cientco de computacion Donald Knuth ofrecio una lista de cinco propiedades, que son
ampliamente aceptadas como requisitos para un algoritmo:
1. Caracter nito. Un algoritmo siempre debe terminar despues de un n umero nito
de pasos.
2. Precision. Cada paso debe estar precisamente denido; las operaciones a llevar a
cabo deben ser especicadas 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
especca con las entradas.
5. Ecacia. Todas las operaciones a realizar en un algoritmo deben ser de tal modo que
puedan ser hechas de manera exacta y en un tiempo nito por un hombre usando
lapiz y papel.
1.1.2. Caractersticas de los algoritmos
A continuacion mencionamos las caractersticas de los algoritmos:
Finitos: Debe acabar en alg un momento.
Ecientes: 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.
Modicables: Estaran dise nados de modo que sus posteriores modicaciones sean
faciles de realizar, incluso por programadores diferentes a sus propios autores.
Modulares: La losofa utilizada para su dise no debe favorecer la division del pro-
blema en modulos peque nos.
1.2. Representaci on de un algoritmo
Un algoritmo puede representarse mediante un pseudocodigo o un diagrama de u-
jo. El usar pseudocodigo y diagramas de ujo evita muchas ambig uedades del lenguaje
natural. Dichas expresiones son formas mas estructuradas para representar algoritmos; no
obstante, se mantienen independientes de un lenguaje de programacion especco.
Los diagramas de ujo son descripciones gracas de algoritmos; usan smbolos conec-
tados con echas para indicar la secuencia de instrucciones y estan regidos por ISO.
2
1.2. Representacion de un algoritmo
Los diagramas de ujo son usados para representar algoritmos peque nos, ya que abarcan
mucho espacio y su construccion es laboriosa. Por su facilidad de lectura son usados co-
mo introduccion a los algoritmos, descripcion de un lenguaje y descripcion de procesos a
personas ajenas a la computacion.
A continuacion describimos los smbolos usados en los diagramas de ujo:
Un pseudocodigo es la descripcion de un algoritmo que asemeja a un lenguaje de progra-
macion pero con algunas convenciones del lenguaje natural. Tiene varias ventajas con re-
specto a los diagramas de ujo, 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 descripcion de un algoritmo usualmente se hace en tres niveles:
1. Descripcion de alto nivel. Se establece el problema, se selecciona un modelo
matematico y se explica el algoritmo de manera verbal, posiblemente con ilustra-
ciones y omitiendo detalles.
2. Descripcion formal. Se usa pseudocodigo para describir la secuencia de pasos que
encuentran la solucion.
3. Implementacion. Se muestra el algoritmo expresado en un lenguaje de progra-
macion especco o alg un objeto capaz de llevar a cabo instrucciones.
La maquina de Turing es un modelo matematico, dise nado por Alan Turing, que formal-
iza el concepto de algoritmo. A este modelo se le reere comunmente como la descripcion
de mas bajo nivel por el hecho de que no utiliza ninguna expresion coloquial.
1.2.1. Implementaci on y analisis de los algoritmos
Muchos algoritmos son ideados para implementarse en un programa. Sin embargo, los al-
goritmos pueden ser implementados en otros medios, como una red neuronal, un circuito
electrico o un aparato mecanico. Algunos algoritmos inclusive se dise nan especialmente
para implementarse usando lapiz y papel. El algoritmo de multiplicacion tradicional, el
3
E. Kenny Venegas P.
algoritmo de Euclides, la criba de Eratostenes y muchas formas de resolver la raz cuadra-
da son solo algunos ejemplos.
Como medida de la eciencia 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 especiquen) la evolucion del gasto de
tiempo y memoria en funcion 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 programacion ni cualquier otra implementacion; por eso, en ese sentido,
comparte las caractersticas de las disciplinas matematicas. As, el analisis de los algo-
ritmos se centra en los principios basicos del algoritmo, no en los de la implementacion
particular. Una forma de plasmar (o algunas veces codicar) un algoritmo es escribirlo
en pseudocodigo o utilizar un lenguaje muy simple tal como lexico, cuyos codigos pueden
estar en el idioma del programador.
Todo pseudocodigo consta de 3 partes: nombre, cabecera y cuerpo.
Ejemplo 1.1
Nombre: Algoritmo para hacer un vaso de limonada
Cabecera: Materiales: Vaso, cuchara, jarra,cuchillo
Ingredientes: Limon , az ucar , agua
Cuerpo del algoritmo: Partir el limon en dos.
Exprimir el contenido del limon en el vaso.
Echar agua y az ucar en el vaso.
Mezclar.
La estructura del programa es la siguiente:
Program nombre del programa
Uses
declaracion de bibliotecas
Type
declaracion de arreglos y nuevos tipos de variables
Const
declaracion de constantes
Var
declaracion de variables

Cabecera
begin
.
.
.
end.

Cuerpo
4
1.3. Entradas y salidas de datos
Se debe colocar siempre un punto despues del end.
Todo algoritmo se representa en el siguiente diagrama, donde las echas de rojo se llaman
compiladores:
Programadores Algoritmo Programa Computadora

Espa nol Ingles Lenguaje Maquina Lenguaje Maquina
1.3. Entradas y salidas de datos
La salida de datos es la visualizacion de informacion en pantalla, para ello debemos
usa los comandos write (escribir) o writeln (escribir y dar salto de lnea).
Si se quiere mostrar en la pantalla de texto, este se debe escribir entre apostrofes.
Ejemplo 1.2 write(Hola, Mundo);
Lo que hace escribir el texto Hola, Mundo en la pantalla del computador, es decir se
visualizara
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 comprension de los comandos denidos anteriormente debemos introducir
el concepto de variables.
5
E. Kenny Venegas P.
1.4. Ejercicios propuestos
1. Detecte los errores del siguiente programa:
program correcto;
var a,b,c: real;
d,e: entero;
begin
write(ingrese a;
read(a);
b=a+1;
c=c-1;
for i=1 to a do
begin
d:=b*c; e:=b/c;
b:=b+a; c:=c-a;
end;
write(resultado= d-e);
end
2. Realice la representacion graca del programa anterior.
6
Captulo 2
Partes de un programa
2.1. Variables y constantes
Cuando se procesa informacion o datos, un programa para computadora generalmente
mantiene valores para varias cantidades, a estas cantidades se les puede hacer referencia
por nombres y son conocidos como variables. El valor de una variable puede alterarse
durante la ejecucion del programa.
Una constante es una variable, con la diferencia de que su valor no se altera.
Una variable va a tener dos propiedades (o partes):
Un Nombre (Al que llamaremos identicador).
Un Tipo (El tipo de variable puede ser entero, real, texto, etc.).
2.1.1. Identicadores validos
Los identicadores 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 caracter debe ser una letra o subrayado.
No puede contener espacios en blanco ni vocales tildadas, ni n o

N.
No debe ser ninguna palabra reservada.
Las palabras reservadas son aquellas palabras que ya tienen una funcion declarada, por
ejemplo: char, var, if, for, etc . . .
Ejemplo 2.1
Jose (correcto).
7
E. Kenny Venegas P.
123abc (incorrecto).
raiz 23 (correcto).
byte (incorrecto).
Un identicador no es sensible a las may usculas, por ejemplo, un identicador cono Min-
Max puede escribirse de cualquiera de las siguientes maneras:
Minmax
minMax
minmax
MINMAX
MiNmAx
Al declarar una variable, tras el identicador que servira como nombre, indicaremos el
tipo de dato que podremos almacenar en ella.
2.2. Tipos de variables
Delphi tiene denido 5 tipos de variables los cuales mencionamos a continuacion:
1. Integer: Almacena n umeros enteros.
2. Real: Almacena n umeros reales (con decimales).
3. Char: Almacena un caracter cualquiera del codigo ASCII.
4. String: Almacena uno o mas caracteres (texto).
5. Boolean: Almacena el valor de TRUE o FALSE (V o F).
2.2.1. Tipos de datos numericos
Tipo Rango de valores Ocupacion
ShortInt -128 a 127 8 bits
Byte 0 a 255 8 bits
SmallInt -32768 a 32767 16 bits
Word 0 a 65535 16 bits
Integer -2147483648 a 2147483647 32 bits
Single 1.2e-38 a 3.4e38 32 bits
Real 2.2e-308 a 1.8e308 64 bits
8
2.3. Declaracion de variables
2.3. Declaraci on de variables
Sintaxis
Var < Identicador > : < Tipo de variable > ;
Ejemplo 2.2
cad : string;
Raiz 12 : real;
Edad : integer;
Opcion : char;
2.3.1. Asignacion 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.
9
E. Kenny Venegas P.
Podemos colocar mas de un identicador en la asignacion del tipo de variables si los
separamos por comas (,) como en el ejemplo anterior al denir 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 sera:
a =
5False
Ejemplo 2.5
10
2.3. Declaracion 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 sera:
a = 3
Ahora a = 5
Cuando queremos dar un salto de lnea simplemente, como en el ejemplo anterior, es-
cribiremos en el programa writeln.
2.3.2. Ingreso de datos por el usuario
Para el ingreso de datos (por teclado) utilizaremos el comando readln y a continuacion
escribimos el nombre de la variable entre parentesis. Es decir:
Sintaxis
Readln ( < Nombre de la variable a ser leda > ) ;
Ejemplo 2.6
program Prueba3;
var
a: integer;
begin
Writeln (Ingrese un entero);
11
E. Kenny Venegas P.
Readln (a);
Write ( a = );
Write (a);
Readln;
end.
Primero la pantalla de salida sera:
Ingrese un entero:
Supongamos que ingresamos 3 como el valor de a, luego se visualizara:
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 sera:
Escriba su nombre:
12
2.4. Tipos de operadores
Supongamos que ingresamos Jorge como el valor de nombre. Luego se visualizara:
Escriba su nombre: Jorge
Escriba su edad:
Supongamos que ingresamos 20 como el valor de edad. Finalmente la salida sera:
Escriba su nombre: Jorge
Escriba su edad: 20
Su nombre es Jorge y su edad es 20
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 aritmeticos
+ : suma
- : resta
* : producto
/ : division
2.4.2. Operadores logicos
And ( y )
Or ( o )
Not ( negacion )
Xor ( o exclusivo )
Ejemplo 2.8
( 4 < 5 ) and ( 3 >= 2 ) True
( -1 < > 1 ) or ( 3 < 2 ) True
Not ( 4 < 5 ) False
( 1 > = 0 ) xor ( 1 < 0 ) True
Tambien podemos mas de dos operadores logicos, por ejemplo:
( ( 1 < > 0 ) or ( 1 > 2 ) ) and ( 4 < 3 ) False
Not ( ( 1 > = 2 ) and ( 0 < = -1) ) True
13
E. Kenny Venegas P.
2.5. Funciones matematicas
Delphi tiene implementada las siguientes funciones matematicas:
Sin : Seno
Cos : Coseno
Tan : Tangente
Exp : Exponencial
Sqr : Al cuadrado
Sqrt : Raz cuadrada
Ln : Logaritmo neperiano
Abs : Valor absoluto
ArcTan : Arco tangente
ArcSin : Arco seno
ArcCos : Arco coseno
Sinh : Seno hiperbolico
Cosh : Coseno hiperbolico
Sintaxis
< funcion > ( < variable > ) ;
< funcion > ( < 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 := 2;
b := sqr(a) ;
c := -3.5;
d := abs(c) ;
14
2.5. Funciones matematicas
end.
Para obtener, debemos escribir en el programa:
sqrt ( sqr(b) - 4*a*c )
Para obtener x
y
, debemos escribir en el programa:
exp ( ln (x)*y )
Para

3+1
2
, debemos escribir en el programa:
( sqrt(3) +1 ) / 2
Ejemplo 2.10
Escribir un programa en Delphi que calcule la suma y el producto de las races del poli-
nomio cuadratico: x
2

ax + lnb, 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 nal 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
Se aprecia que en la salida, ambos valores tienen 14 decimales y al nal E+0000 signica
que el n umero visualizado debe multiplicarse por 100000 = 1. En general, cuando se mues-
tra el valor de un n umero real, se vera en la pantalla aE + b o aE b, en consecuencia el
valor sera a 10
b
o a 10
b
respectivamente.
Para evitar la salida de los 14 decimales que tiene a podemos indicar en el programa el
n umero de decimales que tendra una variable real y tambien podemos dar espacios en
blanco antes de mostrar un valor. Para ello escribiremos:
< variable de tipo real > : n : m
En este caso el n umero de decimales sera m. Supongamos que el n umero de dgitos en la
salida es d, entonces el n umero de espacios en blanco que se dara antes de imprimir el
valor sera n d, si n d < 0 entonces no se dara espacios en blanco. Apliquemos esto en
el siguiente ejemplo:
Program Ejemplo2;
{$APPTYPE CONSOLE}
Begin
Writeln ( ln(3):4:2 );
Write ( sqrt(2):6:2 );
Readln
End.
En la pantalla se mostrara la salida:
1.10
1.41
En la segunda lnea se ha dado 2 espacios.
2.6. Los operadores div y mod
Hay otros operadores aritmeticos denidas en Delphi como div y mod, los cuales estan
denidos 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
2.6. Los operadores div y mod
<Variable de tipo entero> := <Variable de tipo entero> mod <Variable de tipo
entero>;
Ejemplos:
14 div 3 = 4
14 mod 3 = 2
5 mod -2 = 1
5 div -2 = -2
Ejemplos:
1. Dado n un entero positivo menor que 100, el cual es ingresado por el usuario, haga
un programa en Delphi que halle la suma de sus cifras:
Program SumaCifras;
{$APPTYPE CONSOLE}
Var : a,b,n : byte ;
Begin
Write ( Ingrese un entero positivo menor que 100: ) ;
Readln (n) ;
a:= n div 10 ;
b:= n mod 10 ;
Write ( la suma de cifras de , n : 2 ) ;
Write ( es , a+b ) ;
Readln;
End.
2. Elabore un programa que pida 4 n umeros: a, b, c y d, luego calcule el determinante
de y muestre el resultado.
Program Ejemplo2;
{$APPTYPE CONSOLE}
Var
a,b,c,d,det: real;
Begin
Writeln (Ingrese el valor de a, b , c y d en ese orden: );
Readln(a,b,c,d);
det:=a*d-b*c;
Write(El valor del determinante es ,det:6:3);
Readln
End.
Observacion:
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 ecuacion cuadratica
ax
2
+ bx + c = 0.
2. Haga un algoritmo que calcule la suma y producto de dos polinomios cuadraticos.
Para ello el programa debe pedir los coecientes de los terminos independientes,
lineales y cuadraticos de los polinomios y debe mostrar los coecientes de ambos
resultados.
18
Captulo 3
Estructuras de control
3.1. Estructuras selectivas
El compilador de un programa efect ua selecciones evaluando expresiones booleanas,
esto es, expresiones que tienen valores de verdadero o falso.
3.1.1. Sentencia IF
La sentencia If presenta dos formas: simple y doble.
A) Seleccion simple
If <expresion booleana> then
Begin
<sentencias> se ejecuta solo si la expresion booleana es verdadera.
End ;
B) Seleccion doble
If < expresion booleana > then
Begin
<sentencias 1>
End ELSE
Begin
<sentencias 2>
End;
Estructura If Simple (Si - entonces)
Esta compuesto unicamente de una condicion. La estructura si - entonces eval ua la
condicion y en tal caso:
19
E. Kenny Venegas P.
Si la condicion es verdadera, entonces ejecuta la accion Si (o acciones si son varias).
Si la condicion es falsa, entonces no se hace nada.
Ejemplo 3.1 Construir un algoritmo tal, que dado como dato la calicacion de un alumno
en un examen, escriba Aprobado en caso que esa calicacion fuese mayor o igual que
10.
Algoritmo Calificacion
Variables
cal: entero
Inicio
Leer (cal)
Si cal >= 10 entonces
Escribir ("Aprobado")
Fin_si
Fin
Estructura If Doble
Es una estructura logica 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
3.1. Estructuras selectivas
Ejemplo 3.2 Dado como dato la calicacion de un alumno en un examen, escriba .
a
probadosi
su calicacion es mayor que 10 y Reprobado.
en
caso contrario.
Algoritmo Calificacion
Inicio
Leer (cal)
Si cal > 10 entonces
Escribir ("aprobado")
Sino
Escribir ("reprobado")
Fin_si
Fin
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 nal 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 pseudocodigo que diga si un n umero real esta 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, esta en el intervalo [ -1 , 1 ])
Sino
Escribir (x, no esta 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
Begin
Writeln ( Ingrese dos numeros reales: ) ;
Readln (a,b) ;
If ( a > b ) then
Write (El numero mayor es , a:5:3)
Else
Write (El numero mayor es , b:5:3);
Readln
End.
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 solucion de problemas encontramos numerosos casos en los que luego de tomar
una decision y marcar el camino correspondiente a seguir, es necesario tomar otra de-
cision. 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 ademas 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 decision 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 ujo 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 ejecutara la accion 1, si toma el valor 2 ejecutara la accion 2, si
toma el valor N realizara la accion N.
Ejemplo 3.7 Dise nar un algoritmo tal que dados como datos dos variables de tipo entero,
obtenga el resultado de la siguiente funcion:
V al(Num.V ) =

100V, siNum = 1;
100
V
, siNum = 2;
100/V, siNum = 3;
0, en otro caso.
Veamos la representacion de tal algoritmo en un diagrama de ujo y en el diagrama NS.
24
3.2. Estructuras selectivas de m ultiples alternativas
Sintaxis:
Case <selector> of
Opcion 1 : sentencia 1;
Opcion 2 : sentencia 2;
Opcion 3 : sentencia 3;
.
.
Opcion n : sentencia n
Else
Sentencia n+1
End;
Observacion:
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 condi-
cion de control o variable, para determinar cuando debe detenerse la ejecucion. Hay tres
26
3.3. Estructuras repetitivas
tipos de lazos de control:
Sentencia For (Desde/Para).
Sentencia While (Mientras).
Sentencia Repeat (Repetir).
El conjunto de instrucciones que se ejecuta repetidamente cierto n umero de veces, se
llama Ciclo, Bucle o Lazo.
Una Iteracion es cada una de las diferentes pasadas o ejecuciones de todas las instrucciones
contenidas en el bucle.
Fases de un Programa Cclico:
1. Entrada de datos e instrucciones previas
2. Lazo o bucle
3. Instrucciones nales o resto del proceso
4. Salida de resultado
Contador
Un contador es una variable cuyo valor se incrementa o decrementa en una cantidad
constante cada vez que se produce un determinado suceso o accion. Los contadores se
utilizan con la nalidad de contar sucesos o acciones internas de un bucle; deben realizar
una operacion de inicializacion y posteriormente las sucesivas de incremento o decremento
del mismo. La inicializacion consiste en asignarle al contador un valor. Se situara antes y
fuera del bucle.
Representacion:
<nombre del contador><nombre del contador> + <valor constante>
Si en vez de incremento es decremento se coloca un menos en lugar del mas.
Ejemplo: i = i + 1
Acumulador
Es una variable que suma sobre s misma un conjunto de valores para de esta manera
tener la suma de todos ellos en una sola variable. La diferencia entre un contador y un
acumulador es que mientras el primero va aumentando de uno en uno, el acumulador va
aumentando en una cantidad variable. Representacion:
<Nombre del acumulador><nombre del acumulador> + <valor variable>
27
E. Kenny Venegas P.
3.3.1. La Sentencia FOR
Se usa frecuentemente cuando se conoce de antemano el n umero de veces que se eje-
cutaran las acciones de un bucle. Esta es una de sus caractersticas.
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
3.3. Estructuras repetitivas
Sintaxis:
INCREMENTOS:
For <contador>:=<val ini> to <val n> do
Begin
<sentencias>;
End;
DECREMENTOS:
For <contador>:=<val ini> downto <val n> do
Begin
<sentencias>;
End;
Ejemplo 3.11 Implementar el algoritmo anterior.
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
En esta estructura la condicion es evaluada antes de la primera ejecucion de sentencias,
de modo que si la condicion es falsa, la secuencia nunca es ejecutada. La ejecucion de estas
sentencias continua mientras la expresion booleana sea verdadera.
29
E. Kenny Venegas P.
Observe en el diagrama de ujo, 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 condicion, 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
3.3. Estructuras repetitivas
Sintaxis:
While ( expresion booleana ) do
Begin
Sentencia 1 ;
Sentencia 2 ;
.
Sentencia n ; // el ; es opcional
End ;
Ejemplo 3.13 Implementar el algoritmo anterior.
Program SumaMientras;
{$APPTYPE CONSOLE}
Var
suma,i: integer;
Begin
suma:=0;
i:=1;
while (i<=100) do
Begin
suma:= suma + sqr(i);
i:=i+1;
End;
Write(El valor de la suma es ,suma);
Readln
End.
3.3.3. La Sentencia REPEAT
Se llama Repetir a la estructura algortmica que se ejecuta un n umero denido de veces
hasta que la condicion se torna verdadera:
31
E. Kenny Venegas P.
Las reglas para la construccion 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 nal
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 podras observar que la condicion esta al reves, porque el bucle se repite
hasta que la condicion 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
3.3. Estructuras repetitivas
REPEAT
Sentencia 1 ;
Sentencia 2 ;
.
.
.
Sentencia n ;
Until (expresion booleana);
Observaciones:
No es necesario colocar Begin y End, pues Repeat y Until, marcan el inicio y el nal
del cuerpo del ciclo.
No es necesario colocar el punto y coma antes del Until.
Ejemplo 3.15 Implementar el algoritmo anterior.
Program SumaRepeat;
{$APPTYPE CONSOLE}
Var
suma,i: integer;
Begin
suma:=0;
i:=0;
Repeat
i:=i+1;
suma:=suma+sqr(i);
Until (i=100);
Write(El valor de la suma es ,suma);
Readln
End.
La estructura While y la estructura Repeat, se conocen como Iterativas. Se usan cuan-
do no se conoce con anticipacion el n umero de veces que se ejecutara la accion.
La diferencia entre ambas es que la condicion se sit ua al principio (Mientras) o al nal
(Repetir) de la secuencia de instrucciones. Entonces, en el primero, el bucle contin ua mien-
tras la condicion es verdadera (la cual se comprueba antes de ejecutar la accion) y en el
segundo, el bucle contin ua hasta que la condicion se hace verdadera (la condicion se com-
prueba despues de ejecutar la accion, es decir, se ejecutara al menos una vez).
La estructura Desde/Para suele utilizarse cuando se conoce con anterioridad el n umero
de veces que se ejecutara la accion y se le conoce como Estructura Repetitiva en lugar de
iterativa, para diferenciarla de las dos anteriores.
33
E. Kenny Venegas P.
3.4. Ejercicios propuestos
1. Haga un programa que dado x R eval ue la funcion
f(x) =

|x|/

1 x, x < 1
cos(x) ln(1 + x
2
), 1 x 5
tan(x
3
x
2
), x > 5
2. Elabore un programa que pida el ingreso de x R y determine si x dom(f), donde
f(x) =

sen(1 + x
2
)

125 x
3
.
3. Elabore un programa que pida el ingreso de n n umeros positivos y muestre su media
aritmetica, geometrica y armonica.
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
Cadenas. Entrada y salida de
informacion
4.1. Cadenas y caracteres (String y Char)
CARACTERES:
Una variable del tipo Char , almacena un caracter que puede ser ledo por el teclado.
Observacion:
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 biyeccion entre el conjunto de caracteres y el conjunto {1, 2, . . . , 255}, a tal
biyeccion se le conoce como codigo ASCII.
Por ejemplo: @ = ALT + 64 (solo en Windows).
Note que: <caracter asociado>=CHR (<n umero entero entre 1 y 255>)
<codigo ASCII asociado, variable de tipo entero>= (<Variable de tipo caracter>)
CADENAS Una cadena es una arreglo de caracteres.
Si A es una cadena : A = H O L A
Por ejemplo:
VAR A:= string
A:= HOLA
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. Longitud de una cadena
Se usara la funcion 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
Para concanetar (unir) dos cadenas , se usa el operador +.
(<Cadena concanetada>) =<cadena 1> + <cadena 2>
Por ejemplo, si A, B y C son variables del tipo String:
A:= Hola; B:= Como estas C:= A + B + ?; // Entonces el valor de C sera:
HolaComo estas? A:= ABC B:= XYZ C:= A + B C:= ABC XYZ // Ahora el valor
de C sera: ABC XYZ
4.2. Conversion de tipos
Lo que hemos estado trabajando hasta el momento es la entrada y salida de infor-
macion del modo consola. Para visualizar la informacion en ventanas debemos utilizar
una conversion 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. Conversion 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
Ejemplo 4.1 Program Prueba;
{$APPTYPE CONSOLE}
Uses SysUtils;
Var cad : string;
Num : integer;
Begin
Write ( Ingrese un entero );
Read ( cad );
Num := StrToInt ( cad );
Write ( Ud. Ha ingresado : + IntToStr( Num ) );
Readln
End.
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
1. Haga un programa que pida el ingreso de 3 n umeros enteros y calcule su promedio.
Program promedio;
Uses
SysUtils, Dialogs;
Var
n,m,p: integer;
37
E. Kenny Venegas P.
prom: real;
Begin
n:=StrToInt(InputBox(Lectura de numeros,
Ingrese el primer numero:,));
m:=StrToInt(InputBox(Lectura de numeros,
Ingrese el segundo numero:,));
p:=StrToInt(InputBox(Lectura de numeros,
Ingrese el tercer numero:,));
prom:=(n+m+p)/3;
ShowMessage(El promedio de los numeros 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 numero 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 verique 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 numero,));
r:=sqrt(n); i:=1; k:=0;
while (i<=r) and (k=0) do
begin
i:=i+1;
38
4.2. Conversion de tipos
if (n mod i = 0) then
k:=1;
end;
if (k=0) then
ShowMessage(IntToStr(n)+ si es un numero primo)
else
ShowMessage(IntToStr(n)+ no es un numero 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 numero,Ingrese el numero
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 vericando si el n umero esta ingresado en base 2 y uti-
lizando variables del tipo string.
Program change_of_base;
Uses
SysUtils,Dialogs;
Var
i,n:integer; m:real;
cad:string;
Begin
cad:=InputBox(Lectura del numero,Ingrese el numero
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 numero ingresado no esta 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. Conversion 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(Sucesion de Fibonacci,
Ingrese el numero de terminos,));
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 sucesion 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 numero entero:,));
v:=StrToFloat(InputBox(,Ingrese un numero 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 funcion sera+#13+FloatToStr(val))
End.
4.3. Ejercicios propuestos
1. Se dice que a es pariente de b si la suma de los dgitos de a
2
es igual a b y la suma
de los dgitos de b
2
es a. Ejemplo: 13 y 16. Realice un programa que determine si
dos n umeros a y b son parientes.
2. Elabore un programa que halle un n umero primo de forma abc tal que a < b < c.
En caso no exista tal n umero el programa debe devolver 0 como salida.
3. Haga un programa que indique si dos n umeros N y M estan formados por los mismos
dgitos. Ejemplos: 321 y 213, 45 y 554.
4. Realice un programa que dado N devuelva un n umero M formado por los dgitos de
N ordenados de menor a mayor. Ejemplo: si N = 7142 entonces M = 1247.
5. Realice un programa que devuelva la suma de todos los n umeros primos entre dos
n umeros N y M dados.
6. (Tercer Teorema de Fermat). El matematico frances Pierre Fermat enuncio en una
proposicion que no existen n umeros enteros x, y, z y n > 2 tales que x
n
+ y
n
= z
n
.
Elabore un programa que busque un contraejemplo de esta armacion para n umeros
entre 1 y 20 con n = 3 y n = 4.
42
Captulo 5
Vectores y Matrices
Para hacer uso de vectores o matrices, Delphi ha denido array, que en castellano
signica arreglo. Un array es un tipo de variable denida 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. Arreglos Estaticos
5.1.1. Vectores
Para denir un vector (arreglo unidimensional) lo declararemos en la cabecera de la
siguiente manera:
Type nombre vector=array[n..m] of tipo variable;
donde n y m son n umeros enteros y la longitud del arreglo sera nm+1, nombre vector
es el nombre del arreglo vectorial y tipo variable puede ser integer, real, char, etc.
Veamos algunos ejemplos:
Ejemplo 5.1 Program ejemplo;
Uses sysutils,dialogs;
Type vector=array[1..4] of integer;
Var A:vector;
Begin
A[1]:=2; A[2]:=3; A[3]:=5; A[4]:=7;
End.
Ejemplo 5.2 Program arreglo;
Uses SysUtils, Dialogs;
const max=20;
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 dimension 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; // Conversion 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 dimension 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; // Conversion 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(Sucesion de Fibonacci,
Ingrese el numero de terminos,));
A[1]:=1; S:=1;
if n>1 then
begin
A[2]:=1; S:=S+#9+1;
44
5.1. Arreglos Estaticos
for i:=3 to n do
begin
A[i]:=A[i-1]+A[i-2];
S:=S+#9+inttostr(A[i]);
end;
end;
showmessage(La sucesion de Fibonacci es+#13+S);
End.
Ejemplo 5.5 Program suma_vectores;
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 dimension del vector,));
S1:=El vector A es+#13;
S2:=El vector B es+#13;
for i:=1 to n do
begin
// Definiendo los vectores A y B
A[i]:=strtofloat(inputbox(Lectura del vector A,
Ingrese A[+inttostr(i)+],));
B[i]:=strtofloat(inputbox(Lectura del vector B,
Ingrese B[+inttostr(i)+],));
S1:=S1+floattostr(A[i])+#9;
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.1.2. Matrices
Para denir una matriz (arreglo bidimensional) lo declararemos en la cabecera de la
siguiente manera:
Type nombre matriz=array[1..n, 1..m] of tipo variable;
donde nombre matriz es el nombre del arreglo bidimensional, tipo variable puede ser
integer, real, char, etc. y n es el n umero maximo de las del arreglo y m el n umero maximo
de columnas.
Veamos algunos ejemplos:
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: Modicar 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, muestre-
las 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
5.1. Arreglos Estaticos
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,));
B[i,j]:=strtoint(inputbox(B[+inttostr(i)+,
+inttostr(j)+],Ingrese valor,));
S1:=S1+inttostr(A[i,j])+#9;
S2:=S2+inttostr(B[i,j])+#9;
S:=S+inttostr(A[i,j]+B[i,j])+#9;
end;
S1:=S1+#13; S2:=S2+#13; S:=S+#13;
end;
showmessage(S1+#13+#13+S2+#13+#13+La matriz A+B es+#13+S)
End.
Random es una funcion que devuelve un n umero real aleatorio entre 0 y 1. a + (b
a)random devuelve un n umero real aleatorio entre a y b.
Random(n) es una funcion que devuelve un n umero entero entre 0 y n1. Randomize
sirve para no obtener los mismos n umeros aleatorios (cambia de raiz).
Trunc(x) es una funcion que devuelve la parte entera del n umero real x.
Ejemplo 5.9 Haga un programa que construya aleatoriamente dos arreglos unidimen-
sionales: 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, ademas 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 dimension 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; // Tambien 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 Dinamicos
A diferencia de los arreglos estaticos, su tama no se dene en tiempo de ejecucion, es
decir al compilar el programa, usando la funcion setlength. La ventaja de usar arreglos
dinamicos es el ahorro de memoria.
Sintaxis:
Type
Arreglo_dinamico = array of Tipo_dato;
Var
Identificador = Arreglo_din amico;
Begin
...
setlength(Identificador,tama~no);
...
End.
Observacion: El ndice de los elementos de un arreglo dinamico empieza de cero.
Ejemplo 5.10 Program dinamico;
Uses SysUtils;
Type vector_d=array of integer;
Var A:vector_d;
Begin
setlength(A,4);
A[0]:=2; A[1]:=3; A[2]:=5; A[3]:=7;
End.
Ejemplo 5.11 Programa que genera aleatoriamente n n umeros reales de -10 a 10:
Program aleatorio_din;
Uses SysUtils,dialogs;
Type vector_d=array of real;
Var i,n:integer; A:vector_d; cad:string;
Begin
n:=strtoint(inputbox(,Ingrese un numero natural,));
cad:=Los primeros numeros reales son:+#13;
setlength(A,n); randomize;
48
5.2. Arreglos Dinamicos
for i:=0 to n-1 do
begin
A[i]:=(random(201)-100)/10; // -10+20*random;
cad:=cad+floattostr(A[i])+#9; // formatfloat(0.00,A[i])+#9;
end;
showmessage(cad)
End.
Ejemplo 5.12 Programa que genera aleatoriamente los n primeros n umeros naturales.
Program aleatorio_n;
Uses SysUtils,dialogs;
Type vector_d=array of integer;
Var i,n:integer; A:vector_d; cad:string;
Begin
n:=strtoint(inputbox(,Ingrese un numero natural,));
cad:=Los primeros +inttostr(n)+ numeros naturales son:+#13;
setlength(A,n); randomize;
for i:=0 to n-1 do
begin
repeat
A[i]:=random(n)+1;
until A[i]=i+1;
cad:=cad+inttostr(A[i])+#9;
end;
showmessage(cad)
End.
Ejemplo 5.13 Programa que genera aleatoriamente dos matrices y las suma.
Program sum_matriz_din;
Uses SysUtils,dialogs;
Type matriz=array of integer;
Var i,j,n,m:integer; A,B:matriz; S1,S2,S:string;
Begin
S1:=La matriz A es+#13;
S2:=La matriz B es+#13;
m:=strtoint(inputbox(,Ingrese el numero de
filas de las matrices,));
n:=strtoint(inputbox(,Ingrese el numero de
columnas de las matrices,));
setlength(A,m*n); setlength(B,m*n);
randomize;
for i:=0 to m-1 do
begin
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 deniendo un arreglo
dinamico 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 numero de filas,));
m:=strtoint(inputbox(,Ingrese el numero 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
5.3. Ejercicios propuestos
1. Haga un programa que pida el ingreso de n umeros y lo almacene en un arreglo y diga
c uantas veces se ha repetido el ingreso de los elementos, por ejemplo si el arreglo A
contiene los elementos A=[1 2 3 1 2 1], entonces el programa debera mostrar que 1
aparece tres veces, 2 aparece dos veces y 3 aparece una vez.
2. Un metodo sencillo para ordenar (digamos, ascendentemente) los elementos de un
arreglo A = A[1] A[2] . . . A[n] es el siguiente:
a) Iniciar i = 1.
b) Hallar el menor elemento de A[i] A[i + 1] . . . A[n].
c) Intercambiar el elemento hallado en el item (b) con el termino A[i].
d) Aumentar i en 1.
e) Si i > n terminar el programa, en caso contrario regresar al paso (b).
Elabore un programa que implemente este metodo de ordenacion. Por ejemplo, si el
arreglo es [0.3 1 -2 2.5 1.7] el programa debera devolver -2 0.3 1 1.7 2.5
3. Modique el ejercicio anterior para que no se visualizen los elementos mas de una
vez. Por ejemplo, si el arreglo es [1 -1 2 1 3 -1 2 3 2 1] el programa debera devolver
-1 1 2 3.
4. La moda de un conjunto de n umeros es aquel n umero que tiene la mayor frecuencia
entre todos, es decir, el que se repite mas. Elabore un programa que, dado un conjunto
de n n umeros (con n dado por el usuario) ingresados de forma ascendente, halle la
moda de ellos. (Obs. En caso haya dos n umeros candidatos a ser la moda, mostrar
el mayor de ellos.)
5. Dada una matriz A R
nn
, calcule la matriz escalonada reducida de A.
6. Genere aleatoriamente los elementos de una matriz y calcule:
a) La transpuesta
b) El mayor de sus elementos
c) El determinante
7. Dada una matriz A R
nn
, calcule su matriz adjunta y su inversa (si existe).
8. Resuelva el sistema de ecuaciones Ax = b, donde b es un arreglo unidimensional con
n elementos y A es un arreglo bidimensional nn (ambos generados aleatoriamente).
9. Dise ne un programa que construya una base ortonormal {u
1
, u
2
, . . . , u
n
} de R
n
a
partir de v
1
, v
2
, . . . , v
n
vectores L.I. de R
n
ingresados por el usuario.
Sugerencia: Proceso de Gram Schmidt. Primero ortogonalize haciendo
u
1
= v
1
, u
i+1
= v
i+1

i

j=1
v
j
, u
i

u
j
, u
j

u
j
, i = 1, . . . , n 1
51
E. Kenny Venegas P.
10. Elabore un programa que pida el ingreso de n pares ordenados (x
i
, y
i
), i = 1, . . . , n
y halle la ecuacion de la recta que minimice la suma de las distancias al cuadrado
de los puntos (x
i
, y
i
) a dicha recta.
52
Captulo 6
Procedimientos y Funciones
Un procedimiento es un subprograma que puede interactuar con los datos y simplica
los programas extensos. Su sintaxis es:
Procedure nombre procedimiento(variables de entrada);
Una funcion es un procedimiento que puede devolver un valor (solo una variable). Su sin-
taxis es:
Function nombre funcion(variables de entrada): variable salida;
Las variables que se denen dentro de un procedimiento o funcion son llamadas va-
riables locales, mientras que las variables denidas en el programa principal son llamadas
variables globales.
Ejemplo 6.1 Programa que calcula el factorial de un n umero ingresado por el usuario:
Program factorial;
Uses SysUtils,Dialogs;
Var n:integer;
Function fact(var n:integer): integer;
var i,f:integer;
begin
f:=1;
for i:=2 to n do
f:=f*i;
fact:=f;
end;
Begin // Inicio del programa principal
53
E. Kenny Venegas P.
n:=strtoint(inputbox(,Ingrese un numero 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 dimension 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 coecientes 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. Parametros por valor y referencia
begin
v:=P[0]; fx:=x;
for i:=1 to high(P) do
begin
v:=v+P[i]*fx;
fx:=fx*x;
end;
val:=v;
end;
Begin // Inicio del programa principal
n:=strtoint(inputbox(,Ingrese el grado del polinomio,));
Setlength(P,n+1);
P[0]:=strtofloat(inputbox(,Ingrese el termino independiente,));
S:=El polinomio P es:+#13+floattostr(P[0]);
for i:=1 to n do
begin
P[i]:=strtofloat(inputbox(,Ingrese el termino de orden
+inttostr(i),));
S:=S+++floattostr(P[i])+x^+inttostr(i);
end;
x:=strtofloat(inputbox(,Ingrese el numero real a evaluar,));
Showmessage(S+#13+#13+P(+floattostr(x)+) = +floattostr(val(P,x)));
End.
6.1. Parametros por valor y referencia
Un parametro de entrada es el valor de una variable de entrada de un procedimiento
o funcion y se pueden dividir en:
Parametros de entrada por valor, si solo adquiere el valor del parametro ingresado
en el programa principal.
Parametros de entrada por referencia, si es permitida la modicacion del parametro
ingresado en el programa principal.
Cuando los parametros 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.
Ejemplo 6.4 Programa que calcula el factorial de un n umero usando una funcion recur-
siva:
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 numero 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; // parametro 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
end;
Begin // Inicio del programa principal
n:=strtoint(inputbox(,Ingrese un numero natural,));
p:=primo(n);
if p[1]=0 then
showmessage(inttostr(n)+ si es primo)
else
showmessage(inttostr(n)+ no es primo, pues
+inttostr(p[2])+ lo divide)
End.
6.2. Ejercicios propuestos
1. Elabore un programa que calcule el maximo com un divisor de n n umeros ingresados
por el usuario. Sugerencia: Haga un subprograma que halle el MCD de dos n umeros
utilizando el algoritmo de Euclides.
2. Elabore un programa que calcule el mnimo com un m ultiplo de n n umeros ingresados
por el usuario. Sugerencia: Haga un subprograma que halle el MCM de dos n umeros
utilizando MCM(a, b) MCD(a, b) = a b.
3. En 1640 Fermat armo que F(n) = 2
2
n
+ 1 es primo n 0 (estos n umeros son
conocidos como los n umeros de Fermat). Haga un programa que calcule el menor
n umero de Fermat que no es primo.
4. Haga un programa que calcule el menor n umero de Mersenne (los cuales son de la
forma M(n) = 2
n
1) que no es primo.
5. Haga un programa que calcule el menor n umero primo p tal que p
#
+1 no sea primo,
donde p
#
es el producto de todos los primos menores o iguales a p. Ejemplos: 2
#
= 2
y 5
#
= 2 3 5 = 30.
6. Un entero impar n es un n umero de Carmichael si, y solo si, cada factor primo p de
n satisface las dos condiciones siguientes:
p
2
no divide a n.
p 1 divide a n 1.
Elabore un programa que diga si un n umero ingresado por el usuario es o no un
n umero de Carmichael.
6.3. Tecnicas de ordenacion
Denamos el problema de ordenacion:
57
E. Kenny Venegas P.
Dados n n umeros reales: x
1
, x
2
, x
3
, . . . , x
n
colocarlos en orden creciente.
Veremos algunas tecnicas de ordenacion como los metodos de seleccion, insercion y bur-
buja.
6.3.1. Selecci on
Algoritmo Ordenacion por seleccion
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
Implementacion 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 dimension 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. Tecnicas de ordenacion
a:=b;
b:=temp;
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;
Function selec(A:vector; n:integer):vector;
var i,j,m:integer;
begin
for i:=1 to n-1 do
begin
m:=i;
for j:=i+1 to n do
if (A[j]<A[m]) then
m:=j;
intercambiar(A[i],A[m]);
end;
selec:=A;
end;
Begin // Inicio del programa principal
leer(A,n);
cad:=El vector ingresado es+#13+s(A,n)+#13;
showmessage(cad+Ordenado por el metodo de seleccion es
+#13+s(selec(A,n),n));
End.
6.3.2. Insercion
Este algoritmo encuentra la posicion correcta para x
i
en el segmento x
1
, x
2
, . . . , x
i1
y
lo coloca all, es decir, lo inserta.
Algoritmo Ordenacion por Insercion
Variables
i,j,n : enteros v : real
x : arreglo de reales
Inicio
Desde i = 2 hasta i = n hacer
v = x[i]
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 implementacion 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.4. Ejercicios propuestos
end;
A[j]:=v;
end;
// incluir "inser:=A;" en el caso de utilizar "inser" como una funcion
end;
Begin // Inicio del programa principal
n:=strtoint(inputbox(,Ingrese la dimension del vector A:,));
leer(A,n);
cad:=El vector ingresado es+#13+s(A,n)+#13;
inser(A,n);
showmessage(cad+El vector ordenado por el metodo de insercion es
+#13+s(A,n));
// Incluir lo siguiente si se utiliza "inser" como funcion:
{showmessage(cad + El vector ordenado por el metodo de insercion es
+ #13 + s(inser(A,n),n));}
End.
6.3.3. Burbuja
Algoritmo Ordenacion 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. Modique los algoritmos de seleccion, insercion y burbuja para que ordenen al-
fabeticamente 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 Seleccion.
b) Metodo de Insercion.
c) Metodo de la Burbuja.
3. Modique 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 l
i
< r
j
entonces
x
k
= l
i
; i = i + 1
sino
x
k
= r
j
; j = j + 1
5. Implemente el siguiente algoritmo, el cual es el metodo de ordenacion quicksort(r, s)
Si s < r retornar
v = x
r
i = r
j = s + 1
repetir
repetir i = i + 1 hasta que x
i
v
repetir j = j + 1 hasta que x
i
< v
cambiar x
i
con x
j
hasta j < i
cambiar x
i
con x
j
cambiar x
i
con x
s
quicksort(r, i 1)
quicksort(i + 1, s)
62
Captulo 7
Registros
Los registros son la generalizacion de los arreglos, as como los arrays son las generali-
zaciones 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 denominara campo.
7.1. Declaraci on de registros
Un registro se puede denir 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 continuacion deniremos 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 numero telefonico es +inttostr(amigo.telef));
End.
Ejemplo 7.2 El siguiente programa dira si aprobo o desaprobo 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 := desaprobara
else
cad := aprobara ;
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. Declaracion de registros
n:=strtoint(inputbox(,Numero 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 codigo 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 codigo de especialidad
perteneciente a Ciencias);
end;
end;
showmessage(Hay +inttostr(j1)+ egresados de la Especialidad
de Fsica.+#13+ Hay +inttostr(j2)+ egresados de
la Especialidad de Matematica.+#13+ Hay +inttostr(j3)+
egresados de la Especialidad de Qumica.+#13+
Hay +inttostr(j5)+ egresados de la Especialidad de
Ing. Fsica.);
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
1. Haga una listado de alumnos del curso de Computacion y Algoritmos I (ingresados
por el usuario) que contenga los siguientes datos: Apellidos y nombres, Especialidad,
Codigo y Promedio nal. Muestre esta lista por orden de merito.
2. Elabore un programa que lea los siguientes datos acerca de una persona: nombre,
edad y sexo (indique solo H o M) y determine:
a) Las personas de sexo masculino (H)
b) Las personas mayores de 18 a nos
c) Las personas de sexo femenino entre 18 y 23 a nos
3. Dise ne un programa que pida al comprador de un auto las siguientes caractersticas:
Marca, A no y Color. Ademas debe mostrar el precio del vehculo a comprar, teniendo
en cuenta que solo se venden las marcas Tayet, Sumari, Macros y Futura, de los a nos
2000 al 2008, y sus precios base respecto al a no 2008 y en color blanco son: 12000,
15000, 18000 y 20000 dolares respectivamente. Si el comprador no quisiera un auto
del a no entonces se hara un descuento de $250 por cada a no que ha pasado. Si el
comprador quisiera el auto en color rojo o negro el precio se eleva en $100 y en otro
color se pagara $50 adicionales. El programa debera decir si se encuentra a la venta
un auto con las caractersticas ingresadas por el comprador.
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, Claudio et al. Aspectos Teoricos da Computa cao, 1979.
[5] MELCHOR ESPINOZA, Victor. Aprenda a Programar con Deplhi, 2004.
[6] PERRY, Greg. Aprendiendo Principios de Programacion en 24 horas, 1999.
67