Algoritmos
Algoritmos
Algoritmos
FACULTAD DE CIENCIAS
Escuela Profesional de Matemática
Realizado por:
Edgard Kenny Venegas Palacios
Lima - Perú
2009
Índice general
2. Partes de un programa 7
2.1. Variables y constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.1. Identificadores válidos . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2. Tipos de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.1. Tipos de datos numéricos . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3. Declaración de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3.1. Asignación 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 aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.4.2. Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.5. Funciones matemáticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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últiples 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
5. Vectores y Matrices 43
5.1. Arreglos Estáticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.1.1. Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.1.2. Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2. Arreglos Dinámicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.3. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6. Procedimientos y Funciones 53
6.1. Parámetros por valor y referencia . . . . . . . . . . . . . . . . . . . . . . . . 55
6.2. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.3. Técnicas de ordenación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.3.1. Selección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.3.2. Inserción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.3.3. Burbuja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.4. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7. Registros 63
7.1. Declaración de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
7.2. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Bibliografı́a 67
ii
Introducción
Delphi es uno de los lenguajes llamados de alto nivel, porque una sola de sus instruc-
ciones equivale a millares de código de máquina.
Delphi está basado en el lenguaje Pascal, cuyas capacidades fueron extendidas para con-
vertirlo en un lenguaje orientado a objetos; que en la actualidad es la metodologı́a de
programación más difundida y utilizada.
0
Capı́tulo 1
Algoritmos y Programación
Estructurada
1
E. Kenny Venegas P.
2. Precisión. 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 más entradas: cantidades que le son dadas antes
de que el algoritmo comience, o dinámicamente mientras el algoritmo corre.
4. Salida. Un algoritmo tiene una o más salidas: cantidades que tienen una relación
especı́fica 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
lápiz y papel.
Legibles: El texto que lo describe debe ser claro, tal que permita entenderlo y leerlo
fácilmente.
Modulares: La filosofı́a utilizada para su diseño debe favorecer la división del pro-
blema en módulos pequeños.
Los diagramas de flujo son descripciones gráficas de algoritmos; usan sı́mbolos conec-
tados con flechas para indicar la secuencia de instrucciones y están regidos por ISO.
2
1.2. Representación de un algoritmo
Los diagramas de flujo son usados para representar algoritmos pequeños, ya que abarcan
mucho espacio y su construcción es laboriosa. Por su facilidad de lectura son usados co-
mo introducción a los algoritmos, descripción de un lenguaje y descripción de procesos a
personas ajenas a la computación.
La máquina de Turing es un modelo matemático, diseñado por Alan Turing, que formal-
iza el concepto de algoritmo. A este modelo se le refiere comunmente como la “descripción
de más bajo nivel” por el hecho de que no utiliza ninguna expresión coloquial.
3
E. Kenny Venegas P.
Ejemplo 1.1
4
1.3. Entradas y salidas de datos
Todo algoritmo se representa en el siguiente diagrama, donde las flechas de rojo se llaman
compiladores:
Lo que hace escribir el texto “Hola, Mundo” en la pantalla del computador, es decir se
visualizará
Hola, Mundo
A diferencia del anterior, el cursor estará en la siguiente lı́nea, por lo tanto, la salida será la
siguiente:
Adios, Mundo
Para que el usuario pueda ingresar caracteres deberá utilizar el comando readln (leer).
Este comando también 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 ejecución
del programa.
Se debe colocar un punto y coma ( ; ) después 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.
5
E. Kenny Venegas P.
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
6
Capı́tulo 2
Partes de un programa
Un Tipo (El tipo de variable puede ser entero, real, texto, etc.).
Las palabras reservadas son aquellas palabras que ya tienen una función 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).
Minmax
minMax
minmax
MINMAX
MiNmAx
Al declarar una variable, tras el identificador que servirá como nombre, indicaremos el
tipo de dato que podremos almacenar en ella.
8
2.3. Declaración de variables
Ejemplo 2.2
cad : string;
Raiz 12 : real;
Edad : integer;
Opcion : char;
Donde “:=” es el operador de asignación. Cuando queremos asignar el valor de una variable
del tipo char o string, colocaremos el carácter o caracteres entre apóstrofes.
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; estarı́a mal ya que a debe ser entero.
No hay error si d:=’1’; pero si c:= ’11’; estarı́a mal ya que c debe ser un caracter.
9
E. Kenny Venegas P.
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.
a=
5False
Ejemplo 2.5
10
2.3. Declaración de variables
program Prueba2;
var
a : integer;
begin
a := 3;
Write (’a = ’);
Writeln( a );
Writeln;
a := 5;
Write (’Ahora a = ’);
Writeln ( a );
Readln;
end.
a=3
Ahora a = 5
Cuando queremos dar un salto de lı́nea simplemente, como en el ejemplo anterior, es-
cribiremos en el programa writeln.
Sintaxis
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.
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.
Escriba su nombre:
12
2.4. Tipos de operadores
En el ejemplo anterior utilizamos dos variables cuyos valores son ingresados por el usuario
y estos valores son mostrados acompañados de textos que se separan de las variables
mediante comas.
Ejemplo 2.8
13
E. Kenny Venegas P.
Sin : Seno
Cos : Coseno
Tan : Tangente
Exp : Exponencial
Sqr : Al cuadrado
Sqrt : Raı́z cuadrada
Ln : Logaritmo neperiano
Abs : Valor absoluto
ArcTan : Arco tangente
ArcSin : Arco seno
ArcCos : Arco coseno
Sinh : Seno hiperbólico
Cosh : Coseno hiperbólico
Sintaxis
Observaciones
Las funciones Abs y Sqr , respetan el tipo de variable, es decir, si la variable es real
(entera), el resultado también será 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 matemáticas
end.
exp ( ln (x)*y )
√
3+1
Para 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 raı́ces del poli-
√
nomio cuadrático: 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 raı́ces es ’,sqrt(a));
Writeln (’El valor del producto de las raı́ces es ’,ln(b));
Readln;
end.
15
E. Kenny Venegas P.
Se aprecia que en la salida, ambos valores tienen 14 decimales y al final E+0000 significa
que el número visualizado debe multiplicarse por 100000 = 1. En general, cuando se mues-
tra el valor de un número real, se verá en la pantalla aE + b ó aE − b, en consecuencia el
valor será a × 10b ó a × 10−b respectivamente.
Para evitar la salida de los 14 decimales que tiene a podemos indicar en el programa el
número de decimales que tendrá una variable real y también podemos dar espacios en
blanco antes de mostrar un valor. Para ello escribiremos:
< variable de tipo real > : n : m
En este caso el número de decimales será m. Supongamos que el número de dı́gitos en la
salida es d, entonces el número de espacios en blanco que se dará antes de imprimir el
valor será n − d, si n − d < 0 entonces no se dará 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.
1.10
En la pantalla se mostrará la salida: 1.41
16
2.6. Los operadores div y mod
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.
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.
Observación:
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.
ax2 + bx + c = 0.
18
Capı́tulo 3
Estructuras de control
3.1.1. Sentencia IF
La sentencia If presenta dos formas: simple y doble.
A) Selección simple
B) Selección doble
19
E. Kenny Venegas P.
Ejemplo 3.1 Construir un algoritmo tal, que dado como dato la calificación de un alumno
en un examen, escriba “Aprobado” en caso que esa calificación fuese mayor o igual que
10.
Algoritmo Calificación
Variables
cal: entero
Inicio
Leer (cal)
Si cal >= 10 entonces
Escribir ("Aprobado")
Fin_si
Fin
Estructura If Doble
Es una estructura lógica que permite controlar la ejecución de varias acciones y se
utilizan cuando se tienen dos opciones de acción, 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 calificación de un alumno en un examen, escriba .aprobado”si
su calificación 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.
Observaciones:
Ejemplo 3.4 Elabore un pseudocódigo que diga si un número real está 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á en el intervalo [ -1 , 1 ]’)
Sino
Escribir (x,’ no está en el intervalo [ -1 , 1 ]’)
Fin
Ejemplo 3.5 Haga un programa que pida el ingreso de 2 números y calcule el mayor de
ellos.
Program Mayor2;
{$APPTYPE CONSOLE }
Var
a,b: real;
22
3.2. Estructuras selectivas de múltiples 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.
Sintaxis:
Ejemplo 3.6 Elabore un programa que pida el ingreso de un número entero y diga si es
positivo, cero o negativo. En el caso que sea positivo diga además 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.
Ejemplo 3.7 Diseñar un algoritmo tal que dados como datos dos variables de tipo entero,
obtenga el resultado de la siguiente función:
100V, siN um = 1;
100V ,
siN um = 2;
V al(N um.V ) =
100/V, siN um = 3;
0, en otro caso.
24
3.2. Estructuras selectivas de múltiples alternativas
Sintaxis:
Case <selector> of
Opción 1 : sentencia 1;
Opción 2 : sentencia 2;
Opción 3 : sentencia 3;
.
.
Opción n : sentencia n
Else
Sentencia n+1
End;
Observación:
25
E. Kenny Venegas P.
Ejemplo 3.9 Elabore un programa que diga si el dı́a 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.
26
3.3. Estructuras repetitivas
2. Lazo o bucle
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 acción. Los contadores se
utilizan con la finalidad de contar sucesos o acciones internas de un bucle; deben realizar
una operación de inicialización y posteriormente las sucesivas de incremento o decremento
del mismo. La inicialización consiste en asignarle al contador un valor. Se situará antes y
fuera del bucle.
Representación:
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. Representación:
27
E. Kenny Venegas P.
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:
DECREMENTOS:
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.
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. También 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 condición, cuando
se cumple la condición, se sale del ciclo.
Ejemplo 3.12 Haga un algoritmo que calcule la suma de los cuadrados de los primeros
100 números enteros utilizando la estructura Mientras.
30
3.3. Estructuras repetitivas
Sintaxis:
While ( expresión 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.
31
E. Kenny Venegas P.
Las reglas para la construcción 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 condición ahora estará colocada al final
del bucle para que primero ejecutamos la instrucción y luego preguntamos si la condición
se cumple. Esto quiere decir, que en esta estructura el bucle se realizará por lo menos
una vez. También podrás observar que la condición está al revés, porque el bucle se repite
hasta que la condición se cumpla. En el bucle Mientras, la condición se evaluaba mientras
era cierta.
Ejemplo 3.14 Hacer un algoritmo que calcule la suma de los cuadrados de los primeros
100 números enteros utilizando la estructura Repeat.
Sintaxis:
32
3.3. Estructuras repetitivas
REPEAT
Sentencia 1 ;
Sentencia 2 ;
.
.
.
Sentencia n ;
Until (expresión booleana);
Observaciones:
No es necesario colocar Begin y End, pues Repeat y Until, marcan el inicio y el final
del cuerpo del ciclo.
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.
33
E. Kenny Venegas P.
5. Haga un programa que halle y muestre todos los números de la forma aabb, donde
a y b son dı́gitos distintos, tal que aabb sea un cuadrado perfecto.
34
Capı́tulo 4
Una variable del tipo Char , almacena un caracter que puede ser leı́do por el teclado.
Observación:
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ón entre el conjunto de caracteres y el conjunto {1, 2, . . . , 255}, a tal
biyección se le conoce como código ASCII.
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.
36
4.2. Conversión de tipos
string y viceversa.
cad:=Inputbox(<cad1>,<cad2>,<cad3>);
donde “cad1” es una cadena que se visualizará como tı́tulo 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.
Program promedio;
Uses
SysUtils, Dialogs;
Var
n,m,p: integer;
37
E. Kenny Venegas P.
prom: real;
Begin
n:=StrToInt(InputBox(’Lectura de números’,
’Ingrese el primer número:’,’’));
m:=StrToInt(InputBox(’Lectura de números’,
’Ingrese el segundo número:’,’’));
p:=StrToInt(InputBox(’Lectura de números’,
’Ingrese el tercer número:’,’’));
prom:=(n+m+p)/3;
ShowMessage(’El promedio de los números ingresados es
’+FloatToStr(prom));
{ ShowMessage(’El promedio de ’+IntToStr(n)+’, ’+IntToStr(m)+’ y
’+IntToStr(p)+’ es ’+FloatToStr(prom)); }
End.
Program factorial;
Uses
SysUtils,dialogs;
Var
i,n,f:integer;
Begin
repeat
n:=strtoint(inputbox(’’,’Ingrese un número 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.
Program primo;
Uses SysUtils,Dialogs;
Var n,i,k:integer; r:real;
Begin
n:=StrToInt(InputBox(’’,’Ingrese un número’,’’));
r:=sqrt(n); i:=1; k:=0;
while (i<=r) and (k=0) do
begin
i:=i+1;
38
4.2. Conversión de tipos
if (n mod i = 0) then
k:=1;
end;
if (k=0) then
ShowMessage(IntToStr(n)+’ si es un número primo’)
else
ShowMessage(IntToStr(n)+’ no es un número primo’)
End.
Program change_of_base;
Uses
SysUtils,Dialogs;
Var
n,m,p:integer;
cad:string;
Begin
cad:=InputBox(’Lectura del número’,’Ingrese el número
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.
Program change_of_base;
Uses
SysUtils,Dialogs;
Var
i,n:integer; m:real;
cad:string;
Begin
cad:=InputBox(’Lectura del número’,’Ingrese el número
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úmero ingresado no está en base 2’);
End.
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úmero ingresado por el
usuario.
Program div_propios;
Uses
SysUtils,Dialogs;
Var
i,n:integer;
cad:string;
40
4.2. Conversión 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.
Program Fibonnacci;
Uses SysUtils,dialogs;
Var i,a,b,temp,n:integer; S:string;
Begin
n:=strtoint(inputbox(’Sucesión de Fibonacci’,
’Ingrese el número de términos’,’’));
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ón de Fibonacci es’+#13+S);
End.
9. Diseñar un programa tal que dados como datos una variable de tipo entero y una
del tipo real, obtenga el resultado de la siguiente función:
Program ValCase;
Uses SysUtils,Dialogs;
Var
num: integer;
v,val: real;
Begin
num:=StrToInt(InputBox(’’,’Ingrese un número entero:’,’’));
v:=StrToFloat(InputBox(’’,’Ingrese un número 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ón será’+#13+FloatToStr(val))
End.
2. Elabore un programa que halle un número primo de forma abc tal que a < b < c.
En caso no exista tal número el programa debe devolver 0 como salida.
3. Haga un programa que indique si dos números N y M están formados por los mismos
dı́gitos. Ejemplos: 321 y 213, 45 y 554.
4. Realice un programa que dado N devuelva un número M formado por los dı́gitos 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úmeros primos entre dos
números N y M dados.
42
Capı́tulo 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.
donde n y m son números enteros y la longitud del arreglo serı́a n−m+1, “nombre vector”
es el nombre del arreglo vectorial y “tipo variable” puede ser integer, real, char, etc.
43
E. Kenny Venegas P.
44
5.1. Arreglos Estáticos
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 sucesión de Fibonacci es’+#13+S);
End.
5.1.2. Matrices
Para definir una matriz (arreglo bidimensional) lo declararemos en la cabecera de la
siguiente manera:
donde “nombre matriz” es el nombre del arreglo bidimensional, “tipo variable” puede ser
integer, real, char, etc. y n es el número máximo de filas del arreglo y m el número máximo
de columnas.
45
E. Kenny Venegas P.
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, muéstre-
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 Estáticos
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(n) es una función que devuelve un número entero entre 0 y n−1. Randomize
sirve para no obtener los mismos números aleatorios (cambia de raiz).
Trunc(x) es una función que devuelve la parte entera del número 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, además 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ón 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én 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.
Sintaxis:
Type
Arreglo_dinamico = array of Tipo_dato;
Var
Identificador = Arreglo_dinámico;
Begin
...
setlength(Identificador,tama~no);
...
End.
Ejemplo 5.11 Programa que genera aleatoriamente n números 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 número natural’,’’));
cad:=’Los primeros números reales son:’+#13;
setlength(A,n); randomize;
48
5.2. Arreglos Dinámicos
Ejemplo 5.12 Programa que genera aleatoriamente los n primeros números 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 número natural’,’’));
cad:=’Los primeros ’+inttostr(n)+’ números 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 número de
filas de las matrices’,’’));
n:=strtoint(inputbox(’’,’Ingrese el número 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.
Ejemplo 5.14 Programa que genera una matriz aleatoriamente definiendo un arreglo
dinámico 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úmero de filas’,’’));
m:=strtoint(inputbox(’’,’Ingrese el número 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
51
E. Kenny Venegas P.
52
Capı́tulo 6
Procedimientos y Funciones
Una función es un procedimiento que puede devolver un valor (sólo una variable). Su sin-
taxis es:
Las variables que se definen dentro de un procedimiento o función son llamadas va-
riables locales, mientras que las variables definidas en el programa principal son llamadas
variables globales.
Ejemplo 6.1 Programa que calcula el factorial de un número ingresado por el usuario:
Program factorial;
Uses SysUtils,Dialogs;
Var n:integer;
53
E. Kenny Venegas P.
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;
Ejemplo 6.3 Programa que evalúa un polinomio cuyos coeficientes están en una arreglo:
Program val_polinomio;
Uses SysUtils,Dialogs;
Type polinomio = array of real;
Var i,n:integer; x:real;
P:polinomio; S:string;
54
6.1. Parámetros 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;
Parámetros de entrada por valor, si solo adquiere el valor del parámetro ingresado
en el programa principal.
Cuando los parámetros de entrada son por valor no es necesario colocar “var” antes de las
variables de entrada, mientras que si son parámetros de referencia debemos incluir “var”
antes de las variables de entrada.
Ejemplo 6.4 Programa que calcula el factorial de un número usando una función recur-
siva:
55
E. Kenny Venegas P.
Program factorial_recursivo;
Uses SysUtils,Dialogs;
Var n:integer;
Program primos;
Uses SysUtils,Dialogs;
Type v2=array[1..2] of integer;
var n:integer; p:v2;
56
6.2. Ejercicios propuestos
end;
57
E. Kenny Venegas P.
Veremos algunas técnicas de ordenación como los métodos de selección, inserción y bur-
buja.
6.3.1. Selección
Algoritmo Ordenación por selección
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
Program ordenacion_seleccion;
Uses SysUtils,Dialogs;
Type vector=array[1..20] of real;
var A:vector; n:integer; cad:string;
58
6.3. Técnicas de ordenación
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;
6.3.2. Inserción
Este algoritmo encuentra la posición correcta para xi en el segmento x1 , x2 , . . . , xi−1 y
lo coloca allı́, es decir, lo inserta.
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
Program ordenacion_insercion;
Uses SysUtils,Dialogs;
Type vector=array[1..20] of real;
var A,B:vector; n:integer; cad:string;
60
6.4. Ejercicios propuestos
end;
A[j]:=v;
end;
// incluir "inser:=A;" en el caso de utilizar "inser" como una función
end;
6.3.3. Burbuja
Algoritmo Ordenación 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
61
E. Kenny Venegas P.
a) Método de Selección.
b) Método de Inserción.
c) Método de la Burbuja.
3. Modifique los algoritmos de selección, inserción y burbuja para que muestren como
se va ordenando el arreglo original paso por paso.
62
Capı́tulo 7
Registros
Los registros son la generalización 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 denominará “campo”.
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á ’
else
cad := ’ aprobará ’;
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 ó 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;
Begin
64
7.1. Declaración de registros
65
E. Kenny Venegas P.
for i:= 1 to j5 do
cad := cad + print(promo[N5[i]]);
showmessage(cad)
End.
2. Elabore un programa que lea los siguientes datos acerca de una persona: nombre,
edad y sexo (indique sólo H o M) y determine:
66
Bibliografı́a
67