Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PROGRAMACIÓN DE
COMPUTADORES
SEGUNDA EDICIÓN
CCD 005.11
SEGUNDA EDICIÓN
PROGRAMACIÓN DE
COMPUTADORES
ISBN ·978-958-8957-96-8
Diseño · Daniela Martínez Díaz
de los autores, suscribió con la Universidad una autorización o contrato de cesión de derechos
y una carta de originalidad sobre su aporte, por tanto, los autores asumen la responsabilidad
PROGRAMACIÓN DE
COMPUTADORES
C A P Í T U L O 1
L O S S I S T E M A S N U M É R I C O S 37
1.3.2. La resta 57
1.3.4. La multiplicación 62
1.3.5. La división 67
C A P Í T U L O 2
D E F I N I C I O N E S P R E L I M I N A R E S 85
CAPÍTULO 3
P R I N C I P I O S D E P R O G R A M A C I Ó N 149
CAPÍTULO 5
A R R E G L O S Y M A T R I C E S 387
5.1 DEFINICIÓN DE ARREGLOS 391
5.2. OPERACIONES CON LOS ARREGLOS 396
5.2.1. Creación de un arreglo 396
CAPÍTULO 6
A L G O R I T M O S M O D U L A R E S 501
E J E R C I C I O S R E S U E L T O S 635
Capítulo 1 637
Capítulo 2 641
Capítulo 3 645
Capítulo 4 666
Capítulo 5 684
Capítulo 6 717
R E F E R E N C I A S B I B L I O G R Á F I C A S 729
L I S TA D E
TABLAS
Tabla 1. Representación simbólica de las unidades del sistema decimal
basada en ángulos. 40
Figura 20. Conformación del binario para la letra A en código ASCII. 111
Figura 52. Ruta gráfica con los valores 5.5, 2, 3, 9, 6. Ejemplo 3 / Capítulo 3 205
Figura 53. Esquema de una toma de decisiones con una proposición PA. 210
Figura 54. Esquema de una toma de decisiones con una proposición PM. 211
Figura 58. DFD del ejemplo 2, Capítulo 3, con condiciones en línea 222
Figura 60. Diagrama para el número de días del mes dado 233
Para-desde-hasta.me. 356
Figura 125: Parte inicial del algoritmo para agregar datos a un arreglo. 385
Figura 126: Parte final del algoritmo para agregar datos a un arreglo 385
Figura 130 Algoritmo para llenar y contar las veces que un carácter
está en una matriz. 406
Figura 131 Algoritmo que modifica e imprime una Matriz. 411
Figura 132 Primera parte del algoritmo para insertar datos en una matriz 418
Figura 133 Segunda parte del algoritmo para insertar datos en una matriz. 419
Figura 134 Primera parte del algoritmo para eliminar datos en una matriz. 426
Figura 135 Segunda parte del algoritmo para eliminar datos en una matriz 427
Figura 137 Segunda parte del algoritmo para agregar datos a una matriz. 435
Figura 138 Algoritmo para ordenar los datos en una matriz 442
Figura 140: Algoritmo para generar el triángulo de Pascal en una Matriz. 465
Figura 141: Algoritmo para generar el triángulo de Pascal en una Matriz 466
Figura 142: Algoritmo para generar el triángulo de Pascal 467
Figura 143: Algoritmo del triángulo de Pascal en sus módulos principales. 467
Figura 144: Procedimiento o módulos para Entrada y Salida de
información del algoritmo del Triángulo de Pascal. 468
Figura 149: Variables definidas por el módulo principal del programa. 484
Figura 163: Algoritmo para el cálculo del Factorial por recursividad. 502
Consecuentemente con lo expuesto, esta obra está orientada a formar al lector en sus
primeros pasos en la construcción de programas de computador, no es una obra completa
para aprender a programar computadores, ya para ello se requiere del estudio juicioso de
lenguajes de programación de computadores, del manejo de entornos de desarrollo y de
la experiencia en la operación de plataformas computacionales. En este sentido, la obra
alcanza hasta la formulación, construcción y puesta en funcionamiento, en un lenguaje
concreto, pequeños programas que permiten aprender a resolver problemas muy puntua-
les. Por ejemplo, calcular la liquidación del pago de un trabajador por un servicio prestado,
determinar el punto medio de la recta que pasa por dos puntos dados, calcular el factorial
de un número, etc.
El capítulo uno está orientado a mostrar los fundamentos matemáticos de los siste-
mas de numeración como elemento que permite comprender la base teórica sobre la que
se ha construido el computador para realizar operaciones matemáticas.
Un parte importante de la obra es que cuenta en cada uno de los capítulos con una
sección de ejercicios de repaso, los que permitirán al lector hacer una aplicación amplia y
variada de los conocimientos adquiridos en el capítulo; sin perder de vista que para ello
deberá siempre echar mano de los conocimientos de los capítulos precedentes.
El libro también incluye ejemplos resueltos con los que se muestra la aplicación y uso
de los conceptos desarrollados, además la implementación de estos ejemplos se presenta
fundamentalmente utilizando tres herramientas: la primera, es todo lo relacionado a las
técnicas de construcción de diagramas de flujo. La segunda, lo que se denomina la “prueba
de escritorio” como instrumento para presentar al lector de forma detallada y de manera
gráfica la manipulación de los datos en RAM del computador que hace el algoritmo. La
tercera y última, es la implementación de estos ejemplos resueltos en lenguajes formales
con Lenguaje C, Microsoft Visual Basic, Java, Python, JavaScript y PHP; estos lenguajes se
seleccionaron dada su gran difusión y facilidad de uso. El libro incluye 68 ejemplos, 384
problemas para resolver como ejercicios de práctica y 111 ejercicios resueltos, con un total
de 563 ejercicios y ejemplos en el texto.
Fundamentos de lógica para programación de computadores · Introducción
CAPÍTULO 1
LOS SISTEMAS NUMÉRICOS
01
01
Objetivo
Tabla 1. Representación simbólica de las unidades del sistema decimal basada en ángulos.
Ninguno Uno Dos Tres Cuatro Cinco Seis Siete Ocho Nueve
De esta representación se deriva la notación de los números arábigos que hoy día se
usan para los sistemas numéricos en general, resultando los símbolos del sistema decimal,
desde cero hasta nueve (Ver tabla 2):
Cantidad de
Cero o
unidades por Una Dos Tres Cuatro Cinco Seis Siete Ocho Nueve
ninguna
subgrupo
Símbolo 0 1 2 3 4 5 6 7 8 9
Para el sistema numérico con un grupo base de ocho unidades se recurre a los si-
guientes símbolos (Ver tabla 3):
Cantidad de
Cero o
unidades por Una Dos Tres Cuatro Cinco Seis Siete
ninguna
subgrupo
Símbolo 0 1 2 3 4 5 6 7
Para el sistema numérico con un grupo base de cinco unidades se emplean los si-
guientes símbolos:
Los símbolos para el sistema numérico con grupo base de dos unidades se ven en la tabla 5:
Cantidad de unidades
Cero o ninguna Una
por subgrupo
Símbolo 0 1
Para el sistema numérico con un grupo base de 16 unidades se utilizan los siguientes
símbolos:
Después del subgrupo de nueve unidades se hace necesario utilizar un símbolo que
represente adecuadamente cada cantidad y para tal caso se usan las letras desde la A a
la F para los subgrupos del diez hasta de quince unidades.
Para el sistema numérico con un grupo base de 23 unidades se requieren los siguien-
tes símbolos (ver tabla 7).
Diez A
Once B
Doce C
Trece D
Catorce E
Quince F
Diez y seis G
Diez y siete H
Diez y ocho I
Diez y nueve J
Veinte K
Veintiuno L
Veintidós M
En general se debe entender que de acuerdo al número del grupo base, igualmente se
debe tomar la cantidad de símbolos para representar los subgrupos. Siempre se tomará la
cantidad de símbolos a partir de cero y hasta el número del grupo base menos uno, es decir:
Es importante tener presente que a partir del subgrupo de nueve unidades es nece-
sario tomar letras u otro carácter que sea consistente con la representación que se quiera
hacer. La manera como se cuenta, por ejemplo, para contar en el sistema numérico base
10 tenemos:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.
.
.
En esta secuencia se ve que, hasta el subgrupo de nueve, cada uno de los símbolos
representa la cantidad de unidades; pero a partir de este y como la base es 10, la siguiente
simbolización (10, uno y cero) quiere decir que se tiene un grupo de diez unidades. La si-
guiente simbolización (11) significa que se tomó un grupo de diez unidades y se ha empeza- 42
do a conformar otro grupo que hasta el momento solo tiene una unidad (11, uno y uno). La 43
simbolización 12 expresa que se tiene un grupo de diez unidades y dos unidades adicionales.
En general, la simbolización 87, por ejemplo, significa que existen 8 grupos completos de diez
unidades cada uno y adicional a estos hay 7 unidades más, es decir, 87 unidades en total.
Si se quiere representar un conteo en otro sistema numérico, por ejemplo, base 6, este será:
0
1
2
3
4
5
10
11
12
13
14
15
20
21
.
.
.
De igual manera que en el ejemplo anterior de base 10, en este conteo base 6 se par-
te del símbolo 0 hasta el símbolo 5 para representar cada subgrupo; a partir de estos se
conforman grupos de 6 unidades. Después de 5 sigue el grupo de seis unidades que se
representa por 1 y 0, después sigue el de siete unidades que es un grupo de seis unidades
y una unidad adicional, representado por 1 y 1. Después viene el grupo de ocho unidades
que está conformado por un grupo de 6 unidades y 2 unidades adicionales, es decir 12 y
así sucesivamente.
Otro ejemplo de conteo, pero ahora en el sistema base 2, para los trece primeros sub-
grupos será:
0
1
10
11
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos
100
101
110
111
1000
1001
1010
1011
1100
.
.
.
Para el conteo base 2 se procede formando grupos de dos unidades. Cuando se tiene
una unidad se simboliza con 1, cuando se tienen 2 unidades se simboliza con 10; lo que
quiere decir que se tiene un grupo de 2 unidades, ya que el grupo base es 2, entonces se
marca el grupo conformado por las dos unidades y no hay ninguna unidad adicional; que
es lo que representa el cero que acompaña al uno en la simbolización 10.
46
47
Para la base 2 se hace un grupo de 16 unidades conformado por dos subgrupos, que a su
vez están formados por dos sub-subgrupos de dos unidades, un grupo de 8 unidades, nin-
gún grupo de 4 unidades y ninguna unidad adicional, esto porque en base dos las unidades
se agrupan de a dos en dos. La representación explicita del 24 en base 2 es (Ver figura 12):
TA partir del artículo “Aritmética en el Espectro de los Números Naturales a Través de Vein-
te Ejemplos” escrito por el profesor de la universidad del Quindío: Diego Pareja Heredia
(Pareja Heredia, 2010), todo número se puede escribir como un polinomio conformado de
la siguiente manera:
An Xn + An-1 Xn-1 + An-2 Xn-2 + ... + A1 X1 + A0 X0 + A-1 X-1 + ... + A-(n-2) X-(n-2) + A-(m-1) X-(m-1) + A-m X-m
En donde: An, An-1, An-2, A1, A0, A-1, A-2, ..., A-m es el conjunto de coeficientes que debe ser
tomado de los símbolos definidos para el sistema numérico. La base del sistema es X, n
la cantidad de posiciones desde cero hacia el extremo izquierdo que conforma el número
para las potencias positivas y m la cantidad de posiciones desde cero a la derecha que
conforma el número para las potencias negativas (Pareja Heredia, 2010). De tal modo, el
número por ejemplo en base diez 26594.781, se puede escribir según el polinomio del teo-
rema como se ve a continuación:
26594.78110
Según el teorema y usando el siguiente ejemplo se puede demostrar que 110002 es igual
a 2410, así:
1 · 24 + 1 · 2 3 + 0 · 2 2 + 0 · 21 + 0 · 2 0
0
16
24
Como se aprecia según la suma del polinomio el número 110002 es igual a 2410
+ B · 16-2 + F · 16-3
Para realizar las multiplicaciones y las sumas planteadas por el polinomio hay que
tener presente que el número está en base 16 y que el conjunto de coeficientes de la base
es [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F], en donde A = 10, B = 11, C = 12, D = 13, E = 14 y F = 15.
En consecuencia, sumando del polinomio la parte que presenta las potencias positivas, es:
2 · 16 = 32
12 · 256 = 3072
13 · 4096 = 53248
10 · 65536 = 655360
2 · 1048576 = 2097152
1 · 16777216 = 16777216
19586094
Ahora la suma del polinomio para la parte de las potencias negativas que correspon-
den con los decimales del número es:
9 · 1 6 -1 + B · 1 6 -2 + F · 1 6 -3
15 · 0.000244140625 = 0.003662109375
11 · 0.003906250000 = 0.042968750000
9 · 0.062500000000 = 0.562500000000
0.609130859375
Al sumar las dos partes del polinomio se tiene el equivalente en base 10 del
número dado, esto es 19586094.60913085937510, luego 12ADC2E.9BF16 es igual a
19586094.60913085937510.
En conclusión, se puede decir que para convertir un número de una base cualquiera
a su correspondiente en base diez, basta con escribirlo como su polinomio equivalente y
calcular el resultado del mismo.
· Primero: tomar del número en base diez, la parte entera y hacer divisiones sucesivas de
los cocientes por la base del sistema al que se quiere convertir el número. Se divide hasta
que se obtenga cero como cociente. Como resultado de la conversión se toman todos los
residuos calculados en las divisiones desde el último hasta el primero.
· Segundo: tomar la parte fraccionaria del número en base diez y hacer multipli-
caciones sucesivas por la base del sistema al que se quiere convertir la fracción;
cogiendo para cada subsiguiente multiplicación la fracción resultante de la mul-
tiplicación precedente. El resultado de este procedimiento se obtiene de tomar
todos los enteros que dieron de las multiplicaciones desde el primero y hasta el
último para conformar la fracción equivalente.
50
A continuación, para ver con mayor claridad cómo se aplica el método, se desarrolla 51
el siguiente ejemplo, el cual consiste en convertir el número 86.969610 a su equivalente en
base 5. Se procede entonces:
Primero: se toma del número en base 10 la parte entera y se hacen divisiones por 5,
que es la base del sistema al que se quiere convertir el número, procediendo de esta for-
ma:
8 6 5
-5 1 7 5
3 6 -1 5 3 5
3 5 2 -0 0
1 3
Luego se toman los residuos calculados en las divisiones desde el último hasta el pri-
mero, esto es 321. Con esto se ha convertido 8610 en 3215.
Segundo: A partir de la parte fraccionaria del número del ejemplo se hacen multipli-
caciones por 5, de este modo:
0.9696
* 5 = 4.8480
0.8480
* 5 = 4.2400
0.2400
* 5 = 1.2000
0.2000
* 5 = 1.0000
0.0000
* 5 = 0.0000
Después, se toman desde el primero y hasta el último de los enteros obtenidos como
resultado de las multiplicaciones, de lo que se obtiene 0.4411; por lo cual 0.969610 es equi-
valente a 0.44115. Por último, se toma la parte calculada por las divisiones y se suma con la
parte calculada por las multiplicaciones y se obtiene el número equivalente. En el ejemplo,
el equivalente de 86.969610 es 321.44115.
2 4 2
-2 1 2 2
0 4 -1 2 6 2
-4 0 -6 3 2
0 0 -1 1 2
1 -0 0
1
base 16. Haciendo divisiones sucesivas por 16 se obtienen los residuos correspondientes:
1 9 5 8 6 0 9 4 1 6
-1 6 1 2 2 4 1 3 0 1 6
3 5 -1 1 2 7 6 5 0 8 1 6
-3 2 1 0 4 -6 4 4 7 8 1 1 6
-9 6 -3 2 2 9 8 1 6
3 8
8 1
1 2 5
1 5 8 -1 6 1 8 1 6 1 6
-3 2 -1 1 2
-8 0 -1 4 4 1 3 8 -1 6 1
6 6 1 3 0
-6 4 1 3 0 -1 2 8 1 4 1 -1 2 8 2 -0 0
-1 2 8 2 8 -1 28 1 0 1
2 0
-1 6 2 -1 6 1 3
4 9 1 2
-4 8
1 4
A continuación, se deben tomar los residuos calculados desde el último hasta el pri-
mero, pero como se pretende pasar el número de base 10 a base 16, es necesario conver-
tirlos a base 16, esto es:
1 2 10 13 12 2 14
1 2 A D C 2 E
0.609130859375 * 16 = 9.74609375
0.746093750000 * 16 = 11.9375000
0.937500000000 * 16 = 15.0000000
0.000000000000 * 16 = 0.00000000
Luego, la parte fraccionaria está conformada por los enteros obtenidos por las multi-
plicaciones, esto es, los números 9, 11 y 15. Como se está convirtiendo el número en base
10 a su correspondiente en base 16, es necesario reescribir los símbolos equivalentes de
éstos en el sistema de base 16, procediendo de esta manera:
9 11 15
9 B F
Por tanto, la fracción es 0.9BF. Al sumar el resultado de la parte entera del número y el
resultado de la parte fraccionaria del mismo, se tiene que 19586094.60913085937510 es igual
a 12ADC2E.9BF16.
Los procedimientos para realizar las operaciones aritméticas en cualquier sistema de nu-
meración o sistema numérico son los mismos, es decir, que, si se sabe hacer sumas restas,
multiplicaciones o divisiones en el sistema de base 10, es posible realizar operaciones en
cualquier sistema, solo hay que tener presente cuál es la base del sistema en el que se
va a proceder.
52
53
1.3.1 La suma
3 1 4 2 3 1 1 2
+ 4 4 2 3 2 4
El procedimiento de la suma dice que hay que sumar columna por columna de dere-
cha a izquierda, entonces, habrá que sumar 2 y 4 de la primera columna tomada de dere-
cha a izquierda. Esta suma da como resultado 6 y, como la base del sistema es 5, la suma
se pasa de la base, es decir, la suma da la base o más que esta, entonces a 6 se le resta la
base del sistema, para el caso restar 5, dando como resultado uno, tal como se observa a
continuación:
3 1 4 2 3 1 1 2
+ 4 4 2 3 2 4
6
-5
1
Como se hizo una resta entonces se debe sumar uno a la siguiente columna. En el
planteamiento se escribe así:
1
3 1 4 2 3 1 1 2
+ 4 4 2 3 2 4
6
-5
1
-0 -5
4 1
La cuarta columna da 5 y como es igual a la base del sistema se debe restar la base y
sumar uno a la quinta columna, escribiendo el procedimiento sería:
1 1
3 1 4 2 3 1 1 2
+ 4 4 2 3 2 4
5 4 4 6
-5 -0 -0 -5
0 4 4 1
La quinta columna suma 7, se resta la base y se suma uno a la columna sexta. Obsérvese:
1 1 1
3 1 4 2 3 1 1 2
+ 4 4 2 3 2 4
7 5 4 4 6
-5 -5 -0 -0 -5
2 0 4 4 1
La sexta columna suma nueve, se resta la base y se suma uno a la columna séptima:
1 1 1 1
3 1 4 2 3 1 1 2
+ 4 4 2 3 2 4
9 7 5 4 4 6
-5 -5 -5 -0 -0 -5
4 2 0 4 4 1
La séptima columna suma 2, se resta cero y no se suma nada a la octava columna, así:
1 1 1 1
3 1 4 2 3 1 1 2
+ 4 4 2 3 2 4
2 9 7 5 4 4 6
-0 -5 -5 -5 -0 -0 -5
2 4 2 0 4 4 1
3 2 9 7 5 4 4 6
-0 -0 -5 -5 -5 -0 -0 -5 54
3 2 4 2 0 4 4 1 55
En conclusión, la suma en el sistema base 5 es:
3 1 4 2 3 1 1 2
+ 4 4 2 3 2 4
3 2 4 2 0 4 4 1
H C A 1 B E 9 C
+ 9 8 4 D F G H
A B C D E F G H
10 11 12 13 14 15 16 17
Se procede del modo siguiente:
1 1 1 1 1 1 1
H C A 1 B E 9 C
+ 9 8 4 D F G H
1 18 22 18 6 25 30 26 29
-0 -18 -18 -18 -0 -18 -18 -18 -18
1 0 4 0 6 7 C 8 B
1 0 4 0 6 7 C 8 B
base 10 será:
1 1 1 1 1 1
9 8 1 4 7 1 1 2
+ 9 9 7 6 1 9 5
1 10 18 11 12 13 3 10 7
-0 -10 -10 -10 -10 -10 -0 -10 -0
1 0 8 1 2 3 3 0 7
De lo cual se obtiene:
9 8 1 4 7 1 1 2
+ 9 9 7 6 1 9 5
1 0 8 1 2 3 3 0 7
Esta misma suma, pero hecha usando el sistema de numeración base 12 quedará así:
1 1 1
9 8 1 4 7 1 1 2
+ 9 9 7 6 1 9 5
10 17 11 12 13 2 10 7
-0 -12 -0 -12 -12 -0 -0 -0
A 5 B 0 1 2 A 7
9 8 1 4 7 1 1 2
+ 9 9 7 6 1 9 5
A 5 B 0 1 2 A 7
Lo cual permite concluir que no importa los números que se quieran sumar, el proce-
dimiento siempre es el mismo y las cantidades representadas por los números dependen
del sistema de numeración empleado.
1.3.2. La resta
Igual que para el caso de la suma, para la resta el procedimiento es el mismo que normal-
mente se usa en el sistema de base 10. Como ejemplo, efectuaremos la siguiente resta en
base 5:
3 1 4 2 3 1 1 2
- 4 4 2 3 2 4
La resta comienza sustrayendo la columna del extremo derecho y desde esta se resta
columna a columna hasta alcanzar la del extremo izquierdo. Si en una columna no se
puede efectuar la resta entonces se le pide prestado uno al valor del minuendo de la si-
guiente columna. El valor del minuendo de la siguiente columna es disminuido en uno. El
uno que se pidió prestado es equivalente a la base del sistema y es sumado con el valor
del minuendo de la columna que se está restando. A partir del ejemplo, se debe comenzar
por la columna externa de la derecha, restando 2 y 4; como a 2 no se le puede restar 4,
entonces se debe pedir prestado uno al minuendo de la siguiente columna; el valor del
minuendo de la siguiente columna es uno, se le debe restar uno porque presta, con lo que
da cero en esta posición. En el planteamiento del ejemplo queda:
5
0
3 1 4 2 3 1 1 2
- 4 4 2 3 2 4
56
57
0 5
3 1 4 2 3 1 1 2
- 4 4 2 3 2 4
La siguiente columna a restar es la segunda de derecha a izquierda. En esta hay que restar
2 de cero. Como no se puede restar la columna, entonces se pide prestado uno al valor del
minuendo de la siguiente columna más a la izquierda de la columna que se está restando. Esta
columna tiene un uno, el que puede prestar a la columna precedente, quedando en conse-
cuencia en cero. En la segunda columna se suma entonces cinco más cero y a esta suma se le
resta 2, dando como resultado 3. El procedimiento se describe a continuación:
5
0 0 5
3 1 4 2 3 1 1 2
- 4 4 2 3 2 4
3 3
Ahora se debe proceder a restar la tercera columna. Los valores que se deben restar son
0 menos 3, como no se puede restar 3 de 0, entonces se debe pedir prestado a la columna
siguiente. Dado que la base del sistema es 5, entonces se presta 5 a la tercera columna y con
esto sí se puede restar ya que 5 que prestó, más 0 de la tercera columna menos 3 de la
misma columna tres, la respuesta es 2. El planteamiento de la resta queda es:
5 5
2 0 0 5
3 1 4 2 3 1 1 2
- 4 4 2 3 2 4
2 3 3
En la cuarta columna se debe restar 2 de 2, dando cero como resultado. En la quinta co-
lumna se debe restar 4 de 2, lo cual no se puede de forma directa, por lo que se debe pedir
prestado a la siguiente columna, la resta de estas dos columnas quedaría en el planteamiento
de la siguiente manera:
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos
5 5
3 5 2 0 0 5
3 1 4 2 3 1 1 2
- 4 4 2 3 2 4
3 0 2 3 3
En la sexta columna hay que restar 4 de 3, que no se puede y por tanto hay que pedir
prestado uno a la séptima columna. La resta de la columna entonces queda:
5 5 5
0 3 5 2 0 0 5
3 1 4 2 3 1 1 2
- 4 4 2 3 2 4
4 3 0 2 3 3
En la columna octava hay que restar cero de cero dando como resultado cero y la co-
lumna novena hay que restar cero de 3, dando 3 como resultado, entonces se concluye:
5 5 5
0 3 5 2 0 0 5
3 1 4 2 3 1 1 2
- 4 4 2 3 2 4
3 0 4 3 0 2 3 3
3 1 4 2 3 1 1 2
- 4 4 2 3 2 4
3 0 4 3 0 2 3 3
1.3.3. La resta por complemento
Otra manera de efectuar una resta es hacer uso de la teoría del complemento. Aplicando
lo propuesto por M. Morriz Mano en Arquitectura de computadores y haciendo una genera-
lización del procedimiento para usarlo en cualquier sistema de numeración, se tiene que
hay 2 formas de calcular el complemento, la primera es el complemento a la base y la otra
es el complemento a la base menos uno (Morris Mano, 1994).
Después se examina el 3 y se verifica cuánto le falta para ser la base menos uno, es
decir, cuánto le falta a 3 para ser 9 y así sucesivamente. A 3 le faltan 6 para ser 9, luego
el segundo componente del número complemento es 6. Desde el segundo componente
del número y hasta el último se verifica cuánto le falta al número para ser la base menos
uno. De esta forma se calculan todos los componentes del número complemento. Para el
ejemplo se tendrá:
58
59
2 Cuánto le falta para ser 10 8
Ahora para calcular el complemento a la base menos uno de 56432 se procede de mane-
ra similar, con la diferencia que a todos los componentes del número se les verifica cuánto
les falta para ser la base menos uno. Para el ejemplo el complemento a la base menos uno
del número será:
2 Cuánto le falta para ser 9 7
3 1 4 2 3 1 1 2
- 4 4 1 3 2 4
3 1 4 2 3 1 1 2
+ 4 4 0 0 3 1 2 1
1 1 1
3 1 4 2 3 1 1 2
+ 4 4 0 0 3 1 2 1
1 8 5 4 3 6 2 3 3
-0 -5 -5 -0 -0 -5 -0 -0 -0
1 3 0 4 3 1 2 3 3
3 1 4 2 3 1 1 2
+ 4 4 0 0 3 1 2 1
1 3 0 4 3 1 2 3 3
El resultado de la suma es 130431233 y para efectos de dar la respuesta no se tiene
en cuenta el 1 de la extrema izquierda, luego la respuesta final de la resta sería 30431233.
Ahora, usando la teoría del complemento a la base menos uno para el cálculo de la
resta de estos valores, se procede de esta forma: el complemento a la base menos uno, es
decir, el complemento a 4 del sustraendo será 44003120. La suma del minuendo y el com-
plemento a la base menos uno (complemento a 4) del sustraendo será:
3 1 4 2 3 1 1 2
+ 4 4 0 0 3 1 2 0
3 1 4 2 3 1 1 2
+ 4 4 0 0 3 1 2 0
60
1 3 0 4 3 1 2 3 2 61
Como se está usando la suma con el complemento a la base menos uno (complemen-
to a 4) del sustraendo, el valor de la extrema izquierda ya no se descarta, sino que se
quita de allí y se le suma a la respuesta:
3 0 4 3 0 2 3 2
+ 1
3 0 4 3 0 2 3 3
-0 -0 -0 -0 -0 -0 -0 -0
3 0 4 3 0 2 3 3
1 3 C F 8
* 3 E A
8 0 1 6
-8 0 5 1 6
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos
0 -0
Los residuos de las divisiones son 5 y 0, luego 8010 es igual a 5016, entonces en base
16, A*8 = 50. Calculada la multiplicación, en el planteamiento de la misma se escribe:
5
1 3 C F 8
* 3 E A
9 5
1 3 C F 8
* 3 E A
B 0
1 B 0
Se prosigue con A * 3, es decir, 10 * 3 que da 30 y más 8 que se lleva de la multiplicación
anterior, entonces da 38. La conversión de 3810 es 2616. Obteniendo:
2 8 9 5
1 3 C F 8
* 3 E A
6 1 B 0
2 8 9 5
1 3 C F 8
* 3 E A
C 6 1 B 0
1 3 C F 8
* 3 E A
C 6 1 B 0
C 6 1 B 0
1 1 5 5 9 0
2 2 1
1 3 C F 8
* 3 E A
C 6 1 B 0
1 1 5 5 9 0
3 B 6 E 8
Una vez hechas las tres multiplicaciones, se deben sumar las tres filas para obtener la
respuesta, procediendo de la siguiente forma:
2 2 1
1 3 C F 8
* 3 E A
C 6 1 B 0
1 1 5 5 9 0
3 B 6 E 8
4 D 8 A 2 B 0
Con lo que se concluye que la multiplicación de 13CF8 * 3EA, da como resultado
4D8A2B0.
3 1 2 0 0 1 0 3
* 3 0 2 1
3 1 2 0 0 1 0 3
* 3 0 2 1
3 1 2 0 0 1 0 3
da de esta forma:
2
3 1 2 0 0 1 0 3
* 3 0 2 1
3 1 2 0 0 1 0 3
2
2
3 1 2 0 0 1 0 3
* 3 0 2 1
3 1 2 0 0 1 0 3
2 2
3 1 2 0 0 1 0 3
2 2 2
2
3 1 2 0 0 1 0 3
* 3 0 2 1
3 1 2 0 0 1 0 3
0 0 2 2 2
Después se debe multiplicar 2 * 2 que da 4 y al convertirlo queda 10. En el plantea-
miento sería:
1 2
3 1 2 0 0 1 0 3
* 3 0 2 1
3 1 2 0 0 1 0 3
0 0 0 2 2 2
1 2
3 1 2 0 0 1 0 3
* 3 0 2 1
3 1 2 0 0 1 0 3
1 3 0 0 0 2 2 2
Al multiplicar por 0, igual en que en el sistema decimal sería 0, por lo cual se tiene:
3 1 2 0 0 1 0 3
* 3 0 2 1
3 1 2 0 0 1 0 3
1 3 0 0 0 2 2 2
0 0 0 0 0 0 0 0
64
El último paso es multiplicar por 3, y se procede así: se multiplica 3 * 3 que da 9 y al 65
convertirlo a base 4 queda 21, esto es, 3 * 3 = 21 en base 4. El planteamiento queda:
2
3 1 2 0 0 1 0 3
* 3 0 2 1
3 1 2 0 0 1 0 3
1 3 0 0 0 2 2 2
0 0 0 0 0 0 0 0
1
3 1 2 0 0 1 0 3
1 3 0 0 0 2 2 2
0 0 0 0 0 0 0 0
2 1
Se sigue al multiplicar 3 * 1 que da 3 y al convertirlo da 3. En el planteamiento se es-
cribe de la siguiente forma:
2
3 1 2 0 0 1 0 3
* 3 0 2 1
3 1 2 0 0 1 0 3
1 3 0 0 0 2 2 2
0 0 0 0 0 0 0 0
3 2 1
Después se multiplica 3*0 dos veces y luego 3*2 que da 6 y al convertirlo es 12:
1 2
3 1 2 0 0 1 0 3
* 3 0 2 1
3 1 2 0 0 1 0 3
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos
1 3 0 0 0 2 2 2
0 0 0 0 0 0 0 0
2 0 0 3 2 1
1 1 2
3 1 2 0 0 1 0 3
* 3 0 2 1
3 1 2 0 0 1 0 3
1 3 0 0 0 2 2 2
0 0 0 0 0 0 0 0
0 2 0 0 3 2 1
1 1 2
3 1 2 0 0 1 0 3
* 3 0 2 1
3 1 2 0 0 1 0 3
1 3 0 0 0 2 2 2
0 0 0 0 0 0 0 0
2 2 0 2 0 0 3 2 1
Ahora se debe sumar para calcular la respuesta, realizando el siguiente planteamiento:
1 1 2
3 1 2 0 0 1 0 3
* 3 0 2 1
3 1 2 0 0 1 0 3
1 3 0 0 0 2 2 2
0 0 0 0 0 0 0 0
2 2 0 2 0 0 3 2 1
2 2 3 0 1 2 0 0 2 2 3
1.3.5. La división
La división, teniendo en cuenta los diferentes sistemas numéricos, se hace con el siguiente
procedimiento. Supóngase que se quiere dividir 12KJ40521 entre FH521 para el sistema numé-
rico de base 21. Antes de empezar se debe recordar que en el sistema numérico base 21,
después de 9, los símbolos para las cantidades hasta el 20 son:
66
10 11 12 13 14 15 16 17 18 19 20 67
A B C D E F G H I J K
El planteamiento será:
1 2 K J 4 5 F H 5
El proceso se inicia determinando que como hay 3 cifras en el divisor se toman 3 cifras
en el dividendo, como se observa a continuación:
1 2 K J 4 5 F H 5
Luego se compara 12K con FH5 y, como FH5 es mayor que 12K no se puede dividir, por
lo que se debe tomar otra cifra más en el dividendo:
1 2 K J 4 5 F H 5
Se vuelve a comparar, pero en este caso 12KJ con FH5, como 12KJ es mayor que FH5 sí se
puede dividir. Para determinar el primer número del cociente se debe buscar un número
que multiplicado por FH5 de igual o un poco menor que este. Como 12KJ tiene cuatro cifras
y FH5 tiene tres cifras, entonces se debe comparar las 2 primeras cifras de 12KJ con la pri-
mera cifra de FH5, esto es comparar 12 con F.
Al convertir 1221 a base 10 da 2310 y F21 es 1510. Con estos dos valores, en base diez, se pue-
de determinar un número que multiplicado por 15 dé 23. Este número es 1 ya que 15 * 1 = 15
que es un poco menor a 23. Luego el primer número del cociente es 1. En el planteamiento
se escribe:
1 2 K J 4 5 F H 5
Ahora se debe multiplicar FH5 * 1 y se debe restar de 12KJ. Gráficamente se verá así:
1 2 K J 4 5 F H 5
- F H 5 1
0 21
1 2 K J
- F H 5
0 8 3 E
1 2 K J 4 5 F H 5
- F H 5 1
8 3 E
Como la diferencia calculada (83E) es menor que FH5, el valor que se puso como co-
ciente (1) es el correcto. Ahora se debe bajar del dividendo la siguiente cifra, el 4, de la
forma siguiente:
1 2 K J 4 5 F H 5
- F H 5 1
8 3 E 4
A continuación, se procede nuevamente a comparar 83E4 con FH5. Como 83E4 es mayor
que FH5 se puede dividir y, como 83E4 tiene 4 cifras y FH5 tiene 3 cifras entonces, se debe
comparar las 2 primeras cifras de 83E4 con la primera cifra de FH5, esto es, comparar 83
con F con el propósito de buscar un valor que, al multiplicarlo por F de 83, claro está en
base 21. Como no es clara la comparación en base 21, entonces se debe pasar a 8321 y F21
a base 10, que es la base que se maneja normalmente, resultando más fácil comparar los
números y buscar un valor que multiplicado por F de 83.
Al convertir 8321 a base 10 da 17110 y al convertir F21 a base 10 da 1510. Ahora sí, hay que
buscar un número que multiplicado por 15 dé 171 o un poco menor. Este número es 11 ya
que el cociente entero de 171 ÷ 15 es 11. Por tanto, 15 * 11 = 165 que es un poco menor a 171
con lo que se determina que 11 puede ser el segundo número del cociente de la división.
Hay que observar que 11 está en base 10 y que para la división que se está adelantando,
se debe colocar en base 21, esto es, 1110 es igual B21, valor que se debe colocar en el co-
ciente de la división en proceso:
1 2 K J 4 5 F H 5
- F H 5 1 B
8 3 E 4
Al colocar B21 en el cociente se debe proceder a multiplicar FH5 * B, del siguiente modo:
F H 5
* B
Esta multiplicación se hace en base 21, por tanto, B * 5 = 2D. Esto es: B21 es igual 1110 y
por consiguiente 11 * 5 = 55 en base 10. Luego 5510 convertido a base 21 es 2D21. En la multi-
plicación se escribe de esta manera:
2
F H 5
68
* B
69
D
Ahora se multiplica B * H. B21 es igual 1110 y H21 es igual 1710, por tanto 11 * 17 = 187 en
base 10 y como hay que sumar 2 que se lleva de la multiplicación anterior, entonces
187+2=189. 18910 convertido a base 21 es igual a 9021, luego se plantea:
9 2
F H 5
* B
0 D
Continúa la multiplicación de B * F. B21 es igual 1110 y F21 es igual 1510, por tanto 11 * 15 =
165 en base 10 y como hay que sumar 9 que se lleva de la multiplicación anterior, entonces
165 + 9 = 174. 17410 convertido a base 21 es igual a 8621, luego se escribe:
9 2
F H 5
* B
8 6 0 D
Con esto se termina la multiplicación y este resultado se debe escribir en el plantea-
miento de la división que se está adelantando, así:
1 2 K J 4 5 F H 5
- F H 5 1 B
8 3 E 4
- 8 6 0 D
1 2 K J 4 5 F H 5
- F H 5 1 A
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos
8 3 E 4
Ahora se debe proceder a multiplicar FH5 * A en base 21, con lo que se obtiene como
resultado:
8 2
F H 5
* A
7 B 4 8
1 2 K J 4 5 F H 5
- F H 5 1 A
8 3 E 4
- 7 B 4 8
Como en este caso sí se puede realizar la resta, ya que 83E4 es mayor a 7B48, entonces
A sí es el segundo valor del número del cociente. Al efectuar la resta en base 21, ésta que-
da así:
7 21 D 21
8 3 E 4
- 7 B 4 8
7 D 9 H
1 2 K J 4 5 F H 5
- F H 5 1 A
8 3 E 4
- 7 B 4 8
0 D 9 H
Se comprueba que D9H es menor que FH5 lo que hace cierto que A es la segunda cifra
del cociente. Como no se ha terminado de bajar la cifra del dividendo entonces la división
no ha terminado, por lo que se debe proceder a bajar el 5 del dividendo:
1 2 K J 4 5 F H 5
- F H 5 1 A
8 3 E 4
- 7 B 4 8
0 D 9 H 5
De nuevo se comienza la búsqueda de la siguiente cifra del cociente. Para esto se de-
ben comparar D9H521 y FH521. Como D9H5 es mayor que FH5 y como D6H5 tiene cuatro cifras
y FH5 tiene tres cifras, es necesario comparar las 2 primeras cifras de D9H5 con la primera
cifra de FH5, esto es, comparar D9 con F. Como D921 es igual a 28210 y F21 es igual a 1510, en-
tonces hay que buscar un número que multiplicado por 15 sea igual o un poco menor a
282. Este número es 18, luego 1810 es igual I21, entonces la tercera cifra del cociente es I. El
planteamiento de la división será:
1 2 K J 4 5 F H 5
- F H 5 1 A
8 3 E 4 70
- 7 B 4 8 71
0 D 9 H 5
1 2 K J 4 5 F H 5
- F H 5 1 A
8 3 E 4
- 7 B 4 8
0 D 9 H 5
- D B G 6
Como se ve, la resta no se puede hacer ya que DBG6 es mayor que D9H5, entonces hay
que restar uno a I, con lo que la tercera cifra del cociente es H y no I. Entonces se debe
proceder a multiplicar FH5 * H, el planteamiento de la división queda:
1 2 K J 4 5 F H 5
- F H 5 1 A H
8 3 E 4
- 7 B 4 8
0 D 9 H 5
La multiplicación en base 21 de FH5 * H es CGK1 y como este valor es menor que D9H5
entonces sí se puede hacer la resta, confirmando con esto que H sí es la tercera cifra del
cociente. El planteamiento de la división queda de la siguiente manera::
1 2 K J 4 5 F H 5
- F H 5 1 A H
8 3 E 4
- 7 B 4 8
0 D 9 H 5
- C G K 1
0 D I 4
Con esto se concluye la división, obteniendo que 12KJ4521 dividido por FH521 es igual a
1AH21 con un residuo de DI421.
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos
Se identifica la base del número que se quiere convertir como base origen.
Se toma el número que se quiere convertir y se divide por la base del sistema numéri-
co de destino, es decir, se divide por el número convertido en el paso 3. El cociente que da
como resultado se vuelve a dividir por la base del sistema de destino. Así sucesivamente
hasta que se tenga un cociente de cero. Las divisiones se deben efectuar usando el siste-
ma numérico de la base origen.
Se toman los residuos de las divisiones del paso 4, desde el último al primero, y se
convierten al sistema numérico de destino, con esto queda convertido el número a la base
destino.
Como ejemplo para aplicar el método, convertiremos directamente el número 1020213
a base 8. El método dice que en primera instancia hay que identificar la base origen, esto
es base 3 y en segundo lugar se identifica la base destino, para el caso es 8. Luego se con-
vierte el número de la base destino al sistema numérico de la base origen. En el ejemplo,
se debe convertir 8 a base 3, dando como resultado:
Luego 810 es igual 223. Ahora hay que hacer divisiones sucesivas por 223 usando el sis-
8 3
-6 2 3
2 -0 0
1 0 2 0 2 1 2 2
- 2 2 1 1 0 2 2 2
1 0 0 - 2 2 1 1 2 2
- 2 2 1 1 2 - 0 0
0 0 1 2 - 2 2 1 1
-0 2 0
1 2 1
72
- 1 2 1
73
0
11 20 0
1 · 31 + 1 · 30 = 4
2 · 31 + 0 · 30 = 6
0 · 30 = 0
Luego 1020213 es igual a 4608. Con lo que se concluye la conversión y sin usar la base 10.
Otro ejemplo, podría ser convertir 4608 a su correspondiente valor en base 3. El proceso
comienza identificando cuál es la base del sistema de origen y cuál es la base del siste-
ma de destino. Para el ejemplo la base del sistema de origen es 8 y la base del sistema
destino es 3.
El siguiente paso es pasar el número de la base destino al sistema de la base origen:
3 8
-0 0
Al tomar los residuos de la división es claro que 310 es igual a 38, por tanto, el número
a convertir se debe dividir sucesivamente por 38 usando el sistema numérico base 8:
4 6 0 3
-3 1 4 5 3
1 6 - 1 4
4 1 3
- 1 4 -3
0 5
1 3 3
2 0 - 3 1 1 -1 1
- 1 7 3 3
2 - 1 1
2 -3 1 3
1
0
0 -0 0
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos
Tomando los residuos que se calcularon, desde el último hasta el primero, se tendrán
los números 1, 0, 2, 0, 2 y 1. Ahora, es necesario pasar cada uno de estos números a la base
8 de la siguiente forma:
1 * 80 = 1
0 * 80 = 0
2 * 80 = 2
0 * 80 = 0
2 * 80 = 2
1 * 80 = 1
Se identifica la base del número que se quiere convertir como base origen.
Se toma la fracción y se multiplica por la base del sistema numérico de destino (usan-
do el número que se calculó en el numeral anterior), adelantando la multiplicación en el
sistema numérico de origen. Al resultado de ésta se le quita la parte entera y se toma la
fracción restante y se vuelve a multiplicar.
Se repite el paso 3 hasta que dé como resultado cero, o se tenga una cantidad de mul-
tiplicaciones que den como resultado un número significativo de cifras.
Al terminar las multiplicaciones se toman los valores enteros de los resultados de las
mismas, desde el primero hasta el último calculado. Luego, estos valores enteros se con-
vierten al sistema numérico de destino, con lo que se termina la conversión del número.
0.86419 ( )23
2 3 9
-1 8 2 9
5 -0 0
Luego 2310 es igual a 259. Las multiplicaciones se deben hacer entonces por 259. A con- 74
tinuación, se toma la fracción y se adelanta la multiplicación de esta en base 9: 75
0.8641 * 25 = 24.2445
0 . 8 6 4 1
* 2 5
Se debe multiplicar 5 por 1 lo que da 5, luego se multiplica 5 por 4 lo que da 2010, lue-
go como se está adelantando la multiplicación en base 9 se debe convertir este resultado:
2 0 9
-1 8 2 9
2 -0 0
2
0 . 8 6 4 1
* 2 5
2 5
A continuación, se debe multiplicar 5 por 6, lo que da 3010 y como se lleva 2, entonces
se tiene como resultado 3210, el que se debe convertir a base 9 dividiéndolo justamente por
9, como ya se hizo, lo que da 359, la multiplicación se escribe:
3 2
0 . 8 6 4 1
* 2 5
5 2 5
Se debe multiplicar ahora 5 por 8 lo que da 4010 más 3 que se lleva, 4310, convertido a base
9 da 479. Ahora se debe multiplicar 5 por 0 que da cero y 4 que se lleva da 410, al convertirlo a
base 9 da 49, registrándolo quedaría:
4 3 2
0 . 8 6 4 1
* 2 5
4 7 5 2 5
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos
0 . 8 6 4 1
* 2 5
4 7 5 2 5
8 2
Se sigue la multiplicación con 2 por 6 y da 1210, que en base 9 es 139, con lo que se
anotan 3 y va 1, en el planteamiento se observa claramente:
1
0 . 8 6 4 1
* 2 5
4 7 5 2 5
3 8 2
Ahora se multiplica 2 por 8 que da 16 y una que se lleva da 1710 y al convertirlo da 189.
Se anotan 8 y se lleva 1, quedando registrado:
1 1
0 . 8 6 4 1
* 2 5
4 7 5 2 5
8 3 8 2
Se termina multiplicando 2 por 0 lo que da 0 y una que se llevaba 110 que al convertir-
lo a base 9 da 19:
1 1
0 . 8 6 4 1
* 2 5
4 7 5 2 5
1 8 3 8 2
El paso que sigue en la multiplicación es sumar los 2 resultados:
1 1 1
4 7 5 2 5
1 8 3 8 2
2 13 11 13 4 1
- 0 - 9 - 9 -9 -0 -0
2 4 2 4 4 5
Luego la suma en base 9 de los dos productos es 242445 y como el primer factor tiene
4 cifras faccionarias la respuesta debe tener el mismo número de fraccionarios: 24.2445.
0.8641 * 25 = 24.2445
0.2445 * 25 = 6.3457
0.3457 * 25 = 8.8768
0.8768 * 25 = 24.5754 76
77
0.5754 * 25 = 15.8382
0.8382 * 25 = 23.5001
0.5001 * 25 = 13.7025
0.7025 * 25 = 18.8647
0.8647 * 25 = 24.2588
0.2588 * 25 = 6.7264
Luego del resultado de las multiplicaciones se procede a tomar la parte entera de cada
una de las respuestas calculadas. Estas son 24, 6, 8, 24, 15, 23, 13, 18, 24 y 6. A continuación
se convierten estas a base 23 de la siguiente manera:
Primero se toma 24, como a continuación se plantea: 2*91 + *90 = 2*9 + 4*1 = 18 + 4 = 22. 22
en base 23 es M. Este resultado está en concordancia con la numeración en base 23, ya que las
letras asignadas en el sistema son:
A B C D E F G H I J K L M
10 11 12 13 14 15 16 17 18 19 20 21 22
8 da: 8*9 0
8*1 8 = 8 es decir 823
24 da: 2*91 + 4*90 = 2*9 + 4*1 = 18 + 4 = 22 es decir M23
15 da: 1*91 + 5*90 = 1*9 + 5*1 = 9 + 5 = 14 es decir E23
23 da: 2*91 + 3*90 = 2*9 + 3*1 = 18 + 3 = 21 es decir L23
13 da: 1*91 + 3*90 = 1*9 + 3*1 = 9 + 3 = 12 es decir C23
18 da: 1*9 1
+ 8*9 0
= 1*9 + 8*1 = 9 + 8 = 17 es decir H23
24 da: 2*91 + 4*90 = 2*9 + 4*1 = 18 + 4 = 22 es decir M23
6 da: 6*90 = 6*1 = 6 = 6 es decir 623
0.M68MELCHM623 ( )9
Primero se procede a pasar 910 a base 23, que es igual a 923, luego las multiplicaciones
se deben hacer por 9 y en base 23, de este modo:
0 . M 6 8 M E L C M 6
* 9
5 4 2 3
-4 6 2 2 3
8 -0 0
2
En conclusión 5410 es 2823. Se anota de la siguiente manera:
2
0 . M 6 8 M E L C M 6
* 9
G 8
El siguiente paso será multiplicar C * 9 que es 12 * 9 = 108 y 8 que se lleva da 11610, con-
virtiéndolo a base 23 da 5123. Anotando queda:
5 8 2
0 . M 6 8 M E L C M 6
* 9
1 G 8
8 5 8 2
0 . M 6 8 M E L C M 6
* 9
A 1 G 8
Luego se multiplica E * 9, que es 14 * 9 = 126, más 8 que se lleva, es igual a 13410, con-
virtiéndolo a base 23 da 5J23. El siguiente es el procedimiento realizado:
5 8 5 8 2
0 . M 6 8 M E L C M 6
* 9
J A 1 G 8
Sigue la multiplicación con M * 9 que es 22 * 9 = 198, más 5 que se lleva, da 20310, con-
virtiéndolo a base 23 da 8J23. Registrando el procedimiento es:
8 5 8 5 8 2
0 . M 6 8 M E L C M 6
* 9
J J A 1 G 8
Continúa la multiplicación con 8 * 9 que da 72, más 8 que se lleva, es igual a 8010, con-
virtiéndolo a base 23 da 3B23. Anotando queda:
3 8 5 8 5 8 2
0 . M 6 8 M E L C M 6
* 9
B J J A 1 G 8
Se multiplica ahora 6 * 9 que da 54, más 3 que se lleva, da 5710, convirtiéndolo a base
23 queda 2B23. Se observa a continuación:
2 3 8 5 8 5 8 2
0 . M 6 8 M E L C M 6
* 9
B B J J A 1 G 8
8 2 3 8 5 8 5 8 2
0 . M 6 8 M E L C M 6
* 9
G B B J J A 1 G 8
Por último, la multiplicación con 0 * 9 que da 0 más 8 que se lleva es igual a 810, con-
virtiéndolo a base 23 da 823, así:
8 . 2 3 8 5 8 5 8 2
0 . M 6 8 M E L C M 6
* 9
8 . G B B J J A 1 G 8
0.M68MELCHM6 * 9 = 8.GBBJJA1G8
0.GBBJJA1G80 * 9 = 6.ABEHD1F93
0.ABEHDLF930 * 9 = 4.2DJJFB0D4
0.2DJJFB0D40 * 9 = 1.09HCL753D
0.09HCL753D0 * 9 = 0.3IK17J092
0.3IK17J0920 * 9 = 1.B8JC1A3CI
0.B8JC1A3CI0 * 9 = 4.CIEGCM901
Tomando de las multiplicaciones las partes enteras se tiene en número 0.8641014 que
es la conversión del número dado, esto es:
0.M68MELCHM623 = 0.86410149
Con lo anterior se ha dado una visión general de lo que son los sistemas numéricos
y las operaciones básicas con ellos. Es importante destacar que esta teoría es la que sus-
tenta el hecho de cómo es que operan los computadores. De hecho, ellos usan el sistema
numérico base 2 o binario y para su representación en la pantalla o en los diferentes me-
dios usan el sistema numérico base 16 o hexadecimal.
Mediante una representación gráfica de puntos negros haga las agrupaciones para los
siguientes números:
B as e 1 3 B a s e 2 B a s e 1 6
1 52 6 4 C A B 11 01 0 011 F E A F E A1 2
+ CB1007 + 1010100 +12548ACE
B a s e 6 B a s e 3
1 5 42 31 21 02 01 0
+ 1251520 + 2 21102
Aplicar la operación básica de la resta en los siguientes casos:
B as e 21 B a s e 2 B a s e 1 6
1 52 6 4 C A B 11 01 0 011 F E A F E A1 2
- CB1007 - 1010100 -12548ACE
B as e 6 B a s e 3
45 3 0 0 0 31 1 3 6 8 0 0 3
- 1251520 + 87654
B as e 8 B a s e 1 0
45 3 0 0 0 31 72 5 4 6 3 4
* 1251520 * 16210
B as e 1 7 B a s e 2 B a s e 1 6
1 52 6 4 C A B 11 01 0 011 F E0 0 A 5 F E A1 2
÷ CB1007 ÷ 1010100 ÷ 125AE
B as e 9 B a s e 1 0
11 8 45 32 0 8 0 31 5 42 3 4 0 0 0 9
÷ 12720 ÷ 43410
De base 16 a base 2
De base 8 a base 4
0.004FEAFEA12
0.077445003
82
83
CAPÍTULO 2
DEFINICIONES PRELIMINARES
01 01
01 01
Objetivo
Manejar los conceptos de variables, constantes, operadores,
expresiones y tipos de datos; elementos fundamentales para la
construcción de algoritmos.
86
87
2.1. EL CONCEPTO DE VARIABLE
El computador es el invento que ha extendido la capacidad de la mente
para procesar datos, aumentando su velocidad para realizar cálculos y por
ende de agilizar tareas rutinarias en las que intervienen procesos en los
que se toman decisiones. Por lo tanto, el funcionamiento del computador,
es similar al del cerebro del hombre que para realizar una tarea debe obte-
ner datos, trabajo que lleva a cabo por medio de los sentidos, después que
los obtiene, los procesa y calcula unos resultados en su mente que luego
son manifiestos, bien sea por medio del habla, la escritura, la pintura, entre
otras.
Análogamente, el computador es un sistema que realiza procesamien-
to de datos para dar como resultado información útil y para esto necesita
obtener dichos datos, lo que hace a través de elementos como el teclado,
el lector de discos flexibles, el lector de CD-ROM, el disco duro, la tarjeta de
red, el MODEM; en términos generales a través de los dispositivos de entrada;
luego procesa dichos datos usando lo que se denomina la Unidad Central
de Procesos (CPU del inglés Central Process Unit) y después del proceso, los
resultados obtenidos son sacados de la CPU para imprimirse, almacenarse en
discos flexibles o en discos duros; o enviarse a otros computadores a través
de una red, es decir, se reportan los resultados a través de los denominados dispositivos
de salida.
La CPU, como la mente humana, es el elemento encargado de procesar los datos; esta
tiene memoria en la que almacena los datos y la información obtenida durante el desa-
rrollo de las tareas encomendadas. La memoria tiene un comportamiento similar a la de
los seres humanos: retiene información de manera permanente y de manera temporal; hay
información vital para las personas que la mantienen almacenada en su memoria perma-
nentemente (dónde vive, cómo se llama, quiénes hacen parte de su familia, etc.) y de otro
lado, hay datos o información que las personas retienen por períodos cortos de tiempo,
especialmente aquellos como los de los cálculos que realiza para x o y tarea y luego son
olvidados porque pierden utilidad, es decir, vacía la memoria temporal quedando lista
para ser usada en otra tarea.
En su libro Montaje, Configuración y Reparación del PC, David Zurdo Saiz, Ángel Gutié-
rrez Tapia y Fernando Acevedo Quero, sostienen que la memoria permanente contiene la
información necesaria para que el computador sepa si tiene teclado y de qué tipo, si tiene
disco duro y de qué tipo, la marca de computador, etc. La memoria permanente mantiene los
programas que hacen andar el computador desde el momento que se enciende; en los com-
putadores esta se llama Memoria ROM y es comparable a la memoria permanente del ser
humano. En la memoria temporal, conocida como memoria RAM (Random Access Memory)
es donde se almacenan datos por periodos cortos de tiempo, datos necesarios para calcu-
lar; por ejemplo, la nómina en una empresa (información que es mantenida en la memoria
temporal mientras se está procesando la nómina). Terminado el proceso la información es
borrada de la memoria temporal, quedando libre para poder ser ocupada por la información
de otro proceso, según sea el caso. (Zurdo Sainz, Gutíerrez Tapia, & Acevedo Quero, 2003).
89
89
Como se puede apreciar, del espacio total de la memoria RAM se destina una porción
para almacenar un dato, el cual se puede modificar y de hecho se modifica durante la eje-
cución de un proceso realizado en el computador. El hecho de poder modificar el dato alma-
cenado en una porción o posición de la memoria RAM es lo que da el carácter de variable.
En términos concretos: “una variable es una porción de memoria en la que se almacena un
dato el cual puede ser modificado durante la ejecución de un proceso” (Zurdo Sainz, Gutíe-
rrez Tapia, & Acevedo Quero, 2003).
De manera que para guardar un dato en la memoria RAM hay que hacer uso de un len-
guaje de computador, construido por términos que él comprende y que se convierte en el
medio con el que se puede establecer comunicación con el aparato para decirle lo que se
quiere que haga. Estos términos se llaman instrucciones, sentencias, órdenes o comandos. A
continuación se muestra un ejemplo de cómo funcionaría la memoria RAM, a partir del dato:
X 102
:Esto representa una instrucción de computador que le dice al computador que en la
memoria RAM guarde un valor que corresponde a 102. Gráficamente se puede compren-
der este hecho como se muestra en la figura 15.
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
Es claro que un proceso que se ejecute en el computador manejará de esta forma gran
cantidad de datos y que por lo tanto estos están almacenados en muchas variables en la
RAM. Cualquier procesamiento que se le pide al computador que haga con la información
almacenada en la RAM, se hace usando instrucciones escritas en un lenguaje de compu-
tador. A este conjunto de instrucciones se le conoce como programa de computador y es
la carta de ruta que él utiliza para poder resolver las tareas, procesos o procedimientos
encomendados (Arboleda, 2005).
Si en la memoria RAM se tiene almacenado el dato 93, será guardado no en una celdi-
lla como un valor 93 en el sistema numérico decimal, sino en varias celdillas, ya que el 93
en sistema binario equivale a escribir 1011101. Cada uno de los bits que conforman el valor
es guardado en cada celdilla.
Es claro que dada la naturaleza y la forma en que están construidos los dispositivos
del computador, estos manejan el sistema numérico binario. El usuario suministra infor-
mación de diferentes formas; y esta es convertida en información binaria y así es pro-
cesada. Los resultados son presentados al usuario, pero no en binario; sino en formatos
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
Para representar un dato entero se toma una porción de RAM, es decir, se toma una
cantidad de bits, por ejemplo 8, los cuales representan el valor del dato entero alma-
cenado en ella. Dicho de otro modo, esto corresponde con la definición del dato que
guardará una variable en la memoria del computador. Esquemáticamente se vería
así: (Ver figura 16)
Figura 16. Representación en RAM de un entero en formato de
signo y magnitud con 8 bits.
0 1 1 0 0 1 1 0
* 20 = 0
* 21 = 2
* 22 = 4
* 23 = 0
* 24 = 0
* 25 = 32
* 26 = 64
Bit de signo. Número positivo 102
Es una definición de tipo de dato para una variable de la misma manera que la del formato
de 8 bits, la diferencia radica en el tamaño de la porción de memoria que se destina para
almacenar el dato (16 bits), por tanto, el rango de valores para datos de este formato es
desde –215+1 hasta 215-1, es decir, de –32.767 a 32.767. La figura 17 muestra el contenido de
una variable de tipo entero que almacena el valor correspondiente a 26214. (Ver Figura 17)
Figura 17. Descripción en memoria de un dato entero en
formato de signo y magnitud con 16 bits.
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
Representa valores desde –231+1 a 231-1, desde -2147483647 hasta 214483647. El tamaño de
la porción de memoria es más grande, de 32 bits (Ver figura 18).
A continuación, se muestra una tabla en donde dependiendo del formato se ven los
valores extremos. (Ver tabla 9).
Tabla 9. Rango de números enteros con signo en diversos formatos.
Para representar datos en formato de números reales se utiliza la notación exponencial nor-
malizada. Esta notación consta de 3 elementos: la parte entera o la fraccionaria denominada
la mantisa, la base y el exponente. Esta representación permite expresar números con mantisa
entera o con mantisa fraccionaria como se puede ver a continuación con el valor 34523.152.
Los números reales en la memoria RAM de los computadores se divide en tres partes
(IEEE, 2017) o campos así:
En el ejemplo se puede ver que el número (en binario) está formado por 32 bits, de los
cuales el primero representa el signo del número (0 para número positivo, 1 para números
negativos), los 11 siguientes bits representan el exponente o característica y los 21 bits res-
tantes corresponden a la representación de la mantisa.
Ahora, hay varias formas de representación de estos números que depende directa-
mente de la computadora que se tenga. Existen longitudes de formatos de 16, 32, 64, 128
con exponentes que pueden ir de 7 a 11 bits. Por tanto, el tamaño de la mantisa se calcula
en función del tamaño del exponente y la longitud del formato, así que:
Base binaria
Para transformar la parte entera del número hay que hacer divisiones sucesivas por
dos hasta que el cociente que se calcule sea cero, así:
2 5 2
-2 1 2 2
0 5 -1 2 6 2
-4 -6 3 2
0
0 -2 1 2
1
-0 0
1
1
Ahora, tomando los residuos desde el último hasta el primero, se consigue que el
equivalente de 2510 es 110012. A continuación, se debe convertir la parte decimal o la frac-
ción del número. Se transforma multiplicando 0.625 por dos sucesivamente, así:
0 . 6 2 5 * 2 = 1 . 2 5
0 . 2 5 0 * 2 = 0 . 5 0
0 . 5 0 0 * 2 = 1 . 0 0
0 . 0 0 0 * 2 = 0 . 0 0
Como se puede ver, el procedimiento para convertir una fracción decimal a su corres-
pondiente en binarios, consiste en tomar la fracción y multiplicarla por dos. Al resultado
que da se le toma la parte fraccionaria y se vuelve a multiplicar por dos. Así sucesivamente
hasta obtener ceros o un número significativo de unos y ceros para conformar la fracción
binaria equivalente a decimal dado. Entonces el equivalente de 0.62510 es 0.10102. Resultado
que se obtiene tomando los unos y los ceros productos de las multiplicaciones en el sen-
tido que indica la flecha. La transformación completa del número es:
25.62510 = 11001.10102
11001.1010 = 0.110011010*25
El tercer paso es considerar el signo del número, que para el ejemplo es 1 ya que este 97
es negativo. 97
1 3 3 2
-1 2 6 6 2
1 3 -6 3 3 2
-1 2 0 6 -2 1 6 2
-1 6 8 2
1 1 3
-1 2 0 -8 4 2
1 -4 2 2
0
0 -2 1 2
0 0 0
1
Mantisa = 32 – 8 – 1 = 23
11001101000000000000000
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
El sexto paso consiste en verificar el signo del número. Como el número es negativo se
calcula el complemento a 1 de la mantisa, con lo que se tiene:
00110010111111111111111
11000010100110010111111111111111
De esta colección de unos y ceros se puede decir que el primer bit es el signo del nú-
mero. Del bit 2 al 9 es la representación del exponente. Del bit 10 en adelante son los bits
de la mantisa en complemento a uno por ser el número negativo.
Fuente: PASCUAL LOPERA, Gonzalo. Estructuras de información. McGraw-Hill 1992 (p. 31).
Tabla 11. Número de precisión doble (64 Bits)
Fuente: PASCUAL LOPERA, Gonzalo. Estructuras de información. McGraw-Hill 1992 (p. 31).
Fuente: PASCUAL LOPERA, Gonzalo. Estructuras de información. McGraw-Hill 1992 (p. 44).
110001
Es evidente que en este código los 2 primeros bits corresponden a los que se denomi-
na la zona. Los 4 restantes corresponden a los bits numéricos, según la tabla 12, esto es:
Figura 19. Representación en código BCD de la letra A.
números binarios y que al convertir al sistema numérico decimal se obtendría el valor 49,
así:
1 1 0 0 0 1
* 20 = 1
* 21 = 0
* 22 = 0
* 23 = 0
* 24 = 16
* 2 =
5
32
49
Ahora, a partir de esta codificación de las letras, números, signos y símbolos se pueden
almacenar en la memoria del computador datos, obviamente codificados. Un ejemplo sería la
palabra carro que se codificaría así::
C A R R O
110011 110001 101001 101001 100110
Lo que daría un conjunto de ceros y unos que representarían la palabra carro, así:
110011110001101001101001100110
Izqui. 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
Derec. 0 1 2 3 4 5 6 7 8 9 A B C D E F
0000 NULL SP 0 @ P ` p € ° À Ð à Ð
0 0 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240
0001 DCI ! 1 A Q a q ‘ ¡ ± Á Ñ á Ñ
1 1 17 33 49 65 81 97 113 129 145 161 177 193 209 225 241
0010 DC2 “ 2 B R b r ‚ ’ ¢ ² Â Ò â Ò
2 2 18 34 50 66 82 98 114 130 146 162 178 194 210 226 242
0011 DC3 # 3 C S c s Ƒ “ £ ³ Ã Ó ã Ó
3 3 19 35 51 67 83 99 115 131 147 163 179 195 211 227 243
0100 DC4 $ 4 D T d t „ ” ¤ ´ Ä Ô ä Ô
4 4 20 36 52 68 84 100 116 132 148 164 180 196 212 228 244
0101 § % 5 E U e u … • ¥ µ Å Õ å Õ
5 5 21 37 53 69 85 101 117 133 149 165 181 197 213 229 245
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
0110 & 6 F V f v † – ¦ ¶ Æ Ö æ Ö
6 6 22 38 54 70 86 102 118 134 150 166 182 198 214 230 246
0111 BEL ‘ 7 G W g w ‡ — § · Ç × ç ÷
7 7 23 39 55 71 87 103 119 135 151 167 183 199 215 231 247
1000 BS CAN ( 8 H X h x ˆ ˜ ¨ ¸ È Ø è Ø
8 8 24 40 56 72 88 104 120 136 152 168 184 200 216 232 248
1001 HT EM ) 9 I Y i y ‰ ™ © ¹ É Ù é Ù
9 9 25 41 57 73 89 105 121 137 153 169 185 201 217 233 249
1010 LF * : J Z j z Š Š ª º Ê Ú ê Ú
A 10 26 42 58 74 90 106 122 138 154 170 186 202 218 234 250
1011 VT ESC + ; K [ k { ‹ › « » Ë Û ë Û
B 11 27 43 59 75 91 107 123 139 155 171 187 203 219 235 251
1100 FF FS ‘ < L \ l | Œ Œ ¬ ¼ Ì Ü ì Ü
C 12 28 44 60 76 92 108 124 140 156 172 188 204 220 236 252
1101 CR - = M ] m } ½ Í Ý í Ý
D 13 29 45 61 77 93 109 125 141 157 173 189 205 221 237 253
1110 SO . > N ^ N ~ Ž Ž ® ¾ Î Þ î Þ
E 14 30 46 62 78 94 110 126 142 158 174 190 206 222 238 254
1111 SI / ? O _ o Ÿ ¯ ¿ Ï ß ï Ÿ
F 15 31 47 63 79 95 111 127 143 159 175 191 207 223 239 255
Fuente: PASCUAL LOPERA, Gonzalo. Estructuras de información. McGraw-Hill 1992. (p. 48)
Figura 20. Conformación del binario para la letra A en código ASCII.
C A R R O
0100001101000001010100100011001001001111
103
103
En general, se pueden distinguir dos tipos de datos alfanuméricos: unos los datos de
tipo carácter que son datos de un único carácter; por otro lado, los datos de tipo cade-
na de caracteres o string que son datos con una serie de caracteres. La organización de
las cadenas de caracteres, no solamente es la serie de caracteres que la conforma, sino
que deben estar delimitadas (para su fácil identificación por parte del computador), por
comillas dobles. Por lo cual, para el caso de la cadena Los gatos de la casa, para que sea
reconocida por el computador como un dato, se debe encerrar entre comillas dobles, así:
“Los gatos de la casa”.
2.4.1. La definición
Tal como se expuso en los numerales anteriores, los datos que el computador maneja de-
ben estar almacenados en su memoria y el proceso para que queden allí guardados es los
que se conoce como una asignación de memoria. Desde el punto de vista gráfico (figura
21), se puede ver como se muestra a continuación:
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
La palabra “Dato” es la forma con que el computador identifica el número 512 que está
almacenado en la RAM en un determinado espacio, el cual el mismo computador determi-
na automáticamente de acuerdo con el tipo de dato que se va a manejar. En otras palabras,
“Dato” identifica a un valor (512) que está en la RAM. Como se ve, el valor almacenado
en la RAM es una secuencia de unos y ceros que representan el valor 512 en el sistema
numérico binario. De tal modo que es 512 para los usuarios del computador y 1000000000
para el computador.
Al escribir los identificadores se deben seguir ciertas reglas para que el computador
pueda fácilmente determinar que se trata de un nombre que hace expresa referencia a
información almacenada en su memoria. Estas reglas se conocen como reglas algorítmicas
para escritura de identificadores (Joyanes Aguilar, 1996), y son:
· El identificador debe comenzar con una letra.
• Después de la primera letra del nombre del identificador se puede escribir única-
mente una secuencia de letras o números (caracteres alfanuméricos), también es
válido el subrayado (_).
• Los nombres asignados para ser identificadores deben ser nemónicos o nemotéc-
nicos, esto es que el nombre tenga relación con el dato al que identifica o al valor
asignado a él.
165 + 45
Fuente: PASCUAL LOPERA, Gonzalo. Estructuras de información. McGraw-Hill 1992. (p. 57)
Los operadores aritméticos solo se pueden aplicar a datos de tipo numérico, esto es,
a datos enteros y reales. Todos los operadores aritméticos son binarios, es decir que se
requiere de dos números (operandos) para poder realizar la operación.
2.5.2. Operadores de relación
Los operadores relacionales o de relación son aquellos que se utilizan para expresar con-
diciones: ‘>’ es un operador relacional, ya que describe una posible relación entre dos
datos que se encuentran almacenados en la memoria del computador, es decir, supóngase
que se tienen dos datos identificados por las variables A y B, entonces se puede expresar
el posible hecho que A > B (A mayor que B) (Becerra Santamaría, 2001). En la tabla 15 se
presenta la lista de operadores de relación.
Operador Significado
() Orden de procedencia
= Igual
<> Diferente a (Distinto)
<= Menor o igual que
>= Mayor o igual que
> Mayor que
< Menor que
107
El formato general de la comparación es: 107
Y el resultado de la operación será verdadero o falso. Así, por ejemplo, si de alguna ma-
nera se almacena un 524 en la memoria del computador al que identificamos por medio
del nombre de variable NUM1 y, posteriormente se guarda un 123 al que identificamos con
el nombre variable NUM2, entonces se pueden comparar escribiendo:
Lo que daría como resultado “Verdadero”, ya que es cierto que el valor 524 es mayor
que 123 que son los valores identificados por NUM1 Y NUM2. De la misma forma la nota-
ción: (Num1/2-490) > (Num2*2-10), da como resultado “Falso”, ya que 524/2 es 262, menos
490 dará -228, por lo tanto es menor a 236, que se obtiene de calcular 123 * 2 - 10.
1
Según el lenguaje de programación se usa ^ o ** para repre-
sentar la potencia.
2
Según el lenguaje de programación se usa Div, \ o % para
representar la división entera.
denominada expresión aritmética. Si se tiene en cuenta el formato general de la compara-
ción descrito más arriba, éste hace referencia a que se relaciona una expresión 1 con una
expresión 2. Es claro entonces, que una expresión puede ser una variable o una combina-
ción de variables y operadores o expresiones.
De igual forma se trabaja con los demás operadores de relación y se pueden aplicar a
los cuatro tipos de datos: enteros, reales, alfanuméricos y lógicos. Al igual que los opera-
dores aritméticos, los operadores de relación también son binarios.
Operador Expresión
Significado
lógico lógica
Negación de P; Not P es falso si P es ver-
NOT (no) NOT P
dadero. Not P es verdadero si P es falso.
Conjunción de P y Q. P AND Q es ver-
AND (y) P AND Q dadera si P y Q son verdaderos los
dos. Falso en otro caso.
Disyunción de P o Q; P OR Q es ver-
OR (o) P OR Q dadera si la P o la Q son Verdaderas.
Falso en otro caso.
Fuente: PASCUAL LOPERA, Gonzalo. Estructuras de información. McGraw-Hill 1992. (p. 71)
P será cierta si efectivamente los carros vienen de Bogotá, en cuyo caso el enunciado
concuerda con los hechos. En caso contrario el enunciado tendrá un valor de falsedad.
Otro ejemplo, a partir de una ecuación, puede ser darle el valor a la proposición P de:
P: (X < 6.5)
DATO 512
La que significa que en la variable DATO queda almacenado el valor 512. El mecanismo
u operación de asignación es destructivo ya que al almacenar un nuevo valor en la varia-
ble se borra el que tenía antes.
X 5 X almacena el valor 5
A X A almacena el valor 5
Por la manera como opera el computador, toma una a una las instrucciones para
interpretarlas en el sentido de arriba hacia abajo. Lo anterior da a entender que primero
se guarda en X un 5, luego se guarda un 5 en A (el valor que guarda X), posteriormente se
guarda un 17 en X, el anterior valor de 5 en X se pierde y es reemplazado por el 17, según se
aprecia en el conjunto de instrucciones. A este hecho se conoce como el flujo de ejecución
de las instrucciones para el computador o flujo de ejecución del programa.
Es posible utilizar el mismo nombre de variable en ambos lados del operador de asig-
nación, por ello son perfectamente válidas instrucciones como:
SUELDO SUELDO + 45
SUELDO = SUELDO + 45
2.6. EXPRESIONES
Como lo expresa César Beccera Santamaría en Lenguaje C, el nuevo concepto expone que
cuando se enfrenta el problema de programar computadores, a lo que se está enfrentando
realmente es a suministrar una serie de órdenes, comandos, instrucciones o sentencias
111
que el computador interpreta y ejecuta para realizar una determinada labor (Becerra San-
111
tamaría, 2001). El hecho de dar al computador un proceso detallado en órdenes, comandos,
instrucciones o sentencias, manifiesta la actitud clara comunicativa entre el usuario y el
computador, como tal, este proceso involucra elementos de un lenguaje para que ambos
puedan entenderse.
Un lenguaje natural como el español, permite a los seres humanos establecer inter-
cambio de ideas y pensamientos (entre ellos impartir instrucciones para ejecutar tareas)
las cuales pueden ser dadas por escrito, es decir codificadas a través de signos como
vocales y consonantes, que unidos correctamente representan ideas, de tal manera que
son comprensibles para quien las interpreta facilitando la comunicación. Para acomodar
correctamente todos estos símbolos existe una serie de reglas y normas y todo este
conjunto es lo que llamamos un lenguaje natural.
En términos de la computación ocurre igual, pues existe un lenguaje que permite que
los usuarios se comuniquen con el computador de forma clara y él interprete las órdenes
que expresan una tarea o procedimiento; éste se conoce como lenguaje artificial o lenguaje
de programación de computadores y como cualquier otro tiene reglas claramente definidas.
Este lenguaje, así como en el natural, se parte de unos símbolos básicos para poder construir
su escritura, pero en lugar de consonantes y vocales, los símbolos básicos que utiliza son las
constantes, las variables y los operadores.
Con las constantes, las variables y los operadores se forman expresiones que tienen
significado para el computador (igual que las palabras en el español) y que definen a partir
de ellas instrucciones o comandos que conforman tareas o procesos. Entonces, por ejemplo,
para escribir las instrucciones que le digan al computador que sume los números 512 y 1024,
se debe escribir:
1 NUMERO1 = 512
2 NUMERO2 = 1024
Es claro que se está expresando o comunicando una actividad que tiene que realizar el
computador. Y son a estos comandos, órdenes, sentencias o instrucciones a los que se llama
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
expresiones. En las dos primeras asignaciones del ejemplo anterior lo que se le expresa al
computador es que almacene dos números en su memoria, la tercera asignación expresa o
dice que tiene que sumar los dos valores que se encuentran almacenados en la memoria y
que el resultado de este proceso lo almacene también en la memoria, pero dentro de una
variable que se llama SUMA. Gráficamente se vería así (ver figura 22):
Dependiendo de los tipos de datos que se involucren en las expresiones así mismo
serán los resultados y las expresiones que se manejen.
2.6.1 Expresiones aritméticas
Son las que involucran constantes, variables, operadores aritméticos. Ejemplo:
E x p re s i ó n Re s u l ta d o
X = 32 2 + 6 3 7 9 59
Y = 4 . 5 + 432 43 6 . 5
Z = 45 .1 - 5 4 . 87 -9 . 7 7
El operador `/` produce resultado real con independencia del tipo de operando. Ejemplo:
E x p re s i ó n Re s u l ta d o
3 2 5/5 6 5 .0
32 5 .0 /5 6 5 .0
3 2 5/5 .0 6 5 .0
32 5 .0 /5 .0 6 5 .0
En las operaciones con Div y Mod los operadores deben ser enteros. Ejemplo:
E x p re s i ó n Re s u l ta d o
3 7 D i v 7 5
3 7 M o d 7 2
113
113
E x p re s i ó n Re s u l ta d o
0 D i v 3 0
0 M o d 3 0
Se entiende que Div y Mod reportan cociente entero y residuo entero, esto es:
3 7 7
3 5 5 Co c i e n te
Re s i d u o 2
Se deben destruir paréntesis, si en la expresión los hay, de acuerdo con las leyes aso-
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
ciativas de las matemáticas, esto es, de los más internos a los más externos.
Para evaluar una expresión aritmética se deben ejecutar las operaciones de acuerdo
al orden establecido en la tabla 18. Teniendo siempre en cuenta ejecutar primero los de
mayor prioridad o jerarquía.
Según las reglas se deben destruir los paréntesis, pero como en el ejemplo no hay,
esta primera regla no aplica, seguidamente se aplica la regla dos y se calculan primero
las multiplicaciones y las divisiones a que haya lugar en la expresión, pues estas, son de
mayor prioridad que sumas y restas. En el ejemplo, hay que calcular entonces, 2*3 y 15/3.
Como hay dos operaciones que son de la misma jerarquía (* y /) se aplica la regla tres,
esto es, calcular de izquierda a derecha, quedando el proceso de cálculo así:
15 / 3 - 2 * 3 + 9
Pr i m e ra o p e ra c i ó n 5 - 2 * 3 + 9
S e gu n d a o p e ra c i ó n 5 - 6 + 9
Te rce ra o p e ra c i ó n 1 + 9
Cu a r ta o p e ra c i ó n 8
El resultado de la evaluación es 8.
Ejemplo 2. Evaluar: (7 * (85 – 5 ^ 2) Mod 3) – 4 ^ 2 + 8 ^ 2 Div 2 Mod 5
0 - 4 ^ 2 + 8 ^ 2 Div 2 Mod 5
0 - 16 + 8 ^ 2 Div 2 Mod 5
0 - 16 + 64 Div 2 Mod 5
48 Div 2 Mod 5
24 Mod 5
115
4 115
X = X0 + VX0 * T + 1 / 2 * AX * T ^ 2
Es obvio que para poder calcular el valor de esta expresión se deben conocer los
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
X0 = 2.56
VX0 = 3400.45
T = 135
AX = 9.8
X = X0 + VX0 * T + 1 / 2 * AX * T ^ 2
x = 459063.31 + 89302.5
x = 548365.81
117
117
Este es el valor de respuesta almacenado en X. Dentro de la memoria del computador
retendría los datos como se ilustra en la siguiente gráfica:
Operador Prioridad
() Más alta (Primero que se ejecuta)
^
*,/
+,-
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
Div, Mod
=,<>,>,<,>=,<=
Not
And
Or Más Baja (último que se ejecuta)
1 X=4
2 Y = -5
3 Z=X>Y
Y = -5
Z=X>Y
Desde el punto de vista de lo que está sucediendo dentro de la memoria del com-
putador, con la primera instrucción se cargaría la memoria con 4, así:
119
119
Como Z tiene un cero indica que el computador calculó un valor de verdadero para la
expresión número 3 de este ejemplo.
En el ejemplo cada una de las expresiones se numeró para poderlas identificar fácil-
mente, además para resaltar el orden en que el computador ejecuta cada una de ellas.
Esta secuencia de instrucciones es un programa de computador.
Ejemplo 5. Evaluar:
1X =3
2 Y = -120
3 Z = 32
4W =0
N = True OR True
N = True
• Concatenación
• Comparación
• Subcadenas
• Longitud
1 NOMBRE = “Galileo”
2 APELLIDO = “Galilei”
Es importante tener en cuenta que al unir las dos cadenas se produce una nueva ca-
dena que contiene las dos palabras, pero unidas, es decir, que entre la palabra Galileo y
la palabra Galilei no hay espacio. Lo anterior indica que hay que corregir el programa del
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
ejemplo para que el resultado sea acorde a la necesidad (tener una cadena con el nombre
y el apellido separados). Esto es:
1 NOMBRE = “Galileo”
2 APELLIDO = “Galilei”
En el ejemplo corregido se colocó una cadena que consta de un espacio para que
al concatenar las tres cadenas se produzca una cadena contenida en la variable NOM-
BRE_COMPLETO con las dos palabras separadas por un espacio en blanco, es decir, “Galileo
Galilei”..
Ejemplo 7. Evaluar:
1 NUM = “1000”
2 TEXTO1 = “Las”
3 TEXTO2 = “Noches”
Ejemplo 8. Evaluar:
1 DATO1 = JOSE
2 DATO2 = JULIO
Ejemplo 9. Evaluar:
1 NUM = “342”
Es una cadena a la que se denominará la cadena principal. Una parte de esta cadena
que se considera como una subcadena podría ser:
“juegan en el parque”
hay que consultar la documentación o los manuales de cada lenguaje para ver clara-
mente cómo es el uso, la sintaxis y las particularidades de la función. La descripción
que se hace del empleo de la concatenación es aplicable, sin muchas variaciones en
los lenguajes C, Visual Basic, java, Python y JavaScript en la forma como se entiende el
proceso, pero la sintaxis si se debe consultar en la documentación de cada lenguaje.
1 ANGULO = 2.89
2 VALOR_SENO = sin(ANGULO)
Lo anterior le dice al computador que a partir del valor almacenado en la variable ANGULO
(la variable ANGULO es lo que se denomina el argumento o parámetro de la función) calcule el
valor del seno y que la respuesta la almacene en la variable VALOR_SENO que para el ejemplo el
valor calculado será 0,05041862. Más adelante, en el apartado de “Funciones Internas” se hablará
con más detalle de estas funciones.
Ahora bien, sin() es una función de las muchas que se pueden usar en los lenguajes de
programación de computadores. En este conjunto de funciones se encuentra Mid() que permite
obtener a partir de una cadena dada una subcadena. Para el ejemplo trabajado:
Este programa le dice al computador que primero guarde en la variable CAD la cadena
principal “pienso luego existo”, segundo, que guarde en la variable SUBCAD la subcadena
“luego”. Entre los paréntesis que acompañan la función se deben escribir 3 parámetros: el
primero debe ser una cadena o una expresión de cadena; en el segundo debe escribirse un
número que le dice al computador a partir de cuál carácter se quiere obtener la subcade- 125
na y en el tercer parámetro debe escribirse un número que le dice al computador cuántos 125
caracteres debe tomar, contados a partir de la posición indicada por el segundo parámetro.
2 INICIO = 1
3 CANTIDAD = 9
5 INICIO = 11
6 CANTIDAD = 17
8 INICIO = 29
9 CANTIDAD = 21
1 INI = 5
2 CANTIDAD = 6
2.6.3.4. Longitud
La longitud de una cadena es el número de caracteres que se encuentran delimitados
por los separadores comillas dobles (“”). Entre los separadores las cadenas pueden
incluir letras, números, signos o símbolos, es decir, cualquier carácter que se necesite,
excluyendo, claro está, las comillas dobles. La función que permite calcular la longitud de
una cadena es Len().
Ejemplo 14. Evaluar:
127
Función Descripción Uso
127
Devuelve un valor
del mismo tipo que
el que se pasó como N = abs (50.3); se almacena en N 50.3
abs(número)
parámetro y que N = abs (-50.3); se almacena en N 50.3
especifica el valor ab-
soluto de un número.
Devuelve el ángulo C = 0.70710678118654; Valor coseno π/4 (45
acos(número) cuyo coseno es el grados)
número especificado. A = acos (C); Devuelve π/4
Devuelve el ángulo S = 0.70710678118654; Valor seno π/4 (45
asin(número) cuyo seno es el nú- Grados)
mero especificado. A = asin (S); Devuelve π/4 grados
Devuelve un dato de
tipo real que especi-
atan(número) Valor_PI = 4 * atan(1);
fica el arco tangente
de un número.
Devuelve un dato de
tipo real que espe- A = 1.3; Ángulo en radianes
cos(número)
cifica el coseno de S = 1 / cos(A); Da la secante
un ángulo.
Devuelve un dato
de tipo string que C = char(65); Devuelve A
contiene el caracter C = char(97); Devuelve a
char(codigocar)
asociado con el C = char(62); Devuelve >
código de caracter C = char(37); Devuelve %
especificado.
Devuelve un dato de
tipo real que espe-
cífica e (la base de A = 1.3;
exp(número)
los logaritmos natu- Seno_Hip = (exp(A) - exp(-1 * A)) / 2;
rales) elevado a una
potencia (ex).
N = 45; Número dado
Devuelve un número
L = log(N); Devuelve 3.80666249
de tipo real que es-
M = 2.718281828; Constante e
log(número) pecifica el logaritmo
L = log(M); Devuelve 1
natural o neperiano
L = log(exp(N)); Devuelve 45
del número dado.
L = log(N) / log(10); Logaritmo base 10 de N
Devuelve un número P= 4.5;
pow(base, que representa la B= 2.1;
potencia) base elevado a la R = pow(B, P) Devuelve
potencia BP 28.1829744098
Devuelve un núme- LS = 50;
ro de tipo real que LI = 10;
rand()
contiene un número N = rand() % (LS-LI +1)+LI Da un número de [10,
aleatorio. 50]
P = 3.14159284;
Devuelve un número V = round(P); V contiene 3.14
redondeado a un V = round(P, 4); V contiene 3.1416
round (número) número especificado P = -3.14159284;
de posiciones deci- V = round(P, 5); V contiene -3.14159
males. V = round(P, 6); V contiene -3.141593
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
Descripción Procedimiento
Para calcular el
char C = ‘A’;
código ASCII de
int N = (int)C; En N queda guardado 65
un caracter dado.
Para calcular
el caracter de Int N = 65;
un código ASCII char C = (char)N; En C queda guardado la letra A
dado.
Obtener la sub-
string C=”Demostración función Mid”;
cadena de la
int N=12;
izquierda de una
P = C.substr(0, N); Devuelve “Demostración”
cadena dada
Obtener la sub-
string C=“Demostración función Mid”;
cadena de la
int N=13;
derecha de una
M = C.substr(N); Devuelve “función Mid”
cadena dada
Trucar los de- 129
double a = 1234.542334;
cimales de un
varo real
int b = (int)a; Devuelve 1234 129
número.
Devuelve un núme- String C=” Demostración función Mid”;
Obj.substring(ini- ro especificado de P = C.substring(0, 11); Devuelve “Demostración”
cio [,cant]) caracteres de una U = C.substring(21, 3); Devuelve “Mid”
cadena. M = C.substring(13); Devuelve “función Mid”
Devuelve un núme-
ro de tipo real que A = 1.3; Define ángulo en radianes
tan(número)
especifica la tan- C = 1 / Math.tan(A); Calcula la cotangente
gente de un ángulo.
Obtener en número π.
Además, existe una forma de poder hacer este trabajo usando otros recursos del lenguaje.
Los procesos se muestran a continuación (Ver tabla 25):
Tabla 25. Procedimiento para el cálculo de algunos datos en Java
Descripción Procedimiento
Para calcular el
char C = ‘A’;
código ASCII de
int N = (int)C; En N queda guardado 65
un caracter dado.
Para calcular
el caracter de Int N = 65;
un código ASCII char C = (char)N; En C queda guardado la letra A
dado.
Obtener la sub- string C=”Demostración función Mid”;
cadena de la int N=12;
izquierda de una P = C.substring(0, N); Devuelve “Demostra-
cadena dada ción”
Obtener la sub- string C=”Demostración función Mid”;
cadena de la int N=13;
derecha de una M = C.substring(N); Devuelve “función
cadena dada Mid”
double a = 1234.542334;
Trucar los deci- int b = (int)a; Devuelve 1234
males de un varo d = 3;
133
real c = Math.pow(10.0,d); 133
e = int(c*a) / c; Devuelve 1234.542
Obtener el nú- p = Math.PI; Devuelve
mero π. 3.141592653589793
potencia (ex).
Devuelve la par-
te entera de un N = int(99.8) Devuelve 99
int(número) número, es decir, N = int(-99.8) Devuelve -99
quita los decima- N = int(-99.2) Devuelve -100
les de un número.
Devuelve un dato
de tipo Long
que contiene el C = “Hola a todos” Inicializa la cadenas
len(cadena)
número de ca- ML = len(C) Devuelve 12
racteres en una
cadena.
Devuelve un nú- N = 45 Número dado
mero de tipo real L = log(N) Devuelve 3.80666249
que especifica el M = 2.718281828 Constante e
log(número)
logaritmo natural L = log(M) Devuelve 1
o neperiano del L = log(exp(N)) Devuelve 45
número dado. L = log(N) / log(10) Logaritmo base 10 de N
Devuelve un dato
de tipo entero
que representa
el código del N = ord(“A”) Devuelve 65
ord (cadena)
caracter corres- N = ord(“a”) Devuelve 97
pondiente a la
primera letra de
una cadena.
Devuelve un P= 4.5
número que re- B= 2.1
pow(base, po-
presenta la base R = pow(B, P) Devuelve
tencia)
elevado a la po- 28.1829744098
tencia BP
NPI = 3.14159284
Devuelve un nú-
V = round(NPI, 2) V contiene 3.14
mero redondeado
V = round(NPI, 4) V contiene 3.1416
round(expre- a un número
NPI = -3.14159284
sión[, dec]) especificado de
V = round(NPI, 5) V contiene -3.14159
posiciones deci-
V = round(NPI, 6) V contiene -3.141593
males.
V = round(NPI, 0) V contiene -3
Devuelve un nú- LS = 50
mero de tipo real LI = 10
random()
que contiene un N =int((LS-LI+1)*random.random()+LI) Da número
número aleatorio. de [10,50]
Devuelve un nú-
mero de tipo real A = 1.3 Define ángulo en
sin(número) que especifica radianes
el seno de un C = 1 / sin(A) Calcula la cosecante
ángulo.
Devuelve un nú-
R = sqr(4) Devuelve 2
mero de tipo real
R = sqr(23) Devuelve 4.7958315233
sqrt(número) que especifica la
R = sqr(0) Devuelve 0
raíz cuadrada de
R = sqr(-4) Genera un error
un número.
Devuelve un nú-
mero de tipo real
A = 1.3 Define ángulo en radianes
tan(número) que especifica la
C = 1 / tan(A) Calcula la cotangente
tangente de un
ángulo.
a = 1324343032.324325235
Devuelve un
b = trunc(a) Devuelve 1324343032
número que co-
d=3
trunc(número) rresponde con la
c = pow(10.0, d)
parte entera de
e = trunc(c*a) / c Devuelve
un valor real.
1324343032.324
Obtener en número π.
Pero existe una forma de poder hacer este trabajo usando otros recursos del lenguaje
(Ocadiz Mendoza, 2013). Los procesos se muestran en la tabla a continuación.
Descripción Procedimiento
Obtener la sub-
C = “Hola a todos los de la clase”
cadena desde
int M=9;
una punto a
int N= 16;
otros de una
P = C[M:N] Devuelve “dos lo”
cadena dada
Obtener la sub-
C = “Hola a todos los de la clase”
cadena de la
int N=10;
izquierda de una
P = C[:N] Devuelve “Hola a tod”
cadena dada
Obtener la sub-
string C=”Hola a todos los de la clase”;
cadena de la
int N= -10;
derecha de una
M = C[N:] Devuelve “los de la clase”
cadena dada
Obtener el nú-
p = math.pi; Devuelve 3.141592653589793
mero π.
2.7.5. Funciones internas en lenguaje JavaScript
Obtener en número π.
Sin embargo, existe una forma de poder hacer este trabajo usando otros recursos del
lenguaje, como se muestra a continuación (Ver tabla 29):
Tabla 29. Procedimiento para el cálculo de algunos datos en JavaScript
Descripción Procedimiento
Para calcular el C = “Hola mundo”;
código ASCII de N = C.charCodeAt(0); En N queda guardado
un caracter dado. 72
Para calcular
n = 65;
el caracter de
C = String.fromCharCode(N); En C queda guardado
un código ASCII
la letra A
dado.
Obtener la sub-
String C=”Demostración función Mid”;
cadena de la
int N=11;
izquierda de una
P = C.substr(0, N); Devuelve “Demostración”
cadena dada
Obtener la sub-
String C=”Demostración función Mid”;
cadena de la
int N=13;
derecha de una
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
Pero existe una forma de poder hacer este trabajo usando otros recursos del
lenguaje (Achour, Friedhelm, & Otros, 2018). Los procesos se muestran a conti-
nuación:
Obtener la sub-
$C = “Demostración función Mid”;
cadena de la
$N = 12;
izquierda de una
$P = substr($C, 0, $N); Devuelve “Demostración”
cadena dada
Obtener la sub-
$C = “Demostración función Mid”;
cadena de la
$N = - 11;
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
derecha de una
$M = substr($C, $N); Devuelve “función Mid”
cadena dada
$a = 1234.542334;
Trucar los de-
$b = 3
cimales de un
$c = pow(10.0,$b)
valor real
$e = ((int) ($a*$c)) / $c Devuelve 1234.542
EXP(LOG(X)) - X
ABS(EXP(LOG(X))- X)
ABS(EXP(LOG(X)) - X) * SIN(X * Y)
Lenguaje Traducción
Lenguaje C++ pow(cos(X) - sin(Y), 2);
Visual Basic sqr(cos(X) - sin(Y))
Java Math.pow(Math.cos(X) - Math.sin(Y), 2);
Python pow(cos(X) - sin(Y), 2)
JavaScript Math.pow(Math.cos(X) - Math.sin(Y), 2);
PHP pow(cos($X) - sin($Y), 2);
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
Lenguaje Traducción
Lenguaje C++ abs(exp(log(X))-X)*sin(X*Y)/pow(cos(X)-sin(Y),2)
Visual Basic ABS(EXP(LOG(X))-X)*SIN(X*Y)/SQR(COS(X)-SIN(Y))
Java Math.abs(Math.exp(Math.log(X))-X) * Math.sin(X*Y)/Math.
pow(Math.cos(X)-Math.sin(Y),2);
Python abs(exp(log(X))- X) * sin(X*Y)/pow(cos(X) – sin(Y),2)
JavaScript Math.abs(Math.exp(Math.log(X))-X) * Math.sin(X*Y)/Math.
pow(Math.cos(X)-Math.sin(Y),2);
PHP abs(exp(log(X))- X) * sin(X*Y)/pow(cos(X)-sin(Y),2);
Hay que tener en cuenta que la multiplicación entre el valor absoluto y el seno de XY, por
las reglas de prioridad, se ejecuta primero que la división entre el seno de XY y la raíz cuadrada.
Lenguaje Traducción
Lenguaje C++ pow(abs(X*exp(1-X)/Y),1/3);
Visual Basic (ABS(X*EXP(1-X)/Y))^(1/3)
Java Math.pow(Math.abs(X*Math.exp(1-X)/Y),1/3);
Python pow(abs(X*exp(1-X)/Y),1/3)
JavaScript Math.pow(Math.abs(X*Math.exp(1-X)/Y),1/3);
PHP pow(abs($X*exp(1-$X)/$Y),1/3);
Lenguaje Traducción
Lenguaje (pow(abs(X*exp(1-X)/Y),3)+5)/((X+Y)/(1-3,141592))+
C++ 3,141592*pow(X,2);
Visual Basic ((ABS(X*EXP(1-X)/Y))^(1/3)+5)/((X+Y)/(1-3,141592))+3,141592*X^2
a) 518 e) –510.4*1020
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares
b) 45.517 f) 52*1014
c) –518 g) –52*10-24
a) 3,14159265358979 . d) 6.0234578214587
b) 2,71828182845905 e) -0.9109155237854
c) -2342.46532312343 f) 0.000145748141
Escriba los números que dieron como resultado del ejercicio 4 en formato de número real
de 48 bits y exponente de 11 bits.
2. B = 3
3. C = 5.1
4. M = B/CA * b – C^C^B/A/
5. N = C / 4 * 6*M/A^B +C
6. P = M*B/N^B/A + 5.5^(-C^N)
Evaluar las siguientes expresiones:
a) 1 X = -1
2 Y= 2
b) .1 A = “LOS”
2 B = “LAS”
Traduzca las siguientes expresiones algebraicas a sus correspondientes expresiones al- 145
gorítmicas. 145
1
b) H = 3x2 + coseno2 ((2y - 1)3) - xy 5
1 - 3 TETO
TIA
TIO
c) M = TATO 1
2
+
TITA 3
TUTO2 + TITI2
A) Z = sin(X-Y/X^2)/X*log(EXP(X+10))+4*X*Y^0.5/1/Y
B) K = X/Y/4/X^2*3+1*X*Y-X/Y
C) M = X^Y^2*cos(X-Y/tan(x/y+sin(X*Y)-1)+1)
D) A = B^2^C/4/A*2^(B+1*C/4^C)*1^B*C
CAPÍTULO 3
PRINCIPIOS DE PROGRAMACIÓN
01 01
01 01
01
01
Objetivo
Identificar la metodología para la construcción
de programas de computador en la implementa-
ción de algoritmos.
ticos que se caracterizan por encontrar soluciones que son muy probables para una solución.
En este sentido, el autor considera la algoritmia como el estudio de los algoritmos, y dado que
para la solución de algún problema pueden existir varios algoritmos; entonces la algoritmia se
encarga de estudiar cuál de ellos será el mejor dependiendo de algunos factores (las máqui-
nas, el tiempo, el espacio, etc.) implícitos en el uso de los mismos (Brassard & Paul, 1997).
Una misma tarea se puede realizar usando diferentes algoritmos, por ello, Brassard
propone como ejemplo, para realizar una multiplicación cuatro diferentes procedimientos
y con esto llama la atención sobre las diferentes posibilidades al momento de encarar una
solución algorítmica para resolver un problema dado (Brassard & Paul, 1997).
El primer ejemplo se refiere al algoritmo clásico para multiplicar 2 números enteros. A continua-
ción, se muestran dos formas de realizar la multiplicación. Como se podrá notar, son dos algoritmos
para hacer una multiplicación con una pequeña variante, pero fundamentalmente operan con el
mismo método.
5 2 4 6 5 2 4 6
* 4 1 9 * 4 1 9
4 7 2 1 4 2 0 9 8 4
5 2 4 6 5 2 4 6
2 0 9 8 4 4 7 2 1 4
2 1 9 8 0 7 4 2 1 9 8 0 7 4
41 9 5 2 4 6 5 2 4 6
2 0 9 1 0 4 9 2 1 0 4 9 2
1 0 4 2 0 9 8 4
5 2 41 9 6 8
2 6 8 3 9 3 6
1 3 1 6 7 8 7 2 1 6 7 8 7 2
6 3 3 5 7 4 4
3 6 7 1 4 8 8 6 7 1 4 8 8
1 1 3 4 2 9 7 6 1 3 4 2 9 7 6
2 1 9 8 0 7 4
Este método se denomina multiplicación a la rusa y en él no es tan evidente cómo se
logra la respuesta. Se procede así: se colocan los dos factores uno al lado del otro para for-
mar dos columnas, la de la izquierda será la columna uno y la de la derecha la columna dos.
Se toma el valor de la uno y se divide en dos sin calcular decimales y la respuesta se coloca
debajo. Al factor de la columna dos se multiplica por dos y se escribe la respuesta debajo. Se
procede a dividir y multiplicar hasta que el valor de la columna uno llegue a uno. Se cons-
truye una tercera columna con los valores que aparecen en la columna dos siempre que el
valor de la columna uno sea un valor impar. Para obtener la respuesta se suman los valores
de la columna tres. Este algoritmo tiene la ventaja de que no es preciso memorizar ninguna
tabla de multiplicación (Brassard & Paul, 1997).
Otro método para multiplicar números enteros consiste en tomar los factores y ver si el
número de cifras que tiene cada es igual y es potencia de dos. Los factores usados en los
ejemplos de los dos métodos anteriores, son el 5246 y el 419. Uno tiene cuatro cifras y el otro
tres. Al segundo factor se le agrega un cero y con esto se tienen los dos factores (5246 y 0419)
con cuatro cifras. Además, cuatro es potencia de dos. Se cumplen las condiciones iniciales y
por lo tanto se puede proseguir con el procedimiento de la multiplicación (Brassard & Paul,
1997).
Ahora se toman los factores y se dividen cada uno en dos números con la mitad de las 150
cifras, obteniendo cuatro números y se disponen multiplicaciones entre estas mitades como 151
se presenta a continuación.
5 2 * 0 4 = 2 0 8
5 2 * 1 9 = 9 8 8
4 6 * 0 4 = 1 9 8
4 6 * 1 9 = 8 7 4
2 1 9 8 0 7 4
llagar a una solución precisa (Guerequeta Garcia & Vallecillo Moreno, 2000). Al igual que
para Brassarad, Guerequeta manifiesta la independencia del algoritmo de los medios que
permiten su implementación, pero que debe tenerse en cuenta las limitaciones que im-
ponen los dispositivos seleccionados en el momento de implementar un algoritmo como
programa (Brassard & Paul, 1997).
Salidas: El promedio.
3.3. METODOLOGÍA PARA LA CONSTRUCCIÓN DE PROGRAMAS DE CÓM-
PUTO
En su página, la Universidad Nacional expresa que para construir un programa de com-
putadores hay que seguir un proceso que considera, en primera instancia, identificar
que el problema a resolver sea de tipo algorítmico. Una vez realizada esta verificación
se debe construir un algoritmo que resuelva el problema. Posteriormente hacer una
implementación del algoritmo (programa) en un computador determinado. Para termi-
nar, se debe probar el programa en el computador y ver si consigue las soluciones de
acuerdo al problema planteado (Universidad Nacional de Colombia. Dirección Nacional
de Innovación Académica, 2009).
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
Del gráfico anterior se puede ver claramente que hay que especificar las entradas
en términos de cuáles son los datos conocidos precisando sus tipos, dominios y recorri-
dos que usan, describiendo con absoluta precisión las actividades, tareas, procedimientos,
restricciones y condiciones que muestren claramente la relación (fundamentalmente en
términos matemáticos) que transforman los datos de entrada en la información de salida
o respuestas.
156
157
Aquí se han usado una serie de símbolos que corresponden con algunos de los co-
múnmente aceptados y que están estandarizados y normalizados por la ANSI (AMERICAN
NATIONAL STANDARDS INSTITUTE). Se presentan en la tabla 37, registrada a continuación,
los símbolos más usados en la construcción de diagramas de flujo y el conjunto de nor-
mas y reglas que se deben tener en cuenta para la elaboración de diagramas de flujo de
datos (Cairó, 2006)..
Tabla 38. Símbolos ANSI para el diseño de diagramas de flujo.
terminales, a cada caja o símbolo de diagrama de flujo debe entrar una flecha y debe
salir una única flecha. De los símbolos terminales, si es el que está rotulado con la
palabra “Inicio” debe salir una única flecha; si es el símbolo terminal rotulado con la
palabra “Fin” debe llegar una única flecha.
· Al rombo, que es el símbolo para bifurcación de los flujos de secuencias, debe llegar
una única flecha y salir dos, una en un sentido y la otra en otro sentido y la dirección
de flujo es indicada por las palabras SI y NO y se toma de acuerdo con el resultado
de la evaluación de una proposición que se coloca dentro del rombo. Por su parte,
al rombo que se emplea para lo que se denomina decisión múltiple debe llegar una
única flecha y salen muchas dependiendo de la cantidad de alternativas de selec-
ción que se pretende simbolizar. Por otro lado, el rectángulo significa algún tipo de
proceso en la computadora, es decir, un proceso de asignación a realizar (sumar dos
números, calcular el seno de un ángulo, etc.). Mientras que el paralelogramo es un
símbolo de Entrada / Salida(E/S) que representa cualquier tipo de entrada o salida
de información desde y hacia el programa; por ejemplo, entrar datos a la memoria
del computador usando el teclado, imprimir información que está en la memoria que
da como resultado de un proceso, etc.
· Cada símbolo muestra diferentes tipos de operaciones o actividades a ejecutar y el
diagrama de flujo presenta gráficamente la secuencia en la que se deben ejecutar las
acciones, pasos o instrucciones. Las líneas o flechas representan el flujo secuencial
de la lógica del programa.
· Cada diagrama de flujo debe iniciar y terminar con un símbolo terminal.
Desde otro punto de vista, Deitel M. en C / C++ y Java: como programar, expone el pseudo-
código como otro método adecuado para representar algoritmos, consistente en un lenguaje de
especificación de algoritmos. El uso de tal lenguaje hace el paso de codificación final (esto es, la
traducción a un lenguaje de programación) relativamente fácil (Deitel & Deitel, 2004). Según el
autor, el pseudocódigo nació como un lenguaje similar al lenguaje natural y era un medio para
representar básicamente las estructuras de control de programación estructurada. Se considera
un primer borrador, dado que tiene que traducirse posteriormente a un lenguaje de programa-
ción. La ventaja de su uso está en la planificación de un programa, el programador se puede
concentrar en la lógica y en las estructuras de control y no preocuparse de las reglas de un len-
guaje específico. Es también fácil modificar el pseudocódigo si se descubren errores o anomalías
en la lógica del programa, además es relativamente simple su traducción a lenguajes como Pascal,
C++, FORTRAN, Java, Python o Visual Basic. El pseudocódigo utiliza palabras sucesivas para represen-
tar las acciones reservadas (similares a sus homónimos en los lenguajes de programación), tales
como inicio, fin, si – entonces - sino, mientras, repita - hasta, etc. La escritura del pseudocódigo exige
normalmente la indentación (sangría en el margen izquierdo) de diferentes líneas. La representa-
ción del algoritmo de la figura 31 en pseudocódigo es el siguiente:
1 Inicio
2 // Programa para calcular el neto a pagar
3 Leer nombre, horas, precio
4 bruto = horas * precio
5 tasa = 0.25 * bruto
6 neto = bruto – tasa
7 Escribir nombre, bruto, tasa, neto
8 Fin
El algoritmo siempre comienza con la palabra “Inicio” y finaliza con la palabra “Fin”. Entre
160
estas palabras, se escriben, en cada línea, las instrucciones del algoritmo. La línea precedida por 161
“//” se denomina comentario que es información para quien lee el algoritmo y no representa
ninguna instrucción del mismo.
Aunque el pseudocódigo nació como un sustituto del lenguaje de programación, y por
consiguiente, sus palabras reservadas se conservan o fueron muy similares a las de dichos
lenguajes. Su uso ha permitido que muchos términos en inglés como start, end, read, write, if-
then-else, while-end, repeat-until fueran reemplazados por su equivalente en español: inicio, fin,
leer, escribir, si-entonces-sino, mientras_Que-fin mientras_Que, repita-hasta_Que.
A continuación, se presentan diferentes estructuras que se deben emplear para la repre-
sentación de los algoritmos usando los pseudocódigos y su equivalencia en diagrama de flujo..
1 I n i c i o
I n i c i o
2 A c c i ó n
1 A c c i ó n 1
3 A c c i ó n
2 A c c i ó n 2
4 A c c i ó n
A c c i ó n 3
3
.
. .
.
.
. A c c i ó n n
5 A c c i ó n
F i n
n
6 F i n
Representación punto de control-selección (condición simple) con pseudocódigos y su
equivalencia en diagrama de flujo.
1 Inicio
2 Acción 1 I n i c i o
3 Acción 2
A c c i ó n 1
4 Si Condición Entonces
5 Acción 3 A c c i ó n 2
6 Acción 4
. N O S I
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
C o n d i c i ó n
.
. A c c i ó n 3
7 Acción n
A c c i ó n 4
8 Fin_Si
.
9 Acción m .
.
10 Fin
A c c i ó n n
A c c i ó n n
F i n
Representación punto de control-selección de condición doble con pseudocódigos y
su equivalencia en diagrama de flujo
1 Inicio
I n i c i o
2 Acción 1
3 Acción 2 A c c i ó n 1
4 Si Condición Entonces
A c c i ó n 2
5 Acción 3
6 Acción 4
N O S I
. C o n d i c i ó n
.
A c c i ó n 5 A c c i ó n 3
.
7 Acción n A c c i ó n 6 A c c i ó n 4
8 Si_no . .
. .
9 Acción 5 . .
1 0 Acción 6 A c c i ó n m A c c i ó n n
.
. 162
1 1 Acción m A c c i ó n . . . 163
12 Fin_Si
F i n
13 Acción ...
14 Fin
Representación del punto de control-Iteraciones (Mientras_Que) con pseudocódigos y
su equivalencia en diagrama de flujo:
1 Inicio
I n i c i o
2 Acción 1
3 Acción 2 A c c i ó n 1
4 M i e n t ras_Q u e Co n d i c i ó n
A c c i ó n 2
5 Acción 3
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
6 Acción 4
. N O
C o n d i c i ó n
.
A c c i ó n 5
7 Acción 5 S I
8 Fi n _ M i e n t ras_Q u e
A c c i ó n 3 A c c i ó n 6
9 Acción 6
.
10 Acción 7 A c c i ó n 4 .
.
11 Fin .
. A c c i ó n m
.
A c c i ó n n F i n
Representación del punto de control-Iteraciones (Repita-Hasta_Que) con pseudocódigos
y su equivalencia en diagrama de flujo:
1 Inicio
I n i c i o
2 Acción 1
3 Acción 2 A c c i ó n 1
4 Repita
A c c i ó n 2
5 Acción 3
6 Acción 4
.
A c c i ó n 3
.
.
A c c i ó n 4
7 Acción 5
.
8 H as ta _Q u e Co n d i c i ó n .
.
9 Acción 6
A c c i ó n n
10 Acción 7
11 Fin
164
N O
C o n d i c i ó n
165
S I
A c c i ó n 5
A c c i ó n 6
.
.
.
A c c i ó n m
F i n
Representación punto de control-Iteraciones (Para-Hasta_Que) con pseudocódigos y
su equivalencia en diagrama de flujo es:
1 Inicio
2 Acción 1
3 Acción 2
4 Pa r a M d e s d e v i H a s t a v f i n c r e m e n t o i n c
5 Acción 3
6 Acción 4
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
. I n i c i o
.
7 Acción n A c c i ó n 1
8 F i n _ Pa r a
A c c i ó n 2
9 Acción 5
10 Acción 6
Pa r a M d e s d e v i H a s t a v f
. incremento inc
.
. A c c i ó n 3
Acción m
A c c i ó n 4
11 Fin
.
.
.
A c c i ó n n
A c c i ó n 5
A c c i ó n 6
.
.
.
A c c i ó n m
F i n
Es importante anotar que en esta estructura de control M es la variable que permite llevar el
conteo de las iteraciones necesarias según el problema, vi es el valor Inicial, vf es el valor final e
inc es el valor de incremento de la variable M.
Representación del punto de control-selección (Selección múltiple) con pseudocódi-
gos y su equivalencia en diagrama de flujo:
1 Inicio
2 Acción 1
3 Acción 2
4 Seleccion M
5 Caso 1:
6 Acción 3
7 Acción 4
.
.
8 Acción…
9 Fi n _Cas o
10 Caso 2:
11 Acción 5
I n i c i o
12 Acción 6
.
. A c c i ó n 1
13 Acción…
14 Fi n _Cas o
15 Caso 3: A c c i ó n 2
16 Acción 7
17 Acción 8
. M
.
18 Acción…
166
19 Fi n _Cas o 167
20 Caso 4:
21 Acción 9 Acción 3 Acción 5 Acción 7 Acción 9 Acción 11
22 Acción 10
. Acción 4 Acción 6 Acción 8 Acción 10 Acción 12
.
23 Acción…
24 Fi n _Cas o
25 Caso 5:
Acción … Acción … Acción … Acción … Acción …
26 Acción 11
27 Acción 12
.
.
28 Acción… A c c i ó n 1 3
29 Fi n _Cas o
30 Fin_Selección
F i n
32 Fin
diseñado consiste en ejecutar lo que se denomina prueba de escritorio. Esta es una herra-
mienta útil para entender qué hace un algoritmo y consiste en verificar si cumple con la
especificación sin necesidad de ejecutarlo directamente en un computador. Básicamente,
una prueba de escritorio es ejecutar a mano un algoritmo, es decir, con papel y lápiz, la
persona va haciendo las veces del computador, ejecutando cada una de las instrucciones
en el orden que determina el algoritmo y lleva registro de los valores que va tomando cada
una de las variables involucradas en el mismo.
Para realizar la prueba, en primera instancia se toma el algoritmo y se hace un recorrido
desde el inicio hasta el final, pasando por todas las ramificaciones de flujo que lo componen,
para sacar un listado de las variables involucradas en él. Con base en este listado se ejecutan
desde el inicio y hasta alcanzar el fin, una a una, en su orden, las instrucciones del algoritmo.
n
∑i=0 xi
X =
N
Esta relación expresa de manera general la suma de un conjunto de valores, pero como
el problema es explícito en decir que solo se requiere sumar cuatro valores, entonces la
fórmula se simplifica diciendo que basta con sumarlos y dividir entre cuatro. Aplicado este
teorema matemático al problema que se quiere resolver se debe identificar que en este
caso N es cuatro, ya que es el número de notas obtenidas por el estudiante. Por lo
tanto, la fórmula quedaría:
4
∑i=0 xi
X =
4
Escribiendo de forma expl cita, la ecuación quedaría:
SUMA = X1 + X2 + X3 + X4
SUMA
X = 170
4 171
Además, se podría escribir las equis (X) como enes (N) aplicando el hecho de que el con-
junto de datos a sumar son las notas del estudiante y que los datos para el computador se
guardan en variables y por tanto el nombre de las mismas debe ser nemotécnico. Así que la
nota definitiva será:
SUMA = N1 + N2 + N3 + N4
SUMA
DEF =
4
Se sabe que para el problema X1, X2, X3 y X4 corresponden con las notas que se
podrían escribir como N1, N2, N3 y N4.
Paso 2: Especificación
SUMA = N1 + N2 + N3 + N4
Procesos
DEF = SUMA / $
Diagrama de
caja negra del
problema
Paso 3: Diseño
Para desarrollar el diseño del algoritmo se hace necesario aplicar primero la actividad de
dividir el problema en subproblemas, pues para que un computador funcione necesita datos,
y a partir de ellos realiza procesos según sea el caso y después da las respuestas de confor-
midad con los resultados de los procesos ejecutados. Es decir, para efectos del diseño del
algoritmo, es necesario dividir el problema en términos de las entradas, los procesos o acti-
vidades que se realizan a partir de ellos y por último las salidas o resultados del algoritmo.
Ahora bien, retomando el ejemplo, como se muestra en la especificación, se requiere
que el algoritmo reciba unos datos de entrada, esto es N1, N2, N3 y N4; se hará un proceso
con ellos y se obtendrá DEF como la nota definitiva promedio. El diseño del diagrama de
flujo inicial sería así:
172
Figura 34. División de la función de entrada del algoritmo
173
– Ejemplo 1 / Capítulo 3.
Se sigue dividiendo la sección del algoritmo que corresponde al proceso estableciendo las
fórmulas matemáticas requeridas para procesar la información como lo muestra la figura 35.
1 Inicio
2 Leer N1
3 Leer N2
4 Leer N3
5 Leer N4
6 SUMA = N1 + N2 + N3 + N4
7 DEF = SUMA / 4
8 Escribir DEF
9 Fin
Una de las ventajas de la representación de los algoritmos en pseudocódigos es que,
aparte de presentar el algoritmo como tal, se observa además la definición de las variables
y el tipo de datos que se van a almacenar en ellas. A continuación, se presenta el algoritmo
escrito en pseudocódigo con la definición de variables:
1 Inicio
2 N1, N2, N3, N4: Reales
8 SUMA = N1 + N2 + N3 + N4
9 DEF = SUMA / 4
10 Escribir DEF
11 Fin
Dentro del paso diseño, la siguiente actividad consiste en tomar el diseño propuesto en 174
la etapa de división y estudiarlo detenidamente para hacer ajustes y mejoras en el sentido 175
de reducir instrucciones y optimizar el mismo. En el algoritmo del ejemplo se puede llegar
a simplificar de tal forma que corresponde con un nivel de abstracción del problema sin
perder su esencia, lo que se busca es reducir lo que no se necesita en términos de funcio-
nalidad (Ver figura 37).
1 Inicio
4 D E F = ( N 1 + N 2 + N 3 + N 4 ) /4
5 Escribir DEF
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
6 Fin
1 Inicio
4 Leer N1
5 Leer N2
6 Leer N3
7 Leer N4
8 SUMA = N1 + N2 + N3 + N4
9 DEF = SUMA / 4
10 Escribir DEF
11 Fin
N1 N2 N3 N4 SUMA DEF
N1 N2 N3 N4 SUMA DEF
3.1
Tal como se aprecia, en la lista aparece debajo de la variable N1 el dato real de 3.1, lo
que significa que se suministró un dato y quedó almacenado en N1. En el algoritmo las
instrucciones que se ejecutan a continuación son la 5, 6 y 7 que hacen lo mismo que la
instrucción 4, con la diferencia que se puede suministrar la información que se requiera ya
que son datos digitados a voluntad usando el teclado de la computadora. Para la prueba 176
de escritorio se supone que se suministran las notas 3.0, 5.0 y 2.5, y que estas se almacenan 177
en N2, N3 y N4 respectivamente.
La lista de variables es:
N1 N2 N3 N4 SUMA DEF
3.1 3.0 5.0 2.5
La instrucción número 8 dice que hay que sumar los datos que están almacenados en
N1, N2, N3 y N4 y que el resultado debe guardarse en la variable de nombre SUMA. A partir
de los datos, decimos que SUMA es igual a 13.6 (es el tipo de variable definido en la línea
tres). En la lista se verá reflejado este hecho, así:
N1 N2 N3 N4 SUMA DEF
3.1 3.0 5.0 2.5 13.6
N1 N2 N3 N4 SUMA DEF
3.1 3.0 5.0 2.5 13.6 3.4
La instrucción 10 es el reporte del contenido de la variable DEF, es decir la impresión
del valor de 3.4 que, según el algoritmo, debe quedar escrito por medio de la impresora
en una hoja de papel. En la lista de variables todo esto se muestra haciendo un círculo
alrededor de los datos que se suponen quedan impresos, o mostrados en la pantalla del
computador, o guardados en una unidad de almacenamiento secundario como un disco
duro o un disquete, así:
N1 N2 N3 N4 SUMA DEF
3.1 3.0 5.0 2.5 13.6 3.4
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
· Lenguaje
Leer N2
Leer N3 s c a n f ( “ % f ”, & N 1 ) ;
Leer N4 s c a n f ( “ % f ”, & N 2 ) ;
SUMA = N1 + N2 + N3 + N4 s c a n f ( “ % f ”, & N 3 ) ;
N1+N2+N3+N4;
Fin D E F = S U M A /4 ;
p r i n t f ( “ %1 0 . 2 f ”, D E F ) ;
}
· Visual Basic
Inicio Pr i va te S u b Co m m a n d 1 _Cl i c ( )
N1, N2, N3, N4: Reales Dim N1 As Double, N2 As Double
SUMA, DEF: Reales Dim N3 As Double, N4 As Double
Dim SUMA As Double, DEF As
Leer N1 Double
Leer N2
Leer N3 N1=InputBox(“Digite N1”)
Leer N4 N2=InputBox(“Digite N2”)
N3=InputBox(“Digite N3”)
SUMA = N1 + N2 + N3 + N4 N 4 = I n p u t B o x ( “ D i g i t e N 4” )
DEF = SUMA / 4
SUMA = N1 + N2 + 3 + N4
Escribir DEF DEF = SUMA / 4
· Java
import java.io.*;
178
public class Cap3Ejemplo6 { 179
public static void main(String[ ] args)throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
N1 = Float.parseFloat(lee.readLine());
N2 = Float.parseFloat(lee.readLine());
N3 = Float.parseFloat(lee.readLine());
N4 = Float.parseFloat(lee.readLine());
SUMA = N1+N2+N3+N4;
DEF = SUMA/4;
System.out.println(""+DEF);
}
}
· Python
N1 = input()
N2 = input()
N3 = input()
N4 = input()
SUMA = N1+ N2 + N3 + N4
DEF = SUMA / 4
print DEF
· JavaScript
<html>
<body>
<script>
var N1,N2,N3,N4,SUMA,DEF;
N1=parseFloat(prompt());
N2=parseFloat(prompt());
N3=parseFloat(prompt());
N4=parseFloat(prompt());
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
SUMA = N1+N2+N3+N4;
D E F = S U M A /4 ;
document.write(DEF);
</script>
</body>
</html>
· PHP
<? p h p
$ s t d i n = f o p e n ( ' p h p : // s t d i n ', ' r ' ) ;
f s c a n f ( $ s t d i n ," % f ", $ N 1 ) ;
f s c a n f ( $ s t d i n ," % f ", $ N 2 ) ;
f s c a n f ( $ s t d i n ," % f ", $ N 3 ) ;
f s c a n f ( $ s t d i n ," % f ", $ N 4 ) ;
$S U M A = $ N 1 +$ N 2 +$ N 3 +$ N 4 ;
$ D E F = ( $ S U M A ) /4 ;
echo $DEF;
?>
Con esto se le da fin a la metodología, por lo menos hasta este punto, ya que el paso si-
guiente es probar si el algoritmo en realidad es ejecutado por la computadora correctamente.
En este orden de ideas, se debe transcribir el programa utilizando un editor de texto y luego
hacer que el computador lo ejecute y calcule los resultados esperados según lo previsto en la
prueba de escritorio. En caso de que las pruebas de funcionamiento (como es que se le deno-
mina a esta siguiente actividad) no den adecuadamente se debe volver a revisar el diseño del
algoritmo y hacer los ajustes necesarios para que funcione adecuadamente. Posterior a todo
esto se debe preparar la documentación pertinente del programa de computador resultante,
en la que se explica en detalle la forma como se debe instalar, operar y mantener, es decir,
escribir los manuales del programa.
EJEMPLO 2.
Construir un algoritmo que determine el mayor de tres números enteros.
Paso 1: Investigación Preliminar
El problema plantea el hecho de considerar tres valores y se debe conseguir la forma
de determinar cuál de los tres es el mayor. Una forma de lograr esto es comparando por
parejas los números. Estas comparaciones indican que hay que utilizar operaciones de la
lógica preposicional, es decir, el problema considera proposiciones que deben ser eva-
luadas y que dependiendo de los resultados se tomarán algunas acciones.
Paso: Especificaciones
Para el ejemplo 2 que venimos desarrollando la especificación del algoritmo se de-
sarrolla así:
180
Uno de los tres datos de entrada, dependiendo
Salidas de cuál es el mayor de los tres (MAYOR de tipo 181
Real).
Diagrama de
caja negra del
problema
182
183
1 Inicio
2 X , Y, Z , M a y o r : E n t e r o s
3 Leer X
4 Leer Y
5 Leer Z
6 Si X > Y AND X>Z Entonces
7 Mayor = X
8 Si_No
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
9 S i Y > X A N D Y > Z E n t o n c e s
1 0 Mayor = Y
1 1 Si_No
1 2 S i Z > X A N D Z > Y E n t o n c e s
1 3 M a y o r = Z
1 4 S i _ N o
1 5 F i n _ S i
1 6 Fin_Si
17 Fin_Si
18 Escribir Mayor
19 Fin
1 Inicio
2 X , Y, Z : R e a l e s
3 L e e r X , Y, Z
4 Si X > Y AND X>Z Entonces
5 E s c r i b i r X
6 Si_No
7 S i Y > X A N D Y > Z E n t o n c e s
8 E s c r i b i r Y
9 S i _ N o
10 S i Z > X A N D Z > Y E n t o n c e s
E s c r i b i r Z
11
S i _ N o
12 F i n _ S i
F i n _ S i
13
Fin_Si
14 Fin
1 Inicio
2 X , Y, Z : R e a l e s
3 L e e r X , Y, Z
4 Si X > Y AND X>Z Entonces
5 E s c r i b i r X
6 Si_No
7 Si Y > X AND Y > Z Entonces
8 E s c r i b i r Y
9 S i _ N o
1 0 S i Z > X A N D Z > Y E n t o n c e s
1 1 E s c r i b i r Z
1 2 S i _ N o
1 3 F i n _ S i
1 4 Fin_Si
15 Fin_Si
16 Fin
X Y Z
Se inicia la prueba ejecutando la línea 1 (es simplemente el inicio del algoritmo) y
luego la línea 2 en la que se definen las variables a ser usadas. La ejecución de la línea
3 permite suministrar tres valores. Supóngase que se suministran los datos 3, 8 y 5 que
quedan almacenados en X, Y y Z respectivamente. En la lista de variables se reflejan estos
hechos de la siguiente forma:
X Y Z
3 8 5
En la línea 4 se ejecuta una instrucción que corresponde a una toma de decisión. En esta
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
se evalúa una expresión lógica compuesta por dos proposiciones (X>Y, X>Z) enlazadas por el
operador lógico de Conjunción (AND) que según su tabla de verdad y teniendo en cuenta los
valores suministrados y almacenados en la variables X, Y y Z da como resultado Falso.
Esto sucede porque la variable X (según la lista de variables) tiene almacenado el valor tres
y la variable Y el valor ocho, como estas dos variables hacen parte de la proposición X > Y, es
Falso, ya que tres, no es mayor a ocho. La segunda proposición (X > Z) da como resultado tam-
bién Falso porque tres, no es mayor a cinco. Al unir los dos resultados de las dos proposiciones
por medio del operador AND, se obtiene una respuesta de Falso, dado que dos proposiciones
con valor de Falso en una conjunción (AND), darán como resultado falso a partir de las tablas
de verdad, Veamos de forma detallada el cálculo del valor de la proposición:
Falso
Verdadero
X Y Z
9 1 7
que quedó con la información que tiene después de la primera prueba parcial, se vería así:
Después de ejecutar la instrucción 3 se pasa a la instrucción cuatro (4) que es la evaluación
de la proposición:
Verdadero
X Y Z
9 1 7
X Y Z
1 -5 10
Falso
Como la respuesta de esta evaluación es falsa, entonces la instrucción que se ejecuta es
la 6 que es una instrucción de control indicando que debe continuar con la instrucción subsi-
guiente, es decir, la instrucción número 7, en la que se evalúa la proposición:
Falso
Verdadero
Ahora ejecutamos la instrucción 11, que consiste en escribir el valor 10, determinando con
esta escritura que el mayor valor del conjunto suministrado es 10. La lista de variables es:
Como se puede apreciar el conjunto de instrucciones ejecutadas para los valores 1, -5 y 10
X Y Z
1 -5 10
Figura 45. Diagrama que de la ruta que se sigue con los valores
1, -5 y 10. Ejemplo 2 / Capítulo 3.
#include <stdio.h>
void main(){
float X , Y, Z ;
s c a n f ( “ % f ”, & X ) ;
s c a n f ( “ % f ”, & Y ) ;
s c a n f ( “ % f ”, & Z ) ;
if((X>Y)&&(X>Z)){
p r i n t f ( “ % 7 . 2 f ”, X ) ;
}
else{
if((Y>X)&&(Y>Z)){
p r i n t f ( “ % 7 . 2 f ”,Y ) ;
}
else{
if((Z>X)&&(Z>Y)){
p r i n t f ( “ % 7 . 2 f ”, Z ) ;
}
else{
}
}
}
}
· Visual Basic:
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
X = InputBox(“Digite X”)
Y = InputBox(“Digite Y”)
Z = InputBox(“Digite Z”)
i m p o r t j a v a . i o .* ;
p u b l i c c l ass Ca p3 E j e m p l o7 {
public static void main(String[ ] args) throws IOException {
BufferedReader lee = new BufferedReader(new InputS-
treamReader(System.in));
d o u b l e X , Y, Z ;
X = Double.parseDouble(lee.readLine());
Y = Double.parseDouble(lee.readLine());
Z = Double.parseDouble(lee.readLine());
if ((X>Y)&&(X>Z)){
System.out .println(""+X);
}
else{
if ((Y>X)&&(Y>Z)){
S y s t e m . o u t . p r i n t l n ( " " +Y ) ;
}
else {
if ((Y>X)&&(Y>Z)){
S y s t e m . o u t . p r i n t l n ( " " +Y ) ; 192
} 193
else {
}
}
}
}
}
· JavaScript:
<html>
<body>
<script>
v a r X ,Y, Z ;
X=parseFloat(prompt());
Y=parseFloat(prompt());
Z=parseFloat(prompt());
if(X>Y && X>Z){
document.write(X);
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
}
else{
if(Y>X && Y>Z){
document.write(Y);
}
else{
if(Y>X && Y>Z){
document.write(Z);
}
else{
}
}
}
</script>
</body>
</html>
En PHP la codificación sería:
<? p h p
$ s t d i n = f o p e n ( ' p h p : // s t d i n ', ' r ' ) ;
f s c a n f ( $ s t d i n ," % f ", $ X ) ;
f s c a n f ( $ s t d i n ," % f ", $ Y ) ;
f s c a n f ( $ s t d i n ," % f ", $ Z ) ;
if ($X>$Y && $X>$Z) {
e c h o $ X , P H P_ E O L ;
}
else {
if ($Y>$X && $Y>$Z) {
e c h o $ Y, P H P_ E O L ;
}
else {
if ($Z>$X && $Z>$Y) {
e c h o $ Z , P H P_ E O L ;
}
else {
}
} 194
} 195
?>
· Python
X = input()
Y = input()
Z = input()
if X > Y and X > Z:
print X
else:
if Y > X and Y > Z:
print Y
else:
if Y > X and Y > Z:
print Z
else:
(x - h)2 + (y - k)2 = R2
En esta ecuación el centro del círculo se encuentra en el punto (h, k). El valor de h es la
distancia que se desplaza en el eje de las X el centro del círculo. El valor de k es el despla-
zamiento que se hace en el eje Y del centro del círculo. En términos generales el centro del
círculo se puede notar como C(x, y) de R, en donde R es una distancia conocida.
Ahora bien, a partir de los requerimientos del problema, habrá que calcular la distancia
que hay desde el centro del círculo hasta el punto dado. Para ello, es necesario usar la
fórmula para hallar la distancia entre dos puntos:
P1 = (x1, y1)
P2 = (x1 , y2)
Luego, si D es mayor a R, entonces el punto dado está por fuera del círculo. De lo con-
trario, el punto estará sobre o dentro.
Paso 2: Especificaciones
{
Verdadero si R ≥ (CX - PX)2 + (CY - PY)2)
Procesos Punto =
Falso en otro caso
Diagrama
196
de caja 197
negra del
problema
Paso 3: El diseño
El paso de la división correspondiente a la metodología y aplicado al ejemplo en cues-
tión se muestra a continuación (ver figuras 46, 47 y 48).
1 Inicio
2 R , C x , Cy , P x , P y : R e a l e s
3 A, B, D: Reales
4 Punto: Lógico
5 Leer R
6 Leer Cx
7 Le e r Cy
8 Leer Px
9 Leer Py
10 A = p o w ( Cx- Px , 2 )
11 B = p o w ( Cy - P y, 2 )
12 D = pow(A+B,0.5)
13 Punto = R > D
14 Si Punto = Verdadero Entonces
15 Escribir “El punto está DENTRO del círculo”
16 Si_No
17 Escribir “El punto está FUERA del círculo”
18 Fin_Si
19 Fin 198
199
El ejemplo, por tanto, se podría abstraer así:
1 Inicio
2 R , C x , Cy , P x , P y : R e a l e s
3 Le e r R , C x , Cy, P x , P y
4 D = p o w ( p o w ( C x - P x , 2 ) + p o w ( Cy – P y, 2 ) , 0 . 5 )
5 Si R >= D Entonces
6 E s c r i b i r “ E l p u n t o e s t á D E N T R O d e l c í r c u l o ”
7 Si_No
8 E s c r i b i r “ E l p u n t o e s t á F U E R A d e l c í r c u l o ”
9 Fin_Si
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
10 Fin
1 Inicio
2 R , C x , Cy , P x , P y : R e a l e s
3 Le e r R , C x , Cy, P x , P y
4 D = p o w ( p o w ( C x - P x , 2 ) + p o w ( Cy – P y, 2 ) , 0 . 5 )
5 Si R >= D Entonces
6 E s c r i b i r “ E l p u n t o e s t á D E N T R O d e l c í r c u l o ”
7 Si_No
8 E s c r i b i r “ E l p u n t o e s t á F U E R A d e l c í r c u l o ”
9 Fin_Si
10 Fin
R Cx Cy Px Py
Para la prueba de escritorio supóngase que se toman los siguientes datos según se
aprecia en la Figura 50.
6
P(9,6)
5
4
R = 5,5
3
2 C(2,3)
-2 -1 0 1 2 3 4 5 6 7 8 9 10 11
-1
La figura muestra que el círculo tiene el centro ubicado en C (2,3) y un Radio de 5,5. El 200
punto de referencia al que se le quiere determinar si está dentro o fuera del círculo se en- 201
cuentra posicionado en P(9,6). Con estos datos se puede dar inicio a la prueba de escritorio
y el algoritmo comienza, entonces, ejecutando las instrucciones en orden como en los casos
anteriores. En la instrucción tres (3) se suministran los datos según se discutió anteriormente
en la figura 53. La lista de variables es la siguiente:
R Cx Cy Px Py D
5.5 2 3 9 6
A continuación, se ejecuta la instrucción 4 que calcula la distancia que existe entre el
centro del círculo y el punto dado (Ver figura 51).
6
P(9,6)
5
4
R = 5,5 D
3
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
2 C(2,3)
-2 -1 0 1 2 3 4 5 6 7 8 9 10 11
-1
R Cx Cy Px Py D
5.5 2 3 9 6 7.6157731058
#include <stdio.h>
#include <math.h>
scanf ( “ % f ”, &R);
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
scanf ( “ % f ”, &Cx);
scanf ( “ % f ”, & Cy ) ;
scanf ( “ % f ”, &Px);
scanf ( “ % f ”, &Py);
D = p o w ( p o w ( C x- P x , 2 ) + p o w ( Cy - P y, 2 ) , 0 . 5 ) ;
if(R >= D){
printf(“El punto está DENTRO del circulo”);
}
else{
printf(“El punto está FUERA del circulo”);
}
}
· Visual Basic del y seudocódigo:
Pr i va te S u b Co m m a n d 1 _Cl i c ( )
Dim R As Double, Cx As Double
D i m Cy A s D o u b l e , P x A s D o u b l e
Dim Py As Double, D As Double
R = InputBox(“Digite R”)
Cx = InputBox(“Digite Cx”)
Cy = InputBox(“Digite Cy ” )
Px = InputBox(“Digite Px”)
Py = InputBox(“Digite Py”)
D = S q r ( ( C x- P x ) ^ 2 + ( Cy - P y ) ^ 2 )
If R >= D Then
Print “El punto está DENTRO del circulo”
Else
Print “El punto está FUERA del circulo”
End If
End Sub
204
205
· Java:
i m p o r t j a v a . i o .* ;
public class Cap3Ejemplo8 {
public static void main(String[ ] args) throws IOException {
BufferedReader lee = new BufferedReader(new InputS-
treamReader(System.in));
d o u b l e R , C x , Cy, P x , P y, D ;
R = Double.parseDouble(lee.readLine());
Cx = Double.parseDouble(lee.readLine());
Cy = D o u b l e . p a r s e D o u b l e ( l e e . r e a d L i n e ( ) ) ;
Px = Double.parseDouble(lee.readLine());
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
Py = Double.parseDouble(lee.readLine());
D = M a t h . p o w ( M a t h . p o w ( ( C x - P x ) , 2 ) + M a t h . p o w ( ( Cy - P y ) , 2 ) ,
0.5);
if ( R>= D){
System.out .println("El punto está DENTRO del circulo");
}
else{
System.out .println("El punto está FUERA del circulo");
}
}
}
· Python:
R = input('Digite R')
Cx = input('Digite Cx')
Cy = i n p u t ( ' D i g i t e C y ' )
Px = input('Digite Px')
Py = input('Digite Py')
D = p o w ( p o w ( C x- P x , 2 ) + p o w ( Cy - P y, 2 ) , 0 . 5 )
if R >= D:
print 'El punto está DENTRO del circulo'
else:
print 'El punto está FUERA del circulo '
· Javascript:
<HTML>
<BODY>
<SCRIPT>
v a r C x , Cy , D , P x , P y , R ;
R = Number(prompt());
Cx = Number(prompt());
Cy = N u m b e r ( p r o m p t ( ) ) ;
Px = Number(prompt());
Py = Number(prompt());
D = M a t h . s q r t ( M a t h . p o w ( ( C x- P x ) , 2 ) + M a t h . p o w ( ( Cy - P y ) , 2 ) ) ;
if(R>=D){
d o c u m e n t . w r i t e ( " E l p u n t o e s t á D E N T R O d e l c i r c u l o ",' < B R / > ' ) ;
}
else{
d o c u m e n t . w r i t e ( " E l p u n t o e s t á F U E R A d e l c i r c u l o ",' < B R / > ' ) ;
}
</SCRIPT>
</BODY>
</HTML>
· PHP: 206
207
<? p h p
$ s t d i n = f o p e n ( ' p h p : // s t d i n ', ' r ' ) ;
f s c a n f ( $ s t d i n ," % f ", $ R ) ;
f s c a n f ( $ s t d i n ," % f ", $ C x ) ;
f s c a n f ( $ s t d i n ," % f ", $ Cy ) ;
f s c a n f ( $ s t d i n ," % f ", $ P x ) ;
f s c a n f ( $ s t d i n ," % f ", $ P y ) ;
$ D = s q r t ( p o w ( ( $ C x - $ P x ) , 2 ) + p o w ( ( $ Cy - $ P y ) , 2 ) ) ;
if ($R >= $D) {
echo 'El punto está DENTRO del circulo';
} else {
echo 'El punto está FUERA del circulo';
}
?>
Igual que en los ejemplos anteriores, con la codificación se concluye, puesto que para
los otros pasos se necesitaría de compilar y ejecutar el programa en un computador real.
3.4. CONSTRUCCIÓN Y EVALUACIÓN DE PROPOSICIONES
En el numeral anterior se presentaron todas las técnicas y herramientas necesarias para
el diseño y construcción de algoritmos. En esta sección se presenta una visión más deta-
llada de la construcción de proposiciones, que se usan en las condiciones para la toma
decisiones en los algoritmos.
Como se ha venido anotando las condiciones que se presentan en la etapa de espe-
cificación del algoritmo, se convierten posteriormente en el diagrama de flujo en símbolos
para toma de decisiones, es decir, en rombos con una entrada y dos salidas. Dentro del
rombo siempre se debe escribir una expresión lógica, esto es, una proposición molecular
(PM) la que se compone de varias proposiciones atómicas (PA). Una PA es una expresión
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
lógica que está compuesta por operadores lógicos o de relación con sus correspondientes
operandos. Estas son de la forma: operando-operador-operando. Los operadores de rela-
ción, como bien se sabe, son operadores binarios, es decir que requieren de dos operan-
dos. Como ejemplo podemos citar:
X>Y
Aquí podemos ver claramente que el operador de relación “mayor que” (>) está rela-
cionando o comparando el valor representado por la variable X y el de la variable Y. Si el
valor de X es mayor que el de Y la respuesta al evaluar la proposición es Verdadero (Sí), de
lo contrario (es decir, que el valor de la variable X sea menor o igual que el de Y) el valor de la
proposición es Falso (No). La representación de la proposición dentro del diagrama de flujo es:
Figura 53. Esquema de una toma de decisiones con una proposición PA.
Por otra parte, una PM es una expresión lógica que se forma por la unión de varias
PA. Si se considera la siguiente expresión se puede observar que está compuesta por
diferentes PA, esto es:
SEL > 0 AND SUEL <= 620.000 OR RF > 0.2 AND RF <= 0.3
PA PA PA PA
PM
Ahora bien, la manera como se escribe dentro de un símbolo (rombo) para toma de
decisiones, sería (Ver figura 54):
Figura 54. Esquema de una toma de decisiones con una proposición PM.
SUEL > 0 AND SUEL <= 620.000 OR RF > 0.20 AND RF <= 0.30
Verdadero AND 880.000 <= 620.000 OR 0 > 0.20 AND 0 <= 0.30
Falso OR Falso
Falso
Como se aclaró anteriormente, los operadores de relación son binarios, al igual que los
operadores lógicos, excepto el operador NOT pues él trabaja aplicando su acción a un ope-
rando que se encuentra a su derecha. Como ejemplo se puede ver la siguiente expresión:
Dado X con un valor de 6 y Y con un valor de –3 y la expresión:
Verdadero
210
211
Se aprecia claramente que, dentro de la primera condición por el lado del NO hay
escrita otra condición. De igual forma por el lado del NO de la segunda condición tam-
bién hay una tercera condición. A este tipo de construcción de los algoritmos es la que
se llama “condiciones anidadas”.
Sin embargo, no solo se pueden anidar condiciones por el lado del NO, se pueden
anidar indistintamente por cualquiera de los dos lados del flujo de ejecución de las condi-
ciones. Todo depende de la naturaleza del problema que se esté implementando, así como
la solución algorítmica o el programa de computador. Ahora bien, la codificación de este
DFD se encuentra en el mismo numeral 3.3 que ya se había mencionado y que se puede
remitir allí para su estudio y análisis.
Otro ejemplo de este caso particular en la construcción de algoritmos en los que se
usan condiciones de forma anidada es el que se plantea a continuación. En él se mues-
tra un diagrama de flujo de datos (DFD) el cual consiste en determinar si con tres valores
dados se forma un triángulo, de ser así, determinar de qué tipo es y en ese caso, además,
establecer si es triángulo rectángulo. El diagrama de flujo de datos se presenta a continua-
ción (Ver figura 56).
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
#include <stdio.h>
#include <conio.h>
void main(){
int A, B, C;
p r i n t f ( “ D i g i t e e l v a l o r d e A ” ) ; s c a n f ( “ % d ”, & A ) ;
p r i n t f ( “ D i g i t e e l v a l o r d e B ” ) ; s c a n f ( “ % d ”, & B ) ;
p r i n t f ( “ D i g i t e e l v a l o r d e C ” ) ; s c a n f ( “ % d ”, & C ) ;
if (A > 0 && B > 0 && C > 0) {
if (A == B && B == 0) {
printf (“ Triángulo Equilátero”);
} else {
if (A > B && A > C) {
if (A < B + C) {
if (B == C) {
printf (“ Triángulo Isósceles”);
} else {
printf (“ Triángulo Escaleno”);
}
if (pow(A, 2) == pow(B,2) + pow(C,2)) {
printf (“Rectángulo”);
}
} else {
printf (“No es Triángulo”);
} 212
} else { 213
if (B > A && B > C) {
if (B < A + C) {
if (A == C) {
printf (“ Triángulo Isósceles”);
} else {
printf (“ Triángulo Escaleno”);
}
if (pow(B, 2) == pow(A, 2)+pow(C, 2)) {
printf (“Rectángulo”);
}
} else {
printf (“No es Triángulo”);
}
} else {
if (C < A + B) {
if (A == B) {
printf (“ Triángulo Isósceles”);
} else {
printf (“ Triángulo Escaleno”);
}
if (pow(C, 2) == pow(A, 2)+pow(B, 2)) {
printf (“Rectángulo”);
}
} else {
printf (“No es Triángulo”);
}
}
}
}
} else {
p r i n t f ( “ Val o re s n o vál i d o s” ) ;
}
}
· Visual Basic:
Pr i va te S u b Co m m a n d 1 _Cl i c k ( )
D i m A A s I n t e g e r, B A s I n t e g e r, C A s I n t e g e r
If B = C Then
Print “ Triángulo Isósceles”
Else
Print “ Triángulo Escaleno”
End if
If A^2 = B^2 + C^2 Then
Print “Rectángulo”
End if
Else
Print “No es Triángulo”
End if
Else
If B > A And B>C then
If B < A + C then
If A = C Then
Print “ Triángulo Isósceles”
Else
Print “ Triángulo Escaleno”
End if
If B^2 = A^2 + C^2 Then
Print “Rectángulo”
End if
Else
Print “No es Triángulo”
End if
Else
If C < A + B then
If A = B Then
Print “ Triángulo Isósceles”
Else
Print “ Triángulo Escaleno”
End if
If C^2 = A^2 + B^2 Then
Print “Rectángulo”
End if
Else
Print “No es Triángulo”
End if
End if
End if
End if
Else
Pr i n t “ Val o re s n o vál i d o s”
End if
End Sub
· Java
import java.io.*;
public class Triangulos {
public static void main(String[ ] args) throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
int A, B, C;
p r i nt “ D i gi te el valor d e A ”,
A = i np ut ()
p r i nt “ D i gi te el valor d e B ”,
B = i np ut ()
p r i nt “ D i gi te el valor d e C ”,
C = i np ut ()
<h t m l >
<b o d y>
<scr ip t >
var A , B , C ;
A =parseFloat (p rompt(“Digite el valor de A”, “”));
B =pa rseFloat (p rompt(“Digite el valor de B”, “”));
C=pa rseFloat (p rompt(“Digite el valor de C”, “”));
I f ( A >0 && B >0 && C>0) {
if ( A =B && B =C) {
d o cu m e n t .w rite (“Equilátero”);
} el se {
if ( A >B && A>C {
if ( A < B + C) {
if ( B == C) {
d ocument .w rite (“Isósceles”);
} el se {
d ocument .w rite (“Escaleno”);
}
if ( A* * 2== B* * 2 + C* * 2) {
d ocument .w rite (“Rectángulo”);
}
} el se {
d o cument .w rite (“N o es triángulo”);
}
} el se {
216
if ( B >A & & B>C {
if ( B < A + C) { 217
if (A == C) {
document .w rite (“Isósceles”);
} else {
document .w rite (“Escaleno”);
}
if (B* * 2== A* * 2 + C* * 2) {
document .w rite (“Rectángulo”);
}
} el se {
d ocument .w rite (“N o es triángulo”);
}
} e l se {
if ( C < A + B) {
if (A == B) {
document .w rite (“Isósceles”);
} else {
document .w rite (“Escaleno”);
}
if (C* * 2== A* * 2 + B* * 2) {
document .w rite (“Rectángulo”);
}
} el se {
d ocument .w rite (“N o es triángulo”);
}
}
}
}
} el se {
d o cu m en t .write (“ Valores no válidos”);
}
</scr ip t >
</b o d y>
</h t m l>
· PHP:
<? ph p
$ std in = fo pen ( 'php://s tdin', 'r ');
ech o “Dig ite el valor de A”; fs ca nf ($s tdin,"% f ", $A);
ech o “Dig ite el valor de B”; fs ca nf ($s tdin,"% f ", $B );
ech o “Dig ite el valor de C”; fs ca nf ($s tdin,"% f ", $C);
if ( $A > 0 && $ B > 0 & & $C > 0) {
if ( $A == $ B && $B == $C) {
ech o “ Tr ián gulo Equilá tero”, P HP_EOL;
} el se {
if ( $A > $ B & & $ A> $C) {
if ( $A < $B + $C) {
if ( $ B == $C) {
echo “ Triá ngulo Is ós celes”, P HP_EOL;
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
} el se {
echo “ Triá ngulo Es caleno”, P HP_EOL;
}
if ( $A* * 2 == $B* * 2 + $C* * 2 ) {
echo “Rectá ngulo”, P HP_EOL;
}
} el se {
ech o “No es Triá ngulo”, P HP_EOL;
}
} else {
if ( $ B > $A & & $B > $C) {
if ( $ B < $A + $C) {
if ($A == $C) {
echo “ Triá ngulo Is ós celes”, P HP_EOL;
} els e {
echo “ Triá ngulo Es caleno”, P HP_EOL;
}
if ($B* * 2 == $A* * 2 + $C* * 2 ) {
echo “Rectá ngulo”, P HP_EOL;
}
} else {
ec ho “No es Triá ngulo”, P HP_EOL;
}
} el se {
if ( $ C < $A + $B ) {
if ($A == $B ) {
echo “ Triá ngulo Is ós celes”, P HP_EOL;
} els e {
echo “ Triá ngulo Es caleno”, P HP_EOL;
}
if ($C* * 2 == $A* * 2 + $B* * 2 ) {
echo “Rectá ngulo”, P HP_EOL;
}
} else {
ec ho “No es Triá ngulo”, P HP_EOL;
}
}
}
}
} else {
ech o “ Valo res no válidos”, P HP_EOL;
}
?>
3.5.2. Condiciones en línea
Otra forma de escribir algoritmos en los que se usan condiciones, es cuando hay que
hacerlo de tal forma que en lugar de tener que escribir las condiciones unas dentro de
otras (condiciones anidadas), se colocan unas debajo de las otras, es decir, de forma lineal
(Chaves Torres, 2017). Un ejemplo de este tipo de algoritmo consiste en calcular el número
de días vividos por una persona. Para ello se debe suministrar la fecha del día de hoy y la
fecha de nacimiento de la persona (ver figura 57).
218
219
Como se puede apreciar, se ha colocado una condición y después de esta estructura condicio-
nal se ha planteado otra condición para resolver de forma correcta el problema. En el ejemplo
solo hay dos condiciones en línea, pero se pueden poner las que se necesiten dependiendo
del problema que se esté implementado como un algoritmo. Ahora bien, cuando una condición
presenta instrucciones a ejecutar, tanto por el lado del “Sí” como por el lado del “No”, como se
ve en el diagrama del ejemplo, a esa condición se le denomina condición doble, es decir, que
además de presentar condiciones en línea, también son condiciones dobles. 3
vo i d m ai n(){
i nt X, Y, Z ;
p r i nt f (“ D ig ite e l valor d e X ”) ; s ca n f ( “% d ”, & X ) ;
p r i nt f (“ D ig ite e l valor d e Y ”) ; s ca n f ( “% d ”, &Y ) ;
p r i nt f (“ D ig ite e l valor d e Z ”) ; s ca n f ( “% d ”, &Z ) ;
i f (X > Y & & X > Z ) {
p r i n tf ( “% 5 d ”, X ) ;
}
i f (Y > X & & Y > Z ) {
p r i n tf ( “% 5 d ”, Y ) ;
}
i f (Z > X & & Z > Y ) {
p r i n tf ( “% 5 d ”, Z ) ;
}
}
· Visual Basic:
220
Pr i vate Sub Com m a n d 1 _Cl ic k ( ) 221
D i m X A s I n te ge r, Y A s I n te ge r, Z A s I n te ge r
X = Inp u tB ox( “D ig ite e l valor d e X ”)
Y = Inp u tB ox( “D ig ite e l valor d e Y ”)
Z = Inp u tB ox(“D ig ite e l valor d e Z ”)
If X > Y A n d X > Z T h e n
Pr i n t X
End i f
If Y > X A n d Y > Z T h e n
Pr i n t Y
End i f
If Z > X A n d Z > Y T h e n
Pr i n t Z
End i f
End Sub
· Java:
import java.io.*;
public class mayor {
public static void main(String[ ] args) throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
int X, Y, Z;
System.out.println(“Digite el valor de X”); X = Double.parseDouble(lee.readLine());
System.out.println(“Digite el valor de Y”); Y = Double.parseDouble(lee.readLine());
System.out.println(“Digite el valor de X”); Z = Double.parseDouble(lee.readLine());
if (X > Y && X > Z) {
System.out.println(“” + X);
}
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
· Lenguaje Python:
p r i nt “ Di g i te e l valor d e X ”,
X = i np ut()
p r i nt “ Di g i te e l valor d e Y ”,
Y = i np ut()
p r i nt “ Di g i te e l valor d e Z ”,
Z = i np ut()
i f X > Y and X > Z:
p r i nt X
i f Y > X and Y > Z:
p r i nt Y
i f Z > X and Z > Y:
p r i nt Z
· JavaScript:
< html>
< bo d y>
< sc r i pt>
var X , Y, Z;
X= pars e Floa t( p rom p t ( “D ig ite e l valor d e X ”,””) ) ;
Y = pars e Floa t( p rom p t ( “D ig ite e l valor d e Y ”,””) ) ;
Z= pars e Floa t( p rom p t ( “D ig ite e l valor d e Z ”,””) ) ;
<? php
$std i n = fo p e n (' p h p : //s td in', ' r ' ) ;
e cho “ Di g i te e l valor d e X ”; fs ca n f( $ s td in ," % f ", $X ) ;
e cho “ D i gi te e l valor d e Y ”; fs ca n f( $ s td in ," % f ", $Y ) ;
e cho “ D i gi te e l valor d e Z ”; fs ca n f( $ s td in ," % f ", $Z ) ;
i f ($X > $Y && $X > $Z ) {
e cho $X , P H P_EO L;
}
if ($Y > $X && $Y > $Z ) {
e cho $Y, P H P_EO L ;
}
i f ($Z > $X & & $Z > $Y ) {
e cho $Z, P H P_EO L;
}
?>
Tipo de % de bonificación
trabajo sobre el sueldo
1 5
2 10
3 15
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
4 20
Para los demás 0
Hacer un algoritmo que tome el nombre del trabajador, el valor por hora de trabajo,
el tipo de trabajo, el número de horas trabajadas, el valor de los descuentos y calcule el
valor a pagar para el trabajador. Hay que tener presente que si el sueldo (Valor por hora
de trabajo * número de horas de trabajos) es mayor a tres salarios mínimos mensuales
legales vigentes se debe hacer una retención en la fuente del 5%. El salario mínimo
mensual legal vigente se debe ingresar como un dato de entrada.
En consecuencia, después de haber hecho todo el análisis del problema, se tiene el
siguiente diagrama de flujo, el cual se puede tomar como base para la implementación
en un lenguaje formal para ejecutarlo en el computador (Ver figura 59):
· Lenguaje C:
#include <stdio.h>
#include <conio.h>
void main(){
int TT;
float NHT, VHT, DES, SM, Sueldo, PB, B, RF, TAP;
printf (“Digite el número de horas trabajadas ”); scanf(“%7.2f ”, &NHT);
printf (“Digite el valor por hora de trabajo ”); scanf(“%7.2f ”, &VHT);
printf (“Digite el valor del descuento ”); scanf(“%7.2f ”, &DES);
printf (“Digite el valor del Salario mensual ”); scanf(“%7.2f ”, &SM);
printf (“Digite el tipo de trabajador ”); scanf(“%d”, &TT);
Sueldo = VHT * NHT;
if (Sueldo > SM*) 224
RF = Sueldo * 0.05;
225
else
RF = 0.00;
switch (TT) {
case 1:
PB = 0.05;
break;
case 2:
PB = 0.10;
break;
case 3:
PB = 0.15;
break;
case 4:
PB = 0.20;
break;
default:
PB = 0.00;
}
B = Sueldo * PB;
TAP = Sueldo + B - DES - RF;
printf (“El total a pagar es %10.2F”, TAP);
}
· Visual Basic:
Dim TT As Integer
Dim NHT As Double, VHT As Double, DES As Double, SM As Double
Dim Sueldo As Double, PB As Double, B As Double, RF As Double,
TAP AS Double
Select Case TT
Case 1
PB = 0.05
Case 2
PB = 0.10
Case 3
PB = 0.15
Case 4
PB = 0.20
Case Else
PB = 0.00
End Select
B = Sueldo * PB
TAP = Sueldo + B – DES - RF
End Sub
· Java:
import java.io.*;
public class Total_A_Pagar {
switch (TT) {
case 1:
PB = 0.05;
break;
case 2:
PB = 0.10;
break;
case 3:
PB = 0.15;
break;
case 4:
PB = 0.20;
break;
default:
PB = 0.00;
break;
}
B = Sueldo * PB;
TAP = Sueldo + B - DES - RF;
<html>
<body>
<script>
var NHT, VHT, DES, SM, PB, B, RF, TAP;
NHT=parseFloat(prompt(“Digite el número de horas trabajadas”,””));
VHT=parseFloat(prompt(“Digite el valor por hora de trabajo”,””));
DES=parseFloat(prompt(“Digite el valor del descuento”,””));
SM =parseFloat(prompt(“Digite el salario mensual”,””));
TT =parseFloat(prompt(“Digite el tipo de trabajador”,””));
switch (TT) {
case 1:
PB = 0.05; break;
case 2:
PB = 0.10; break;
case 3:
PB = 0.15; break;
case 4:
PB = 0.20; break;
default: 228
PB = 0.00; break; 229
}
B = Sueldo * PB;
TAP = Sueldo + B - DES - RF;
document.write(TAP);
</script>
</body>
</html>
· PHP:
<?php
$stdin = fopen ('php://stdin', 'r');
echo “Digite el número de horas trabajadas ”; fscanf($stdin,"%f", $NHT);
echo “Digite el valor por hora de trabajo ”; fscanf($stdin,"%f", $VHT);
echo “Digite el valor del descuento ”; fscanf($stdin,"%f", $DES);
echo “Digite el salario mensual ”; fscanf($stdin,"%f", $SM);
echo “Digite el tipo de trabajador ”; fscanf($stdin,"%d", $TT);
$Sueldo = $VHT * $NHT;
switch ($TT){
case 1:
$PB = 0.05;
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
break;
case 2:
$PB = 0.10;
break;
case 3:
$PB = 0.15;
break;
case 4:
$PB = 0.20;
break;
default:
$PB = 0.00;
break;
}
$B = $Sueldo * $PB;
$TAP = $Sueldo + $B - $DES - $RF;
echo $TAP, PHP_EOL;
?>
Un segundo ejemplo de aplicación de selección múltiple se plantea con el siguiente problema:
Dada una fecha cualquiera compuesta de día, mes y año; determinar el número de días que
tiene el mes. Se deben considerar los años bisiestos.
El análisis del problema nos lleva al siguiente algoritmo implementado en DFD (Ver figura 60):
230
231
Del diagrama se puede ver que hay una condición doble en la opción 2, implica que
dependiendo del año, si es bisiesto o no, el número de días será, bien sea 28 o 29. Esto
significa que en cada opción se puede programar lo que se necesite dependiendo de las
condiciones del problema a resolver. Además, se ve que se pueden agrupar las opciones;
para el caso del problema, en los meses que son de 31 se agrupan las opciones para que
asignen un único valor para cada uno de los meses. La codificación del problema se pre-
senta a continuación.
· Lenguaje C:
·
#include <stdio.h>
#include <conio.h>
void main(){
int A, M, ND;
switch (M) {
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
ND = 31;
break;
case 4:
case 6:
case 9:
case 11:
ND = 30;
break;
case 2:
if (A % 4 == 0 && (A % 100 != 0 || A % 400 == 0)){
ND = 29;
}
else {
ND = 28;
}
break;
default:
ND = 0;
}
if (ND == 0) {
printf (“Número de mes inválido”);
}
Else {
printf (“El mes tiene %2D días”, ND);
}
}
· Visual Basic:
import java.io.*;
public class Dias_mes {
public static void main(String[ ] args) throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
int A, M ND;
System.out.println (“Digite el año”,); A = Integer.parseInt(lee.readLine());
System.out.println (“Digite el mes”,); M = Integer.parseInt (lee.readLine());
switch (M) {
case 1:
case 3:
case 5:
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
case 7:
case 8:
case 10:
case 12:
ND = 31;
break;
case 4:
case 6:
case 9:
case 11:
ND = 30;
break;
case 2:
if (A % 4 == 0 && (A % 100 != 0 || A % 400 = 0))
ND = 29;
else
ND = 28;
break;
default:
PB = 0.00;
break;
}
if (ND == 0)
System.out.println (“Número de mes inválido”,);
else
System.out.println (“El mes tiene ”, DN, “ días”);
}
La codificación del DFD en lenguaje Python nuevamente carece de una estructura de-
finida para la selección múltiple. Pero haciendo uso de la condicional se puede hacer algo
que funciona muy parecido. A continuación, se presenta la implementación:
<html>
<body>
<script>
var A, M, ND;
A=parseFloat(prompt(“Digite el año”,””));
M=parseFloat(prompt(“Digite el mes”,””));
switch (M) {
case 1:
case 3:
case 5:
case 7:
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
case 8:
case 10:
case 12:
ND = 31;
break;
case 4:
case 6:
case 9:
case 11:
ND = 30;
break;
case 2:
if (A % 4 == 0 && (A % 100 != 0 || A % 400 == 0))
ND = 29;
else
ND = 28;
break;
default:
ND = 0;
break;
}
if (ND == 0)
document.write(“Número de mes inválido”);
else
document.write(“El mes tiene ”, ND, “ días”);
</script>
</body>
</html>
· PHP:
<?php
$stdin = fopen ('php://stdin', 'r');
echo “Digite el año ”; fscanf($stdin,"%d",$A);
echo “Digite el mes ”;fscanf($stdin,"%d",$M);
switch ($M){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
$ND = 31;
break;
case 4:
case 6:
case 9:
case 11:
$ND = 30;
break;
case 2:
if ($A % 4 == 0 && ($A % 100 != 0 || $A % 400 == 0)) 236
$ND = 20; 237
else
$ND = 28
break;
default:
$PB = 0.00;
break;
}
if ($ND == 0)
echo “Número de mes inválido”, PHP_EOL;
else
echo “El mes tiene ”, $ND, “ días”, PHP_EOL;
?>
Un último ejemplo del uso de la selección múltiple es el siguiente: se desea calcular el
valor de una llamada internacional hecha desde Colombia y hacia uno de los cinco destinos
con los que la empresa de telefonía móvil tiene roaming. La llamada a cada destino tiene
una tarifa y un valor de incremento dependiendo del destino según se muestra en la tabla 43:
Tarifa
Sobre tasa de destino
No. Destino ($US x
(% sobre el valor de la llamada)
minuto)
1 USA 0.65 0.0%
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
El valor de la llamada se debe dar en pesos colombiano, por lo que se debe consi-
derar hacer la conversión de dólares americanos a pesos colombianos y debe dar como
respuesta el valor de la llamada y el nombre del país destino.
Una vez hecho el análisis del problema se llega al siguiente diagrama de flujo, el cual
define el algoritmo que se debe usar para la programación en los diferentes lenguajes.
#include <stdio.h>
#include <conio.h>
void main() {
float C, ST, T, TL, VL;
char pd[15];
if (T != 0.00) {
VL = TL * T * (1 + ST/100) * C;
printf ("Valor de la llamada %f. Fue hacia %s", VL, PD);
}
else {
printf("Datos inválidos");
}
}
· Visual Basic:
Case “MEXICO”
T = 0.50: ST = 2.1
Case “CHILE”
T = 0.91: ST = 2.2
Case “ESPAÑA”
T = 1.01: ST = 2.9
Case Else
T = 0.00
End Select
If T <> 0.00 Then
VL = T * TL * (1 + ST / 100) * C
Print “Valor de la llamada ” & VL & “. Fue hacia ” & PD
Else
Print “Datos inválidos”
End If
End Sub
· Java:
import java.io.*;
public class Valor_Llamada {
public static void main(String[ ] args) throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
double C, ST, T, TL, VL;
String PD;
System.out.println (“Digite el tiempo de la llamada ”);
TL = Double.parseDouble(lee.readLine());
System.out.println ( “Digite el país destino ”);
PD = lee.readLine();
System.out.println ( “Digite el valor del cambio de dólares a pesos ”);
C = Double.parseDouble(lee.readLine());
switch (PD) {
case "USA":
T = 0.65; ST = 0.0;
break;
case "CANADA":
T = 0.82; ST = 2.5;
break;
case "MEXICO":
T = 0.50; ST = 2.1;
break; 240
case "CHILE": 241
T = 0.91; ST = 2.2;
break;
case "ESPAÑA":
T = 1.01; ST = 2.9;
break;
default:
T = 0.00;
}
if (T != 0.00){
VL = TL * T * (1 + ST/100) * C;
System.out.println ("Valor de la llamada "+VL+". Fue hacia "+PD);
}
else {System.out.println (“Datos inválidos”);}
}
· Igual que en los ejemplos anteriores, para Python no existe una estructura defi-
nida para la selección múltiple, por lo que la implementación se hace como se
muestra a continuación.
T = 0.65
ST = 0.0
elif PD == “CANADA”:
T = 0.82
ST = 2.5
elif PD == “MEXICO”:
T = 0.50
ST = 2.1
elif PD == “CHILE”:
T = 0.91
ST = 2.2
elif PD == “ESPAÑA”:
T = 1.01
ST = 2.9
else:
T = 0.00
if T != 0.00:
print “Valor de la llamada ”, VL, “. Fue haica
“, PD
else:
Print “Datos inválidos”
· JavaScript:
<html>
<body>
<script>
<?php
switch ($PD){
case "USA":
$T = 0.65;
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
$ST = 0.0;
break;
case "CANADA":
$T = 0.82;
$ST = 2.5;
break;
case "MEXICO":
$T = 0.50;
$ST = 2.1;
break;
case "CHILE":
$T = 0.91;
$ST = 2.2;
break;
case "ESPAÑA":
$T = 1.01;
$ST = 2.9;
break;
default:
$T = 0.00;
}
if ($T != 0.00){
VL = TL * T * (1 + ST/100) * C;
echo "Valor de la llamada ", VL, ". Fue hacia ", PD,
PHP_EOL;
}
else {
echo “Datos inválidos”, PHP_EOL;
}
?>
3.6. EJERCICIOS DE REPASO
Para cada uno de los siguientes ejercicios diseñarlos siguiendo la metodología expuesta en
el capítulo (investigación preliminar, especificación, diseño y prueba de escritorio).4
1. Leer los datos necesarios para determinar la aceleración uniforme si se tiene:
V2 = V02 + 2A (X - X0 )
Donde
A: Aceleración V: Velocidad final
Vo: Velocidad inicial X: Posición Final
Xo: Posición Inicial
2. Calcular el área de un triángulo del que se conoce la longitud de cada uno de sus lados.
Área = p (p - a) (p - b) (p - c )
a+b+c
P=
2
244
3. Calcular la altura máxima, tiempo de vuelo y alcance máximo de un proyectil que se lanza 245
a una velocidad en m/s y a un ángulo en grados.
2
V0 Seno2 (α)
Altura máxima =
2g
4.
Algunos de los problemas fueron tomados de las páginas www.
N
R
VF = VP 1+
100
5. Una epidemia se propaga a través de una comunidad de forma que, detectado el brote,
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
80
P(t) =
8 + 12e-0.06 * t
°F = (9 ⁄ 5) °C + 32
°K = °C + 273
8. Diseñar un algoritmo para convertir de metros a pies y pulgadas (1 m es igual a 39.37 pul-
gadas y 1 pie es igual a 12 pulgadas). Ejemplo 1.93 m es igual a 6 pies con 4.0428 pulgadas.
Esto es: 1.93 m es igual a 6’ 4.0428”.
9. Escribir un algoritmo que lea un número que corresponda a la distancia recorrida por
una motocicleta con tres galones de gasolina. El algoritmo debe determinar cuántas
millas recorrió si la motocicleta consume un galón por cada 155 Km, (una milla es igual
a 1609 m).
10. Escribir un algoritmo que lea un valor entero y determine cuál es la última cifra del
valor leído.
11. Dado un número que representa la longitud L del lado de un cuadrado, determinar el
área de los cuadrados de lado 1*L, 2*L, 3*L y 4*L.
12. Dados los datos para calcular las coordenadas de un proyectil en cualquier instante de
tiempo, diseñar un algoritmo que determine estas coordenadas. Las ecuaciones para
calcular las coordenadas son:
x = t * V0 * Coseno (θ)
1
y = y0 + t * V0 * Seno(θ) - * g * t2
2
13. Un Banco tiene el problema de calcular los intereses que a fin de año habrá de acredi-
tar a cada uno de los clientes. Para lo cual cuenta con los siguientes datos:
T 360 - M
Interés = K * *
100 360
Donde:
K es el capital
M es el día
T es la tasa
14. Dado el valor del radio R y de acuerdo a la imagen calcular el área de la sección
sombreada. 246
247
17. Diseñar un algoritmo que permita calcular el área de la figura que se muestra, teniendo
conocimiento de la longitud del lado L.
Salario Base
Retención = - 40000 * (número de hijos - 2)
5
Salario Base
Retención =
5 248
249
De cada empleado se tiene la siguiente información: Código, Número de hijos, Salario
Base. Se debe imprimir el código del empleado y el valor de la retención.
23. Se tienen dos valores que componen un punto en el plano cartesiano [X, Y], determinar
a partir del punto dado si corresponde con uno que forma una línea recta que pasa por
el origen y forma un ángulo de 45 grados respecto del eje X.
24. Leer el nombre, la edad, el sexo y el estado civil de cualquier persona e imprima, solo si
la persona es hombre o mujer menor de edad o es hombre casado de cualquier edad, el
nombre de la persona y un mensaje que diga “usted no se manda”. En los demás casos
debe imprimir el nombre de la persona y la edad. Tenga en cuenta que:
25. Leer dos números que representan la longitud y anchura de un rectángulo. El objeto es
mostrar el valor del perímetro y del área del rectángulo si su perímetro es de 1100 en
adelante y su área menor a 24000 m2.
26. Si se tiene el sistema de ecuaciones lineales:
AX + BY = C
DX + EY= F
Donde
CE - BF
X=
AE - BD
AF - CD
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
Y=
AE - BD
No.
Polígono Fórmula
lado
Base * Altura
1 Triángulo A=
2
37. Tomar la calificación obtenida por una persona en un curso de programación de compu- 250
tador de conformidad con los siguientes datos y determinar qué tipo de calificación es. 251
Cualitativa Numérica
Reprobada 1, 2, 3, 4 y 5
Regular 6
Buena 7y8
Aprobada
Sobresaliente 9
Excelente 10
38. Leer dos números enteros y una letra. Calcular la suma de los números si la letra es ‘S’;
la resta si la letra es ‘R’; la multiplicación si es ‘M’; la división si es ‘D’; el cociente de la
división entera si es ‘E’ ; y el residuo de la división de los dos números si la letra leída
es ‘F’.
39. Leer una letra y determinar si corresponde a una vocal o a una consonante.
40. Leer una letra y determinar si la letra es:
Un dígito
Una letra mayúscula
Una letra minúscula
Un carácter especial
41. Use el método de Gauss para sumar la serie 1, 2, 3, 4, 5, …, N. Donde N es un valor entero
del intervalo (1000, 5000).
42. Leer tres números que representan el día, el mes y el año de una fecha. Determinar la
fecha del día siguiente.
43. Se tiene la fecha de nacimiento de una persona. Calcule exactamente el número de días
vividos por esa persona hasta la fecha hoy. Los datos de entrada son el día, mes y año
de nacimiento y la fecha de hoy. Tenga en cuenta los años bisiestos.
44. Tomar los datos de una hora del día y determinar la hora que corresponde a la centé-
sima siguiente. Los datos son dados en el formato HHMMSSCC.
45. Dada una fecha en el formato YYYYMMDD, determinar el número de día en el año al que
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
corresponde la fecha.
46. Diseñar un algoritmo que lea dos números y determinar si el primero se puede dividir
por el segundo o si el segundo se puede dividir por el primero. En el caso de que el pri-
mer número sea dividido por el segundo se debe calcular e imprimir la raíz del cociente.
En caso contrario se deben imprimir el promedio de los dos números.
47. Calcule las raíces de la ecuación cuadrática. La ecuación es:
-b± b2 - 4ac
x=
2a
Se debe tener presente que el valor del radical sea mayor o igual a cero para que las raíces
sean reales. En caso de raíces imaginarias se deben imprimir en forma de notación vectorial.
48. Leer dos números A y B. Se pide calcular e imprimir Y siendo Y = Xi; En donde:
49. Determinar el costo de una llamada por celular de acuerdo con la siguiente política
de pago: el tiempo de la llamada hasta tres minutos no se cobra. De tres hasta cinco
minutos se cobra el 50% de la tarifa, de cinco hasta siete se cobra la tarifa plena. Para
cada minuto o fracción por encima de siete minutos en adelante se cobra un recargo
de 15% adicional al precio de la tarifa plena. Diseñar un algoritmo que calcule el pago
para cada llamada si el algoritmo lee el tiempo de la llamada en segundos.
50. Calcular el valor de Y dada la siguiente función:
a ebx + + d si t = 3
f (x,t) = a Ln (bx ) + c si t = 2
a cos (bx + c) + d si t = 1
Calcule el promedio (P) de consumo de los últimos cuatro meses y el consumo esperado
según la fórmula:
CE = (1 + A) *
252
Siendo: 253
A = 0.10 para artículos de importación.
A = 0.15 para artículos de suministro local.
Obtenga por cada artículo los siguientes datos: código, nombre, clase, valor unitario,
valor promedio, consumo esperado, valor consumo esperado.
53. El jefe de almacén de la compañía SoftTec desea reponer el inventario para lo cual
quiere que se le informe de los artículos y cantidades de los mismos que debe ordenar
a los proveedores. Usted fue comisionado para la elaboración de un programa para el
computador que imprima el informe requerido por el jefe. Para la organización del mis-
mo se tienen los siguientes datos:
Número de artículo
Existencia (unidades)
Existencia mínima requerida (unidades)
Cantidad a ordenar (unidades)
Valor unitario
Para cada artículo usted debe investigar si la “Existencia” es menor que la “Existencia
mínima requerida”; en cuyo caso debe reportar como resultado lo siguiente:
Número de artículo
Cantidad a ordenar
Valor unitario
Valor total de la cantidad a ordenar (Igual al resultado de multiplicar la cantidad or-
denada por el valor unitario).
54. Leer dos números que conforman la pareja ordenada [X1, Y1] de un punto en el plano cartesia-
no. Determinar si el punto es parte de una línea recta que pase por el origen y tiene un ángulo
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación
Para distancia de 1500 Kms, si la estadía es menor a dos días, el valor del pasaje es la
tarifa plena; si es de dos a cinco días, el valor del pasaje es del 95% del valor de la ta-
rifa; si es mayor a cinco días, el valor del pasaje es de 90% de la tarifa y un descuento
adicional de $ 10.000 por cada día que pase de los cinco.
Ahora, si la distancia está entre 1500 y 2500 kilómetros, para estadía menor a 2 días
el valor del pasaje es el 97.5% de la tarifa. Para 2 a 5 días, el valor del pasaje es del
92.5% del valor de la tarifa. Si la estadía es mayor a cinco (5) días, el valor del pasaje
es de 90% de la tarifa y un descuento adicional de $17.500 por cada día que pase de
los cinco (5).
Por último, si la distancia es superior a 2500 kilómetros y la estadía menos de dos (2)
días el valor del pasaje es el 91.5% de la tarifa pasaje; si es de 2 a 5 días el valor del
pasaje es del 85% del valor de la tarifa. Si es mayor a cinco (5) días, el valor del pasaje
es de 91% de la tarifa y un descuento adicional de $25.000 por cada día que pase de los
cinco (5) días.
CAPÍTULO 4
CICLOS, ACUMULADORES Y
C O N TA D O R E S
01 01
01 01
01
01
Objetivo
Aplicar correctamente los conceptos de ciclos,
contadores y acumuladores en el diseño de
algoritmos como base para la construcción de
programas de computador
4.1. Ciclos
Hasta el momento se han construidos algoritmos secuenciales, 258
es decir, que se inicia la ejecución de los mismos y se van pro- 259
cesando cada una de las instrucciones que lo componen has-
ta alcanzar el final y en ningún momento se vuelve a ejecutar
nuevamente alguna o algún grupo de instrucciones previamente
ejecutadas. En términos de la algorítmica, ejecutar repetidamen-
te una o varias instrucciones de un algoritmo es lo que hace los
hace tan importantes, ya que los procesos que se repiten de-
mandan gran esfuerzo de parte de las personas que los ejecu-
tan y, por tanto, al implementarlo en programas de computador
para ser ejecutados, descargan de gran trabajo a las personas
ahorrando grandes cantidades de tiempo y de recursos huma-
nos y físicos en el cumplimiento de trabajos rutinarios como
la liquidación de nóminas, llevar la contabilidad, los procesos
de facturación, y muchos otros más que se haría interminable
mencionar. Los procesos en los que se ejecutan varias veces
una o uno grupo de instrucciones se conocen como procesos
cíclicos, procesos repetitivos, iterativos, procesos con loops o
procesos con lazos (Joyanes Aguilar, 1996)
Para la construcción de los algoritmos con ciclos se debe pensar, básicamente, como si
se tratase de un algoritmo secuencial; se resuelve el problema bajo este enfoque y segui-
damente, de acuerdo con la definición del problema, se introducen las instrucciones para
controlar los procesos que se repiten. A continuación, se presentan algunos ejemplos en
los que se aplica la construcción de algoritmos con ciclos.
Asignación Mensual
Salario = * Días Trabajados
30
Este es uno de los componentes del total devengado, es decir, hay que considerar otros
datos para determinar cuánto es lo que ha ganado el trabajador durante el mes.
2. A continuación se deben tomar todos los datos correspondientes a los pagos que
se deben hacer al trabajador para determinar el total devengado. En términos del
problema los pagos que se harán al trabajador para el cálculo serán:
Total Devengado * 5
Retención =
100
Otro de los datos es el aporte a la Seguridad Social, el cual corresponde al 12% sobre
el Total Devengado:
Total Devengado * 12
SS =
100
Sal = AM/30*NDT
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
TDeven = Sal + BR
Ret = TDeven*5/100
Proceso
SS = TDeven*12/100
TDeduc = Ret + SS + OD
PN = TDeven – Tdeduc
Diagrama de caja
negra del problema
Paso 3: Diseño
Es de aclarar que el diseño se construye pensando en que todo algoritmo debe incluir
en su orden, de acuerdo a la idea de caja negra, los elementos de entrada, luego los de
procesamiento o condiciones a que haya lugar, por último, los elementos de salida. En con-
secuencia y de acuerdo a la especificación hecha se tiene el siguiente diseño:
262
263
pasos o instrucciones que la componen son las adecuadas a la luz del problema plantea-
do, por lo cual se concluye que el algoritmo está bien definido. La segunda característica
se cumple puesto que los cálculos realizados con el algoritmo son incuestionables a la
luz de la definición del problema; el algoritmo es preciso. La tercera característica no se
cumple debido a que el algoritmo no es finito, esto es, tiene claramente definido el punto
de inicio, pero no el punto de finalización del mismo; convirtiéndolo en un algoritmo de
repeticiones infinitas y por tanto nunca terminaría su ejecución.. El hecho de no terminar
hace que sea un algoritmo erróneo, mal diseñado y obviamente imposible de implementar
en un programa para computador. La corrección del algoritmo se presenta en la figura 64.
AM = 0
266
267
270
271
La codificación comienza con la instrucción número 1 del diagrama de la figura 68, así:
Do 272
273
Esta instrucción es un punto de suma de flujos en el que se interceptan el flujo de
datos que baja del inicio y el que sube por el lado del NO de la condición que define el
ciclo. Por lo anterior y sin perder de vista estos comentarios, el punto de suma de flujos
se traduce como un Do que se pone en el texto de traducción debajo de las instrucciones
Dim y con un renglón blanco, como mínimo, y a un tabulado con relación a la traducción
del inicio (Private Sub).
Después de la traducción de la instrucción 2 se procede a traducir la instrucción 3, que
corresponde al proceso de entrada de datos o lectura por consola, según se aprecia en el
diagrama de la figura 68. Esta traducción es:
Pr i vate Su b Co m m a n d1_Cl i c k ()
D i m No m As Str i ng * 3 5, NDT A s B y te, AM A s D oub le
D i m B R As D o u ble, O D As D oub le, Sal A s D oub le
D i m T D e v e n As D o u ble, Ret A s D oub le, SS A s D oub le
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
Se puede observar que en el código del programa construido hasta el momento, las
instrucciones de lecturas se han colocado a dos tabulados, ya que lo que se pretende
aquí es ver que la instrucción DO marca el comienzo de las otras que se van a repetir en
la ejecución del ciclo en el algoritmo. Este estilo de transcribir la traducción se hace con
el propósito de mantener una forma clara de leer el código y hacer una referencia directa
conforme con la estructura del diagrama, el que también muestra explícitamente el con-
junto de instrucciones que se repiten.
Traducida la instrucción 3 se procede a traducir la 4 que es una condición, la cual lleva
la estructura:
If AM = 0 Then
{
Else
Sal = AM/30*NDT
TDeven = Sal + BR
Ret = TDeven*5/100 Instrucciones Traducidas por el Lado del
TDeduc = Ret + SS + OD
PN = TDeven – TDeduc
Print Nom, PN Instrucción 6
End If Instrucción 7
Hay que tener en cuenta que también se debe traducir el punto de suma rotulado con
el número de instrucción 7. En el Código del programa presentado para la condición, este
punto de suma corresponde a la instrucción End If. Retomando el código de programa que
se ha traducido hasta el momento, todo en su conjunto se presenta a continuación:
Loop Until AM = 0
Por último, queda por traducir la instrucción número 9 que es simplemente el fin del
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
algoritmo en el diagrama de flujo, el cual se traduce como End Sub. Escrita esta instrucción
en el programa, se tiene la totalidad el código traducido. No se debe olvidar que la ubica-
ción de la Instrucción Loop Until es a un tabulado, como se puede apreciar. Ya que debe
ubicarse debajo de la instrucción Do, denotando claramente en la codificación del progra-
ma las instrucciones que se repiten dentro de un ciclo. Con todo lo anterior se culmina la
traducción del algoritmo a un lenguaje de programación de computadores y queda listo
para ser trascrito directamente en un computador para verificar su correcto funcionamien-
to. Se presenta a continuación el programa completo:
End Su b
Si se analiza más en detalle el código escrito, se ve que en la valoración de la condi-
ción hay un aspecto importante a resaltar: la condición If AM = 0 Then no tiene ninguna
instrucción codificada para que sea ejecutada cuando el resultado de la valoración de la
proposición dé verdadero, por lo tanto, no hay ninguna acción que ejecutar, el programa
queda escrito con un bloque de instrucciones que no hace nada. Para arreglar este peque-
ño desajuste solo habrá que invertir el sentido de la condición y ejecutar todas las accio-
nes correspondientes, esto es, todas las instrucciones que se encuentran codificadas por el
lado del NO, o lo que es lo mismo, cuando la condición da como resultado en la valoración
de la proposición Falso. Corrigiendo el programa quedaría así:
Pr i vate Su b Co m m a n d1_Cl i c k( )
Di m No m As Str i ng * 3 5, NDT A s B y te, AM A s D oub le
D i m B R As D o u ble, O D As D oub le, Sal A s D oub le
D i m T D e v e n As D o u ble, Re t A s D oub le, SS A s D oub le
D i m T D e duc As D o u ble, P N A s D oub le
Do
No m = i npu tBox( “Dig ite nom bre d el t ra baja d or ” )
NDT = i npu tBox( “D ig ite núm ero d e dí as t ra baja d os” )
A M = i npu tBox( “D i gite as ig na c ión m ens u al” )
B R = i npu tBox( “D i g ite bonifica c iones rec ibid as” )
O D = i npu tBox( “D i gite ot ras d ed u cc iones” )
276
If AM < > 0 The n
Sal = AM /30 *N DT
277
T D e v e n = S al + BR
Re t = T D e v en* 5/1 0 0
SS = T D e v en* 1 2 /1 0 0
T D e duc = Ret + SS + O D
P N = T D e v e n – T D ed u c
Pr i nt No m , P N
End i f
Lo o p U nti l A M = 0
En d Su b
A continuación se presentan traducciones del programa a otros lenguajes de progra-
mación:
· Lenguaje C:
#i nc l u d e <stdi o. h >
#i nc l u d e <co n i o. h >
vo i d mai n( ) {
c har No m [3 5 ];
sho r t i nt NDT;
float A M, B R , O D, Sal , T D even, Ret , SS , T D ed u c , P N ;
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
d o{
pr i ntf( “D i g i te n o m b re d el t ra baja d or ” ); s c n a f(“ % s”, N om );
pr i ntf( “D i g i te núm e ro d e días t ra baja d os” ); s ca n f(“ % d ”, &N DT );
pr i ntf( “D i g i te asi g n a ción m ens u al” ); s ca n f(“ % f ”, &A M );
pr i ntf( “D i g i te b o n i f i ca c iones rec ibid as” ); s ca n f(“ % f ”, &BR);
pr i ntf( “D i g i te o tras d ed u cc iones \n” ); s ca n f(“ % f ”, &O D );
if (AM != 0){
Sal = A M/3 0 * NDT;
T D e v e n = Sal + B R;
Re t = T D e v e n * 5/1 0 0 ;
SS = T D e v e n * 12 /1 0 0 ;
T D e duc = Re t + SS + O D ;
P N = T D e v e n – T D ed u c ;
pr i ntf( “%3 5s %10 . 2 f ”, N om , P N );
}
} whi le( A M ! = 0) ;
Como se puede apreciar hay muchas diferencias en las instrucciones del programa
escrito en Visual Basic y las del programa en lenguaje C, pero realizan las mismas acciones.
Desde el punto de vista de la lógica del algoritmo es exactamente el mismo.
· Java:
impo r t j ava . i o.* ;
Str i ng No m ;
byte NDT;
d o{
No m = le e.read L i ne();
}
· Python:
AM = 1
whi le A M ! = 0 :
No m = raw_ i np ut(‘ D ig ite nom bre d el t ra baja d or ’ )
NDT = i npu t( ‘ D i g ite núm ero d e d ías t ra baja d os’ )
A M = i npu t( ‘ D i gite as ig na c ión m ens u al’ )
B R = i npu t( ‘ D i g ite bonifica c iones rec ibid as’ )
O D = i npu t( ‘ D i gite ot ras d ed u cc iones’ )
i f A M ! = 0:
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
pr i nt No m , P N
· JavaScript:
<H TML>
<B O DY >
<SC R IPT >
var n o m = n e w S t rin g();
var n dt = n e w N um b e r();
var a m = n e w N um b e r();
var b r = n e w N um b e r();
var o d = n e w N um b e r();
var sal = n e w N um b e r();
var tde ven = n e w N um b e r();
var re t = n e w N um b e r();
var tde d u c = n e w N um b e r();
var p n = n e w N um b e r();
do {
n o m = p rom p t(“ D ig ite el nom bre” );
n dt = N um b e r( p rom p t(“ D ig ite d ías t ra baja d os” ));
a m = N um b e r(p rom p t(“ D ig ite as ig na c ión m ens u al” ));
b r = N um b e r(p rom p t(“ D ig ite bonifica c iones rec ibid as” ));
o d = N um b e r(p rom p t(“ D ig ite ot ras d ed u cc iones” ));
i f (a m ! = 0 ) {
sal = a m /3 0 *nd t ;
td even = sal+ br ;
ret = td even* 5/1 0 0 ;
ss = td even* 1 2 /1 0 0 ;
td ed u c = ret+ ss+ od ;
pn = td even-td ed u c ;
d ocum e n t .w rite(nom ,” “, pn,’ < BR/> ’ );
}
} whi le (a m ! = 0 );
</ SC R IPT >
</ B O DY >
</ H TML>
· PHP:
<?p h p
$ stdi n = fo pe n( ‘ p h p : //stdi n’,’ r ’ )
se ttype ( $ n o m ,’str i n g ’ ) ; se tty p e ($nd t ,’ integer ’ );
se ttype ( $ a m ,’ f loa t’ ) ; se ttype ($br,’ floa t’ );
se ttype ( $ o d,’ f loa t’ ) ; se ttype ($sal,’ floa t’ );
se ttype ( $ tde v e n ,’ f loa t’ ) ; se t ty p e ($ret ,’ f loa t’ );
se ttype ( $ tde duc ,’ f loa t’ ) ; se t ty p e ($pn,’ floa t’ );
do {
e c ho ‘ D i g i te e l n o m b re’, P H P_EO L;
fscanf( $ stdi n ,”%s”, $ n o m );
e c ho ‘ D i g i te dí as tra baja d os’, P H P_EO L;
fscanf( $ stdi n ,”%d”, $ n dt);
e c ho ‘ D i g i te asi g n a c i ó n m ens u al’, P H P_EO L;
fscanf( $ stdi n ,”%f ”, $ a m ) ;
e c ho ‘ D i g i te b o n i f i ca c i o nes rec ibid as’, P H P_EO L;
fscanf( $ stdi n ,”%f ”, $ b r ) ;
e c ho ‘ D i g i te o tras de ducc iones’, P H P_EO L;
fscanf( $ stdi n ,”%f ”, $ o d) ;
i f ( $ a m ! = 0) {
$ sal = $ a m /3 0* $ n dt ;
$ tde v e n = $ sal+$ b r ; 280
$ re t = $ tde v e n * 5/10 0 ; 281
$ ss = $ tde v e n * 12 /10 0 ;
$ tde duc = $ re t+$ ss+$od ;
$ p n = $ tde v e n -$ tded u c ;
e c ho $ n o m ,’ ‘, $ p n , P H P_EO L;
}
} whi le ( $ a m ! = 0) ;
?>
Ejemplo 2.
Diseñar un algoritmo que tabule la función:
1
PESO = 170 -
e HR
Los datos para la humedad relativa (HR) deben ser valores enteros desde 5 y hasta 150
que representan el grado de humedad relativa de un lote de bultos de arroz. La función
determina el peso del bulto en relación con su Humedad Relativa. Se debe calcular e im-
primir el peso de cada uno de los bultos que conforman el lote. El proceso termina cuando
digite un valor para Humedad Relativa de –999.
Diagrama de
caja negra del
problema
Paso 3. Diseño
De acuerdo con las especificaciones, la figura 69 presenta el diagrama de flujo corres-
pondiente al diseño del algoritmo del ejemplo 2, para procesar los datos para un único
bulto de arroz. Luego se pensará en cómo volver cíclico el diagrama para completar el
algoritmo, como solución del problema planteado (Ver figura 69)
Figura 69: Algoritmo para el cálculo del peso de un bulto de arroz según
su Humedad Relativa. Ejemplo 2 / Capítulo 4.
Incluyendo la condición que hace que el algoritmo se vuelva cíclico y presentando ade-
más la proposición que contiene el dato de control del ciclo o dato centinela, se presenta
todo esto en la figura 70.
Figura 70: Algoritmo incluyendo el ciclo. Ejemplo 2 / Capítulo 4.
Al igual que en el algoritmo del ejemplo 1, en este segundo algoritmo también se imprime
un cálculo errado, que procesa el dato como centinela. La corrección la presenta la figura 71.
282
283
HR PESO
HR PESO
70
HR PESO
70 169.99
HR PESO 284
285
70 169.99
HR PESO
70 169.99
200
HR PESO
70 169.99
200
-999
· Visual Basic:
Pr i vate Su b Co m m a n d1_Cl i c k()
Di m H R As Do u ble, Pe so A s D oub le
Do
H R = Inpu tbox( “D i g i te la hu m ed a d rela t iva” )
If H R <> -9 9 9 The n
If ( H R >= 5 ) AND (H R < = 1 5 0 ) T h e n
Pe so = 170 - 1 / E x p(H R)
Pr i nt Pe so
Else
End i f
El se
End i f
Lo o p U nti l H R = -9 9 9
End Su b
En el programa anterior se ve que hay dos instrucciones Else, que de acuerdo con la
definición técnica del lenguaje se pueden eliminar ya que no tiene ninguna instrucción que
se ejecute cuando la evaluación de las proposiciones de su If correspondiente da Falso o NO.
Como se puede apreciar no hay ninguna instrucción traducida, según lo indica el dia-
grama de flujo de la figura 72, por el lado de NO en las condiciones numeradas con 4 y 5.
Esto permite quitar estas instrucciones del programa sin que se altere el funcionamiento
del mismo. Finalmente, el programa modificado se muestra a continuación:
Pr i vate Su b Co m m a n d1_Cl i c k( )
Di m H R As D o u ble, Pe so As D oub le
Do
H R = Inpu tbox( “D i g i te la hu m ed a d rela t iva” )
If H R <> -9 9 9 The n
If ( H R >= 5 ) AND ( H R < = 1 5 0 ) T h e n
Pe so = 170- 1/ E x p(H R)
Pr i nt Pe so
End i f
End i f
Lo o p U nti l H R = -9 9 9
End Su b
286
· Lenguaje C: 287
#inc lu d e <stdi o. h >
#inc lu d e <co n i o. h >
vo i d mai n( ) {
float H R , Pe so ;
d o{
pr i ntf( “D i g i te h um e da d rela t iva” );s ca n f(“ % f ”,&H R);
i f( H R ! = -9 9 9 ) {
i f( ( H R >= 5 ) & & ( H R < = 1 5 0 )){
Pe so = 170-1/ex p (H R);
Pr i ntf( “%10 . 2 f ”, Pes o)
}
}
}whi le( H R ! = -9 9 9 )
}
· Java:
i mpo r t j ava . i o.* ;
pu bl i c c lass Ca p 4 E j e m p lo2 {
pu bli c stati c vo i d mai n(S t rin g[ ] a rgs )t h row s I O E xce p t ion {
Bu ffe re d Read e r lee = n e w B uf fe re d Rea d e r(n e w I n p ut S t rea m Rea d e r(Sys te m . in));
d o u ble H R , Pe so ;
d o{
Syste m.o u t . pr in tl n(“ D ig ite hu m ed a d rela t iva” );
H R = D o u ble. pa rs e D oub le(lee.rea d Lin e());
i f( H R ! = -9 9 9 ) {
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
· Python:
i mpo r t m a th
HR = 0
whi le H R ! = -9 9 9 :
H R = i npu t( ‘ D i g i te h umed a d rela t iva’ )
i f H R ! = -9 9 9 :
i f H R >= 5 a n d H R < = 1 5 0 :
Pe so = 170 - 1/mat h .ex p(H R);
pr i nt Pe so
· JavaScript:
<H TML>
<B O DY >
<SC R IPT >
var h r = ne w N um b e r();
var p e so = ne w N um b e r();
do {
h r = Num b er (prom pt (“ D ig ite la hu m ed a d rela t iva” ));
i f ( h r ! = -9 99) {
p e so = 1 70 -1 /M a t h.ex p(hr );
do cum ent .w r ite(pes o,’ < BR/> ’ );
}
} whi le ( h r ! = -999);
</ SC R IPT >
</ B O DY >
</ H TML>
· PHP:
<?p h p
$ stdi n = fo pe n( ‘ p h p : //stdi n’,’ r ’ );
se ttype ( $ h r,’ f loa t’ ) ;
se ttype ( $ p e so,’ f loa t’ ) ;
do {
e c ho ‘ D i g i te la h um e da d rela t iva : ‘ ;
fscanf( $ stdi n ,”%f ”, $ h r ) ;
i f ( $ h r ! = -9 9 9 ) {
$ p e so = 170 -1/ex p ( $ h r );
e c ho $ p e so, P H P_ EO L ;
}
} whi le ( $ h r ! = -9 9 9 ) ;
?>
Con esto se termina la prueba de escritorio del ejemplo 2. Faltaría en tal caso transcribir el
programa en el computador y proceder a hacer las pruebas de funcionamiento necesarias para
verificar la exactitud del mismo.
Como conclusión sobre la implementación de algoritmos en los que se involucran pro-
cesos cíclicos, repetitivos, reiterativos o repetidos, se puede decir, en términos generales,
que básicamente lo que se hace es construir un algoritmo pensado como si fuera para el
288
procesamiento de un dato de los del problema e introducir a este algoritmo una estructura
289
que repita el proceso para los demás datos. Desde el punto de vista de la diagramación la
estructura se puede ver así (Ver figura 73):
Como se puede apreciar en la figura 73, entre el punto de suma y la condición se deben
escribir los componentes o instrucciones del proceso repetitivo que correspondan según sea
el problema. No necesariamente antes del punto de suma se debe colocar el inicio, ni después
de la condición se debe colocar el fin. Qué va antes del punto de suma y qué va después de la
condición, depende única y exclusivamente de la naturaleza del problema que se esté anali-
zando, lo mismo que la construcción de la proposición que va en la toma de decisión.
4.2. Acumuladores
Los acumuladores son variables que almacenan información en procesos en los cuales se
requiere dar resultado de sumas de varias cantidades, por ejemplo, la cantidad de dinero
recaudado en un día de ventas hechas por una compañía comercializadora que vende cual-
quier clase de productos. Este proceso se puede describir como que se hace una venta y
luego se hace otra venta y se va sumando los totales de cada venta hecha y al final del día
se debe reportar cuánto suman las ventas hechas. Esto es lo que se conoce como cálculo
de acumulado de ventas hechas.
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
Desde el punto de vista del diseño de algoritmos y del manejo que estos hacen de la
información que se tiene almacenada en la memoria del computador, el comportamiento de
los acumuladores se puede comprender como una variable (supóngase de nombre Venta)
en la que se almacena un valor, por ejemplo, digitado desde el teclado de la computadora.
Esta acción se puede diagramar usando una instrucción como la siguiente (Ver figura 74):
290
291
que pueda terminar su ejecución. La corrección que se debe hacer de este algoritmo se
presenta en la figura 78.
Hecha la corrección del ciclo se puede apreciar que, para utilizar adecuadamente un
acumulador, se debe definir en dos partes: en primera instancia todo acumulador debe
tener una instrucción que le dé un valor de inicio y esta instrucción se debe colocar en el
diagrama antes del punto de suma que conforma el ciclo, en segunda instancia se debe
colocar la instrucción que define el acumulador, la que debe ubicarse en el diagrama den-
tro del conjunto de instrucciones que conforman el ciclo en orden que lógicamente cum-
pla con el propósito de acumular y conforme a las condiciones que considera el problema.
Si se somete esta parte del algoritmo a una prueba de escritorio y además se presenta
el manejo que hace de la información en memoria, se tendría el siguiente procedimiento:
para comenzar la prueba se deben numerar los componentes del algoritmo de la figura 78,
como se reescribe en la figura 79. Además, supóngase que se tiene la información de las
ventas hechas durante un día normal de trabajo en una comercializadora, para efectos de
La lista de variables para la prueba de escritorio está conformada por dos variables, así:
la prueba de escritorio un día normal de trabajo se reduce a tres ventas realizadas, esto
es, una primera venta de $b175630, una segunda por $ 110500 y una tercera por $ 135500.
Figura 79: Ciclo con acumulador para prueba de escritorio.
La lista de variables para la prueba de escritorio está conformada por dos variables, así:
Acum Venta
292
293
Se inicia la ejecución del algoritmo que muestra la figura 79 con la instrucción 1, la
que inicia el acumulador en cero, ya que se pretende calcular el acumulado de las ventas
hechas en el día; al comenzar el proceso este acumulado es de cero, pues no se ha regis-
trado ninguna venta. La memoria del computador almacenaría información como la exhibe
la imagen de la figura 80, la que presenta una variable Acum con un valor de cero y otra
variable Venta sin ningún valor.
Acum Venta
Acum Venta
0 175630
Acum Venta
175630 175630
La instrucción 5 evalúa la proposición dando como resultado FALSO o NO; debido a que
el contenido de la variable Venta no es igual a cero. Por lo tanto, terminada la ejecución de
la instrucción 5 se vuelve a ejecutar la instrucción 3, para suministrar el segundo dato que
se tiene considerado para la prueba de escritorio en curso. La instrucción 3 es una lectura
y por tanto se puede digitar el valor de la segunda venta, esto es 110500. La memoria que-
daría cargada según lo muestra la figura 83.
294
295
Acum Venta
175630 110500
Acum Venta
286130 110500
Acum Venta
421630 0
X = 0
Esta instrucción se debe ubicar antes del punto donde comienza la estructura del
ciclo que maneja el acumulador y su valor específico de inicio depende del plantea-
miento del problema.
En segundo lugar, un valor de incremento mediante una instrucción de la forma:
X = X + Y
4.3. Contadores
Los contadores son variables que se incrementan de manera similar que las variables
definidas como acumuladores, pero, a diferencia de estos, dicho incremento se hace me-
diante un valor constante y no mediante una variable. La instrucción típica para definir un
contador es:
X = X + 1
En esta instrucción se puede ver que la variable que se define como contador es en rea-
lidad un acumulador, pues tiene su misma estructura; una variable a la que se le suma algo.
En el caso de los contadores se suma siempre un mismo valor todas las veces que se ejecute
la instrucción.
Desde el punto de vista del diseño de los algoritmos que contengan contadores en su
construcción se procede de la misma manera como se hace con los acumuladores, esto es,
se deben definir las mismas dos cosas; la primera su valor de inicio, que es una instrucción
de la forma:
X = 0
Y, lo mismo que con los acumuladores, esta instrucción se debe ubicar en el diagrama
antes del comienzo del ciclo que maneja el contador. La segunda cosa a definir para que el
contador haga su trabajo, es la instrucción:
X = X + 25
La ubicación de esta instrucción en el diagrama debe estar dentro del ciclo que
maneja el contador y en el sitio que lógicamente le corresponda para que realice ade-
cuadamente su tarea.
Los contadores y los acumuladores deben tener siempre un valor para iniciar su tra-
bajo dentro del contexto del algoritmo; sin embargo, para el caso del ejemplo, el valor de
inicio que se tomó, tanto para el acumulador como para el contador, fue cero, sin querer
298
decir con esto que debe ser el valor a tomar siempre, pues el valor de inicio depende
299
única y exclusivamente del planteamiento del problema que se esté resolviendo. De igual
manera, el valor de incremento constante que se debe tomar para el contador depende
exclusivamente del problema. En las explicaciones que se están adelantando aquí con
respecto a la definición del contador, el valor que se tomó fue 25, siendo un valor para el
ejemplo, arbitrariamente tomado. Otro aspecto de los contadores y de los acumuladores
es que cuando se incluyen en el diseño del algoritmo siempre deben hacerse dentro del
contexto de un ciclo.
Ejemplo 3.
Imprimir la secuencia de números enteros entre dos números dados, siempre el pri-
mero menor que el segundo.
El siguiente ejemplo pretende presentar el uso de los contadores. Supóngase que se
tienen dos valores enteros, siendo el primero menor que el segundo. El propósito es diseñar
un algoritmo que obtenga los números enteros comprendidos entre el primer número y el
segundo número.
Paso 1. Investigación Preliminar
Del problema se desprende que hay que considerar dos números enteros cualquiera
y a partir de ellos generar una secuencia de números enteros, así: si toman los números
38 y 51 se genera la secuencia 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49 y 50. Es claro que en la
secuencia no se incluyen los números que se consideran para generar dicha secuencia.
Paso 2. Especificaciones
Diagrama de
caja negra del
problema
Paso 3. Diseño
La idea fundamental del problema consiste en tener un número almacenado en la me-
moria del computador. Este valor debe ser el menor de los digitados pero incrementado en
uno. Es decir que se debe comenzar a generar la secuencia de números a partir del menor
más uno. El diagrama sería:
300
301
Figura 89: Algoritmo para generar una secuencia de números enteros entre N1 y N2.
Ejemplo 3 / Capítulo 4.
Como se puede ver en el algoritmo de la figura 89, no siempre los ciclos se deben
diseñar pensando en que se tienen que repetir todas las instrucciones que lo componen,
según se describió en el ejemplo 1. La ubicación del ciclo dentro del algoritmo depende de
lo que proponga el problema.
Paso 4. Prueba de Escritorio
En esta prueba se debe prestar atención a cómo se va incrementado la variable C y a
cómo el valor identificado por ella es el que se va imprimiendo. Para la prueba se requiere
el algoritmo con los componentes numerados y la tabla de variables. En este ejemplo no se
mostrarán las figuras que visualizan el contenido de las variables, como se hizo en el ejemplo
2, en el que se describió el acumulador, simplemente atenderemos al contenido de la tabla
de variables.
El algoritmo con los componentes numerados se muestra a continuación:
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
La lista de variables:
N1 N2 C
N1 N2 C
2 6
N1 N2 C
2 6 3
Al terminar de ejecutar la instrucción 4 se pasa a la 5, que es un punto de suma, luego
pasa a la instrucción 6 que imprime el valor almacenado en C.
N1 N2 C
2 6 3
N1 N2 C
2 6 3
2 6 3
N1 N2 C
2 6 3
N1 N2 C
2 6 3
5
Terminada de ejecutar la instrucción 6 pasa a ejecutar la instrucción 7, incrementando el
valor de C, dando como resultado esta lista de variables:
N1 N2 C
2 6 3
5
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
· Visual Basic:
Pr i vate Su b Co m m a n d1_Cl i c k()
Di m N1 As Inte ge r, N2 As I n te ge r, C A s I n te ge r
N1 = Inpu tbox( “D i g i te e l pr im er valor ” )
N2 = Inpu tbox( “D i g i te e l s egu nd o valor ” )
If N1 < N2 The n
C = N1 + 1
Do
Pr i nt C
C = C + 1
Lo o p U nti l C = N2
El se
End If
End Su b
If N1 < N2 The n
C = N1 + 1
Do
Pr i nt C
C = C + 1
Lo o p U nti l C = N2
End If
End Su b
· Lenguaje C:
# i nc lu d e <stdi o. h >
# i nc lu d e <co n i o. h >
vo i d mai n( ) {
i nt N1, N2 , C ;
i f( N1 < N2 ) {
C = N1 + 1;
d o{
pr i ntf( “%5 d”, C ) ;
C = C + 1;
} whi le ( C ! = N2 ) ;
}
· Java:
i mpo r t j ava . i o.* ;
pu bl i c c lass Ca p 4 E j e m p lo3 {
pu bli c stati c vo i d mai n(S t rin g[ ] a rgs )t h row s I O E xce p t ion {
Bu ffe re d Read e r le e = n e w B uf fe re d Rea d e r(n e w I n p ut S t rea m Rea d e r(Sys te m . in));
i nt N1, N2 , C ;
Syste m.o u t . pr i ntln( “Dig ite el pr im er valor ” );
N1 = Inte ge r. parse Int (lee.rea d L in e());
Syste m.o u t . pr i ntln( “Dig ite el s egu nd o valor ” );
N2 = Inte ge r. parse Int (lee.rea d L in e());
i f ( N1 < N2 ) {
C = N1 + 1;
d o{
Syste m.o u t . p rin tl n(“ ” + C );
C = C + 1;
}whi le( C ! = N2 ) ;
}
}
}
· Python:
i f N1 < N2 :
C = N1 + 1
whi le C ! = N 2 :
pr i nt C
C = C + 1
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
· JavaScript:
<H TML>
<B O DY >
<SC R IPT >
var n1 = n e w N um b e r();
var n2 = n e w N um b e r();
var c = n e w N um b e r();
</ H TML>
· PHP:
<? p h p
$ stdi n = fo p e n(‘ php: //s td in’,’ r ’ );
se ttype ( $ n1 ,’ f loa t’ );
se ttype ( $ n 2 ,’ f loa t’ );
se ttype ( $ c ,’ integer ’ );
e c ho ‘ D i g i te el pr im er valor ’ ;
fscanf( $ std in,” % f ”, $n1 );
e c ho ‘ D i g i te el s egu nd o valor ’ ;
fscanf( $ std in,” % f ”, $n2 );
i f ( $ n1<$ n 2 ) {
$ c = $ n1 +1 ;
do {
e c h o $c , P H P_EO L;
$ c = $c+1 ;
} whi le ($c ! = $n2 );
}
?>
Ejemplo 4.
Calcular las notas definitivas de cada uno de los 35 estudiantes de un curso. Además, cal-
cular la nota promedio del curso y el índice de mortalidad (cantidad de estudiantes que pier-
den), teniendo en cuenta que la nota mínima es 0.0, la máxima 5.0 y la nota probatoria 3.0.
Para empezar, es necesario que se redefina el planteamiento del problema, con la
idea de calcular no solo la nota definitiva o promedio del estudiante, sino también que
se procesen todas las notas definitivas que obtuvieron todos los estudiantes de un curso
integrado por 35 personas. Además, se debe determinar cuántos perdieron y cuál es el
promedio del curso y su índice de pérdida.
Paso 1. Investigación Preliminar
El procedimiento para calcular el promedio o nota definitiva de un estudiante, como lo
muestra el ejemplo 7 del capítulo 2, está dado por la suma de las cuatro notas parciales y
dividir esta suma por cuatro. El problema aquí es que no solo hay que procesar la defini-
tiva de un estudiante, sino que hay que procesar la definitiva de todos los estudiantes del
curso, queriendo decir con esto, que se debe repetir el proceso de cálculo de la definitiva
para cada estudiante. La definitiva se calcula así:
N1 + N 2 + N3 + N4 306
Def =
4 307
Ahora bien, para calcular el promedio del curso se debe sumar cada una de las definiti-
vas y acumularlas para obtener dicho promedio. Esto es:
Σ i=1
35
Def 1
Prom_Curso =
35
Estu_Pier = { Estu_Pier + 1
Estu_Pier + 2
si Def < 3.0
si Def ≥ 3.0
Estu_Pier
Indice_Mor = * 100
35
Paso 2. Especificaciones
Diagrama de caja
negra del proble-
ma:
Paso 3. Diseño
Pensando en lo que se debe hacer para procesar los datos de un estudiante se ten
308
309
Figura 92: Algoritmo modificado para procesar los datos de los estudiantes.
Ejemplo 4 / Capítulo 4.
Como se aprecia en la figura 92, se han incluido los elementos correspondientes al ciclo
y al contador para procesar uno a uno los datos de cada estudiante hasta alcanzar los 35 del
curso. El Contador de Estudiantes (CE) se ha iniciado en cero y se incrementa de uno en uno
(CE = CE + 1) hasta que su valor sea igual a 35 con lo que se termina la ejecución del algoritmo.
Ahora se debe pensar en lo concerniente a calcular el promedio del curso (Prom_Cur-
so). Por la definición que se ha hecho para este, se debe calcular primero el acumulado
de todas las notas definitivas y después dividir por el total de estudiantes del curso (35).
El diagrama con el acumulador incluido se muestra enseguida:
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
310
311
La instrucción 7 evalúa la proposición como Verdadera esta vez, por tanto, se ejecuta la
instrucción 8 que es contar al estudiante como uno que pierde el curso.
Según los datos suministrados para cada uno de los estudiantes, el único que pierde el
curso es el tercero. Por lo tanto, la variable Estu_Pier contiene uno. La lista de variables muestra:
Después de mostrar los datos el algoritmo finaliza. Si se analizan los resultados, estos
concuerdan y solo queda pensar que, si el algoritmo se ejecutó bien con tres estudiantes,
funcionará adecuadamente para los 35 del curso; lo que quiere decir que el algoritmo que
muestra la figura 95 es equivalente a de la figura 94, salvo por la instrucción de la condición
en la que se evalúa que CE = 3, instrucción 10 en la figura 95.
Ejemplo 4 – Paso 5. Codificación
Para la codificación se tomará el diagrama que muestra la figura 95, ya que el diagrama
de la figura 33 fue modificado agregando la numeración para probarlo, por lo que debe
codificarse el algoritmo de la figura 94. Nuevamente, como en los ejemplos anteriores, se
presenta en diferentes lenguajes.
· Visual Basic:
Pr i vate Su b Com m a nd 1 _Clic k ()
D i m N1 As D oub le, N 2 A s D oub le
D i m N3 A s D oub le, N 4 as D oub le, D ef as D oub le
D i m Pro m _Cu rs o as D oub le, I nd ice_M or as D oub le
D i m Estu_P ier as I n te ge r, C E as I n te ge r
CE = 0
Pro m _Curs o = 0
Estu_ P i e r = 0
Do
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
D e f = (N 1 + N 2 + N 3 + N 4 ) / 4
Pr i nt D ef
If D e f < 3 .0 T h e n
Es t u _P ier = Es t u _P ier + 1
End IF
CE = CE + 1
Pro m _Cu rs o = Prom _Cu rs o + D ef
Lo o p U nt il C E = 3 5
· Lenguaje C:
#i nc lu d e <std io. h>
#i nc lu d e <conio. h>
vo i d mai n( ) {
float N1, N 2 , N 3 , N 4 , Prom _Cu rs o, I nd ice_M or, D ef ;
i nt Estu_P ier, C E ;
C E = 0;
Pro m _Curs o = 0 ;
Estu_ P i e r = 0 ;
d o{
pr i ntf(“ D ig ite N ota 1 ” ); s ca n fi
pr i ntf(“ D ig ite N ota 2 ” ); s ca n f(“ % d ”, &N 2 );
pr i ntf(“ D ig ite N ota 3 ” ); s ca n f(“ % d ”, &N 3 );
pr i ntf(“ D ig ite N ota 4” ); s ca n f(“ % d ”, &N 4 );
D e f = (N 1 + N 2 + N 3 + N 4 ) / 4 ;
pr i ntf(“ %1 0 . 2 f ”, D ef );
If( D e f < 3 .0 ){
Es t u _P ier = Es t u _P ier + 1 ;
}
CE = CE + 1;
Pro m _Cu rs o = Prom _Cu rs o + D ef;
} whi le ( C E ! = 3 5 );
d o{
Syste m.o u t . pr in t(“ D ig ite N ota 1 : “ );
N1 = Float . pars e Floa t (lee.rea d Lin e());
Syste m.o u t . pr in t(“ D ig ite N ota 2 : “ );
N2 = Float . pars e Floa t (lee.rea d L in e());
Syste m.o u t . pr in t(“ D ig ite N ota 3 : “ );
N3 = Float . pars e Floa t (lee.rea d Lin e());
Syste m.o u t . pr in t(“ D ig ite N ota 4 : “ );
N4 = Float . pars e Floa t (lee.rea d L in e());
D e f = ( N1 + N2 + N 3 + N 4 ) / 4 ;
Syste m.o u t . pr in tl n(“ ” + D ef );
i f( D e f < 3 .0) {
316
Estu_ P i e r = Es t u _P ier + 1 ; 317
}
C E = C E + 1;
Pro m _Curso = Prom _Cu rs o + D ef;
}whi le ( C E ! = 3 5 ) ;
CE = 0
Pro m _Curso = 0
Estu_ P i e r = 0
whi le C E ! = 3 5 :
N1 = i npu t( ‘ D i g i te No ta 1: ‘)
N2 = i npu t( ‘ D i g i te No ta 2: ‘)
N3 = i npu t( ‘ D i g i te No ta 3: ‘)
N4 = i npu t( ‘ D i g i te No ta 4: ‘)
D e f = ( N1 + N2 + N3 + N 4 ) / 4
pr i nt D e f
i f( D e f < 3 .0 ) :
Estu_ P i e r = Estu_ Pier + 1
CE = CE + 1
Pro m _Curso = Pro m _Cu rs o + D ef
ce = 0;
p ro m _curs o = 0 ;
e stu_ p i e r = 0 ;
do {
n1 = N um b e r(p rom p t(“ D ig ite N ota 1 “ ));
n 2 = N um b e r(p rom p t(“ D ig ite N ota 2 ” ));
n 3 = N um b e r(p rom p t(“ D ig ite N ota 3 ” ));
n 4 = N um b e r(p rom p t(“ D ig ite N ota 4” ));
de f = (n1 + n2 + n3 + n4 )/4 ;
d o cu m e n t .w rite(d ef,’ < BR/> ’ );
i f ( de f <3 .0 ) {
¡ e s t u _pier = es t u _pier+1 ;
}
ce = ce+1 ;
p ro m _cu rs o = prom _cu rs o+ d ef ;
} whi le ( ce! =3 5 );
p ro m _curs o = prom _cu rs o/3 5 ;
i n di ce_ m or = es t u _pier/3 5* 1 0 0 ;
d o cu me n t .w rite(prom _cu rs o,” “, ind ice_m or,’ < BR/> ’ );
</ SC R IPT >
</ B O DY >
</ H TML>
· Lenguaje PHP:
<?p h p
$ stdi n = fo pe n( ‘ p h p : //stdi n’,’ r ’ );
se ttype ( $ n1,’ f loa t’ ) ; se ttype ($n2 ,’ floa t’ );
se ttype ( $ n 3 ,’ f loa t’ ); se ttype ($n4 ,’ f loa t’ );
se ttype ( $ de f,’ f loa t’ ) ; se ttype ($prom _cu rs o,’ floa t’ );
se ttype ( $ i n di ce_ m o r,’ f loa t’ ) ; s e t ty p e ($es t u _pier,’ integer ’ );
se ttype ( $ ce,’ i n te ge r ’ ) ;
$ ce = 0 ;
$ p ro m _curso = 0 ;
$ e stu_ p i e r = 0;
do {
e c ho ‘ D i g i te No ta 1 ‘ ; fsca n f($s td in,” % f ”, $n1 );
e c ho ‘ D i g i te No ta 2 ‘ ; fsca n f($s td in,” % f ”, $n2 );
e c ho ‘ D i g i te No ta 3 ‘ ; fsca n f($s td in,” % f ”, $n3 );
e c ho ‘ D i g i te No ta 4 ‘ ; fsca n f($s td in,” % f ”, $n4 );
$ de f = ( $ n1+$ n 2 +$ n 3 +$ n 4 )/4 ;
e c ho $ de f, P H P_ EO L ;
i f ( $ de f <3 .0 ) {
$ e stu_ p i e r = $ e stu_ pier+1 ;
}
$ ce = $ ce +1;
$ p ro m _curso = $ p ro m _cu rs o+$d ef; 318
} whi le ( $ ce ! =3 5 ) ;
319
$ p ro m _curso = $ p ro m _curso/3 5 ;
$ i n di ce_ m o r = $ e stu_ p i e r/3 5*1 0 0 ;
e c ho $ p ro m _curso,’ ‘, $ i n di ce_m or, P H P_EO L;
?>
Ejemplo 5.
Diseñar un algoritmo para calcular el factorial de un número.
Paso 1. Investigación Preliminar
El factorial de un número consiste en multiplicar los números enteros anteriores a él,
esto es, si se quiere saber cuál es el factorial de 5, entonces hay que multiplicar 5*4*3*2*1.
La respuesta es 120. Si el número es 15, el factorial es 1.307.674.368.000 que se obtiene de
multiplicar los números enteros 15*14*13*12*11*10*9*8*7*6*5*4*3*2*1. Si el número es 1, el
factorial es 1. Si el número es 0 el factorial es 1. Para números negativos el factorial no existe.
En términos generales se puede decir que para calcular el factorial de un número se
puede escribir así:
N!
N! = ||i
F = N*(N-1)*(N-2)*(N-3)*...* 1
Paso 3. Diseño
Como se puede deducir de las especificaciones hay que definir un contador que tiene
como valor de inicio N, valor de decremento 1 y valor de finalización 1. Hay que observar que
el problema define un contador, pero, a diferencia de los tratados hasta el momento, es un
contador decreciente.
Como todo problema que considera un contador dentro de su solución, debe llevar un
ciclo. Desde el punto de vista del diseño del algoritmo y, sin perder de vista que para todo algo-
ritmo se debe suministrar información, es necesario procesar dicha información y dar un resul-
tado. Ahora bien, el algoritmo para calcular el factorial debe llevar una instrucción que permita
suministrar un valor entero, un ciclo con un contado definido en su contexto para procesar la
información y una instrucción para visualizar el resultado en pantalla, así (Ver figura 96):
Figura 96: Ciclo para el cálculo básico del factorial de N. Ejemplo 5 / Capítulo 4.
320
Como se puede ver en la figura 96 el algoritmo toma un dato N, y a partir de él comienza
321
a multiplicar hasta que el valor de N llegue a cero. Hay que tener en cuenta, según plantea-
miento expuesto por el diseño del algoritmo, que cuando se suministra un valor negativo
el algoritmo procesa y da un resultado inconsistente ya que los valores negativos no deben
producir resultado, porque, según la definición hecha en el problema, no hay resultado para
estos. El diseño del algoritmo que considera esta inconsistencia se muestra a continuación:
Figura 97: Algoritmo que tiene en cuenta los valores negativos. Ejemplo 5 / Capítulo 4.
De las especificaciones también se entiende que el factorial de cero es uno y, que de
acuerdo al diseño planteado en la figura 97 para el algoritmo, al dar un cero para N, el algorit-
mo entra en un ciclo infinito pues nunca se cumple la condición para N = 0 ya que comienza a
disminuir y N toma valores negativos. Por tanto, hay que introducir otra condición que evalúe
este hecho y que haga que el algoritmo no entre en un ciclo infinito.
Con todo lo considerado hasta el momento y cumpliendo con las especificaciones plantea-
das por el problema, se logró un diseño del algoritmo con el que es posible calcular el factorial
de un número entero positivo o cero. El diagrama completo se muestra a continuación:
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
N F
N F
-4
N F
0
Con la instrucción 5 inicia el valor del acumulador de las multiplicaciones. Para esto se
usará la variable F. La información que tiene la memoria del computador es:
N F
0 1
N F
0 1
De nuevo se ejecuta el algoritmo para probarlo esta vez con un valor de 1. Se inicia
ejecutando de nuevo la instrucción 1 y de allí a la 2. La lista de variables será:
N F
1
N F
1 1
N F
1 1
0
N F
1 1
0
N F
Nuevamente se realiza las tres primeras instrucciones, modificando la lista de variables así:
N F
Con estos datos se sigue a la instrucción 5 que almacena 1 en F. La lista de variables queda:
N F
3 1
N F
3 1
3
Luego se ejecuta la instrucción 9 que decrece el valor de N en uno. La siguiente es
la lista de variables:
N F
3 1
2 3
N F
3 1
2 3
N F
3 1
2 3
1 6
N F
3 1
2 3
1 6
6
La instrucción 9 vuelve a restar el valor de N en 1 y queda con 0; ahora se ejecutará la
instrucción 10 que da, para la evaluación de la proposición, verdadero o SÍ, puesto que N
es igual 0, entonces se sigue a la instrucción 11 que visualiza el contenido de la variable F,
que es 6. A continuación la lista de variables:
N F
3 1
2 3
1 6
El se
Do
F = F * N
N = N - 1
Lo o p U nti l N = 0
End If
Pr i nt F
End If
En d Su b
Nuevamente hay que hacer un pequeño ajuste al programa, ya que si se observa en la
condición cuando el resultado de la evaluación de la proposición If N = 0 Then da ver-
dadero, no hay que ejecutar ninguna instrucción. Por tanto, para que este hecho no quede
escrito en el programa se necesitaría una condición que no tiene efectos reales, entonces
habrá que cambiar la proposición con su valor contrario para invertir el resultado y así
cuando la valoración sea verdadera se ejecuten las instrucciones correspondientes. El pro-
grama recodificado se muestra a continuación. Se deja al lector la comparación entre los
dos programas para que saque sus conclusiones.
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
Pr i vate Su b Co m m a n d1_Cl i c k ()
Di m N As Inte ge r, F As In te ge r
N = Inpu tbox ( “D i g i te valor a calcu la r fa c tor ial” )
If N < 0 The n
Pr i nt “ Valo r n e ga ti v o. N o t iene fa c tor ial”
El se
F = 1
If N > 0 The n
Do
F = F * N
N = N - 1
Lo o p U nti l N = 0
End If
Pr i nt F
End If
End Su b
· Codificación en Lenguaje C:
#i nc lu d e <stdi o. h >
#i nc lu d e <co n i o. h >
vo i d mai n( ) {
i nt N, F;
pr i ntf ( “D i g i te valo r a calcu la r fa c tor ial” ); s ca n f(“ % d ”, &N );
i f( N < 0) {
pr i ntf ( “ Valo r n e ga ti vo. N o t iene fa c tor ial” );
}
e l se {
F = 1;
i f ( N > 0) {
d o{
F = F * N;
N = N – 1;
} whi le ( N <> 0) ;
}
pr i ntf ( “%10d”, F ) ;
}
}
· Codificación en Lenguaje Java:
i mpo r t j ava. i o.* ;
pu bli c c lass Ca p 4 E j e m p lo 4 {
pu bli c stati c vo i d mai n( Str in g[ ] a rgs )t h row s I O E xce p t ion {
Bu ffe re d Read e r le e = n e w B uf fe re d Rea d e r( n e w I n p ut S t rea m Rea d e r( Sys te m . in));
i nt N, F= 0;
Syste m .o ut. p r i n tl n( “D i g ite valor a calcu la r fa c tor ial” );
N = Inte ge r. parse Int ( lee.rea d Lin e());
if (N < 0){
Syste m.o u t . pr i ntl n(“ Valor nega t ivos . N o t iene fa c tor ial” );
}
e l se{
F = 1;
i f( N > 0) {
d o{
F = F * N;
N = N - 1;
}whi le( N ! = 0 ) ;
}
Syste m.o u t . pr i ntl n(“ ” + F);
}
}
} 328
· Codificación en Lenguaje Python: 329
N= i npu t( ‘ D i g i te Val ro a calcular fa c tor ial’ )
if N < 0:
pr i nt ‘ Valo r n e ga ti v o s. No t iene fa c tor ial’
e lse :
F = 1
whi le N! = 0:
F = F * N
N = N - 1
pr i nt F
· Codificación en Lenguaje JavaScript:
<H TML>
<B O DY >
<SC R IPT >
var n = n e w N um b e r();
var f = n e w N um b e r();
d o cum e n t .w rite(“ D ig ite valor a calcu la r fa c tor ial” );
n = N um b e r(p rom p t());
if (n<0) {
d ocum e n t .w rite(“ Valor N ega t ivo. N o t iene Fa c to -
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
se ttype ( $ n ,’ integer ’ );
se ttype ( $f,’ i n teger ’ );
i f ( $ n <0 ) {
e c ho ‘ Valor N ega t ivo. N o t iene Fa c tor ial’, P H P_EO L;
}
e l se {
$f = 1;
i f ( $ n >0 ) {
do {
$f = $f *$n;
$ n = $n-1 ;
} while ($n! = 0 );
}
e c ho $f, PH P_EO L;
}
?>
4.4. Conclusiones sobre ciclos, contadores y acumuladores
Como conclusión en relación a los contadores y acumuladores se puede decir que para su
correcta implementación en el algoritmo, se deben tener en cuenta las siguientes reglas
generales:
Para los contadores:
· Tener una instrucción que defina su valor de inicio. Se pone antes del ciclo y ge-
neralmente es igual a cero.
· Tener una instrucción que de defina su valor de incremento. Se escribe entre los
límites del ciclo, generalmente antes de la salida.
· Tener una instrucción de finalización del contador. Generalmente se ubica como
parte de la condición que controla el ciclo. Es el dato centinela o de control.
· En un diagrama de flujo de datos, estos aspectos se pueden visualizar así:
330
331
1
Algunos de los problemas fueron tomados de la página algo-
ritmia.net (Algoritmica.NET, 2001), elhacker.com (elhacker.net, s.f.),
la página de la Universidad Nacional (Universidad Nacional de
Colombia. Dirección Nacional de Innovación Académica, 2009),
de los libros: Programminig Challenges: The programming Con-
test Training Manual (Skiena & Revilla, 2008), Métodos Numéricos
Básicos para Ingeniería con implementaciones en MATLAB y Excel
(De Castro Payares, 2014), Java Programming, 6th Edition (Farrell,
2012), Python 3 al descubierto (Fernandez Montoro, 2013), JavaS-
cript (Sánchez Maza, 2012) y otros son propuestos por el autor.
3. Mostrar los 100 primeros números naturales desde el más grande hasta el más
pequeño.
4. Calcular la suma de los números enteros entre 2 y 1000.
5. Determinar el promedio de todos los números pares, de los impares, de los múlti-
plos de 3 y de los múltiplos de 5 que hay desde 1000 hasta 2.
6. Leer un conjunto de números enteros positivos y determinar cuál es el mayor y el
menor, y visualizar la secuencia de números pares entre el menor y el mayor valor
leído.
7. Escribir un algoritmo que lea dos números enteros y determiné el máximo común
divisor.
8. Plantear un algoritmo que lea dos valores enteros, siempre el primero menor que
el segundo. El algoritmo debe determinar el promedio de la secuencia de números
enteros desde el menor hasta el mayor.
9. Saber si un número es primo o no.
10. Dar un conjunto de valores enteros y determinar cuántos son cero.
11. Suministrar datos de tipo entero y determinar cuántos de estos son positivos y
cuántos negativos. El programa debe terminar con un valor de cero.
12. Calcular la suma de los divisores de un número entero positivo. Se debe tener en cuen- 332
ta no incluir la unidad ni el número en la suma. 333
13. Dar tres datos de tipo entero (minutos, segundos y centésimas) correspondientes
al tiempo que un ciclista gasta en darle la vuela a la pista de un velódromo de 250
m de longitud. Calcular la velocidad media (kilómetros por hora) en la vuelta. Se
deben procesar datos de 20 ciclistas que participaron en una prueba. Determinar
cuál ciclista ganó.
14. Calcular de un conjunto de personas cuántas pesan hasta 40 Kg, cuántas están en-
tre 40 Kg y 50 Kg, cuántas pertenecen al intervalo (50,60], cuántas están en (60, 75]
y cuántas tienen más de 75 Kg. Determinar además cuántas personas hay y cuánto
es el peso promedio del conjunto de personas y de cada grupo.
15. Considerar la siguiente propiedad descubierta por Nicómaco de Gerasa: sumando el
primer impar, se obtiene el primer cubo, sumando los dos siguientes se obtiene el
segundo cubo, sumando los tres siguientes, se obtiene el tercer cubo y así sucesiva-
mente, es decir:
13 = 1 = 1
2 3
= 3 + 5 = 8
3 3
= 7 + 9 + 11 = 27
4 3
= 13 + 15 + 17 + 19 = 64
5 3
= 21 + 23 + 2 5 + 27 + 29 = 125
6 3
= 31 + 3 3 + 3 5 + 37 + 39 + 41 = 343
7 3
= 43 + 45 + 47 + 49 + 51 + 53 + 55 = 51 2
Dado un número N entero positivo menor a 100, visualizar los N primeros cubos
utilizando esta propiedad de la forma como se muestra arriba.
16. Calcular la suma de la siguiente serie:
17. Escriba la serie de Fibonacci hasta que el último valor sea mayor a 10000. La serie es:
5, 10, 15, 20, 25, 30, ..., N, …, 30, 25, 20, 15, 10, 5.
1 1 1 1 1 1 1
S = + ··· + + + + + +
N 30 25 20 15 10 5
20. Dado un número entero, imprimir las fracciones menores a 1 sin que se repitan. Si
se tiene el número 8, se tendrá:
1, 1, 1, 1, 1, 1, 1 , 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6, 7
8 7 6 5 4 3 2 7 5 3 8 7 5 4 7 5 8 7 6 7 8
21. Tomar un número entero positivo menor que 1000 y ejecutar el siguiente proceso:
Si N es par se debe dividir por 2 y el resultado es el nuevo valor de N. Si N es impar
tomar N multiplicarlo por 3 y sumar uno, el resultado se convierte en el nuevo valor
de N. El proceso se repite hasta que N sea igual a uno. Debe darse como resultado
cada uno de los valores calculados para N. Ejemplo: Si N es 14 la respuesta será
14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1
22. Calcular la división de dos números enteros utilizando solamente los operadores
de suma y resta. Se debe dar como resultado el cociente y el residuo.
23. Leer dos números y calcular Z=XY usando solo la operación básica de la multiplica-
ción. Debe considerar que X es un valor real y Y es uno entero.
24. Suministrar un número entero mayor a 1000 y determinar parejas de números
amigos menores al número dado.
25. Usar la siguiente serie para calcular el número π:
∞
π = 4
Σ
I =0
(-1) i
2i+1
1 1 1
= 4 ( 1 + -
3 5 7
+ ···)
26. Usar la siguiente serie para calcular el número π:
∞
π =
1
2 Σ
i =0
24
(i) 2
=
1
2
(24 +
24
22
+
24
32
+
24
42
+ ···)
2 4 4 6 6 8
π = 4 * * * * * * * ···
3 3 5 5 7 7
Σ (-1) n
Coseno(x) = x 2n
(2n)!
n=0
n
ex = Σ
i=0
xi
i!
= 1 + x +
x2 x3 x4
+ +
2! 3! 4!
+ ··· +
xn
n!
334
335
30. Usando la siguiente serie de Taylor calcular el seno de x:
n
seno(x) =
Σ
i=0
(-1) i
(2i + 1)!
x ( 2 i + 1)
x x!
(y ( ( (
y ! (-y)!
N!
C =
J! (N - J)!
Para J = 0, 1, 2, 3, ..., N
1. Se tiene los datos de un conjunto de los estudiantes de una universidad, así:
· Código · Nombre
· Valor crédito · Número crédito tomados
· Valor Recargo matrícula
35. Se planea hacer una inversión de $ 10.000.000 con una tasa de interés del 2%.
Cuántos años se requieren para que la inversión sobrepase $ 2.410.500.000. El cál-
culo para determinar la inversión es como sigue:
A ño 1: 1 0 .0 0 0 .0 0 0 (1 + 0 .02 ) = 1 0 . 2 0 0 .0 0 0
A ño 2 : (1 0 . 2 0 0 .0 0 0 +1 0 .0 0 0 .0 0 0 ) (1 + 0 .02 ) = 2 0 .6 0 4.0 0 0
A ño 3 : ( 2 0 .6 0 4.0 0 0 +1 0 .0 0 0 .0 0 0 ) (1 + 0 .02 ) = 31 . 21 6 .0 8 0
A ño 4 : ( 31 . 21 6 .0 8 0 +1 0 .0 0 0 .0 0 0 ) (1 + 0 .02 ) =
42 .04 0.401 ,6 0
El pr i me r añ o s e d e p re c ia 1 /2 8 de 21 .0 0 0 .0 0 0
El se gu ndo año s e d e p re c ia 2 /2 8 de 21 .0 0 0 .0 0 0
El te rce r a ño s e d e p re c ia 3/2 8 de 21 .0 0 0 .0 0 0
El cu ar to año s e d e p re c ia 4/2 8 de 21 .0 0 0 .0 0 0
El q u i nto año s e d e p re c ia 5/2 8 de 21 .0 0 0 .0 0 0
El sex to año s e d e p re c ia 6/2 8 de 21 .0 0 0 .0 0 0
El sé pti mo año s e d e p re c ia 7/2 8 de 21 .0 0 0 .0 0 0
Dar el valor del bien a depreciar y el número de años e imprimir las depreciaciones
por cada año.
38. La función de probabilidad binomial es:
Leer el valor de N y de P y mostrar los valores de PB para valores K = 0, 1, 2, 3, ..., N.
N!
PB = p k (1-p) N- K Donde ≤ p ≤ 1
K! (N-K)!
{
1690000 + 0.418p 2
- p < 0
1950000
f(p) =
p
1 + p > 0
1950000
8, 7, 6, 5, 4, 3,
2, 1 336
7, 6, 5, 4, 3, 337
2, 1
6, 5, 4, 3, 2, 1
5, 4, 3, 2, 1
4, 3, 2, 1
3, 2, 1
2, 1
1
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
42. Dado un número entero del intervalo [1, 9], genere la secuencia de números como
se muestra a continuación para el 4.
1 1
1 2 2 1
1 2 3 3 2 1
1 2 3 4 4 3 2 1
1 2 3 4 4 3 2 1
1 2 3 3 2 1
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores
1 2 2 1
1 1
43. Tomar un carácter y número entero impar desde 11 hasta 99 y generar como salida
un rombo como el que se muestra a continuación y se ha dado # y 7.
#
# # #
# # # # #
# # # # # # #
# # # # # # # # #
# # # # # # #
# # # # #
# # #
#
N
Suma = Σ
i=0
i!
45. Leer un número entero positivo y calcular la suma de sus dígitos. Ejemplo: si se
suministra el número 3424056 el algoritmo debe dar como resultado 24 que se
obtiene de sumar 3+4+2+4+0+5+6.
46. Existen diferentes métodos para calcular la raíz cuadrada de un número, uno de
ellos es el método de aproximación Newton-Rampson el cual consiste en calcular
el siguiente valor con base en el anterior de la siguiente forma:
N
Ri +
Ri
R i+1 =
2
|R i+1 - R i | ≤ 0.000001
Leer un número y calcular su raíz cuadrada usando el método Newton-Rampson.
47. Hacer un algoritmo que determine cuántos de un conjunto de N puntos que se
localizan en el primer y en el tercer cuadrante y además están delimitados por una
circunferencia con centro en (h, k) y Radio R.
48. Generar e imprimir 50 puntos perpendiculares a la recta Y = AX - B. Los puntos se
deben encontrar mínimo a una distancia N de la recta.
49. Calcular e imprimir un número N de puntos localizados sobre una elipse de tal
forma que se encuentren en el segundo cuadrante. La elipse tiene centro en (h, k)
y semiejes a, b.
50. Suministrar los resultados de una votación para la elección del presidente de una
51. compañía con tres candidatos en contienda. Uno de los candidatos será identificado
por el número 1, otro con el número 2 y el último con el número 3. El número 4 es
para los votos en blanco y el 5 es para los votos nulos. El algoritmo debe dar como
resultado una lista con los candidatos ordenados por la cantidad de votos obtenidos.
52. Codificar un mensaje usando la siguiente técnica: correr una posición cada uno de
los caracteres del mensaje según la posición que le corresponda en la distribución
del teclado diseñado para español Latinoamérica. Esto quiere decir que para el ca-
rácter ‘T’ le corresponderá el carácter ‘Y’, Para la ‘M’ le corresponderá ‘;’, así sucesi- 338
vamente para todos los caracteres del teclado. Tenga presente que para ‘0’ corres- 339
ponde ‘1’, para ‘P’ corresponde ‘Q’, para ‘Ñ’ corresponde ‘A’ y para ‘_’ corresponde ‘Z’.
53. Hallar las raíces de una función usando el Método de Bisección.
54. Construir un algoritmo que tome un conjunto datos recolectados en intervalos de
ƒ
tiempo, con una frecuencia de muestreo s y un número de datos N par y determine
N
2
f(t) =
Σ
i=0
[ A i cos(2π¡Δft) + B i sin(2π¡Δft)]
Donde
fs
Δf =
N
N
Ai =
N
2 Σ
r=1
y r cos(
2πri
N
)
N
Bi =
N
2 Σ
r=1
y r
sin (
2πri
N
)
CAPÍTULO 5
A R R E G L O S Y M AT R I C E S
01 01
01 01
Objetivo
Aplicar correctamente los arreglos y matrices como herra-
mientas fundamentales en el diseño de algoritmos en los
que se necesita manejar grandes volúmenes de datos del
mismo tipo o información homogénea.
342
343
Como se puede apreciar en la figura 102, para guardar estos datos en la memoria
del computador se hace necesario el uso de seis variables; cada una guardará el valor
de la venta de uno de los días. Para manejar esta información hay que hacer referencia
a cada dato por su nombre de variable, por lo que se tendría que usar nombres dife-
rentes, dificultando el manejo de la información; en especial cuando, como en otros
casos, no haya seis, sino muchos más datos del mismo tipo. Por ejemplo 30, 40 o 50
datos, claro, cada uno con nombre diferente, entonces se estaría hablando de 30, 40 o
50 nombres de variables. En estos casos se hace necesario introducir algunas técnicas
que permitan manipular de manera práctica toda esta información.
Lo que se busca es acomodar toda esta información en una sola variable y manejar,
en consecuencia, la información usando un solo nombre. Gráficamente, en la memoria
del computador la información se agruparía así:
Figura 103: Variables acomodadas para ser manejadas por un solo nombre.
Como se puede apreciar en la figura 103 y, si se compara con la 102, se ve que se
han unido las variables formando una sola a la que se le ha asignado un único nombre.
Con la unión se ha construido una variable que no solo puede guardar un único dato,
sino que permite almacenar los 6 datos que requiere el ejemplo de las ventas de la se-
mana. La manera de distinguir un dato de otro es asignar un número de identificación
a cada variable, a este número se le conoce con el nombre de subíndice de la variable
o subíndice del arreglo. Gráficamente se verá así:
344
345
Figura 104: Subíndices de los arreglos.
Para almacenar un dato en la memoria del computador por medio de una variable
común se escribe así:
X = 56
Lo que representa el hecho de hacer que en la memoria del computador quede alma-
cenado un valor de 56 y se puede hacer referencia a él por medio de la variable X. Con los
arreglos el mecanismo es similar solo que al nombre de la variable se le especifica entre
paréntesis el subíndice que determina a cuál de los compartimentos de la variable tipo
arreglo se hace referencia. Para el ejemplo que se está tratando, esto se escribe así:
Ventas(2) = 78960
La variable tipo arreglo tiene una manera especial de escribirse para poder ser interpre-
tada por el computador correctamente, por lo cual el nombre es compuesto, una parte es el
nombre de la variable, la otra es la referencia al elemento del arreglo mediante un número
entre paréntesis a lo que se conoce como subíndice. La ejecución del siguiente algoritmo
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
Inicio
1 I=2
2 Dato = 68960
3 Ventas(2) = Dato + 10000
4 Ventas(I + 1) = Ventas(I) - I * 21050
5 I=I+1
6 Ventas(I + 2) = Ventas(I-1)/4 + I * 5000
Fin
Si se hace un estudio de la tarea que hace cada una de las instrucciones del algoritmo, se
ve que la instrucción 1 asigna el valor de 2 a la variable I, la memoria del computador queda así:
346
347
Con la última instrucción se calcula el valor del elemento 5 del arreglo Ventas la que da
34740. En la memoria del computador la información queda almacenada como lo muestra
la figura 111.
Si se quiere asignar datos a todos los elementos de un arreglo se debe hacer con un
ciclo y un contador, el proceso consiste en llenar uno por uno los elementos del arreglo.
Como se entiende que cada elemento es referenciado por su índice y que este es un valor
entero que se incrementa de uno en uno, se hace necesario el uso de un contador para
completar el arreglo. En el diseño del contador se debe tener presente que el valor de ini-
cio del contador es el valor del límite inferior del rango del arreglo y que el incremento del
contador debe ser de uno en uno. El contador se debe incrementar hasta alcanzar el límite
superior. El diseño del algoritmo para llenar un arreglo, guardándose en él valores reales
que se digitan desde el teclado, se ve así:
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
I n i c i o
D i m A r r ( 1 a 1 0 ) : R e a l
I = 1
D a t o
A r r ( I ) = D a t o
I = I +1
N O
I > 1 0
S I
F i n
350
351
Como se pude ver en el diagrama una operación de recorrido llena el arreglo Arr y otra
lo imprime.
Cuando un algoritmo necesita hacer recorridos sobre arreglos se puede introducir modi-
ficaciones para que sea más compacto. La figura 114 muestra cómo se puede introducir una
estructura especial para la operación de recorrido. Dado que el ciclo es manejado por un
contador, este define su valor de inicio, su valor de incremento y su valor de finalización de
tal forma que se puede reescribir el diagrama como una sola instrucción, así:
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
En la figura 114 se hace un paralelo para mostrar claramente cómo se reduce el algorit-
mo original de la figura 113. La representación que se hace del algoritmo al lado derecho en
la figura 114, muestra el ciclo para-desde-hasta, esta es una simplificación de la estructura
estudiada en el capítulo 3, en la sección sobre puntos de control. Según se definió y contex-
tualizando el ciclo para-desde-hasta en el algoritmo de la figura 114, la instrucción queda:
I = 1 , 1 0 , 1
Para la prueba de escritorio se debe hacer primero una lista de las variables que se
involucran en el algoritmo:
1 2 3
Ahora se debe comenzar el seguimiento del diagrama, instrucción por instrucción.
Iniciando con la ejecución de la instrucción 1, y se pasa a la 2 que define la cantidad y el
tipo de elementos que tiene el arreglo. La instrucción 3 empieza el ciclo para-desde-has-
ta con el contador I, iniciando con 1 y va hasta 3, con incrementos de 1. En la memoria del
computador se almacena un 1 en la variable I como efecto de esta instrucción. La lista
de variables será a este punto:
1 2 3
1
1 2 3 354
1 34 355
1 34
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
1 2 3
2 -5
34
1 34
1 2 3
2 -5
34
3
1 34
1 2 3
2 -5
34
3 9
De la instrucción 4 se pasa a la instrucción 5 y el resultado de la condición es Verda-
dero y por tanto se pasa a ejecutar la instrucción 6, la que almacena en el tercer elemento
del arreglo, el número 9, ya que el contador I tiene 3. La lista de variables es la siguiente:
1 34
1 2 3
2 -5
34 9
3 9
1 2 3
La instrucción 1 da inicio al algoritmo y de ésta se pasa a ejecutar la instrucción 2
que define el tamaño y tipo de datos que se van a manejar en el arreglo. La instrucción
3 define el contador mediante el uso de la variable I dándoles uno como valor de inicio.
La lista de variables es:
1
1 2 3
1 34
1 2 3
358
359
La evaluación en 5 da como resultado Verdadero, ya que el contenido de la variable Dato
(34) es mayor que cero, por lo que se pasa a ejecutar 7. Esta instrucción pasa el valor guardado
en Dato al arreglo en el primer elemento de este, pues el contador I contiene 1. La lista de
variables queda:
1 34
1 2 3
34
1 34
1 2 3
2
34
El resultado de ejecutar la instrucción 4 permite digitar otro valor, en este caso –5,
valor que queda guardado en la variable Dato. Obsérvese la lista de variables:
1 34
1 2 3
2 -5
34
Esta vez, l evaluación en 5 es Falso ya que el contenido de Dato es menor que cero.
Con este resultado se ejecuta ahora la instrucción 6 que decrece el contador I en uno.
La lista de variables queda:
1 34
1 2 3
2 -5
34
1
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
1 34
2 -5 1 2 3
1 34
2
1 34
2 -5 1 2 3
1 9 34
2
De la instrucción 4 se pasa a ejecutar la 5, que da como resultado Verdadero ya que el
contenido de la variable Dato es mayor que cero. Con este resultado se pasa a ejecutar la
instrucción 7 que almacena en la segunda posición del arreglo Arr el valor que contiene la
variable Dato, es decir, el número 9. La lista de variables queda:
1 34
2 -5 1 2 3
1 9 34 9
2
Se aprecia claramente que ahora sí se desechan correctamente los valores que no son
positivos y se guardan apropiadamente en el arreglo los valores permitidos según el problema.
De la instrucción 7 se pasa a la 8 y de allí a la 9 que devuelve el ciclo a la instrucción
3. Nuevamente se incrementa el contador I y determina que es 3 que no es mayor a 3, por
lo cual pasa a ejecutar la instrucción 4. La lista de variables queda:
La instrucción 4 permite suministrar otro valor. En esta ocasión se digita el 951. Lista de
variables queda de esta forma:
1 34
2 -5
1 2 3
1 9
34 9
2 951
3
De la instrucción 4 se pasa a ejecutar la instrucción 5 y de esta a la 7 ya que la evalua-
ción de la condición es Verdadero. La instrucción 7 pasa el valor guardado en Dato a Arr en
el tercer elemento ya que el contador I tiene 3. La lista de variables será:
1 34
2 -5
1 2 3
1 9
34 9 951
2 951
3
1 34
2 -5
1 9 1 2 3
2 951 34 9 951
3
4
La instrucción 10 es una instrucción de lectura por medio del teclado, en la que se debe
suministrar un valor para determinar en qué elemento del arreglo se encuentra, si es que
está registrado en él. Para efectos de la prueba con el uso de la instrucción 10 se digita el
valor 9. La lista de variables queda:
1 34 9
2 -5
1 9 1 2 3
2 951 34 9 951
3
4
1 34 9
2 -5
1 9
1 2 3
2 951
34 9 951
3
4
1
362
I Dato Buscar Arr
363
1 34 9
2 -5
1 9
2 951 1 2 3
3 34 9 951
4
1
2
1 34 9
2 -5
1 9
2 951 1 2 3
3 34 9 951
4
1
2
De 13 se pasa a 14 y de allí a la 15 que devuelve en ciclo a la instrucción 11. La instrucción
incrementa nuevamente el contador I y como no es mayor que 3 se pasa a ejecutar la ins-
trucción 12. La lista de variables queda:
1 34 9
2 -5
1 9
2 951
1 2 3
3
34 9 951
4
1
2
3
son iguales. Como es Falso se pasa a ejecutar la instrucción 14 y luego la 15 que devuelve el
ciclo a la instrucción 11. La instrucción 11 incrementa el contador I de 3 a 4 y como es mayor a
3 entonces se pasa a la instrucción 16, es decir, se termina el ciclo. La lista de variables queda:
1 34 9
2 -5
1 9
2 951
3 1 2 3
4 34 9 951
1
2
3
4
Diagrama Codificación
I = 1 , 1 0 , 1 F o r I = 1 To 1 0 S t e p 1
For I = 1 To 10 Step 1
Dato = InputBox(“Digite el dato a registrar en el arreglo”)
If Dato > 0 Then
Arr(I) = Dato
Else
I=I-1
End If
Next I
#include <stdio.h>
void main(){
int Arr[10],Dato, Buscar, I;
for(I=0;I<10;I++){
printf(“Digite el dato a registrar en el arreglo”);
scanf(“%d”,&Dato);
if(Dato > 0)Arr[I]=Dato;
else I=I-1;
}
printf(“Digite el dato a Buscar”);scanf(“%d”,&Buscar);
for(I=0;I<10;I++){
if(Buscar==Arr[I]){
printf(“%3d”,I)
}
}
}
· Codificación en Java:
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
import java.io.*;
public class Cap5_1_Buscar {
public static void main(String[ ] args)throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
int Arr[] = new int[10];
int Dato, Buscar, I;
for(I=0;I<10; I++){
System.out.print("Digite el dato a registrar en el arreglo: ");
Dato = Integer.parseInt(lee.readLine());
if (Dato > 0){Arr[I]=Dato;}
else{I=I-1;}
}
· Codificación en JavaScript:
<HTML>
<BODY>
<SCRIPT type="text/javascript">
var arr = new Array(10);
366
var i = new Number(); 367
var dato = new Number();
var buscar = new Number();
for (i=0;i<=9;i++) {
dato = Number(prompt("Digite el dato a registrar en el arreglo "+ i));
if (dato>0) {
arr[i] = dato;
} else {
i = i+1;
}
}
document.write("Digite el dato a buscar",'<BR/>');
buscar = Number(prompt());
for (i=0;i<=9;i++) {
if (buscar==arr[i]) {
document.write(i,'<BR/>');
}
}
</SCRIPT>
</BODY>
</HTML>
· Codificación en PHP:
<?php
$stdin = fopen('php://stdin','r');
$arr = array();
settype($i,'integer');
settype($dato,'integer');
settype($buscar,'integer');
for ($i=0;$i<=9;$i++) {
echo 'Digite el dato a registrar en el arreglo',PHP_EOL;
fscanf($stdin,"%d",$dato);
if ($dato>0) {
$arr[$i+1] = $dato;
}
else { $i = $i+1;}
}
echo $i,PHP_EOL;
}
}
?>
For I = 1 To 10 Step 1
Dato = InputBox("Digite el dato a registrar en el arreglo")
If Dato > 0 Then
Arr(I) = Dato
Else
I=I-1
End If
Next I
Do
I = InputBox(“Digite la posición a modificar”)
If I>0 And I>11 Then
Dato = InputBox(“Digite el Dato a Modificar”)
Arr(I)= Dato
End If
Loop Until I = 0
End Sub
· Codificación del algoritmo en Lenguaje C:
#include <stdio.h>
void main(){
int Arr[10],Dato, I;
for(I=0;I<10;I++){
printf(“Digite el dato a registrar en el arreglo”);
scanf(“%d”,&Dato);
if(Dato > 0)
Arr[I]=Dato;
else
I=I-1;
}
do{
printf(“Digite la posición a modificar”);scanf(“%d”,&I);
if((I>-1)&&(I<10)){
printf(“Digite el dato a modificar”);scanf(“%d”,&Dato);
Arr[I] = Dato;
}
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
}while(I != -1);
}
for(I=0;I<10; I++){
System.out.print("Digite el dato a registrar en el arreglo: ");
Dato = Integer.parseInt(lee.readLine());
if (Dato > 0){Arr[I]=Dato;}
else{I=I-1;}
}
do{
System.out.print("Digite la posición a modificar: ");
I = Integer.parseInt(lee.readLine());
if((I>-1) && (I<10)){
System.out.print("Digite el dato a modificar: ");
Dato = Integer.parseInt(lee.readLine());
Arr[I] = Dato;
}
}while(I != -1);
}
}
· Codificación del algoritmo en Python:
Arr = []
I=0
while I < 10:
Dato = input('Digite el dato a registrar en el arreglo: ')
if Dato > 0:
Arr.append(Dato)
I=I+1
else:
I=I-1
I=0
while I != -1:
I = input('Digite la posición a modificar: ')
if I> -1 and I < 10:
Dato = input('Digite el dato a modificar: ')
Arr[I] = Dato
<HTML>
<BODY>
<SCRIPT> 370
var arr = new Array(10);
371
var i = new Number();
var dato = new Number();
for (i=0;i<10;i++) {
dato = Number(prompt("Digite el dato a registrar en el arreglo"));
if (dato>0) {arr[i] = dato;}
else {i = i-1;}
}
do {
i = Number(prompt("Digite la posición a modificar"));
if (i>-1 && i<10) {
dato = Number(prompt("Digite el dato a modificar"));
arr[i] = dato;
}
} while (i!=-1);
</SCRIPT>
</BODY>
</HTML>
· Codificación del algoritmo en PHP:
<?php
$stdin = fopen('php://stdin','r');
$arr = array();
settype($i,'integer');
settype($dato,'integer');
for ($i=0;$i<=9;$i++) {
echo 'Digite el dato a registrar en el arreglo ',$i;
fscanf($stdin,"%d",$dato);
if ($dato>0) {$arr[$i+1] = $dato;}
else {$i = $i-1;}
}
do {
echo 'Digite la posición a modificar',PHP_EOL;
fscanf($stdin,"%d",$i);
if ($i>-1 && $i<10) {
echo 'Digite el dato a modificar',PHP_EOL;
fscanf($stdin,"%d",$dato);
$arr[$i+1] = $dato;
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
}
} while ($i!=-1);
?>
Figura 123: Algoritmo que llena un arreglo y permite insertar datos al mismo.
For I = 1 To 10
Dato = InputBox("Digite Dato a Registrar en el Arreglo")
Arr(I) = Dato
Next I
Do
I = InputBox("Digite posición a Insertar")
If I > 0 And I < 11 Then
Dato = InputBox("Digite Dato a insertar")
For K = 10 To I + 1 Step -1
Arr(K) = Arr(K - 1)
Next K
Arr(I) = Dato
End If
Loop Until I = 0
End Sub
· Codificación del algoritmo en Visual Basic:
#include <stdio.h>
void main () {
int Arr[10], Dato, K, I;
do{
printf(“Digite la posición a insertar”);scanf(“%d”,&I);
if((I>-1)&&(I<10)){
printf(“Digite el dato a insertar”);scanf(“%d”,&Dato);
for(K=9; K>I; K--){
Arr[K]= Arr[K-1];
}
Arr[I] = Dato;
}
}while(I != -1);
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
for(I=0;I<10; I++){
System.out.print("Digite el dato a registrar en el arreglo: ");
Dato = Integer.parseInt(lee.readLine());
Arr[I]=Dato;
}
do{
System.out.print("Digite la posición a insertar: ");
I = Integer.parseInt(lee.readLine());
if((I>-1) && (I<10)){
System.out.print("Digite el dato a insertar: ");
Dato = Integer.parseInt(lee.readLine());
for(K=9;K>I;K--){
Arr[K]= Arr[K-1];
}
Arr[I] = Dato;
}
}while(I != -1);
}
}
· Codificación del algoritmo en Python:
Arr = []
I=0
while I < 10:
Dato = input('Digite el dato a registrar en el arreglo:')
Arr.append(Dato)
I=I+1
I=0
while I != -1:
I = input('Digite la posicion a insertar: ')
if I> -1 and I < 10:
Dato = input('Digite el dato a insertar: ')
K=9
while K > I:
Arr[K]= Arr[K-1]
K=K-1
Arr[I] = Dato
<HTML>
<BODY>
<SCRIPT> 374
var arr = new Array(10); 375
var i = new Number();
var dato = new Number();
var k = new Number();
for (i=0;i<10;i++) {
dato = Number(prompt("Digite el dato a registrar en el arreglo"));
if (dato>0) {arr[i] = dato;}
else {i = i-1;}
}
do {
i = Number(prompt("Digite la posición a insertar"));
if (i>-1 && i<10) {
dato = Number(prompt("Digite el dato a insertar"));
for (k=9;k>i;k--) {
arr[k] = arr[k-1];
}
arr[i] = dato;
}
} while (i!=-1);
</SCRIPT>
</BODY>
</HTML>
· Codificación del algoritmo en PHP:
<?php
$stdin = fopen('php://stdin','r');
$arr = array();
settype($i,'integer');
settype($dato,'integer');
settype($k,'integer');
for ($i=0;$i<10;$i++) {
echo 'Digite el dato a registrar en el arreglo';
fscanf($stdin,"%d",$dato);
if ($dato>0) {$arr[$i+1] = $dato;}
else {$i = $i-1;}
}
do {
echo 'Digite la posición a insertar',PHP_EOL;
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
fscanf($stdin,"%d",$i);
if ($i>-1 && $i<10) {
echo 'Digite el dato a insertar',PHP_EOL;
fscanf($stdin,"%d",$dato);
for ($k=9;$k>$i;$k--) {
$arr[$k+1] = $arr[$k];
}
$arr[$i+1] = $dato;
}
} while ($i!=-1);
?>
5.2.8. Eliminar datos de un arreglo
La operación de eliminar consiste en retirar un dato del arreglo. Para este proceso se nece-
sita saber cuál es la posición del dato a eliminar, se ubica el elemento y luego se desplazan
todos los elementos que se encuentran por la derecha del mismo, una posición hacia la
izquierda desde la posición dada hasta el antepenúltimo elemento. El elemento de la ex-
trema derecha se desocupa. El algoritmo se presenta a continuación.
376
377
#include <stdio.h>
void main(){
int Arr[10], Dato, K, I;
for(I=0; I<10; I++){
printf(“Digite el dato a registrar en el arreglo”);
scanf(“%d”,&Dato);
Arr[I]= Dato;
}
do{
printf(“Digite la posición a eliminar”);scanf(“%d”,&I);
if((I>-1)&&(I<10)){
for(K = I; K < 9; K++){
Arr[K]= Arr[K + 1];
}
Arr[9] = 0;
}
}while(I != -1);
}
· Codificación del algoritmo en Java:
import java.io.*;
public class Cap5_4_Eliminar {
public static void main(String[ ] args)throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
int Arr[] = new int[10];
int Dato, I, K;
for(I = 0; I < 10; I++){
System.out.print("Digite el dato a registrar en el arreglo: ");
Dato = Integer.parseInt(lee.readLine());
Arr[I]=Dato;
}
do{
System.out.print("Digite la posición a eliminar: ");
I = Integer.parseInt(lee.readLine());
if((I>-1) && (I<10)){
for(K = I; K < 9; K++){
Arr[K] = Arr[K+1];
}
Arr[9] = 0;
}
}while(I != -1);
}
} 378
Arr = []
I=0
I=0
while I != -1:
I = input('Digite la posicion a insertar: ')
if I> -1 and I < 10:
K=I
while K < 9:
Arr[K]= Arr[K+1]
K=K+1
Arr[9] = 0
· Codificación del algoritmo en JavaScript:
<HTML>
<BODY>
<SCRIPT>
var arr = new Arnray(10);
var i = new Number();
var dato = new Number();
var k = new Number();
for (i=0;i<10;i++) {
dato = Number(prompt("Digite el dato a registrar en el arreglo"));
if (dato>0) {arr[i] = dato;}
else {i = i-1;}
}
do {
i = Number(prompt("Digite la posición a eliminar"));
if (i>-1 && i<10) {
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
for (k=i;k<9;k++) {
arr[k] = arr[k+1];
}
arr[9] = 0;
}
} while (i!=-1);
</SCRIPT>
</BODY>
</HTML>
<?php
$stdin = fopen('php://stdin','r');
$arr = array();
settype ($i,'integer'); settype($dato,'integer'); settype($k,'integer');
for ($i=0;$i<10;$i++) {
echo 'Digite el dato a registrar en el arreglo'; fscanf($stdin,"%d",$dato);
if ($dato>0) {$arr[$i] = $dato;}
else {$i = $i-1;}
}
do {
echo 'Digite la posición a eliminar'; fscanf($stdin,"%d",$i);
if ($i>-1 && $i<10) {
for ($k=$i;$k<9;$k++) {
$arr[$k] = $arr[$k+1];
}
$arr[9]=0;
}
} while ($i!=-1);
?>
5.2.9. Agregar datos a un arreglo
Esta operación consiste en añadir un nuevo dato después del último elemento que se en-
cuentre ocupado, siempre que haya elementos disponibles para ser llenados en el arreglo.
El siguiente algoritmo llena un arreglo con letras mayúsculas en los diez primeros elemen-
tos y después se pueden agregar letras mayúsculas hasta que se llene o hasta que se digite
una letra minúscula.
380
381
Figura 125: Parte inicial del algoritmo para agregar datos a un arreglo.
Figura 126: Parte final del algoritmo para agregar datos a un arreglo
· Codificación del algoritmo en Visual Basic:
Private Sub Command1_Click()
Dim Arr(1 To 50) As String, L As String * 1
Dim k As Integer, I As Integer
For I = 1 To 50
Arr(I) = " "
Next I
For I = 1 To 10
L = InputBox("Digite la Letra a guardar en el arreglo")
If L >= "A" And L <= "Z" Then
Arr(I) = L
Else
I=I-1
End If
Next I
Do
L = InputBox("Digite la Letra a guardar en el arreglo")
If L >= "a" And L <= "z" Then
Else
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
Do
If Arr(I) = " " Then
k=I
I = 50
End If
I=I+1
Loop Until I > 50
If k <> 0 Then
Arr(k) = L
Else
Print "Arreglo Lleno"
End If
End If
End If
Loop Until L >= "a" And L <= "z"
End Sub
· Codificación del algoritmo en Lenguaje C:
#include <stdio.h>
void main(){
char Arr[50], L;
int k, I;
do{
printf(“Digite la Letra a guardar en el arreglo”);
scanf(“%c”,&L); 382
if((L >= ’a’) && (L <= ’z’)){
} 383
else{
if((L >= ’A’) && (L <= ’Z’)){
I = 0;
k = -1;
do{
if(Arr[I] == ’ ’){
k = I;
I = 49;
}
I = I + 1;
}while(I < 50);
if(k != -1){
Arr[k] = L;
}
else{
printf(“Arreglo Lleno”);
}
}
}
}while((L < ’a’) || (L > ’z’));
}
· Codificación del algoritmo en Java:
import java.io.*;
public class Cap5_5_Agregar {
public static void main(String[ ] args)throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
char Arr[] = new char[50], L;
int K, I;
do{
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
}
else{
if((L>='A') && (L<='Z')){
I = 0;
K = -1;
do{
if(Arr[I] == ' '){
K = I;
I = 49;
}
I = I + 1;
}while(I < 50);
if (K != -1){
Arr[K] = L;
}
else{
System.out.print("arreglo lleno");
}
}
}
Arr = [ ]
I=0
while I < 50:
Arr.append(' ')
I=I+1
I=0
while I < 10:
L = raw_input('Digite la letra a guardar en el arreglo: ')
if L >= 'A' and L <= 'Z':
Arr[I] = L
I=I+1
else:
I=I-1
L = 'A'
while L < 'a' or L > 'z':
L = raw_input('Digite la letra a guardar en el arreglo: ')
384
if L >= 'A' and L <= 'Z':
I=0 385
K = -1
if K != -1:
Arr[K] = L
else:
print 'Arreglo lleno'
· Codificación del algoritmo en JavaScript:
<HTML>
<BODY>
<SCRIPT>
var i;
var arr = new Array(50);
var l = new String();
var k = new Number();
for (i=0;i<50;i++) {
arr[i] = " ";
}
for (i=0;i<10;i++) {
l = prompt("Digite la Letra a guardar en el arreglo”);
if (l>="A" && l<="Z") {
arr[i] = l;
}
else {
i = i-1;
}
}
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
do {
l = prompt("Digite la Letra a guardar en el arreglo");
if (l>="a" && l<="z") {
}
else {
if (l>="A" && l<="Z") {
i = 0;
k = -1;
do {
if (arr[i]==" ") {
k = i;
i = 49;
}
i = i + 1;
} while (i<50);
if (k!=-1) {
arr[k] = l;
}
else {document.write("Arreglo lleno",'<BR/>'); }
}
}
} while (!(l>="a" && l<="z"));
</SCRIPT>
</BODY>
</HTML>
· Codificación del algoritmo en PHP:
<?php
$stdin = fopen('php://stdin','r');
$arr = array();
settype($L,'string');
settype($k,'integer');
for ($i=0;$i<50;$i++) {
$arr[$i] = ' ';
}
for ($i=0;$i<10;$i++) {
echo 'Digite la letra a guardar en el arreglo';
fscanf($stdin,"%d",$L);
if ($L>'A' && $L<'Z') {
$arr[$i] = $L;
}
else {
$i = $i-1;
}
}
do {
echo 'Digite la letra a guardar en el arreglo',PHP_EOL;
fscanf($stdin,"%d",$L); 386
if ($L>'a' && $L<'z') { 387
}
else {
if ($L>'A' && $L<'Z') {
$i = 0;
$k = -1;
do {
if ($arr[$i+1]==' ') {
$k = $i;
$i = 49;
}
$i = $i+1;
} while ($i<50);
if ($k!=-1) {
$arr[$k+1] = $L;
}
else {
echo 'Arreglo lleno',PHP_EOL;
}
}
}
} while (!($L>'a' && $L<'z'));
?>
5.2.10. Ordenar los datos de un arreglo
Hay muchas formar de construir algoritmos para ordenar los elementos de un arreglo. A
continuación, se presenta uno en el que se utiliza el método de selección para ordenar
arreglos. El algoritmo lee letras mayúsculas y las almacena en un arreglo. Después ordena
según la tabla ASCII las letras guardadas en el mismo.
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
For I = 1 To 50
L = InputBox("Digite la Letra a guardar en el arreglo")
If L >= "A" And L <= "Z" Then
Arr(I) = L
Else
I=I-1
End If
Next I
For A = 1 To 49 388
For B = A + 1 To 50
389
If Arr(A) > Arr(B) Then
Aux = Arr(A)
Arr(A) = Arr(B)
Arr(B) = Aux
End If
Next B
Next A
For B = 1 To 50
Print Arr(B)
Next B
End Sub
· Codificación del algoritmo en Lenguaje C:
#include <stdio.h>
void main(){
char Arr[50]
char L;
char Aux;
int I;
int A;
int B;
import java.io.*;
public class Cap5_6_Ordenas {
public static void main(String[ ] args)throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
char Arr[] = new char[50];
char L;
char Aux;
int I;
int A;
int B;
}
}
· Codificación del algoritmo en Python:
Arr = [ ]
I=0
while I < 50:
L = raw_input('Digite la letra a guardar en el arreglo: ')
if L >= 'A' and L <= 'Z':
Arr.append(L)
I=I+1
else:
I=I-1
A=0
while A < 49:
B=A+1
while B < 50:
if(Arr[A] > Arr[B]):
Aux = Arr[A]
Arr[A] = Arr[B]
Arr[B] = Aux
B=B+1
A=A+1
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
print Arr
for ($i=0;$i<50;$i++) {
echo 'Digite la Letra a guardar en el arreglo ';
fscanf($stdin,"%d",$L);
if ($L>='A' && $L<='Z') {
$arr[$i] = $L;
} else {
$i = $i-1;
}
}
for ($a=0;$a<49;$a++) {
for ($b=$a+1;$b<50;$b++) {
if (($arr[$a+1]>$arr[$b+1])) {
$aux = $arr[$a];
$arr[$a] = $arr[$b];
$arr[$b] = $aux; 392
}
} 393
}
for ($b=0;$b<50;$b++) {
echo $arr[$b];
}
?>
Pero si no son cinco vendedores los que tiene la compañía, sino diez, veinte o más,
se volvería imposible, desde el punto de vista práctico, el manejo de variables tipo arreglo
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
para resolver el problema. Por lo anterior, se hace necesario definir una variable única
(vendedor) que tenga cinco arreglos y cada uno de 12 elementos, gráficamente se verá así:
Como se puede interpretar de la imagen anterior, lo que se ha hecho es construir una ta-
bla de doble entrada, es decir, que cada fila de la tabla se asocia con la información de cada
uno de los vendedores y cada una de las columnas estará asociada con las ventas hechas
por mes para cada vendedor. En conclusión, la tabla Vendedores está conformada por filas y
columnas. Dado que solo tienen una única variable definida es muy fácil el manejo de esta
cantidad de datos (60), o de una cantidad superior de información si se tiene presente que
se puede aumentar el número de vendedores o el número de meses para cada vendedor.
Para asignar valores a las matrices se hace utilizando dos subíndices, uno para manejar
la fila y el otro para indicar la columna. Si se toma como referencia la variable Vendedores
y se quiere guardar en ella el valor 30 correspondiente a las ventas hechas por el vendedor
3 en el mes de junio, esto se escribirá así:
Vendedores(3,6) = 30
El tres del primer subíndice de la variable Vendedores corresponde a la tercera fila y
el seis corresponde a la sexta columna de la matriz. De manera gráfica esto se vería así:
Vendedores I Dato
1 2 3 4 5 6 7 8 9 10 11 12 2
1
2
3
4
5
La instrucción 3 almacena el valor 68960 en Dato:
Vendedores I Dato
1 2 3 4 5 6 7 8 9 10 11 12 2 68960
1
2
3
4
5
La instrucción 4 calcula la suma de Dato más 10000, lo que da como resultado 78960 y
queda almacenado en la variable Vendedores en la fila 2, columna 7, así:
Vendedores I Dato
1 2 3 4 5 6 7 8 9 10 11 12 2 68960
1
2 78960
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
3
4
5
La instrucción 5 asigna a Vendedores en la fila indicada por I más uno, es decir, la fila
3 con la columna 1 el valor del resultado de 78960 – 2*21050, es decir, 36860 ya que Vende-
dores(2,7) es 78960. Esto es:
Vendedores I Dato
1 2 3 4 5 6 7 8 9 10 11 12 2 68960
1
2 78960
3 36890
4
5
Vendedores I Dato
1 2 3 4 5 6 7 8 9 10 11 12 4 68960
1
2 78960
3 36890
4
5
La instrucción 7 calcula 29222.5 ya que 36890/4 + 4*5000 es 29222.5 que deja guardado
en Vendedores(5,12), así.
Vendedores I Dato
1 2 3 4 5 6 7 8 9 10 11 12 4 68960
1
2 78960
3 36890
4
5 29222.5
Con esto se termina la ejecución de este pequeño algoritmo que muestra la manera
como se trabaja con tablas o matrices.
Desde el punto de vista del diseño de algoritmo, existen infinidad de matrices, depen-
diendo de la naturaleza de los problemas en los que se pueden relacionar datos en dos
dimensiones. De todas formas, existen operaciones básicas que se pueden definir para el
trabajo con matrices, así como se hizo para el trabajo con los arreglos. Estas operaciones
se presentan a continuación. 396
397
5.4. OPERACIONES CON MATRICES
Vendedores(4,9) = 45679
5.4.3. Recorrido de una Matriz
El proceso de asignación secuencial desde la primera columna y hasta la última de la primera
fila y, después, de la misma forma para la segunda fila y luego para la tercera fila, así sucesi-
vamente hasta llenar todas las filas de la matriz, es lo que se denomina recorrido para cargar
una matriz. El algoritmo para cargar o llenar con caracteres una matriz de 4 filas y 6 columnas
digitados desde el teclado se presenta a continuación.
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
La característica fundamental de este algoritmo es que es una versión modificada del di-
señado para llenar arreglos ya que lo que se hace es completar un arreglo, el de la primera fila
y después repetir el proceso para completar todos los arreglos o filas que conforman la matriz.
For k = 1 To 4
For m = 1 To 6
C=InputBox("Digite carácter Matriz(" & k & "," & m & ")")
Matriz(k, m) = C
Next m
Next k
For k = 1 To 4
For m = 1 To 6
Print Matriz(k, m)
Next m
Next k
End Sub
· Codificación del algoritmo en Lenguaje C:
#include <stdio.h>
void main(){
char Matriz[4][6], C;
int k, m;
import java.io.*;
public class Cap5_7_M_Imprimir {
public static void main(String[ ] args)throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
char Matriz[][] = new char[4][6], C;
int k, m;
Figura 130: Algoritmo para llenar y contar las veces que un carácter
está en una matriz.
· Codificación del algoritmo en Visual Basic:
Private Sub Command1_Click()
Dim Matriz(1 To 4, 1 To 6) As String, C As String * 1
Dim k As Integer, m As Integer, Veces As Integer
For k = 1 To 4
For m = 1 To 6
C=InputBox("Digite carácter Matriz(" & k & "," & m & ")")
Matriz(k, m) = C
Next m
Next k
Veces = 0
For k = 1 To 4
For m = 1 To 6
If Matriz(k, m) = C Then Veces = Veces + 1
Next m
Next k
Print Veces 402
End Sub
403
· Codificación del algoritmo en Lenguaje C:
#include <stdio.h>
void main(){
char Matriz[4][6], C;
int k, m, Veces;
import java.io.*;
int k, m, Veces;
C = lee.readLine().charAt(0); Matriz[k][m] = C;
C = lee.readLine().charAt(0);
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
Veces = 0;
if(Matriz[k][m]==C)
Veces = Veces + 1;
System.out.println(""+Veces);
}
· Codificación del algoritmo en Python:
Matriz = []
Veces = 0
k=0
while k < 4:
Matriz.append(['']*6)
m=0
while m < 6:
C = raw_input('Digite carácter para Matriz('+str(k)+','+str(m)+'): ')
Matriz[k][m] = C
m=m+1
k=k+1
<HTML>
<BODY>
<SCRIPT>
var c = new String(); var k = new Number();
var m = new Number(); var veces = new Number();
var matriz = new Array(4); for (k=0;k<4;k++) matriz[k] = new Array(6);
for (k=0;k<4;k++)
for (m=0;m<6;m++)
matriz[k][m] = prompt("Digite carácter Matiz("+k+","+m+")");
<?php
$stdin = fopen('php://stdin','r');
$matriz = array(); settype($c,'string'); settype($veces,'integer');settype($k,'integer'); set-
type($m,'integer');
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++) {
echo 'Digite carácter Matiz(',$k,',',$m,')';
$matriz[$k][$m] = rtrim(fgets($stdin),PHP_EOL);
}
echo 'Digite carácter a buscar';
$c=rtrim(fgets($stdin),PHP_EOL);
$veces = 0;
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++)
if ($matriz[$k][$m]==$c)
$veces = $veces+1;
echo $veces,PHP_EOL;
?>
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
5.4.6. Modificar datos en una Matriz
La operación de modificar consiste en tomar una matriz con datos y ubicar una de las
posiciones dando el número de la fila y el número de la columna correspondiente; el
algoritmo usando estos dos números ubica la casilla correspondiente y modifica el con-
tenido allí existente con otro dato que también se suministra. El algoritmo valida si las
posiciones que se suministran están de acuerdo con los rangos de los índices de las filas
y las columnas. Al final imprime la matriz con las modificaciones hechas. Se modifican
datos de la matriz mientras no se digite -1 para el número de la fila a modificar.
406
407
For k = 1 To 4
For m = 1 To 6
L = InputBox("Digite Matriz(" & k & "," & m & ")")
Matriz(k, m) = L
Next m
Next k
Do
k = InputBox("Digite Fila. -1 para terminar")
If k <> -1 Then
If k > 0 And k < 5 Then
m = InputBox("Digite Columna")
If m > 0 And m < 7 Then
L = InputBox("Digite dato para modificar")
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
Matriz(k, m) = L
Else
Print "Columna no válida"
End If
Else
Print " Fila no válida"
End If
End if
Loop Until k = -1
For k = 1 To 4
For m = 1 To 6
Print Matriz(k, m)
Next m
Next k
End Sub
· Codificación del algoritmo en Lenguaje C:
#include <stdio.h>
void main(){
char Matriz[4][6], L;
int k, m;
for(k = 0; k < 4; k++)
for(m = 0; m < 6; m++){
printf(“Digite Matriz(%1d,%1d)”, k, m);scanf(“%c”,&L);
Matriz[k][m]=L;
}
do{
printf(“Digite Fila. –1 para terminar ”);scanf(“%d”,&k);
if(k != -1){
if((k > -1) && (k < 4)){
printf(“Digite Columna ”);scanf(“%d”,&m);
if((m > -1) && (m < 6)){
printf(“Digite dato para modificar ”);
scanf(“%c”,&L);
Matriz[k][m]=L; 408
}
409
else
printf(“Columna no válida”);
}
else
printf(“Fila no válida”);
}
}whlie(k!=-1);
for(k = 0; k < 4; k++)
for(m = 0; m < 6; m++)
printf(“%1c”,Matriz[k][m]);
}
· Codificación del algoritmo en Java:
import java.io.*;
public class Cap5_9_M_Modificar {
public static void main(String[ ] args)throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
char Matriz[][] = new char[4][6], C;
int k, m;
for(k = 0; k < 4; k++){
for(m = 0; m < 6; m++){
System.out.print("Digite carácter Matriz("+k+", "+m+"): ");
C = lee.readLine().charAt(0);
Matriz[k][m] = C;
}
}
do{
System.out.print("Digite Fila. -1 para terminar");
k = Integer.parseInt(lee.readLine());
if(k != -1){
System.out.print("Digite columna");
m = Integer.parseInt(lee.readLine());
if((m > -1) && (m < 6)){
System.out.print("Digite dato a modificar");
C = lee.readLine().charAt(0);
Matriz[k][m]=C;
}
else{
System.out.print("columna no validad");
}
}
else{
System.out.print("fila no validad");
}
}
}while(k != -1);
Matriz = []
k=0
while k < 4:
Matriz.append(['']*6)
m=0
while m < 6:
C = raw_input('Digite carácter para Matriz('+str(k)+','+str(m)+'): ')
Matriz[k][m] = C
m=m+1
k=k+1
k=0
while k != -1:
k = input('Digite fila. -1 para terminar: ')
if(k != -1):
if((k > -1) and (k < 4)):
m = input('Digite columna: ')
if((m > -1) and (m < 6)):
C = raw_input('Digite dato a modificar: ')
Matriz[k][m] = C
else:
print 'columna no valida' 410
else:
print 'fila no valida' 411
k=0
while k < 4:
m=0
while m < 6:
print Matriz[k][m],
m=m+1
print ''
k=k+1
· Codificación del algoritmo en JavaScript:
<HTML>
<BODY>
<SCRIPT>
var l = new String(); var k = new Number();
var m = new Number(); var matriz = new Array(4);
for (k=0;k<4;k++) matriz[k] = new Array(6);
for (k=0;k<4;k++)
for (m=0;m<6;m++)
matriz[k][m] = prompt("Digite carácter Mati-
z("+k+","+m+")");
do {
k = Number(prompt("Digite Fila. -1 para terminar "));
if (k!=-1)
if (k>-1 && k<4) {
m = Number(prompt("Digite columna "));
if (m>-1 && m<6) matriz[k][m]=prompt("Digite
dato a modificar");
else document.write("Columna no váli-
da",'<BR/>');
}
else document.write("Fila no válida",'<BR/>');
} while (k==-1);
for (k=0;k<=3;k++) {
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
for (m=0;m<=5;m++) {
document.write(matriz[k][m],'<BR/>');
}
}
</SCRIPT>
</BODY>
</HTML>
for ($K=0;$K<4;$K++)
for ($M=0;$M<6;$M++) {
echo 'Digite carácter Matiz(',$K,',',$M,')';
$matriz[$K][$M]=rtrim(fgets($stdin),PHP_EOL);
}
do {
echo 'Digite Fila. -1 para terminar ',PHP_EOL;
fscanf($stdin,"%d",$K);
if ($K!=-1)
if ($K>-1 && $K<4) {
echo 'Digite columna ',PHP_EOL;
fscanf($stdin,"%d",$M);
if ($M>-1 && $M<6) {
echo 'Digite dato a modificar',PHP_EOL;
$L=rtrim(fgets($stdin),PHP_EOL);
$matriz[$K][$M] = $L;
}
else echo 'Columna no válida',PHP_EOL;
}
else echo 'Fila no válida',PHP_EOL;
} while ($K!=-1);
for ($K=0;$K<4;$K++)
for ($M=0;$M<6;$M++)
echo $matriz[$K][$M],PHP_EOL;
?>
5.4.7. Insertar datos en una Matriz
El proceso de inserción de un dato en una matriz tiene muchos algoritmos posibles. Uno
de ellos consiste en llenar una matriz y luego con el fin de insertar un dato en la posición
correcta, se hace necesario pasar los datos a un arreglo y desplazar los datos hacia la
derecha para abrir un espacio en la posición determinada y allí insertar el dato (se usa
el algoritmo para insertar en un arreglo). Después de esto se pasa toda la información
del arreglo a la matriz. Luego se imprime la matriz con los datos que se insertaron. En el
algoritmo, no se llena completamente la matriz pues deja la última fila sin datos, esto
con el propósito de ver cómo se insertan los datos y estos se desplazan a la derecha. Si
la matriz está llena el último dato de la matriz se pierde.
412
413
Figura 132: Primera parte del algoritmo para insertar datos en una matriz.
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
For k = 1 To 4
For m = 1 To 6
Matriz(k, m) = " "
Next m
Next k
For k = 1 To 3
For m = 1 To 6
C = InputBox("Digite Matriz(" & k & "," & m & ")")
Matriz(k, m) = C
Next m
Next k
t=1
For k = 1 To 4
For m = 1 To 6
Arr(t) = Matriz(k, m)
t=t+1
Next m
Next k
Do
k = InputBox("Digite Fila. -1 para terminar")
If k <> -1 Then 414
If k > 0 And k < 5 Then
m = InputBox("Digite Columna") 415
If m > 0 And m < 7 Then
C = InputBox("Digite carácter a insertar")
t = (k - 1) * 6 + m
For s = 24 To t + 1 Step -1
Arr(s) = Arr(s - 1)
Next s
Arr(t) = C
Else
Print "Columna no válida"
End If
Else
Print "Fila no válida"
End If
End If
Loop Until k = -1
t=1
For k = 1 To 4
For m = 1 To 6
Matriz(k, m) = Arr(t)
t=t+1
Next m
Next k
For k = 1 To 4
For m = 1 To 6
Print Matriz(k, m);
Next m
Next k
End Sub
· Codificación del algoritmo en Lenguaje C:
#include <stdio.h>
void main(){
char Matriz[4][6], Arr[24],C;
int k, m, t, s;
t = 0;
for(k = 0; k < 4; k++)
for(m = 0; m < 6; m++)
Arr[t++] = Matriz[k][m];
do{
printf(“Digite Fila. –1 para terminar ”);
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
scanf(“%d”, &k);
if(k != -1){
if((k > -1) && (k < 4)){
printf(“Digite Columna ”);scanf(“%d”, &m);
if((m > -1) && (m < 6)){
printf(“Digite carácter a insertar ”);
scanf(“%c”, &C);
t = k * 6 + m;
for(s = 23;s > t; s--) Arr[s]= Arr[s-1];
Arr[t] = C;
}
else
printf(“Columna no válida”);
}
else
printf(“Fila no válida”);
}
}whlie(k!=-1);
t = 0;
for(k = 0; k < 4; k++)
for(m = 0; m < 6; m++)
Matriz[k][m] = Arr[t++];
t = 0;
for(k = 0; k < 4; k++){
for(m = 0; m < 6; m++){
Arr[t] = Matriz[k][m]; 416
t = t + 1;
} 417
}
do{
System.out.print("Digite Fila. -1 para terminar");
k = Integer.parseInt(lee.readLine());
if(k != -1){
if((k > -1) && (k < 4)){
System.out.print("Digite columna");
m = Integer.parseInt(lee.readLine());
if((m > -1) && (m < 6)){
System.out.print("Digite dato a insertar");
C = lee.readLine().charAt(0);
t = k * 6 + m;
for(s = 23;s > t; s--) Arr[s]= Arr[s-1];
Arr[t] = C;
}
else{
System.out.print("columna no validad");
}
}
else{
System.out.print("fila no validad");
}
}
}while(k != -1);
t = 0;
for(k = 0; k < 4; k++)
for(m = 0; m < 6; m++)
Matriz[k][m] = Arr[t++];
k=0
while k < 4:
Matriz.append([' ']*6)
m=0
while m < 6:
Matriz[k][m] = ' '
m=m+1
k=k+1
k=0
while k < 3:
m=0
while m < 6:
C = raw_input('Digite carácter para Matriz('+str(k)+','+s-
tr(m)+'): ')
Matriz[k][m] = C
m=m+1
k=k+1
k=0
while k < 4:
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
m=0
while m < 6:
Arr.append(Matriz[k][m])
m=m+1
k=k+1
k=0
while k != -1:
k = input('Digite fila. -1 para terminar: ')
if(k != -1):
if((k > -1) and (k < 4)):
m = input('Digite columna: ')
if((m > -1) and (m < 6)):
C = raw_input('Digite dato a insertar: ')
s = 23
while s > (k * 6 + m):
Arr[s] = Arr[s-1]
s=s-1
Arr[k * 6 + m] = C
else:
print 'columna no valida'
else:
print 'fila no valida'
k=0
while k < 4:
m=0
while m < 6:
Matriz[k][m] = Arr[k * 6 + m]
m=m+1
k=k+1
k=0
while k < 4:
m=0
while m < 6:
print Matriz[k][m],
m=m+1
print ' '
k=k+1
· Codificación del algoritmo en JavaScript:
<HTML>
<BODY>
<SCRIPT>
var arr = new Array(24);
var c = new String();
var k = new Number();
var m = new Number();
var t = new Number();
var s = new Number();
var matriz = new Array(4);
for (k=0;k<4;k++) { matriz[k] = new Array(6); }
for (k=0;k<4;k++)
for (m=0;m<6;m++) {
matriz[k][m] = " ";
}
for (k=0;k<3;k++)
for (m=0;m<6;m++) {
c = prompt("Digite Matriz("+k+","+m+")");
matriz[k][m] = c;
}
t = 0;
for (k=0;k<4;k++)
418
for (m=0;m<6;m++) {
arr[t] = matriz[k][m]; 419
t = t+1;
}
do {
k = Number(prompt("Digite Fila. -1 para terminar "));
if (k!=-1)
if (k>-1 && k<4) {
m = Number(prompt("Digite Columna "));
if (m>-1 && m<6) {
c = prompt("Digite el carácter a insertar ");
t = k*6+m;
for (s=23;s>=t;s--)arr[s] = arr[s-1];
arr[t] = c;
}
else
document.write("Columna no válida",'<BR/>');
}
else
document.write("Fila no válida",'<BR/>');
} while (k! = -1);
t = 0;
for (k=0;k<4;k++)
for (m=0;m<6;m++) {
matriz[k][m] = arr[t];
t = t+1;
}
for (k=0;k<4;k++)
for (m=0;m<6;m++) {
document.write(matriz[k][m]);
}
</SCRIPT>
</BODY>
</HTML>
· Codificación del algoritmo en PHP:
<?php
$stdin = fopen('php://stdin','r');
$matriz = array();
$arr = array();
settype($c,'string');
settype($k,'integer');
settype($m,'integer');
settype($t,'integer');
settype($s,'integer');
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++) {
$matriz[$k][$m] = ' ';
}
for ($k=0;$k<3;$k++)
for ($m=0;$m<6;$m++) {
echo 'Digite Matriz(',$k,',',$m,')';
$c=rtrim(fgets($stdin),PHP_EOL);
$matriz[$k][$m] = $c;
}
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
$t = 0;
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++) {
$arr[$t] = $matriz[$k][$m];
$t = $t+1;
}
do {
echo 'Digite Fila. -1 para terminar ';
fscanf($stdin,"%d",$k);
if ($k!=-1)
if ($k>-1 && $k<4) {
echo 'Digite Columna ';
fscanf($stdin,"%d",$m);
if ($m>-1 && $m<6) {
echo 'Digite el carácter a insertar ';
$c=rtrim(fgets($stdin),PHP_EOL);
$t = $k*6+$m;
for ($s=23;$s>=$t;$s--) $arr[$s] = $arr[$s-1];
$arr[$t] = $c;
}
else
echo 'Columna no válida',PHP_EOL;
}
else
echo 'Fila no válida',PHP_EOL;
} while ($k != -1);
$t = 0;
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++) {
$matriz[$k][$m] = $arr[$t];
$t = $t+1;
}
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++)
echo $matriz[$k][$m];
?>
5.4.8. Eliminar datos de una Matriz
El proceso para eliminar consiste en retirar un dato de los que contiene la matriz, para
lo cual se pasa la información de la matriz a un arreglo, se elimina el dato del arreglo
y desplaza toda la información hacia la izquierda introduciendo en el último elemento
un dato en blanco. Luego se pasa la información nuevamente del arreglo a la matriz. El
siguiente algoritmo llena una matriz, pasa los datos a un arreglo, elimina los datos que
se quieran, retorna los datos del arreglo a la matriz e imprime la matriz. El algoritmo se
presenta a continuación.
420
421
For k = 1 To 4
For m = 1 To 6
Matriz(k, m) = " "
Next m
Next k
For k = 1 To 3
For m = 1 To 6
C = InputBox("Digite Matriz(" & k & "," & m & ")")
Matriz(k, m) = C
Next m
Next k
t=1
For k = 1 To 4
For m = 1 To 6
Arr(t) = Matriz(k, m)
t=t+1
Next m 422
Next k
423
Do
k = InputBox("Digite Fila de dato a Eliminar. -1 para terminar")
If k <> -1 Then
If k > 0 And k < 5 Then
m = InputBox("Digite Columna de dato a Eliminar")
If m > 0 And m < 7 Then
t = (k - 1) * 6 + m
For s = t To 23
Arr(s) = Arr(s + 1)
Next s
Arr(t) = “ ”
Else
Print "Columna no válida"
End If
Else
Print "Fila no válida"
End If
End If
Loop Until k = -1
t=1
For k = 1 To 4
For m = 1 To 6
Matriz(k, m) = Arr(t)
t=t+1
Next m
Next k
For k = 1 To 4
For m = 1 To 6
Print Matriz(k, m);
Next m
Next k
End Sub
· Codificación del algoritmo en Lenguaje C:
#include <stdio.h>
void main(){
char Matriz[4][6], Arr[24],C;
int k, m, t, s;
t = 0;
for(k = 0; k < 4; k++)
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
do{
printf(“Digite Fila de dato a Eliminar . –1 para terminar ”);
scanf(“%d”, &k);
if(k != -1){
if((k > -1) && (k < 4)){
printf(“Digite Columna de dato a Eliminar”);
scanf(“%d”, &m);
If((m > -1) && (m < 6)){
t = k * 6 + m;
for(s = t; s < 23; s++) Arr[s]= Arr[s+1];
Arr[23]=’ ’;
}
Else
printf(“Columna no válida”);
}
Else
printf(“Fila no válida”);
}
}whlie(k!=-1);
t = 0;
for(k = 0; k < 4; k++)
for(m = 0; m < 6; m++)
Matriz[k][m]) = Arr[t++];
}
· Codificación del algoritmo en Java:
import java.io.*;
public class Cap5_B_M_Eliminar {
public static void main(String[ ] args)throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
char Matriz[][] = new char[4][6], C;
char Arr[] = new char[24];
int k, m, t, s;
t = 0;
for(k = 0; k < 4; k++)
for(m = 0; m < 6; m++){
Arr[t] = Matriz[k][m]; 424
t = t + 1;
} 425
do{
System.out.print("Digite Fila del dato a eliminar. 1-Terminar: ");
k = Integer.parseInt(lee.readLine());
if(k != -1){
if((k > -1) && (k < 4)){
System.out.print("Digite Columna del dato a eliminar");
m = Integer.parseInt(lee.readLine());
if((m > -1) && (m < 6)){
t = k * 6 + m;
for(s = t; s < 23; s++) Arr[s]= Arr[s+1];
Arr[23]= ' ';
}
else{
System.out.print("columna no validad");
}
}
else{
System.out.print("fila no validad");
}
}
}while(k != -1);
t = 0;
for(k = 0; k < 4; k++)
for(m = 0; m < 6; m++)
Matriz[k][m] = Arr[t++];
k=0
while k < 4:
Matriz.append(['']*6)
m=0
while m < 6:
Matriz[k][m] = ' '
m=m+1
k=k+1
k=0
while k < 3:
m=0
while m < 6:
C = raw_input('Digite carácter para Matriz('+str(k)+','+str(m)+'): ')
Matriz[k][m] = C
m=m+1
k=k+1
k=0
while k < 4:
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
m=0
while m < 6:
Arr.append(Matriz[k][m])
m=m+1
k=k+1
k=0
while k != -1:
k = input('Digite fila del dato a eliminar. -1 para terminar: ')
if(k != -1):
if((k > -1) and (k < 4)):
m = input('Digite columna del dato a eliminar: ')
if((m > -1) and (m < 6)):
s=k*6+m
while s < 23:
Arr[s] = Arr[s+1]
s=s+1
Arr[23] = ' '
else:
print 'columna no valida'
else:
print 'fila no valida'
k=0
while k < 4:
m=0
while m < 6:
Matriz[k][m] = Arr[k * 6 + m]
m=m+1
k=k+1
k=0
while k < 4:
m=0
while m < 6:
print Matriz[k][m],
m=m+1
print ''
k=k+1
· Codificación del algoritmo en JavaScript:
<HTML>
<BODY>
<SCRIPT>
var arr = new Array(24);
var c = new String();
var k = new Number();
var m = new Number();
var t = new Number();
var s = new Number();
var matriz = new Array(4);
for (var k=0;k<4;k++) { matriz[k] = new Array(6); }
for (k=0;k<4;k++)
for (m=0;m<6;m++)
matriz[k][m] = " ";
for (k=0;k<3;k++)
for (m=0;m<6;m++) {
c = prompt("Digite Matriz("+k+","+m+")");
matriz[k][m] = c;
}
t = 0;
for (k=0;k<4;k++)
for (m=0;m<6;m++) { 426
arr[t] = matriz[k][m];
t = t+1;
427
}
do {
k = Number(prompt("Digite Fila de dato a Elimi-
nar . -1 para terminar "));
if (k!=-1)
if (k>-1 && k<4) {
m = Number(prompt("Digite Columna
de dato a Eliminar "));
if (m>-1 && m<6) {
t = k*6+m;
for (s=t;s<23;s++) arr[s] = arr[s+1];
arr[23] = " ";
}
else
document.write("Columna no váli-
da",'<BR/>');
}
else
document.write("Fila no válida",'<BR/>');
} while (k!=-1);
t = 0;
for (k=0;k<4;k++)
for (m=0;m<6;m++) {
matriz[k][m] = arr[t];
t = t+1;
}
for (k=0;k<4;k++)
for (m=0;m<6;m++)
document.write(matriz[k][m],'<BR/>');
</SCRIPT>
</BODY>
</HTML>
· Codificación del algoritmo en PHP:
<?php
$stdin = fopen('php://stdin','r');
$matriz = array();
$arr = array();
settype($c,'string');
settype($k,'integer');
settype($m,'integer');
settype($t,'integer');
settype($s,'integer');
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++)
$matriz[$k][$m] = ' ';
for ($k=0;$k<3;$k++)
for ($m=0;$m<6;$m++) {
echo 'Digite Matriz(',$k,',',$m,')';
$c=rtrim(fgets($stdin),PHP_EOL);
$matriz[$k][$m] = $c;
}
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
$t = 0;
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++) {
$arr[$t] = $matriz[$k][$m];
$t = $t+1;
}
do {
echo 'Digite Fila de dato a Eliminar . -1 para terminar ';
fscanf($stdin,"%d",$k);
if ($k!=-1) {
if ($k>-1 && $k<4) {
echo 'Digite Columna de dato a Eliminar ';
fscanf($stdin,"%d",$m);
if ($m>-1 && $m<6) {
$t = $k*6+$m;
for ($s=$t;$s<23;$s++) $arr[$s] = $arr[$s+1];
$arr[23] = ' ';
}
else
echo 'Columna no válida',PHP_EOL;
}
else
echo 'Fila no válida',PHP_EOL;
}
} while ($k!=-1);
$t = 0;
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++) {
$matriz[$k][$m] = $arr[$t];
$t = $t+1;
}
for ($k=0;$k<=3;$k++)
for ($m=0;$m<=5;$m++)
echo $matriz[$k][$m],PHP_EOL;
?>
5.4.9. Agregar datos a una Matriz
La operación de agregar datos a una matriz consiste en introducir un dato después del
último elemento que se encuentre lleno. El algoritmo busca cuál es la última posición
dentro de la matriz que está llena y después de ésta se escribe el dato a agregar. El si-
guiente algoritmo llena una matriz, solicita el dato a agregar, si hay espacio se ubica de
último en la matriz, si no hay espacio no se agrega nada.
428
429
For k = 1 To 2
For m = 1 To 6
C = InputBox("Digite Matriz(" & k & "," & m & ")")
Matriz(k, m) = C
Next m
Next k
Do
A = InputBox("0-Agregar datos. 1-Salir", 1)
If A = 0 Then
C = InputBox("Digite el dato a Agregar")
Agregar = 0
k=1
Do
m=1 430
Do
431
If Matriz(k, m) = " " Then
Agregar = 1
Fil = k
Col = m
m=6
k=4
End If
m=m+1
Loop Until m > 6
k=k+1
Loop Until k > 4
If Agregar = 1 Then
Matriz(Fil, Col) = C
Else
Print "No se puede agregar más datos a la Matriz"
End If
End If
Loop Until A = 1
For k = 1 To 4
For m = 1 To 6
Print Matriz(k, m)
Next m
Next k
End Sub
· Codificación del algoritmo en Lenguaje C:
#include <stdio.h>
void main(){
char Matriz[4][6], C;
int A, Fil, Col, k, m, Agregar;
do{
printf(“0-Agregar datos. 1-Salir”, k, m);scanf(“%d”, &A);
if(A == 0){
printf(“Digite el dato a Agregar ”);
scanf(“%c”, &C);
Agregar = 0;
k = 0;
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
do{
m = 0;
do{
if(Matriz[k][m] == ‘ ’){
Agregar = 1;
Fil = k;
Col = m;
m = 6;
k = 4;
}
m++;
}while(m < 6);
k++;
}while(k < 4);
if(Agregar == 1){
Matriz[Fil][Col] = C;
}
else
printf(“No se puede agregar más datos a la Matriz”);
}
}while(A!=1);
do{
System.out.print("0-Agregar datos. 1-Salir: "); 432
A = Integer.parseInt(lee.readLine());
if(A == 0){ 433
System.out.print("Digite el datos a agregar");
C = lee.readLine().charAt(0);
Agregar = 0;
k = 0;
do{
m = 0;
do{
if(Matriz[k][m] == ' '){
Agregar = 1;
Fil = k;
Col = m;
m =6;
k = 4;
}
m = m + 1;
}while(m < 6);
k = k + 1;
}while(k < 4);
if(Agregar == 1)
Matriz[Fil][Col]= C;
else
System.out.print("No se puede agregar más datos a la Matriz");
}
}while(A != -1);
k=0
while k < 4:
Matriz.append(['']*6)
m=0
while m < 6:
Matriz[k][m] = ' '
m=m+1
k=k+1
k=0
while k < 2:
m=0
while m < 6:
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
A=0
while A != -1:
A = input('0-Agregar datos. -1 para terminar: ')
if(A == 0):
C = raw_input('Digite el dato a agregar: ')
Agregar = 0
k=0
while k < 4:
m=0
while m < 6:
if Matriz[k][m] == ' ':
Agregar = 1
Fil = k
Col = m
k=4
m=6
m=m+1
k=k+1
if Agregar == 1:
Matriz[Fil][Col] = C
else:
print 'No se puede agregar más datos a la Matriz'
k=0
while k < 4:
m=0
while m < 6:
print Matriz[k][m],
m=m+1
print ' '
k=k+1
· Codificación del algoritmo en JavaScript:
<HTML>
<BODY>
<SCRIPT>
var t;
var a = new Number();
var c = new String();
var fil = new Number();
var col = new Number();
var k = new Number();
var m = new Number();
var agregar = new Number();
var matriz = new Array(4);
for (k=0;k<4;k++) { matriz[k] = new Array(6); }
for (k=0;k<4;k++)
for (m=0;m<6;m++)
matriz[k][m] = " ";
for (k=0;k<2;k++)
for (m=0;m<6;m++) {
c = prompt("Digite Matriz("+k+","+m+")");
matriz[k][m] = c;
} 434
do { 435
a = Number(prompt("0-Agregar datos. 1-Salir "));
if (a==0) {
c = prompt("Digite el dato a Agregar ");
agregar = 0;
k = 0;
do {
m = 0;
do {
if (matriz[k][m]==" ") {
agregar = 1;
fil = k;
col = m;
m = 6;
k = 4;
}
m = m+1;
} while (m<6);
k = k+1;
} while (k<4);
if (agregar==1)
matriz[fil][col] = c
else
document.write("No se agregan más datos",'<BR/>');
}
} while (a != 1);
for (k=0;k<4;k++)
for (m=0;m<6;m++)
document.write(matriz[k][m]);
</SCRIPT>
</BODY>
</HTML>
· Codificación del algoritmo en PHP:
<?php
$stdin = fopen('php://stdin','r');
$matriz = array();
settype($a,'integer');
settype($c,'string');
settype($fil,'integer');
settype($col,'integer');
settype($k,'integer');
settype($m,'integer');
settype($agregar,'integer');
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++)
$matriz[$k][$m] = ' ';
for ($k=0;$k<2;$k++)
for ($m=0;$m<6;$m++) {
echo 'Digite Matriz(',$k,',',$m,')';
fscanf($stdin,"%s",$c);
$matriz[$k][$m] = $c; }
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
do {
echo '0-Agregar datos. 1-Salir ';
fscanf($stdin,"%d",$a);
if ($a==0) {
echo 'Digite el dato a Agregar ';
$c=rtrim(fgets($stdin),PHP_EOL);
$agregar = 0;
$k = 0;
do {
$m = 0;
do {
if ($matriz[$k][$m]==' ') {
$agregar = 1;
$fil = $k;
$col = $m;
$m = 6;
$k = 4;
}
$m = $m+1;
} while ($m<6);
$k = $k+1;
} while ($k<4);
if ($agregar==1)
$matriz[$fil][$col] = $c;
else
echo 'No se puede agregar más datos a la Matriz',PHP_EOL;
}
} while ($a != 1);
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++)
echo $matriz[$k][$m];
?>
5.4.10. Ordenar los datos de una Matriz
La operación de ordenar matrices pasa los datos de la matriz a un arreglo y utiliza el mé-
todo de selección descrito para ordenar arreglos. El siguiente algoritmo llena una matriz
de caracteres, la ordena e imprime la matriz ordenada.
436
437
For k = 1 To 4
For m = 1 To 6
C = InputBox("Digite Matriz(" & k & "," & m & ")")
Matriz(k, m) = C
Next m
Next k
t=1
For k = 1 To 4
For m = 1 To 6
Arr(t) = Matriz(k, m)
t=t+1
Next m
Next k
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
For k = 1 To 23
For m = k + 1 To 24
If Arr(k) > Arr(m) Then
C = Arr(k)
Arr(k) = Arr(m)
Arr(m) = C
End If
Next m
Next k
t=1
For k = 1 To 4
For m = 1 To 6
Matriz(k, m) = Arr(t)
t=t+1
Next m
Next k
For k = 1 To 4
For m = 1 To 6
Print Matriz(k, m)
Next m
Next k
End Sub
· Codificación del algoritmo en Lenguaje C:
#include <stdio.h>
void main(){
char Matriz[4][6], Arr[24], C;
int t, k, m;
t = 0;
for(k = 0; k < 4; k++){
for(m = 0; m < 6; m++){
Arr[t] = Matriz[k][m];
t++;
}
}
t = 0;
for(k = 0; k < 4; k++){
for(m = 0; m < 6; m++){
Matriz[k][m] = Arr[t];
t++;
}
}
t = 0;
for(k = 0; k < 4; k++){
for(m = 0; m < 6; m++){
Arr[t] = Matriz[k][m];
t = t + 1;
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
}
}
t = 0;
for(k = 0; k < 4; k++){
for(m = 0; m < 6; m++){
Matriz[k][m] = Arr[t];
t = t + 1;
}
}
for (k=0;k<4;k++)
for (m=0;m<6;m++) {
c = prompt("Digite Matriz("+k+","+m+")");
matriz[k][m] = c;
}
t = 0;
for (k=0;k<4;k++)
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
for (m=0;m<6;m++) {
arr[t] = matriz[k][m];
t = t+1;
}
for (k=0;k<23;k++)
for (m=k;m<24;m++)
if (arr[k]>arr[m]) {
c = arr[k];
arr[k] = arr[m];
arr[m] = c;
}
t = 0;
for (k=0;k<4;k++)
for (m=0;m<6;m++) {
matriz[k][m] = arr[t];
t = t+1;
}
for (k=0;k<=3;k++)
for (m=0;m<=5;m++)
document.write(matriz[k][m],", ");
</SCRIPT>
</BODY>
</HTML>
· Codificación del algoritmo en PHP:
<?php
$stdin = fopen('php://stdin','r');
$matriz = array();
$arr = array();
settype($c,'string');
settype($t,'integer');
settype($k,'integer');
settype($m,'integer');
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++) {
echo 'Digite Matriz(',$k,',',$m,')';
$c=rtrim(fgets($stdin),PHP_EOL);
$matriz[$k][$m] = $c;
}
$t = 0;
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++) {
$arr[$t] = $matriz[$k][$m];
$t = $t+1; 442
}
443
for ($k=0;$k<23;$k++)
for ($m=$k;$m<24;$m++)
if ($arr[$k]>$arr[$m]) {
$c = $arr[$k];
$arr[$k] = $arr[$m];
$arr[$m] = $c;
}
$t = 0;
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++) {
$matriz[$k][$m] = $arr[$t];
$t = $t+1;
}
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++)
echo $matriz[$k][$m],', ';
?>
5.5. EJERCICIOS DE REPASO
Construir los algoritmos como solución de cada uno de los siguientes ejercicios siguiendo
la metodología (investigación preliminar, especificación, diseño y prueba de escritorio) plan-
teada y los temas estudiados en el presente capítulo para la construcción de los mismos6.
1. Calcular el cuadrado de los 100 primeros números naturales y guardar los resulta-
dos en un arreglo, luego imprimirlo.
2. Se tiene N temperaturas almacenadas en un arreglo. Se pide calcular la tempera-
tura promedio, la mínima y la máxima.
3. Llenar un arreglo de N elementos de la forma Ai = i. Se deben imprimir los valores
del arreglo del último al primero. N debe ser un valor entero positivo menor a 500.
4. Se tienen valores almacenados en un arreglo de 200 elementos. Calcular cuántos
de estos son negativos, cuántos son positivos y cuántos son ceros.
5. Calcular la suma de los números pares y la suma de los números impares que se
encuentran almacenados en un arreglo de hasta 200 elementos.
6. Tomar datos y almacenarlos en arreglos de acuerdo con los siguientes criterios:
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
∑i=1
n
(xi - x)2
a) D= n-1
∑i=1
n
xi
X=
n
8. Leer un valor entero positivo y convertirlo a su valor equivalente en:
· el sistema numérico base 2
· el sistema numérico base 3
· el sistema numérico base 4
·
·
·
· el sistema numérico base 16.
9. Leer una cadena de caracteres y almacenarlos en un arreglo. La cadena representa
un número, el algoritmo que debe calcular el valor que corresponde.
10. Leer letras y almacenarlas en un arreglo. El algoritmo debe convertir todas las
letras del arreglo a mayúsculas y a minúsculas dependiendo de los que se desee.
11. Leer una palabra y almacenarla en un arreglo. Determinar si la palabra es palín-
droma.
12. Leer caracteres y almacenarlos en un arreglo. Tomar el arreglo e invertirlo en el
contenido del mismo.
13. Leer letras y almacenarlas en un arreglo. Las letras forman una frase de hasta 500
letras. Escribir un algoritmo que tome el arreglo y determine cuántas palabras hay
en la frase del arreglo.
14. Leer una frase y almacenarla en un arreglo. Determinar si una palabra dada que se
encuentra almacenada en otro arreglo se encuentra en el primer arreglo.
15. Determinar cuántas ocurrencias de una cadena especifica dada se presentan en
una frase dada de hasta 1000 caracteres.
16. Se tiene un arreglo con una frase. Diseñar un algoritmo que tome el arreglo y cuen-
te cuántas vocales hay, cuántas consonantes, cuántos dígitos y cuántos caracteres
444
especiales.
445
17. Leer una frase y almacenarla en un arreglo. Imprimir la frase rotando los caracteres
hacia la izquierda hasta que se imprima nuevamente la frase correctamente. Ejem-
plo: si se da la frase ‘Los gatos de la casa’ el algoritmo deberá dar como resultado
los sume, reste, multiplique y divida. Utilice arreglos para guardar los números y
la respuesta.
23. Se tienen números enteros positivos almacenados en un arreglo, escribir un algo-
ritmo que determine cuántos de estos números son una secuencia ‘Jolly Jumper’
24. Escribir un algoritmo que llene dos arreglos X y Y con las abscisas y las ordenadas
de N puntos de un polígono convexo. Determinar el área del polígono usando el
método de los determinantes.
1 X1 X2 X2 X3 X3 X4 XN X1
Área = + + + +
2 Y1 Y2 Y2 Y3 Y3 Y4 YN Y1
25. Elaborar un algoritmo que llene un arreglo con los datos de las medidas de las
normales tomadas en la medición de un terreno. Hallar el área total del terreno
por el método del cálculo del área por normales tomadas desde una línea y recta
con separaciones regulares según la siguiente fórmula:
H0 HN
Área = + H1 + H2 + ... +
2 2
Tomando los puntos justados, se calcula el área del terreno usando la siguiente fórmula:
Área = ∑N-1
1
Yi * Xi +1 - ∑N-1
1
Xi * Yi +1
2
35. Utilizando el método de los mínimos cuadrados para estimar la cantidad de apar-
tamentos que se venderán en los siguientes 10 años, si los datos que se tienen de
las ventas de apartamentos tipo A, tipo B, tipo C y tipo D son los siguientes:
X Y1 Y2 Y3 Y4
Tipo de Apartamento
AÑO
A B C D
2001 1324 1084 160 55
2002 1453 1035 208 59
2003 1456 900 209 31
2004 1400 1090 223 31
y=mx +b
2005 1478 964 238 68
2006 1365 1049 247 62
∑y ∑x2 -∑x ∑xy
b=
2007 1301 876 254 75 N∑x2 -
∑x∑x
2008 1398 1099 291 61
2009 1401 1038 292 61
N∑xy - ∑x∑y
2010 1450 934 304 30 m=
2011 1498 871 308 31 N∑X 2
- ∑x∑x
2012 1510 990 300 74
2013 1500 1019 312 65
2014 1492 1050 315 60
2015 1401 999 325 55
36. Construir un algoritmo que lea la fila y la columna en que se encuentra un caballo en
el tablero de ajedrez y determine las posibles posiciones a donde se puede mover.
37. Escribir un algoritmo que lea la fila y la columna en la cual se encuentra la reina en
el tablero de ajedrez y determinar las posibles posiciones a donde se puede mover.
38. Diseñar un algoritmo que llene una matriz 2xM en donde cada columna es las
coordenadas de un punto en el plano cartesiano. El algoritmo debe determinar la
pareja de puntos más alejados entre sí y la pareja de puntos más cercanos entre sí.
39. Una compañía de producción de refrescos desea calcular las siguientes estadís-
ticas de ventas hechas por mes durante el último año de trabajo. Vende un total
de 20 productos diferentes y se desea saber:
A
C
B
41. En una empresa se calcula el pago de los empleados de acuerdo a las horas que ha
trabajado cada uno. Al final de cada mes se tiene un informe en donde aparece el
código de cada trabajador con las horas de entradas y las horas de salidas. Escribir
un algoritmo que lea los datos y almacene los códigos de los trabajadores en un
arreglo y las horas de entrada y de salida en una matriz. El modelo del informe que
se pasa para ser procesado es:
. . . .
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices
. . . .
Se debe calcular:
· El total de horas trabajadas por cada empleado.
· El total de horas trabajadas por todos los empleados.
· El total de horas trabajadas por día.
· El pago para cada trabajador así:
· Si trabaja hasta 48 horas el pago es normal
· Si trabaja más de 48 horas, cada hora por encima se paga con un 25% más de lo normal
· El total de la nómina.
· El trabajador que más horas trabajó y el que memos horas trabajo.
· El día que más se trabajó y el que menos se trabajó.
42. Una compañía multinacional desea saber el comportamiento de las ocho dife-
rentes agencias que tiene en un número igual de países. La compañía cuenta con
35 vendedores que trabajan en las diferentes agencias y reportan sus resultados
semanalmente. Se tienen los datos de las últimas 20 semanas y se desea saber el
total de las ventas hechas por vendedor, el total de ventas por agencia y el total
de ventas por semanas. Adicionalmente determinar el mejor vendedor y el peor, la
mejor y la peor agencia; y la mejor y peor semana.
43. Una empresa de transporte terrestre de pasajeros tiene un conjunto de rutas es-
tablecidas entre un número dado de ciudades. Construir un algoritmo que lea el
nombre de una ciudad e imprima los nombres de las ciudades con las cuales hay
rutas establecidas.
44. Diseñar un algoritmo que permita resolver un sistema de ecuaciones de M incógnitas
y N ecuaciones utilizando el método de Gauss.
45. Escribir un algoritmo que tome un número entero en el intervalo 0 ≤ N ≤ 99999999
y generar una matriz con la representación del número como un matriz Display 5x7.
Así: si el número suministrador al algoritmo 481703, la matriz quedaría
X X X X X X X X X X X X X X X X X X X X X X X
X X X X X X X X X
X X X X X X X X X
X X X X X X X X X X X X X X X X X X X X X X X
X X X X X X X X
X X X X X X X X
X X X X X X X X X X X X X X X X X X
46. Dada una matriz de NxM llena de letras, escribir un algoritmo que lea una palabra y
la busque por las filas, las columnas o las diagonales y en todos los sentidos. Debe
dar como respuesta el número de la fila y de la columna en donde comienza la pala-
bra y el sentido de la misma (de derecha a izquierda, de izquierda a derecha, de arri-
ba a abajo, de abajo a arriba, diagonal de arriba abajo o diagonal de abajo a arriba).
450
47. Dada una matriz de MxN con valores enteros aleatorios entre 20 y 50. Diseñar un algo-
451
ritmo que tome la matriz, la modifique de manera que los valores de la diagonal prin-
cipal correspondan con la suma de los valores de cada fila diferentes al de la diagonal.
48. Elaborar un algoritmo que llene una matriz e imprima dicha matriz en forma
de espiral, así:
CAPÍTULO 6
ALGORITMOS MODULARES
01 01
01 01
01
01
Objetivo
Aplicar los conceptos de la modularización para
la construcción de algoritmos como herramien-
tas para la optimización del uso de recursos.
454
455
6.1. Modularización
Hasta el momento se han construido algoritmos en los que se
da la solución al problema de manera integral, esto es, se diseña
un único algoritmo en donde se expresa todo el problema en
detalle. Cuando los problemas son de gran magnitud, es decir,
cuando se requiere un algoritmo muy largo o cuando se tiene un
proceso dentro del algoritmo que se repite varias veces o cuando
se requiere que un proceso dé como resultado un valor y este
se debe calcular en diferentes puntos del algoritmo; es cuando
se hace vital dividir el algoritmo en partes o módulos que se
acoplen y que den respuesta al problema de manera integral.
La modularización consiste en dividir el problema en partes que
facilitan la construcción de algoritmos con las que se presenten
soluciones más comprensibles y compactas (Senn, 1992).
Si se recuerda que un computador es un sistema que está compuesto por dispositi-
vos de entrada, de proceso y de salida; entonces, se entiende claramente que cualquier
algoritmo que se construya debe hacer explícitamente referencia a estos tres tipos de
dispositivos y por esta razón el problema al que se pretenda dar solución por medio del
él, naturalmente debe dividirse y concebirse en términos de esto tres aspectos. Haciendo
una retrospectiva, la modularización se ha venido aplicando a lo largo del texto, pues en el
Paso 3 de la metodología dividimos el problema en partes o subproblemas que permiten
definir fácilmente subprocesos que constituyen de manera integral el problema. Desde el
punto de vista del uso del computador para ejecutar programas, y teniendo en mente que
es un sistema que requiere datos de entrada con los que adelanta procesos para obtener
información que luego es reportada como resultados, es decir, que es un sistema al que se
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares
le identifican los procesos de entrada de datos, los que hacen el tratamiento de los datos
de entrada para transformarlos en información y los procesos que dan salida a la informa-
ción obtenida o reporte de información.
Esquemáticamente estas ideas se pueden expresar mediante un algoritmo genérico
que muestra cómo se define un módulo o subproceso en un diagrama de flujo y como se
acoplan para dar la solución al problema. Primero se procesan todas las actividades de las
entradas, encargadas de capturar los datos que requiere el algoritmo. Luego, en su orden,
se ejecutan todas las actividades que procesan los datos y posteriormente se le da salida a
información obtenida. La figura 139 muestra esto.
En este diagrama de flujo se puede ver un muevo elemento que no se había usado
hasta el momento, este es el símbolo de subproceso, el cual expresa la idea que se deben
realizar un conjunto de tareas pero que el algoritmo no detalla. Los detalles de las tareas o
actividades de cada subproceso son algoritmos que se encuentran diseñados en otro lado,
pero que hacen parte integral y constitutiva de este algoritmo principal. Todo algoritmo es
posible de diseñase a partir de este esquema.
A continuación, se presentan unos ejemplos en los que se hace uso de los principios
de la modularización en la construcción de algoritmos.
Ejemplo 1.
El triángulo de Pascal
Diseñar un algoritmo que lea un número entero no mayor a 20 y llene una matriz con
los datos que conforman el triángulo de Pascal. El contenido de la matriz debe distribuir-
se de la manera como se conforma el triángulo. Por ejemplo, la matriz debe quedar, para
el número 8, grabada así:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
La solución del problema comienza aplicando la metodología que se ha venido usando 456
en los anteriores capítulos. 457
Paso 1: Investigación preliminar.
El triángulo de Pascal da la distribución de números al expandir potencias sucesivas de
(x + y)N. Al tener un número infinito de filas y sólo dos lados, no es realmente un triángulo.
Las filas se numeran N =1, 2..., de arriba abajo; los números de la fila N son los coeficientes
de los términos en el desarrollo de (x +y)N. Estos coeficientes se denominan coeficientes
binomiales (Knuth, 1985) y se calculan mediante la siguiente expresión:
N N!
( )=
J J! (N-J)!
4 4! 4! 4* 3* 2* 1
( )= = = = 6
2 2! (4-2)! 2! * 2! (2* 1) * (2* 1)
1 4 6 4 1
Se debe procesar de la siguiente forma: Como es la fila 5, está compuesta por un con-
junto de 5 números que se pueden numerar desde 0 hasta 4, con lo que se puede aplicar
la fórmula para N = 4 y para J con valores desde 0 hasta 4. Esto es:
N N!
( )= para J = 0, 1, 2, 3, 4,⋅⋅⋅, N
J J! (N-J)!
4! 4* 3* 2* 1
Para j = 0 se calcula = = 1
0! (4-0)! (1) * (4* 3* 2* 1)
4! 4* 3* 2* 1
Para j = 1 se calcula = = 4
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares
4! 4* 3* 2* 1
Para j = 2 se calcula = = 6
2! (4-2)! (2* 1) * (2* 1)
4! 4* 3* 2* 1
Para j = 3 se calcula = = 4
3! (4-3)! (3* 2* 1) * (1)
4! 4* 3* 2* 1
Para j = 4 se calcula = = 1
4! (4-4)! (4* 3* 2* 1) * (1)
Paso 2: Especificaciones.
Diagrama
de caja
negra del
problema
Paso 3: Diseño.
De acuerdo con las especificaciones dadas por el problema se da el siguiente algoritmo:
458
459
Hasta este punto el diseño del algoritmo no tiene nada de particular, se ha diseñado
bajo los preceptos que se han venido utilizando en este libro. Ahora bien, aplicando el
concepto de modularidad, el algoritmo se puede empezar a dividir en partes funcionales e
integrales que permitan reescribirlo sin perder su correcto funcionamiento, pero logrando
reducirlo para que sea más compacto, por ende, más rápido y que ocupe menos espacio
de almacenamiento en el computador.
Desde el punto de vista de los conceptos de la modularidad, el problema tiene que ser
dividido en subprocesos. Para el caso del ejemplo que se está tratando y considerando
que todo algoritmo se puede ver desde la perspectiva de sus funciones básicas (entradas,
procesos y salidas), en el algoritmo se puede identificar el proceso de entrada como se
muestra a continuación:
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares
guarda los datos del triángulo, seguidamente se ejecuta la instrucción Definir_N_Filas; que es
el llamado al procedimiento que tiene dicho nombre. Esto significa que el control de flujo del
programa, es decir, la secuencia de ejecución salta a este sitio y continúa ejecutando las ins-
trucciones que contenga este procedimiento. Al terminar con todas las instrucciones se devuel-
ve el control de flujo del programa al sitio donde fue invocado el procedimiento, es decir, a la
instrucción Definir_N_Filas, y continúa con la instrucción que hay después del llamado, es decir,
la instrucción Generar_Triangulo. De la misma forma opera el procedimiento Mostrar_Triangulo
que contiene el diagrama.
Desde el punto de vista de la construcción de los diagramas de flujo, el símbolo de
proceso (el rectángulo con las líneas a cada lado) indica que se debe escribir dentro el
nombre de un procedimiento, el cual va a ser invocado en el momento que el control de
flujo del programa ejecute la instrucción que este elemento simboliza. Un diseño para los
procedimientos de entrada o captura de información y de salida o impresión del triángulo se
muestran a continuación:
462
463
del triángulo de Pascal, se puede concluir lo siguiente: si estudia el trabajo que hace cada
ciclo semejante, se deduce que la labor para la que fueron diseñados es el cálculo del fac-
torial de un número. Se presenta a continuación un diagrama de flujo con el módulo función
464
465
Pri va te S u b D e f i n i r_ N_ Fi las( )
Fo r I = 0 To 2 0
Fo r J = 0 To 4 0
Ma tr i z ( I, J) = 0
N ext J
N ext I
Fi l = 2
Do
Fi l = I n pu t Box( “D i g i te e l nú m ero d e Filas”, “ E N T RA DA”, Fil)
Lo o p U n t i l Fi l > 0 A n d Fi l < 21 466
En d S u b 467
Pri vate S u b Ge n e ra r_Tr i a n gulo ( )
Fo r I = 0 To Fi l
Co l = Fi l - I
F N = Fa c to r i al ( I)
C = 0
Fo r J = Co l To Fi l + I Ste p 2
FJ = Fa c to r i al ( C )
F NJ = Fa c to r i al ( I - C )
Ma tr i z ( I, J) = F N / ( FJ * FN J )
C = C + 1
N ext J
N ext I
En d S u b
Pri vate S u b Mo stra r_Tr i a n gulo ( )
Fo r I = 0 To Fi l - 1
Fo r J = 0 To Fi l * 2 – 1
I f Ma tr i z ( I, J) <> 0 T h e n Prin t M a t r iz (I , J ))
N ext J
Nex t I
En d S u b
Pri vate Fu nc t i o n Fa c to r i al ( N A s Doub le) As Doub le
F = 1
Fo r A = 1 To N
F = F * A
Nex t A
Fa c to r i al = F
En d Fu n c t i o n
Paso 4: Prueba de Escritorio.
La prueba de escritorio que a continuación se adelanta tiene por objetivo mostrar el
modo como se sigue el flujo de ejecución del programa. Para ella se tomará el programa
codificado en Visual Basic resultado del paso de diseño y se le adicionará un número a
cada instrucción con el fin de aclarar cada referencia y facilitar el seguimiento en la prueba
de escritorio. Estos números no hacen parte de la codificación.
El programa sería:
vo i d D e f i n i r_ N_ Fi las( ) ;
vo i d Ge n e ra r_Tr i a n gulo ( ) ;
vo i d Mo stra r_Tr i a n gulo ( ) ;
do u ble Fa c to r i al ( do ub le ) ;
do u ble Ma tr i z [2 0][4 0 ], F, A ;
do u ble F N, FJ, F NJ, C ;
i n t Fi l , Co l , I, J;
vo i d m ai n( v o i d) {
c l rsc r ( ) ;
D e f i n i r_ N_ Fi las( ) ;
Ge n e ra r_Tr i a n gulo ( ) ;
Mo stra r_Tr i a n gulo ( ) ;
}
vo i d D e f i n i r_ N_ Fi las( ) {
fo r( I= 0; I<2 0; I+ + ) {
fo r( J= 0 ; J<4 0; J+ + ) {
Ma tr i z [I][J] = 0 ;
}
}
470
Fi l = 2 ;
do{ 471
pr i nt f( “D i g i te e l n úm e ro d e Filas : “ ); s ca n f(“ % d ”, &Fil);
}w h i le( ! ( ( Fi l >0 ) & & ( Fi l <2 0 ) ) );
}
vo i d Ge n e ra r_Tr i a n gulo ( ) {
fo r( I= 0; I<= Fi l ; I+ + ) {
Co l = Fi l - I;
F N = Fa c to r i al ( I) ;
C = 0;
fo r( J= Co l ; J <= Fi l+ I; J+ = 2 ){
FJ = Fa c to r i al ( C ) ;
F NJ = Fa c to r i al ( I-C ) ;
Ma tr i z [I][J] = F N/ ( FJ * FN J );
C+ + ;
}
}
}
do u ble Fa c to r i al ( do ub le N) {
F=1 ;
fo r( A =1; A <= N; A+ + ) {
F = F *A ;
}
re t u r n F;
}
· Codificación del algoritmo en Java:
imp o r t j ava . i o.* ;
p u b l ic c lass Ca p 6_E j e1 _Tri a n gu lo Pas cal _Va rG lo bal {
s tatic d o u b le M a tr i z[ ] [ ] = n e w d o u b le[ 2 0 ] [4 0 ] ;
s tatic d o u b le F, A, F N , FJ , FN J , C ;
s tatic in t Fil , Col , I, J ;
fo r( I= 0 ; I<20 ; I+ + ) {
fo r( J = 0 ; J <4 0 ; J + + ) {
M a tr i z [ I] [ J ] = 0 ;
}
}
Fi l = 2;
d o{
Sys te m.o u t .p r i n t( “ D i g i te e l n ú m e ro d e Fi las : “ ) ;
Fi l = In te ge r. pa rse I n t( le e.rea d L i n e( ) ) ;
}w h ile( ! ( ( Fi l >0 ) && ( Fi l < 2 0 ) ) ) ;
}
p r ivate s tatic d o u b le Fa c to ri al (d o u b le N ) {
F=1 ;
fo r( A=1 ; A<= N ; A+ + ) {
F = F *A;
}
re tu r n F;
}
}
· Codificación del algoritmo en Python:
Ma tr i z = [[]]* 21
de f Fa c to r i al ( N) :
F = 1
A = 1
w hi le A <= N:
F = F * A
A = A + 1
re t u r n F
de f D e f i n i r_ N_ Fi las ():
g lo bal Fi l
I = 0
w hi le I < 21:
Ma tr i z [I] = [ 0 ] *4 0
I+ =1
Fi l = 0
w hi le Fi l < 1 o r Fil > 2 0 :
Fi l = i n pu t(‘ D ig ite el nú m ero d e filas : ‘ )
f u n c tio n D e f i n i r_ N _ Fi las ( ) {
fo r( I= 0 ; I < 2 0 ;I + + )
fo r( J = 0 ;J < 4 0 ;J + + )
M a t ri z [ I ] [ J ] = 0 ;
Fi l = 2;
d o{
Fi l = N u m b er(p ro m p t( “ D i g i te e l n ú m e ro d e Fi las : “,2 ) ) ;
}w h ile( ! ( Fi l > 0 & & Fi l < 2 0 ) ) ;
}
f u n c tio n G e n e ra r_Tri a n gu lo ( ) {
fo r( I= 0 ; I < = Fi l ; I + + ) {
Col = Fi l - I ;
F N = Fa c to ri al ( I ) ;
C = 0;
fo r( J = Co l ; J < = Fi l+ I ; J + = 2 ) {
FJ = Fa c to ri al ( C ) ;
F N J = Fa c to ri al ( I - C ) ;
M a tr i z [ I ] [ J ] = FN / ( FJ * FN J ) ;
C+ + ; }
}
}
f u n c tio n M o s t ra r_Tri a n gu lo ( ) {
fo r( I= 0 ; I < 2 0 ;I + + ) {
fo r( J = 0 ;J < 4 0 ;J + + ) {
i f( M a t ri z [ I ] [ J ] ! = 0 )
d o cu m e n t. w r i te ( ‘ & n b s p ;& n b s p ;’,M a t ri z [ I ] [ J ] ) ;
e l se
do cu m e n t.w r i te ( ‘ & n b s p ;& n b s p ;& n b s p ;& n b s p ;& n b s p ;’ ) ;
}
d o cu m e n t. w r i te ( ‘ < B R / > ’ ) ;
}
}
f u n c tio n Fa c to ri al ( N ) {
F=1 ;
fo r( A=1 ; A < = N ; A+ + )
F = F *A ;
re tu r n F;
}
</S C R IPT >
</B O DY >
</H TM L>
· Codificación del algoritmo en PHP:
<? p h p
$s td i n = fo p e n( ‘ p h p ://s td i n’,’ r’ ) ;
$ma tr i z = ar ray ( ) ;
s e ttyp e( $f,’ i n tege r’ ) ;
s e ttyp e( $a ,’ i n te ge r’ ) ;
s e ttyp e( $fn ,’ i n te ge r’ ) ;
s e ttyp e( $fj ,’ i n te ge r’ ) ;
s e ttyp e( $fn j ,’ i n te ge r’ ) ;
s e ttyp e( $c ,’ i n tege r’ ) ;
s e ttyp e( $fi l ,’ i n te ge r’ ) ;
s e ttyp e( $col ,’ i n te ge r’ ) ;
s e ttyp e( $i ,’ i n tege r’ ) ;
s e ttyp e( $j ,’ i n tege r’ ) ;
f u n c tio n fa cto r ial ( $ n ) {
g lo bal $f, $a ;
$f=1 ;
fo r( $a =1 ; $a < = $ n ; $ a+ + )
$f = $f * $a ;
re tu r n $f ;
}
variables que un algoritmo involucra en el desarrollo de sus tareas, se puede decir que
una vez se ponen en marcha cada uno de los módulos, el computador les crea un área de
memoria propia para su uso exclusivo en el cual mantiene cada una de las variables que
se han definido como locales. Al terminar la ejecución, el módulo libera la memoria que le
fue asignada y por ende borra toda la información que contenga. En conclusión, se puede
afirmar que las variables locales tienen vida mientras se esté ejecutando el módulo que las
tiene definidas. Esta característica hace que la modularización permita, por un lado optimi-
zar el uso de la memoria que se requiere, y por otro definir datos que son independientes
de un módulo a otro.
Si se retoma el ejemplo 1 (triángulo de Pascal) y teniendo de referencia el programa
escrito en Visual Basic al que se le han agregado los números de línea, se ve que las ins-
trucciones de la línea 1 a la 3 definen las variables que usa el algoritmo. Estas definiciones
establecen variables globales puesto que se hace por fuera y al comienzo de todos los
módulos que conforman el programa. Como las definiciones se hicieron al comienzo del
programa, es decir, antes de todos los módulos que las usan, éstos módulos reconocerán y
podrán trabajar con dichas variables En el programa escrito en lenguaje C se ve la misma
circunstancia, es decir, también se han definido variables de tipo global. Ahora bien, si se
retoma el programa escrito en Visual Basic y se reescriben haciendo uso exclusivamente
de variables locales, el programa quedará así:
1. Pr i vate S u b Co m m a n d1_Cl i c k( )
2 . D i m Ma tr i z ( 0 To 2 0 , 0 To 4 0 ) As Doub le, Fil As Doub le
3. D e f i n i r_ N_ Fi las Ma tr i z , Fi l
4. Ge n e ra r_Tr i a n gulo Ma tr i z, Fil
5. Mo stra r_Tr i a n gulo Ma tr i z , Fil
6. En d S u b
7. Pr i vate S u b D e f i n i r_ N_ Fi las( B y Re f M () As Doub le, B y Re f F As Doub le)
8. D i m I A s D o u ble, J A s D o u b le
9. Fo r I = 0 To 2 0
10. Fo r J = 0 To 4 0
11. M( I, J) = 0
12 . N ext J
13. N ext I
14. F = 2
15. Do
16. F = I npu t Box( “D ig ite el nú m ero d e Filas”, “ E N T RA DA”, F)
17. Lo o p U nt i l F > 0 A nd F < 21
18. En d S u b
19. Pr i vate S u b Ge n e ra r_Tr i a n gulo( B y Re f M () As Doub le, B y Val F As Doub le)
2 0. D i m Co l A s D o u ble, I A s D oub le, J As Doub le
21. D i m F N A s D o u ble, FJ A s Doub le, FN J As Doub le, C As Doub le
2 2 . Fo r I = 0 To F
23. Co l = F - I 476
24. F N = Fa c to r i al ( I)
477
2 5. C = 0
2 6. Fo r J = Co l To F + I Ste p 2
27. FJ = Fa c tor ial(C )
2 8. F NJ = Fa c tor ial(I - C )
29. M( I, J) = F N / (FJ * FN J )
30 . C = C + 1
31. N ext J
32 . N ext I
33. End S u b
34. Pr i va te S u b Mo stra r_Tr i a n gulo( B y Re f M () As Doub le, B y Val F A s Doub le)
35. D i m I A s D o u ble, J A s D o ub le
36. Fo r I = 0 To F
37. Fo r J = 0 To F * 2
38. I f M( I, J) = 0 th e n Pri n t “ “
39. i f M( I, J) < > 0 th e n Pri n t For m a t (M (I , J )),”# # # # # ” )
40. N ext J
41. N ext I
42 . End S u b
43. Pr i va te Fu n c t i o n Fa c to r i al ( By Val N As Doub le) As Doub le
44. D i m F A s D o u ble, A A s D oub le
45. F = 1
46. Fo r A = 1 To N
47. F = F * A
48. N ext A
49. Fa c to r i al = F
50. En d Fu n c t i o n
A continuación, se hace una prueba de escritorio al programa en Visual Basic presenta-
do más arriba, el cual hace uso de variables locales. La idea es verificar el comportamiento
del mismo y la forma como hace el control del contenido de las variables, con el fin de
comprender mejor los mecanismos de operación de las variables locales. De esta forma,
la prueba se inicia ejecutando la instrucción numerada con 1 que es el inicio del progra-
ma. Ejecutada esta instrucción, se pasa a 2 que define las variables Matriz y Fil. Como se
empezó la ejecución del programa, este pone en acción el módulo principal por donde se
da inicio a la ejecución del mismo, así se crea un espacio en memoria para la creación y el
manejo de las variables definidas dentro del módulo principal. Gráficamente se puede ver
como lo muestra la figura 149.
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares
Matriz
0 1 2 3 4 5 6 7 8 ...
0
1
2
.
.
.
Fill
480
481
Se puede ver que los parámetros hacen definiciones diferentes para sus variables. Para
Matriz establece una referencia que se maneja dentro del Generar_Triangulo con M y para
Fil se hace una definición por valor y se maneja dentro del Generar_Triangulo con F, no ma-
neja una referencia, sino que copia el valor de la variable Fil en F que para el caso es de 4.
En la instrucción 22 y hasta la 32 se ejecutan un conjunto de instrucciones que realizan
dos ciclos con el propósito de ir calculando los coeficientes binomiales de cada una de
las filas que conforman el triángulo de Pascal. Para este cálculo se requiere del uso de un
módulo función y es así que la instrucción de la línea 24 llama a la función Factorial con un
parámetro I, es decir, que al invocar la función el control de flujo del programa se pasa a la
instrucción de la línea 43, que es la que recibe el llamado. Esta línea es la definición de la
función Factorial y, por lo tanto, crea un ámbito de trabajo para este módulo, definiendo las
variables locales al módulo.
El nuevo ámbito de trabajo define las variables locales N, F y A mediante la ejecución de
las instrucciones 43 y 44. N es la variable que recibe el valor de I, que es la variable que se usó
en el llamado a la función en la instrucción 24. Este parámetro está definido por valor. Las otras
dos variables (F y A) son variables locales de trabajo de la función. La siguiente figura muestra
los ambientes de trabajo que se encuentra definidos en la memoria del computador en el
momento de terminar la ejecución de la instrucción 44.
Figura 154: Ámbitos de trabajo definidos para cada uno de los módulos invocados.
De la figura 154 se puede apreciar que hay dos variables definidas con el mismo nom-
bre, pero en diferentes ámbitos de trabajo. Una definición está hecha por el módulo Ge-
nerar_Triangulo y la otra en Factorial. La variable es la que tiene por nombre F. Para el
computador no hay confusión de cuál es cuál y qué valor maneja cada una, pues el hecho 482
de estar definidas dentro de ámbitos de trabajo diferentes hace que sean totalmente dife- 483
rentes y almacenen valores independientes.
El propósito de la variable F definida dentro del ámbito de trabajo de Factorial es al-
macenar el valor del cálculo del factorial del valor que llega como parámetro mediante la
variable N. Como N tiene valor de cero, el valor del factorial de cero es uno puesto que es
lo que da como resultado de la ejecución de las instrucciones 45, 46, 47 y 48. La instrucción
49 devuelve el valor de F al ámbito de trabajo de Generar_Triangulo que fue de donde se
invocó su ejecución y deja almacenado el uno en la variable FN de la instrucción 24.
484
Figura 158: Contenido de la RAM después ejecutada la instrucción 33. 485
No hay que olvidar que la variable Matriz es un arreglo bidimensional de 20 filas por
40 columnas y que la figura solo muestra la primera parte de esta variable, es decir, las 4
primeras filas y las 8 primeras columnas, puesto que son los elementos de la matriz que
tienen los datos del triángulo generado. El resto de la variable Matriz está llena de ceros.
Como la ejecución del programa va en la instrucción 5, el llamado al módulo Mostrar_
Triangulo con dos parámetros o argumentos, la matriz y el número de filas que se están
manejando para el triángulo. Al invocar el módulo Mostrar_Triangulo el control de flujo
del programa salta a la instrucción 34 que es la que recibe el llamado y la que define un
ámbito de trabajo para este módulo como lo muestra la figura 159.
vo id m ain(vo id) {
d o u b le M a tr i z [ 2 0 ] [4 0 ] ; i n t Fi l ;
cl rs cr ( ) ;
D efi n i r_N _Fi las ( M a t ri z , & Fi l ) ;
G en era r_Tr i a n gu lo ( M a t ri z , Fi l ) ;
M o s tra r_Tr i a n gu lo ( M a t ri z , Fi l ) ;
}
fo r( I= 0 ; I<= F; I + + ) {
Col = F - I ;
F N = Fa cto ri al ( I ) ;
C = 0;
fo r( J = Co l ; J < = F+ I ; J + = 2 ) {
FJ = Fa c to ri al ( C ) ;
F N J = Fa c to ri al ( I - C ) ;
M [ I] [ J ] = FN / ( FJ * FN J ) ;
C+ + ;
}
}
}
vo id M os tra r_Tr i a n gu lo ( d o u b le M [ ] [4 0 ] , i n t F) {
in t I, J ;
fo r( I= 0 ; I<= F; I + + ) {
fo r( J = 0 ; J< = F* 2 ; J + + ) {
if( M [ I ] [ J ] ! = 0 )p r i n t f( “ %3.0 f ”,M [ I ] [ J ] ) ;
e l s e pri n t f ( “ “);
}
p r in tf( “ \n” ) ;
}
p r in tf( “ \n\n Pu l s e u n a te c la pa ra co n t i n u a r..” ) ;
ge tc h e( ) ;
}
d o u b le Fa cto r i al (d o u b le N ) {
d o u b le F, A;
F=1 ;
fo r( A=1 ; A<= N ; A+ + ) {
F = F *A;
}
re tu r n F;
}
· Codificación del algoritmo en Java:
im p o r t j ava . i o.* ;
p u b l ic c lass Ca p 6_E j e1_Tri a n gu lo Pas cal {
p u b l ic s tatic vo id m a i n( S t r i n g[ ] a rgs ) t h ro w s I O E xce p t i o n {
d o u b le M a tr i z [ ] [ ] = n e w d o u b le[ 2 0 ] [4 0 ] ;
in t Fi l = 2;
Fi l = D efi n i r_N _ Fi las ( M a t ri z ) ;
G en era r_Tr i a n gu lo ( M a t ri z , Fi l ) ;
M o s tra r_Tr i a n gu lo ( M a t ri z , Fi l ) ;
}
fo r( J = 0 ; J <4 0 ; J + + ) {
M [ I] [ J ] = 0 ;
}
}
F = 2;
d o{
Sys te m.o u t . p r i n t( “ D i g i te e l n ú m e ro d e Fi las : “ ) ;
F = In te ge r. pa rs e I n t( le e.rea d L i n e( ) ) ;
} w h ile( ! ( ( F>0 ) & & ( F< 21) ) ) ;
re tu r n F;
}
re tu r n F
d e f G en era r_Tr i a n gu lo ( M , F) :
I = 0
w h ile I <= F:
Co l = F - I
F N = Fa cto ri al ( I )
C = 0
J = Co l 488
w h ile J <= ( F + I ) :
489
FJ = Fa c to ri al ( C )
F N J = Fa c to ri al ( I - C )
M [ I] [ J ] = FN / ( FJ * FN J )
C = C + 1
J = J + 2
I = I + 1
d e f M os tra r_Tr i a n gu lo ( M , F) :
I = 0
w h ile I<= F:
J = 0
w h ile J <= F* 2 :
if M [ I] [ J ] ! = 0 :
print M[I][J],
e l s e:
print ‘ ‘,
J = J + 1
p r in t
I = I + 1
d e f ma i n ( ) :
I = 0
M a tr i z = [ [ ] ] * 20
w h ile I < 20 :
M a tr i z [ I] = [ 0 ] *4 0
I+ =1
m ain( )
· Codificación del algoritmo en JavaScript:
<HTM L>
<B O DY >
<S C R IPT >
var m = n e w A r ray ( 20 ) ; fo r ( va r i = 0 ;i < 2 0 ;i + + ) { m [ i ] = n e w A r ray (4 0 ) ; }
var f = n e w Nu mb e r( ) ;
f u n c tio n fa cto r i al ( n ) {
var f; var a = n e w N u m b e r( ) ;
f = 1;
fo r ( a =1 ; a <= n ; a+ + ) {
f = f *a ;
}
re tu r n f;
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares
do {
f = Nu m b e r( p ro m p t( “ D i g i te e l n ú m e ro d e Fi las : “ ) ) ;
} w h ile ( ! ( ( f>0 & & f < 2 0 ) ) ) ;
}
</S C R IPT >
</B O DY >
</H TM L>
· Codificación del algoritmo en PHP:
<?php
$s td i n = fo p e n( ‘ p h p ://s td i n’,’ r’ ) ;
$ma tr i z = ar ray ( ) ; s e t ty p e( $f i l ,’ i n te ge r’ ) ;
d efi n i r_n _fi las ( $m a t ri z ,$f i l ) ;
gen era r_tr i a n gulo( $ m a t ri z ,$f i l ) ;
mos tra r_tr i a n gulo ( $ m a t ri z ,$f i l ) ;
f u n c tio n fa cto r i al ( $ n ) {
s e ttyp e( $a ,’ floa t’ ) ;
$f = 1 ;
fo r ( $a =1 ; $a <= $ n ;$ a+ + ) {
$f = $f * $a ;
}
re tu r n $f ;
}
fo r ( $i = 0 ; $i <= $f ;$ i + + ) {
$col = $f-$i;
$fn = fa ctori al ( $ i ) ;
$c = 0 ;
fo r ( $j = $co l ;$ j < = $f+$ i ;$ j + = 2 ) {
$fj = fa c to ri al ( $ c ) ;
$fn j = fa c to ri al ( $ i -$ c ) ;
$m[ $i ] [ $ j ] = $f n / ( $f j * $f n j ) ;
$c = $c+1;
}
}
}
fo r ( $i = 0 ; $i <20 ; $ i + + ) {
fo r ( $j = 0 ; $j < 4 0 ;$ j + + ) {
$m[ $i ] [ $ j ] = 0 ;
}
}
$f = 2;
do {
e c h o ‘ D i g i te e l n ú m e ro d e Fi las : ‘ ;
fs can f( $s td i n ,” %f ”,$f ) ;
} w h ile ( ! ( ( $f>0 & & $f < 2 0 ) ) ) ;
}
?>
6.3. La organización de un algoritmo por módulos
Como se presentó en el ejemplo 1, es importante el orden en que se ejecutan las instruccio-
nes que conforman cualquier programa. Cuando estos están organizados en módulo (proce-
dimientos o funciones) también se establece un orden de ejecución (Marco Gomez, Martin
Prat, Molinero Albareda, Vazquez Alcocer, & Xhafa, 2006). Siempre que se implemente un algo-
ritmo utilizando las técnicas de modulación se deben tener en cuenta los siguientes criterios:
Las variables globales, que son las que definen por fuera de cualquier módulo y que son
reconocidas por todos los módulos que conforman el algoritmo se debe definir al comienzo;
antes de cualquiera de los módulos que conforman el algoritmo.
El orden que se debe establecer para cada uno de los módulos, en algunos casos de-
pende del lenguaje de programación que se use para su implementación, pero en términos
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares
6. En d S u b
7. Pr ivate S u b D efi n i r_N _Fi las ( B y Re f M ( ) A s Do u b le, By Re f F A s Do u b le)
8. D im I A s D o u b le, J As D o u b le
9. Fo r I = 0 To 20
1 0 . Fo r J = 0 To 4 0
11 . M ( I, J ) = 0
1 2. Next J
1 3. Next I
14. F = 2
15. Do
1 6 . F = In p u tB ox( “ D i g ite e l n ú m e ro d e Fi las”, “ E N T R A DA”, F)
1 7. Lo o p U n til F < 1 Or F > 201
1 8. En d S u b
1 9. Pr ivate S u b G en era r_Tr i a n gulo( By Re f M ( ) A s Do u b le, By Val F A s Do u b le)
20 . D im Col As D o u b le, I As D o u b le, J A s Do u b le
21 . D im F N A s D o u b le, FJ A s D o u b le, FN J A s Do u b le, C A s Do u b le 492
22. Fo r I = 0 To F 493
23. Co l = F - I
24 . F N = Fa ctor i al ( I)
25. C = 0
26. Fo r J = Col To F + I S te p 2
27. FJ = Fa cto ri al ( C )
28. F N J = Fa c to ri al ( I - C )
29. M ( I, J ) = F N / ( FJ * FN J )
30 . C = C + 1
31. Next J
32. Next I
33. En d S u b
34 . Pr ivate S u b M o s tra r_Tr i a n gulo (By Re f M ( ) A s Do u b le, By Val F A s Do u b le)
35 . D im I As D o u b le, J As D o u b le
36 . Fo r I = 0 To F
37. Fo r J = 0 To F * 2
38. If M ( I, J ) = 0 t h e n Pr i n t “ “
39. if M ( I, J ) < > 0 t h e n Pr i n t Fo rm a t ( M ( I , J ) ) ,”# # # # # ” )
40. Next J
41. N ext I
42. En d S u b
43. Pr ivate Fu n c tio n Fa cto r i al (B yVal N A s Do u b le) A s Do u b le
4 4 . D im F A s D o u b le, A As D o u b le
45 . F = 1
4 6. F o r A = 1 To N
47. F = F * A
4 8. Next A
49. F a cto r i al = F
5 0 . En d Fu n c tio n
Del programa, las instrucciones 3, 4 y 5 son llamados a los módulos; la instrucción 7 es
la declaración del módulo procedimiento para definir el número de líneas que va a tener el
triángulo de Pascal, esta instrucción declara el nombre del módulo y la lista de parámetros
que va a manejar; el final de la declaración del módulo es la instrucción 18; las instruccio-
nes 24, 27 y 28 hacen el llamado o invocación al módulo función Factorial y la declaración
de este se hace en la instrucción 43; el final de la declaración del módulo Factorial es la
instrucción 50.
En el programa del triángulo de Pascal que se ha escrito en lenguaje C, también se dan
los mismos conceptos y operan de la misma forma. En otros lenguajes hay que estudiar la
sintaxis propia del mismo para poder aplicar correctamente estos conceptos.
N! = N × (N - 1) × (N - 2) × ... × 2 × 1 para N ≥ 0
En donde se plantea claramente que el factorial de un número natural es la multipli-
cación de los valores anteriores a él. Es decir, el factorial de 5 es 120, esto es 5 x 4 x 3 x 2 x
1. A continuación se presenta un algoritmo que está diseñado sin hacer uso de las técnicas
de recursión (Savitch, 2006) pero aplicando técnicas de modularización (Senn, 1992). El al-
goritmo que se presentó en el ejemplo 5 del capítulo 4 no es ni modular y menos recursivo.
494
495
Como se puede ver en la figura 161, el diagrama de flujo del módulo Factorial es al que
se le aplicaron las técnicas de recursividad puesto que contiene un ciclo y por tanto hay ins-
trucciones que se repiten. Además, si se analiza con mayor cuidado la expresión dada para
el cálculo del factorial, está definida de manera recursiva, es decir, para el cálculo un factor,
se hace a partir del mismo factor pero disminuido en uno; esto es una definición recursiva.
Por lo tanto, aplicando estos términos al rediseño del módulo para Factorial, quedaría como
se muestra a continuación.
10 . En d S u b
11. Pri vate Fu nc t i o n En tra r_ Num e ro () As Doub le
12. D i m N A s D o u ble
13. N = I n pu t Box( “D i g i te e l n úm ero”, “ E N T RA DA”, 5 )
14 . En tra r_ Num e ro = N
15. En d Fu nc t i o n
16. Pri va te Fu n c t i o n Fa c to r i al (ByVal N As Doub le) As Doub le
17. D i m F A s D o u ble
18. I f N = 1 T he n
19. F = 1
20. Fac to r i al = F
21. Else
496
22 . F = N * Fa c to r i al ( N - 1 )
23. Fa c to r i al = F 497
24. En d I f
25. En d Fu nc t i o n
26. Pri vate S u b Mo stra r_ Fa c to r i al (By Val F As Doub le)
27. Pr i n t “El valo r de l fa c to r i al es “ & F
28. En d S u b
y que construye el ámbito de trabajo para desarrollar las tareas de la función. Ejecutadas
las instrucciones 11 y 12 se ha construido el ámbito de trabajo para la función de entrada
del algoritmo. A continuación, se muestra la información almacenada en la memoria RAM,
ejecutadas en su orden las tareas hasta la instrucción 12.
Se ejecuta a continuación la instrucción 13, que consiste en una instrucción que permi-
te digitar un valor y almacenarlo en la variable N (supóngase que se digitó 4), los ambien-
tes de cada módulo, se verían como lo muestra la siguiente figura:
498
499
Como se puede ver en la figura 170, el primer llamado que se hace a la función por
parte del módulo principal pasa el valor de 4 y luego la función misma es autollamada,
pero se pasa ahora el valor de 3. En el segundo ámbito creado para factorial tiene un
valor de 3 que mediante la ejecución de la instrucción 18 da como resultado falso y por
tanto se ejecuta nuevamente la instrucción 22 que hace un tercer llamado a la función
Factorial, con lo que se crea un tercer ámbito de trabajo para la función Factorial con un
parámetro formal de N -1, es decir, pasa a un valor de 2. Gráficamente el contenido de la
memoria del computador se muestra a continuación.
500
501
Figura 172: Contenido de la memoria después de
ejecutada la instrucción 17 por cuarta vez.
El cuarto ámbito de trabajo creado para la función Factorial muestra la variable N con un
valor de 1 y por tanto la evaluación de la instrucción 18 da como resultado verdadero por lo
que se pasa a ejecutar la instrucción 19 que asigna 1 a la variable F. En la siguiente imagen
se presenta el contenido de la memoria del computador después de ejecutada la instrucción
502
503
Figura 176: Contenido de la memoria después de
ejecutada la instrucción 22 del ámbito tres.
Ejecutada la instrucción 22 del ámbito tres se pasa a ejecutar la instrucción 23 de este am-
biente que consiste en retornar el valor de la variable F del ámbito tres al ámbito dos. La me-
moria del computador contendrá la información organizada como se muestra a continuación.
504
505
Como el control de flujo del programa está en la instrucción 22 del ámbito de trabajo
uno de la función Factorial, se ejecuta la expresión y el valor que da es 24, puesto que
multiplica el valor de N del ámbito de trabajo uno de Factorial y el valor devuelto para
la función que es seis. La memoria del computador contendrá la información organizada
como se muestra a continuación.
}
· Codificación del algoritmo Java:
i m po r t j ava . i o.* ;
pu bli c c lass Ca p 6_ E j e2 _ Fa c tor ialRecu rs ivo {
pu bli c sta t i c vo i d m a in(Stri n g[ ] a rgs ) th rows I OExce p tion {
float N, F;
N = En tra r_ Num e ro();
i f( N > 0 ) {
F = Fa c to r i al ( N );
Mo stra r_ Fa c to r ial(F );
}
e lse{
Syste m .o u t . pr i n t(“ N u m ero no valid o . . .” );
}
}
pr i va te sta t i c floa t Ent ra r_N u m ero() th rows I OExce p tion{
Bu ffe re dRea de r lee = n e w B uf fe re d Rea d e r( n e w I n p utStrea m Rea d-
e r(Syste m . i n) ) ;
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares
floa t N;
Syste m .o u t . pr i nt(“ D ig ite el nú m ero: “ );
N = I nte ge r. parse I n t(lee.rea d L i n e());
re t u r n N;
}
de f Fa c to r i al ( N) :
i f N = = 1:
F = 1
e lse:
F = N * Fa c to r i al(N - 1 )
re t u r n F
de f Mo stra r_ Fa c to r i al (F ):
pr i n t ‘ El fa c to r i al es : ‘, F
de f m a i n ( ) :
N = En tra r_ Num e ro()
i f N > 0:
F = Fa c to r i al ( N)
Mo stra r_ Fa c to r i al(F)
e lse :
pr i nt ‘ n úm e ro n o valid o . . .’
main()
· Codificación del algoritmo en JavaScript:
<H TML>
<B O DY >
<SC R IPT >
fu nc t i o n e n t ra r_nu m ero() {
va r n = n e w N um b e r();
n = N u mb e r(p rom p t(“ D ig ite el nú m ero: “ ));
re t u r n n;
}
fu n c t i o n fa ctor ial(n) {
va r f = n e w N um b e r();
i f ( n = =1) {f = 1 ; }
e lse {
f = n*fa c tor ial(n-1 );
}
re t u rn f;
}
fu n c t i o n m ain() { 508
va r n = new N u m ber (); 509
va r f = n ew N u m ber ();
n = e n tra r_nu m ero();
i f ( n >= 0) {
f = fa c tor ial(n);
m o s t ra r_fa c tor ial(f );
}
e lse {
do cu m e n t.wri te (“ N u m ero no válid o. . .”,’ < BR/> ’ );
}
}
main();
</ SC R IPT >
</ B O DY >
</ H TML>
· Codificación del algoritmo en PHP:
<? p h p
$ stdi n = fop e n(‘ php: //s td in’,’ r ’ );
e lse {
$f = $n* fa c tor ial($n-1 );
}
re t u r n $f;
}
fu n c t i o n mos t ra r_fa c tor ial($f ) {
e c ho ‘ El fa c tor ia es ‘, $f, P H P_EO L;
}
?>
Ejemplo 3.
Algoritmo recursivo para el cálculo de la serie de Fibonacci.
La serie de Fibonacci es una secuencia de números que está definida como que el
siguiente término de la serie es la suma de los dos anteriores, así:
510
511
1. D i m Te r m i n o s( 2 00) A s D o u ble
2 . Pr i va te S u b Co m m a n d1_Cl i c k ()
3. D i m N A s I nte ge r
4 . N = En tra da ( )
5. I f N > 0 A nd N < 2 00 T h e n
6. Se r i e ( N, 1, -1)
7. Ve r_Se r i e ( N)
8. Else
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares
9. Pr i n t “Núm e ro no válid o”
10 . En d I f
11. En d S u b
12. Pr i vate Fu nc t i o n En tra da ( ) As I n te ge r
13. D i m N A s I nte ge r , I A s I n te ge r
14 . Fo r I = 0 To 19 9
15. Te r m i n o s ( I) = 0
16. N ext I
17. N = Va l (I n pu t Box( “D i g i te el nú m ero d e tér m inos a genera r ”, “ Ent ra d a”, 1 0 ))
18. En tra da = N
19. End Fu nc t i o n
2 0. Pr i va te S u b Se r i e (ByVal N A s I n te ge r , B y Val U lt im o As Doub le, B y Val Penu lt im o A s
D o u ble)
27. En d S u b
28. Pr i vate S u b Ve r_Se r i e (ByVal N )
29. D i m I A s I n te ge r
30. Fo r I = N To 1 S te p -1
31. Pr i n t Te r m i n o s( I )
32. N ext I
33. En d S u b
No hay que olvidar que los números que se escriben al comienzo de cada instruc-
ción no son parte de la codificación, son solo referencias para explicar cómo es que
opera el programa a partir de una prueba de escritorio.
El programa está compuesto por cuatro módulos: el módulo principal (Sub Com-
mand1_Click() por donde arranca la ejecución del mismo) que es un procedimiento, el
módulo de entrada (Entrada() que es una función que retorna el valor digitado para el
número de términos que se quieren generar), el módulo (Serie N, Último, Penúltimo)
que es un procedimiento que recibe tres parámetros, el cual genera de forma recursiva
la serie deseada, por último, está el módulo de salida (Ver_Serie(N)) procedimiento que
muestra los valores de la serie de Fibonacci almacenados en el arreglo Terminos desde
el último al primero. Se presenta a continuación una prueba de escritorio del progra-
ma para mostrar de forma detallada cómo se maneja una a una las instrucciones del
programa y cómo la información en la memoria del computador es manejada.
El programa arranca ejecutando la instrucción número 1 que define un arreglo de 200
elementos con el nombre Terminos. De la instrucción 1 pasa a la 2 que define el ámbito de
trabajo del módulo principal y a continuación se ejecuta la instrucción 3 que define una va-
riable N local al procedimiento principal. Se puede ver que la memoria RAM del computa-
dor contendrá la información organizada como se muestra a continuación en la figura 187. 512
513
518
519
Después de la instrucción 24 se pasa a 25, con lo que se llama por quinta vez al procedi-
miento Serie, el control de flujo del programa se devuelve a la instrucción 20 y 21 nuevamente
para crear el quinto ámbito de trabajo para el procedimiento. Al nuevo ambiente de trabajo
se le pasan los parámetros formales 0, 2, 1. La información en la memoria RAM se organiza así.
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares
520
De la instrucción 26 del cuarto ámbito, se pasa a ejecutar la instrucción 27 con lo que
521
se termina la ejecución del procedimiento dentro del cuarto ambiente de trabajo y por lo
tanto se elimina y retorna el control del flujo del programa a la instrucción 26 del tercer
ambiente de trabajo. Así se organizaría la información en la memoria RAM.
De la instrucción 6 que se ejecuta dentro del ambiente de trabajo del módulo principal,
se pasa a ejecutar la instrucción 7 que corresponde al llamado del procedimiento Ver_Serie
con un parámetro actual N, es decir, se llama el procedimiento y manda el valor 4 al am-
biente del trabajo que se crea para tal.
De la instrucción 7 se pasa el control de flujo del programa a la instrucción 28 que crea
el ámbito trabajo para el procedimiento Ver_Serie con el parámetro formal N. La instrucción
29 define la variable local I con lo que ejecuta a continuación las instrucciones 30, 31 y 32
522
que corresponden con la construcción de un ciclo que muestra en la pantalla el contenido
523
de la variable global Terminos de tipo arreglo, desde el elemento N hasta el elemento 1, es
decir, imprime el arreglo hacia atrás.
La instrucción 33 termina la ejecución del procedimiento que imprime los resultados y
destruye el ambiente de trabajo para el procedimiento Ver_Serie y devuelve el control de
flujo del programa a la instrucción 7, de ahí pasa a ejecutar la instrucción 11 con la que el
algoritmo termina su ejecución y por ende el programa. Una vez terminada la ejecución del
programa, se elimina toda la información de la memoria RAM del computador, dando cum-
plimento al trabajo para el que fue creado el programa.
Con todo esto se concluye la prueba de escritorio del programa y se espera que se haya
mostrado el funcionamiento del computador con programas recursivos.
Ahora se presenta el algoritmo codificado en los diferentes lenguajes de programación.
· Algoritmo codificado en lenguaje C.
#i n c lu de <stdi o. h >
#i n c lu de <co n i o. h >
i nt En tra da ( ) ;
vo i d Se r i e (i n t , i nt , i n t) ;
vo i d Ve r_Se r i e (i nt) ;
i nt Te r m i n o s[2 00];
vo i d m ai n( vo i d) {
i n t N;
N = En tra da ( ) ;
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares
i nt En tra da ( ) {
i n t N, I;
fo r( I= 0 ; I<2 00; I+ + )
Te r m i n o s[I] = 0;
vo i d Se r i e (i nt N, i n t Ul ti m o, i n t Penu lt im o){
i n t Si gui e n te, I;
i f ( N > 0) {
Si gui e n te = Ul ti m o + Penu lt im o;
I = N - 1;
Te r m i n o s[I] = Si gui e nte;
Se r i e ( N - 1, Si gui e n te, U lt im o);
}
}
vo i d Ve r_Se r i e ( i n t N) {
i n t I, J= N;
fo r ( I = N; I > 0 ; I--)
pr i n t f ( “%5 d. %5 d\ n”, J - I +1 , Ter m inos [ I -1 ] );
}
· Algoritmo codificado en Java.
imp o r t j ava . i o.* ;
p u b l ic c lass Ca p 6_E j e3_Fi b on a cc i Re cu rs i v o {
s tatic in t Ter mi n os [ ] = n e w i n t[ 2 0 0 ] ;
p r ivate s tatic vo id S er i e (i n t N , i n t U l t i m o, i n t Pe n u l t i m o ) {
in t S i gui en te, I;
if(N > 0 ) {
S i gui en te = U l ti mo + Pe n u l t i m o ;
I = N - 1;
Ter mi n os [ I] = S i guie n te ;
S er i e( N - 1 , S i gui ente, U l t i m o ) ;
} 524
} 525
p r ivate s tatic vo id Ver_Se ri a ( i n t N ) {
in t I;
fo r( I = N ; I > 0 ; I- - )
Sys te m.o u t .p r in tl n( “ ” +Te rm i n o s [ I -1] ) ;
}
}
d e f Ver_S er i e( N ) :
I = N - 1
w h ile I > 0 :
p r in t Ter mi n os [ I]
I = I - 1
d e f ma i n ( ) :
N = En tra d a ( )
if N > 0 an d N < 20 0 :
S er i e( N , 1 , -1 )
Ver_S er i e( N )
e l s e:
p r in t ‘ n úmero n o val i d o ...’
ma i n ( )
· Algoritmo codificado en JavaScript.
<H TML>
<B O DY >
<SC R IPT >
fu nc t i o n v er_s er ie(t , n) {
va r i = n e w N um b e r();
va r j = n e w N um b e r();
j = n;
fo r ( i = n ; i> =1 ; i- - )
do cum e n t.write (j- i+1 ,’ &nbs p; &nbs p; &nbs p; ’,t [ i-1 ] ,’ < BR/> ’ );
}
i f ( n >0) {
si gu iente = u lt im o+ penu lt im o;
i = n-1 ;
t[i ] = s igu iente;
se r i e(t , n-1 , s igu iente,u lt ino);
}
}
fu n c t i o n e nt ra d a (t ) {
var n = n e w N um b e r();
var i = n e w N um b e r();
fo r ( i = 0 ; i< 2 0 0 ; i+ + )t [ i] = 0 ;
n = N u m b e r( p rom p t(“ D ig ite el nú m ero d e tér m inos a genera r : “ ));
re t u r n n;
}
fu nc t i o n m a in() {
va r n = n e w N um b e r();
va r te r m inos = n e w Array (2 0 0 );
n = e n tra d a (ter m inos );
i f ( n > 0 && n < 2 0 0 ) {
se r ie(ter m inos , n,1 ,-1 );
v e r_s er ie(ter m inos , n);
}
e lse
do cum e n t.wri te (“ N ú m ero no válid o”,’ < BR/> ’ );
}
main();
</ SC R IPT >
</ B O DY >
</ H TML>
· Algoritmo codificado en PHP:
<? p h p
$ stdi n = fo pe n(‘ php: //s td in’,’ r ’ );
fu nc t i o n v e r_ s er ie($t , $n) {
se t type( $ i ,’ integer ’ );
se t type( $ j ,’ integer ’ );
$j = $n;
fo r ( $ i = $ n ;$i> 0 ; $i- - )
e c ho $ j-$i+1 ,’ ‘, $t [ $i] , P H P_EO L;
}
fu nc t i o n se r i e (&$t , $n, $u lt im o, $penu lt im o) {
se t type( $ s igu iente,’ integer ’ );
se t type( $ i,’ integer ’ );
i f ( $ n >0) {
$ si gui e nte = $u lt im o+$penu lt im o;
$ i = $ n-1 ;
$ t[$ i ] = $s igu iente;
se r i e ( $ t , $n-1 , $s igu iente, $u lt ino);
}
}
fu nc t i o n e n trad a (&$t ) {
g lo bal $ std in;
se t type( $ n,’ integer ’ );
se t type( $ i,’ integer ’ );
526
fo r ( $ i = 0; $ i< 2 0 0 ; $i+ + ) $t [ $i] = 0 ; 527
e c ho ‘ D i g i te el nú m ero d e tér m inos a genera r : ‘ ;
fscanf( $ std in,” % d ”, $n);
re t u r n $ n ;
}
se t type( $ n ,’ i n teger ’ );
$ te r m i n o s = a rray ();
$ n = e n tra da ( $ter m inos );
i f ( $ n > 0 & & &n < 2 0 0 ) {
se r i e ( $ te r minos , $n,1 ,-1 );
v e r_ se r i e ( $ ter m inos , $n);
}
e lse
e c ho ‘ Núm ero no válid o’, P H P_EO L;
?>
6.7. Ejercicios de repaso
Construir la solución de cada uno de los siguientes ejercicios siguiendo la metodología (in-
vestigación preliminar, especificación, diseño y prueba de escritorio) planteada y los temas
estudiados en el presente capítulo para la construcción de los mismo7.
1. Por sumas sucesivas, usando recursión, calcular la multiplicación de dos números
naturales.
2. Por restas sucesivas, usando recursión, calcular la división de dos números naturales.
3. Por multiplicaciones sucesivas, hacer un algoritmo recursivo que calcule XY.
4. Implementar un algoritmo recursivo para calcular la función para un valor de x
entero así:
{ T1 x=1
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares
T (x)
x-1 x-1 x>1
( ( + T ( ( + (x-1)
5 4
T (x) = 3T
( x 2- 1 ) + ( x - 1 )2
7
Los problemas fueron tomados de los libros Fundamentos de
programación, libro de problemas (Joyanes Aguilar 1996), Len-
guaje C el Nuevo concepto (Becerra Santamaría, 2001), Métodos
numéricos básicos para ingeniería con implementaciones en
Matlab (De Castro Payares, 2014), Problemas Resueltos de Progra-
mación en Lenguaje C (Carretero Perez, Garcia Carballeira, Garcia
Sanchez, Perez Menor, & Sanchez Garcia, 2002); y de las páginas
web de elhacker.net (elhacker.net, s.f.), LibroWeb (Wachenchauzer,
Manterola, Curia, Medrano, & Paez, 2011), (Miller, Heeren, & Hor-
nsby, 2013); y Proyect Eules (Proyect_Euler.net, 2017).Script (Sán-
chez Maza, 2012) y otros son propuestos por el autor.
8. Escribir un algoritmo recursivo que tome un valor natural y determine el número
de cifras que tiene.
9. Hacer un algoritmo recursivo que sume los dígitos de un número natural de hasta
10 cifras.
10. Realizar un algoritmo recursivo que tome un valor entero positivo de hasta 15 cifras
y lo invierta.
11. Usando el procedimiento del método de multiplicación a la rusa mostrado en el
capítulo 3, implementar un algoritmo recursivo para hacer la multiplicación.
12. Calcular el máximo común divisor de dos números naturales usando un algoritmo
recursivo.
13. Hacer un algoritmo recursivo que tome un arreglo y replique los datos N veces, así:
Si se tiene el arreglo:
3 1 9 5 2 9 0
3 3 3 1 1 1 5 5 5 2 2 2 9 9 9 0 0 0
14. Sumar los elementos de una matriz usando un algoritmo recursivo. 528
15. Escribir un algoritmo recursivo que determine el mayor valor de un arreglo de 200 529
elementos que tiene valores registrados en él.
16. Hacer un algoritmo recursivo que sume los múltiplos de 3, 5, y 7 que hay desde 1
hasta un número natural N dado menor a 1500.
17. Realizar un algoritmo recursivo que sume los elementos de un arreglo de 200
elementos.
18. Escribir un algoritmo recursivo que imprima un cuadrado latino de N*N, para valo-
res de N en el intervalo [10,20]. Un ejemplo del resultado del algoritmo sería: si N
= 5, la respuesta será:
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 1
19. Hacer un algoritmo recursivo que imprima un cuadrado mágico de orden N, donde
N es un número de la serie 3, 5, 7,…, 15. Si N es 3 el resultado sería:
8 1 6
3 5 7
4 9 2
20. Hacer un algoritmo recursivo que determine la suma de los n primeros números
pentagonales. Un número pentagonal está dado por:
n (3n - 1 )
Tn =
2
21. Escribir un algoritmo recursivo que genere los N términos de la siguiente serie
2, 6 ,22, 56, 114, 202, 326, …
22. Diseñar un algoritmo recursivo que tome un número hasta de 5 cifras y calcule la
constante de Kaprekar. Esto es, por ejemplo, si se da el número 698, entonces se
procede a ordenar las cifras del número dado de mayor a menor, quedando como
986, la constate se halla haciendo restas sucesivas así:
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares
23. Escribir un algoritmo recursivo para calcular el entero abundante que sigue a un
valor entero positivo dado.
24. Construir un algoritmo recursivo que dado un número natural determine cuál es el
siguiente número defectivo o deficiente al valor dado.
25. Diseñar un algoritmo recursivo que tome un número entero positivo menor que
300 y ejecute el siguiente proceso: si N es par se debe dividir por 2 y el cociente
de la división es el nuevo valor para N. Si N es impar, tomar N multiplicarlo por 3 y
sumarle uno, el resultado se convierte en el nuevo valor para N. El proceso se repite
hasta que N sea igual a uno. El programa debe dar como resultado cada uno de los
valores calculados para N. Ejemplo: Si se da 14 la respuesta será:
14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1
26. Hacer un algoritmo recursivo que calcule los números perfectos que se encuentran
desde 1 hasta un número dado mayor a 1000.
27. Diseñar un algoritmo recursivo que genere la siguiente información para un nú-
mero N entero positivos menor a 500. Si se toma N = 6, entonces se debe genera:
1 = 1 = 12
1 + 3 = 4 = 22
1 + 3 + 5 = 9 = 32
1 + 3 + 5 + 7 = 16 = 42
1 + 3 + 5 + 7 + 9 = 25 = 52
1 + 3 + 5 + 7 + 9 + 11 = 36 = 62
Suma =
Σ
X=0
XX
530
531
30. Hacer un algoritmo recursivo para ordenar un arreglo de 25000 elementos usando
el método de ordenamiento rápido (QuitSort).
31. Hacer un algoritmo recursivo para implementar la búsqueda binaria en un arreglo
ordenado de 50000 elementos.
32. Escribir un algoritmo recursivo que ejecute el juego de las torres de Hannoy.
EJERCICIOS
RESUELTOS
01 01
01 01
01
01
Capítulo 1
Ejercicio 5.
Aplicar la operación básica de la resta en los siguientes casos:
Resta base 21
1 5 2 6 4 C A B
- C B 1 0 0 7
1 4 A G 3 C A 4
Resta base 2
1 1 0 1 0 0 1 1
- 1 0 1 0 1 0 0
1 1 1 1 1 1 1
Resta base 18
534
F E A F E A 1 2 535
- 1 2 5 4 8 A C E
1 1 1 1 1 1 1
Resta base 16
4 5 3 0 0 0 3 1
- 1 2 5 1 5 2 0
4 4 0 A E B 1 1
Ejercicio 10.
Convertir a la base correspondiente usando el método de la división los siguientes
números:
12 25
0 0
12
Como el residuo es 12 y el sistema de origen es 25, entonces 12 es equivalente a C.
0.NL002CAB * C = B.B2014O07
0.B2014O07 * C = 5.7O0E9D39
0.7O0E9D39 * C = 3.KD6ME7F8
0.KD6ME7F8 * C = 9.L97KLG8L
0.L97 KLG8L * C = A .6BJ09L62
0.6BJ09L62 * C = 3.2G34I4MO
0.2G34I4MO * C = 1.6ID6I90D
0.6ID6I90D * C = 3. 5M95K866
0. 5M95K866 * C = 2.KIAJINOM
0.KIAJINOM * C = 9.NL4C2CNE
8 2
-8 4 2
0 -2 2 2
0 -2 1 2
0 -0 0
1
Como los residuos, calculados de la última a la primera de las divisiones es 1000, será
el valor equivalente de 8 en base 2, se procede entonces, a hacer las multiplicaciones:
Luego los valores que se toman de los resultados de la lista son: 110, 10, 0, 100 y 0, a los
que se les aplica la conversión al sistema 2:
536
Por tanto, 0.11001000012 es equivalente a 0.620408
537
c. Pasar 0.0774450038 a su equivalente ( )4
Base de origen =8
Base de destino = 4
Se pasa a base 8 el valor 4 de la base destino:
4 8
-0 0
4
Como el residuo es 4, se tiene que es el mismo valor en la base 8 y en la base 4, se pro-
0.400000000 * 4 = 2.000000000
0.000000000 * 4 = 0.000000000
3 2
-2 1 2
1 -0 0
1
Paso 4. Ahora se debe pasar el exponente a base 2. Para ello se debe proceder a tomar
2 n-1
Donde n es la cantidad de bits del exponente, que para el caso es 11. Entonces quedaría:
2 11-1 = 2 10 = 1024
Ahora se toma 1024 y se le suma 2, que es el valor que se calcula en el Paso 3 al escribir
el valor del número dado en binario, pero en notación de mantiza exponente, dando como
resultado 1026, el cual hay que pasar a binario, así:
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
102 6 2
-10 51 3 2
02 -4 2 56 2
-2 11 -2 12 8 2
06 -10 05 -12 64 2
-6 13 -4 08 -6 32 2
0 -12 16 -8 04 -2 16 2
1 -16 0 -4 12 -1 6 8 2
0 0 -1 2 0 -8 4 2
0 0 -4 2 2
0 -2 1 2
0 -0 0
1
Tomando los residuos del último al primero se tiene que 102610 es igual a 100000000102
Paso 5. Armar la respuesta teniendo en cuenta lo siguiente:
• El primer bit del signo, es un cero por ser positivo.
• 11 bits siguientes del exponente, que son: 10000000010 (resultado del paso 4).
• 36 bits de la mantiza, que son: 110010010000111111001111100000001101 (resultado del
paso 3).
Con lo que la respuesta del problema, pasar el número 3.14159 en formato binario de 48
bits de longitud y 11 bit de exponente, queda:
0.100100100110011101011100001010001111x2 12
Paso 4. Ahora se debe pasar el exponente a base 2, para ello se debe proceder a tomar:
2 n-1
Donde n es la cantidad de bits del exponente, que para el caso es 11. Entonces quedaría:
2 11-1 = 2 10 = 1024
Ahora se toma 1024 y se le suma 12, que es el valor que se calcula en el Paso 3 al escribir
el valor del número dado en binario, pero en notación de mantiza exponente, obteniéndose
el valor 1036, el cual hay que pasar a binario:
001101101111000000110000011111110010
Con lo que la respuesta a la conversión del número 14159 en formato binario de 48 bits
de longitud y 11 bit de exponente es:
1 10000001100 001101101111000000110000011111110010
Capítulo 3
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
Ejercicio 5.
Diseñar un algoritmo para convertir la temperatura de grados Celsius a grados
Fahrenheit de acuerdo a la siguiente fórmula:
°F = (9/5)°C+32
Procesos
Diagrama de
caja negra del
problema
Diagrama de Flujo de Datos
· Programa en Lengua C.
#i nc l u d e <stdi o. h >
voi d mai n( ) {
float F, C ;
· Programa en Java.
impo r t j ava . i o.* ;
p u bl i c c lass E j e rc i c i o5 {
pu bli c stati c vo i d m a i n (Str in g[ ] a rgs )t h row s I O E xce p t ion {
Bu ffe re d Read e r le e = new B uf fe re d Rea d e r(n e w I n p ut S t rea m Rea d e r(Sys te m. in));
d o u ble F, C ;
C = Do u ble. parse Do u ble(lee. rea d Line());
F = 9/5* C + 32 ;
Syste m.o u t . pr i ntln( “”+ F ) ;
}
}
· Programa en Python.
C = i npu t( ‘ D i g i te g ra do s ce lc iu s’ )
F = 9/5* C + 32
pr i nt F
· Programa en JavaScript.
<H TML>
<B O DY >
<SC R IPT >
var F, C ;
C = Nu mbe r( pro m p t(“ D ig ite g ra d o celc iu s” ));
F = 9/5* C + 32 ;
d o cu me nt .wr i te (F );
</ SC R IPT >
</ B O DY >
</ H TML>
· Programa en PHP.
<? p h p
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
?>
Ejercicio 15.
Si se conoce la longitud del Radio (R) de la circunferencia, calcular el área de la es-
trella de la figura.
Especificaciones: para solucionar el problema hay que deducir la fórmula para hallar el
área de la estrella a partir del valor del radio, por lo que hay que proceder de acuerdo al
planteamiento gráfico que se muestra a continuación:
W *Y
T2 =
2
Donde:
Por tanto:
W *Y 0.6925735421R*0. 38Rsen(36)
T2 = = 0.0773460576R 2
2 2
La suma de T1 y T2 da como resultado una figura que si se analiza, se repite por 10 veces
para formar la estrella. Por tanto el área de la estrella en función del radio R es:
Diagrama
de caja
negra del
problema
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
End Su b
· Programa en Lengua C.
#i nc lu d e < std i o. h>
vo i d mai n(){
float R , A D E ;
s can f( “%f ”,& R ) ;
A D E = 1.116791978 3 * R ^ 2 ;
pr i n tf( “%10. 2 f ”, A D E ) ;
}
· Programa en Java.
i mpo r t j ava. i o.* ;
pu bli c c lass E j e rc i c i o15 {
pu bli c stati c vo i d m a in(S t rin g[ ] a rgs )t h row s I O E xce p t ion {
Bu ffe re d Read er lee = n e w B uf fe re d Rea d e r( n e w I n p ut S t rea m Rea d-
e r(Syste m. i n ) ) ;
d o u ble R , A D E ; 546
R = Do u ble. pars e D oub le(lee.rea d Lin e()); 547
A D E = 1.1167919783 * R ^ 2;
Syste m.o u t . pr i n tl n(“ ” +A D E );
}
· Programa en Python.
R = i npu t( ‘ D i g i te e l valor d el ra d io’ )
A D E = 9/5* C + 32
pr i nt A D E
· Programa en JavaScript.
<H TML>
<B O DY >
<SC R IPT >
var R , A D E ;
C = Nu mbe r( p rom p t(“ D ig ite el valor d el ra d io” ));
A D E = 1.116791 9783 * R ^ 2 ;
d o cu me nt .w rite (AD E );
</ SC R IPT >
</ B O DY >
</ H TML>
· Programa en PHP.
<? p h p
$ stdi n = fo pe n( ‘ p h p: //s td in’, ‘ r ’ );
fscanf( $ stdi n ,”%f ”, $R);
$A D E = 1.116791978 3 * R ^ 2 ;
e c ho $A D E ;
?>
Ejercicio 25.
Leer 3 números e imprimir los tres solo si por los menos dos son positivos.
Especificaciones del problema.
X: de tipo real
Entradas Y: de tipo real
Z: de tipo real
Salidas XyYoXyZoYyZ
Diagrama de
caja negra del
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
problema
End Su b
· Programa en Lenguaje C.
#include <stdio.h>
void main(){
float X, Y, Z;
scanf(“%f ”,&X);
scanf(“%f ”,&Y);
scanf(“%f ”,&Z);
if(X > 0 && Y > 0) pr i n tf(“ %1 0.2f %1 0.2f ”,X, Y );
if(X > 0 && Z > 0) pr i n tf(“ %1 0.2f %1 0.2f ”,X, Z );
if(Y > 0 && Z > 0) pr i n tf(“ %1 0.2f %1 0.2f ”,Y, Z );
}
· Programa en Java.
import java.io.*;
public class Ejercicio25 {
public static void m a i n (Str ing[ ] a rgs)thro w s I O E xce p tio n {
BufferedReader lee = ne w Bu ffe re d Rea d e r( ne w I np u tStrea m Rea d e r(Sys te m .i n )) ;
double X, Y, Z;
X = Double.parse D o u b le(lee.rea d Line());
Y = Double.parse D o u b le(lee.rea d Line());
Z = Double.parse D o u b le(lee.rea d Line());
?>
Ejercicio 35.
Se tiene la fecha de nacimiento de una persona. Calcule exactamente el número de
días vividos por la persona hasta la fecha. Los datos de entrada son el día, mes y año de
nacimiento y la fecha de hoy. Tenga en cuenta los años bisiestos.
DV = DH + 30 – DN MV = MH + 12 – MN
MH = MH - 1 AH = AH – 1
Procesos DV = DH – DN MV = MH – MN
AV = AH- AN
TDV = DV + MV*30 + AV*365 + Trunc(AV/2)
Diagrama de
caja negra del
problema
Diagrama de Flujo de Datos
550
551
· Programa en Visual Basic.
Pr i vate Su b Co m m a nd 1 _Clic ()
Dim D H A s In ti ge r, M H A s I n t ige r, AH A s I n t ige r
Dim D N As In ti ge r, M N A s I n t i ge r, AN A s I n t ige r
Dim DV A s In ti ge r, M V A s I n t ige r, AV A s I n t ige r, T DV A s I n te ge r
If D H < D N T h en
DV = D H + 3 0 – D N
MH = MH – 1
El s e
DV = D H – D N
En d If
If D H < D N T h en
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
MV = MH + 12 – M N
AH = AH – 1
El s e
MV = MH – MN
En d i f
AV = A H – A N
T DV = DV + MV * 3 0 + AV * 3 65 + I n t(AV/4 )
Pr i n tf T DV
End Su b
· Programa en Lenguaje C.
#i nc lu d e < std i o. h>
vo i d mai n() {
i n t D H , MH , A H , D N , M N , A N , T DV;
s can f( “%d”,& D H );
s can f( “%d”,& MH );
s can f( “%d”,& A H );
s can f( “%d”,& D N );
s can f( “%d”,& MN );
s can f( “%d”,& A N );
i f( D H < D N) {
DV = D H +3 0 – D N;
MH = MH - 1;
}
el s e {
DV = D H – D N;
}
i f( MH < MN) {
MV = MH +3 0 – MN;
A H = A H - 1;
}
el s e{
MV = MH – MN;
}
AV = A h – A N;
T DV = DV + MV * 3 0 + AV * 3 65 + AV/4 ;
pr i n tf( “%10d”,TDV );
}
• Programa en Java.
i mpo r t j ava. i o.* ;
pu bl i c c lass E j e rc i c i o3 5 {
pu bl i c stati c vo i d m a in(S t rin g[ ] a rgs )t h row s I O E xce p t ion {
Bu ffe re d Read e r lee = n e w B uf fe re d Rea d e r(n e w I n p ut S t rea m Rea d e r(Sys te m. i n));
i nt D H , MH , A H , D N , M N , AN , T DV;
D H = Inte ge r. pa rs e I n t(lee.rea d L in e());
MH = Inte ge r. pa rs e I n t(lee.rea d Lin e());
A H = Inte ge r. pa rs e I n t(lee.rea d L in e());
D N = Inte ge r. pa rs e I n t(lee.rea d L in e());
MN = Inte ge r. pa rs e I n t(lee.rea d L in e());
A N = Inte ge r. pa rs e I n t(lee.rea d Lin e());
i f( D H < D N) {
DV = D H + 3 0 – D N;
MH = MH -1;
}
e l se { DV = D H – D N; }
i f( MH < MN) {
MV = MH + 12 – MN;
A H = A H -1;
}
e l se { MV = MH – MN; } 552
AV = A H – A N; 553
T DV = DV + MV * 3 0 + AV *3 65 + AV/4 ;
Syste m.o u t . pr i ntln( “”+TDV );
}
}
• Programa en Python.
D H = i npu t( ‘ D i g i te e l día d e hoy)
MH = i npu t( ‘ D i g i te e l m es d e hoy)
A H = i npu t( ‘ D i g i te e l año d e hoy)
D N = i npu t( ‘ D i g i te e l día d e na c im iento)
MN = i npu t( ‘ D i g i te e l m es d e na c im iento)
A N = i npu t( ‘ D i g i te e l año d e na c im iento)
i f D H < D N:
DV = D H +3 0 – D N
MH = MH – 1
e lse :
DV = D H – D N
i f MH < MN:
MV = MH +12 – MN
AH = AH – 1
e lse :
MV = MH – MN
AV = A H – A N
T DV = DV + MV * 3 0 + AV *3 65 + I n t(AV/4 )
pr i nt T DV
• Programa en JavaScript.
<H TML>
<B O DY >
<SC R I PT >
va r D H , M H , A H , D N , M N , AN , T DV;
D H = N um b e r( p rom p t(“ D ig ite el día d e hoy” ));
M H = N um b e r( p rom p t(“ D ig ite el m es d e hoy” ));
A H = N um b e r( p rom p t(“ D ig ite el año d e hoy” ));
D N = N um b e r( p rom p t(“ D ig ite el día d e na c im iento” ));
M N = N um b e r( p rom p t(“ D ig ite el m es d e na c im iento” ));
A N = N um b e r( p rom p t(“ D ig ite el año d e na c im iento” ));
If(D H < D N ){
DV = D H + 3 0 – D N ;
MH = MH - 1 ;
}
e lse { DV = D H – D N ; }
If(M H < M N ){
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
MV = MH + 1 2 – M N ;
AH = AH - 1;
}
e lse { MV = MH – M N ; }
AV = A H – A N;
T DV = DV + MV*3 0 + AV *4 65 +AV/4 ;
d o cu me nt .write ( T DV );
</ SC RI PT >
</ B O DY >
</ H TML>
• Programa en PHP.
<? p h p
$ stdi n = fop e n(‘ php: //s td in’, ‘ r ’ );
fscanf( $ std in,” % f ”, $D H );
fscanf( $ std in,” % f ”, $M H );
fscanf( $ std in,” % f ”, $A H );
fscanf( $ std in,” % f ”, $D N );
fscanf( $ std in,” % f ”, $M N );
fscanf( $ std in,” % f ”, $A N );
i f( $ D H < $D N ){
$ DV = $ D H +3 0 - $D N ;
$MH = $MH – 1 ;
}
e l se
$ DV = $ D H - $D N ;
i f( $MH < $M N ){
$MV = $MH +1 2 - $M N ;
$A H = $A H – 1 ;
}
e l se
$MV = $MH - $M N ;
$AV = $A H - $AN ;
$T DV = $ DV + $M V * 3 0 + $AV * 3 65 + (int )($AV/4 );
e c ho $TDV;
?>
Ejercicio 45.
Leer una terna de parejas ordenadas de números ([X1, Y1], [X2, Y2], [X3, Y3]). Dichas pare-
jas representan las ordenadas y abscisas de 3 puntos sobre el plano cartesiano. Investi-
gue si los tres puntos pertenecen a una misma línea recta. Si es así, imprimir la longitud
de la recta; de lo contrario, averiguar el perímetro del triángulo que se forma.
Especificaciones del problema.
d = ((X3 – X1) ^ 2 + (Y3 – Y1) ^ 2) ^ 0.5, d = ((X2 – X1) ^ 2 + (Y2 – Y1) ^ 2) ^ 0.5
d = ((X3 – X2) ^ 2 + (Y3 – Y2) ^ 2) ^ 0.5, d = ((X1 – X2) ^ 2 + (Y1 – Y2) ^ 2) ^ 0.5
d = ((X2 – X3) ^ 2 + (Y2 – Y3) ^ 2) ^ 0.5, d = ((X1 – X3) ^ 2 + (Y1 – Y3) ^ 2) ^ 0.5
Diagrama
de caja
negra del
problema
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
X3 =In putBox( “D i g i te X 3 ” )
Y3=In putBox( “D i g i te Y3 ” )
m1 = ( Y2 – Y1) / ( X2 – X1 )
m 2 = ( Y3 – Y2 ) / ( X3 – X 2 )
If m1 = m 2 T h en
d10 = ( X1^2 + Y1 ^ 2 ) ^ 0 . 5
d2 0 = ( X2 ^2 + Y2 ^ 2 ) ^ 0 . 5
d3 0 = ( X3 ^2 + Y3 ^ 2 ) ^ 0 . 5
If d10 < d2 0 A n d d 1 0 < d 3 0 Th e n 556
If d2 0 < d3 0 Th e n 557
d = ( ( X3 – X1 ) ^ 2 + (Y3 – Y1 ) ^ 2 ) ^ 0 . 5
El s e
d = ( ( X2 – X1 ) ^ 2 + (Y2 – Y1 ) ^ 2 ) ^ 0 . 5
En d i f
El s e
If d2 0 < d1 0 A n d d 2 0 < d 3 0 Th e n
If d10 < d 3 0 Th e n
d = ((X 3 – X 2 ) ^ 2 + (Y3 – Y2 ) ^ 2 ) ^ 0 . 5
El s e
d = ((X1 – X 2 ) ^ 2 + (Y1 – Y2 ) ^ 2 ) ^ 0 . 5
En d If
El s e
If d10 < d 2 0 Th e n
d = ((X 2 – X 3 ) ^ 2 + (Y2 – Y3 ) ^ 2 ) ^ 0 . 5
El s e
d = ((X1 – X 3 ) ^ 2 + (Y1 – Y3 ) ^ 2 ) ^ 0 . 5
En d If
En d If
En d If
Pr i n tf “La di sta n c ia d e la rec ta es”, d
El s e
d12 = ( ( X2 – X1 ) ^ 2 + (Y2 – Y1 ) ^ 2 ) ^ 0 . 5
d23 = ( ( X3 – X2 ) ^ 2 + (Y3 – Y2 ) ^ 2 ) ^ 0 . 5
d31 = ( ( X1 – X3 ) ^ 2 + (Y1 – Y3 ) ^ 2 ) ^ 0 . 5
P = ( d12 + d23 + d 31 )/2
A = ( P * ( P – d 1 2 ) * (P – d 23 ) * (P – d 31 )) ^ 0 . 5
Pe r í m e tro = 2 * P
Pr i n t “El á rea d e t r iá ngu lo es”, A
Pr i n t “El p e r í met ro d el t r iá ngu lo es”, Pr im ero
En d If
End Su b
• Programa en Lenguaje C.
#i nc l u d e <stdi o. h >
vo i d mai n( ) {
float X1, X2 , X 3 ;
float Y1, Y2 , Y3 ;
float m1, m 2 , P;
float d12 , d23 , d 31 ;
float d10 , d2 0 , d 3 0 ;
float Pe r i m e tor, A , d ;
m1 = ( Y2 – Y1) /(X 2 – X1 );
m 2 = ( Y3 – Y2 )/(X 3 – X 2 );
If ( m1 = = m 2 ) {
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
el s e {
if (d10 < d20) {
d = p ow( p ow(X 2 – X 3 , 2 ) + p ow(Y2 – Y3 , 2 ),0 . 5 );
}
El s e {
d = p ow( p ow(X1 – X 3 , 2 ) + p ow(Y1 – Y3 , 2 ),0 . 5 );
}
}
}
pr i n tf( “La long it u d d e la rec ta es %1 0 f ”,d );
}
e l se {
d12 = po w( p ow(X 2 – X1 , 2 ) + p ow(Y2 – Y1 , 2 ),0 . 5 );
d23 = po w(p ow(X 3 – X 2 , 2 ) + p ow(Y3 – Y2 , 2 ),0 . 5 );
d31 = po w(p ow(X1 – X 3 , 2 ) + p ow(Y1 – Y3 , 2 ),0 . 5 );
P = ( d12 + d 23 + d 31 )/2
A = po w( ( P * (P – d 1 2 ) * (P – d 23 ) * (P – d 31 )), 0 . 5 );
Pe r í m e tro = 2 * P;
pr i n tf( “El á rea d e t r iá ngu lo es %1 0 f ”, A );
pr i n tf( “El per ím et ro d el t r iá ngu lo es %1 0 f ”, Per im et ro);
}
}
• Programa en Java.
impo r t j ava. i o.* ;
p u bli c c lass Ej e rc i c i o 45 {
pu bl i c stati c vo i d mai n(Str i n g [ ] a rgs ) t h row s I O E xce p t ion {
Bu ffe re d Read e r le e = ne w B uf fe re d Rea d e r( n e w I n p ut S t rea m Rea d e r( Sys te m . in ) ) ;
d o uble X1, X2 , X3 ;
d o uble Y1, Y2 , Y3 ;
d o uble m1, m 2 , P;
d o uble d12 , d23 , d31;
d o uble d10, d2 0 , d3 0;
d o uble Pe r i m e to r, A , d;
m1 = ( Y2 – Y1) / ( X2 – X1) ;
m 2 = ( Y3 – Y2 ) / ( X3 – X2 ) ;
If ( m1 = = m 2 ) {
d10 = M ath . po w( M ath . p ow(X1 , 2 ) + M a t h . p ow(Y1 , 2 ), 0 . 5 );
d2 0 = M ath . po w(M ath . p ow(X 2 , 2 ) + M a t h . p ow (Y2 , 2 ), 0 . 5 );
d3 0 = M ath . po w( M ath . p ow(X 3 , 2 ) + M a t h . p ow(Y3 , 2 ), 0 . 5 ); 558
i f ( d10 < d2 0 & & d10 < d 3 0 ) {
i f ( d2 0 < d3 0 ) { 559
d = M ath . po w(Ma t h . p ow(X 3 –X1 , 2 ) + M a t h . p ow(Y3 – Y1 , 2 ),0 . 5 );
}
el s e {
d = M ath . po w(Ma t h . p ow(X 2 –X1 , 2 ) + M a t h . p ow(Y2 – Y1 , 2 ),0 . 5 );
}
}
el s e {
i f ( d2 0 < d10 A n d d 2 0 < d 3 0 ) {
i f ( d10 < d3 0 ) {
d = M ath . po w( M a t h . p ow(X 3 –X 2 , 2 )+M a t h . p ow(Y3 –Y2 , 2 ),0 . 5 );
}
el s e {
d = M ath . po w(M a t h . p ow(X1 –X 2 , 2 )+ M a t h . p ow(Y1 –Y2 , 2 ),0 . 5 );
}
el s e {
i f ( d10 < d2 0) {
d = M ath . po w( M a t h . p ow(X 2 –X 3 , 2 )+ M a t h . p ow(Y2 –Y3 , 2 ),0 . 5 );
}
el s e {
d = M ath . po w(M a t h . p ow(X1 –X 3 , 2 )+ M a t h . p ow(Y1 –Y3 , 2 ),0 . 5 );
}
}
}
Syste m.o u t . pr i ntln (“ La long it u d d e la rec ta es “ + d );
}
e l se {
d12 = M ath . po w( M ath . p ow(X 2 – X1 , 2 ) + M a t h . p ow(Y2 – Y1 , 2 ),0 . 5 );
d23 = M ath . po w( M ath . p ow(X 3 – X 2 , 2 ) + M a t h . p ow(Y3 – Y2 , 2 ),0 . 5 );
d31 = M ath . po w( M ath . p ow(X1 – X 3 , 2 ) + M a t h . p ow(Y1 – Y3 , 2 ),0 . 5 );
P = ( d12 + d23 + d31) /2
A = M ath . po w( ( P * ( P – d 1 2 ) * (P – d 23 ) * (P – d 31 )), 0 . 5 );
Pe r í m e tro = 2 * P;
Syste m.o u t . pr i ntln ( “El á rea d e t r iá ngu lo es” + A );
Syste m.o u t . pr i ntln ( “El per ím et ro d el t r iá ngu lo es” + Per ím et ro);
}
}
}
• Programa en Python.
X1 = i npu t( ‘ D i g i te X1 )
Y1 = i npu t( ‘ D i g ite Y1 )
X2 = i npu t( ‘ D i g i te X2)
Y2 = i npu t( ‘ D i g i te Y2 )
X3 = i npu t( ‘ D i g ite X3)
Y3 = i npu t( ‘ D i g i te Y3 )
m1 = ( Y2 – Y1) / (X 2 – X1 )
m 2 = ( Y3 – Y2 ) /(X 3 – X 2 )
i f m1 = = m 2 :
d10 = ( X1* * 2 + Y1 * *2 ) * * 0 . 5
d2 0 = ( X2 * * 2 + Y2 * *2 ) * * 0 . 5
d3 0 = ( X3 * * 2 + Y3 **2 ) * * 0 . 5
d = ((X 3 – X1 ) * * 2 + (Y3 – Y1 ) ** 2 ) * * 0 . 5
e l se :
d = ((X 2 – X1 ) ** 2 + (Y2 – Y1 ) ** 2 ) * * 0 . 5
el s e:
i f d2 0 < d 1 0 a n d d 2 0 < d 3 0 :
if d10 < d30:
d = ((X 3 – X 2 ) ** 2 + (Y3 – Y2 ) ** 2 ) * * 0.5
el se:
d = ((X1 – X 2 ) * * 2 + (Y1 – Y2 ) ** 2 ) * * 0.5
e l se :
if d10 < d20:
d = ((X 2 – X 3 ) ** 2 + (Y2 – Y3 ) ** 2 ) * * 0.5
el se:
d = ((X1 – X 3 ) ** 2 + (Y1 – Y3 ) ** 2 ) * * 0.5
m1 = ( Y2 – Y1) / ( X2 – X1) ;
m 2 = ( Y3 – Y2 ) / ( X3 – X2 ) ;
If ( m1 = = m 2 ) {
d10 = M ath . po w(M ath . p ow(X1 , 2 ) + M a t h . p ow(Y1 , 2 ), 0 . 5 );
d2 0 = M ath . po w( M ath . p ow(X 2 , 2 ) + M a t h . p ow(Y2 , 2 ), 0 . 5 );
d3 0 = M ath . po w( M ath . p ow(X 3 , 2 ) + M a t h . p ow(Y3 , 2 ), 0 . 5 );
i f ( d10 < d2 0 & & d10 < d 3 0 ) {
i f ( d2 0 < d3 0 ) { 560
d = M ath . po w( Ma t h . p ow(X 3 – X1 , 2 ) + M a t h . p ow(Y3 – Y1 , 2 ),0 . 5 );
}
561
el s e {
d = M ath . po w( Ma t h . p ow(X 2 – X1 , 2 ) + M a t h . p ow(Y2 – Y1 , 2 ),0 . 5 );
}
}
el s e {
i f ( d2 0 < d10 An d d20 < d 3 0 ) {
i f ( d10 < d3 0 ) {
d = M ath . po w( M a t h . p ow(X 3 – X 2 , 2 )+M a t h . p ow(Y3 –Y2 , 2 ),0 . 5 );
}
el s e {
d = M ath . po w( M a t h . p ow(X1 – X 2 , 2 )+M a t h . p ow(Y1 –Y2 , 2 ),0 . 5 );
}
el s e {
i f ( d10 < d2 0) {
d = M ath . po w( M a t h . p ow(X 2 –X 3 , 2 ) + M a t h . p ow(Y2 –Y3 , 2 ),0 . 5 );
}
el s e {
d = M ath . po w( M a t h . p ow(X1 –X 3 , 2 ) + M a t h . p ow(Y1 –Y3 , 2 ),0 . 5 );
}
}
}
d o cu me nt .wr i te ( “La lo n g it u d d e la rec ta es “,d ) ;
}
e l se {
d12 = M ath . po w( M ath . p ow(X 2 – X1 , 2 ) + M a t h . p ow(Y2 – Y1 , 2 ),0 . 5 );
d23 = M ath . po w(M ath . p ow(X 3 – X 2 , 2 ) + M a t h . p ow(Y3 – Y2 , 2 ),0 . 5 );
d31 = M ath . po w( M ath . p ow(X1 – X 3 , 2 ) + M a t h . p ow(Y1 – Y3 , 2 ),0 . 5 );
P = ( d12 + d23 + d31) /2
A = M ath . po w( ( P * ( P – d 1 2 ) * (P – d 23 ) * (P – d 31 )), 0 . 5 );
Pe r í m e tro = 2 * P;
d o cu me nt .wr i te ( “El á rea d e t r iá ngu lo es”, A );
d o cu me nt .wr i te ( “El p e r ím et ro d el t r iá ngu lo es”, Per ím et ro);
}
</ SC R IPT >
< / B O DY >
< /HTM L>
• Programa en PHP.
<? p h p
$ stdi n = fo pe n( ‘ php: //s td in’, ‘ r ’ );
i f ( $ m1 = = $ m 2 ) {
$ d10 = ( $X1**2 + $Y1 **2 ) * * 0 . 5 ;
$ d2 0 = ( $X2 * * 2 + $Y2 **2 ) * * 0 . 5 ;
$ d3 0 = ( $X3 **2 + $Y3 **2 ) * * 0 . 5 ;
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
Entradas No hay
Diagrama 562
de caja 563
negra del
problema
Diagrama de Flujo de Datos
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
C = 1000: SP = 0
SI = 0: SM3 = 0 : SM5 = 0
Do
If C Mo d 2 = 0 T h e n
SP = SP + C
El se
SI = SI + C
End IF
If C Mo d 3 = 0 T h e n SM 3 = SM 3 + C
If C Mo d 5 = 0 T h e n SM 5 = SM 5 + C
C = C + 1
Lo o p U nti l C E = 3 5
Pr i nt SP/5 00, SI/499, SM 3/3 3 3 , SM 5/2 0 0
End Su b
• Programa en lenguaje C.
#i nc l u d e <stdi o. h >
#i nc l u d e <co n i o. h >
vo i d mai n( ) {
i nt C , SP, SI, SM3 , SM 5 ;
C = 10 00; SP = 0;
SI = 0 ; SM3 = 0 ; SM 5 = 0 ;
d o{
If( C % 2 = = 0 ) S P + = C ;
e lse SI + = C ;
If( C % 3 = = 0) SM 3 + = C ;
If( C % 5 = = 0) SM 5 + = C ;
} whi le ( C E > 1) ;
pr i ntf( “%10 . 2 f %10 . 2 f %1 0 . 2 f %1 0 . 2 f ”, S P/5 0 0 , S I /499, SM 3/3 3 3 , SM 5/2 0 0 );
}
• Programa en Java.
i mpo r t j ava . i o.* ;
pu bl i c c lass E j e rc i c i o5 {
pu bli c stati c vo i d m a in( S t rin g[ ] a rgs )t h row s I O E xce p t ion {
i nt C , SP, SI, SM 3 , SM 5 ;
564
565
C = 1000; SP = 0 ;
SI = 0; SM3 = 0 ; SM 5 = 0 ;
d o{
i f( C % 2 = = 0 ) S P + = C ;
e lse SI + = C ;
i f( C % 3 = = 0 ) SM 3 + = C ;
i f( C % 5 = = 0 ) SM 5 + = C ;
C = C + 1;
}whi le ( C > 1) ;
Syste m.o u t . pr in tl n(“ ” +S P/5 0 0 + ”, ” +S I /499+ ”, “ +SM 3/3 3 3 + ”, ” +SM 5/2 0 0 );
}
• Programa en Python.
C E = 10 00; SP = 0
SI = 0 ; SM3 = 0 ; SM5 = 0
whi le C E > 1:
i f C % 2 = = 0:
SP = SP + C
e l se :
SI = SI + C
If C % 3 = = 0 :
SP = SP + C
If C % 3 = = 0 :
SP = SP + C
C = C + 1
• Programa en PHP.
<? p h p
$ stdi n = fo pe n( ‘ p h p : //std in’,’ r ’ );
se ttype ( $ C ,’ i n t’ ) ; se ttype( $S P,’ int’ ); s e t ty pe($S I ,’ int’ );
se ttype ( $SM3 ,’ i n t’ ) ; se ttyp e($SM 5 ,’ f loa t’ );
$ C = 0 ; $SP = 0 ; $SI = 0 ;
$SM3 = 0; SM5 = 0 ;
do {
i f ( $ C % 2 = = 0 ) $SP = $S P + $C ;
e l se $SI = $SI + $ C ;
i f ( $ C % 3 = = 0) $SM 3 = $SM 3 + $C ;
i f ( $ C % 5 = = 0) $SM 5 = $SM 5 + $C ;
$ C = $ C + 1;
} whi le ( $ C > 1) ;
e c ho $SP/5 00,’, ‘, $SI/49 9 , ‘, ‘, $SM 3/3 3 3 , ‘, ‘, $SM 5/2 0 0 , P H P_EO L;
?>
Ejercicio 15.
Considerar la siguiente propiedad descubierta por Nicómaco de Gerasa: sumando el
primer impar, se obtiene el primer cubo, sumando los dos siguientes se obtiene el segundo
cubo, sumando los tres siguientes, se obtiene el tercer cubo y así sucesivamente, es decir:
13 = 1 = 1
23 = 3 + 5 = 8
3 3
= 7 + 9 + 11 = 27
43 = 13 + 15 + 17 + 19 = 64
53 = 21 + 23 + 25 + 27 + 29 = 125
6 3
= 31 + 33 + 35 + 37 + 39 + 41 = 343
73 = 43 + 45 + 47 + 49 + 51 + 53 + 55 = 512
Dado un número N entero positivo menor a 100, visualizar los N primeros cubos utili-
zando esta propiedad de la forma como se muestra arriba.
Especificaciones del problema.
k = i * (i - 1) + 1
c=c+k
Procesos k = k +2
j=j+1
i=i+1
I, “^3 = ”
Salidas k, “ + ”
k, “ = ”, c + k
Diagrama de
caja negra del
problema
566
567
Diagrama de Flujo de Datos.
• Programa en Visual Basic.
Pr i vate Su b Com m a nd 1 _Clic k ()
Dim c A s I n te ge r, i A s I n te ge r
Dim j As I n te ge r, k A s I n te ge r
Dim n A s I n te ge r
• Programa en lenguaje C.
#i nc lu d e <s td io. h>
#i nc l u d e <conio. h>
vo i d mai n( ){
i nt c , I, j, k , n;
• Programa en Python.
N = i npu t( ‘ D i g i te e l valo r de N ’ )
i f N>0 and N<100:
i =1
whi le i <= N:
pr i nt i ,”^3 = “,
k = i * ( i -1) +1
c = 0
j = 0
whi le j <= i -2 :
i f i ! =1:
pr i nt k,” + “,
c = c+ k
k = k+2
j = j +1
pr i nt k,” = “,c+ k
e l se :
if (i! =1 ) {
d ocum e n t .w rite (k ,” + “ );
c = c+ k ;
k = k+2 ;
j = j+1 ;
}
} w h ile (j< = i-2 );
d ocum e n t .w rite (k ,” = “, c + k ,’ < BR/> ’ );
i = i+1 ;
} w h ile (i< = n);
}
e lse
docum e n t .w rite (“ Da to no válid o”,’ < BR/> ’ );
</ SC R IPT>
</ B O DY >
</ H TML>
• Programa en PHP.
<?p h p
$ stdi n = fo pe n ( ‘ p h p : //stdi n’,’ r ’ );
se ttype ( $ n ,’ i n te ge r ’ ) ; se ttyp e ($i,’ integer ’ ); s e t ty p e ($j,’ integer ’ ); s e t ty p e ($k ,’ inte-
ge r ’ ) ; se ttype ( $ c ,’ i n te ge r ’ ) ;
?>
Ejercicio 25.
Diagramar un algoritmo para calcular el valor de (3,14159265358) usando la si-
guiente serie:
∞
π = 4 Σ (-1) İ
2i + 1
= 4 ( 1 -
1
+
3 5
1
-
1 + •••)
7
i=0
i=i+1
Procesos s = s + (-1)^i/(2*i + 1)
s=4*s
Diagrama
de caja
negra del
problema
Diagrama de Flujo de Datos.
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
End Su b
• Programa en Lenguaje C.
#i nc lu d e <stdi o. h >
#i nc lu d e <co n i o. h >
vo i d mai n( ) {
i nt i , n ; d o u ble s;
pr i ntf( “D i g i te e l valo r de N “ ); s ca n f (“ % i”,&n);
i = 0; s = 0;
do {
s = s + p o w ( -1, i ) / (2 * I + 1 );
i++;
} whi le ( i <= n ) ;
pr i ntf ( “El valo r de P I e s % f\n”,4*s );
}
• Programa en Java.
i mpo r t j ava . i o.* ;
pu bli c c lass E j e rc i c i o2 5 {
pu bl i c stati c vo i d mai n(St rin g[ ] a rgs )t h row s I O E xce p t ion {
Bu ffe re d Read e r le e = n e w B uf fe re d Rea d e r (n e w I n p ut S t rea m Rea d e r ( Sys te m.
in));
i nt i , n ;
d o u ble s;
Syste m.o u t . pr i nt ( “D i g ite el valor d e N “ );
n = Inte ge r. parse Int ( lee.rea d L in e ());
i = 0 ; s = 0;
do {
s = s + Ma th . p o w ( -1 , i) / (2 * i + 1 );
i++;
} w h i le ( I <= n ) ;
Syste m.o u t . pr i ntln ( “El valor d e P I es “ +4* s );
}
• Programa en Python.
n = i npu t ( “D i g i te e l valo r de N “ )
i = 0; s = 0
whi le i <= n : 572
s = s + ( -1) * * i / ( 2 * i + 1 ) 573
i = i +1
pr i nt “El valo r de P I e s “, 4* s
• Programa en JavaScript
<H TML>
<B O DY >
<SC R IPT >
var n = ne w Nu mb e r(); va r i = n e w N um b e r(); va r s = n e w N um b e r();
n = Nu mbe r ( pro m p t (“ D ig ite el valor d e N “ ));
i = 0 ; s = 0;
do {
s = s + M ath. p ow (-1 , i) / (2 * i + 1 );
i = i +1;
} whi le ( i <= n ) ;
d o cu me nt .wr i te ( “ El valor d e P I es “,4*s ,’ < BR/> ’ );
</ SC R IPT >
</ B O DY >
</ H TML>
• Programa en PHP.
<? p h p
$ stdi n = fo pe n ( ‘ p h p : //std in’,’ r ’ );
se ttype ( $ n ,’ i n te ge r ’ ) ; se t ty p e ($i,’ integer ’ ); s e t ty p e ($s ,’ f loa t’ );
e c ho ‘ D i g i te e l valo r de N ‘ ;
fscanf ( $ stdi n ,”%d”, $ n ) ;
$i = 0; $s = 0;
do {
$ s = $ s + po w ( -1, $ i ) / (2 * $i + 1 );
$ i = $ i +1;
} whi le ( $ i <= $ n ) ;
e c ho ‘ El valo r de P I e s ‘,4* $s , P H P_EO L;
?>
Ejercicio 35.
Se planea hacer una inversión de $ 10.000.000 con una tasa de interés del 2%. Cuántos
años se requieren para que la inversión sobrepase $ 2.410.500.000. El cálculo para deter-
minar la inversión es como sigue:
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
Diseñar un algoritmo que tome un capital de inversión inicial K a una tasa de interés
del i% y calcule cuántos años se requieren para alcanzar una inversión de un valor dado
usando el cálculo antes descrito.
Especificaciones del problema.
k: de tipo real
i: de tipo real
Entradas
mi: de tipo real
mf: de tipo real
Inv =0
Procesos Inv = (Inv + mi) * (1+ i)
N_Años = N_Años + 1
Salidas N_Años: de tipo entero
Diagrama
de caja
negra del
problema
Diagrama de Flujo de Datos.
574
575
• Programa en visual Basic.
Pr i vate Su b Co m m a n d1_Cl i c k ( )
Di m i As Do u ble, i nv As Do ub le, k A s D oub le
Di m m i As Do u ble, N_ A ñ o s A s I n te n ge r
k = i ntpu t ( “D i g i te e l ca p i tal K “ )
i = i ntpu t ( “D i g i te la tasa de interés i “ )
m i = i ntpu t ( “D i g i te e l m o n to d e invers ión a alca nza r “ )
i nv = 0
Do
i nv = ( i nv + k) * (1 + i )
N_ Año s = N_ Año s + 1
Lo o p U nti l i nv > m i
pr i nt “El núm e ro de año s e s “, N _Años )
End Su b
• Programa en lenguaje C.
#i nc lu d e <stdi o. h >
#i nc lu d e <co n i o. h >
vo i d mai n( ) {
d o u ble i , i nv ; , k, m i ;
i nt N_ Año s;
pr i ntf ( “D i g i te e l ca pital K “ ); s ca n f (“ % f ”,&k );
pr i ntf ( “D i g i te la tasa d e interés i” ); s ca n f (“ % f ”,&i);
pr i ntf ( “D i g i te e l m o nto d e invers ión a alca nza r “ ); s ca n f (“ % f ”,&m i);
i nv = 0;
do {
i nv = ( i nv + k) * (1 + i);
N_ Año s = A _ Añ o s + 1 ;
} w h i le ( i nv <= m i ) ;
pr i ntf ( “El núm e ro de años es % f\n”, N _Años );
}
• Programa en Java.
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
i nv = 0 ;
do {
i nv = ( i nv + k ) * (1 + i);
N_ Año s = N_ Años + 1 ;
} whi le ( i nv <= m i ) ;
Syste m.o u t . pr i ntl n (“ El núm ero d e años es “ + N _Años );
}
• Programa en Python.
k = i npu t( “D i g i te e l ca p i tal K “ )
i = i npu t( “D i g i te la tasa d e interés i” )
m i = i npu t( “D i g i te e l m o nto d e invers ión a alca nza r “ )
i nv = 0
whi le i nv <= m i :
i nv = ( i nv + k) * (1 + i)
N_ Añ o s = N_ Año s + 1
</ H TML>
• Programa en PHP.
<? p h p
$ stdi n = fo pe n ( ‘ p h p : //std in’,’ r ’ );
se ttype ( $ k,’ f loa t’ ) ; se ttyp e($i,’ f loa t’ ); s e t ty p e ($m i,’ f loa t’ ); 576
e c ho ‘ D i g i te e l ca p i tal K ‘ ; fs ca n f($s td in,” % f ”, $k ); 577
e c ho ‘ D i g i te la tasa de i nterés i’ ; fs ca n f ($s td in,” % f ”, $i);
e c ho ‘ D i g i te e l m o n to de invers ió n a alca nza r ‘ ; fs ca n f ($s td in,” % f ”, $m i);
$ i nv = 0;
do {
$ i nv = ( $ i nv + $ k) * (1 + $i);
$ n _a n o s = $ n _a n o s + 1 ;
} whi le ( $ i nv <= $ m i ) ;
e c ho ‘ El núm e ro de año s es ‘, $n_a nos , P H P_EO L;
?>
Ejercicio 45.
Escribir un algoritmo que lea un número entero positivo y calcule la suma de sus dí-
gitos. Ejemplo: si se suministra el número 3424056 el algoritmo debe dar como resultado
24 que se obtiene de sumar 3+4+2+4+0+5+6.
Especificaciones del problema.
s=0
Procesos s = s + n Mod 10
n = Trunc(n/10)
Diagrama
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
de caja
negra del
problema
End Su b
• Programa en Lenguaje C.
#i nc l u d e<stdi o. h >
#i nc l u d e<m a th . h >
vo i d mai n( ) {
i nt n , s;
pr i ntf( “D i g i te e l n úm e ro “ ); s ca n f(“ % d ”,&n);
s = 0;
do {
s = s + n % 10 ;
n = i n t( n /10 ) ;
578
} whi le ( n ! = 0) ;
pr i ntf( “La sum a de lo s dí g itos es % i\n”, s ); 579
}
• Programa en Java.
i mpo r t j ava . i o.* ;
pu bl i c c lass E j e rc i c i o3 5 {
pu bli c stati c vo i d mai n(S t rin g[ ] a rgs )t h row s I O E xce p t ion {
Bu ffe re d Read e r le e = n e w B uf fe re d Rea d e r ( n e w I n p ut S t rea m Rea d e r ( Sys te m .
in));
i nt n , s;
Syste m.o u t . pr i nt ( “ D ig ite el nú m ero “ );
n = Inte ge r. parse In t (lee.rea d L in e ());
s = 0;
do {
s = s+ n %10 ;
n = (i nt) ( n /10 );
} whi le ( n ! = 0) ;
Syste m.o u t . pr i ntln (“ La s u m a d e los d ig itos es “ + s );
}
}
• Programa en Python.
n = i npu t( “D i g i te e l n úm e ro “ )
s = 0
whi le n ! = 0
s = s+ n %10
n = i n t( n /10 )
</ H TML>
• Programa en PHP.
<? p h p
$ stdi n = fo pe n ( ‘ p h p : //std in’,’ r ’ );
se ttype ( $ s,’ i n te ge r ’ ) ; se t ty p e ($n,’ integer ’ );
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
?>
Capítulo 5
Ejercicio 5.
Calcular la suma de los números pares y la suma de los números impares que se encuen-
tran almacenados en un arreglo de hasta 200 elementos.
Especificaciones del problema.
Diagrama
de caja
negra del
problema
Diagrama de Flujo de Datos.
580
581
• Programa en Visual Basic.
Pr i vate Su b Co m m a n d1_Cl i c k ( )
D i m i As Inte ge r, n As Inte ge r, s im p A s I n te ge r
D i m spa r As Inte ge r, sp i m A s D oub le, A rr( 2 0 0 ) A s D oub le
Fo r i = 0 To n -1
a r r ( i ) = Inpu tBox( “D i g i te d a to pa ra A r r [ “, i+1 ,” ] = ” )
Nex t i
spa r = 0
si m p = 0
Fo r i = 0 To n -1
If A r r ( i ) Mo d 2 = 0 The n
spa r = spa r + A r r ( i )
Else
sp i m = sp i m + A r r ( i )
End If
Nex t i
Pr i nt “La sum a de lo s pa re s es “, s pa r
Pr i nt “La sum a de lo s i m pa res es “, s pim
En d Su b
• Programa en lenguaje C.
#i nc lu d e<stdi o. h >
#i nc lu d e<m a th . h >
vo i d mai n( ) {
i nt A r r [2 00], i , n , sim p, s pa r ;
pr i ntf ( “D i g i te e l núm ero d e d a tos a ing resa r “ );s ca n f (“ % i”,&n);
fo r ( i = 0; i <= n -1; i + =1) {
pr i ntf ( “D i g i te d a to pa ra a r r [ % f] = “, i+1 ); s ca n f(“ % f ”,&Ar r [ i] );
}
spa r = 0; si m p = 0;
fo r ( i = 0 ; i <= n -1; i + =1) {
i f ( A r r [i ]%2 = = 0) {
spa r = spar+a r r [ i] ;
} e lse {
si m p = sp i m +a r r [ i] ;
}
}
pr i ntf( “La sum a de los pa res es % i\n”, s pa r );
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
• Programa en Java.
i mpo r t j ava . i o.* ;
pu bli c c lass E j e rc i c i o5 {
pu bl i c stati c vo i d m a in(S t rin g[ ] a rgs )t h row s I O E xce p t ion {
Bu ffe re d Read er lee = n e w B uf fe re d Rea d e r ( n e w I n p ut S t rea m Rea d e r (Sys tem.
in));
i nt a r r []= n e w int [ 2 0 0 ] , i, n, s im p, s pa r ;
Syste m.o u t . pr i n t(“ D ig ite el nú m ero d e d a tos a ing resa r “ );
n = Inte ge r. pars e I n t(lee.rea d Lin e());
fo r ( i = 0 ; i <n ; i ++ ) {
Syste m.o u t . p rin t(“ D ig ite d a to pa ra a r r [ “ + (i+1 )+ “ ] = “ );
a r r [i ] = Inte n e r. pa rs e I nt (lee. rea d L in e());
}
spa r = 0 ; si m p = 0 ;
fo r ( i = 0; i <n ; i ++ )
i f ( a r r [i ]%2 = = 0 )
spa r = s pa r+a r r [ i] ;
e l se
si m p = s im p+a r r [ i] ;
Syste m.o u t . pr i n tl n(“ La s u m a d e los pa res es “ + s pa r );
Syste m.o u t . pr i n tl n(“ La s u m a d e los im pa res es “ + s im p);
}
}
• Programa en Python.
a r r = [i nt( ) fo r i i n range( 2 00) ]
n = i npu t ( “D i g i te e l núm e ro de d a tos a ing resa r “ )
fo r i i n range( n ) :
a r r [i ] = i npu t( “D i g i te da to pa ra a r r [ “, s t r (i+1 ), “ ] = “ )
spa r = 0
si m p = 0
fo r i i n range( n ) :
i f a r r [i ]%2 = = 0:
spa r = spa r+a r r [i ]
e l se :
si m p = si m p +a r r [i ]
pr i nt “La sum a de lo s pa re s e s “, s pa r
pr i nt “La sum a de lo s i m pa re s es “, s im p
• Programa en JavaScript.
<H TML>
<B O DY >
<SC R IPT >
var n = ne w Nu mbe r(); va r s pa r = n e w N um b e r(); va r s im p = n e w N um b e r();
var i = ne w Nu mber(); va r a r r = n e w A rray(2 0 0 );
n = Nu mbe r( pro mp t(“ D ig ite el núm ero d e d a tos a ing resa r “ ));
fo r ( i = 0 ; i <n ; i + + ) 582
a r r [i ] = Nu mber(p rom p t(“ D ig ite d a to pa ra a r r [ “ + (i+1 )+ “ ] = “ )); 583
spa r = 0 ; si m p = 0 ;
fo r ( i = 0; i <n ; i + + )
i f ( a r r [i ] % 2 = = 0 )
spa r = spa r+a r r [ i] ;
e lse
si m p = si m p+a r r [ i] ;
d o cu me nt .wr i te ( “La s u m a d e los pa res es “, s pa r,’ < BR/> ’ );
d o cu me nt .wr i te ( “La s u m a d e los im pa res es “, s im p,’ < BR/> ’ );
</ SC R IPT >
</ B O DY >
</ H TML>
• Programa en PHP.
<? p h p
$ stdi n = fo pe n( ‘ p h p : //stdi n’,’ r ’ );
se ttype ( $ n ,’ i n te ge r ’ ) ; se ttyp e($s pa r,’ integer ’ ); s e t ty p e ($s im p,’ integer ’ );
se ttype ( $ i ,’ i n te ge r ’ ) ; $ a r r = a rray ();
e c ho ‘ D i g i te e l núm e ro de d a tos a ing resa r ‘ ; fs ca n f($s td in,” % d ”, $n);
fo r ( $ i = 0; $ i <$ n ; $ i + + ) {
e c ho ‘ D i g i te da to pa ra a r r [ ‘, $i+1 ,’ ] = ‘ ; fs ca n f($s td in,” % f ”, $a r r [ $i] );
}
$ spa r = 0 ; $ si m p = 0 ;
fo r ( $ i = 0; $ i <$ n ; $ i + + )
i f ( $ a r r [$ i ]%2 = = 0)
$ spa r = $ spa r+$ a r r [ $i+1 ] ;
e l se
$ si m p = $ si m p +$ a r r [ $i+1 ] ;
e c ho ‘ La sum a de lo s pa re s es ‘, $s pa r, P H P_EO L;
e c ho ‘ La sum a de lo s i m pares es ‘, $s im p, P H P_EO L;
?>
Ejercicio 15.
Escribir un algoritmo que determine cuántas ocurrencias de una cadena específica
dada se presentan en una frase de hasta 1000 caracteres.
Especificaciones del problema
Salidas n_o
Diagrama
de caja
negra del
problema
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
Diagrama de Flujo de Datos.
584
585
• Programa en Visual Basic.
Pr i vate Su b Co m m a n d1_Cl i c k ()
D i m e sta As Bo o lean, f A s S t rin g , i A s I n te ge r, j A s I n te ge r
Di m l f As Inte ge r, l p As I n te ge r, n _o A s I n te ge r, p A s S t rin g
Di m f rase (1000) As Str in g , pala bra (2 0 ) A s S t rin g
f = Inpu tBox( “D i g i te una fres e d e has ta 1 0 0 0 ca ra c teres” )
l f = f. Le ng th( )
If l f <10 00 The n
p = Inpu tBox( “D i g i te la pala bra a bu s ca r con no más d e 2 0 ca ra c teres” )
l p = p. Le ng th( )
If l p <2 0 The n
Fo r i =1 To l f
f rase ( i ) = M id (f, I ,1 )
Nex t i
Fo r j =1 To l p
pala b ra ( j ) = M id (p, j,1 )
Nex t j
n _o = 0
Fo r i =1 To l f-l p
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
e sta = Tr u e
Fo r j =1 To lp
If f rase(i+j) = = pala bra (j) T h e n
e sta = Fal s e
End If
Nex t J
If e sta The n
n _o = n_o + 1
End If
Nex t i
Pr i nt El n úm e ro d e ocu r renc ias d e “, p,” en la f ras e es d e “, n_o
Else
Pr i nt “D i g i tó u na pala bra d e más d e 2 0 ca ra c teres”
End If
El se
Pr i nt “D i g i tó un a f res e d e más d e 1 0 0 0 ca ra c teres”
End If
End Su b
• Programa en lenguaje C.
#i nc l u d e<std i o. h >
#i nc l u d e<std bo o l. h >
#i nc l u d e<str i ng. h >
voi d mai n( ) {
bo o l e sta ;
i nt i , j , l f, l p, n _o ;
c har f rase [10 00], pala b ra [2 0 ] ;
pr i ntf( “D i g i te un a f re se de h as ta 1 0 0 0 ca ra c teres “ ); s ca n f(“ % s”,f );
l f = str le n( f ) ;
i f ( l f <1000) {
pr i ntf( “D i g i te la pala b ra a bu s ca r con no más d e 2 0 ca ra c teres “ ); s ca n f(“ % s”, p);
l p = str le n( p ) ;
i f ( l p <2 0 ) {
n _o = 0 ;
fo r ( i = 0; i <l f-l p ; i + + ) {
e sta = tr u e ;
fo r ( j = 0 ; j <l p ; j + + )
i f ( f rase [i +j ] ! = pala bra [ j] ) es ta = fal s e ;
i f ( e sta ) n _o = n _o+1 ;
}
pr i ntf( “e l n úm e ro de ocu r renc ias d e % s en la fras e es d e % 4 i\n”, p, n_o);
} e l se 586
pr i ntf( “D i g i tó un a pala bra d e más d e 2 0 ca ra c teres\n” ); 587
} e l se
pr i ntf( “D i g i tó un a f re se d e más d e 1 0 0 0 ca ra c teres\n” );
}
• Programa en Java.
impo r t j ava . i o.* ;
p u bli c c lass E j e rc i c i o15 {
pu bl i c stati c vo i d mai n(Strin g[ ] a rgs )t h row s I O E xce p t ion {
Bu ffe re d Read e r le e = n e w B uf fe re d Rea d e r (n e w I n p ut S t rea m Rea d e r ( Sys te m .
in));
Str i ng f, p ;
bo o lean e sta ;
i nt i , j , l f, l p, n _o ;
c har f rase [] = ne w c har[1 0 0 0 ] ;
c har pala b ra [] = ne w c h a r[ 2 0 ] ;
Syste m.o u t . pr i nt ( “D i g i te u na fres e d e has ta 1 0 0 0 ca ra c teres “ );
f = le e.read L i ne ( ) ;
l f = f.le ng th( ) ;
i f ( l f <1000) {
Syste m.o u t . pr i nt ( “ D ig ite la pala bra a bu s ca r con no más d e 2 0 ca ra c teres “ );
p = le e.read L i ne ( ) ;
l p = p.le ng th();
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
i f ( l p <2 0 ) {
fo r ( i = 0; i <l f ; i + + ) f ras e[ i] = f.c ha r A t (i);
fo r ( j = 0; j <l p ; j + + ) pala bra [ j] = p.c ha r A t (j);
n _o = 0;
fo r ( i = 0; i <l f-l p ; i+ + ) {
e sta = tr u e ;
fo r ( j = 0; j <lp; j+ + )
i f ( f rase[ i+j] = = pala bra [ j] ) es ta = fal s e ;
i f ( e sta ) n _o = n_o+1 ;
}
Syste m.o u t . pr i n tl n (“el nú m ero d e ocu r renc ias d e “ + p+ ” en la f ras e es
de “+ n _o ) ;
}
e lse
Syste m.o u t . pr i n tl n (“ D ig itó u na pala bra d e más d e 2 0 ca ra c teres” );
}
e l se
Syste m.o u t . pr i ntln (“ D ig itó u na fres e d e más d e 1 0 0 0 ca ra c teres” );
}
}
• Progama en Python.
f rase = [str( ) fo r i i n range(1 0 0 0 )]
pala b ra = [str( ) fo r j i n range(2 0 )]
f = raw_ i npu t ( “D i g i te un a f res e d e has ta 1 0 0 0 ca ra c teres “ )
l f = le n ( f )
i f l f < 10 00:
p = raw_ i npu t ( “D i g i te la pala bra a bu s ca r con no más d e 2 0 ca ra c teres “ )
l p = le n ( p )
i f l p < 2 0:
i=0
fo r c i n f :
f rase [i ] = c
i = i + 1
j=0
fo r c i n p :
pala b ra [j ] = c
j = j + 1
n _o = 0
fo r i i n range( l f-l p +1 ):
e sta = Tr u e
fo r j i n range( l p):
i f f rase [i +j ] ! = pala bra [ j] :
e sta = Fal s e
i f e sta :
588
n _o = n _o + 1 589
pr i nt “e l n úm e ro de ocu r renc ias d e “, p,” en la f ras e es d e “, n_o
e l se :
pr i nt “D i g i tó un a pala bra d e más d e 2 0 ca ra c teres”
e lse :
pr i nt “D i g i tó un a f re se d e más d e 1 0 0 0 ca ra c teres”
• Programa en JavaScript.
< H TML>
<B O DY >
<SC R IPT >
var l f = ne w Nu mber(); va r lp = n e w N um b e r(); va r i = n e w N um b e r();
var f rase = ne w Ar ray(1 0 0 0 ); va r pala bra = n e w A rray(2 0 ); va r n_o = n e w
Nu mbe r( ) ;
var j = ne w Nu mbe r(); va r f = n e w S t rin g(); va r p = n e w S t rin g(); va r es ta =
ne w Bo o lean( ) ;
fo r ( i = 0; i <lf- lp+1 ; i+ + ) {
e sta = t rue ;
fo r ( j = 0 ; j< lp; j+ + )
i f ( fras e[ i+j] ! = pala bra [ j] ) es ta = fal s e ;
i f (e sta) n_o = n_o+1 ;
}
d o cu me nt .w rite (“el nú m ero d e ocu r renc ias d e “, p,” en la fras e es d e
“, n _o,’ <B R / > ’ );
} e lse
d o cu me nt .w rite (“ D ig itó u na pala bra d e más d e 2 0 ca ra c te-
re s”,’ <B R / >’);
} e l se
d o cu me nt .wr i te (“ D ig itó u na f res e d e más d e 1 0 0 0 ca ra c teres”,’ < BR/> ’ );
</ SC R IPT >
</ B O DY >
< / H TML>
• Programa en PHP.
<? p h p
$ stdi n = fo pe n( ‘ p h p : //stdi n’,’ r ’ );
se ttype ( $ l p,’ i n te ge r ’ ) ; se ttyp e($i,’ integer ’ ); s e t ty p e ($j,’ integer ’ );
se ttype ( $f,’str i n g ’ ) ; se ttype($p,’s t r ing ’ ); s e t ty p e ($es ta ,’ boolea n’ )
$f rase = ar ray ( ) ; $ pala b ra = a rray (); s e t ty p e ($lf,’ integer ’ ); s e t ty p e($n_o,’ integer ’ );
?>
Ejercicio 25.
Elaborar un algoritmo que llene un arreglo con los datos de las medidas de las
normales tomadas en la medición de un terreno. Hallar el área total del terreno por el
método del cálculo del área por normales tomadas desde una línea recta con separa-
ciones regulares según la siguiente fórmula:
H0 H
Área = B ( + H 1 + H 2 + ••• + n )
2 2
Especificaciones del problema.
área = h(0)/2
área = h(n-1)/2
Procesos
área = área + h[i]
i=I+1
Diagrama de
caja negra del
problema
End Su b
• Programa en lenguaje C.
#i nc lu d e<stdi o. h >
#i nc lu d e<m a th . h >
vo i d mai n( ) {
float a rea , b ; i n t i , n ; 592
pr i ntf( “D i g i te ca n ti da d d e m ed id as “ ); s ca n f(“ % d ”,&n); 593
float h [n ];
fo r ( i = 0 ; i <n ; i + + ) {
pr i ntf( “D i g i te la m e d ia d a H [ % f] “, i+1 ); s ca n f(“ % f ”,&h[ i] );
}
pr i ntf( “Me di a de se pa ra c iones “ );s ca n f(“ % f ”,&b);
a rea = h [0]/2 ;
a rea = a rea+ h [n -1]/2 ;
fo r ( i =1; i <= n -2 ; i + =1 h ce r )
a rea = a rea+ h [i ];
pr i ntf( “El a rea de l te r re no es % 6 . 2 f ”, b*a rea );
}
• Programa en Java.
i mpo r t j ava . i o.* ;
pu bl i c c lass E j e rc i c i o2 5 {
pu bli c stati c vo i d mai n(S t rin g[ ] a rgs )t h row s I O E xce p t ion {
Bu ffe re d Read e r le e = n e w B uf fe re d Rea d e r ( n e w I n p ut S t rea m Rea d e r ( Sys te m.
in));
d o u ble a rea , b, h [] ; in t i, n;
Syste m.o u t . pr i nt( “ D ig ite ca nt id a d d e m ed id as “ ); n = I n te ge r. pa rs e I n t(lee.rea d-
L i ne( ) ) ;
h = ne w d o u ble[n ] ;
fo r ( i = 0 ; i <n ; i + + ) {
Syste m.o u t . pr in t (“ D ig ite la m ed ia d a H [ “ + i+1 + ” ] “ );
h [i ] = D o u ble. pa rs e D oub le(lee.rea d L in e());
}
Syste m.o u t . pr i nt( “ M ed ia d e s epa ra c iones “ );
b = D o u ble. parse D oub le(lee.rea d L in e());
a rea = h [0 ]/2 ;
a rea = a rea+ h [n -1] /2 ;
fo r ( i =1; i <n -1; i + + ) a rea = a rea+ h[ i] ;
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
• Programa en Python.
n = i npu t( “D i g i te ca n ti da d d e m ed id as “ )
h = [float() fo r i i n range(n)]
fo r i i n range( n ) :
h [i ] = float( ) i npu t( “D ig ite la m ed ia d a H [ “, i+1 ,” ] “ )
a rea = h [0]/2
a rea = a rea+ h [n -1]/2
fo r i i n range(1, n -1) :
a rea = a rea+ h [i ]
pr i nt “El a rea de l te r re n o es “, b*a rea
• Programa en JavaScript.
< H TML>
<B O DY >
<SC R IPT >
var n = ne w Nu mbe r(); va r i = n e w N um b e r();
var b = ne w Nu mbe r(); va r a rea = n e w N um b e r();
n = Nu mbe r(pro mpt(“ D ig ite ca nt id a d d e m ed id as “ ));
var h = ne w Ar ray( n );
fo r ( i = 0; i <n ; i + + )
h [i ] = Nu mbe r( prom p t(“ D g ite la m ed ia d a H [ “ + (i+1 )+ ” ] “ ));
b = Nu mbe r (pro mpt( “ M ed ia d e s epa ra c iones “ ));
a rea = h [0]/2 ;
a rea = a rea+ h [n -1]/2 ;
fo r ( i =1; i <n -1; i + + ) a rea = a rea+ h[ i] ;
d o cu me nt .wr i te ( “El a rea d el ter reno es “, b*a rea ,’ < BR/> ’ );
</ SC R IPT >
</ B O DY >
< / H TML>
• Programa en PHP.
<?p h p
$ stdi n = fo pe n( ‘ p h p : //stdi n’,’ r ’ );
se ttype ( $ n ,’ i n te ge r ’ ) ; se ttype($i,’ integer ’ ); 594
se ttype ( $ b,’ f loa t’ ) ; se ttype( $ a rea ,’ floa t’ ); 595
e c ho ‘ D i g i te ca n ti da d de m ed id as ‘ ; fs ca n f($s td in,” % d ”, $n);
$ h = ar ray ( ) ;
fo r ( $ i = 0 ; $ i <$ n ; $ i + + ) {
e c ho ‘ D g i te la m e di a da H [ ‘, $i+1 ,’ ] ‘ ;
fscanf( $ stdi n ,”%f ”, $ h [$ i ]);
}
e c ho ‘ Me di a de se pa ra c i o n e s ‘ ; fs ca n f($s td in,” % f ”, $b);
$ a rea = $ h [1]/2 ;
$ a rea = $ a rea+$ h [$ n ]/2 ;
fo r ( $ i =1; $ i <$ n -1; $ i + + ) $ a rea = $a rea+$h[ $i] ;
e c ho ‘ El a rea de l te r re n o e s ‘, $b*$a rea , P H P_EO L;
?>
Ejercicio 35.
Diseñar un algoritmo que llene e imprima una tabla de 30 renglones y 5 columnas. La
tabla se llena de acuerdo a las siguientes condiciones:
Entradas No hay
tabla(i,0) = tabla(i-1,0) + 1
tabla(i,1) = tabla(i,0) + 2
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
suma_e = tabla(0,4)
suma_a = tabla(0,0)
Salidas Tabla
Diagrama
de caja
negra del
problema
Diagrama de Flujo de Datos.
596
597
• Programa en Visual Basic.
Pr i vate Su b Co m m a n d1 _Clic k ()
D i m i As Inte ge r
D i m j As Inte ge r
D i m sum a _a As Inte ge r
D i m sum a _e As Inte ge r
D i m ta b la ( 3 0, 5 ) A s I n te n ge r
Fo r i = 1 To 29
ta b la ( i , 0) = 0
ta b la ( i , 1) = 0
ta b la ( i , 2 ) = 0
ta b la ( i , 3 ) = 0
ta b la ( i , 4 ) = 0
Nex t i
ta b la ( 0 , 0 ) = 0
ta b la ( 0 , 1) = 1
ta b la ( 0 , 2) = 2
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
ta b la ( 0 , 3) = 3
ta b la ( 0 , 4) = 4
Fo r i = 1 To 29
ta b la ( i , 0) = ta bla (i - 1 , 0 ) + 1
ta b la ( i , 1) = ta b la (i, 1 ) + 2
ta b la ( i , 2) = ta bla (i - 1 , 0 ) + ta bla (i - 1 , 1 )
ta b la ( i , 3) = Ab s(ta bla (i, 1 ) - ta bla (i, 2 )) + A b s(ta bla (i - 1 , 3 ) - ta bla (i - 1 , 4 ))
sum a _e = ta b la(0 , 4 )
Fo r j = 1 To i - 1
sum a _e = s u m a _e + ta bla (j, 4 )
Nex t j
sum a _a = ta b la(0 , 0 )
Fo r j = 1 To i
sum a _a = s u m a _a + ta bla (j, 0 )
Nex t j
ta b la ( i , 4 ) = Ab s(s u m a _e - s u m a _a )
Nex t i
Fo r i = 0 To 29
Pr i nt ta b la ( i ,0), ta bla (i,1 ), ta bla (i, 2 ), ta bla (i, 3 ), ta bla (i,4 )
Nex t i
End Su b
• Programa en lenguaje C.
#i nc l u d e<stdi o. h >
#i nc lu d e<m a th . h >
vo i d mai n( ) {
i nt i ;
i nt j ;
i nt sum a _a ;
i nt sum a _e ;
i nt ta b la [3 0][5 ];
fo r ( i =1; i <3 0; i + + ) {
ta b la [i ][0 ] = 0;
ta b la [i ][1] = 0;
ta b la [i ][2 ] = 0;
ta b la [i ][3 ] = 0;
ta b la [i ][4 ] = 0;
}
ta b la [0][0] = 0;
ta b la [0][1] = 1;
ta b la [0][2 ] = 2; 598
ta b la [0][3 ] = 3; 599
ta b la [0][4 ] = 4;
fo r ( i =1; i <3 0; i + + ) {
ta b la [i ][0 ] = ta b la [i -1] [ 0 ] +1 ;
ta b la [i ][1] = ta b la [i ][0 ] +2 ;
ta b la [i ][2 ] = ta b la [i -1] [ 0 ] +ta bla [ i-1 ] [1 ] ;
ta b la [i ][3 ] = a b s( ta b la [ i] [1 ] -ta bla [ i] [ 2 ] )+a bs (ta bla [ i-1 ] [ 3 ] -ta bla [ i-1 ] [4 ] );
sum a _e = ta b la [0][4 ];
fo r ( j =1; j <= i -1; j + =1) suma _e = s u m a _e+ta bla [ j] [4 ] ;
sum a _a = ta b la [0][0];
fo r ( i = 0 ; i <= 29 ; i + =1) {
pr i ntf( “%4 d %4 d %4 d % 4 d % 4 d % 4 d \n”, i+1 ,ta bla [ i] [ 0 ] ,ta bla [ i] [1 ] ,ta bla [ i] [ 2 ] ,ta bla [ i]
[3 ],ta b la [i ][4 ]) ;
}
}
• Programa en Java.
i mpo r t j ava . i o.* ;
pu bli c c lass E j e rc i c i o3 5 {
pu bli c stati c vo i d mai n( S t rin g[ ] a rgs )t h row s I O E xce p t ion {
Bu ffe re d Read e r le e = n e w B uf fe re d Rea d e r (n e w I n p ut S t rea m Rea d e r (Sys te m.
in));
i nt i ;
i nt j ;
i nt sum a _a ;
i nt sum a _e ;
i nt ta b la [][] = ne w i nt[ 3 0 ] [ 5 ] ;
fo r ( i =1; i <3 0 ; i + + ) {
ta b la [i ][0 ] = 0;
ta b la [i ][1] = 0;
ta b la [i ][2 ] = 0;
ta b la [i ][3 ] = 0;
ta b la [i ][4 ] = 0;
}
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
ta b la [0][0] = 0;
ta b la [0][1] = 1;
ta b la [0][2 ] = 2;
ta b la [0][3 ] = 3;
ta b la [0][4 ] = 4;
fo r ( i =1; i <3 0 ; i + + ) {
ta b la [i ][0 ] = ta b la [ i-1 ] [ 0 ] +1 ;
ta b la [i ][1] = ta b la [ i] [ 0 ] +2 ;
ta b la [i ][2 ] = ta b la[ i-1 ] [ 0 ] +ta bla [ i-1 ] [1 ] ;
ta b la [i ][3 ] = M ath.a b s(ta bla [ i] [1 ] -ta bla [ i] [ 2 ] )+ Ma t h . a b s(ta bla [ i-1 ] [ 3 ] -ta bla [ i-1 ]
[4 ]) ;
sum a _e = ta b la [0] [4 ] ;
sum a _a = ta b la [0] [ 0 ] ;
fo r ( j =1; j <= i ; j + + ) {
sum a _a = suma _a+ta bla [ j] [ 0 ] ;
}
fo r ( i = 0; i <3 0 ; i + + ) {
Syste m.o u t . pr i ntln(“ ” + (i+1 )+ta bla [ i] [ 0 ] +ta bla [ i] [1 ] +ta bla [ i] [ 2 ] +ta bla [ i] [ 3 ] +ta b-
la [i ][4 ]) ;
}
}
}
• Programa en Python.
i = i nt( )
j = i nt( )
sum a _a = i nt( )
sum a _e = i nt( )
fo r i i n range(1, 3 0) :
ta b la [i ][0] = 0
ta b la [i ][1] = 0
tala [i ][2 ] = 0
ta b la [i ][3 ] = 0
ta b la [i ][4 ] = 0
pr i nt “No. A B C D E”
ta b la [0][0] = 0
ta b la [0][1] = 1
ta b la [0][2 ] = 2
ta b la [0][3 ] = 3
ta b la [0][4 ] = 4
fo r i i n range(1, 3 0 ) : 600
ta b la [i ][0 ] = ta b la [i -1][0 ] +1 601
ta b la [i ][1] = ta b la [i ][0]+2
ta b la [i ][2 ] = ta b la [i -1][0 ] +ta bla [ i-1 ] [1 ]
ta b la [i ][3 ] = a b s( ta b la [i] [1 ] -ta bla [ i] [ 2 ] )+a bs (ta bla [ i-1 ] [ 3 ] -ta bla [ i-1 ] [4 ] )
sum a _e = ta b la [0][4 ]
fo r j i n range(1, i ) :
sum a _e = sum a _e +ta bla [ j] [4 ]
sum a _a = ta b la [0 ][0]
fo r j i n range(1, i +1) :
sum a _a = sum a _a+ta b la [ j] [ 0 ]
fo r i i n range( 3 0 ) :
var ta b la = ne w A rray(3 0 );
fo r (var i = 0 ; i <3 0 ; i+ + ) { ta bla [ i] = n e w A rray(5 ); }
fo r ( i =1; i <3 0; i + + ) {
ta b la [i ][0 ] = 0 ;
ta b la [i ][1] = 0 ;
ta b la [i ][2 ] = 0 ;
ta b la [i ][3 ] = 0 ;
ta b la [i ][4 ] = 0 ;
}
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
fo r ( i =1; i <3 0; i + + ) {
ta b la [i ][0 ] = ta bla [ i-1 ] [ 0 ] +1 ;
ta b la [i ][1] = ta bla [ i] [ 0 ] +2 ;
ta b la [i ][2 ] = ta bla [ i-1 ] [ 0 ] +ta bla [ i-1 ] [1 ] ;
ta b la [i ][3 ]= M a t h. a bs (ta bla [ i] [1 ] -ta bla [ i] [ 2 ] )+ M a t h. a bs (ta bla [ i-1 ] [ 3 ] -ta-
b la [i -1][4 ]) ;
sum a _e = tabla [ 0 ] [4 ] ;
fo r ( j =1; j <= i-1 ; j+ + ) s u m a _e = s u m a _e+ta bla [ j] [4 ] ;
sum a _a = ta bla [ 0 ] [ 0 ] ;
fo r ( j =1; j <= i; j+ + ) s u m a _a = s u m a _a+ta bla [ j] [ 0 ] ;
fo r ( i = 0 ; i <3 0 ; i + + )
d o cu me nt .w rite (i+1 ,ta bla [ i] [ 0 ] ,ta bla [ i] [1 ] ,ta bla [ i] [ 2 ] ,ta bla [ i] [ 3 ] ,ta bla [ i]
[4 ],’ <B R / >’ ) ;
</ SC R IPT >
</ B O DY >
</ H TML>
• Programa en PHP.
<?p h p
se ttype ( $ i ,’ i n te ge r ’ ) ;
se ttype ( $ j ,’ i n te ge r ’ ) ;
se ttype ( $ sum a _a ,’ i n te ge r ’ );
se ttype ( $ sum a _e,’ i n te ge r ’ );
$ ta b la = ar ray( ) ;
fo r ( $ i =1; $ i <3 0; $ i + + ) {
$ ta b la [$ i ][0] = 0;
$ ta b la [$ i ][1] = 0;
$ ta b la [$ i ][2 ] = 0;
$ ta b la [$ i ][3 ] = 0 ;
$ ta b la [$ i ][4 ] = 0 ;
}
e c ho ‘ No. A B C D E ’, P H P_EO L;
$ ta b la [0 ][0] = 0;
$ ta b la [0 ][1] = 1;
$ ta b la [0 ][2 ] = 2;
$ ta b la [0 ][3 ] = 3;
$ ta b la [0 ][4 ] = 4; 602
603
fo r ( $ i =1; $ i <3 0; $ i + + ) {
$ ta b la [$ i ][0 ] = $ ta b la [$ i -1 ] [ 0 ] +1 ;
$ ta b la [$ i ][1] = $ ta b la [$ i ] [ 0 ] +2 ;
$ ta b la [$ i ][2 ] = $ ta b la [$ i -1 ] [ 0 ] + $ta bla [ $i-1 ] [1 ] ;
$ ta b la [$ i ][3 ] = abs( $ ta b la [ $i] [1 ] - $ta bla [ $i] [ 2 ] ) + a b s($ta bla [ $i-1 ] [ 3 ] - $ta bla [ $i-1 ]
[4 ]) ;
$ sum a _e = $ ta b la [0 ][4 ];
fo r ( $ j =1; $ j <$ i ; $ j + + ) $ sum a _e = $s u m a _e + $ta bla [ $j] [4 ] ;
$ sum a _a = $ ta b la [0 ][0];
fo r ( $ j =1; $ j <= $ i ; $ j + + ) $ su m a _a = $s u m a _a + $ta bla [ $j] [ 0 ] ;
fo r ( $ i = 0; $ i <3 0; $ i + + )
e c ho $ i +1,’ -’, $ ta b la [$ i ][0] ,’ ’, $ta bla [ $i] [1 ] ,’ ’, $ta bla [ $i] [ 2 ] ,’ ’, $ta bla [ $i] [ 3 ] ,’ ‘, $ta bla [ $i]
[4 ], P H P_ EO L ;
?>
Ejercicio 40.
Hacer un algoritmo con el que se pueda hallar el área superficial total y el volumen
de un paralelepípedo si se conoce el punto del vértice y las coordenadas cartesianas con
las que se determinan las dimensiones de los tres vectores, que unidos por su origen en
el punto vértice común a los tres definen el paralelepípedo como se muestra en la figura.
A
C
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
B
Especificaciones del problema.
oaxoc=((MV(0,1)*MV(2,2) - MV(0,2)*MV(2,1))^2+(-(MV(0,0)*MV(2,2) -
MV(0,2)*MV(2,0)))^2+(MV(0,0)*MV(2,1) - MV(0,1)*MV(2,0))^2)^0.5
Diagrama
de caja
negra del
problema
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
Fo r f = 2 To 4
606
mv ( f - 1, 1) = m c (f, 1 ) - m c (1 , 1 ) 607
mv ( f - 1, 2 ) = m c (f, 2 ) - m c (1 , 2 )
mv ( f - 1, 3 ) = m c (f, 3 ) - m c (1 , 3 )
Nex t f
Fo r d = 1 To 3
p i v o te = mv ( d , d )
Fo r f = d + 1 To 3
a ux = mv (f, d )
Fo r c = 0 To 3
mv ( f, c ) = mv(f, c ) - (mv(d , c ) * (a u x / pivote))
Nex t c
Nex t f
Nex t d
End Su b
• Programa en Lenguaje C.
#i nc l u d e<stdi o. h >
#i nc l u d e<m a th . h >
vo i d mai n( ) {
float a ux , oa xo b,oa xoc ,obxoc , pivote;
i nt c , d, f ;
float m c [4 ][3 ], mv [3 ] [ 3 ]
fo r ( f =1; f <4 ; f+ + ) {
mv [f-1][0] = m c [ f] [ 0 ] - m c [ 0 ] [ 0 ] ;
mv [f-1][1] = m c [ f ] [1 ] - m c [ 0 ] [1 ] ;
mv [f-1][2 ] = m c [ f] [ 2 ] - m c [ 0 ] [ 2 ] ;
}
d = float( ) ;
p i v o te = float( ) ;
a ux = float( )
oa xo b = float( ) ;
oa xo c = float( ) ;
o bxo c = float( )
fo r f i n range(1,4 ) :
mv [f-1][0] = m c [ f] [ 0 ] - m c [ 0 ] [ 0 ]
mv [f-1][1] = m c [f ] [1 ] - m c [ 0 ] [1 ]
mv [f-1][2 ] = m c [f] [ 2 ] - m c [ 0 ] [ 2 ]
fo r d i n range( 3 ) :
p i v o te = mv [d][d ]
fo r f i n range( d+1 , 3 ):
a ux = mv [f ][d ]
fo r c i n range(3 ):
mv [f ][c ] = mv[ f ] [ c ] - (mv[ d ] [ c ] * (a u x /pivote))
fo r ( f =1 ; f <4 ; f+ + ) {
mv[f-1 ][0 ] = m c[ f] [ 0] - mc[ 0] [ 0] ;
mv[f-1 ][1 ] = mc[ f] [1 ] - mc[ 0] [1 ] ;
mv[f-1 ][2 ] = mc[ f] [ 2] - mc[ 0] [ 2] ;
}
oaxob = Math .p o w((Mat h. pow((mv[ 0] [1 ] *mv[1 ] [ 2] - mv[ 0] [ 2] *mv[1 ]
[1 ]) , 2 ) +
Math .p o w( ( -( mv[ 0] [ 0] *mv[1 ] [ 2] - mv[ 0] [ 2] *mv[1 ] [ 0] )),2)+
Math .p o w( ( mv [ 0] [ 0] *mv[1 ] [1 ] - mv[ 0] [1 ] *mv[1 ] [ 0] ),2)),0. 5);
fo r ( $ d= 0 ; $ d<3 ; $ d+ + ) {
$ p i v o te = $ mv [$ d][$ d ] ;
fo r ( $f = $ d+1; $f <3 ; $f+ + ) {
$ a ux = $ mv [$f ][$ d ] ;
fo r ( $ c= 0 ; $ c<3 ; $ c+ + ) {
$ mv [$f ][$ c ] = $mv[ $f] [ $c ] - ($mv[ $d ] [ $c ] * ($a u x /$pivote));
}
}
}
?>
Capítulo 6
Ejercicio 5.
Para la función que se presenta a continuación, tomar T(n) = 1 si n = 1. Entonces, escribir
un algoritmo que tabule la función para un valor de x entero positivo menor o igual a100.
T(1) = 1
Procesos
T(x) = (x - 1)^0.5 + (x - 1)
Salidas n
Diagrama
de caja
negra del
problema
612
613
If n = 1 T h e n
f = 1
El se
f = ( t(n - 1 )) ^ 0 . 5 + (n - 1 )
End If
t = f
End Fu nc ti o n
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
• Programa en Lenguaje C.
#i nc l u d e<std io. h>
#i nc l u d e<m a t h. h>
vo i d mai n( ) {
d o u ble x , n;
pr i ntf( “ Dig ite X ” ); s ca n f(“ % d ”, x ); n = t (x );
pr i ntf( “\ nT (% 5 d )= %1 0 . 7f ”, x , n);
}
d o u ble t(i nt n) {
d o u ble f ;
i f ( n = =1)
f = 1;
e l se
f = sq r t f(t (n-1 ))+ (n-1 );
re tu r n f ;
}
• Programa en Java.
i mpo r t j ava . i o.* ;
pu bli c c lass E j e rc i c i o 6_05_ F T1 {
pu bl i c stati c vo i d mai n( S t rin g[ ] a rgs ) t h row s I O E xce p t ion {
Bu ffe re d Read e r lee = n e w B uf fe re d Rea d e r (n e w I n p ut S t rea m Rea d e r (Sys-
te m. i n ) ) ;
d o u ble x , n ;
Syste m.o u t . pr i n t(“ D ig ite X “ );
i nt x = D o u ble. pa rs e D oub le(lee.rea d L in e());
n = t( x ) ;
Syste m.o u t . pr i n tl n(“ \n T (“ +x+ ” )= “ + n);
}
pu bl i c stati c d o u ble t(i n t n) {
d o u ble f ;
i f ( n = =1) f = 1;
e lse f = M ath. sqrt(t (n-1 ))+ (n-1 );
re tu r n f ;
}
• Programa en Python.
# -* - co di n g : i so -8 8 59 -15 -* -
fro m math i mpo r t sq r t 614
615
d e f t( n ) :
f = float ( )
i f n = =1:
f = 1
e lse :
f = sq r t ( t( n -1) ) + (n-1 )
re tu r n f
x = float( ) ; n = float( )
x = float(raw_ i npu t( “D i g i te X ” ))
n = t( x ) ;
pr i nt “”; pr i nt “ T ( “, x ,”) = “, n
• Programa en JavaScript.
<H TML>
<B O DY >
<SC R IPT >
fu nc ti o n t( n ) {
var f ;
i f ( n = =1) f = 1 ;
e lse f = Ma th . s q r t (t (n-1 ))+ (n-1 );
re tu r n f ;
}
</ H TML>
• Programa en PHP.
<? p h p
$ stdi n = fo pe n( ‘ p h p : //std in’,’ r ’ );
fu nc ti o n t( $ n ) {
i f ( $ n = =1) $f = 1;
e lse $f = sqr t( t( $ n -1) )+ ($n-1 );
re tu r n $f ;
}
?>
Ejercicio 15.
Realizar un algoritmo recursivo que sume los elementos de un arreglo de 200 elementos.
Especificaciones del programa.
suma(arr,0)= arr[0]
Procesos
s = s + suma(arr,n-1)
Salidas S
Diagrama
de caja
negra del
problema
End Fu nc ti o n
616
617
• Programa Lenguaje C.
#i nc lu d e<stdi o. h >
d o u ble sum a (d o u ble a [ ] , in t n ) ;
vo i d mai n( ) {
d o u ble a r r [2 0 0], s ; int i;
fo r ( i = 0; i <2 00; i + + ) {
pr i ntf( “D i g i te a r r [ % d ] ”, i); s ca n f(“ % f ”, a r r [ i] );
}
s = sum a ( a r r,19 9 );
pr i ntf( “%6. 2 f ”, s) ;
}
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
Programa Java.
i mpo r t j ava . i o.* ;
pu bl i c c lass E j e rc i c i o 6_1 0_A r r {
pu bl i c stati c vo i d m a in(S t rin g[ ] a rgs ) t h row s I O E xce p t ion {
Bu ffe re d Read e r lee = n e w B uf fe re d Rea d e r ( n e w I n p ut S t rea m Rea d e r ( Sys tem.
in));
i n t i ; d o u ble a rr[ ] = n e w d oub le[ 5 ] ;d oub le s ;
fo r ( i = 0; i <2 00 ; i+ + ) {
Syste m.out . p rin t(“ D ig ite a r r [ “ + i+ ” ] ” );
a r r [i ] = D oub le. pa rs e D oub le(lee.rea d L in e());
}
s = sum a ( a r r,1 99)
Syste m.o u t . p rin tl n(s );
}
pu bl i c stati c d o ub le s u m a (d oub le a [ ] , in t n) {
d o u ble r ;
i f ( n = = 0) r = a [ 0 ] ;
e l se r = a [n ] + s u m a (a , n-1 );
re tu r n r ;
}
}
• Programa Python.
# -* - co di n g : i so -8 859-1 5 - * -
d e f sum a ( a , n ) :
i f n = = 0:
r = a [0 ]
e lse :
r = a [n ]+ su m a (a , n-1 )
re tu r n r
s = s um a ( a r r,19 9 )
pr i nt s
• Programa JavaScript.
<H TML>
<B O DY ”>
<SC R IPT >
fu nc ti o n s u m a (a , n) {
va r r ;
i f ( n= = 0 ) {
r = a[0]; 618
} else { 619
r = a [ n] + s u m a (a , n-1 );
}
re t urn r ;
}
var i ;va r s ;
var a r r = n e w A rray(2 0 0 );
fo r ( i = 0 ; i< 2 0 0 ; i+ + )
a r r [ i] = N um b e r(p rom p t(“ D ig ite a r r [ “ + i+ ” ] ” ));
s = suma (a r r,1 99)
d o cu m e n t .w rite (‘ < BR/> ’, s ,’ < BR/> ’ );
</ SC R IPT >
</ B O DY >
</ H TML>
• Programa PHP.
<? p h p
$ stdi n = fo pe n(‘ php: //s td in’,’ r ’ );
fu nc ti o n su ma($a , $n) {
i f ( $ n = = 0 ) $r = $a [ 0 ] ;
e lse $ r = $a [ $n] + s u m a ($a , $n-1 );
re tu r n $r ;
}
$ a r r = ar ray ( ) ;
fo r ( $ i = 0; $ i <2 0 0 ; $i+ + ) {
e c ho ‘ D ig ite a r r [ ‘, $i,’ ] ‘ ;
$ a r r [$ i] =rt rim(f ge t s($s td in), P H P_EO L);
}
s = sum a ( $ a r r,1 99);
e c ho s, P H P_ EO L;
?>
Ejercicio 25.
Diseñar un algoritmo recursivo que tome un número entero positivo menor que 300
y ejecute el siguiente proceso: si N es par se debe dividir por 2 y el cociente de la división
es el nuevo valor para N. Si N es impar, tomar N multiplicarlo por 3 y sumarle uno, el re-
sultado se convierte en el nuevo valor para N. El proceso se repite hasta que N sea igual
a uno. El programa debe dar como resultado cada uno de los valores calculados para N.
Ejemplo: Si se da 14 la respuesta será:
14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1
serie(int(n/2)
Procesos
serie(n * 3 + 1)
Fundamentos de lógica para programación de computadores · Ejercicios resueltos
Diagrama
de caja
negra del
problema
Fu nc ti o n s er ie (B y Val n A s I n te ge r) A s I n te ge r
If No t (n = 1 ) T h e n
Pr in t n
If n Mod 2 = 0 T h e n
s er ie (I nt (n / 2 ))
El s e
s er ie (n * 3 + 1 )
En d I f
El se
Pr in t 1
End If
620
End Fu nc tion
621
• Programa en Lenguaje C.
#i nc lu d e<s td io. h>
#i nc l u d e<ma t h. h>
vo i d se r i e(int n);
vo i d se r i e(int n) {
i f ( ! ( n = = 1 )) {
prin t f(“ % 5 d \n”, n);
i f (n% 2 = = 0 ) s er ie(int (n/2 ));
e l s e s er ie(n*3 +1 );
e l se p rin t f(“ % f\n”,1 );
}
vo i d mai n() {
i nt n ;
pr i ntf(“ D ig ite N ” ); s ca n f(“ % d ”,&n);
i f ( n >0 && n<3 0 0 ) s er ie(n);
e l se p rin t f(“ Valor fu era d e ra ngo\n” );
}
• Programa en Java.
i mpo r t j ava . i o.* ;
pu bli c c lass E j e rc i c i o 6_1 5_S er ie {
pu bl i c stati c vo i d m a in(S t rin g[ ] a rgs )t h row s I O E xce p t ion {
Bu ffe re d Read e r lee = n e w B uf fe re d Rea d e r (n e w I n p ut S t rea m Rea d e r (Sys te m.
in));
i nt n ;
• Programa en Python.
# -* - co di n g : i so -8 8 59 -15 - *-
d e f se r i e (n):
i f n o t ( n = =1) :
pr i nt n
i f n %2 = = 0:
se r i e ( i n t( n /2 ))
e lse :
se r i e ( n * 3 +1)
e l se :
pr i nt 1
n = i nt( )
n = i nt(raw_ i npu t( “D i g i te N “ ))
i f n >0 a n d n <3 0 0:
se r i e ( n )
e l se :
pr i nt “ Valo r f ue ra de ra ngo”
• Programa en JavaScript.
<H TML>
<B O DY >
<SC R IPT >
fu nc ti o n se r ie(n) {
i f ( ! ( n ==1 )) {
d ocum e n t .w rite (n,’ < BR/> ’ );
i f (n% 2 = = 0 ) s er ie(Ma t h .t run c(n/2 ));
e ls e s er ie(n*3 +1 );
}
e l se d ocum e n t .w rite(1 ,’ < BR/> ’ );
}
var n = ne w N um b e r();
n = Nu mber( p rom p t(“ D ig ite N ” ));
i f ( n >0 & & n<3 0 0 ) s er ie(n);
e lse d o cu m e n t .w rite(“ Valor f u era d e ra ngo”,’ < BR/> ’ );
</ SC R IPT >
</ B O DY >
</ H TML>
• Programa en PHP.
<? p h p
$ stdi n = fo pe n( ‘ p h p: //s td in’,’ r ’ );
622
fu nc ti o n se r i e ( $ n ) { 623
i f ( ! ( $ n = =1) ) {
e c ho $ n , P H P_EO L;
i f ( $ n %2 = = 0 ) s er ie(f loor ($n/2 ));
e lse se r i e ( $n*3 +1 );
}
e lse e c ho 1, P HP_EO L;
}
se ttype ( $ n ,’ i n te ge r ’ );
e c ho ‘ D i g i te N ‘ ; fsca n f($s td in,” % d ”, $n);
i f ( $ n >0 & & $ n <3 0 0 ) s er ie($n);
e lse e c ho ‘ Valo r f u era d e ra ngo’, P H P_EO L;
?>
REFERENCIAS
BIBLIOGRÁFICAS
01 01
01 01
01
01
Achour, M. A., Betz, F., & Otros. (1 de Diciembre de 2009). Manual de PHP. (P. Cowburn, Editor, &
The PHP Documento Group) Recuperado el 13 de Junio de 2016, de Manual de PHP: http://
php.net/manual/es/index.php
Becerra Santamaría, C. (1992). 380 pincipales funciones en Turbo C++. Bogotá, Colombia: Por
computador LTDA.
626
Becerra Santamaría, C. (2001). Lenguaje C. El nuevo concepto. Bogotá: César Becerra Santa- 627
maría.
Brassard, G., & Paul, B. (1997). Fundamentos de algoritmia. (P. Educación, Ed.) Madrid.
Cajori, F. (2011). A History of Mathematical Notations (Two volumes in one). New York: Casimo
Classics.
Carretero Perez, J., Garcia Carballeira, F., Garcia Sanchez, J. D., Perez Menor, J. M., & Sanchez
Garcia, L. M. (2002). Problemas Resueltos de Programación en Lenguaje C (Paso A Paso).
Madrid: THOMSON PARANINFO, S.A.
Ceballos, F. J. (2013). Java 2. Curso de programación cuarta edición. San Diego, CA, Estados
Unidos de America: alfaomega.
Chazallet, S. (2015). Python 3. los fundamentos del lenguaje. Madrid: Editorial ENI.
Cornell, G. (1999). Visual Basic 6.0: manual de referencia. Madrid: McGraw-Hill Interamerica-
na,.
De Castro Payares, C. A. (12 de Diciembre de 2014). Métodos numéricos básicos para inge-
niería Con implementaciones en Matlab y Excel. Recuperado el 26 de Enero de 2015, de
civilgeeks.com: http://civilgeeks.com/2013/12/11/metodos-numericos-basicos-para-in-
genieria-con-implementaciones-en-matlab-y-excel/
Deitel, H. M., & Deitel, P. J. (2004). C / C++ Y Java. Como programar. Cuarta edición. Mexico:
Perarson educación.
Déléchamp, F., & Laugié, H. (3 de Junio de 2016). Java y Eclipse. Desarrolle una aplicación
con Java y Eclipse. Bacelona, España: Ediciones INE.
Elkner, J., Downey, A. B., & Meyers, C. (21 de Mayo de 2009). Cómo Pensar como un Informá-
Fundamentos de lógica para programación de computadores · Referencias bibliográficas
Guerequeta Garcia, R., & Vallecillo Moreno, A. (2000). Técnicas de diseño de algoritmos.
Malaga, España: Universidad de Malaga. Servicio de Publicaciones e intercambios.
Huertel, O. (2016). PHP 7. Desarrollar un sitio dinámico e interactivo. Bacelona, España: Edi-
ciones ENI.
IEEE. (21 de Enero de 2017). 754-2008 - IEEE Standard for Floating-Point Arithmetic. Obtenido
de IEEE Xplore digital library: http://ieeexplore.ieee.org/document/4610935/
Jara Castro, S., & Peréz Mora, Ó. (2005). Taller de Cómputo. Descubre construyendo. Jalisco ,
Mexico: Ediciones Umbral.
Kevin Tatroe, P. M. (2013). Programming PHP: Creating Dynamic Web Pages. Sebastopo, USA:
O’Reilly Media; 3 edition.
Knuth, R. (1985). El arte de programar ordenadores (obra completa). Bacelona: Editoria re-
veté. S. A.
Marco Gomez, J., Martin Prat, A., Molinero Albareda, X., Vazquez Alcocer, P. P., & Xhafa, F.
(2006). Programación en C++ para ingenieros. Madrid, España: Thomson Ediciones Para-
ninfo, S.A.
Miller, C. D., Heeren, V. E., & Hornsby, J. (2013). Matemáticas: Razonamiento y Aplicaciones
Decimosegunda Edición. México: Pearson educación.
Morris Mano, M. (1994). Arquitectura de computadores tercera edición. Mexico: Prentie Hall
Hispanoamerica S. A.
Powell, T. A., & Schneider, F. (2002). Java Script. Manula de referencia. Madrid, España: S.A.
MCGRAW-HILL / INTERAMERICANA DE ESPAÑA.
Shapiro, J. R. (2003). Visual Basic .NET. Manual de referencia. Madrid: McGraw-Hill / Intera-
mericana de España, S.A.
Skiena, S. S., & Revilla, M. A. (2008). Programming Challenges: The Programming Contest
Training Manual. New York: Springer-Verlag.
Van Rossum, G. (16 de octubre de 2000). Manual de referencia de Python. Obtenido de Ma-
nual de referencia de Python: http://pyspanishdoc.sourceforge.net/ref/ref.html
Vaquero Sanchez, A., & Quieroz Vieyra, G. (1998). Microsoft Visual Basic 6.0 Manuel Del Pro-
gramador. Madid: S.A. MCGRAW-HILL / INTERAMERICANA DE ESPAÑA.
Tutorial: http://www.w3schools.com/php/default.asp
Wachenchauzer, R., Manterola, M., Curia, M., Medrano, M., & Paez, N. (15 de Marzo de 2011).
LibrosWeb. Recuperado el 21 de Octubre de 2016, de LibrosWeb: http://librosweb.es/libro/
algoritmos_python/capitulo_18.html
William Symes, A. (1960). Magic Squares and Cubes. New York: Dover Pubns. 2 Revised edi-
tion.
Zurdo Sainz, D., Gutíerrez Tapia , Á., & Acevedo Quero, F. (2003). Montaje, Configuración
y reperación del PC. Madrid, España: Thomson Paraninfo S. A.