Está en la página 1de 630

F U N DA M E N TO S D E L ÓG I C A PA R A

PROGRAMACIÓN DE
COMPUTADORES
SEGUNDA EDICIÓN

Wilson Mauricio Pimiento Cárdenas


Pimiento Cárdenas, Wilson Mauricio

Fundamentos de lógica para programación de computadores / Wilson Mauricio Pi-


miento Cárdenas. – 3a. Ed. -- Bogotá : Universidad Piloto de Colombia, 2021
629 páginas.
Incluye referencias bibliográficas
ISBN: 9789588957968

PROGRAMACIÓN [COMPUTADORES ELECTRÓNICOS]


LÓGICA [INFORMATICA]
PROGRAMACIÓN LÓGICA
ALGORITMOS

CCD 005.11
SEGUNDA EDICIÓN

FUNDAMENTOS DE LÓGICA PARA

PROGRAMACIÓN DE
COMPUTADORES

Wilson Mauricio Pimiento Cárdenas


UNIVERSIDAD PILOTO DE COLOMBIA

Presidente · Olinto Eduardo Quiñones Quiñones


Rectora · Ángela Gabriela Bernal Medina

Director de Publicaciones y Comunicación Gráfica · Rodrigo Lobo-Guerrero Sarmiento

Director de Investigaciones · Mauricio Hernández Tascón

Coordinador General de Publicaciones · Diego Ramírez Bernal

SECCIONAL DEL ALTO MAGDALENA

Vicerrector Administrativo y Financiero · José Ernesto Bermúdez Rojas

Vicerrector Académico · Henry Alberto Matallana Novoa

Decana del Programa de Ingeniería Financiera · Andrea Mican Silva

Coordinadora de Publicaciones · Karen Estefanía Sarmiento Jiménez

Gestora de Línea de Investigación · Luz Andrea Meneses Ortegón

Primera edición, Bogotá 2019

Autor · Wilson Mauricio Pimiento Cárdenas

ISBN ·978-958-8957-96-8
Diseño · Daniela Martínez Díaz

Corrección de estilo · ccccccccc

© Fundamentos de lógica para programación de computadores ·

La obra literaria publicada expresa exclusivamente la opinión de sus respectivos autores, de

manera que no representan el pensamiento de la Universidad Piloto de Colombia. Cada uno

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

sobre el contenido de esta publicación.


FUNDAMENTOS DE LÓGICA PARA

PROGRAMACIÓN DE
COMPUTADORES

Wilson Mauricio Pimiento Cárdenas


TA B L A D E
CONTENIDO
Introducción 33

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.1. SISTEMA DE NUMERACIÓN 39


1.2. EL TEOREMA FUNDAMENTAL DE LOS NÚMEROS 49
1.3. OPERACIONES ARITMÉTICAS 53
1.3.1 La suma 53

1.3.2. La resta 57

1.3.3. La resta por complemento 59

1.3.4. La multiplicación 62

1.3.5. La división 67

1.4. CONVERSIÓN DIRECTA ENTRE SISTEMAS NUMÉRICOS 72


1.4.1. Conversión directa de números enteros 72

1.4.2. Conversión directa de números con fracciones 74

1.5 EJERCICIOS DE REPASO 81

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

2.1. EL CONCEPTO DE VARIABLE 87


2.2. EL CONCEPTO DE CONSTANTE 90
2.3. LOS TIPOS DE DATOS 91

2.3.1. Datos Numéricos 92

2.3.1.1. Datos de tipo entero 92

2.3.1.1.1. Enteros de 8 bits con signo y magnitud 92

2.3.1.1.2. Enteros de 16 bits con signo y magnitud 93

2.3.1.1.3. Enteros de 32 bits con signo y magnitud 94

2.3.1.2. Datos de tipo real 95

2.3.1.2.1. Representación de datos numéricos reales 95

2.3.1.2.2. Normalización IEEE 754 98


2.3.2. Datos de tipo alfanuméricos 99

2.3.3. Datos de tipo lógico 103

2.4. EL MECANISMO DE ASIGNACIÓN 104

2.4.1. La definición 104

2.4.2. Reglas para dar nombre a los identificadores 104

2.5. OPERADORES 106


2.5.1. Operadores aritméticos 106

2.5.2. Operadores de relación 107

2.5.3. Operadores lógicos 108

2.5.4. Operador de asignación 109

2.6. EXPRESIONES 111


2.6.1 Expresiones aritméticas 113

2.6.1.1. Evaluación de las expresiones aritméticas 114

2.6.1.2. Reglas de Prioridad para evaluar expresiones 114

2.6.2. Evaluación de las expresiones Lógicas 118

2.6.3. Evaluación de las expresiones de cadena 121

2.6.3.1. Concatenación de Cadenas 122

2.6.3.2. Comparación de Cadenas 123

2.6.3.3. Subcadenas 124

2.6.3.4. Longitud 127

2.7. FUNCIONES INTERNAS 127


2.7.1. Funciones internas en lenguaje C 128

2.7.2. Funciones internas en lenguaje Visual Basic 130

2.7.3. Funciones internas en lenguaje Java 132

2.7.4. Funciones internas en lenguaje Python 134

2.7.5. Funciones internas en lenguaje JavaScript 137

2.7.6. Funciones internas en lenguaje PHP 139


2.8. TRADUCCIÓN DE EXPRESIONES 141
2.9. EJERCICIOS DE REPASO 144

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

3.1. DEFINICIÓN DE ALGORITMO 151


3.1.1. Características fundamentales de un programa 154

3.1.2. Componentes fundamentales de un programa 154

3.2. SOLUCIÓN DE PROBLEMAS 155

3.2.1. Problemas secuenciales 155

3.2.2. Descomposición de los problemas


secuenciales 155

3.3. METODOLOGÍA PARA LA CONSTRUCCIÓN DE


PROGRAMAS DE CÓMPUTO 156
3.3.1. PASO 1: Investigación Preliminar 157

3.3.2. PASO 2: Especificación 157

3.3.3. PASO 3: Diseño 158

3.3.4. PASO 4: Prueba de Escritorio 170

3.3.5. PASO 5: Codificación 170

3.3.6. PASO 6: Traducción y Trascripción 170

3.3.7. PASO 7: Pruebas de funcionamiento 172

3.3.8. PASO 8: Documentación 172

3.3.9. Ejemplos del uso de la metodología 172

3.4. CONSTRUCCIÓN Y EVALUACIÓN DE PROPOSICIONES 210


3.5. LAS CONDICIONES EN LA ELABORACIÓN
DE ALGORITMOS 212

3.5.1. Condiciones anidadas 212

3.5.2. Condiciones en línea 221

3.5.3. Selección múltiple 225

3.6. EJERCICIOS DE REPASO 247


CAPÍTULO 4
C I C L O S , A C U M U L A D O R E S Y C O N TA D O R E S 259
4.1. CICLOS 261
4.1.1 Ejemplos de algoritmos con ciclos 262
4.2. ACUMULADORES 292
4.3. CONTADORES 300
4.4. CONCLUSIONES SOBRE CICLOS, CONTADORES
Y ACUMULADOREs 333
4.5. EJERCICIOS DE REPASO 334

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

5.2.2. Asignación de valores dentro de un arreglo 397

5.2.3. Recorrido de un arreglo 398

5.2.4. Imprimir un arreglo 398

5.2.5. Buscar datos en un arreglo 400

5.2.6. Modificar datos en un arreglo 415

5.2.7. Insertar datos a un arreglo 419

5.2.8. Eliminar datos de un arreglo 424

5.2.9. Agregar datos a un arreglo 428

5.2.10. Ordenar los datos de un arreglo 435

5.3. DEFINICIÓN DE MATRICES 440


5.4. OPERACIONES CON MATRICES 444
5.4.1. Creación de una Matríz 444

5.4.2. Asignación de valores dentro de una Matriz 444

5.4.3. Recorrido de una Matriz 445

5.4.4. Imprimir una Matriz 445

5.4.5. Buscar datos en una Matriz 449

5.4.6. Modificar datos en una Matriz 454


5.4.7. Insertar datos en una Matriz 461

5.4.8. Eliminar datos de una Matriz 469

5.4.9. Agregar datos a una Matriz 477

5.4.10. Ordenar los datos de una Matriz 485

5.5. EJERCICIOS DE REPASO 492

CAPÍTULO 6
A L G O R I T M O S M O D U L A R E S 501

6.1. MODULARIZACIÓN 555

6.2. EL ÁMBITO DE LAS VARIABLES 576

6.3. LA ORGANIZACIÓN DE UN ALGORITMO POR MÓDULOS 592

6.4. DECLARACIÓN Y LLAMADO DE MÓDULOS 592

6.5. PARÁMETROS FORMALES Y PARÁMETROS ACTUALES 594

6.6. ALGORITMOS RECURSIVOS 594

6.7. EJERCICIOS DE REPASO 630

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

Tabla 2. Representación simbólica base 10. 40

Tabla 3. Representación simbólica base 8 40

Tabla 4. Representación simbólica base 5 41

Tabla 5. Representación simbólica base 2 41

Tabla 6. Representación simbólica de base 16 41

Tabla 7. Representación simbólica base 23 42

Tabla 8. Equivalencia entre sistemas numéricos 46

Tabla 9. Rango de números enteros con signo en diversos formatos. 95

Tabla 10. Número de precisión simple (32 Bits) 98

Tabla 11. Número de precisión doble (64 Bits) 99

Tabla 12. Representación en Código BCD extendido 99

Figura 19. Representación en código BCD de la letra A. 100

Tabla 13. Representación en Código ASCII a 8 Bits 102

Tabla 14. Operadores Aritméticos 106

Tabla 15. Operadores de relación 107

Tabla 16. Operadores Lógicos 108

Tabla 17. Resultado de la combinación de proposiciones 109

Tabla 18. Prioridad de los operadores aritméticos 114

Tabla 19. Paralelo entre variables aritméticas y algorítmicas. 116

Tabla 20. Prioridad general de los operadores 118

Tabla 21. Funciones en lenguaje C 128

Tabla 22. Procedimiento para el cálculo de algunos datos en C 130


Tabla 23. Funciones en lenguaje Visual Basic 130

Tabla 24. Funciones en lenguaje Java 132

Tabla 25. Procedimiento para el cálculo de algunos datos en Java 134

Tabla 26. Funciones en lenguaje Python 134

Tabla 27. Procedimiento para el cálculo de algunos datos en Python 136

Tabla 28. Funciones en lenguaje JavaScript 137

Tabla 29. Procedimiento para el cálculo de algunos datos en JavaScript 139

Tabla 30. Funciones en lenguaje PHP 139

Tabla 31. Procedimiento para el cálculo de algunos datos en PHP 141

Tabla 32. Traducción de variables 142

Tabla 33. Traducción de la expresión 143

Tabla 34. Traducción de la expresión completa. 143

Tabla 35. Traducción de la expresión 144

Tabla 36. Traducción de la expresión completa 144

Tabla 37. Características de todo algoritmo 154

Tabla 38. Símbolos ANSI para el diseño de diagramas de flujo. 161

Tabla 39. Etapa de especificación - Ejemplo 1 / Capítulo 3. 174

Tabla 40. Etapa de especificación – Ejemplo 2 / Capítulo 3.3. 183

Tabla 41. Etapa de especificación – Ejemplo 3 / Capítulo 3. 199

Tabla 42. Política para el pago de bonificaciones 226

Tabla 43. Política de tarifas de roaming 240

Tabla 44: Etapa de especificación – Ejemplo 1 / Capítulo 4. 264

Tabla 45: Etapa de especificación. Ejemplo 2 / Capítulo 4. 284


Tabla 46: Etapa de especificación. Ejemplo 3 / Capítulo 4. 302

Tabla 47: Etapa de especificación. Ejemplo 4 / Capítulo 4. 310

Tabla 48: Etapa de especificación. Ejemplo 5 / Capìtulo 4. 322

Tabla 49: Etapa de especificación. Ejemplo 5 / Capítulo 4. 464


L I S TA D E
FIGURAS
Figura 1. Conteo para 3 unidades en base 2. 44

Figura 2. Conteo para 4 unidades en base 2. 45

Figura 3. Conteo para 5 unidades en base 2. 45

Figura 4. Conteo para 6 unidades en base 2. 45

Figura 5. Conteo para 7 unidades en base 2. 45

Figura 6. Conteo para 8 unidades en base 2. 46

Figura 7. Conteo en base 10 para 24 unidades. 47

Figura 8. Conteo en base 6 para 24 unidades. 47

Figura 9. Conteo en base 8 para 24 unidades 47

Figura 10. Conteo en base 16 para 24 unidades. 48

Figura 11. Conteo en base 23 para 24 unidades. 48

Figura 12. Conteo en base dos para 24 unidades 48

Figura 13. Esquema de un Sistema de Cómputo.. 88

Figura 14. Descripción de la memoria RAM. 89

Figura 15. Dato almacenado en la RAM del Computador. 90

Figura 16. Representación en RAM de un entero en formato


de signo y magnitud con 8 bits. 93

Figura 17. Descripción en memoria de un dato entero en


formato de signo y magnitud con 16 bits. 94

Figura 18. Descripción en memoria de un dato entero en


representación de signo y magnitud con 32 bits. 94

Figura 19. Representación en código BCD de la letra A. 103

Figura 20. Conformación del binario para la letra A en código ASCII. 111

Figura 21. Descripción del almacenamiento de un dato en memoria RAM. 112


Figura 22. Datos en la memoria RAM del computador. 112

Figura 23. Datos en la memoria RAM del computador. 117

Figura 24. Datos en la memoria RAM del computador. 118

Figura 25. Dato de X cargado en RAM. 119

Figura 26. Dato de X y de Y cargados en RAM. 120

Figura 27. Dato de X, Y y Z cargados en RAM. 120

Figura 28. Resolución de problemas algorítmicos. 156

Figura 29. El algoritmo como una caja negra . 158

Figura 30. División sistemática del proceso. 159

Figura 31. Diagrama de flujo. 160

Figura 32. Compilación de un programa fuente. 171

Figura 33. Primer diagrama de flujo. Ejemplo 1 / Capítulo 3. 174

Figura 34. División de la función de entrada del algoritmo –


Ejemplo 1 / Capítulo 3. 175

Figura 35. División entrada y proceso – Ejemplo 1 / Capítulo 3. 175

Figura 36. Diagrama de flujo con todas las divisiones –


Ejemplo 1 / Capítulo 3. 176

Figura 37. Diagrama resultado de la abstracción - Ejemplo 1 / Capítulo 3 177

Figura 38. Diagrama de flujo para la primera división –


Ejemplo 2 / Capítulo 3. 183

Figura 39. Diagrama de flujo para la segunda división –


Ejemplo 2 / Capítulo 3. 184

Figura 40. Diagrama de flujo para la tercera división –


Ejemplo 2 / Capítulo 3. 184

Figura 41. Diagrama de flujo para la cuarta división –


Ejemplo 2 / Capítulo 3. 185
Figura 42. Diagrama de la abstracción – Ejemplo 2 / Capítulo 3. 186

Figura 43. Diagrama de la ruta que se sigue con los valores


3, 8 y 4. Ejemplo 2 / Capítulo 3 192

Figura 44. Diagrama de la ruta que se sigue con los valores


9, 1 y 7. Ejemplo 2 / Capítulo 3. 192

Figura 45. Diagrama que de la ruta que se sigue con los


valores 1, -5 y 10. Ejemplo 2 / Capítulo 3. 193

Figura 46. Diagrama para la Primera División. Ejemplo 3 / Capítulo 3. 199

Figura 47. Diagrama para la segunda división. Ejemplo 3 / Capítulo 3. 200

Figura 48. Diagrama para la tercera división. Ejemplo 3 / Capítulo 3 200

Figura 49. Diagrama resultado de la abstracción. Ejemplo 3/ Capítulo 3. 201

Figura 50. Datos para el algoritmo- Ejemplo 3 / Capítulo 3. 203

Figura 51. Cálculo de la distancia de C a P. Ejemplo 3 / Capítulo 3 204

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 55. Condiciones anidadas 213

Figura 56. Algoritmo implementado con condiciones anidadas 214

Figura 57. Algoritmo con condiciones lineales 221

Figura 58. DFD del ejemplo 2, Capítulo 3, con condiciones en línea 222

Figura 59. Diagrama para el cálculo de Total a pagar – TAP 226

Figura 60. Diagrama para el número de días del mes dado 233

Figura 61. Diagrama de flujo llamada internacional 240

Figura 62: Diagrama para cálculo de pago neto de un


trabajador – Ejemplo 1 / Capítulo 4. 264
Figura 63: Implementación algoritmo cíclico. Ejemplo 1 / Capítulo 4. 265

Figura 64: Implementación correcta del ciclo. Ejemplo 1 / Capítulo 4. 266

Figura 65: Implementación de ciclos. Ejemplo 1 / Capítulo 4. 268

Figura 66: Diagrama con marcas para cada componente.


Ejemplo 1 / Capítulo 4. 269

Figura 67: Algoritmo que corrige el defecto de los datos


de control. Ejemplo 1 / Capítulo 4. 273

Figura 68: Diagrama numerado para codificar. Ejemplo 1 / Capítulo 4. 274

Figura 69: Algoritmo para el cálculo del peso de un bulto


de arroz según su Humedad Relativa. Ejemplo 2 / Capítulo 4. 284

Figura 70: Algoritmo incluyendo el ciclo. Ejemplo 2 / Capítulo 4. 285

Figura 71: Corrección algoritmo. Ejemplo 2 / Capítulo 4. 285

Figura 72: Algoritmo numerado para la prueba de escritorio.


Ejemplo 2 / Capítulo 4. 286

Figura 73: Estructura de un Ciclo. 291

Figura 74: Instrucción de lectura de datos. 292

Figura 75: Dato almacenado en la memoria. 292

Figura 76: Diseño de una instrucción de Acumulador. 293

Figura 77: Ciclo que maneja un acumulador. 293

Figura 78: Corrección Ciclo que maneja un Acumulador. 294

Figura 79: Ciclo con acumulador para prueba de escritorio. 295

Figura 80: Contenido de las variables después de ejecutar


la instrucción 1. 295

Figura 81: Contenido de las variables después de ejecutar


la instrucción 3. 296

Figura 82: Contenido de las variables después de ejecutar


la instrucción 4. 296
Figura 83: Contenido de las variables después de ejecutar
la instrucción 3 por segunda vez. 297

Figura 84: Contenido de las variables después de ejecutar


la instrucción 4 por segunda vez. 298

Figura 85: Contenido de las variables después de ejecutar


la instrucción 3 por tercera vez. 298

Figura 86: Contenido de las variables después de ejecutar


la instrucción 4 por tercera vez 299

Figura 87: Contenido de las variables después de ejecutar


la instrucción 3 por cuarta vez. 299

Figura 88: Diseño preliminar del problema. Ejemplo 3 / Capítulo 4. 302

Figura 89: Algoritmo para generar una secuencia de números


enteros entre N1 y N2. Ejemplo 3 / Capítulo 4. 303

Figura 90: Algoritmo con los componentes numerados.


Ejemplo 3 / Capítulo 4. 304

Figura 91: Algoritmo para procesar los datos de un estudiante.


Ejemplo 4 / Capítulo 4. 310

Figura 92: Algoritmo modificado para procesar los datos


de los estudiantes. Ejemplo 4 / Capítulo 4. 311

Figura 93: Algoritmo modificado para calcular el promedio


del curso. Ejemplo 4 / Capítulo 4. 312

Figura 94: Diagrama completo. Ejemplo 4 / Capítulo 4. 314

Figura 95: Diagrama modificado para realizar la prueba


de escritorio. Ejemplo 4 / Capítulo 4. 314

Figura 96: Ciclo para el cálculo básico del factorial de


N. Ejemplo 5 / Capítulo 4. 323

Figura 97: Algoritmo que tiene en cuenta los valores negativos.


Ejemplo 5 / Capítulo 4. 323

Figura 98: Algoritmo para el Factorial de un número.


Ejemplo 5 / Capítulo 4. 324
Figura 99: Diagrama numerado para la prueba de escritorio.
Ejemplo 5 / Capítulo 4. 325

Figura 100: Diagrama de flujo de datos. 333

Figura 101: Diagrama de flujo con dato centinela. 334

Figura 102. Variables para almacenar las ventas de la semana 348

Figura 103: Variables acomodadas para ser manejadas


por un solo nombre. 348

Figura 104: Subíndices de los arreglos. 349

Figura 105: Almacenar un valor en Ventas(2). 350

Figura 106: Datos después de ejecutada la instrucción 1. 350

Figura 107: Datos después de ejecutada la instrucción 2. 351

Figura 108: Datos después de ejecutada la instrucción 3. 351

Figura 109: Datos después de ejecutada la instrucción 4. 352

Figura 110: Datos después de ejecutada la instrucción 5. 352

Figura 111: Datos después de ejecutada la instrucción 6. 352

Figura 112. Algoritmo que llena un arreglo. 354

Figura 113. Algoritmo que llena un arreglo y lo imprime. 355

Figura 114. Representación de un ciclo con una estructura

Para-desde-hasta.me. 356

Figura 115: Representación de un ciclo con una estructura


Para-desde-hasta. 356

Figura 116: Representación de un ciclo con una estructura


para-desde-hasta compacta. 356

Figura 117: Llenado e impresión de un arreglo con ciclos


Para-Desde-Hasta. 357

Figura 118: Operaciones de llenado y búsqueda. 357


Figura 119: Diagrama modificado para adelantar la prueba de escritorio. 358

Figura 120: Modificación al algoritmo de la figura 119. 361

Figura 121: Diagrama corregido para la prueba de escritorio. 362

Figura 122: Algoritmo que llena y permite modificar el contenido


de un arreglo. 373

Figura 123: Algoritmo que llena un arreglo y permite insertar


datos al mismo. 377

Figura 124: : Algoritmo para eliminar dato de un arreglo. 381

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 127: Algoritmo para ordenar un arreglo. 392

Figura 128: Recorrido para llenar o cargar una matriz. 402

Figura 129: Algoritmo para llenar e imprimir una matriz. 403

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 136 Primera parte del algoritmo para agregar


datos a una matriz. 434

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 139: Algoritmo modular genérico. 462

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 145: Algoritmo para Generar el Triángulo de Pascal



con la función de Proceso demarcado 469

Figura 146: Módulo función para calcular el factorial del número


N pasado como parámetro. 470

Figura 147: Módulo que implementa la Función Básica de Proceso


del algoritmo del Triángulo de Pascal. 471

Figura 148: El Algoritmo del Triángulo de Pascal rediseñado


modularmente. 472

Figura 149: Variables definidas por el módulo principal del programa. 484

Figura 150: Definición de espacios de memoria por los


módulos Command1_Click y Definir_N_Filas. 486

Figura 151: Contenido de la memoria RAM antes de ejecutar la


Instrucción 18 del programa. 486

Figura 152: Contenido de la RAM después de ejecutar la instrucción 18. 487

Figura 153: Definiciones hechas con el llamado al módulo


de Generar_Triangulo. 488

Figura 154: Ámbitos de trabajo definidos para cada uno de


los módulos invocados. 489

Figura 155: Devolución del resultado de la función Factorial. 489

Figura 156: Contenido de la memoria antes de ejecutar


la instrucción 25. 490

Figura 157: Contenido de la memoria RAM ante de ejecutar la


instrucción 33 del programa. 490

Figura 158: Contenido de la RAM después ejecutada la instrucción 33. 491

Figura 159: Ámbitos de trabajos definidos al ejecutarse


la instrucción 34. 491
Figura 160: Ámbito de trabajo del módulo principal antes
de ejecutar la instrucción 6. 492

Figura 161: Algoritmo modular para el cálculo del Factorial


NO recursivo. 501

Figura 162: Módulo del Factorial rediseñado con recursividad. 501

Figura 163: Algoritmo para el cálculo del Factorial por recursividad. 502

Figura 164: Ámbito de trabajo para el módulo principal. 504

Figura 165: Ámbitos de trabajo para los módulos Principal


y de Entrada .504

Figura 166: Valor digitado y almacenado en N del módulo


Entrada_Numero después de ejecutada
la instrucción 13. 504

Figura 167: Valor transferido de un módulo a otro. 505

Figura 168: Contenido de la memoria del computador antes


de ejecutar la instrucción 4. 505

Figura 169: Contenido de la memoria después de ejecutada


la instrucción 17. 505

Figura 170: Contenido de la memoria después de ejecutada


la instrucción 17 por segunda vez. 506

Figura 171: Contenido de la memoria después de ejecutada


la instrucción 17 por tercera vez. 506

Figura 172: Contenido de la memoria después de ejecutada


la instrucción 17 por cuarta vez. 507

Figura 173: Contenido de la memoria después de ejecutada


la instrucción 19 por primera vez. 507

Figura 174: Contenido de la memoria después de ejecutada


la instrucción 20 por primera vez. 508

Figura 175: Contenido de la memoria después de ejecutada


la instrucción 25 por primera vez. 508
Figura 176: Contenido de la memoria después de ejecutada
la instrucción 22 del ámbito tres. 509

Figura 177: Contenido de la memoria después de ejecutada


la instrucción 23 del ámbito tres. 509

Figura 178: Contenido de la memoria después de ejecutada


la instrucción 25 del ámbito tres. 510

Figura 179: Contenido de la memoria después de ejecutada


la instrucción 22 del ámbito dos. 510

Figura 180: Contenido de la memoria después de ejecutada


la instrucción 23 del ámbito dos. 511

Figura 181: Contenido de la memoria después de ejecutada


la instrucción 25 del ámbito dos. 511

Figura 182: Contenido de la memoria después de ejecutada


la instrucción 22 del ámbito uno. 511

Figura 183: Contenido de la memoria después de ejecutada


la instrucción 23 del ámbito uno. 512

Figura 184: Contenido de la memoria después de ejecutada


la instrucción 5 del ámbito de trabajo Principal. 512

Figura 185: Contenido de la memoria después de ejecutada


a instrucción 26 del ámbito de Mostrar_Factorial. 512

Figura 186: Algoritmo recursivo para la serie de Fibonacci. 518

Figura 187: Ámbito definido por el programa después de


ejecutada la instrucción 3. 520

Figura 188: Memoria del computador después ejecutada


la instrucción 13. 521

Figura 189: Memoria del computador después de ejecutada


la instrucción 18. 521

Figura 190: Memoria del computador después ejecutada


la instrucción 4. 522

Figura 191: Memoria del computador después de ejecutada


la instrucción 21. 522
Figura 192: Memoria del computador después de ejecutada
la instrucción 24. 523

Figura 193: Memoria del computador después de ejecutada


la instrucción 21 por segunda vez. 523

Figura 194: Memoria del computador después de ejecutada


la instrucción 24 por segunda vez. 524

Figura 195: Memoria del computador después de ejecutada


la instrucción 21 por tercera vez. 524

Figura 196: Memoria del computador después de ejecutada


la instrucción 24 por tercera vez. 525

Figura 197: Memoria del computador después de ejecutada


la instrucción 21 por cuarta vez. 525

Figura 198: Memoria del computador después de ejecutada


la instrucción 24 por cuarta vez. 526

Figura 199: Memoria del computador después de ejecutada


la instrucción 21 por quinta vez. 527

Figura 200: Memoria del computador después de ejecutada


la instrucción 27 por primera vez. 528

Figura 201: Memoria del computador después de ejecutada


la instrucción 27 por segunda vez. 528

Figura 202: Memoria del computador después de ejecutada


la instrucción 27 por tercera vez. 529

Figura 203: Memoria del computador después de ejecutada


la instrucción 27 por cuarta vez. 529

Figura 204: Memoria del computador después de ejecutada


la instrucción 28 por quinta vez. 530
INTRODUCCIÓN
01
01
Este libro presenta al lector, de manera muy sencilla, y detallada, los fundamentos
de la lógica para la programación de computadores desde un enfoque gráfico más
que desde la perspectiva de la escritura de las instrucciones que constituyen un
algoritmo o programa de computador. Trata de los primeros conocimientos que todo
programador de computadores debe comprender y dominar, para que, usando los
elementos necesarios en la elaboración de algoritmos, pueda después convertirlos
en programas de cómputo.

El fundamento de la programación de computadores está sustentado en la ciencia


y arte de la algoritmia, que no es otra cosa que la ciencia que estudia la resolución
sistemática de problemas de cualquier índole. Desde esta perspectiva, los algoritmos
no son sino un conjunto de especificaciones detallas de las actividades o pasos ne-
cesarios para llevar a cabo una tarea. Por ejemplo, cuando se realiza una suma o una
resta, se está ejecutando un algoritmo, una receta de cocina es un algoritmo, nn la
liquidación que una empresa hace a un trabajador por los servicios prestados, se eje-
cuta un algoritmo. Aunque el lector no tenga experiencia en la programación de com-
putadores, es evidente que su vida cotidiana está plagada por la ejecución de algoritmos y
todas las labores y tareas que realiza conllevan la ejecución consciente e inconsciente de
un algoritmo (Brassard & Paul, 1997).

El estudio de la aplicación de la computación a los diversos campos del quehacer del


hombre ha permitido desarrollar un conjunto de modelos matemáticos que permitieron
la definición de algoritmos ejecutables por dichos computadores. La construcción de pro-
gramas para computadores es determinada, no solo por los algoritmos que lo componen,
sino por factores externos a ellos que imponen limitaciones. Los lenguajes de progra-
mación, las características mismas de los computadores, los datos e información a ser
tratados y el cálculo numérico, son algunos ejemplos de estas limitaciones. Por lo tanto,
la algorímica busca formas estéticas para la realización de programas que den cuenta de
estas características limitantes y que permita dar soluciones eficientes a los problemas en
los que se aplica la comutación.
Fundamentos de lógica para programación de computadores · Introducción

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 aporte fundamental que esta obra presenta está centrado en la enseñanza de la


programación de computadores desde una perspectiva de la administración y manejo los
datos que cualquier computadora hace en su memoria RAM. Es decir, comprender que un
programa de computador no es más que un conjunto de instrucciones que administran
adecuada y eficientemente los datos que el computador tiene registrados en su memoria
en un momento dado. En este sentido, el esfuerzo de esta obra está dirigido a mostrar
esquemas gráficos de la forma como el computador manipula los datos almacenados en
su memoria RAM o memoria principal del computador.

La idea central del libro consiste en ir mostrando lo más detalladamente posible la


secuencia de esquemas gráficos que representan las instrucciones que componen un
algoritmo o programa e ir haciendo la descripción de los efectos que causan dichas ins-
trucciones en los datos registrados en la RAM. Se tiene especial cuidado en presentar los
resultados que cada instrucción del algoritmo va obteniendo con el propósito de que el
lector vea y tome conciencia de cómo es que internamente la computadora opera sobre
los datos. Entender esto, desde la perspectiva del autor de esta obra, es la clave para
aprender a programar computadores. Esta idea central se desarrolla a través de muchos
ejemplos y ejercicios resueltos que el lector puede ir estudiando.

Con este libro el lector va progresando en el aprendizaje de la programación de com-


putadores a medida que va transitando por cada uno de los capítulos que lo componen.
En consecuencia, la organización del material en el libro, van desde la compresión de los
fundamentos matemáticos que dieron lugar a cómo es que el computador cuenta, hasta
la resolución de problemas mediante la construcción de algoritmos.

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.

El capítulo dos expone los fundamentos conceptuales sobre la construcción de algoritmos


o programa de computador desde la perspectiva del manejo de los datos en la RAM. Trata
temas como variables, constantes, operadores, expresiones y funciones internas. También pre-
senta el proceso de traducción de las expresiones aritméticas a algorítmicas y viceversa.

El capítulo tres desarrolla la fundamentación de la algoritmia como pilar en la cons-


trucción de programas de computación, por lo que incluye temas como el concepto de
algoritmo, sus características y componentes, tipificación de problemas, una metodología
para el desarrollo de programas de computador, la representación de los algoritmos o 34
programas de computador por medio de seudocódigo o de diagramas de flujo. 35
El capítulo cuatro, con base en los elementos trabajados en los capítulos que lo pre-
ceden, muestra muy detalladamente la aplicación de procesos iterativos en la resolución
de problemas mediante el uso de algoritmos o programas de computador. Incluye temas
sobre ciclos, acumuladores y contadores.

El capítulo cinco, desarrolla los conceptos de arreglos y matices como aplicaciones


particulares para el procesamiento de grandes volúmenes de información. Se presentan
algoritmos para la manipulación de datos con arreglos y con matrices.

El sexto y último capítulo, presenta los conceptos de la recursividad como elemento de


la algoritmia para la resolución de problemas computacionales.

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

Diferenciar los sistemas de numeración como


fundamento para las operaciones matemá-
ticas básicas en sistemas de numeración
diferentes al de base 10.

1.1. SISTEMA DE NUMERACIÓN 38


Las matemáticas son un cuerpo de conocimientos ordenados que ha faci- 39
litado al ser humano explicar y comprender de manera clara y precisa muchos
fenómenos naturales y a partir de este conocimiento, crear otras realidades
artificiales. Este entendimiento ha permitido el desarrollo tecnológico y por
ende la construcción de máquinas como el computador, el cual ha revolu-
cionado nuestro conocimiento y nuestro modo de actuar frente a la vida. En
términos concretos un computador es una máquina que mediante modelos
matemáticos logra realizar un sinnúmero de tareas y actividades. Dichos mode-
los tienen como conocimiento base los sistemas numéricos, en consecuencia,
comprender el funcionamiento del computador es comprender los sistemas
de numeración o sistemas numéricos (Bautista Marugan, 2015).

Los sistemas de numeración son un conjunto de símbolos y reglas que se


utilizan para la representación de cantidades o datos numéricos y a partir de
ellos poder establecer conteos o hacer cuentas. Un sistema de numeración
se caracteriza fundamentalmente por la base numérica, definida como el
número de unidades que conforman el grupo de referencia para establecer
adecuadamente el conteo y la representación de las cantidades. El grupo
base es el que le da el nombre al sistema de numeración: si el grupo base
es de 10 unidades el sistema numérico se denomina decimal, si el grupo
base es de dos unidades se llama sistema binario, si el grupo base es de ocho unidades
el sistema numérico es el octal, si el grupo base es de 16 unidades es el sistema numérico
hexadecimal y así sucesivamente (Andonegui Zabala, 2007).

Si se quiere contar utilizando el sistema decimal (agrupando de a 10 unidades), enton-


ces para cada subgrupo que se puede conformar, desde el subgrupo de ninguna unidad
hasta el subgrupo de nueve unidades, se necesitará una representación simbólica o un
símbolo para cada uno de ellos. En concordancia con lo planteado por Florian Cajori en
A Histrory of Mathematical Notations, publicada por primera vez en 1928 y reimpresa por
Casimo Classics en 2011, una manera de representar cada subgrupo es tomar la cantidad
de elementos y hacer un gráfico que contenga el número de ángulos de acuerdo a la can-
tidad de unidades del subgrupo que se va a representar (Cajori, 2011). Para el subgrupo en
donde no hay ninguna unidad, éste se representará por un círculo. Esta representación se
muestra a continuación en la tabla 1:
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos

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):

Tabla 2. Representación simbólica base 10.

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):

Tabla 3. Representación simbólica base 8

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:

Tabla 4. Representación simbólica base 5

Cantidad de unidades por Cero o


Una Dos Tres Cuatro
subgrupo ninguna
Símbolo 0 1 2 3 4

Los símbolos para el sistema numérico con grupo base de dos unidades se ven en la tabla 5:

Tabla 5. Representación simbólica base 2

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:

Tabla 6. Representación simbólica de base 16

Cantidad de Unidades por subgrupo Símbolo 40


Cero o ninguna 0 41
Una 1
Dos 2
Tres 3
Cuatro 4
Cinco 5
Seis 6
Siete 7
Ocho 8
Nueve 9
Diez A
Once B
Doce C
Trece D
Catorce E
Quince F

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).

Tabla 7. Representación simbólica base 23

Cantidad de unidades por subgrupo Símbolo


Cero 0
Una 1
Dos 2
Tres 3
Cuatro 4
Cinco 5
Seis 6
Siete 7
Ocho 8
Nueve 9
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos

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:

0 � Cantidad de símbolos � Grupo base – 1

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.

Si se quiere simbolizar la cantidad de 3 unidades se conforma un grupo de 2 unidades


y otra unidad adicional, como se muestra en la figura 1, por lo que se escribe 11.

Figura 1. Conteo para 3 unidades en base 2.


Cuando se quiere simbolizar la cantidad de 4 unidades se hacen dos grupos cada uno
de dos unidades, es decir, un grupo conformado por 2 subgrupos y cada uno de estos sub-
grupos conformado por 2 unidades, esto es: 1 grupo de 4 unidades, 0 grupos de 2 unidades
y 0 unidades adicionales, lo que se escribe 100. (Ver figura 2).

Figura 2. Conteo para 4 unidades en base 2.

Para representar 5 unidades se forma un grupo de 4 unidades (conformado por dos


subgrupos de dos unidades cada uno), no hay ningún grupo de 2 unidades y hay una uni-
dad adicional, esto es 101 que es la representación de 5 unidades. (Ver figura 3).

Figura 3. Conteo para 5 unidades en base 2. 44


45
Para representar 6 unidades se agrupan 4 unidades (conformado por dos subgrupos
de dos unidades), un grupo de 2 unidades y ninguna unidad adicional, esto es 110. (Ver
figura 4)

Figura 4. Conteo para 6 unidades en base 2.

El conteo para la cantidad de 7 unidades será un grupo de 4 unidades (conformado


por dos subgrupos cada uno de dos unidades), un grupo de 2 unidades y una unidad adi-
cional, es decir, 111: (Ver figura 5)

Figura 5. Conteo para 7 unidades en base 2.


La representación de 8 unidades es: un grupo conformado por 2 subgrupos donde cada
uno está formado por 4 unidades agrupadas de a 2 unidades. La representación se hará por
medio de un grupo de 8 unidades sin ningún grupo adicional de 4 unidades, ningún grupo
de 2 unidades y ninguna unidad adicional, es decir, 1000. De esta forma se van conformado
grupos y subgrupos para todo. (Ver figura 6)

Figura 6. Conteo para 8 unidades en base 2.

Un comparativo de la equivalencia entre los sistemas numéricos de diferentes bases


Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos

se presenta a continuación: (Ver tabla 8).

Tabla 8. Equivalencia entre sistemas numéricos

Base 10 Base 8 Base 16 Base 2


Base 6 Base 23
Decimal Octal Hexa. Binario
Decimal Base 6 Base 8 0 0 0
Octal Base 16 1 1 1 1
Hexa. Base 23 Base 2 2 2 10
Binario 3 3 3 3 11
4 4 4 4 4 100
5 5 5 5 5 101
6 10 6 6 6 110
7 11 7 7 7 111
8 12 10 8 8 1000
9 13 11 9 9 1001
10 14 12 A A 1010
11 15 13 B B 1011
12 20 14 C C 1100
LLa tabla 8 muestra, por ejemplo, que el 24 en base 10 es equivalente a: 40 en base 6,
30 en base 8, 18 en base 16, 11 en base 23 y 11000 en base 2. Cada uno representa la misma
cantidad de unidades, pero agrupadas de diferente forma.

Se presenta a continuación la forma gráfica de la conformación de los grupos según


la base. Para el comparativo de la tabla 8 en la fila resaltada que corresponde con las 24
unidades, se tiene entonces, que en base 10 se pueden hacer 2 grupos de 10 y 4 unidades
adicionales. Gráficamente se puede ver la agrupación de la siguiente manera. (Ver figura 7):

Figura 7. Conteo en base 10 para 24 unidades.

Ahora, 24 unidades representadas en base 6, se hace formando 4 grupos de 6 y 0 unida-


des adicionales. Gráficamente (ver figura 8) se verá así:

46
47

Figura 8. Conteo en base 6 para 24 unidades.

Para la base 8 se hacen 3 grupos de 8 y 0 unidades adicionales. Su representación gráfica


es la siguiente (Ver figura 9):

Figura 9. Conteo en base 8 para 24 unidades


PPara la base 16 se puede hacer uno grupo de 16 y 8 unidades adicionales y de forma
gráfica se verá así:

Figura 10. Conteo en base 16 para 24 unidades.

Para la base 23 se puede hacer un grupo de 23 y una unidad adicional. Su represen-


tación gráfica es:
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos

Figura 11. Conteo en base 23 para 24 unidades.

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):

Figura 12. Conteo en base dos para 24 unidades


1.2. EL TEOREMA FUNDAMENTAL DE LOS NÚMEROS

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:

2 · 104 + 6 · 103 + 5 · 102 + 9 · 101 + 4 · 100 + 7 · 10-1 + 8 · 10-2 + 1 · 10-3

La suma de este polinomio da como resultado el valor 26594.781. En donde el conjunto


de coeficientes es 2, 6, 5, 9, 4, 7, 8 y 1. La base del sistema es 10. Aquí n es igual a 4 ya que 48
la cantidad de coeficientes de la parte entera (potencias positivas desde cero) son cinco 49
(26594), pero como se cuenta desde cero entonces sería n = 5 - 1, es decir, que da 4, en
tanto m es igual a –3 ya que la cantidad de coeficientes de la parte fraccionaria (potencias
negativas desde cero sin incluirlo) es tres, esto es 0.781. Como se aprecia, en el conjunto
de coeficientes no hay ningún símbolo superior a 9 dado que la base del sistema es 10, lo
que supone que el conjunto de coeficientes serán valores del intervalo [0,9]. El modo para
identificar en qué sistema numérico está escrita una cantidad es colocando un subíndice
al final de número. Un ejemplo es el siguiente:

26594.78110

En otro caso, si se quiere representar en sistema numérico base 5 el valor 321.4411


como un polinomio sería:

3 · 52 + 2 · 51 + 1 · 50 + 4 · 5-1 + 4 · 5-2 + 1 · 5-3 + 1 · 5-4

En este polinomio n es igual a 2, m es igual a –4 y la base de sistema es 5. El conjunto


de coeficientes que se puede usar está dado por el intervalo [0,4].

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

De igual forma, sumando el polinomio, se puede convertir el valor 12ADC2E.9BF16 de


base 16 a base 10, de la siguiente forma:

1 · 162+ 2 · 165 + A · 164 + D · 163 + C · 162 + 2 · 161 + E · 160 + 9 · 16-1


Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos

+ 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:

1 · 166 + 2 · 165 + A · 164 + D · 163 + C · 162 + 2 · 161 + E·16 0


14 · 1 = 14

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.

Si se quiere revertir el proceso, es decir, convertir un número escrito en base 10 a uno en


cualquier base, el procedimiento consta de dos pasos.

· 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.

A continuación, se observa un segundo ejemplo en el que se convierte el número 2410


a su equivalente en base dos:

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

Por último, un tercer ejemplo: convertir 19586094.60913085937510 a su equivalente en


Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos

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

Luego la parte entera de 1958609410 es equivalente a 12ADC2E16.

Ahora se debe convertir la parte fraccionaria del número multiplicando sucesivamente


por 16, de esta forma:

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.

1.3. OPERACIONES ARITMÉTICAS

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

Supóngase que se quiere sumar 2 cantidades en el sistema base 5; se procede así:

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

La suma de la segunda columna da 4, como no es superior a la base, se resta cero y


no se suma uno a la columna siguiente. Se plantea en consecuencia:
1
3 1 4 2 3 1 1 2
+ 4 4 2 3 2 4
4 6
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos

-0 -5
4 1

El mismo procedimiento se aplica a la columna 3 del modo siguiente:


1
3 1 4 2 3 1 1 2
+ 4 4 2 3 2 4
4 4 6
-0 -0 -5
4 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

En la octava columna se obtiene 3, se resta cero y no se suma nada a la siguiente columna:


1 1 1 1
3 1 4 2 3 1 1 2
+ 4 4 2 3 2 4

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

El mismo procedimiento se puede utilizar para sumar en cualquier sistema numérico.


Aplicándolo a la siguiente suma en base 18 será:

H C A 1 B E 9 C
+ 9 8 4 D F G H

Las equivalencias para los números después de 9 en el sistema base 18 son:

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

En conclusión, la suma da:


H C A 1 B E 9 C
+ 9 8 4 D F G H

1 0 4 0 6 7 C 8 B

En el sistema base 10 el procedimiento es el mismo y es, en términos generales, el


procedimiento usual para la suma. Un ejemplo de una suma en el sistema de numeración
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos

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

En conclusión, la suma da:

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

En la primera columna se debe sumar 5 más 2, lo que da 7. A esta suma si se le puede


restar 4, quedando como resultado en consecuencia 3, así:

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

Así, el resultado de la resta es el que se muestra a continuación:

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).

A partir del siguiente ejemplo se explicará el procedimiento ya generalizado. Supónga-


se el número 5643210 al que se le quiere calcular el complemento a la base. Entonces la
base es 10. Para calcular el complemento se examina el número de derecha a izquierda,
con lo que se toma el 2 de la extrema derecha y se verifica cuánto le falta a 2 para ser la
base, es decir, cuánto le falta para ser 10. En este caso a 2 le falta 8 para ser 10, luego el
primer componente del número complemento es 8.

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

3 Cuánto le falta para ser 9 6

4 Cuánto le falta para ser 9 5

6 Cuánto le falta para ser 9 3

5 Cuánto le falta para ser 9 4

Luego el complemento a la base de 56432 es 43568.

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 Cuánto le falta para ser 9 6

4 Cuánto le falta para ser 9 5

6 Cuánto le falta para ser 9 3

5 Cuánto le falta para ser 9 4

Luego el complemento a la base menos uno (complemento a 9) de 56432 es 43567.

Para efectuar una resta utilizando el complemento se debe tomar el sustraendo y se


le calcula el complemento, ya sea el de la base o el de la base menos uno. La resta se
realiza sumando el minuendo y el complemento del sustraendo. El valor de la extrema
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos

izquierda no se debe tener en cuenta para la respuesta. Aplicando el procedimiento en un


ejemplo sería restar en base 5 los siguientes valores:

3 1 4 2 3 1 1 2
- 4 4 1 3 2 4

Se procederá de este modo: el minuendo es 314231125 y el sustraendo es 4413245. La base


es 5, luego se debe calcular el complemento a la base del sustraendo, esto es: el comple-
mento a 5 de 00441324 es 44003121. Hay que notar que a 441324 se le sumaron dos ceros al
lado izquierdo con el propósito de completar la cantidad de cifras para que el valor tenga las
mismas del minuendo. Luego se deben sumar los siguientes valores para calcular la resta,
así:El proceso de suma en base 5 se efectúa den seguida:

3 1 4 2 3 1 1 2
+ 4 4 0 0 3 1 2 1

El proceso de suma en base 5 se efectúa en seguida:

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

Luego la suma es:

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

El procedimiento para sumar en base 5 es:


1 1 1
3 1 4 2 3 1 1 2
+ 4 4 0 0 3 1 2 0
1 8 5 4 3 6 2 3 2
-0 -5 -5 -0 -0 -5 -0 -0 -0
1 3 0 4 3 1 2 3 2

Luego, la suma en consecuencia dará como resultado:

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

Del procedimiento se obtiene que la resta o diferencia por complemento a la base


menos uno de los dos valores es 304302335. Se puede concluir que para realizar una resta
usando el complemento a la base menos uno (complemento a 4 en el ejemplo) se debe
hacer una doble suma.
1.3.4. La multiplicación

Como en las operaciones anteriores, cuando se trata de multiplicar se procede igual a


como se hace normalmente en base 10, simplemente se tiene en cuenta el sistema numé-
rico que se está utilizando:

1 3 C F 8
* 3 E A

Para el ejemplo, la base del sistema es 16. Se comienza multiplicando A * 8. Como


en base 16 A es igual a 10, entonces lo que se está multiplicando es 10 * 8 dando como
resultado 80. Esta multiplicación se hace en el sistema de base 10 entonces, hay que
convertir el resultado de la multiplicación a base 16:

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

Ahora se debe multiplicar A * F. Como A es 10 y F es 15 en la base 16. La multiplicación de 10


* 15 = 150 en base 10. De la multiplicación anterior se llevaba 5 entonces 150 + 5 = 155. La conver-
sión de 15510 a base 16 es 9B16. Luego en el planteamiento de la multiplicación se escribe

9 5
1 3 C F 8
* 3 E A

B 0

A continuación, se debe multiplicar A * C. A = 10 y C = 12, entonces 10 * 12 = 120. 120 más


9, de la multiplicación anterior, da 129. La conversión de 12910 es 8116. En el planteamiento
se escribirá:
8 9 5
1 3 C F 8
* 3 E A

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

La siguiente multiplicación es A * 1, 10 * 1 = 10, más 2 que se lleva de la multiplicación


anterior, entonces da 12 y la conversión de 1210 es C16. Como resultado:

2 8 9 5
1 3 C F 8
* 3 E A

C 6 1 B 0

Entonces la multiplicación por A da:

1 3 C F 8
* 3 E A

C 6 1 B 0

Al igual que se hizo con A, y de acuerdo al procedimiento regular de la multiplicación,


pasamos ahora a multiplicar por E, obteniendo:
62
3 B D 7 63
1 3 C F 8
* 3 E A

C 6 1 B 0
1 1 5 5 9 0

Ahora se debe multiplicar por 3, de lo cual se obtiene:

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

Pasamos ahora a un nuevo ejemplo en el que se busca la multiplicación de 31200103


* 3021 en base 4:

Se comienza por multiplicar 1, lo que da:

3 1 2 0 0 1 0 3
* 3 0 2 1

3 1 2 0 0 1 0 3

Ahora al multiplicar por 2 el primer factor. Se procede multiplicando 2 * 3 lo que da 6 y


al convertirlo a base 4 queda 22 y escribiendo en el planteamiento de la multiplicación que-
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos

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

Se multiplica ahora 2 * 0 lo que da 0. Como en la multiplicación anterior se llevaban 2,


entonces se suma a cero, dando nuevamente 2, quedando como se muestra a continuación:

2
3 1 2 0 0 1 0 3
* 3 0 2 1

3 1 2 0 0 1 0 3
2 2

Sigue la multiplicación de 2 * 1 = 2 que al convertirlo da el mismo 2, entonces:


2
3 1 2 0 0 1 0 3
* 3 0 2 1

3 1 2 0 0 1 0 3
2 2 2

Las dos siguientes multiplicaciones son por cero y quedarían:

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

La siguiente multiplicación es 2 * 3 = 6 más 1 de la multiplicación anterior da 7 y convertido


a base 4 es 13, en consecuencia, se escribe de esta forma:

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

Ahora 3 * 0 = 0 más 2 que se lleva da 2 y al convertirlo da igual. El planteamiento se


escribe en seguida:
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 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

A continuación, se multiplica 3*1 que da 3 y más uno de la multiplicación anterior da


4 que al convertirlo queda 10. En el planteamiento es el siguiente:

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

Luego se multiplica 3 * 3 que es 21 en base 4, más uno de la columna anterior da 22.


Se observa entonces:

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

Con lo que se concluye la multiplicación de 31200103 * 3021, da como resultado


22301200223, todo en el sistema de numeración base 4.

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

Efectuando la resta en base 21 se obtendrá:


Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos

0 21
1 2 K J
- F H 5

0 8 3 E

Luego en el planteamiento de la división, es el siguiente:

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

Como se sigue haciendo la resta escrita en el planteamiento, se aprecia claramente


que no se puede restar, dado que 860D es mayor a 83E4. Como no se puede restar, se con-
cluye que B21 no es el segundo número del cociente, por lo tanto, hay que disminuir en uno
a B21, lo que da A21. Con A en vez de B en el cociente de la división, el planteamiento queda:

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

Luego en el planteamiento de la división se escribe:

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

Luego en el planteamiento de la división esta diferencia se escribe de este modo:

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

A continuación, se procede a multiplicar en base 21 FH5 * I. Esta multiplicación da


DBG621, valor que se escribe en la división como a continuación se observa:

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

1.4. CONVERSIÓN DIRECTA ENTRE SISTEMAS NUMÉRICOS

Hasta ahora se ha descrito la manera de convertir números de cualquier base a base 10 y


de base 10 a cualquier otra base usando para esto el teorema fundamental de los núme-
ros. Con este procedimiento se puede tomar un número, dígase de base 16, y si se quiere
pasar a base 11, entonces se pasa el número primero a base 10 y después el número ya
en base 10 se pasa a base 11, sin embargo, hay una manera de convertir directamente de
una base a otra sin tener que pasar primero por la base 10.

1.4.1. Conversión directa de números enteros

El método consiste en realizar los siguientes pasos:

Se identifica la base del número que se quiere convertir como base origen.

Se identifica la base a la que se quiere convertir el número como base destino.

Se convierte la base destino al sistema numérico de la 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

tema numérico base 3, de esta forma:

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

Los residuos tomados del último al primero son:

11 20 0

Hay que convertir estos números al sistema numérico de destino, así:

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

Luego 4608 es igual 1020213. Concluye con esto la conversión.

1.4.2. Conversión directa de números con fracciones

El procedimiento consiste en ejecutar los siguientes pasos:

Se identifica la base del número que se quiere convertir como base origen.

Se identifica la base a la que se quiere convertir el número como base destino.

Se convierte la base destino al sistema numérico de la 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.

A continuación, se aplica el procedimiento en el siguiente ejemplo. Convertir la frac-


ción 0.86419 a su equivalente en base 23. Se escribe de este modo:

0.86419 ( )23

LLo primero que se determina es que el sistema numérico de origen es de base 9 y el


sistema numérico de destino es de base 23, luego hay que convertir el número 23 a su
equivalente en base 9. Para hacer esto se divide 23 por 9, del modo siguiente:

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

El cálculo de este resultado se consigue operando de la siguiente manera::

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

Entonces 2010 es igual 229, lo que se anota en la multiplicación de la siguiente manera:

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

A continuación, se deben adelantar las multiplicaciones por 2, se comienza multipli-


cando 2 por 1 que da 210 y al convertirlo a base 9 da 29, luego se multiplica 2 por 4 que da
810 y al convertirlo da 89. Anotando el resultado que se tiene es:

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.

Con lo que se concluye que la multiplicación en base 9 de 0.8641 * 25 es igual a 24.24459.


A la respuesta de esta multiplicación se le quita la parte entera y se obtiene una nueva frac-
ción, 0.24459, con la que se vuelve a multiplicar. Así se sigue multiplicando las fracciones re-
sultantes hasta calcular una cifra significativa de números como se muestra a continuación:

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

La conversión de las otras partes enteras de los resultados de las multiplicaciones se


calcula así:

6 da: 6*90 = 6*1 = 6 = 6 es decir 623


Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos

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

En conclusión 0.86419 es equivalente a 0.M68MELCHM623.

Otro ejemplo, y a manera de prueba, consiste en convertir la fracción 0.M68MELCHM623


a base 9, esto es:

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

Como la multiplicación se debe adelantar en base 23, que es el sistema numérico de


origen, se procede en consecuencia a multiplicar 9 * 6, lo que da 5410. Ahora se debe conver-
tir 5410 a base 23, dividiendo por 23:

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

Ahora, se debe multiplicar M * 9. Como M es equivalente a 22, se debe multiplicar en-


tonces 22 * 9 lo que da 19810 y como se lleva 2 entonces se tiene 20010 que al convertir a
base 23 da 8G23:
8 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

Continúa la multiplicación con L * 9 que es 21 * 9 = 189, más 5 que se lleva es igual a 78


19410; convirtiendo a base 23 da 8A23. Escribiendo la operación es: 79

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

La siguiente multiplicación con M * 9 que es 22 * 9 = 198 más 2 que se lleva es igual a


Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos

20010; convirtiendo a base 23 da 8G23. Registramos::

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

Luego el resultado de la multiplicación es un número al que hay que quitarle la parte


entera y continuar multiplicando la fracción restante por 9. Se continúa de este modo su-
cesivamente hasta tener un número significativo de cifras. A continuación, se muestra el
resultado de las multiplicaciones:

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

Como se puede apreciar no se obtiene una fracción completamente equivalente al


convertir el número dado de base 23 a base 9, pues da un número que es inexacto, es decir,
una fracción inexacta equivalente aproximadamente.

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.

1.5 EJERCICIOS DE REPASO

Mediante una representación gráfica de puntos negros haga las agrupaciones para los
siguientes números:

2213 3124 42135 50016 10027


80
20178 68510 2316 FEA18 100K21 81

Convertir al sistema numérico base 10 los siguientes números:

Base 13 Base 2 Base 16 Base 6 Base 8

15264CAB.AA1 11010011.001 FEAFEA12.DD 1251520.0051 711546.771

Convertir al sistema numérico correspondiente los siguientes números de base 10:

32157001.1425 2517841.851 951357.564 8521496.987 3257841.0075

A Base 13 A Base 2 A Base 16 A Base 6 A Base 8

Aplicar la operación básica de la suma en los siguientes casos:

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

Aplicar la operación básica de la resta usando la teoría de los complementos a los


ejemplos del numeral anterior.

Aplicar la operación básica de la multiplicación en los siguientes casos:


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 E A F E A1 2
Fundamentos de lógica para programación de computadores · Cap. 1 · Los sistemas numéricos

* CB1007 * 1010100 *12548ACE

B as e 8 B a s e 1 0
45 3 0 0 0 31 72 5 4 6 3 4
* 1251520 * 16210

Aplicar la operación básica de la división en los siguientes casos:

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

Convertir a la base correspondiente usando el método de la división los siguientes


números:

De base 24 a base 13 De base 2 a base 8


154GIHN52CAB 11010011

De base 16 a base 2 De base 6 a base 4


FEAFEA12 45350031
Convertir a la base correspondiente usando el método de la división los siguientes
números:

De base 25 a base 12 De base 2 a base 8


0.NL002CAB 0.1100100001

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.

Usar las funciones internas como herramientas para la de-


finición de tareas en los algoritmos que posteriormente se
implementan como programas de computador.

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.

Conceptualmente el computador se puede entender como un sistema compuesto por


partes bien identificadas, como se acabó de mencionar: los dispositivos de entrada, la CPU,
los dispositivos de salida; todos ellos interrelacionados de tal forma que permiten trans-
formar datos suministrados en información útil para el usuario (Jara Castro & Peréz Mora,
2005). Esquemáticamente este concepto se muestra en la figura 13.
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares

Figura 13. Esquema de un Sistema de Cómputo..

El proceso de retroalimentación se refiere al hecho de cómo el sistema para ciertos


procesos tendrá que usar parte de la información de salida como datos de entrada para
generar nueva información de salida. Un ejemplo es el proceso de contabilidad, el cual
calcula cada mes un balance, posteriormente este es parte de los datos de entrada para
calcular el balance del próximo mes.

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).

El funcionamiento específico de la memoria RAM es el siguiente: un dato es obtenido


a través del teclado o de un dispositivo de entrada, luego transportado hasta la RAM don-
de es guardado. La manera como retiene la información la RAM podemos imaginarla como
un gran espacio en el que se pueden tomar pedazos específicos destinados para guardar
un dato (ver Figura 14):

89
89

Figura 14. Descripción de la memoria RAM.

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

Figura 15. Dato almacenado en la RAM del Computador.

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).

2.2. EL CONCEPTO DE CONSTANTE


Para Zurdo Saiz, a diferencia de la variable, las constantes son datos que no son modifi-
cados durante la ejecución de un proceso en el computador y también se almacenan en
la RAM. Por ejemplo, la constante π (3.14159265359) se usa para hacer cálculos y obtener
información, pero durante todo el proceso "no modifica la porción de memoria en donde
se almacena este valor" (Zurdo Sainz, Gutíerrez Tapia, & Acevedo Quero, 2003). Otros ejem-
plos de constantes son:
0 137 -2518

1.234 -0.1536 +564473.24

3.77456E2 3.37456*102 0.337456E3

337.456E0 33745.6E-2 337456E-3

“A” “B” “+”

“Los Gatos Negros” CIERTO FALSO

Ejemplos de constantes no válidas serían:

4,752.63 Comas no están permitidas

7- El signo menos (–) debe preceder al dígito

8U La u al lado del 8 no puede ser una constante


91
91

2.3. LOS TIPOS DE DATOS


Gonzalo Pascual Lopera en su libro Estructuras de la información presenta una clasifica-
ción muy interesante de los tipos de datos, la cual se desarrolla a continuación (Pascual
Lopera, 1992).

Por la forma como se construyen los computadores y por el funcionamiento de su


parte electrónica éstos interpretan información basándose en la teoría de los siste-
mas numéricos. El computador maneja información con el sistema numérico base 2
o sistema binario, es decir, representa la información en secuencias de unos y ceros.
Ahora cuando el computador va a presentar la información al usuario no lo hace en
binario; hace una conversión al sistema base 10 o decimal y de esta forma el usuario
la recibe de forma fácilmente comprensible para él.

Cuando se procesan datos en un computador estos tienen una infinidad de orígenes


y múltiples representaciones. Sin embargo, el computador maneja un número limitado
de representaciones que son suficientes para lograr que procese lo deseado. Los tipos de
datos que el computador maneja son dos: uno, el de los datos numéricos que representan
cantidades o valores; el otro, el de los datos informativos o datos no numéricos llamados
también alfanuméricos. Sin embargo, al interior de cada una de estos dos grandes grupos
hay clasificaciones que obedecen a las necesidades particulares de cada información que
va a ser manejada por el computador.
Los datos que se introducen son almacenados en la memoria RAM. Esta se puede
imaginar como un panal de abejas, es decir, como un dispositivo lleno de celdillas en las
que se guardan los datos. En cada una de las celdillas se puede almacenar un valor (un
uno o un cero) y un conjunto de unos y ceros forma un dato representado en el sistema
numérico binario.

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

entendibles para el usuario.

El conjunto de bits (unos y ceros) y la organización de éstos es lo que se denomina el


formato de representación interna de la información y de este modo se puede almacenar
en la RAM del computador.

2.3.1. Datos Numéricos


Como ya se mencionó, los datos numéricos corresponden a información que representa
cantidades o valores y en este sentido, se puede decir que hay dos tipos de valores nu-
méricos: enteros y reales. Si estos valores son dados al computador para que haga alguna
tarea, toman el nombre de datos que en consecuencia serán datos enteros o datos reales.

2.3.1.1. Datos de tipo entero

Corresponden a la representación en el computador de los números enteros. Estos da-


tos también se conocen como datos de coma o punto fijo. Se representan en sistema
numérico decimal por dígitos, formando cantidades enteras, sin fracciones, positivas o
negativas, cuyo rango viene determinado por el formato de representación en memoria
RAM. La representación en memoria más común para los datos enteros es empleando
el método de signo y magnitud que en la siguiente sección se describe.

2.3.1.1.1. Enteros de 8 bits con signo y magnitud

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.

Como se aprecia en la figura 16, en su representación de signo y magnitud de 8 bits, se


entiende que el primer bit (el de la extrema izquierda) es el bit de signo. Los 7 restantes 93
son la magnitud del dato. Se puede almacenar en concordancia con los 7 bits de magnitud, 93
un valor comprendido entre –27+1 hasta 27-1, esto es desde –127 a 127.

Se observa entonces, que el valor almacenado en la memoria del computador que


muestra la Figura 16 es 102, ya que al convertir el número 1100110 de base 2 al sistema base
10 da como resultado 102. El proceso para convertir 1100110 de base 2 a base 10 es:

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

2.3.1.1.2. Enteros de 16 bits con signo y magnitud

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

2.3.1.1.3. Enteros de 32 bits con signo y magnitud

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).

Figura 18. Descripción en memoria de un dato entero en


representación de signo y magnitud con 32 bits.

El valor almacenado en la memoria que se muestra en el ejemplo de la figura 18 es


1141965889.

Si se pretende utilizar un número de bits determinado para almacenar un valor entero,


cualquier número que sobrepase los límites mínimos y máximos impuestos por este nú-
mero de bits, no se podrá hacer y se obtendrá un resultado erróneo por desbordamiento
de memoria, es decir, el resultado codificado es mayor que el tamaño de la memoria en
la que se puede almacenar.

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.

No. Bits Menor número negativo Mayor número positivo


8 -127 127
16 -32767 32767
32 -2147483647 2147483647
64 -9.223372036*1018 + 1 9.223372036*1018 - 1

2.3.1.2. Datos de tipo real


Son datos numéricos de coma o punto flotante, es decir, números que tienen una parte
entera y una parte faccionaria o decimal. Un ejemplo puede ser el número 254.7865 en el
que la parte entera es 254 y la facción es 0.7865. Estos números reales se representan por
dígitos formando cantidades positivas y negativas que pueden tener cifras fraccionarias.

El rango de estos números depende de su formato de almacenamiento en memoria. Nor-


malmente se codifican para su almacenamiento utilizando la forma exponencial. Su precisión
depende, en gran medida, del número de bits utilizados para su representación y de las ins-
trucciones del sistema, con respecto al redondeo, (aproximación) y al truncamiento (tomar una
cantidad determinada de dígitos para la parte fraccionaria) empleados para la codificación de 95
estos datos mediante la forma exponencial. 95

2.3.1.2.1. Representación de datos numéricos reales

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.

Con mantisa de enteros 34523.152 = 34523152*10-3

Con mantisa de fracción 34523.152 = 0.345231521*105

Los números reales en la memoria RAM de los computadores se divide en tres partes
(IEEE, 2017) o campos así:

01 0 01 01 011 011 01 01 011 011 0 0 0111 011

Signo Exponente o Mantisa


característica

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:

Tamaño Mantisa = Longitud Formato - Exponente - 1.

Como ejemplo, aplicando el estándar IEEE 754 y, usando una representación de

Simple precisión (32 bits)

Base binaria

Exponente de 8 bits, codificado en exceso a 2n-1

Mantisa fraccionaria, codificada en complemento a 1


Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares

Y aplicándolo al número –25.62510 se puede calcular su representación en binario del


modo siguiente:

El primer paso es la transformación a binario del número dado. Para el ejemplo se


debe transformar a binario el número –25.62510. Como el número tiene parte entera y parte
fraccionaria se debe transformar la parte entera de una manera y luego la parte fraccio-
naria de otra manera.

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

El segundo paso es convertir el número a su forma exponencial normalizada con man-


tisa fraccionaria. Esto es:

11001.1010 = 0.110011010*25

De donde se obtiene que la mantisa del número es 0.110011010 y que la característica o


exponente es 5, es decir, m = 5.

El tercer paso es considerar el signo del número, que para el ejemplo es 1 ya que este 97
es negativo. 97

El cuarto paso es calcular la característica o exponente. Como el número de bits para el


exponente es de 8, entonces la representación de la característica en el formato se codifica
tomando n=8, así:

2n-1 + m = 28 - 1 + 5 = 27 + 5 = 128 + 5 = 133

Luego al transformar de 133 base diez a base dos es:

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

Así que 13310 = 100001012


El quinto paso es completar la mantisa según el formato en cuestión, esto es formato 32 bits,
como se anotó en el ejemplo. Para tal efecto se aplica:

Mantisa = Longitud del formato – Exponente – 1

Mantisa = 32 – 8 – 1 = 23

Como la mantisa fraccionaria del número en binario es 0.110011010, entonces de ella se


toma la información de la fracción, esto es, tomar 110011010 y como esta información no
está conformada por 23 bits, será necesario completarla a 32. Los bits de la mantisa son 9,
hará falta colocar a la derecha de éstos 14 bits más en ceros para completarla. Así:

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

La representación en memoria RAM del número –25.62510 es:

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.

2.3.1.2.2. Normalización IEEE 754

Se han desarrollado intentos de estandarizar la manera como se representan los números


reales. El IEEE con su norma 754 establece lo siguiente (Ver tablas 10 y 11):

Tabla 10. Número de precisión simple (32 Bits)

Descripción Longitud Posición


Bit de signo 1 31
Bits del exponente 8 23 a 30
Bits de la mantisa 23 0 a 22
Base binaria (=2)
Exponente(Característica) Exceso a 2n-1
Mantisa fraccionaria En binario puro

Fuente: PASCUAL LOPERA, Gonzalo. Estructuras de información. McGraw-Hill 1992 (p. 31).
Tabla 11. Número de precisión doble (64 Bits)

Descripción Longitud Posición


Bit de signo 1 63
Bits del exponente 11 52 a 62
Bits de la mantisa 52 0 a 51
Base binaria (=2)
Exponente(Característica) Exceso a 2n-1
Mantisa fraccionaria En binario puro

Fuente: PASCUAL LOPERA, Gonzalo. Estructuras de información. McGraw-Hill 1992 (p. 31).

2.3.2. Datos de tipo alfanuméricos

La forma de representar datos que no corresponden a valores como los numéricos, es


mediante una codificación especial, que para tal efecto tiene diversas variantes. Algunos
de estos formatos son: BCD extendido a 6, FIELDATA, ASCII de 7 bits, ASCII de 8 bits, EBCDIC.

En términos generales se podría mencionar algunas de estas representaciones (Ver


99
tabla 12):
99
Tabla 12. Representación en Código BCD extendido

Bits Bits numéricos


Zona 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 0000 1100 1011 1110
11 A B C D E F G H I + ) .
10 J K L M N O P Q R - * $ ;
01 / S T U V W X Y Z (
00 1 2 3 4 5 6 7 8 9 Blanco 0 =

Fuente: PASCUAL LOPERA, Gonzalo. Estructuras de información. McGraw-Hill 1992 (p. 44).

En la representación de datos alfanuméricos, (Tabla 12), se entiende que cada letra,


signo o símbolo queda formado por una colección de unos y ceros (en términos binarios)
según sea el caso. Por ejemplo: la letra A quedaría representada por:

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.

A partir de esta representación se puede establecer un valor en el sistema numérico


binario para este tipo de datos. Esto quiere decir que cada bit tiene un peso según los
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares

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

El ASCII es otra manera de codificar la información que no representa valores para el


computador, en otras palabras, es la forma de codificar secuencias alfanuméricas (cadenas
de caracteres o Strings). Aquí se usan, en vez de 6 bits, 8 bits para representar los caracte-
res que conforman las cadenas.
En cada una de las casillas de la tabla 13 se muestran dos elementos: uno es el carác-
ter correspondiente, dos el número en base 10 del valor del código del carácter. La primera
columna, la de la extrema izquierda, muestra dos valores por casilla, el primero correspon-
de a 4 bits de un número binario y el otro es su equivalente en sistema numérico base 10
o sistema decimal. Por ejemplo: para la casilla que se encuentra ubicada en la columna
de la extrema izquierda y la fila 3 se ve el binario 0001 y su equivalente en decimal 1. De
manera similar, la primera fila o fila superior muestra en cada casilla dos valores, uno en
binario y el otro en decimal. Como ejemplo, se puede ver en la casilla de la fila superior
con la columna 6 el binario 0100 y su equivalente en decimal 4. Al unir estos dos grupos
de unos y ceros, poniendo primero el binario de la fila superior con columna 6 y luego el
binario de la columna de la extrema izquierda con fila 3, se conforma la colección 01000001
que al convertirlo a decimal da 65 que es el número que acompaña a la letra A mayúscula
en la casilla de la tabla (ver tabla 13).

En términos generales, la conformación del código se realiza mediante la unión de los


bits de la izquierda y los bits de la derecha completando 8 bits por código. Estos 8 bits son
un número en binario con el que se puede calcular su equivalente en decimal correspon-
diente, que es el número que acompaña al carácter en cada casilla de la tabla. En la figura
101
20 se muestra esta unión.
101
Tabla 13. Representación en Código ASCII a 8 Bits

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.

Para efectos de comparación entre la codificación en BCD y ASCII, se tiene la palabra


CARRO, pero ahora codificada en ASCII.

C A R R O

01000011 01000001 01010010 01010010 01001111


Y la secuencia de unos y ceros es:

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.3.3. Datos de tipo lógico


Los datos de tipo lógico son aquellos que pueden tomar un valor de cierto (true) o falso
(false). Se conocen también como datos de tipo Boléanos (Boolean). Para su representación
toman un valor numérico de uno o cero dependiendo del caso, es decir, uno para falso y
cero para verdadero.

Los datos lógicos se obtienen de la valoración de expresiones en las que se involucran


proposiciones, las que por su naturaleza y definición tienen un valor de verdad o falsedad.
Si se considera la proposición 3 > 4 se tiene como resultado de su valoración una falsedad
o valor de falso, ya que 3 no es mayor a 4. Esta falsedad puede ser almacenada por el
computador mediante el uso de una variable que guardará un valor de falso o un valor 1.
2.4. EL MECANISMO DE ASIGNACIÓN

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

Figura 21. Descripción del almacenamiento de un dato en memoria RAM.

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.

2.4.2. Reglas para dar nombre a los identificadores


La palabra “Dato” del ejemplo de numeral anterior es el nombre de la información, es
decir el 512 y, por tanto, es considerado como un identificador o el nombre de la variable.
Cuando se escriben programas de computador y se procesan datos, estos deben estar al-
macenados en la memoria del computador y se debe referir a ellos por medio de los iden-
tificadores o nombres de variables, o a través de constantes, funciones o procedimientos.

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 (_).

• La longitud del identificador, es decir la cantidad de caracteres que conforman el


identificador, en teoría es ilimitada, pero en la práctica depende de las especifi-
caciones del lenguaje de programación que se esté usando. En Visual Basic, por
ejemplo, el número máximo de caracteres para los identificadores es de 256. Para
el lenguaje C esta longitud no debe pasar de 32.

• 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.

Ejemplos de identificadores válidos:

NUM1 AB459 Nombre_Max


105
NOMBRE_APELLIDO Alfa NOTA_FÍSICA 105

Salario Profesion EdadMeses

Ejemplos de identificadores no válidos:

7AB 3NUM5 nombre-45*

(Nombre) a-b Dato-4

Profesión Edad Meses


[T2]2.5. OPERADORES
Desde el punto de vista de las matemáticas, los operadores son signos que permiten defi-
nir procesos mediante los cuales se ejecutan una serie de pasos claramente establecidos
para calcular un resultado a partir de datos. Esto es como la suma, la resta o la división,
etc. En consecuencia, para hacer una suma se requiere de un conjunto de pasos claramen-
te definidos, los cuales se simbolizan con una cruz (+).

Existen diferentes tipos de operadores que dependen de la naturaleza del resultado


que se quiera obtener. Si el resultado es un número, entonces se usan operadores arit-
méticos, si el resultado es un valor de verdad o falsedad, entonces los operadores que se
usan son lógicos o de relación.

2.5.1. Operadores aritméticos


Son los que indican las operaciones aritméticas básicas. Las variables y las constantes
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares

pueden ser procesadas utilizando operadores. Consideremos la siguiente operación:

165 + 45

El símbolo + representa al procedimiento de suma y se reconoce como operador arit-


mético, los valores 165 y 45 se llaman operandos. El valor de adicionar 165 más 45 (210),
se conoce como resultado de la operación (Becerra Santamaría, 2001).A continuación se
muestran algunos de los operadores más usuales.

Tabla 14. Operadores Aritméticos

Símbolo Operador Tipo de operando Tipo de resultado


() Paréntesis Entero o Real Entero o real
^ o ** 1
Exponente Entero o Real Entero o Real
* Multiplicación Entero o Real Entero o Real
/ División Real Real
+ Suma Entero o Real Entero o Real
- Resta Entero o Real Entero o Real
Div (\ o %) 2
División Entera Entero Entero (Cociente)
Mod Módulo (Residuo) Entero Entero (Residuo)

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.

Tabla 15. 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

Expresión 1 Operador de relación Expresión 2

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:

NUM1 > NUM2

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.

Es necesario aclarar que en el primer ejemplo el operador trabaja directamente sobre


dos datos (Num1, Num2) y en el segundo lo hace sobre una combinación de operadores

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.

2.5.3. Operadores lógicos


Los operadores lógicos o booleanos permiten relaciones lógicas (si/no) y sirven para re-
presentar condiciones compuestas. Los operadores booleanos básicos son NOT (no), AND
(y) y OR (o). La tabla 16 muestra el fundamento de dichos operadores.

Tabla 16. Operadores Lógicos


Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares

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)

En la tabla 16 se debe entender P como el nombre de una proposición, la cual a su vez


se entiende como un enunciado con valor de verdad o falsedad. Por ejemplo, se puede
tener el siguiente enunciado al cual identificamos con P:

P: “Los carros vienen de Bogotá”

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)

Lo mismo, P es verdadero si la variable X tiene 3 almacenado o P es falso si en vez


de 3 la variable X tiene 12.4 almacenado. La tabla 17 presenta las diferentes posibilidades
de resultado de la combinación de dos proposiciones, aun cuando las tablas se pueden
aplicar para más de 2 proposiciones (ver tabla 17).
En el mundo de la lógica matemática, la tabla 17 se conoce como “Tabla de verdad
de las operaciones lógicas”. En la computación no se implementan todas las operaciones
de la lógica matemática, pues la bicondicional y la implicación no son tenidas en cuenta.
A excepción del operador NOT, los demás operadores son binarios. NOT es un operador
unario porque él aplica sobre un solo operando.

Tabla 17. Resultado de la combinación de proposiciones

Negación Conjunción Disyunción


Proposición Expresión Proposiciones Expresión Proposiciones Expresión
P NOT P P Q P AND Q P Q P OR Q
V F F F F F F F
F V F V F F V V
V F F V F V
V V V V V V
V: Verdadero. F: Falso

[T3]2.5.4. Operador de asignación


Como se ha dicho anteriormente, para procesar los datos de entrada y convertirlos en 109
información de salida, el computador utiliza programas, y estos no son más que una colec-
109
ción de instrucciones que le van indicando al computador qué es lo que tiene que hacer.
Estas instrucciones o comandos están organizados dependiendo de una lógica inherente
a la tarea a ejecutar. En la elaboración de las instrucciones intervienen las variables, las
constantes, los tipos de datos y los operadores (Ríos Cartrillón, 1995).

Ahora bien, el operador de asignación es el encargado de poner los datos dentro de la


memoria del computador, es decir, es el encargado de ejecutar el mecanismo de asigna-
ción de datos a las variables y constantes que intervienen en una tarea dada. La operación
de asignación de memoria para un dato se denota con el símbolo:

En algunos lenguajes de programación como el Visual Basic, el Fortran, lenguaje C o el


FoxPro, entre otros, este operador se escribe como un =, en otros como el Pascal o Modu-
la-2 se escribe así: :=

La forma como se escribe una instrucción de asignación es:

Nombre de Variable Expresión o Valor


El nombre de la variable cuyo valor va a ser almacenado debe ser escrito a la izquierda
del operador de asignación. A la derecha del operador se escribe una expresión o un valor
que será asignado o almacenado en la memoria del computador, cuyo nombre o referen-
cia se hace por medio del nombre de variable. Si se quiere almacenar en la memoria del
computador el valor 512, como se mencionó anteriormente cuando se habló del mecanis-
mo de asignación, la instrucción para que el computador entienda este hecho es:

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.

Si se ejecutan por el computador las siguientes instrucciones de asignación, en la


Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares

memoria se almacenarán los datos así:

X 5 X almacena el valor 5

A X A almacena el valor 5

X A + 12 X toma el valor 17. 5 de A más 12

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

Una forma alterna de notar la operación de asignación es como se ve a continuación:

SUELDO = SUELDO + 45

Esto tiene sentido escribirlo en lógica de programación de computadores pues desde


el punto de vista de las matemáticas sería un absurdo. El modo de ejecutar la instrucción
es determinar el valor actual de la variable SUELDO al que se le suma un valor de 45 y a
continuación el resultado de esta suma se asigna a la misma variable SUELDO. Sin embar-
go, no olvide que matemáticamente esta instrucción carece de sentido.
Las operaciones o instrucciones de asignación se clasifican en asignaciones aritméti-
cas, lógicas, de relación y de caracteres, esto de acuerdo al tipo de operadores y de ope-
raciones que se realicen.

Desde el punto de vista de los lenguajes de programación y de la construcción de


algoritmos es equivalente a escribir un operador de asignación con el símbolo de flecha
o con un signo de igual (=). En este texto, de este punto en adelante se emplea un signo =
para escribir asignaciones, así:

NOMBRE “Anita” Es equivalente a NOMBRE = “Anita”

El operador de asignación no es ni binario ni unario ya que su labor es la transferir in-


formación de un sitio a otro de la memoria del computador.

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

3 SUMA = NUMERO1 + NUMERO2

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):

Figura 22. Datos en la memoria RAM del computador.

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

2.6.1.1. Evaluación de las expresiones aritméticas


Las expresiones aritméticas implican más de un operador, por ejemplo: 42*55+17; y como tal
el computador debe calcular el resultado que esta expresión implica. El orden en que se
ejecutan estas operaciones depende de la prioridad o jerarquía de los operadores. En la
tabla 18 se muestra la jerarquía de los operadores aritméticos que se utilizará en adelante
para evaluar las expresiones aritméticas (Joyanes Aguilar, 1996).
Tabla 18. Prioridad de los operadores aritméticos

Operador Orden Operación


() Mayor prioridad Paréntesis
^ Potenciación
*,/ Multiplicación, División
+,- Suma, Resta
Div, Mod Menor prioridad División módulo

2.6.1.2. Reglas de Prioridad para evaluar expresiones


Además de la prioridad o jerarquía de los operadores existen unas reglas que permiten
definir claramente cómo se procede correctamente en la evaluación de una expresión
(Becerra Santamaría, Lenguaje C El nuevo concepto, 2001). Estas reglas son:

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.

En caso de operaciones de la misma jerarquía, se debe resolver de izquierda a derecha

Ejemplo 1. Evaluar la siguiente expresión: 15 / 3 - 2 * 3 + 9

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

(7 * (85 - 5 ^ 2) Mod 3) - 4 ^ 2 + 8 ^ 2 Div 2 Mod 5

(7 * (85 - 25 ) Mod 3) - 4 ^ 2 + 8 ^ 2 Div 2 Mod 5

(7 * 60 Mod 3) - 4 ^ 2 + 8 ^ 2 Div 2 Mod 5

( 420 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

-16 + 64 Div 2 Mod 5

48 Div 2 Mod 5

24 Mod 5
115
4 115

De tal modo, la respuesta de la evaluación es 4.

No en todas las expresiones aritméticas se involucran números, se puede también utili-


zar expresiones en las que se deben escribir variables.

Ejemplo 3. Evaluar X = X0 + Vx0 T + Ax T2

Para poder evaluar esta expresión se debe primero traducir a su correspondiente


expresión en el lenguaje de computador, es decir, traducir de una expresión algebraica
a una algorítmica. Desde luego que para poder traducir se deben tener en cuenta las
reglas de prioridad, pues la expresión algorítmica es la que posteriormente interpre-
tará el computador.

El primer paso en la traducción es convertir las variables de la expresión aritmética en


variables para el computador. Según las reglas para nombrar variables o identificadores de
computador se obtendría (Ver tabla 19):
Tabla 19. Paralelo entre variables aritméticas y algorítmicas.

Significado de Nombre de la Nombre de la


la variable variable aritmética variable algorítmica
Espacio X X
Espacio inicial X0 X0
Velocidad inicial VX0 VX0
Tiempo T T
Aceleración en X AX AX

La expresión traducida sería:

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

valores a los que hacen referencia las variables.

El segundo paso será calcular el resultado y este procedimiento se hace aplicando


las reglas de prioridad. Para ejecutar este paso supóngase que las variables o datos
almacenados en la memoria del computador hacen referencia a los siguientes valores:

X0 = 2.56

VX0 = 3400.45

T = 135

AX = 9.8

De forma gráfica, en la memoria RAM se verá la información como se muestra en


la figura 23:

Figura 23. Datos en la memoria RAM del computador.


Como se ve en la imagen, la variable X no tiene ningún valor pues este es el que se va a
calcular. El proceso de cálculo y de asignación sería:

X = X0 + VX0 * T + 1 / 2 * AX * T ^ 2

Lo que corresponde a la expresión interpretada por el computador, el cual reemplaza


las variables por los valores y opera según las reglas de prioridad, así:

x = 2.56 + 3400.45 * 135 + 1/2 * 9.8 * 135 ^2

x = 2.56 + 3400.45 * 135 + 1/2 * 9.8 * 18225

x = 2.56 + 459060.75 + 1/2 * 9.8 * 18225

x = 2.56 + 459060.75 + 0.5 * 9.8 * 18225

x = 2.56 + 459060.75 + 4.9 * 18225

x = 2.56 + 459060.75 + 89302.5

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:

Figura 24. Datos en la memoria RAM del computador.


2.6.2. Evaluación de las expresiones Lógicas
Para la evaluación de las expresiones lógicas se debe tener en cuenta la prioridad de los
operadores aritméticos (ver tabla 18) y además la prioridad de los mismos (ver tabla 20),
tanto los aritméticos como los lógicos. La ejecución de las operaciones se hace aplicando
las mismas reglas de prioridad que se describieron para la evaluación de las expresiones
aritméticas (Becerra Santamaría, 2001).

Tabla 20. Prioridad general de los operadores

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)

Ejemplo 4. Evaluar las siguientes expresiones:

1 X=4

2 Y = -5

3 Z=X>Y

En este caso, el valor que queda almacenado en la variable Z es verdadero puesto


que la evaluación que el computador hace de la expresión es: X contiene 4, el cual es
mayor al valor que contiene la variable Y, que es –5. Para que el computador pueda eva-
luar esta expresión debe haber ejecutado primero la asignación de X = 4 y luego Y = -5,
una vez almacenados y reconocidos estos valores es que se puede evaluar la expresión.

A este orden de ejecución de las instrucciones es lo que se le conoce con el nombre


de flujo de programa, es decir, el orden en que el computador ejecuta las instrucciones.
Esto es:
X=4

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

Figura 25. Dato de X cargado en RAM.

Luego de ejecutar la segunda instrucción la memoria almacenaría los datos como lo


muestra la siguiente figura:.

Figura 26. Dato de X y de Y cargados en RAM.


Por último, el estado de la memoria sería el siguiente:
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares

Figura 27. Dato de X, Y y Z cargados en RAM.

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

5 N = Z = 0 OR Y <= W AND NOT Y > Z * X ^ X OR X >= W


A partir de lo expuesto en la tabla 20, podemos realizar su evaluación así:
N = 3 2 = 0 O R -1 2 0 < = 0 A N D N OT -1 2 0 > 3 2 * 3 ^ 3 O R 3 > = 0

N = 3 2 = 0 O R -1 2 0 < = 0 A N D N OT -1 2 0 > 3 2 * 27 OR 3 >= 0

N = 3 2 = 0 O R -1 2 0 < = 0 A N D N OT -1 2 0 > 864 OR 3 >= 0

N = Fa l s e O R -1 2 0 < = 0 A N D N OT -1 2 0 > 864 OR 3 >= 0

N = Fal s e O R True A N D N OT -1 2 0 > 864 OR 3 >= 0

N = Fal s e O R True AND NOT Fal s e OR 3 >= 0

N = Fal s e O R True AND NOT Fal s e OR True

N = Fal s e O R True AND True OR True

N = Fal s e O R True OR True

N = True OR True

N = True

Con lo que se calcula un valor de verdadero para el valor de N en el ejemplo.


121
En el ejemplo se ve que las expresiones lógicas pueden incluir tanto operadores arit- 121
méticos como lógicos y de relación.

2.6.3. Evaluación de las expresiones de cadena

El procesamiento de expresiones de cadena (string) o información alfanumérica, es una


tarea muy importante, pues hace parte fundamental en el tratamiento de la información
no numérica por parte del computador (Becerra Santamaría, 2001). Las operaciones bási-
cas con cadenas son:

• Concatenación
• Comparación
• Subcadenas
• Longitud

2.6.3.1. Concatenación de Cadenas


Consiste en unir dos o más cadenas en una sola. La operación de concatenación se indica
con uno de los siguientes operadores: +, “.” , &. En general hay que consultar la documenta-
ción de cada lenguaje para saber específicamente cómo se usa el operador de concatena-
ción. En este texto, se utilizará el signo + para expresar la concatenación. El procedimiento
para concatenar como se muestra a continuación es aplicable en los lenguajes de C y
Visual Basic.
Ejemplo 6. Evaluar:

1 NOMBRE = “Galileo”

2 APELLIDO = “Galilei”

3 NOMBRE_COMPLETO = NOMBRE + APELLIDO

El computador toma el contenido de la variable NOMBRE y lo concatena o lo une con


el contenido de la variable APELLIDO, dando como resultado en la variable NOMBRE_COM-
PLETO la cadena “GalileoGalilei”.

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”

3 NOMBRE_COMPLETO = NOMBRE + “ ” + APELLIDO

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”

4 FRASE = TEXTO1 + “ ” + NUM +“ ” + “y una” + “ “ + TEXTO2

El resultado almacenado para FRASE, sería la siguiente cadena::

“Las 1000 y una Noches”

En este ejemplo se ve que en el cálculo del resultado de la variable FRASE se incluye


un dato que no está guardado en una variable previamente especificada como: “y una”
pero es posible hacerlo porque así está establecido en la variable 4 FRASE.
2.6.3.2. Comparación de Cadenas
Consiste en comparar las cadenas carácter a carácter comenzando por el primero de la
izquierda de cada una de las cadenas. El orden que se establece es de igual forma como
el que usa en los diccionarios. El computador establece este orden a partir del orden pre-
sentado por la tabla ASCII (tabla 13) (Becerra Santamaría, 2001).

Ejemplo 8. Evaluar:

1 DATO1 = JOSE

2 DATO2 = JULIO

3 RESUL = DATO1 < DATO2

En la variable RESUL queda almacenado un valor de verdadero ya que la comparación


que hace el computador de carácter a carácter será de la siguiente forma:

La comparación comienza con la “J” de “JOSÉ” y la “J” de “JULIO.” El computador dice


que son iguales, por tal hecho sigue comparando. Ahora compara la “O” de “JOSÉ” con
la “U” de Julio, cuyo resultado es verdadero, puesto que da de verificar que la posición 123
que ocupa en la tabla ASCII la O es primera que la posición de U. Como tal el número de 123
orden es menor para la O que para la U, haciendo esto que la asignación de verdadero
a la variable RESUL como resultado del operador <. No se sigue el proceso de compara-
ción con el resto de las letras dado que con estas dos comparaciones es suficiente para
determinar quién es mayor a quién.

Ejemplo 9. Evaluar:

1 COMP = “José Manuel” > “José Miguel”

En la variable COMP queda almacenado un valor de Falso puesto que la comparación


se extiende (carácter a carácter) desde la primera letra de la izquierda de los nombres
hasta alcanzar la letra “a” de la palabra Manuel y la letra “i” de Miguel, en cuyo caso la
comparación entre estas dos letras da que la “a” es menor que la “i”, por tanto, la respuesta
de la comparación es falsa.

Ejemplo 10. Evaluar:

1 NUM = “342”

2 RESPUESTA = (“342” = NUM)

La variable RESPUESTA contendrá un valor de verdadero.


2.6.3.3. Subcadenas
Una subcadena es una parte de una cadena más larga o mayor. En otras palabras, de una
oración se extrae parte de esta. Considérese el siguiente caso:

“Los niños que juegan en el parque de las flores”

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”

La forma de extraer una subcadena de la cadena principal es mediante el uso de


una función que se denomina función de subcadena. No hay que olvidar que cada
lenguaje define de manera particular la forma como se usa esta función. Por lo tanto
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares

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.

Consecuentemente con lo expuesto, se entiende aquí, que una función es un pro-


grama que se ejecuta automáticamente para calcular u obtener un resultado especí-
fico. Como ejemplo podemos citar el hecho de usar una calculadora para obtener el
valor del seno de un ángulo. Solo hace falta escribir el valor del ángulo, oprimir una
tecla y automáticamente se obtiene la respuesta, esto es, se ha usado la función del
cálculo del seno de la calculadora.

En programación de computadores para indicarle al computador que haga esto se


debe escribir un conjunto de instrucciones de la siguiente manera:

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:

1 CAD = “Los niños que juegan en el parque de las flores”

2 SUBCAD = Mid (CAD, 15, 19)

En la variable SUBCAD queda almacenada la subcadena “juegan en el parque”.

Ejemplo 11. Evaluar:

1 CAD = “Pienso luego existo”

2 SUBCAD = Mid (CAD, 8, 5)

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.

Ejemplo 12. Evaluar:

1 CADENA = “Entre más conozco al hombre más quiero a mi perro”

2 INICIO = 1

3 CANTIDAD = 9

4 SUBCAD1 = Mid (CADENA, INICIO, CANTIDAD)

5 INICIO = 11

6 CANTIDAD = 17

7 SUBCAD2 = Mid (CADENA, INICIO, CANTIDAD)

8 INICIO = 29

9 CANTIDAD = 21

10 SUBCAD3 = Mid (CADENA, INICIO, CANTIDAD)

11 CADENA_COPIA = SUBCAD1 + “ ” + SUBCAD2 + “ ” + SUBCAD3


En este programa se tendrían los siguientes resultados: en la instrucción 1 se guarda
la cadena principal; en la instrucción 2 se almacena el número 1; en la instrucción 3 se
almacena el número 9, en la instrucción 4 se obtiene la subcadena “Entre más”; en las
instrucciones 5 y 6 se redefinen los valores de las variables INICIO y CANTIDAD a 11 y 17
respectivamente; en la instrucción 7 se obtiene otra subcadena a partir de la misma cade-
na principal guardada en la variable CADENA, de modo que en la variable SUBCA2 queda
almacenado “conozco al hombre”; en las instrucciones 8 y 9 vuelven a redefinir los valores
de las variables INICIO y CANTIDAD, esta vez a 29 y 21 respectivamente; la instrucción 10
obtiene la tercer subcadena “más quiero a mi perro”; la última instrucción concatena las
3 subcadenas intercalando 2 espacios en blanco, de esta forma se vuelve a obtener la
cadena original en la variable CADENA_COPIA.

Ejemplo 13. Evaluar:


Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares

1 INI = 5

2 CANTIDAD = 6

3 PARTE = Mid (“Otra prueba de subcadena”, INI, CANTIDAD)

De esta evaluación, obtenemos que la variable PARTE almacena la subcadena “prueba”.

En lenguajes específicos como Visual Basic la implementación o la definición de la


función Mid es similar a como se ha explicado anteriormente. En el lenguaje C o C++ esta
función está definida como substr. Nuevamente, sería necesario la documentación especí-
fica da cada lenguaje para ver cómo es el uso de la función de subcadena.

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:

1 LONGITUD = len(“Capacitación es el futuro de Colombia”)

En la variable LONGITUD queda guardado el número 34 que es la cantidad de carac-


teres que conforman la cadena. Igual que para la función subcadena, para la función que
calcula la longitud de una cadena hay que hacer la revisión de la documentación de cada
lenguaje para ver con mayor precisión el uso de ésta función.
2.7. FUNCIONES INTERNAS
Además de las operaciones básicas estudiadas, existe un conjunto de funciones y pro-
cedimientos que normalmente incorporan los lenguajes de programación para realizar
diferentes tareas ampliamente conocidas y usadas muy frecuentemente. Para utilizar cual-
quiera de estas funciones, simplemente se da el nombre de la función junto con sus
parámetros o argumentos encerrados entre paréntesis y separados por comas. A conti-
nuación, se describe el uso de algunas de las más comunes. La información y estructura
del contenido que se muestra a continuación fue tomada de los manuales de referencia
de los lenguajes: Microsoft Visual Basic (Vaquero Sanchez & Quieroz Vieyra, 1998), Lenguaje
C (Becerra Santamaría, 1992), Java (Ceballos, 2013), Python (Van Rossum, 2000), JavaScript
(Powell & Schneider, 2002) y PHP (Huertel, 2016), Python software foundation (Foundation,
Python Software, 2018), W3CSchool web developers site (W3.CC, 1998), Visual Basic 6.0 (Cor-
nell, 1999).

2.7.1. Funciones internas en lenguaje C

Tabla 21. Funciones en lenguaje C

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

V = round(P, 0); V contiene -3


Devuelve un núme-
ro de tipo real que A = 1.3; Define ángulo en radianes
sin(número)
especifica el seno de C = 1 / sin(A); Calcula la cosecante
un ángulo.
Devuelve un nú-
R = sqrt(4); Devuelve 2
mero de tipo real
R = sqrt(23); Devuelve 4.7958315233
sqrt(número) que especifica la
R = sqrt(0); Devuelve 0
raíz cuadrada de un
R = sqrt(-4); Genera un error
número.
Devuelve un dato
que contiene el nú- char s[13] = “Hola a todos”; Inicializa la cadenas
strlen(cadena)
mero de caracteres ML = strlen(s); Devuelve 12
en una cadena.
Devuelve un núme- string C=” Demostración función Mid”;
Obj.substr(-
ro especificado de P = C.substr(C, 1, 12); Devuelve “Demostración”
cadena, inicio
caracteres de una U = C.substr(C, 21, 3); Devuelve “Mid”
[,cant])
cadena. M = C.substr(C, 14); Devuelve “función Mid”
Devuelve un número
A = 1.3; Define ángulo en ra-
de tipo real que es-
tan(número) dianes
pecifica la tangente
C = 1 / tan(A); Calcula la cotangente
de un ángulo.
Devuelve un número double a = 1234.542334;
que corresponde d = 3;
trunc(número)
con la parte entera c = pow(10.0, d);
de un valor real. e = trunc(c*a) / c; Devuelve 1234.542

En el lenguaje C no se definen las funciones internas para determinar:

El código ASCII de un carácter dado.

El carácter de un código ASCII dado.

La subcadena comenzando desde el lado izquierdo de una cadena dada.

La subcadena comenzando desde el lado derecho de una cadena dada.

Trucar los decimales de un valor real.


Pero existe la forma de poder hacer este trabajo usando otros recursos del lenguaje
(Brookshear, 2012). El proceso se muestra a continuación:

Tabla 22. Procedimiento para el cálculo de algunos datos en C

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

2.7.2. Funciones internas en lenguaje Visual Basic


Tabla 23. Funciones en lenguaje Visual Basic

Función Descripción Uso


Devuelve un valor
del mismo tipo
que el que se pasó
N = Abs(50.3) se almacena en N 50.3
Abs (número) como parámetro y
N = Abs(-50.3) se almacena en N 50.3
que especifica el
valor absoluto de un
número.
Devuelve un dato
de tipo entero que
representa el có- N = Asc(“A”) Devuelve 65
Asc (cadena) digo del caracter N = Asc(“a”) Devuelve 97
correspondiente a la N = Asc(“Apple”) Devuelve 65
primera letra de una
cadena.
Devuelve el ángulo
S = 0.70710678118654 Valor coseno π/4 (45 grados)
Acos(número) cuyo coseno es el
A = Acos(S) Devuelve π/4 grados
número especificado.
Devuelve el ángulo
S = 0.70710678118654 Valor seno π/4 (45 grados)
Asin(número) cuyo seno es el nú-
A = Asin(S) Devuelve π/4 grados
mero especificado.
Devuelve un dato de
tipo real que especi-
Atn(número) Valor_PI = 4 * Atn(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 = Chr(65) Devuelve A
contiene el caracter C = Chr(97) Devuelve a
Chr(codigocar)
asociado con el C = Chr(62) Devuelve >
código de caracter C = Chr(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 = Int(99.8) Devuelve 99
Devuelve la parte
N = Fix(99.2) Devuelve 99
entera de un núme-
Int(número) N = Int(-99.8) Devuelve -100
ro, es decir, quita
Fix(número) N = Fix(-99.8 Devuelve -99
los decimales de un
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares

N = Int(-99.2) Devuelve -100


número.
N = Fix(-99.2) Devuelve -99
Devuelve un núme-
C = “Hola Mundo”
ro especificado de
Left(cadena, lon- MC = Left(C, 1) Devuelve “H”
caracteres del lado
gitud) MC = Left(C, 6) Devuelve “Hola M”
izquierdo de una
MC = Left(C, 10) Devuelve “Hola Mundo”
cadena.
Devuelve un dato
de tipo Long que
C = “Hola a todos” Inicializa la cadenas
Len(cadena) contiene el número
ML = Len(C) Devuelve 12
de caracteres en
una cadena.
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
C = “Demostración función Mid”
Devuelve un núme-
P = Mid(C, 1, 12) Devuelve “Demostra-
Mid(cadena, ini- ro especificado de
ción”
cio[, cant]) caracteres de una
U = Mid(C, 21, 3) Devuelve “Mid”
cadena.
M = Mid(C, 14) Devuelve “función Mid”
Devuelve un núme-
C = “Hola Mundo”
ro especificado de
Right(cadena, M = Right(C, 1) Devuelve “o”
caracteres del lado
longitud) M = Right(C, 6) Devuelve “Mundo”
derecho de una
M = Right(C, 20) Devuelve “Hola Mundo”
cadena.
P = 3.14159284
Devuelve un número V = Round(P, 2) V contiene 3.14
redondeado a un V = Round(P, 4) V contiene 3.1416
Round(expresión[,
número especificado PI = -3.14159284
dec])
de posiciones V = Round(P, 5) V contiene -3.14159
decimales. V = Round(P, 6) V contiene -3.141593
V = Round(P, 0) V contiene -3
Devuelve un núme-
LS = 50
ro de tipo real que
Rnd[(número)] LI = 10
contiene un número
N = Int((LS-LI+1) * Rnd) + LI) Da un número de [10, 50]
aleatorio.
Devuelve un núme-
ro de tipo real que A = 1.3 Define ángulo en radianes
Sin(número)
especifica el seno de C = 1 / Sin(A) Calcula la cosecante
un ángulo.
Devuelve un nú-
R = Sqr(4) Devuelve 2
mero de tipo real
R = Sqr(23) Devuelve 4.7958315233
Sqr(número) que especifica la
R = Sqr(0) Devuelve 0
raíz cuadrada de un
R = Sqr(-4) Genera un error
número.
Devuelve un número
de tipo real que es- A = 1.3 Define ángulo en radianes
Tan(número)
pecifica la tangente C = 1 / Tan(A) Calcula la cotangente
de un ángulo.

2.7.3. Funciones internas en lenguaje Java

Tabla 24. Funciones en lenguaje Java

Función Descripción Uso


Devuelve un valor
del mismo tipo
que el que se pasó
N = Math.abs(50.3); se almacena en N 50.3
abs (número) como parámetro y
N = Math.abs(-50.3); se almacena en N 50.3 131
que especifica el
valor absoluto de
un número.
131
Devuelve el ángulo
cuyo coseno es el S = 0.70710678118654; Valor coseno π/4 (45 grados)
acos(número)
número especifi- A = Math.acos(S); Devuelve π/4 grados
cado.
Devuelve el ángulo
S = 0.70710678118654 Valor seno π/4 (45 grados)
asin(número) cuyo seno es el nú-
A = Math.asin(S) Devuelve π/4 grados
mero especificado.
Devuelve un dato
de tipo real que
atan(número) especifica el arco Valor_PI = 4 * Math.atan(1);
tangente de un
número.
Devuelve un dato
de tipo real que A = 1.3; Radianes
cos(número)
especifica el coseno S = 1 / Math.cos(A); Da la secante
de un ángulo.
Devuelve un dato
de tipo real que
específica e (la base A = 1.3;
exp(número)
de los logaritmos Seno_Hip = (Math.exp(A) – Math.exp(-1 * A)) / 2;
naturales) elevado
a una potencia (ex).
Devuelve un dato
Obj.length(ca- de que contiene el C = “Hola a todos”; Inicializa la cadenas
dena) número de caracte- ML = C.length(C); Devuelve 12
res en una cadena.
Devuelve un núme-
P= 4.5;
pow(base, po- ro que representa
B= 2.1;
tencia) la base elevado a la
R = Math.pow(B, P); Devuelve 28.1829744098
potencia BP
Devuelve un núme- LS = 50;
ro de tipo real que LI = 10;
random(número)
contiene un número N = LI + (int)(Math.random() * LS); N con valor de [10,
aleatorio. 50]
P = 3.14159284;
V = (double)Math.round(P*100)/ 100; 3.14
Devuelve un núme-
V = (double)Math.round(P*10000)/10000; 3.1416
ro redondeado a un
V = (double)Math.round(P); 3.0
round(número) número especifica-
P = -3.14159284;
do de posiciones
V = (double)Math.round(P, 5); -3.14159
decimales.
V = (double)Math.round(P, 6); -3.141593
V = (double)Math.round(P, 0); -3.0
Devuelve un núme-
ro de tipo real que A = 1.3; Ángulo en radianes
sin(número)
especifica el seno C = 1 / Math.sin(A); Calcula la cosecante
de un ángulo.
Devuelve un nú-
R = Math.sqrt(4); Devuelve 2
mero de tipo real
R = Math.sqrt (23); Devuelve 4.7958315233
sqrt(número) que especifica la
R = Math.sqrt (0); Devuelve 0
raíz cuadrada de un
R = Math.sqrt (-4); Genera un error
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares

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.

En el lenguaje java no se define las funciones internas para determinar:

El código ASCII de un carácter dado.

El carácter de un código ASCII dado.

La subcadena comenzando desde el lado izquierdo de una cadena dada.

La subcadena comenzando desde el lado derecho de una cadena dada.

Truncar los decimales de un valor real.

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

2.7.4. Funciones internas en lenguaje Python


Tabla 26. Funciones en lenguaje Python

Función Descripción Uso


Devuelve un valor
del mismo tipo
que el que se pasó
N = abs(50.3) se almacena en N 50.3
abs (número) como parámetro y
N = abs(-50.3) se almacena en N 50.3
que especifica el
valor absoluto de
un número.
Devuelve el án-
gulo cuyo coseno S = 0.70710678118654 Valor coseno π/4 (45 grados)
acos(número)
es el número A = acos(S) Devuelve π/4 grados
especificado.
Devuelve el án-
gulo cuyo seno S = 0.70710678118654 Valor seno π/4 45 gados
asin(número)
es el número A = asin(S) Devuelve π/4 gados
especificado.
Devuelve un dato
de tipo real que
atan(número) especifica el arco Valor_PI = 4 * atan(1)
tangente de un
número.
Devuelve un
dato de tipo real
A = 1.3 Ángulo en radianes
cos(número) que especifica
S = 1 / math.cos(A) Da la secante
el coseno de un
ángulo.
Devuelve un dato
de tipo caracter
C = chr(65) Devuelve A
que contiene el
C = chr(97) Devuelve a
chr(codigocar) caracter asociado
C = chr(62) Devuelve >
con el código de
C = chr(37) Devuelve %
caracter especi-
ficado.
Devuelve un dato
de tipo real que
específica e (la
A = 1.3
exp(número) base de los loga-
Seno_Hip = (exp(A) – exp(-1 * A)) / 2
ritmos naturales)
elevado a una
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares

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

En el lenguaje Python no se define las funciones internas para calcular:

La subcadena desde un punto hasta otro de la cadena dada. 135


135
La subcadena comenzando desde el lado izquierdo de una cadena dada.

La subcadena comenzando desde el lado derecho de una cadena dada.

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.

Tabla 27. Procedimiento para el cálculo de algunos datos en Python

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

Tabla 28. Funciones en lenguaje JavaScript

Función Descripción Uso


Devuelve un valor
del mismo tipo
que el que se pasó
N = Math.abs(50.3); se almacena en N 50.3
abs (número) como parámetro y
N = Math.abs(-50.3); se almacena en N 50.3
que especifica el
valor absoluto de
un número.
Devuelve el án-
S = 0.70710678118654; Valor coseno π/4 (45 gra-
gulo cuyo coseno
acos(número) dos)
es el número
A = Math.acos(S); Devuelve π/4 grados
especificado.
Devuelve el án-
gulo cuyo seno S = 0.70710678118654; Valor seno π/4 (45 grados)
asin(número)
A = Math.asin(S);
Fundamentos de lógica para programación de computadores · Cap. 2 · Definiciones preliminares

es el número Devuelve π/4 grados


especificado.
Devuelve un dato
de tipo real que
atan(número) especifica el arco Valor_PI = 4 * Math.atan(1);
tangente de un
número.
Devuelve un
dato de tipo real
A = 1.3; Radianes
cos(número) que especifica
S = 1 / Math.cos(A); Da la secante
el coseno de un
ángulo.
Devuelve un dato
de tipo real que
específica e (la
A = 1.3;
exp(número) base de los loga-
Seno_Hip = (Math.exp(A) – Math.exp(-1 * A)) / 2;
ritmos naturales)
elevado a una
potencia (ex).
Devuelve un dato
de que contiene
Obj.length(ca- C = new String(“Hola a todos”);
el número de
dena) P = C.length; Devuelve 12
caracteres en una
cadena.
Devuelve un nú- N = 45; Número dado
mero de tipo real L = Marl.log(N); Devuelve 3.80666249
que especifica el M = 2.718281828; Constante e
log(número)
logaritmo natural L = Math.log(M); Devuelve 1
o neperiano del L = Math.log(Math.exp(N)); Devuelve 45
número dado. L = Math.log(N) / Math.log(10); Logaritmo base 10 de N
Devuelve un
número que re- P= 4.5;
pow(base,
presenta la base B= 2.1;
potencia)
elevado a la po- R = Math.pow(B, P); Devuelve 28.1829744098
tencia BP
Devuelve un nú- LS = 50;
random(nú- mero de tipo real LI = 10;
mero) que contiene un N = Math.trunc(LI + Math.random()*(LS-LI+1)); N con valor
número aleatorio. de [10, 50]
Devuelve un nú-
mero redondeado NPI = 3.14159284;
a un número V = Math.round(NPI*100)/ 100; Da 3.14
round(número)
especificado de V = Math.round(NPI*10000)/10000; Da 3.1416
posiciones deci- V = Math.round(NPI); Da 3
males.
Devuelve un nú-
mero de tipo real
A = 1.3; Ángulo en radianes
sin(número) que especifica
C = 1 / Math.sin(A); Calcula la cosecante
el seno de un
ángulo.
Devuelve un nú-
R = Math.sqrt(4); Devuelve 2
mero de tipo real
R = Math.sqrt (23); Devuelve 4.7958315233
sqrt(número) que especifica la
R = Math.sqrt (0); Devuelve 0
raíz cuadrada de
R = Math.sqrt (-4); Genera un error
un número.
Devuelve un nú- String C=” Demostración función Mid”;
Obj.substr(ini- mero especifica- P = C.substr(0, 12); Devuelve “Demostración”
cio [,cant]) do de caracteres U = C.substr(21, 3); Devuelve “Mid”
de una cadena. M = C.substr(13); Devuelve “función Mid”
Devuelve un nú-
mero de tipo real
A = 1.3; Define ángulo en radianes
tan(número) que especifica la
C = 1 / Math.tan(A); Calcula la cotangente
tangente de un
ángulo.
Devuelve un a = 1234.542334; 137
número que co- b = Math.trunc(a); Devuelve 1234
trunc(número) rresponde con la d = 3;
137
parte entera de c = Math.pow(10.0,d);
un valor real. e = Math.trunc(c*a) / c; Devuelve 1234.542

En el lenguaje JavaScript no se define las funciones internas para determinar:

El código ASCII de un carácter dado.

El carácter de un código ASCII dado.

La subcadena comenzando desde el lado izquierdo de una cadena dada.

La subcadena comenzando desde el lado derecho de una cadena dada.

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

M = C.substr(N); Devuelve “función Mid”


cadena dada
Obtener el nú- p = Math.PI; Devuelve
mero π. 3.141592653589793

2.7.6. Funciones internas en lenguaje PHP


En el lenguaje PHP las funciones internas se observan a continuación:

Tabla 30. Funciones en lenguaje PHP

Función Descripción Uso


Devuelve un valor del
mismo tipo que el
que se pasó como pa- $n = abs(50.3); se almacena en N 50.3
abs ($número)
rámetro y que especi- $n = abs(-50.3); se almacena en N 50.3
fica el valor absoluto
de un número.
Devuelve el ángulo $s = 0.70710678118654; Valor coseno π/4 (45
acos($número) cuyo coseno es el grados)
número especificado. $a = acos($s); Devuelve π/4 grados
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 especi- $a = 1.3; Radianes
cos($número)
fica el coseno de un $s = 1 / cos($a); Da la secante
ángulo.
Devuelve el carácter C = chr(65); Devuelve A
que corresponden C = chr(97); Devuelve a
chr($codigocar)
con el valor del dato C = chr(62); Devuelve >
entero especificado. C = chr(37); Devuelve %
Devuelve un dato de
tipo real que especí-
fica e (la base de los $a = 1.3;
exp($número)
logaritmos naturales) $seno_hip = (exp($a) – exp(-1 * $a)) / 2;
elevado a una poten-
cia (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 dato
de tipo entero que
representa el có- N = ord(“A”); Devuelve 65
ord ($cadena) digo del caracter N = ord(“a”); Devuelve 97
correspondiente a la N = ord(“Apple”); Devuelve 65
primera letra de una
cadena tipo string.
Devuelve el valor de
pi() $p = pi(); p guarde 3.1415926535898
la constante π
Devuelve un número
$p= 4.5;
pow($base, que representa la
$b= 2.1;
$potencia) base elevado a la
$r = pow($b, $b); Devuelve 28.1829744098
potencia BP
Devuelve un núme-
$ls = 50;
139
ro de tipo real que
rand($número)
contiene un número
$li = 10; 139
$n = rand($li, $ls); N con un valor de [10, 50]
aleatorio.
Devuelve un número $p = 3.14159284;
redondeado a un nú- $v = round($p*100)/ 100; 3.14
round($número)
mero especificado de $v = round($p*10000)/10000; 3.1416
posiciones decimales. $v = round($p); 3
Devuelve un núme-
ro de tipo real que $a = 1.3; Ángulo en radianes
sin($número)
especifica el seno de $c = 1 / sin($a); Calcula la cosecante
un ángulo.
Devuelve un número $r = sqrt(4); Devuelve 2
de tipo real que es- $r = sqrt (23); Devuelve 4.7958315233
sqrt($número)
pecifica la raíz cua- $r = sqrt (0); Devuelve 0
drada de un número. $r = sqrt (-4); Genera un error NAN
Devuelve un dato
de que contiene el $c = “Hola a todos”;
strlen(cadena)
número de caracteres $p = strlen($c); Devuelve 12
en una cadena.
$c=” Demostración función Mid”;
Devuelve un núme- $p = substr($c, 0, 12); Devuelve “Demos-
substr(cadena,
ro especificado de tración”
inicio [,longi-
caracteres de una $u = substr($c, 21, 3); Devuelve “Mid”
tud])
cadena. $m = substr($c,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 tangente $c = 1 / tan($a); Calcula la cotangente
de un ángulo.

En el lenguaje PHP no se definen las funciones internas para calcular:

La subcadena comenzando desde el lado izquierdo de una cadena dada.


La subcadena comenzando desde el lado derecho de una cadena dada.

Truncar los decimales de un valor real.

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:

Tabla 31. Procedimiento para el cálculo de algunos datos en PHP

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

2.8. TRADUCCIÓN DE EXPRESIONES


Para escribir correctamente las expresiones algebraicas en el lenguaje de los
computadores y que este ejecute adecuadamente todas las operaciones des-
critas, debe traducirse la expresión algebraica siguiendo las reglas de prioridad.
Una expresión algebraica traducida a lenguaje de computador se llama expre-
sión algorítmica.

Ejemplo 15. Traducir a su correspondiente expresión algorítmica la siguiente


expresión algebraica:
y2 - y1
m(x,y) =
X2 - x1

Para hacer la traducción de la expresión primero se deben escribir los nom-


bres de las variables como corresponde, según nombres de identificadores váli-
dos, es decir, usando las reglas para dar nombres a los identificadores (Tabla 32)::
Tabla 32. Traducción de variables

Variable algebraica Variable Algorítmica


X2 X2
X1 X1
Y2 Y2
Y1 Y1
m(x, y) M

Luego, usando las reglas de prioridad o precedencia se puede escribir la expresión en


su forma algorítmica, así:

M = (Y2 - Y1) / (X2 - X1)

|eLN (x) - x | seno(xy )


f =
coseno(x) - seno(y)
La traducción de esta expresión involucra funciones internas de tal manera que su
traducción concreta depende de la definición que haya hecho el lenguaje para cada una
de ellas, si es que las tiene definidas. En caso de no estar definidas debe averiguarse la 141
141
forma de implementar la función para su correspondiente traducción al lenguaje concreto.
Las variables en esta expresión son X, Y y f que para efectos de la traducción se pueden
usar como identificadores válidos. La traducción será:

Para eln (x) su traducción será: EXP(Log(X))

Ahora, al exponente se le resta el valor de X, esto es:

EXP(LOG(X)) - X

A este resultado se le calcula el valor absoluto, dando la siguiente traducción:

ABS(EXP(LOG(X))- X)

Según la expresión algebraica, al valor absoluto se le debe multiplicar por el seno de


XY, lo que da:

ABS(EXP(LOG(X)) - X) * SIN(X * Y)

Obteniendo de esta manera la traducción del numerador de la expresión de origen.


Para el denominador se procede así:

La expresión coseno(X) – seno(Y) se traduce: COS(X) – SIN(Y)


Y como el denominador es una raíz cuadrada, esta se traduce dependiendo de la im-
plementación que un lenguaje formal haya hecho para la raíz. A continuación se presenta
la implementación de la traducción de la expresión en algunos lenguajes (Ver tabla 33):

Tabla 33. Traducción de la expresión

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

Al final el resultado completo de traducir la expresión será (tabla 34):

Tabla 34. Traducción de la expresión completa.

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.

Ejemplo 17. Traducir a su correspondiente expresión algorítmica la siguiente expresión alge-


braica:
3
|x * e1 - x | -5
f (x, y) = + π * x2
x+y
1-π

La traducción del radical sería (Ver tabla 35):


Tabla 35. Traducción de la expresión

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);

Y la traducción completa de la expresión es (tabla 36):

Tabla 36. Traducción de la expresión completa

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

Java (Math.pow(Math.abs(X* Math.exp(1-X)/Y),1/3)+5)/((X+Y)/(1- 143


3,141592))+ 3,141592* Math.pow(X,2); 143
Python (pow(abs(X* exp(1-X)/Y),1/3)+5)/((X+Y)/(1-3,141592))+
3,141592*pow(X,2)
JavaScript (Math.pow(Math.abs(X* Math.exp(1-X)/Y),1/3)+5)/((X+Y)/(1-
3,141592))+ 3,141592* Math.pow(X,2);
PHP (pow(abs($X*exp(1-$X)/$Y),3)+5)/(($X+$Y)/(1-3,141592))+
3,141592*pow($X,2);

2.9. EJERCICIOS DE REPASO


Indique cuáles de los siguientes nombres de variables son correctos:

a) Sueldo g) Temporal 2 m) Renta s) Dos Pulgadas

b) 1sueldo h) I n) Alquiler t) C3PO

c) Sueldo i) I–J o) Constante u) Bienvenidos#1

d) Temporal1 j) J p) Tom’s v) elemento

e) 4ª2D2 k) 13Apellido q) Nom_y_Apell w) NomyApell

f) B l) A+Nota r) Caida-Libre x) BJ34


Indique cuáles de las siguientes constantes son válidas:

a) 3.141592 g) 2.2E-8 m) “sub”

b) 0.0026 h) –45.52E0.17 n) “Los dos”

c) “A” i) 45.1E.6 o) “este-otro”

d) 14.1E-04 j) .14E14 p) “A” - “B”

e) 2.124E7 k) 43D23.14 q) “LOS_TRES”

f) 3456E+8 l) “Wilson” r) “CC”_”BB”

Diga cuál es el tipo de datos de cada uno de las siguientes constantes:

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

d) “617” h)”sol bello”

Escriba los siguientes números como constantes reales de 6 dígitos significativos:

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.

¿Cuál es el resultado de las siguientes instrucciones de asignación? (Se supone que M,


N, P son variables de tipo real.
1. A = 2.4

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

3 N= X>=6 AND Y*X< 4^X OR NOT X/Y > Y/X

b) .1 A = “LOS”

2 B = “LAS”

3 C = “TACOS DE CHILE PICANTE”

4 D = “SON DE LO MERO MACHO”

5 E = “PARA HEMBRAS DE MEXICO”

6 F = B+subStr (E,6,7)+“ “+subStr(C,7,2)+“ “+Right(E,6)+ “ “+Left(D,3)+“ “+Right(C,7)+”S”

7 G = NOT A > B OR B = ”Las”

Traduzca las siguientes expresiones algebraicas a sus correspondientes expresiones al- 145
gorítmicas. 145

e2x-i - e2y-i arceno (x)


a) D= x + + |x - y3|
LN( y ) tan2 (y)

1
b) H = 3x2 + coseno2 ((2y - 1)3) - xy 5

1 - 3 TETO
TIA
TIO
c) M = TATO 1
2
+
TITA 3
TUTO2 + TITI2

d) f(x) = a0 + a1 coseno nπx + b1 seno nπx


m m

Traduzca las siguientes expresiones algorítmicas a sus correspondientes expresiones al-


gebraicas.

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.

Conocer y usar los diagramas de flujo y los


pseudocódigos como técnicas para escribir
algoritmos.

Reconocer la escritura de algoritmos en algunos


lenguajes para programación de computadores 148
149

3.1. DEFINICIÓN DE ALGORITMO


Según G. Brassard en Fundamentos de algoritmia, traducido por Rafael Gar-
cía-Bermejo, Ricardo Peña, Narciso Martí y Luis Joyanes Aguilar, un algoritmo
es un conjunto organizado de pasos y reglas que se utilizan para efectuar
(manualmente o usando máquinas) algún cálculo (Brassard & Paul, 1997).
Ejemplos de algoritmos son los procedimientos que aprendimos para hacer
sumas, restas, multiplicaciones o divisiones. Algunos algoritmos famosos
son, por ejemplo, el algoritmo de Euclides para calcular el máximo común
divisor de dos números enteros, el algoritmo para calcular el mínimo común
múltiplo, la división de un polinomio mediante la regla de Ruffini o la con-
versión de valores entre los diferentes sistemas numéricos.
Brassard también considera que una receta de cocina no se podría considerar algoritmo
ya que, a pesar de que son un conjunto de pasos ordenados secuenciales, incluyen decisiones
subjetivas y no precisas como por ejemplo suministrar sal al gusto o cocinar a determinado tér-
mino según la preferencia del cocinero. En consecuencia, la ejecución de un algoritmo no debe
implicar, normalmente, ninguna decisión subjetiva, ni tampoco hacer uso de la intuición ni de
la creatividad. Un algoritmo debe ser muy preciso y detallado en cada una de sus actividades.
Igualmente, Brassard sostiene que una aparente excepción a esta regla son los procedimientos
aleatorios. De otra parte, están los algoritmos que dan respuestas aproximadas, son válidos
siempre que sean un conjunto de pasos y reglas precisas y se pueda determinar un nivel de
error aceptable. En contraste a estos algoritmos aproximados están los denominados heurís-
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

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

Un tercer algoritmo sería:

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

La forma como se escriben los resultados de las multiplicaciones depende de la cantidad


de cifras del segundo factor (0419) de la multiplicación. La respuesta de primera multiplica-
ción (208) se debe poner cuatro lugares hacia la izquierda con relación a la respuesta (874)
de la cuarta multiplicación (46*16). La respuesta de la segunda (988) y tercera (184) multipli-
cación, a su vez, se pondrían dos lugares a la izquierda de la respuesta de la cuarta multipli-
cación. La respuesta de la multiplicación es la suma de los resultados de las multiplicaciones
como se ve en el ejemplo.
Es necesario tener la precaución de que los algoritmos son independientes tanto del
lenguaje de programación en que se expresan como del computador que los ejecuta. En
cada problema el algoritmo se puede expresar en un lenguaje diferente de programación y
ejecutarse en una computadora distinta; sin embargo, el algoritmo será siempre el mismo.
Así, por ejemplo, en una analogía con la vida diaria, una receta de cocina se puede expresar
en español, inglés o francés, pero cualquiera que sea el idioma, los pasos para la elabora-
ción del plato se realizarán igual sin importar el idioma del cocinero (Brassard & Paul, 1997).
En la ciencia de la computación y en la programación, los algoritmos son más impor-
tantes que los lenguajes de programación o las computadoras. Un lenguaje de programa-
ción es tan solo un medio para expresar un algoritmo y una computadora es solo un pro-
cesador para ejecutarlo. Tanto el lenguaje de programación como la computadora son los
medios para obtener un fin: conseguir que el algoritmo se ejecute y se efectúe el proceso
correspondiente (Brassard & Paul, 1997).
En este mismo sentido Rosa Guerequeta y Antonio Vallecillo en Técnicas de Diseño
de Algoritmos afirman que desde la perspectiva del problema y del dispositivo que va a
resolver el problema, el algoritmo es el método (secuencia finita de órdenes) que permite
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

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).

3.1.1. Características fundamentales de un programa


La Universidad Nacional de Colombia en su página “Dirección Nacional de Servicios Académi-
cos virtuales” considera que las características de todo algoritmo son precisión, definición y
finitud (Universidad Nacional de Colombia. Dirección Nacional de Innovación Académica, 2009).

Tabla 37. Características de todo algoritmo

Precisión Definición Finitud


Referido al hecho de
Referido al orden co- Todo algoritmo debe pre-
que para los mismos
rrecto sin ambigüeda- sentar claramente un punto
datos de entradas el al-
des en la ejecución de de inicio y desde éste se
goritmo entregue como
las tereas consideradas debe llegar a un punto de
resultado las mismas
por el algoritmo. finalización del mismo.
respuestas.

Fuente: Universidad Nacional de Colombia Sede Bogotá. Página web de


“servicios académicos virtuales”.
(http://www.virtual.unal.edu.co/cursos/ingenieria/2001839/modulo1/cap_02/leccion101.htm)

3.1.2. Componentes fundamentales de un programa


A partir de los lineamientos de la Universidad Nacional, se puede afirmar que un algoritmo
está constituido fundamentalmente por secuencias de instrucciones con algunos puntos
de control que determinan el orden de ejecución de dichas secuencias (Universidad Nacio-
nal de Colombia. Dirección Nacional de Innovación Académica, 2009). Estos componentes
se entienden como:
Secuencia: un conjunto de instrucciones, una después de otra.
Puntos de control.
Decisiones: de acuerdo con una condición dada se ejecuta una secuencia u otra.
Iteración. A partir de una condición dada se repite la ejecución de una secuencia.
[T2]3.2. SOLUCIÓN DE PROBLEMAS

3.2.1. Problemas secuenciales


Retomando los planteamientos de la Universidad Nacional sobre el tema, se puede decir
que hay muchos tipos de problemas, pero desde el punto de vista de su solución a través
de computadores, solo nos enfocaremos en este texto en aquellos problemas que tienen
soluciones algorítmicas o secuenciales. Es decir, soluciones en las que se pueda llevar una
secuencias ordenada, precisa y finita de procedimientos, actividades y restricciones (Uni-
versidad Nacional de Colombia. Dirección Nacional de Innovación Académica, 2009).

3.2.2. Descomposición de los problemas secuenciales


Retomando lo visto en el capítulo 2 (figura 13), todo sistema de cómputo tiene unos ele-
mentos de entrada, unos de salida y una unidad que procesa información suministrada
por las entradas y entrega respuestas por las salidas. Así que todos los problemas de corte
algorítmico, tienen soluciones que se deben implementar desde la perspectiva de identifi-
car cuáles son las entradas, los procesos y las salidas. En consecuencia, al estudiar una so-
lución para el problema, se debe centrar la atención en descubrir cuáles son los elemen-
tos conocidos del problema (Entrada); cuáles son los procedimientos, tareas, actividades,
152
restricciones y condiciones, así como los medios que permiten el procesamiento de los
153
datos conocidos (Procesos) y, por último, ver cuáles son las respuestas o resultados (Sali-
da) que el problema plantea. En el algoritmo de la receta de cocina, citado anteriormente,
por ejemplo, expresado desde las tres componentes identificables de un problema será:

Entradas: Ingredientes y utensilios empleados.

Proceso: Elaboración de la receta en la cocina.

Salidas: Plato terminado.

Otro ejemplo, expresado en términos de los componentes de un problema, puede ser


aquel que pide calcular el promedio de la calificación de un estudiante tomando cuatro
notas parciales, entonces tendríamos:

Entradas: Las notas parciales.

Proceso: Calcular el promedio como la suma de las


cuatro notas parciales divida por cuatro.

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

De manera visual y sin perder de vista el concepto de sistema de cómputo, se puede


ver estos pasos como lo muestra la figura 28, en la que partiendo del problema (entrada)
y utilizando una metodología se obtiene un algoritmo (proceso) implementado en un len-
guaje de programación o programa de computador (salidas) que, evidentemente, usándolo
en un computador permite resolver el problema dado.

Figura 28. Resolución de problemas algorítmicos.

La Universidad Nacional también propone las siguientes actividades para desarrollar


programas de computador o para la implementación de algoritmos: el diálogo, las especi-
ficaciones, el diseño, la codificación y las verificaciones (Universidad Nacional de Colombia.
Dirección Nacional de Innovación Académica, 2009). A lo largo del texto se incluirán tres
actividades más en la metodología que resultan indispensables para dar mayor claridad al
proceso de construcción de los programas de computador:
Investigación preliminar.
Especificación.
Diseño.
Prueba de escritorio.
Codificación.
Traducción y trascripción
Pruebas de funcionamiento
Documentación
Los pasos 1, 2, 3 y 4 conforman una primera etapa que se refiere al diseño del algo-
ritmo, los pasos 5 y 6 corresponden a segunda etapa en la metodología que se refiere a
las actividades de la programación del algoritmo y los pasos 7 y 8 corresponden a una
tercera etapa de verificación y convalidación del programa con el uso de una computa-
dora. El alcance de este libro solo cubre hasta el paso 6, puesto que para efectuar las
pruebas de funcionamiento se requiere del uso de computador y de los conocimientos
necesarios para la traducción del algoritmo a un lenguaje concreto como Visual Basic, C,
Java, Python, JavaScript, PHP o algún otro de los muchos existentes o el que se requiera
en una situación dada.

3.3.1. PASO 1: Investigación Preliminar


En la investigación preliminar se pretende identificar claramente los componentes de un
algoritmo, estableciendo en primer lugar cuáles son los datos de entrada o elementos
conocidos del problema; en segundo lugar, determinando cuáles son las restricciones,
condiciones y procedimientos involucrados en el problema y la manera exacta como se
usan los datos de entrada en ellos, para así obtener en tercer lugar los resultados o sali-
das, logrando comprender totalmente el problema a resolver. Se debe encarar este paso
pensando que el problema es susceptible de dividirse en partes y que cada parte se puede
analizar por separado. Como se puede percibir de las anteriores afirmaciones, se sigue el
mismo esquema conceptual que fue presentado por el sistema de cómputo mostrado en
la figura 13 del capítulo 2.
La investigación preliminar es la actividad de la metodología que consiste en la indaga-
154
ción de toda la información disponible del problema del cual se quiere hacer un programa 155
y para ello se debe hacer uso de alguna técnica de recolección de información como: en-
trevistas, grupos focales, revisión de literatura, estudio de caso, observaciones, cuestiona-
rios, listas de chequeo, entre otras o una combinación de estas. Se deben utilizar todos los
medios necesarios para adquirir experiencia y dominio en la temática del problema; tanto
que en lo posible se llegue a ser experto o alcanzar un nivel de experticia en el manejo
de la temática. Hay que tener presente que si la primera actividad queda mal, de aquí en
adelante todo saldrá mal, ya que con base en los resultados de esta primera actividad es
que se ejecutan y construyen los resultados de cada una de las siguientes actividades en
la metodología.

3.3.2. PASO 2: Especificación


A partir de la investigación preliminar, se podrá entender el problema. De tal modo, en
este paso se procede a hacer una descripción detallada de todos los datos de entrada y la
naturaleza de los mismos, los límites impuestos tanto por el problema como por la misma
naturaleza del computador, de las restricciones y condiciones, de los procedimientos invo-
lucrados, de la organización de la presentación tanto de los datos de entrada como de los
resultados a obtener con el algoritmo o programa. Un problema que no esté claramente
especificado puede ser interpretado de diferentes maneras y al diseñar un algoritmo a
partir de esto, se puede terminar construyendo un algoritmo que no soluciona el problema
o que lo solucione parcialmente.
En términos concretos, la especificación de un problema se hace mediante una des-
cripción clara, precisa y detallada de las entradas que el algoritmo o programa recibirá, de
la dependencia que mantendrán las salidas obtenidas con las entradas recibidas y de las
salidas que el algoritmo o programa entregará. Esquemáticamente esto se puede ver como
un diagrama de caja negra, similar al que se observa en la figura 29.
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

Figura 29. El algoritmo como una caja negra.

Fuente: Universidad Nacional de Colombia Sede Bogotá. Página web de


“servicios académicos virtuales”.
(http://www.virtual.unal.edu.co/cursos/ingenieria/2001839/modulo1/cap_02/leccion101.htm)

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.

3.3.3. PASO 3: Diseño


En este paso se construye un algoritmo que cumpla con las especificaciones. Esta construc-
ción consiste en expresar mediante una forma estándar de escritura de algoritmos (pseu-
docódigo o diagramas de flujo) las secuencias lógicas de actividades y los puntos de control
inherentes al problema. El problema se puede comprender entonces como un proceso con
un orden lógico de ejecución mediante el cual se obtiene los resultados al problema. El pro-
ceso se puede considerar como la forma de abstracción del problema, en el cual se pueden
identificar claramente componentes del mismo, los que a su vez se pueden tomar como nue-
vos procesos. A estos componentes del problema, se le puede ver como subprocesos; de tal
forma, el problema o proceso se divide en varios subproblemas o subprocesos hasta llegar
al nivel de instrucciones, es decir, hasta obtener cada una de las actividades más simples e
indivisibles que lo componen. Este hecho se ilustra en la figura 30.
Durante el proceso de división se determinan las secuencias y puntos de control (condi-
ciones, selecciones, repeticiones, asignaciones, lecturas o escrituras) que se puede asociar con
cada actividad o instrucción que componen el problema.
El diseño debe ser implementado en algún método que permita independizar el algo-
ritmo del lenguaje de programación en el que posteriormente se va a codificar el problema
como un programa de computador. Para conseguir este objetivo se precisa que el algoritmo
sea representado gráfica o alfanuméricamente, de modo que las secuencias de acciones y
puntos de control no dependan de la sintaxis de ningún lenguaje de programación, sino que
la descripción pueda ser fácilmente transformada en un programa en cualquier lenguaje. Los
diagramas de flujo, a pesar de ser la técnica de representación de algoritmos más antigua, es
la más utilizada. Un diagrama de flujo es un gráfico que utiliza símbolos y que tienen los pasos
del algoritmo escritos en cajas que están unidas por flechas, denominadas líneas de flujo, que
indican cómo se deben ejecutar las secuencias y puntos de control descritas por el algoritmo.

156
157

Figura 30. División sistemática del proceso.


Un ejemplo de un algoritmo representado por medio de un diagrama de flujo básico se
muestra en la figura 31. El diagrama representa la resolución de un problema que deduce
el salario neto de un trabajador a partir de la lectura de: nombre, horas trabajadas, precio
de la hora y sabiendo que los impuestos aplicados son 25 % sobre el salario bruto.

Figura 31. Diagrama de flujo.


Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

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.

Terminal: representa el inicio y el final de un algoritmo.


Puede representar también una parada o interrupción
que sea necesaria en un diagrama.

Entrada/Salida: cualquier tipo de introducción de datos


al algoritmo o salida de información por parte de este.

Proceso: cualquier tipo de operación en la que se involu-


cren cambios de los valores almacenados en la memoria
del computador.

Decisión: indica operaciones lógicas de comparación en-


tre datos, es decir, indica la evaluación de proposiciones
No Si y en función de los resultados obtenidos de la evaluación
? de las proposiciones se toma uno de dos posibles rutas a
seguir en el algoritmo.

Decisión múltiple: en función del resultado de la


comparación del valor almacenado en la variable X
X con alguna de las posibles opciones se toma un ca-
mino en el algoritmo.
1 2 3 4 5
158
Conector: sirve para enlazar dos partes de cualquier dia- 159
grama en una misma hoja. Un conector al que le llega
una flecha es el conector de salida y otro conector rotu-
lado de la misma forma, pero saliendo de él una flecha,
será un conector de entrada.

Indicador de dirección o línea de flujo en el diagrama:


indica el orden en que se deben ejecutar cada una de las
acciones en un diagrama de flujo.

Conector entre páginas: conecta dos partes de un dia-


grama de flujo que se encuentran en diferentes páginas.
Hay un conector con una flecha que le llega, indicando el
punto de salida del diagrama y, hay otro conector rotula-
do de la misma forma pero con una flecha que sale de él,
indicando la entrada al diagrama en otra página.

Llamada a subrutina o subprocedimiento: una subru-


tina es un procedimiento independiente del diagrama
pero que hace alguna tarea indispensable en el resul-
tado del algoritmo.

Pantalla: indica que los contenidos de las variables que


se muestran dentro del símbolo son visualizados en la
pantalla del computador.

Impresora: indica que los contenidos de las varia-


bles que se muestran dentro del símbolo son mos-
trados en la impresora que se encuentra conectada
y preparada para imprimir.

Teclado o consola: se usa para indicar que la entrada de


datos al computador se hará a través del teclado y que
presentará lo que se está digitando en la pantalla.
Es necesario tener presente que en todo diagrama de flujo:
· Existe una caja etiquetada “Inicio”, que es de tipo elíptico.
· Existe otra caja etiquetada “Fin” de igual forma que la anterior.
· Si existen otras cajas, normalmente son rectangulares, tipo rombos o paralelogramos,
el resto de las figuras se usan eventualmente dependiendo la naturaleza del proble-
ma y de las especificaciones determinadas.
· Se puede escribir una actividad, acción, paso o instrucción en una caja rectangular
y el uso de las flechas significa que las cajas no necesariamente se deben escribir
unas debajo de otras; sin embargo, abusar de esta flexibilidad conduce a un diagrama
de flujo complicado e ininteligible. Hay que resaltar que, exceptuando los símbolos
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

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

La elaboración de un programa requerirá conocer el juego o repertorio de instruc-


ciones del lenguaje equivalentes con los componentes del diagrama de flujo. A conti-
nuación, presentamos los tipos fundamentales de instrucciones que una computadora
es capaz de manipular y ejecutar. Las instrucciones básicas y comunes se pueden con-
densar en cuatro grupos:
· Instrucciones de entrada/salida. Instrucciones que transfieren información y datos
entre dispositivos periféricos (teclado, impresora, unidad de disco, etc.) y la memo-
ria central. En términos concretos se refiere a las instrucciones para leer y escribir.
· Instrucciones aritmético-lógicas. Instrucciones que ejecutan operaciones aritmé-
ticas (suma, resta, multiplicación, división, potenciación), lógicas (operaciones and,
or, not, etc.) y de relación (<, >, <=, >=, <>, =).
· Instrucciones selectivas. Instrucciones que permiten la selección de tareas alter-
nativas en fun¬ción de los resultados de diferentes expresiones condicionales. En
términos concretos las instrucciones como el Si—Entonces—contrario.
· Instrucciones repetitivas. Instrucciones que permiten la repetición de secuencias
de instrucciones un número determinado o indeterminado de veces.

3.3.4. PASO 4: Prueba de Escritorio


La manera para determinar si un algoritmo cumple con las necesidades para lo que fue
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

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.

3.3.5. PASO 5: Codificación


El quinto paso de la metodología consiste en traducir el algoritmo a un lenguaje de pro-
gramación formal. Esto se hace una vez que se ha diseñado, se ha probado completamente
el algoritmo y se tiene escrito en algún esquema de representación (pseudocódigo o dia-
grama de flujo).

3.3.6. PASO 6: Traducción y Trascripción


En este paso se toma el algoritmo y se traduce a un lenguaje concreto, tal como Visual
Basic, Lenguaje C, C++, JavaScript, PHP, Fox, Java, Python, etc. Se deben tener en cuenta to-
das las reglas que define el lenguaje para que funcione correctamente el algoritmo en el
computador y para eso hay que estudiar y comprender claramente el conjunto de reglas y
definiciones técnicas formales del lenguaje.
Después de tener el algoritmo escrito en un lenguaje de programación de computado-
res, se transcribe en el computador utilizando programas especializados para ello, es decir,
editores de programas o lo que se conoce como IDE (Integrated Development Environment),
los que cuentan con un buen número de ayudas para la correcta transcripción del mismo.
Estos IDEs, en términos generales, ayudan a corregir posibles errores de sintaxis más no de
lógica del algoritmo (Déléchamp & Laugié, 2016). Con la traducción y la correcta transcrip-
ción del algoritmo en el computador, está listo para ser ejecutado y poder verificar si se
obtienen los resultados deseados.
Cerrada Somolinos en Fundamentos de programación denomina al programa o algo-
ritmo trascrito como lenguaje de alto nivel que es inteligible para el ser humano, pero no
para el computador. La mayoría de las veces se opta por utilizar un lenguaje de alto nivel
para escribir el programa ya que están hechos para ser de fácil comprensión y manejo por
los programadores; mientras que los lenguajes de bajo nivel son muy difíciles de controlar,
manipular y comprender, pero son los que entiende el computador. Además, al escribir en
lenguajes de bajo nivel no se cuenta con ayudas para la trascripción y la depuración de los
códigos que representa el algoritmo.
La diferencia, entonces, entre los lenguajes de bajo nivel y los de alto nivel radica en
que los primeros se escriben directamente en códigos que la máquina comprende y puede
ejecutar, mientras que los últimos son simbolizaciones de los códigos que procesa el compu-
tador, que luego tienen que ser traducidos a lenguajes de bajo nivel para que la máquina los
ejecute. Esta simbolización se hace para facilitar la comprensión por parte del ser humano
de las formas como el computador adelanta tareas mediante la ejecución de programas. El
proceso de traducir los programas en lenguaje de alto nivel a programas comprensibles o
ejecutables por el computador, escritos en lenguaje de bajo nivel, se conoce con el nombre
de compilación (Cerrada Somolinos, 2010). Un esquema de cómo se adelanta el proceso de
compilación se presenta en la siguiente figura. 168
169

Figura 32. Compilación de un programa fuente.


Como se puede apreciar en la figura, el proceso de traducir un programa en len-
guaje de alto nivel a que sea ejecutable o entendible por el computador, comienza con
la trascripción conforme al algoritmo, por medio de un editor, al computador. Ya en el
computador, el programa traducido y transcrito se convierte en un archivo digitalizado
en lenguaje de alto nivel, el cual se denomina programa fuente. Este programa es to-
mado por el compilador y convertido a un archivo, denominado programa objeto, que
junto con unos datos necesarios llamados archivos de librerías, son unidos por medio
de un programa encadenador, para obtener a partir de estos el programa ejecutable,
el que queda escrito en lenguaje de bajo nivel o lenguaje de máquina. Es este archivo
el que contiene el conjunto de instrucciones concretas que la máquina interpreta para
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

cumplir con la tarea descrita en el algoritmo (Cerrada Somolinos, 2010).

3.3.7. PASO 7: Pruebas de funcionamiento


Con el programa ya terminado, es decir, con el archivo ejecutable a disposición, se comienza
un conjunto de pruebas para verificar el correcto funcionamiento. Este plan de pruebas debe
ser cuidadosamente armado para que se garantice, después de ejecutar el test completo, que
no hay ningún error.
Es muy importante que el test lleve el programa a los límites, es decir, que el plan de
pruebas debe considerar un funcionamiento típico del programa y un funcionamiento lle-
vado a todos los extremos posibles.

3.3.8. PASO 8: Documentación


En esta etapa de la metodología se elaboran los documentos que sirven de soporte al pro-
grama. Estos documentos corresponden al manual de usuario que describe en detalle el
funcionamiento del programa. El otro documento que se construye es el manual técnico que
describe los procesos y la metodología que se utilizaron para la elaboración del programa.

3.3.9. Ejemplos del uso de la metodología


A continuación, se presentan ejemplos de cómo se hace uso de la metodología para diseñar
algoritmos, sin olvidar que solamente se desarrollará hasta la etapa de traducción, como ya
se dijo, pues de esta en adelante se requiere de la competencia del computador.
EJEMPLO 1.
Construir un algoritmo que calcule el promedio de 4 calificaciones que un estu-
diante obtuvo en un curso.
Paso 1: Investigación preliminar.
Para el cálculo del promedio es necesario sumar todos los valores que se tengan y
después se divide esta suma por el número de valores involucrados en la suma. Esta-
dísticamente este proceso se expresa con la siguiente fórmula:

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

Y el promedio X sería la nota definitiva del estudiante en el curso, el cual se deberá


calcular con la suma dividida por cuatro.

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

Tabla 39. Etapa de especificación - Ejemplo 1 / Capítulo 3.

Dato de la nota 1 (N1: de tipo real)


Dato de la nota 2 (N2: de tipo real)
Entradas
Dato de la nota 3 (N3: de tipo real)
Dato de la nota 4 (N4: de tipo real)

SUMA = N1 + N2 + N3 + N4
Procesos
DEF = SUMA / $

Dato que es la nota promedio.


Salidas
DEF: Tipo real
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

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í:

Figura 33. Primer diagrama de flujo. Ejemplo 1 / Capítulo 3.


En el paso de división hay que subdividir el problema en partes, en este primer paso
se dividió en tres partes según las funciones de todo algoritmo: entrada, proceso y salida.
Luego se debe seguir dividiendo: tomar la entrada y dividirla para mostrar más detalles
acerca de los elementos que contiene el algoritmo con relación a la entrada de los datos.
La figura 34 muestra esta operación.

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.

Figura 35. División entrada y proceso – Ejemplo 1 / Capítulo 3.


Por último, se volverá a dividir de acuerdo con las especificaciones del problema, fun-
ción de salida que dará la salida o resultados del algoritmo. En esta división prácticamente
no hay que hacer nada pues el resultado es solo la nota promedio definitiva, es decir, que
el algoritmo reportará un único valor como resultado y por lo tanto hay una única actividad
en subproceso de salida (Ver figura 36).
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

Figura 36. Diagrama de flujo con todas las divisiones –


Ejemplo 1 / Capítulo 3.

Hasta este punto se ha hecho la representación del algoritmo como un diagrama de


flujo. Se puede también representar el algoritmo como un pseudocódigo, como se mues-
tra a continuación:

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

3 SUMA, DEF: Reales


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

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).

Figura 37. Diagrama resultado de la abstracción -


Ejemplo 1 / Capítulo 3
Como se aprecia en la figura, la entrada se ha reducido a una sola instrucción, en la que
se simboliza el hecho que hay que suministrar al algoritmo cuatro datos. El procesamiento
de la información se logra con la ejecución de una sola instrucción también. El equivalente
ahora del diagrama de flujo en pseudocódigo es:

1 Inicio

2 N1, N2, N3, N4, DEF: Reales

3 Leer N1, N2, N3, N4

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

Paso 4: Prueba de escritorio


Para adelantar la prueba de escritorio, y para efectos de dar una explicación más clara
y precisa de la misma, se ha tomado el algoritmo que se obtiene en la etapa de división,
ya que presenta más detalles que enriquecen la comprensión del mecanismo de la prueba
comparado frente al caso que se tomara el algoritmo que da como resultado de la etapa
de abstracción. La prueba comienza haciendo un recorrido desde el inicio hasta el fin del
algoritmo y sacando una lista con las variables que maneja, de este modo:

1 Inicio

2 N1, N2, N3, N4: Reales

3 SUMA, DEF: Reales

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

Todo inicia tomando el algoritmo en su representación de diagrama de flujo o pseudo-


código, de preferencia el que resulta del paso de abstracción. En este caso, para iniciar la
explicación, se tomará el pseudocódigo debido a que este presenta cada una las instruc-
ciones numeradas, lo cual ayudará a referirse explícitamente a cada una de ellas y poder
explicar claramente la ejecución de la prueba de escritorio.
La prueba de escritorio debe comenzar ejecutando la instrucción de la línea nume-
rada con 1, es decir, se inicia la ejecución del algoritmo. En las líneas 2 y 3 se definen las
variables y el tipo de dato que cada variable va a almacenar. En la línea 4 se ejecuta una
instrucción de entrada que permite que desde cualquier medio de captura de información
se suministren datos para que el algoritmo los procese. Según el diagrama de flujo, este
está diseñado para referirse específicamente a que un dato se suministrará por medio del
teclado. En términos de la prueba de escritorio, se debe pensar que hay un dato que entra
al algoritmo y queda almacenado en una variable en la memoria del computador. Este
hecho se manifiesta en la lista registrando debajo de nombre de la variable el dato como
se observa a continuación:

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

La siguiente instrucción es guardar en la variable DEF el valor 3.4 (SUMA/4). En la lista


se apunta así:

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

En conclusión, la prueba de escritorio es correcta, ya que se consiguió a partir de la


ejecución de cada una de las instrucciones del algoritmo que se diseñó para éste proble-
ma, al suministrar los datos 3.1, 3.0, 5.0 y 2.5 que corresponden a las notas de un estudiante,
obteniendo como nota promedio definitiva 3.4. Para estar seguros de los resultados del al-
goritmo se puede ejecutar de nuevo la prueba de escritorio. Suministrando otros datos en
esta segunda prueba y, obviamente, se deberá obtener un resultado acorde a estos nuevos
datos suministrados.
Paso 5: Codificación
Superado con éxito el paso 4 se procede a codificar el algoritmo, que no es otra cosa
que escribirlo utilizando un lenguaje formal de programación de computadores, aplicando
todas las reglas que este contenga. En este ejemplo, se desarrollará la codificación en dife-
rentes lenguajes; mostrando en algunos su respectivo seudocódigo y frente a él el lenguaje
de programación, sin entrar en detalles de las definiciones técnicas propias del lenguaje.

· Lenguaje

Inicio #include <stdio.h>

N1, N2, N3, N4: Reales

SUMA, DEF: Reales void main(){

float N1, N2, N3, N4;

Leer N1 float SUMA,DEF;

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 ) ;

DEF = SUMA / 4 s c a n f ( “ % f ”, & N 4 ) ;

Escribir DEF SUMA =

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

Fin Printf DEF


End Sub

· 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));

float N1, N2, N3, N4;


float SUMA, DEF;

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í:

Tabla 40. Etapa de especificación – Ejemplo 2 / Capítulo 3.3.

Entradas Tres Valores de tipo Real (X, Y, Z)

Si X > Y y X > Z entonces el MAYOR = X


Procesos Si Y > X y Y > Z entonces el MAYOR = Y
Si Z > X y Z > Y entonces el MAYOR = Z

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

Ejemplo 2 - Paso 3: Diseño


Aplicando la etapa de la división a partir de las especificaciones del problema se obtienen
los siguientes diagramas de flujo: (Ver figuras 38, 39 y 40).

Figura 38. Diagrama de flujo para la primera división –


Ejemplo 2 / Capítulo 3.
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

Figura 39. Diagrama de flujo para la segunda división


– Ejemplo 2 / Capítulo 3.

Figura 40. Diagrama de flujo para la tercera división –


Ejemplo 2 / Capítulo 3.
En la cuarta división aparece un elemento que corresponde al uso de los símbolos
para la toma de decisiones. Al dibujar estos elementos en los diagramas se debe tener en
cuenta que dentro de cada rombo se puede escribir una proposición, esto es, expresiones
lógicas que den como resultado un valor de Verdadero o Falso: Sí o No. (Ver figura 41).

182
183

Figura 41. Diagrama de flujo para la cuarta división –


Ejemplo 2 / Capítulo 3.

En la salida se utilizó un símbolo que representa el hecho de imprimir el resultado, es


decir que se usará la impresora para dejar escrito el valor el cual corresponde al mayor
valor de los tres introducidos.
Como se ha mostrado en los ejemplos 1 y 2, en los diagramas de flujo se ha escrito al
lado derecho las palabras que indican a que función del algoritmo pertenecen las instruc-
ciones, sin embargo, estas palabras no hacen parte constitutiva del algoritmo, solamente
son un referente informativo, por lo que no serán tenidas en cuenta para nada en el tra-
tamiento del algoritmo.
A continuación, se presenta la solución del ejemplo 2 en su representación de
pseudocódigo.

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

Haciendo una abstracción en este ejemplo, el resultado prácticamente es el mismo


algoritmo ya que no es posible reducir los procesos de la entrada sino a un solo símbolo;
con lo que el algoritmo resultante del paso tres de la metodología es el de la figura 42. La
abstracción es la siguiente:

Figura 42. Diagrama de la abstracción – Ejemplo 2 / Capítulo 3.


El pseudocódigo equivalente es el siguiente:

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

Paso 4: Prueba de Escritorio


Ahora procedemos a la prueba de escritorio tomando el algoritmo resultante de la 184
etapa de abstracción. En el ejemplo uno se tomó el algoritmo resultante de la etapa de 185
división (lo cual no es obligatorio, como ya se explicó) con el ánimo de exponer de forma
clara el procedimiento de la prueba, pero dicho mecanismo no es necesario para la prueba
de escritorio del ejemplo dos. Entonces, el algoritmo del ejemplo dos y la lista de variables
que se tomarán serán:

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:

X > Y AND X > Z

Reemplazando las variables por los valores que almacenan se tiene:

3 > 8 AND 8 > 5

Falso AND 8 > 5

Falso AND Falso

Falso

Con este resultado, la instrucción que se ejecuta es la 6, ya que la instrucción número


5 solo se ejecutará si la evaluación de la proposición da como resultado Verdadero.
Al ejecutar la línea 6, como sólo es una instrucción de control pasamos a ejecutar la
instrucción 7, aquí se tiene una evaluación de una nueva proposición y el resultado de ella
de acuerdo con los datos suministrados es:

Y > X AND Y > Z


Reemplazando por sus correspondientes valores, tenemos:

8 > 3 AND 8 > 5

Verdadero AND 8 > 5

Verdadero AND Verdadero

Verdadero

Lo que permite ver que la evaluación de la proposición es verdadera y que en con-


secuencia se ejecuta la instrucción número 8, la que escribe el valor almacenado en la
variable Y, es decir, el valor ocho. En consecuencia, el algoritmo escribe el valor ocho de
los tres suministrados (3, 8, 4). Las siguientes instrucciones que se ejecutan, después de la
instrucción 8, son la 14, 15 y 16 culminado la ejecución del algoritmo.
En conclusión, el algoritmo escribe el mayor de tres valores dados. La prueba de escri-
torio demuestra lo correcto del algoritmo. La lista de variables se verá así:
186
X Y Z 187
3 8 5

Como lo demostró la prueba de escritorio no todas las instrucciones son ejecutadas.


Se ejecutan según la evaluación de las proposiciones. Si esta es verdadera se optará por
un camino, si es falsa se ejecutará un grupo alterno de instrucciones; todo depende de
los valores que se suministren. Para los valores suministrados se ejecutó en su orden las
instrucciones 1, 2, 3, 4, 6, 7, 8, 14, 15 y 16.
Realizaremos nuevamente la prueba de escritorio con el ánimo de probar el algoritmo
con otro grupo de valores, ésta da inicio con la instrucción número 1, luego la instrucción
número 2 (Definición de las variables), luego la instrucción 3 que indica el hecho de sumi-
nistrar los valores al algoritmo, en éste caso tomamos los valores 9, 1 y 7 los que quedan
almacenados en X, Y y Z respectivamente. Retomando la lista de variables que se lleva y

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:

X > Y AND X > Z


Reemplazando las variables por sus correspondientes valores, se tendrá:

9 > 1 AND 9 > 7

Verdadero AND 9 > 7

Verdadero AND Verdadero

Verdadero

Como se muestra, la evaluación de la proposición es verdadera, lo que permite decidir


Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

que la instrucción que a continuación se ejecuta es la 5, que escribe el contenido de la


variable X, correspondiente al valor nueve. La lista de variables se vería así:

X Y Z
9 1 7

Después de escribir el valor de nueve se ejecutan las instrucciones de control 15 y 16 para


terminar. De tal modo, tras ejecutar las instrucciones 1,2, 3, 4, 5, 15 y 16 del algoritmo para el
conjunto de valores 9, 1 y 7, se imprime 9 como mayor valor. En conclusión, se puede decir que
el algoritmo cumple con las especificaciones del problema, es decir, que escribe el mayor de
tres valores dados.
los nuevos valores, después de la segunda prueba parcial, se vería de la siguiente manera:
Nuevamente, intentamos verificar el algoritmo pero esta vez se eligen los valores: 1, -5 y
10 para las variables X, Y y Z. Al igual que en los casos anteriores ejecutamos las tres prime-
ras instrucciones y escribimos nuestra lista de variables así, tras la segunda prueba parcial:

X Y Z
1 -5 10

Después de ejecutar la instrucción 3 se pasa a ejecutar la instrucción 4, que es la evalua-


ción de la proposición:

X > Y AND X > Z

Reemplazando las variables por sus correspondientes valores, se tendrá:

1 > -5 AND 1 > 10

Verdadero AND 1 > 10

Verdadero AND Falso

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:

Y > X AND Y > Z

Reemplazando las variables con sus correspondientes valores, la evaluación es:


La evaluación de la proposición es falsa, lo que lleva a la ejecución de la instrucción 9 y

-5 > -1 AND -5 > 10

Falso AND -5 > 10

Falso AND Falso

Falso

luego a la instrucción número 10, que consiste en la evaluación de la proposición:

Z > X AND Z > Y 188


189
Reemplazando las variables por sus valores y viendo la ejecución que hace el computador
con esta información se tiene:

10 > 1 AND 10 > -5

Verdadero AND 10 > -5

Verdadero AND Verdadero

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

es 1, 2, 3, 4, 6, 7, 9, 10, 11, 13, 14, 15 y 16.


Ahora, ¿qué pasa si el algoritmo se ejecuta con valores iguales? Esta prueba se le deja al
lector para que verifique este resultado del algoritmo y discuta su respuesta.
Es recomendable para todo algoritmo hacer pruebas de escritorio tomando diferentes con-
juntos de valores para las variables, dependiendo de la cantidad de posibles rutas de ejecución
que se tenga en él. Para este algoritmo se tomaron 3 grupos de datos, pues existen 3 posibles
rutas de ejecución como se aprecia claramente.
Usando el diagrama de flujo se puede ver gráficamente (En la figura 43) las diferentes
rutas que se toman dependiendo de los valores suministrados. Para los valores (3, 8 y 4) de la
primera prueba de escritorio, el algoritmo mostrará la ruta así (observe las flechas resaltadas):
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

Figura 43. Diagrama de la ruta que se sigue con los valores 3,


8 y 4. Ejemplo 2 / Capítulo 3

Para los valores (9, 1 y 7) de la segunda prueba de escritorio el algoritmo mostrará


la siguiente ruta:

Figura 44. Diagrama de la ruta que se sigue con los valores 9,


1 y 7. Ejemplo 2 / Capítulo 3.
Para los valores (-1, -5 y 0) de la segunda prueba de escritorio el algoritmo mostrará esta ruta:

Figura 45. Diagrama que de la ruta que se sigue con los valores
1, -5 y 10. Ejemplo 2 / Capítulo 3.

Ejemplo 2 - Paso 5: Codificación


A continuación se muestra el ejemplo 2 traducido a diferentes lenguajes: 190
191
· Lenguaje C con su respectivo diagrama de flujo:

#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

Private Sub Command1_Clic()


Dim X As Double, Y As Double
Dim Z As Double

X = InputBox(“Digite X”)
Y = InputBox(“Digite Y”)
Z = InputBox(“Digite Z”)

If X>Y AND X>Z Then


Print X
Else
If Y>X AND Y>Z Then
Print Y
Else
If Z>X AND Z>Y Then
Print Y
Else
End If
End If
End If
End Sub
· Java:

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:

Luego se deben adelantar las pruebas de funcionamiento de los algoritmos y la docu-


mentación respectiva de los mismos.
Se deja al lector que verifique el funcionamiento del algoritmo expuesto en este ejem-
plo cuando se le dan datos que sean iguales, bien sea dos de los tres datos o los tres datos.
Discuta la solución planteada y compárela con lo presentado en este ejemplo.
EJEMPLO 3.
Determinar si un punto está dentro de un círculo, si se conoce las coordenadas del punto
centro del círculo, el radio y las coordenadas del punto.
Paso 1: Investigación Preliminar
La forma como se determina si un punto en el plano cartesiano está por dentro de un
círculo, consiste en calcular la distancia que hay desde el centro del círculo hasta el punto
dado, luego compararlo con la longitud que tiene el radio a partir del cual se construyó el
círculo en el plano cartesiano. Desde el punto de vista de la geometría analítica un círculo
está descrito con la siguiente ecuación:
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

(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)

DIFERENCIA = (x2 - x1)2 + (y2 - y1 )2

Esta ecuación contextualizándola en el problema indicaría que P1 se debe referir al


centro del círculo y P2 será el punto sobre el cual se debe inferir si está fuera o dentro del
círculo. Luego C(X, Y) que determina el centro de círculo será P1 notado como P1(Cx, Cy) y el
punto dato será P2(Px, Py). Reescribiendo la fórmula de distancia en términos del problema
quedaría:

D= (Cx - Px)2 + (Cy - P1y)2

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

Tabla 41. Etapa de especificación – Ejemplo 3 / Capítulo 3.

Debe suministrar 5 valores de tipo real, así:


R : Radio del Circulo
Cx: Coordenada del centro en el eje X del Círculo
Entrada
Cy: Coordenada del centro en el eje Y del Círculo
Px: Coordenada en el eje X del Punto
Py: Coordenada en el eje Y del Punto

{
Verdadero si R ≥ (CX - PX)2 + (CY - PY)2)
Procesos Punto =
Falso en otro caso

Un dato que nos indica de manera clara que el punto está


dentro o eventualmente fuera del círculo. Es un dato (Punto)
Salidas de tipo lógico que a partir de él se da como resultado un de
dos posibles mensajes: uno que diga “El punto está DENTRO
del círculo” u otro que diga “El punto está FUERA del círculo”.

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).

Figura 46. Diagrama para la Primera División. Ejemplo 3 / Capítulo 3.


Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

Figura 47. Diagrama para la segunda división. Ejemplo 3 / Capítulo 3.

Figura 48. Diagrama para la tercera división. Ejemplo 3 / Capítulo 3


El equivalente en pseudocódigo del algoritmo se muestra a continuación:

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í:

Figura 49. Diagrama resultado de la abstracción. Ejemplo 3/ Capítulo 3.


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

Paso 4: Prueba de Escritorio


La prueba comienza repasando el algoritmo que da como resultado de la actividad de
abstracción del ejemplo 3 para obtener la lista de variables. A continuación, se muestran
el algoritmo y la lista obtenida:

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

Figura 50. Datos para el algoritmo- Ejemplo 3 / Capítulo 3.

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

Figura 51. Cálculo de la distancia de C a P. Ejemplo 3 / Capítulo 3

Según los datos suministrados el valor guardado en la variable D al ejecutarse la instruc-


ción 4 es 7,6157731058. La lista de variables se registrará así:
Calculada la distancia se pasa a ejecutar la instrucción número 5 que evalúa una propo-

R Cx Cy Px Py D

5.5 2 3 9 6 7.6157731058

sición: la relación entre el contenido que tiene la variable R y el de la variable D. El resultado


de la evaluación de la proposición R >= D es Falso, pues de acuerdo con los datos suministra-
dos, R contiene un valor de 5.5, mientras que D es 7.6157731058, por lo que se pasa a ejecutar
la instrucción número 7 y 8. Esta última instrucción escribe un mensaje que dice “El punto
está FUERA del círculo”. A continuación, se ejecutan las instrucciones 9 y 10 dando por termi-
nada la prueba del algoritmo.
El conjunto de instrucciones que se ejecutaron con los datos suministrados son: 1, 2, 3, 4,
5, 7, 8, 9 y 10 y en el diagrama de flujo se puede ver gráficamente su ejecución (Ver figura 52)
Figura 52. Ruta gráfica con los valores 5.5, 2, 3, 9, 6. Ejemplo 3 / Capítulo 3.

Como se puede concluir de la prueba de escritorio, el mensaje que se escribe es el 202


correcto de acuerdo con los datos que se suministraron al algoritmo. 203
Se espera que esta prueba se realice por parte del lector cuando el punto está DENTRO
del círculo y discutir sus resultados.
Paso 5: Codificación
A continuación se verá la traducción del ejemplo a diferentes lenguajes.
· Lenguaje C, incluyendo pseudocódigo:

#include <stdio.h>
#include <math.h>

void main (){


f l o a t R , C x , Cy, P x , P y, D ;

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.

La evaluación de la expresión lógica compuesta o PM depende aquí de los valores que


tomen las dos variables, por ejemplo, si la variable SUEL es igual a 880.000 y la RF es igual
a cero, el valor resultante sería Falso y se ejecutarán las instrucciones cuando el valor de
la proposición sea FALSO, ya que:

SUEL > 0 AND SUEL <= 620.000 OR RF > 0.20 AND RF <= 0.30

Reemplazando las variables para su evaluación será: 208


209
880.000 > 0 AND 880.000 <= 620.000 OR 0 > 0.20 AND 0 <= 0.30

Verdadero AND 880.000 <= 620.000 OR 0 > 0.20 AND 0 <= 0.30

Verdadero AND Falso OR 0 > 0.20 AND 0 <= 0.30

Verdadero AND Falso OR Falso AND 0 <= 0.30

Verdadero AND Falso OR Falso AND Verdadero

Falso OR Falso AND Verdadero

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:

NOT((X < Y) AND NOT(X * Y >= 0))

Reemplazando los valores de las variables en la expresión para efectos de explicar el


cálculo que hace el computador, se tendrá:

NOT ( 6 < -3 ) AND NOT ( 6 ^ -3 >= 0 )


Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

NOT ( 6 < -3 ) AND NOT ( -18 >= 0 )

NOT ( Falso ) AND NOT ( -18 >= 0 )

NOT ( Falso ) AND NOT ( Falso )

Verdadero AND NOT ( Falso )

Verdadero AND Verdadero

Verdadero

Como se ve en la evaluación que se hace de la expresión, el operador NOT afecta el


resultado de la proposición (6<(-3)). La proposición es falsa y el operador NOT la niega
dando verdadera. La otra proposición, (6 * (-3) >= 0), da falsa y el operador NOT la niega y
convierte en verdadera.

3.5. LAS CONDICIONES EN LA ELABORACIÓN


DE ALGORITMOS
Como se ha estudiado hasta este punto, en la construcción de algoritmos o programas de
computador, por lo general es necesario que se incluyan condiciones o estructuras condi-
cionales o, lo que es lo mismo, estructuras de decisiones. En este sentido, en esta sección se
dedicará un espacio adicional para presentar con más detalle el uso de estas estructuras a
fin de dar mayor claridad al emplearlas en la construcción de los algoritmos.

3.5.1. Condiciones anidadas


En la mayoría de los programas de computador, al hacer uso de las condiciones de acuerdo
con las necesidades propias de los problemas que se estén implementado mediante algorit-
mos, hay que incluir las estructuras condicionales y se debe hacer de tal forma que, bien sea
por el lado del verdadero o por el lado del falso de los flujos de ejecución, se puedan colocar
otras condiciones. Esta forma de escribir los programas es lo que se denomina algoritmos
con estructuras condicionales anidadas.
Este concepto ya fue aplicado uno de los ejemplos plantados en el numeral 3.3 (Ejem-
plo 7). En él se estudió el algoritmo para determinar cuál de tres valores dados es el mayor.
En la figura 59 que se muestra a continuación se ve cómo se anidan las condiciones:

210
211

Figura 55. Condiciones anidadas

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

Figura 56. Algoritmo implementado con condiciones anidadas

El diagrama presenta claramente cómo se han anidado estructuras condicionales en la


construcción del mismo. La codificación del DFD de este algoritmo en diferentes lenguajes
d se muestra a continuación.
· Lenguaje C

#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

A = InputBox(“Digite el valor de A”)


B = InputBox(“Digite el valor de B”)
C = InputBox(“Digite el valor de C”)

If A > 0 And B > 0 And C > 0 Then


If A = B And B = C Then
Print “ Triángulo Equilátero”
Else
If A > B And A>C then
If A < B + C then
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

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;

System.out.println(“Digite el valor de A ”); A = Double.parseDouble(lee.readLine());


System.out.println(“Digite el valor de B ”); B = Double.parseDouble(lee.readLine());
System.out.println(“Digite el valor de C ”); C = Double.parseDouble(lee.readLine());
if ( A > 0 && B > 0 && C > 0) {
if (A == B && B == C) {
System.out.println(“Triángulo Equilátero”);
} else {
if (A > B && A > C) {
if (A < B + C) {
if (B == C) {
System.out.println(“Triángulo Isósceles”);
} else {
System.out.println(“Triángulo Escaleno”);
}
if (Math.pow(A, 2) == Math.pow(B, 2) + Math.pow(C, 2)) {
System.out.println(“Rectángulo”);
}
} else {
System.out.println(“No es triángulo”); 214
}
} else { 215
if (B > A && B > C) {
if (B < A + C) {
if (A == C) {
System.out.println(“Triángulo Isósceles”);
} else {
System.out.println(“Triángulo Escaleno”);
}
if (Math.pow(B,2)==Math.pow(A,2)+Math.pow(C,2)) {
System.out.println(“Rectángulo”);
}
} else {
System.out.println(“No es triángulo”);
}
} else {
if (C < A + B) {
if (A == B) {
System.out.println(“Triángulo Isósceles”);
} else {
System.out.println(“Triángulo Escaleno”);
}
if(Math.pow(C,2)==Math.pow(A,2)+Math.pow(B,2)) {
System.out.println(“Ractángulo”);
}
} else {
System.out.println(“No es triángulo”);
}
}
}
}
} else {
System.out.println(“Datos no válidos”);
}
}
· Python:

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 ()

i f A > 0 and B > 0 a n d C > 0 :


i f A = B and B = C :
p r i nt “ Triá n gulo Eq uilá te ro”
else:
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

if A > B and A > C:


if A < B + C:
if B = C:
p r in t “ Triá n gulo I s ós ce le s”
else:
p r in t “ Triá n gulo Es cale n o”
i f A* * 2 = = B* * 2 + C * * 2 :
p r in t “Re c tá m gulo”
else:
p r in t “N o e s t riá n gulo”
else:
if B > A and B > C:
if B < A + C:
if A = C :
p r in t “ Triá n gulo I s ós ce le s”
else:
p r in t “ Triá n gulo Es cale n o”
if B* * 2 = = A* * 2 + C * * 2 :
p r in t “Re c tá m gulo”
else:
p r in t “N o e s t riá n gulo”
else:
if C < A + B:
if A = B :
p r in t “ Triá n gulo I s ós ce le s”
else:
p r in t “ Triá n gulo Es cale n o”
if C * * 2 = = A* * 2 + B* * 2 :
p r in t “Re c tá m gulo”
else:
p r in t “N o e s t riá n gulo”
else:
p r i nt “ Valore s n o vál id os”
· JavaScript

<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

Figura 57. Algoritmo con condiciones lineales

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

3. La codificación de este problema en los diferentes lenguajes for-

males se encuentra escrita dentro de los ejercicios resueltos que se

dan para el capítulo 3 y corresponde a la solución para el ejercicio 35.


Una tercera aplicación de las condiciones en línea para la construcción de los algoritmos
es el que se ha planteado en el numeral 3.3 (Ejemplo 2) de este capítulo y que también
se expuso para mostrar las condiciones anidadas. En esta oportunidad retomaremos este
problema (determinar cuál de tres valores dados es el mayor), y aplicaremos un rediseño
al mismo, pensando en que si un valor de los tres valores dados es el mayor, entonces
inmediatamente se pueda preguntar si el siguiente es el mayor. Así con los tres valores.
Esto daría como resultado un algoritmo que, en vez de tener las condiciones anidadas, las
tendría en línea como se muestra a continuación (Ver figura 58):
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

Figura 58. DFD del ejemplo 2, Capítulo 3, con condiciones en línea

Aquí es importante resaltar el hecho que las condiciones que se implementaron en el


diagrama de flujo de datos no tienen ninguna instrucción programada por el lado de “NO”.
En este sentido, para la construcción de los programas se pude omitir esta parte y solo se
programaría la parte del “SI”, A este esquema de condición se denomina “condición sim-
ple”. Es decir que este algoritmo presenta tanto condiciones en línea o en cascada, como
condiciones simples. La codificación de este algoritmo en los diferentes lenguajes que
trata este texto se presenta a continuación.
· Lenguaje C

#i ncl ud e < std i o. h>


#i ncl ud e < co ni o. h >

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

if (Y > X && Y > Z) {


System.out.println(“” + Y);
}
if (Z > X && Z > Y) {
System.out.println(“” + Z);
}
}
}

· 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 ”,””) ) ;

If (X > Y & & X > Z ) {


d o cum e n t .w r i te ( X ) ;
}

If (Y > X & & Y > Z ) {


d o cum e n t .w r i te ( Y ) ;
}

If (Z > X & & Z > Y ) {


d o cum e n t .w r i te ( Z ) ;
}
< /sc r i pt>
< / bo d y>
< / html> 222
223
· PHP:

<? 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;
}
?>

3.5.3. Selección múltiple


Hay una cantidad de problemas de programación que requieren que se tomen acciones di-
ferentes dependiendo del valor de un dato. Por ejemplo, según el número del mes se debe
decir cuál es su nombre. Otro ejemplo sería que si se da el signo de la operación (suma,
resta multiplicación, etc.) se efectué la operación correspondiente. Un ejemplo adicional
podría ser que dado un país X se determine la tarifa Y que corresponde al costo del valor
de una llama telefónica de larga distancia.
Aplicando este tipo de condiciones, determinar el valor a pagar a los trabajadores
de una compañía de acuerdo con la política en la que a partir del sueldo se otorga una
bonificación. La política se presenta a continuación:

Tabla 42. Política para el pago de bonificaciones

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):

Figura 59. Diagrama para el cálculo de Total a pagar – TAP


Del diagrama se puede decir que se usa una condición doble y una selección múl-
tiple. La condición está referida a determinar si se hace retención en la fuente (TR) y
la selección múltiple determina el porcentaje de bonificación (PB) que se debe aplicar
para el cálculo de la bonificación (B). La codificación del diagrama se muestra a conti-
nuación, en diferentes lenguajes.

· 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:

Private Sub Command1_Click()

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

NHT = InputBox(“Digite el número de horas trabajadas”)


VHT = InputBox(“Digite el valor por hora de trabajo”)
DES = InputBox(“Digite el valor del descuento”)
SM = InputBox(“Digite el salario mensual”)
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

TT = InputBox(“Digite el tipo de trabajador”)

Sueldo = VHT * NHT;

If Sueldo > SM*3 Then


RF = Sueldo * 3
Else
RF = 0.00
End If

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

Print “El total a pagar es”, TAP

End Sub
· Java:

import java.io.*;
public class Total_A_Pagar {

public static void main(String[ ] args) throws IOException {

BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));


int TT;
double NHT, VHT, DES, SM, Sueldo, PB, B, RF, TAP;

System.out.println (“Digite el número de horas trabajadas ”);


NHT = Double.parseDouble(lee.readLine());
System.out.println (“Digite el valor por hora de trabajo ”);
VHT = Double.parseDouble(lee.readLine());
System.out.println (“Digite el valor del descuento”);
DES = Double.parseDouble(lee.readLine());
System.out.println (“Digite el salario mensual ”);
SM = Double.parseDouble(lee.readLine());
System.out.println (“Digite el tipo de trabajador ”);
TT = Integer.parseInt (lee.readLine());

Sueldo = VHT * NHT;


226
if (Sueldo > SM*3) 227
RF = Sueldo * 0.05;
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;
break;
}

B = Sueldo * PB;
TAP = Sueldo + B - DES - RF;

System.out.println (“”, TAP);


}
En Python no existe una estructura definida para la selección múltiple. Pero ha-
ciendo uso de la condicional se puede hacer algo que funciona muy parecido, como se
muestra a continuación:

Print “Digite el número de horas trabajadas”,


NHT = input()
Print “Digite el valor por hora de trabajo ”,
VHT = input()
Print “Digite el valor del descuento ”,
DES = input()
Print “Digite el salario mensual ”,
SM = input()
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

Print “Digite el tipo de trabajador ”,


TT = input()
Sueldo = VHT * NHT
If Sueldo > SM * 3:
RF = Sueldo * 0.05
else:
RF = 0.0
if TT == 1:
PB = 0.05
elif TT == 2:
PB = 0.10
elif TT == 3:
PB = 0.15
elif TT == 4:
PB = 0.20
else:
PB = 0.00
B = Sueldo * PB
TAP = Sueldo + B – DES - RF
Print “El total a pagar es”, TAP
· JavaScript

<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”,””));

Sueldo = VHT * NHT;

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

Figura 60. Diagrama para el número de días del mes dado

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;

printf (“Digite el año”); scanf(“%4d”, &A);


printf (“Digite el mes”); scanf(“%2d”, &M);

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:

Private Sub Command1_Click()


Dim A As Integer, M As Integer, ND As Integer
A = InputBox (“Digite el año”)
M = InputBox (“Digite el mes”)
Select Case M
Case 1, 3, 5, 7, 8 10, 12
ND = 31
Case 4, 6, 9, 11
ND = 30
Case 2
If A Mod 4 = 0 And (A Mod 100 <> 0 Or A Mod 400 =0) Then
ND = 29
Else
ND = 28
End If
Case Else
ND = 0
End Select
If ND = 0 Then
Print “Número de mes inválido”
Else
Print “El mes tiene ”, ND, “ días”
232
End If 233
End Sub
La codificación del DFD en lenguaje Java

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:

Print “Digite el año”,


A = input()
Print “Digite el mes”,
M = input()
if M == 1 or M == 3 or M == 5 or M == 7 or M == 8 or M == 10 or M == 12:
ND = 31
elif M == 4 or M == 6 or M == 9 or M == 11:
ND = 30
elif M == 2:
if A % 4 = 0 and (A % 100 != 0 or A % 400 =0):
ND = 29
else:
ND = 28
else:
ND = 0
if ND == 0:
Print “Número de mes inválido”
else:
Print “El mes tiene ”, ND, “ días” 234
235
· JavaScript

<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:

Tabla 43. Política de tarifas de roaming

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

2 Canadá 0.82 2.5%


3 México 0.50 2.1%
4 Chile 0.91 2.2%
5 España 1.01 2.9%

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.

Figura 61. Diagrama de flujo llamada internacional


En este DFD se toman los datos en las variables que corresponden a lo siguiente:
TL:Tiempo de la llamada
PD:País de origen
C:Valor de cambio de dólares a pesos
T:Tarifa
ST:Sobretasa de destino
VL:Valor de la llamada
VP:Valor en pesos

· La codificación del DFD en lenguaje C:

#include <stdio.h>
#include <conio.h>

void main() {
float C, ST, T, TL, VL;
char pd[15];

printf("Digite el tiempo de la llamada "); scanf("%f",&TL);


printf("Digite el país destino ");scanf("%s",PD);
printf("Digite el valor del cambio de dólares a pesos "); scan-
f("%f",&C);
238
switch (PD) { 239
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;
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;
printf ("Valor de la llamada %f. Fue hacia %s", VL, PD);
}
else {
printf("Datos inválidos");
}
}
· Visual Basic:

Private Sub Command1_Click()


Dim C As Double, ST As Double, T As Double, TL As Double, VL As Double
Dim PD As String
TL = InputBox (“Digite el tiempo de la llamada”)
PD = InputBox (“Digite el país destino”)
C = InputBox (“Digite el valor del cambio de dólares a pesos”)
Select Case PD
Case “USA”
T = 0.65: ST = 0.0
Case “CANADA”
T = 0.82: ST = 2.5
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

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.

print "Digite el tiempo de la llamada ",


TL = input()
print "Digite el país destino ",
PD = input()
print "Digite el valor del cambio de dólares a pesos ",
C = input()
if PD == “USA”:
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programació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>

var C, ST, T, TL, VL;


var PD = new String();
TL = parseFloat(prompt(“Digite el tiempo de la llamada”,””));
PD = prompt(“Digite el país destino”,””);
C = parseFloat(prompt(“Digite el valor del cambio de dólares a pesos”,””));
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;
case "CHILE":
T = 0.91; ST = 2.2;
break; 242
case "ESPAÑA": 243
T = 1.01; ST = 2.9;
break;
default:
T = 0.00; }
if (T != 0){
VL = TL * T * (1 + ST/100) * C;
document.write("Valor de la llamada ", VL, ". Fue hacia ", PD);
} else
document.write(“Datos inválidos”);
</script>
</body>
</html>
· PHP:

<?php

$stdin = fopen ('php://stdin', 'r');

echo 'Digite el tiempo de la llamada '; fscanf($stdin,"%d", $TL);


echo 'Digite el país destino '; fscanf($stdin,"%s", $PD);
echo 'Valor de cambio dólares a pesos '; fscanf($stdin,"%d", $C);

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

2V0 Seno (2α)


Tiempo de vuelo =
g
2
V0 Seno (α)
Alcance máximo =
g

4.
Algunos de los problemas fueron tomados de las páginas www.

algoritmia.net, elhacker.com, de la Universidad Nacional http://

www.virtual.unal.edu.co, del libro Python 3. Los fundamentos del


lenguaje (Chazallet, 2015), Cómo Pensar como un Informático (Elk-

ner, Downey, & Meyers, 2009) y Aprender a desarrollar con javaS-

cript (Vigouroux, 2015


4. Determinar el Valor Futuro VF sí:

N
R
VF = VP 1+
100

Donde R: Tasa de interés compuesto anual


N: Número total de años de la inversión
VP: Valor Presente

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

el número de individuos infectados en un periodo de tiempo es:

80
P(t) =
8 + 12e-0.06 * t

6. Diseñar un algoritmo para convertir temperatura de grados Celsius a grados Fahrenheit


de acuerdo con:

°F = (9 ⁄ 5) °C + 32

7. Construir un algoritmo para convertir temperatura de grados Celsius a grados Kelvin de


acuerdo la siguiente fórmula:

°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:

Código del cliente.


Capital.
Día del calendario comercial (año de 360 días) en el que el capital fue ingresado al banco.
Tasa de interés convenido.
La fórmula a aplicar es:

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

15. De acuerdo a la gráfica y dado el R diseñar un algoritmo para determinar el área


sombreada.
16. Si se conoce la longitud del Radio (R) de la circunferencia, calcular el área de la
estrella de la figura.
Fundamentos de lógica para programación de computadores · Cap. 3 · Principios de programación

17. Diseñar un algoritmo que permita calcular el área de la figura que se muestra, teniendo
conocimiento de la longitud del lado L.

18. Establecido el valor de R en la siguiente figura, calcular el área sombreada.

19. Dada la siguiente figura, calcular el área sombreada.


20. Leer el código del estudiante, el patrimonio y la renta.
Calcular el valor de la matrícula a pagar por cada estudiante, de la siguiente forma: El
total a pagar es igual a los cargos fijos más los cargos variables. Los cargos fijos son
$ 300000 y los cargos variables se calculan sumando el 10% del patrimonio y el 15%
de la renta. Se debe obtener código, renta, patrimonio, cargo fijo, cargo variable y valor
matrícula.
21. Leer el número de la cédula, el nombre y la edad de una persona, e imprimir el nombre
y la cédula si los datos corresponden a una persona mayor de edad.
22. La Administración de Impuestos ha cambiado el método para encontrar la retención en
la fuente por trabajador, a la siguiente forma:

Salario Base
Retención = - 40000 * (número de hijos - 2)
5

Si el empleado tiene 1 hijo o ninguno la retención será:

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:

Para el dato del sexo Para el dato de estado


se debe digitar: civil digitar:
1: Hombre 1: Soltero
2: Mujer 2: Casado
3: Viudo
4: Otros

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

Calcular el valor para X y para Y dando los coeficientes (A, B, C, D, E y F).


27. Leer dos números enteros y determinar si el primero es múltiplo del segundo siempre
que el primero sea mayor que el segundo.
28. Leer dos números e imprimir solo los números positivos.
29. Leer tres números e imprimir los que sean iguales a cero.
30. Leer tres números e imprimir los tres números solo si por los menos dos son positivos.
31. Leer tres números enteros distintos y determinar cuál es el menor.
32. Leer tres números enteros distintos y determinar cuál es el menor, cuál es el medio y
cuál el mayor.
33. Leer dos números e imprimir los números si son de signo contrario.
34. Leer cuatro números y determinar cuál es el mayor. El algoritmo solo debe usar dos
variables en su construcción.
35. Leer dos datos que corresponden a dos fechas cualquieras. Las fechas están en el
formato de cuatro dígitos para el año, dos dígitos para el mes y dos dígitos para el día.
Se debe calcular el tiempo trascurrido entre las dos fechas suministradas. Considere el
hecho de tiempo negativo.
36. Establecer el área de una de las figuras regulares dependiendo del número de lados. Así:

No.
Polígono Fórmula
lado
Base * Altura
1 Triángulo A=
2

2 Cuadrado A= Lado * Lado


3 Paralelogramo A= Largo * Ancho
Diagonal principal * Diagonal secundaria
4 Rombo A=
2

Base mayor * Base menor


5 Trapecio A= *H
2

Perímetro = Número de lados * Largo de lado


6 Polígono regular Perímetro * Apotema
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:

Xi = A + B si (A2 - B2) > 0


Xi = A - 2 * B si (A2 - B2) = 0
Xi = A + B - 5 si (A2 - B2) < 0

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:

(X + 1)2 para -100 < X < -50

Y= 2500 - X2 para -50 < X < 50

3X - 1 para 50 < X < 100


51. Diseñar un algoritmo para 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

52. Se tienen los siguientes datos:


- Código del artículo - Nombre del artículo
- Valor unitario - Clase de artículo:
1 Importado.
Local.
- Consumo primer mes (unidades) - Consumo segundo mes (unidades)
- Consumo tercer mes (unidades) - Consumo cuarto mes (Unidades)

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

de 45o con respecto al eje X.


55. Leer cuatro calificaciones de un estudiante. Calcular el promedio de las mismas, pero
sin tener en cuenta la calificación más baja. La escala de calificaciones es de 0.0 a 100.
Debe reportar el promedio y la calificación descartada.
56. Leer una terna de parejas ordenadas de números ([X1, Y1], [X2, Y2], [X3, Y3]).
Dichas parejas representan las ordenadas y abscisas de tres puntos sobre el plano carte-
siano. Investigue 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.
57. Si un automóvil consume en promedio 12 galones de gasolina semanalmente, escribir
un algoritmo que lea el modelo de automóvil y calcule cuántos litros de gasolina ha
consumido hasta hoy. Tenga en cuenta los años bisiestos.
58. Leer tres datos: el primero es el código del estudiante, el segundo el valor correspon-
diente por crédito y el tercero el número de créditos tomados. Calcule el valor a pagar
por el estudiante.
El valor se calcula multiplicando el valor crédito por el número de créditos tomados y
sumándole al producto: $21.000 si toma hasta dos créditos; $42.000 si toma hasta cinco
créditos; $63.000 si toma más de cinco créditos.
59. En una empresa manufacturera el jornal de cada obrero se calcula de acuerdo al salario
base por hora, más una bonificación que es igual al 120 % del exceso de unidades pro-
ducidas sobre un mínimo que debe producir diariamente. Los datos son los siguientes:
Código del obrero, salario base por hora, producción mínima día y producción del día.
Calcule el pago por día para cada empleado. Se debe tener en cuenta que si el obrero
no cumple la producción mínima su jornal es equivalente al salario base por hora mul-
tiplicado por ocho horas de trabajo por día. El resultado que se muestra es: código del
obrero, salario base por hora, producción mínima día, producción del día y jornal.
60. Una librería estima los precios de sus libros de la siguiente forma: el precio básico de
un libro es de $ 15.000 más $ 200 por página. Sin embargo, si el número de páginas
excede de 300, el precio sufrirá un recargo adicional de $ 10.000. Además, si el número
de páginas excede a 550 el precio sube otros $ 7.500. Se tiene: el código del libro, el
número de páginas. Se requiere calcular e imprimir el código, el número de páginas y
el precio del libro.
61. En una empresa para el tratamiento de arroz se requiere un programa que procese la si-
guiente información: se tienen el peso de cada bulto de arroz y su humedad. Se requiere
que el programa clasifique el bulto de acuerdo con lo siguiente: si pesa menos de 75 Kg
es devuelto. Si pesa de 75 Kg hasta 85 Kg y su humedad es mayor a 25 grados el bulto es
aceptado y debe ser sometido a secamiento en horno. Si pesa de 75 Kg hasta 85 Kg y su
humedad es de 20 hasta 25 grados, es aceptado y debe ser secado naturalmente. Si pesa
de 75 Kg y hasta 85 Kg y su humedad es menor a 20 grados, es aceptado y es procesado. Si
pesa más de 85 Kg y no tiene humedad, el bulto es aceptado y dirigido a reempaquetado.
62. Una empresa de transporte aéreo desea un programa que le ayude a calcular el valor
del pasaje de ida y vuelta dependiendo de la distancia recorrida desde el origen hasta
el destino y del número de días de estancia en el destino.
254
Han tenido en cuenta tres tipos de distancias: 255

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.

4.1.1 Ejemplos de algoritmos con ciclos


Ejemplo 1.
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

Cálculo de la nómina de una compañía.


Supóngase que se quiere diseñar un algoritmo para calcular cuánto se le debe pagar
a cada uno de los trabajadores de una compañía, es decir, liquidar la nómina, conociendo
como datos para procesar, el nombre del trabajador, el número de días trabajados, la asig-
nación mensual, el valor de las bonificaciones recibidas, el 12% sobre el total devengado
de aporte a la seguridad social, la retención en la fuente de 5% sobre el total devengado y
el valor total de otros descuentos.
De acuerdo con lo anterior, para la construcción de los algoritmos que involucran ci-
clos, se debe pensar y analizar como si se tratase de un algoritmo para liquidar el pago
para un único trabajador y, posteriormente, se deben introducir los elementos para que se
procesen los datos de todos los trabajadores de la compañía.
A continuación, se mostrará entonces la solución del problema para un solo trabajador,
manteniendo los pasos que se explicaron en el capítulo anterior:
Paso 1: Investigación Preliminar
Como se ve en el planteamiento del problema para poder liquidar el pago a un em-
pleado se debe primero calcular cuánto devengó. Para hacerlo, hay que proceder así:
1. El total del salario es la asignación mensual divido en 30 (división que da el valor de
lo que gana el trabajador en un día) multiplicado por el número de días trabajados:

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 = Salario + Bonificaciones


3. Con lo descrito en los numerales anteriores, se ha obtenido la primera parte de la
liquidación del pago del trabajador. A continuación se debe calcular el total de los
descuentos para así determinar el neto a pagar. El primer descuento que se debe
hacer es el valor de la retención en la fuente, lo que se obtiene con base en el total
devengado, esto es:

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

El último dato que se da en el problema para calcular el Total de las Deducciones es el


de los Descuentos varios, así que la fórmula para calcular el total de las deducciones será:
260
Total Deducciones = Retención + SS + Otros Descuentos
261
4. Como ya se ha determinado cuánto se gana el trabajador, el Total Devengado, y
cuánto se le descuenta, el Total de Deducciones, entonces se puede determinar el
Pago Neto; de tal modo, el valor que se le debe cancelar al trabajador será:

Peso Neto = Total Devengado - Total Deducciones

5. La respuesta al problema, entonces, es el nombre del trabajador y el pago neto.


6. De aquí en adelante se retoma la idea de procesos repetitivos. Para el problema
que se está tratando; hecho el cálculo de los resultados para un trabajador, estos
se repiten para cada uno de los trabajadores de la compañía. Así obtendremos el
nombre y pago neto para cada uno de ellos.
Paso 2: Especificaciones

Tabla 44: Etapa de especificación – Ejemplo 1 / Capítulo 4.

Debe suministrar 5 valores, así:


Nom: Nombre del Trabajador de tipo String
NDT: Número de días trabajados de tipo Entero.
Entradas
AM: Asignación Mensual (Sueldo) de tipo Real.
BR: Bonificaciones Recibidas de tipo Real.
OD: Otros Descuentos de tipo Real.

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

Cada uno de los nombres de los trabajadores (Nom) suministra-


Salidas
dos junto con su respectivo Pago Neto (PN).

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:

Figura 62: Diagrama para cálculo de pago neto de un trabajador –


Ejemplo 1 / Capítulo 4.
Hasta este punto, el diagrama de la figura 62 no tiene nada de novedoso. En él se
ve claramente que la entrada la constituyen las variable Nom (Nombre del Trabajador),
NDT (Número de Días Trabajados), AM (Asignación Mensual o sueldo del trabajador), BR
(Bonificaciones Recibidas) y OD (Otros Descuentos). El proceso está dado por los cálculos
necesarios para determinar el Pago Neto (PN). La salida o respuesta del algoritmo será el
nombre del trabajador y el valor del Pago Neto.
El paso siguiente consiste en convertir este algoritmo para que calcule, no sólo los
resultados para un trabajador, sino que el proceso se repita hasta que obtenga los resul-
tados de todos los trabajadores. Lo anterior se logra añadiendo al algoritmo los elementos
necesarios para controlar el proceso repetitivo, es decir, añadir el control del ciclo como
se conoce técnicamente. Así, se procede a convertir el algoritmo en uno cíclico como lo
muestra la figura 63.

262
263

Figura 63: Implementación algoritmo cíclico. Ejemplo 1 / Capítulo 4.

De la figura 63 se puede advertir que, para convertir un algoritmo secuencial en cíclico,


basta con quitar el fin del algoritmo y en vez de terminar, la instrucción que se ejecuta
nuevamente es la lectura de datos, esto con el propósito de dar comienzo a procesar más
información. Con la instrucción de lectura de datos se comienza de nuevo el proceso para
calcular el Pago Neto de un trabajador y luego imprimen los resultados con base a la lec-
tura previa que se ha realizado, alcanzando con esto nuevamente el fin, pero como este no
existe se devuelve a la lectura y se procede a realizar nuevamente los cálculos para otro
trabajador y así sucesivamente. El diagrama muestra que al seguir el flujo se repite indefi-
nidamente todas sus instrucciones. Esto es lo que se conoce como un algoritmo cíclico, un
algoritmo con bucles o con procesos iterativos.
Desde el punto de vista de la algorítmica, para que un diagrama o algoritmo sea co-
rrecto debe contener en su estructura la función de entrada, la función de proceso y la
función de salida. Además de las funciones, dicho diagrama debe caracterizarse por estar
bien definido, ser preciso y ser finito. En el diagrama de la figura 63, las funciones se ven
reflejadas claramente, esto es: en el proceso de lectura de datos está la entrada, en el cál-
culo del pago neto está el procesamiento de los datos y en la impresión del nombre y el
pago neto está la salida.
En cuanto a las características, se observa que la primera se cumple, ya que todos los
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

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.

Figura 64: Implementación correcta del ciclo. Ejemplo 1 / Capítulo 4.


Como se puede apreciar, al introducir una nueva condición se llega al fin evaluando y
obteniendo una respuesta de verdadero para la proposición que hace parte de la misma.
La cuestión aquí es diseñar una proposición para colocar en la condición que permita
terminar con el ciclo cuando su evaluación sea verdadera. En principio, el diseño de la
proposición tiene que ver con los datos que se suministran al algoritmo, ya que estos son
el medio por el que interactúa con el usuario. Al suministrar los datos en este problema
en particular, estos se refieren al nombre del trabajador, el número de días trabajados, la
asignación mensual, la bonificación recibida y otros descuentos; por tanto, se debe pensar
que un valor de estos en particular se puede evaluar y obtener una respuesta afirmativa, lo
que permite la implementación de la proposición.
Si se presta atención, el dato correspondiente a la asignación mensual, representa la
cantidad de dinero que se debe pagar a un trabajador por sus servicios prestados. En el
contexto del problema un valor mayor a cero debe ser aceptable como valor por el pago
mensual para un trabajador, un valor cero indicará que no se va a pagar nada al trabajador,
esto significaría que por los servicios prestados no se paga nada, cosa que no es lógica en
el contexto del problema, pues nadie trabajará por un salario de cero pesos. Este hecho,
en particular, da la idea de cómo se puede construir la proposición que debe incluir en la
condición que controla el final de ciclo para el algoritmo que muestra la figura 64. El diseño 264
de la proposición será algo así: 265

Si Asignación Mensual es igual a cero se debe terminar ciclo.

La proposición escrita como una expresión en lógica de programación y haciendo uso


de la variable identificada para el manejo del dato correspondiente a la asignación mensual
en la especificación, quedará así:

AM = 0

En esta proposición AM representa la variable Asignación Mensual dentro del algoritmo


y como tal, se puede colocar en el diagrama. Esta es una expresión de tipo lógico que al ser
evaluada dará un valor de VERDADERO, CIERTO o SÍ; si el valor almacenado en AM es cero.
En caso que la variable AM no contenga un valor cero, la evaluación de ella será FALSO, NO
o NEGATIVO (Ver figura 65):
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

Figura 65: Implementación de ciclos. Ejemplo 1 / Capítulo 4.

Un aspecto importante a recalcar es que al seleccionar la variable o variables que


se escriben en la condición que controla el ciclo deben ser de tal naturaleza que al ser
suministrados los datos que ellas manejan estén por fuera del contexto lógico del pro-
blema. Como se explicó anteriormente, el valor de cero para la variable AM está fuera
del contexto lógico del problema, dado que nadie trabaja para que no le paguen. A estos
valores se les conoce en programación como datos centinelas o datos de control. Si bien
en algunos problemas es evidente la identificación de cuáles son los datos centinelas,
existen otros, como el caso del ejemplo, en los que no son tan claros. Por lo que hubo la
necesidad de analizar las variables de entrada y determinar que AM sería la variable que
maneje el dato de centinela. Igualmente se pudo haber hecho el análisis a cualquiera de
las otras variables de entrada del algoritmo para determinar si: primero, maneja datos
fuera de contexto lógico del problema y, segundo, si es posible evaluar dichos valores en
una proposición que dé como resultado un valor de verdadero que permita la termina-
ción del ciclo.
Paso 4. Prueba de Escritorio
Para efectos del desarrollo de la prueba de escritorio y para una mejor explicación de
la misma en este documento, se hace necesario colocar un identificador a cada uno de los
componentes del diagrama de flujo que representa el algoritmo del ejemplo 1. En la figura
66 se muestra el diagrama con cada uno de sus componentes numerados, lo cual sirve
para identificarlas y poder hacer referencia clara a las mismas en la prueba de escritorio
que se explica a continuación.

266
267

Figura 66: Diagrama con marcas para cada componente.


Ejemplo 1 / Capítulo 4.

La lista de variables para la prueba de escritorio será:

Nom NDT AM BR OD Sal TDeven Ret SS Tdeduc PN

Tomando como referencia el algoritmo que muestra la figura 5 se inicia la prueba de


escritorio ejecutando la instrucción 1, a partir de esta y siguiendo la flecha del flujo se debe
ejecutar la instrucción 2 que simplemente es un punto de suma de flujos, dado que en él se
une el flujo que viene del inicio y el que viene de la condición (instrucción número 6) por
el lado del NO que es cuando la evaluación de la proposición es negativa. De la instrucción
2 se sigue la instrucción 3; la lectura de los datos.
Una vez ejecutada la instrucción 3 debe suponerse que se usa el teclado del computa-
dor para suministrar los datos que corresponden al nombre del trabajador, el número de
días trabajados, la asignación mensual, las bonificaciones y otros descuentos. Supóngase
que se escribe Tito, 21, 785000, 35600 y 45500 para ser almacenados en NOM, NDT, AM, BR
y OD respectivamente; al ejecutar, entonces, la lectura de datos con la instrucción 3, las
variables en memoria se almacenarán así:

Nom NDT AM BR OD Sal Tdeven Ret SS Tdeduc PN


Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

Tito 21 785000 35600 45500

Terminada la ejecución de la instrucción 3, se pasa, siguiendo el flujo, a la instrucción


4. En esta instrucción se ejecutan en su orden varias expresiones con las que se calculan
los resultados de: Salario(Sal), el Total Devengado (TDeven), la Retención (Ret), el aporte
a la Seguridad Social (SS), el Total de las Deducciones (TDeduc) y por último se calcula el
Pago Neto (PN). Con la ejecución de estas instrucciones los datos en la memoria quedarían
como lo muestra la siguiente lista de variables:

Nom NDT AM BR OD Sal TDeven Ret SS Tdeduc PN


Tito 21 785000 35600 45500 549500 585100 29255 70212 144967 440133

La instrucción 5 corresponde a la impresión de los resultados del problema, en este


caso corresponden al valor de las variables Nom y PN, (Tito y 440133) respectivamente. En la
lista de variables este hecho se nota encerrando entre un círculo los valores de las variables
que se imprimen.

Nom NDT AM BR OD Sal TDeven Ret SS Tdeduc PN


Tito 21 785000 35600 45500 549500 585100 29255 70212 144967 440133

Seguido a la instrucción 5 se ejecuta la 6, correspondiente a la valoración de la pro-


posición, en este caso y, de acuerdo a los datos que están almacenados en la memoria
del computador, según se ve en la lista de variables de la prueba de escritorio que se está
adelantando, da como resultado FALSO. Es claro que la variable AM no es igual a cero ya
que en la lista se ve que el valor es de 785000.
Como consecuencia del resultado de la valoración de la proposición, la condición
ejecuta la instrucción que se encuentra por el flujo (o flecha) del lado de dicha condición
rotulado con NO, es decir, la instrucción 3 (lectura de datos); queriendo decir con esto
que se ejecuta nuevamente el proceso o ciclo.
En este punto habrá que suministrar al algoritmo los datos de otro trabajador para
ser procesados e imprimir su nombre y el pago neto correspondiente. Supóngase que se
tienen los datos del trabajador de nombre Pepe, que trabajó 30 días, tiene una asignación
mensual de $432000, con unas bonificaciones de $0 y otras deducciones por $10500.
Ejecutada la instrucción número 3 los datos son almacenados en la memoria RAM
del computador por medio de las variables correspondientes, así:

Nom NDT AM BR OD Sal TDeven Ret SS Tdeduc PN


Tito 21 785000 35600 45500 549500 585100 29255 70212 144967 440133
Pepe 30 432000 0 10500

Realizada la instrucción 3 se sigue el flujo para ejecutar la instrucción número 4. En su


orden, los resultados de cada una de las expresiones de este componente del algoritmo se
ven en la lista de variables presentada a continuación:

Nom NDT AM BR OD Sal TDeven Ret SS Tdeduc PN


Tito 21 785000 35600 45500 549500 585100 29255 70212 144967 440133
Pepe 30 432000 0 10500 432000 432000 21600 51840 83940 348060
268
La instrucción 5 imprime el valor de las variables Nom y PN que en este caso corres- 269
ponden a “Pepe” y 348060 respectivamente.

Nom NDT AM BR OD Sal TDeven Ret SS Tdeduc PN


Tito 21 785000 35600 45500 549500 585100 29255 70212 144967 440133
Pepe 30 432000 0 10500 432000 432000 21600 51840 83940 348060

Con los datos presentes (como se ve en la lista) se pasa de la instrucción 5 a la instrucción 6 y


el resultado de la valoración de la proposición es FALSO nuevamente y se vuelve a empezar el
proceso para datos de otro trabajador.
Nuevamente se deben suministrar datos de un tercer trabajador, que en este caso serán:
nombre Rita, que trabajó 15 días, tiene una asignación mensual de $958800, con unas bonifi-
caciones de $29200 y otras deducciones por $54500. La lista de variables presenta estos datos
almacenados así:

Nom NDT AM BR OD Sal TDeven Ret SS Tdeduc PN


Tito 21 785000 35600 45500 549500 585100 29255 70212 144967 440133
Pepe 30 432000 0 10500 432000 432000 21600 51840 83940 348060
Rita 15 958800 29200 54500
Ejecutada la instrucción 3 pasa a la instrucción 4. Los resultados serán:

Nom NDT AM BR OD Sal TDeven Ret SS Tdeduc PN


Tito 21 785000 35600 45500 549500 585100 29255 70212 144967 440133
Pepe 30 432000 0 10500 432000 432000 21600 51840 83940 348060
Rita 15 958800 29200 54500 479400 508600 23970 57528 135998 372602

Ejecutada la instrucción 4 pasa la instrucción 5 y los datos impresos serán:


Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

Nom NDT AM BR OD Sal TDeven Ret SS Tdeduc PN


Tito 21 785000 35600 45500 549500 585100 29255 70212 144967 440133
Pepe 30 432000 0 10500 432000 432000 21600 51840 83940 348060
Rita 15 958800 29200 54500 479400 508600 23970 57528 135998 372602

Ejecutada la instrucción 5 pasa a la instrucción 6 y el resultado de la valoración de la


condición es FALSO y de nuevo se comenzará el proceso.
Al terminar de procesar todos los datos disponibles, deben introducirse datos de con-
trol que permitan terminar la ejecución del algoritmo; como tal estos datos pueden ser:
el trabajador de Nombre “XYXY”, que trabajo 0 días, tiene una Asignación Mensual de $0,
con unas Bonificaciones de $0 y Otras deducciones por $0. La tabla de variables presenta
estos datos almacenados así:

Nom NDT AM BR OD Sal TDeven Ret SS Tdeduc PN


Tito 21 785000 35600 45500 549500 585100 29255 70212 144967 440133
Pepe 30 432000 0 10500 432000 432000 21600 51840 83940 348060
Rita 15 958800 29200 54500 479400 508600 23970 57528 135998 372602
XYXY 0 0 0 0

Se pasa a ejecutar la instrucción 4 y los resultados serán:

Nom NDT AM BR OD Sal TDeven Ret SS Tdeduc PN


Tito 21 785000 35600 45500 549500 585100 29255 70212 144967 440133
Pepe 30 432000 0 10500 432000 432000 21600 51840 83940 348060
Rita 15 958800 29200 54500 479400 508600 23970 57528 135998 372602
XYXY 0 0 0 0 0 0 0 0 0 0

Se pasa a ejecutar la instrucción 5 y se imprime XYXY y 0 para el nombre del trabajador


y el pago neto respectivamente. La lista de variables en la prueba de escritorio se verá así:

Nom NDT AM BR OD Sal TDeven Ret ISS Tdeduc PN


Tito 21 785000 35600 45500 549500 585100 29255 70212 144967 440133
Pepe 30 432000 0 10500 432000 432000 21600 51840 83940 348060
Rita 15 958800 29200 54500 479400 508600 23970 57528 135998 372602
XYXY 0 0 0 0 0 0 0 0 0 0
Al ejecutar la instrucción 6 da como resultado, en la evaluación de la proposición que
contiene la condición, un valor de Verdadero o SÍ, debido a que el valor de la variable asigna-
ción mensual AM es cero. Desde este punto el flujo o flecha que se sigue es la que lleva a la
instrucción 7 lo que indica que se termina la ejecución del algoritmo y la prueba de escritorio.
Si se hace un análisis de la lista de variables, se observa que al ir suministrando
datos se va obteniendo una lista de respuestas por parte del algoritmo que corresponde
adecuadamente a lo planteado por el problema. Pero es de resaltar que al suministrar
los datos de control estos producen e imprimen resultados, que, según la definición del
problema, no tienen sentido, ya que se han definido para que terminen el algoritmo y
nada más. Desde esa perspectiva estos resultados no se deberán ni procesar, ni imprimir,
por ser datos inconsistentes en contraste con la definición del problema. La corrección
de este detalle se plantea en el siguiente diagrama:

270
271

Figura 67: Algoritmo que corrige el defecto de los datos de control.


Ejemplo 1 / Capítulo 4.

Como se ve en la figura 67 se incluyó una condición para que después de ejecutada la


instrucción de lectura se evalúen los datos suministrados y se determina si corresponden a
los datos de control o si se trata de datos de trabajadores para procesar. En caso de ser datos
de control no se ejecutarán las instrucciones que procesan e imprimen las respuestas. Se
deja a lector para que realice la prueba de escritorio correspondiente y verificar el correcto
funcionamiento del algoritmo.
Ejemplo 1 - Paso 5. Codificación
Se presenta a continuación la codificación del algoritmo en lenguaje Visual Basic (Vaque-
ro Sanchez & Quieroz Vieyra, 1998). Para proceder se debe tomar el diagrama que se muestra
a continuación (Ver figura 68), similar al de la figura 67, con la diferencia que se ha agregado
unas referencias numéricas para poder explicar con mayor claridad el proceso de codifica-
ción, sin que dichos números hagan parte constitutiva del algoritmo.
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

Figura 68: Diagrama numerado para codificar. Ejemplo 1 / Capítulo 4.

La codificación comienza con la instrucción número 1 del diagrama de la figura 68, así:

Private Sub Command1_Click()

A continuación, se toma la lista de variables de la prueba de escritorio y se definen


las variables que el algoritmo va a usar, con el correspondiente tipo de dato que va a
manejar, esto es:

Di m No m As Str i ng * 3 5 , N DT A s B y te, A M A s D oub le


D i m B R As D o u ble, O D A s D oub le, Sal A s D oub le
D i m T D e v e n As Do u ble, Ret A s D oub le, SS A s D oub le
D i m T D e duc As Do u ble, P N A s D oub le
Estas definiciones no aparecen dentro el diagrama que se está codificando, pero se
hace de entera necesidad el uso de estas definiciones para que el computador identifique
claramente qué tipo de dato es el que se almacenará en cada una de las variables que
componen el algoritmo. En su conjunto la codificación va así:

Private Sub Command1_Click()


Di m No m As Str i ng * 3 5, NDT A s B y te, AM A s D oub le
Di 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 Do 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

Los dos componentes (inicio y lista de variables) se acomodan como se muestran, es


decir, se escribe la instrucción uno (el inicio en el diagrama) y en la línea siguiente a un
tabulado con relación a la primera instrucción (el Private Sub) se ponen las definiciones, es
decir, las cláusulas Dim. Este acomodamiento de las instrucciones se conoce con el nombre
de indentación de programas, ya que la codificación es la traducción de un algoritmo a su
correspondiente en un lenguaje de computador formal, en este caso Visual Basic. En refe-
rencia a la figura 68, la traducción de la instrucción numerada con 2 es:

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:

No m = i npu tBox( “D i g i te N om bre d el t ra baja d or ” )


NDT = i npu tBox( “D i g i te Núm ero d e días t ra baja d os” )
A M = i npu tBox( “D i g i te A s ig na c ión M ens u al” )
BR = i npu tBox( “D i g i te Bonifica c iones Rec ibid as” )

OD = i npu tBox( “D i g i te O t ras D ed u cc iones” )


Como se puede apreciar, esta traducción genera 4 instrucciones, una por cada una de
las variables que se incluyen en el símbolo de lectura de datos por consola. Acomodando
estas en el contexto de la codificación del programa que se está traduciendo, la composi-
ción se ve así:

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

D i m T D e duc As D o u ble, PN A s D oub le


Do
No m = i npu tBox(“ D ig ite N om 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 ig ite A s ig na c ión M ens u al” )
B R = i npu tBox( “ D ig ite Bonifica c iones Rec ibid as” )

O D = i npu tBox( “ D ig ite O t ras D ed u cc iones” )

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

El diagrama en la instrucción 4 muestra una condición. Para la traducción de esta hay


que ver que en este punto se siguen dos flujos; uno, cuando la evaluación de la proposi-
ción da Falso o NO en el que se ejecutan una cantidad de operaciones demarcadas por la
instrucción 5 y la 6, según se ve en el punto 7. En el otro caso, cuando la valoración de la
proposición es Verdadera o SÍ, no hay instrucciones para ejecutar y, por ende, no hay nada
que traducir. Llegando finalmente a unirse estos dos flujos (el que va por el lado del SÍ y en
que viene por el lado del NO) en el punto de suma rotulado con el número de instrucción 7.
Siempre que se empieza la traducción de condiciones se debe traducir primero las ins-
trucciones que están por la parte del SÍ de la condición y se escriben a un tabulado más de
indentación. Terminada la traducción del lado de SÍ se hace una instrucción Else y debajo
de esta con un tabulado se pone la traducción de las instrucciones que se encuentran por
el lado del NO de la condición. En conclusión, la traducción de la condición completa es así:
If AM = 0 Then
Traducción lado SÍ (No hay instrucciones)
------

{
Else
Sal = AM/30*NDT
TDeven = Sal + BR
Ret = TDeven*5/100 Instrucciones Traducidas por el Lado del

SS = TDeven*12/100 NO. Corresponden a la instrucción 5

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:

Pr i vate Su b Co m m a n d1_Cl i c k( ) 274


Di m No m As Str i ng * 3 5, NDT A s B y te, AM A s D oub le 275
Di 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 Do 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 N om 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 g ite As ig na c ió n M ens u al” )
B R = i npu tBox( “D i gite Bonifica c iones Rec ibid as” )
O D = i npu tBox( “D i gite O t ras D ed u cc iones” )
If A M = 0 The n
El se
Sal = AM/30*NDT
TDeven = Sal + BR
Ret = TDeven*5/100
SS = TDeven*12/100
TDeduc = Ret + SS + OD
PN = TDeven – TDeduc
Print Nom, PN
End if

Considerado el código en su conjunto, se aprecia claramente que la condición If se ubi-


ca a 2 tabulados y que las instrucciones que se traducen por el lado del NO de la condición
se ubican a 3 tabulados, cumpliendo con el parámetro de la indentación.
En la traducción de la instrucción 8 se debe considerar que es una condición, pero que
a diferencia de la otra que ya se tradujo, no es un If, sino que hace parte de la conformación
del ciclo y que el ciclo se forma por el lado de la condición rotulado con NO. Por tanto, su
traducción será:

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:

Pr i vate Su b Co mmand 1_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
D i m T D e duc As D o u ble, PN A s D oub le
Do
No m = i npu tBox(“ D ig 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 ig ite as ig na c ión m ens u al” )
B R = i npu tBox( “ D ig ite bonifica c iones rec ibid as” )
O D = i npu tBox( “ D ig ite ot ras d ed u cc iones” )
If AM = 0 Then
Else
Sal = A M /3 0 *N DT
T D e v e n = S al + BR
Re t = T D even* 5/1 0 0
SS = T D even* 1 2 /1 0 0
T D e duc = Ret + SS + O D
P N = T Deven – T D ed u c
Pr i nt No m , P N
End i f
Lo o p U nti l A M = 0

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.* ;

p u bli c c lass Ca p 4 E j e m p lo1 {

pu bl i 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 = 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));

Str i ng No m ;

byte NDT;

float A M, B R , O D, Sal , T Deven, Ret , SS , T D ed u c , P N ;

d o{

Syste m.o u t . pr i ntl n( “ D ig ite nom bre d el t ra baja d or “ );

No m = le e.read L i ne();

Syste m.o u t . pr i ntl n( “ D ig ite nú m ero d e d ías t ra baja d os” );

NDT = Byte. parse Byte(lee.rea d Lin e());

Syste m.o u t . pr i ntl n( “ D ig ite as ig na c ión m ens u al” );

A M = Float . parse Floa t (lee.rea d L in e());

Syste m.o u t . pr i ntl n( “ D ig ite bonifica c iones rec ibid as” );

B R =Float . parse Float (lee.rea d L in e()); 278


Syste m.o u t . pr i ntl n( “ D ig ite ot ras d ed u cc iones” );
279

O D =Float . parse Floa t (lee.rea d L in e());


i f( A M ! = 0 ) {
Sal = A M/3 0* NDT;
T D e v e n = Sal + BR;
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 Ded u c ;
Syste m.o u t . pr i n tl n(N om + “ “ + P N );
}
}whi le( A M ! = 0 ) ;
}

}
· 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

Sal = A M/3 0 * N DT;


T D e v e n = Sal + BR;
Re t = T D e v e n* 5/1 0 0 ;
SS = T D e v e n* 1 2 /1 0 0 ;
T D e duc = Ret + SS + O D ;
P N = T D e v en - T D ed u c ;

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.

Paso 1. Investigación preliminar


Como se puede apreciar en el planteamiento del problema el dato de control es -999 y
con base en este se puede terminar el ciclo. Por lo cual, se debe hacer el análisis pensando
cómo se procesa el valor para un bulto, después ver cómo se acomodan las instrucciones
necesarias para que se procesen todos los bultos del lote.
Paso 2. Especificaciones

Tabla 45: Etapa de especificación. Ejemplo 2 / Capítulo 4.

Debe suministrar un valor, así:


Entradas
HR: Número de días trabajados de tipo Entero.

Procesos Peso = 170 - 1/EXP(HR) para 5 ≤ HR ≤ 150


Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

Salidas Un valor que representa el Peso de un bulto.

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

Figura 71: Corrección algoritmo. Ejemplo 2 / Capítulo 4.

Un detalle adicional en la construcción de este algoritmo es el hecho de que solo se


debe procesar humedades relativas entre 5 y 150, cualquier dato de humedad relativa que
no cumpla con esta restricción no se debe procesar y simplemente el algoritmo lo desecha
y vuelve a solicitar otro dato. Este punto se nota si se comparan los algoritmos de las figura
70 y 71, mientras el primero procesa todos los datos que se suministran para la humedad
relativa, el segundo presenta una condición que evalúa el dato de la humedad relativa y
determina si cumple con las condiciones que impone el problema con respeto a los datos
de control o centinelas y a los datos válidos, es decir, que pertenezcan al intervalo [5, 150].
Paso 4. Prueba de Escritorio
El mecanismo de prueba de escritorio es similar al aplicado en el algoritmo del ejem-
plo 1, aunque el valor de control ya no es cero sino –999. Numerando los componentes del
algoritmo para poder hacer la explicación de la prueba de escritorio se presenta la figura 72.
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

Figura 72: Algoritmo numerado para la prueba de escritorio.


Ejemplo 2 / Capítulo 4.

La lista de variables se muestra a continuación:

HR PESO

Se inicia la prueba de escritorio ejecutando la instrucción 1, de aquí se pasa a la ins-


trucción 2 que es solo un punto de suma y se sigue inmediatamente a la instrucción 3, que
corresponde a la lectura del dato de la humedad relativa que almacena en la variable HR.
Supóngase que se digita el valor 70. La lista de variables se vería así:

HR PESO

70

Con el valor (70) que se digitó y quedó almacenado en HR mediante la instrucción 3,


se pasa a la instrucción 4, que no es otra cosa que la evaluación del contenido de la varia-
ble HR. La valoración de la proposición da como resultado Verdadero o SÍ, por lo tanto, la
instrucción que se ejecuta es la 5, lo que corresponde a otra condición que consiste en la
valoración de otra proposición.
La instrucción 4 verifica que el valor que se digitó para la humedad relativa corres-
ponde al dato que permite terminar el ciclo o si es un dato que se deba procesar. Como
el dato que se almacenó en la variable HR es 70, no corresponde al valor para terminar
el ciclo, por tanto, continúa el procesamiento.
Con la instrucción 5 se verifica el hecho que el dato digitado para la Humedad Relativa sea
válido según el planteamiento del problema, esto es, que sea un valor en el intervalo [5,150].
La valoración de la proposición de la instrucción 5 es verdadera, por lo que el dato digitado
es válido y se procede a ejecutar la instrucción 6; que consiste en calcular el peso de un bulto
del lote según el valor de la humedad suministrado. En la lista de variables se verán los datos
almacenados en la memoria del computador para cada variable de la manera siguiente:

HR PESO

70 169.99

La instrucción 7 corresponde en visualizar el resultado del cálculo en la pantalla del


computador, es decir, se ve en la pantalla 169.99. La lista de variables se verá así:

HR PESO 284
285
70 169.99

De la instrucción 7 se pasa al punto de suma numerado como instrucción 8 y luego al pun-


to de suma numerado como instrucción 9; se sigue con la instrucción 10, que es una condición
que determina si se acaba el ciclo. Como la valoración de la proposición de la instrucción 10 es
Falsa (puesto que el valor de la variable HR, como lo muestra la lista de variables, es 70), regresa
a la instrucción 2, y vuelve a iniciar el ciclo con un nuevo dato.
En este punto, es decir, ejecutando la instrucción 3 por segunda vez, se habilita el te-
clado y se puede suministrar otro dato de humedad relativa para procesar. Se digita 200 y
queda almacenado en HR. La siguiente es la lista de variables:

HR PESO

70 169.99

200

De la instrucción 3 pasa a la instrucción 4 y la evaluación es verdadera, ya que 200


no es el valor para finalizar el proceso, por lo que se pasa a la instrucción 5.
La evaluación de la instrucción 5 es Falsa o NO, ya que 200 no pertenece al intervalo
[5,150]. Como no cumple con la condición se pasa directamente a ejecutar la instrucción
8 (punto de suma) y luego a la instrucción 9 (otro punto de suma), para así alcanzar la
instrucción 10 que es la condición para terminar el ciclo. El ciclo no termina porque la
valoración de la proposición de la condición numerada como 10 es Falsa, por tanto, se
vuelve a la instrucción 3, otra lectura. La lista de variables no cambia, es decir, los valores
almacenados en la memoria del computador no se alteran, porque 200 no implica que
haya que hacer algún proceso.
Al ejecutar la instrucción 3 se debe digitar otro dato de humedad relativa. Supóngase
que se suministra en este punto el valor para terminar el ciclo; es decir, -999 (que se alma-
cena en la variable HR) para terminar la ejecución del algoritmo. Los datos en la memoria
se verán en la lista de variables presentada a continuación:
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

HR PESO

70 169.99

200

-999

Ejecutada la instrucción 3, pasa a la instrucción 4 que evalúa el contenido de HR como


Falso o NO. Por tanto, se ejecuta la instrucción 9 (punto de suma) y la instrucción 10, con-
dición que da como resultado Verdadero o SÍ, lo que lleva a ejecutar la instrucción 11, con
lo que se termina la ejecución del algoritmo.
En conclusión, se suministraron tres valores para la prueba de escritorio. 70, que es un
dato válido y por tanto se procesó adecuadamente. El segundo 200, un dato inválido, que
no se procesó ya que es un dato que no pertenece al intervalo [5,150] definido por el pro-
blema. El tercer valor fue –999 que es el centinela y con este se finaliza el procesamiento
de información en el algoritmo.
Ejemplo 2 - Paso 5. Codificación
Se presenta la traducción el algoritmo del ejemplo 2 en diferentes lenguajes

· 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

i f( ( H R >= 5 )&&(H R < = 1 5 0 )){


Pe so = 1 70 -1 /Ma t h .ex p(H R);
Syste m .out . p rin tl n(“ ” + Pes o);
}
}
} whi le( H R ! = -9 9 9 );
}
}

· 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):

Figura 73: Estructura de un Ciclo.

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):

Figura 74: Instrucción de lectura de datos.

La instrucción que se muestra en la figura 74 indica que se debe habilitar el teclado en


la computadora para escribir un valor el cual quedará almacenado dentro de la memoria
en la variable Venta. Supóngase que digita el valor 35100, el que representa el total de
una venta hecha. Entonces, se podría ilustrar el contenido de la memoria del computador
como se muestra a continuación (Ver figura 75):

Figura 75: Dato almacenado en la memoria.


En la figura 75 se ve claramente que dentro de la memoria del computador hay guar-
dado (en algún sitio y de un tamaño apropiado) un valor: 35100, el cual queda referenciado
por medio del identificador Venta. Ahora bien, si se pretende digitar otro valor para volver
a ingresar en el computador otra venta hecha, entonces deberá volver a ejecutar otra ins-
trucción de lectura como la que se presenta en la figura 74.
Es importante aclarar que al introducir un dato en la memoria del computador y si en
ella hay almacenado alguno otro, este nuevo dato elimina el valor anterior y en su lugar
queda almacenado el nuevo dato digitado. Como el objetivo es que se suministren los
datos de las ventas hechas en el día y que en la memoria del computador quede en una
variable, la suma todos estos datos, entonces hay que idear un mecanismo que permita
salvaguardar la información para que no se pierda nada y así lograr calcular el resultado
deseado, es decir, obtener el acumulado de las ventas hechas en el día. El mecanismo
consiste en utilizar una variable adicional en la que se van guardando los datos que pre-
viamente se van digitando. Para que el computador comprenda que debe mantener el valor
de la primera venta hecha y que, al digitar la segunda venta, sume estos dos valores y se
calcule el total de ventas registradas, se debe diseñar una instrucción como la que esta:

290
291

Figura 76: Diseño de una instrucción de Acumulador.

Como se ve en la figura 76, al contenido de la variable Acum se suma el contenido de


la variable Venta. Sí el valor de la variable Acum es cero y es la primera vez que se ejecu-
ta esta instrucción, el nuevo valor de la variable Acum es la suma de cero y el valor que
contenga la variable Venta. La siguiente vez que se vuelva ejecutar la dupla de instrucción
referida por las figuras 74 y 76, es decir, que se lea un dato de venta y se acumule, no se
perderá ningún dato y al final en la variable Acum estará un valor que representa el acu-
mulado de ventas hechas. El diseño de un algoritmo que implemente todo lo dicho hasta
el momento se muestra a continuación:

Figura 77: Ciclo que maneja un acumulador.


La figura 77 muestra claramente que cuando se quiere manejar un acumulador se debe
hacer siempre dentro del contexto de un ciclo, es decir, al definir un acumulador en un
algoritmo, este debe tener conformado en su diseño un ciclo. En general, los problemas
que plantea el uso de acumuladores en su diseño, implican el diseño de un proceso cí-
clico y dentro de este se debe implementar un acumulador. Sin embargo, analizando este
algoritmo a la luz de la teoría que se expuso para la construcción de ciclos, es un algoritmo
mal diseñado, ya que al evaluar su desarrollo se ve que el algoritmo tiene un punto de
entrada al proceso y luego comienza un proceso que se repite indefinidamente, impidiendo
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

que pueda terminar su ejecución. La corrección que se debe hacer de este algoritmo se
presenta en la figura 78.

Figura 78: Corrección Ciclo que maneja un Acumulador.

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.

Figura 80: Contenido de las variables después de ejecutar la instrucción 1.


Este hecho se describe en la lista de variables como se muestra a continuación:

Acum Venta

Después de la instrucción 1 se ejecuta la instrucción 2 que no es sino un punto de


suma y de allí pasa a la instrucción 3. Al ejecutarse la instrucción 3 se habilita el teclado
del computador y se puede digitar un valor que sería el valor de la primera venta que es
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

175630. Al terminarse de ejecutar la instrucción 3 la memoria estaría cargada con la infor-


mación como lo muestra la figura 81.

Figura 81: Contenido de las variables después de ejecutar la instrucción 3.

La lista de variables presentaría la siguiente información:

Acum Venta

0 175630

Luego de la instrucción 3 se ejecuta la instrucción 4, consistente en sumar el contenido de


la variable Acum con el de la variable Venta, lo que da como resultado 175630, el cual sería aho-
ra el valor para la variable Acum. El proceso dejaría la memoria como lo muestra la figura 82.

Figura 82: Contenido de las variables después de ejecutar la instrucción 4.


De la figura 82 se ve claramente que el valor de la variable se ha duplicado, entonces,
la lista de variables se muestra de este modo:

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

Figura 83: Contenido de las variables después de ejecutar


la instrucción 3 por segunda vez.

La lista de variables se vería así:

Acum Venta

175630 110500

En figura 83 se ve claramente que al digitar el segundo valor no se pierde el primero


ya que este se ha salvaguardado por efectos de la instrucción 4 en la variable Acum. El
segundo dato entra a la memoria del computador y borra el dato que estaba previamente
grabado en la variable Venta, quedando, por tanto, con el segundo valor.
Al terminar la ejecución de la instrucción 3, el algoritmo ejecutará la instrucción 4
nuevamente. Esta actúa con la información que retiene en ese momento la memoria del
computador y que se muestra en la figura 83. El resultado de la ejecución de la instrucción
4 deja la memoria como lo muestra la figura 84.
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

Figura 84: Contenido de las variables después de ejecutar


La instrucción 4 por segunda vez.

La lista de variables muestra:

Acum Venta

286130 110500

Como se observa no se pierde ningún dato y se está calculando el acumulado de


las ventas hechas, ya que la variable Acum contiene el total de las ventas suministradas:
286130, resultado de la suma de 175630 más 110500. Terminada la ejecución de la instruc-
ción 4 pasa a ejecutarse la 5, evalúa la proposición y da Falso, por tanto, vuelve a empezar
el ciclo en 3 con la escritura del valor de la tercera venta realizada. La memoria queda
cargada como lo muestra la figura 85.

Figura 85: Contenido de las variables después de ejecutar


la instrucción 3 por tercera vez.
Terminada la ejecución de la instrucción 3, se pasa a ejecutar la instrucción 4, nueva-
mente, dando como resultado la información que muestra la figura 86 en la que se aprecia
que la variable Acum tiene el acumulado de las ventas suministradas.

Figura 86: Contenido de las variables después de ejecutar


la instrucción 4 por tercera vez.

La lista de variables muestra:

Acum Venta 296


297
421630 135500

Terminada la ejecución de la instrucción 4 pasa a la 5 y de allí directamente a la ins-


trucción 3 por cuarta vez. Al ejecutarse la instrucción 4 se debe suministrar un dato de
cero (dato centinela según el diseño del algoritmo para terminarlo) ya que los datos de las
ventas se agotaron. Ejecutada la instrucción 3 la información en la memoria será:

Figura 87: Contenido de las variables después de ejecutar


la instrucción 3 por cuarta vez.
La lista de variables muestra:

Acum Venta
421630 0

De la instrucción 3 se pasa nuevamente a la instrucción 4, la que no altera el contenido


de la información en la memoria del computador ya que suma cero. De la instrucción 4
pasa a la 5 y la evaluación de la proposición que contiene la condición da Verdadero o SI,
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

con lo que se termina el ciclo.


En conclusión, al finalizar el procesamiento de toda la información, la variable Acum
contiene la suma de todas las ventas hechas, según los datos de la prueba y se podrá vi-
sualizar en la pantalla del computador, imprimir o guardar en cualquier medio magnético.
En términos generales, es evidente que un acumulador es una variable. Para su uso
dentro de un algoritmo se deben definir básicamente dos valores. En primer lugar, un valor
de inicio, esto es una instrucción de la forma:

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

En donde la variable X es el acumulador y la variable Y es el dato o valor que va a


acumular o incrementa el de X. Esta variable, componente del acumulador, se debe ubicar
dentro del ciclo que maneja el acumulador y en el lugar que lógicamente haga las veces
de acumulador según el planteamiento del problema.

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

Tabla 46: Etapa de especificación. Ejemplo 3 / Capítulo 4.

Debe suministrar dos valores, así:


Entradas N1: Número menor de tipo entero
N2: Número mayor de tipo entero

En primera instancia se debe considerar el hecho


Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

que N1 debe ser menor a N2. Seguido a esto se


debe definir un ciclo que maneje un contador con
Procesos
valor de inicio N1, esto es: C = N1. El incremen-
to debe manejarse: C = C + 1, el ciclo debe tener
como dato centinela N2.

Cada uno de los valores enteros comprendidos


Salidas
entre los dos números considerados.

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:

Figura 88: Diseño preliminar del problema. Ejemplo 3 / Capítulo 4.


Como se puede apreciar en la figura 88 el algoritmo lee los datos y si el primer valor
es menor que el segundo se incrementa en uno el valor de N1 y se imprime mediante el
uso de la variable C; obteniendo así el primer valor de la serie. El algoritmo no hace nada
más, entonces, se debe incrementar de nuevo el valor de C y volver a imprimir este nuevo
valor. Se debe repetir el proceso de incrementar e imprimir el valor de C hasta que llegue
al valor mayor, es decir, hasta que C sea igual a N2. Con este proceso cíclico de incrementar
e imprimir se va generando la secuencia de números objeto del problema. El algoritmo
completo se muestra a continuación:

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

Figura 90: Algoritmo con los componentes numerados. Ejemplo 3 / Capítulo 4.

La lista de variables:

N1 N2 C

Al iniciar el seguimiento del algoritmo partimos de la instrucción 1 y siguiendo el flujo,


se pasa a la instrucción 2 la que permite leer dos números: 2 y 6 respectivamente, con los
que se deben generar la secuencia 3, 4 y 5 y almacenarlos en las variables N1 y N2, lo que
se muestra en la lista de variables así:

N1 N2 C

2 6

Terminada de ejecutar la instrucción 2 se pasa a la instrucción 3 que consiste en una


condición la que según los datos considerados da como resultado SI, pasando a ejecutar
la instrucción 4, que al ser ejecutada almacena en C el valor de N1 incrementado en uno.
La lista contendrá:

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

Luego se pasa a la instrucción 7 que incrementa el valor de C en uno, es decir, pasa de


tres a cuatro. La lista queda así:

N1 N2 C

2 6 3

Con el nuevo valor de C se ejecuta la instrucción 8 que consiste en la comparación del


valor de la variable C con el de la variable N2 y verificar si son iguales. Como no es cierto
que sean iguales, la ejecución del algoritmo continúa por el lado de NO de la condición
que controla el ciclo y se repite la ejecución de la instrucción 5 y luego 6 que es imprimir
el valor de C, es decir, cuatro. La lista queda del siguiente modo:
302
303
N1 N2 C

2 6 3

De nuevo se ejecuta la instrucción 7 que incrementa a C en uno, quedando con 5 y pasa


de nuevo a la condición de control de ciclo, instrucción 8, la que da como resultado Falso,
ya que 5 no es igual a 6; haciendo que se vuelva a comenzar el ciclo. La lista se verá así:

N1 N2 C

2 6 3

La instrucción que se ejecuta, en consecuencia, es la 5, el punto de suma y luego la


instrucción 6 que imprime el valor contenido en C. La siguiente es la lista correspondiente:

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

Al terminar de ejecutar la instrucción 7 se ejecuta nuevamente la instrucción 8 la que


da como resultado SÍ, causando que se termine el ciclo. La proposición es Verdadera por-
que el valor de C es 6 y el valor almacenado en N2 es 6, es decir, son iguales.
Como se puede apreciar en el desarrollo de la prueba de escritorio al suministrar al
algoritmo 2 y 6 se imprimen los números 3, 4 y 5 que es la secuencia de números enteros
entre el 2, sin incluirlo, y hasta el 6, sin incluirlo. Con esto se da cumplimiento al plantea-
miento del problema y queda entonces listo el algoritmo para ser traducido.
Paso 5. Codificación
A continuación se presenta el algoritmo codificado en diferentes lenguajes de pro-
gramación.

· 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

Si se analiza detenidamente el algoritmo se evidencia que cuando la condición com-


para N1 y N2, para determinar si N1 es menor que N2, si el resultado es NO, no se ejecuta
ninguna instrucción más y se pasa directamente al fin del algoritmo, ya que los datos no
cumplen con las condiciones del problema. Esto hace que aparezca una instrucción Else en
la traducción que no contiene ninguna instrucción, por lo que se puede retirar sin alterar
su composición. La traducción corregida será:
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
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 ;

pr i ntf( “D i g i te e l p r i m e r valor ” ); s ca n f(“ % d ”, &N 1 ); 304


pr i ntf( “D i g i te e l se gun do valor ” ); s ca n f(“ % d ”, &N 2 ); 305

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:

N1= i npu t( ‘ D i g ite el pr im er valor ’ )


N2 = i npu t( ‘ D i g i te el s egu nd o valor ’ )

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();

n1 = N um b e r( p rom p t(“ D ig ite el pr im er valor ” ));


n 2 = N um b e r(p rom p t(“ D ig ite el s egu nd o valor ” ));
i f ( n1 < n2 ) {
c = n1 +1 ;
do {
d ocum e n t .w rite(c ,’ < BR/> ’ );
c = c+1 ;
} w h ile (c ! = n2 );
}
</ SC R IPT >
</ B O DY >

</ 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

El número de estudiantes que pierden está dado por la siguiente función:

Estu_Pier = { Estu_Pier + 1
Estu_Pier + 2
si Def < 3.0
si Def ≥ 3.0

El índice de mortalidad se debe calcular dividiendo el número de estudiantes que


pierden entre 35 que es el total de estudiantes del curso y se multiplica por cien para ex-
presarlo en términos de porcentaje, esto es:

Estu_Pier
Indice_Mor = * 100
35
Paso 2. Especificaciones

Tabla 47: Etapa de especificación. Ejemplo 4 / Capítulo 4.

Debe suministrar 4 valores, así:


N1: Primera Nota de tipo Real
Entradas N2: Segunda Nota de tipo Real
N3: Tercera Nota de tipo Real
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

N4: Cuarta Nota de tipo Real

Def = (N1 + N2 + N3 + N4) / 4


Prom_Curso = Prom_Curso + Def(i)
Prom_Curso = Prom_Curso / 35
Procesos
Estu_Pier = Estu_Pier + 1 si Def(i) <3.0
Estu_Pier = Estu_Pier + 0 si Def(i) ≥ 3.0
Indice_Mot = Estu_Pier/35 * 100

Un conjunto de datos (Def) que son la definitiva de cada


estudiante. Un dato que corresponde a cuántos de los estu-
Salidas
diantes perdieron (Estu_Pier) el curso. Otro es el porcentaje
de mortalidad del curso.

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

Figura 91: Algoritmo para procesar los datos de un estudiante.


Ejemplo 4 / Capítulo 4.
Ahora, Se debe convertir este algoritmo en uno cíclico para que permita procesar los
datos de todos los estudiantes que conforman el curso. La modificación sería (Ver figura 92):

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

Figura 93: Algoritmo modificado para calcular el promedio del curso.


Ejemplo 4 / Capítulo 4.

El Acumulador, ya modificado, queda definido como Prom_Curso = Prom_Curso + Def.


Este incremento se da en cada uno de las iteraciones que se ejecutan, al final, después de
procesar todos los datos de los estudiantes, es decir, después de la condición del ciclo, el
valor almacenado es dividido por 35 para determinar cuál es el promedio solicitado. Final-
mente se debe reportar este promedio.
Ahora bien, atendiendo lo relacionado con el número de estudiantes que pierden el
curso, hay que tener en cuenta que se pierde el curso cuando la nota definitiva es menor
a 3.0 (las calificaciones parciales N1, N2, N3 y N4 deben ser valores entre 0.0 y 5.0). Desde
el punto de vista de la lógica del problema, esta restricción se debe poner en el diagrama
después del cálculo de la definitiva (Def) puesto que es después de este cálculo que se
tiene el dato de si se pierde o no el curso. Debe ser una instrucción de condición que al
ser evaluada la proposición indique que pierde e incremente un contador para ir suman-
do los estudiantes que pierden el curso.
En caso de que la evaluación de la proposición muestre que no se pierde la definitiva
del curso, los datos considerados para este estudiante no lo reportan, por lo tanto, no se
debe tener en cuenta como estudiante que reprueba; por lo cual, no se debe incrementar
el contador de estudiantes que pierden. De tal modo, debe incluirse en el algoritmo un
contador adicional con el propósito de llevar la cuenta de los estudiantes que pierden. Este
nuevo contador, que en las especificaciones se ha definido como Estu_Pier, se debe definir
como cualquier contador, con un valor de inicio (definido en el algoritmo antes del ciclo que
lo maneja) y su valor de incremento (que debe aparecer dentro del ciclo que lo maneja).
Tanto el contador de estudiantes que pierden el curso como la condición que com-
prueba si el estudiante pierde o no, se relacionan según se desprende del planteamiento
del problema. Dicha relación determina si el contador se incrementa, el cual se obtiene
si al evaluar la proposición que contiene la condición de pérdida del curso es Verdadera.
La figura 94 muestra lo expuesto:

310
311

Figura 94: Diagrama completo. Ejemplo 4 / Capítulo 4.


Paso 4. Prueba de Escritorio
El diagrama que muestra la figura 95 tiene sus componentes numerados y está modi-
ficado en la proposición de la condición del fin del ciclo, con el propósito de adelantar la
prueba para 3 estudiantes y no para 35 ya que se haría muy largo describirla en el texto.
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

Figura 95: Diagrama modificado para realizar la prueba de escritorio.


Ejemplo 4 / Capítulo 4.

La lista de variables es:

CE Prom_Curso Estu_Pier N1 N2 N3 N4 Def Indice_Mor

Se inicia la prueba de escritorio ejecutando la instrucción 1 y pasa a ejecutar la ins-


trucción 2 que consiste en asignar: cero a CE, cero a Prom_Curso y cero a Estu_Pier. Como
se observa en la lista de variables:

CE Prom_Curso Estu_Pier N1 N2 N3 N4 Def Indice_Mor


0 0 0
Las instrucciones 3 y 4 suministran las notas del primer estudiante almacenándolas en
la memoria del computador en las variables N1, N2, N3, y N4. Después de la ejecución de la
instrucción 4, la información queda en la memoria como se muestra:

CE Prom_Curso Estu_Pier N1 N2 N3 N4 Def Indice_Mor


0 0 0 3.5 4.1 2.9 3.0

Continua la ejecución de la instrucción 5 con la que se calcula la nota definitiva para


el estudiante. La memoria con la información queda como lo muestra la lista de variables:

CE Prom_Curso Estu_Pier N1 N2 N3 N4 Def Indice_Mor


0 0 0 3.5 4.1 2.9 3.0 3.375

La instrucción 6 imprime el valor de la variable Def, es decir, se vería en la pantalla


del computador 3.375 que es la nota definitiva del primer estudiante. La lista de variables
muestra este hecho marcando con un círculo la variable Def.

CE Prom_Curso Estu_Pier N1 N2 N3 N4 Def Indice_Mor


0 0 0 3.5 4.1 2.9 3.0 3.375 312
313
La instrucción 7 evalúa la proposición de la condición dando como resultado FALSA, ya
que el valor de Def no es menor a 3.0. Por lo anterior, el algoritmo no ejecuta la instrucción
8 y se pasa directamente a ejecutar la instrucción 9, que consiste en incrementar en uno
el valor de CE (CE=CE+1). Además, con la instrucción 9 se acumula la definitiva del primer
estudiante (Prom_Curso = Prom_Curso + Def). El propósito de la instrucción 9 es contar
como procesando las notas del primer estudiante y acumular su definitiva. La información
en la memoria del computador la muestra a continuación la lista de variables:

CE Prom_Curso Estu_Pier N1 N2 N3 N4 Def Indice_Mor


1 3.375 0 3.5 4.1 2.9 3.0 3.375

La instrucción 10 determina si se procesan las notas de otro estudiante o se termina el


ciclo. Como CE es uno, por lo que no es igual a 3, según la proposición, entonces la evalua-
ción de esta es FALSA y el algoritmo sigue su ejecución por el lado del NO de la condición,
ejecutando nuevamente la instrucción 3, el punto de suma y de allí a la instrucción 4.
La instrucción 4 es la lectura de datos, con la que se suministran los datos del
segundo estudiante. Si se suministran los valores 4.0, 5.0, 2.5 y 3.5, estos quedan en la
memoria como le muestra la lista de variables a continuación:

CE Prom_Curso Estu_Pier N1 N2 N3 N4 Def Indice_Mor


1 3.375 0 3.5 4.1 2.9 3.0 3.375
4.0 5.0 2.5 3.5
De la instrucción 4 se pasa a la 5, con la que se calcula la definitiva del segundo estudian-
te y luego se ejecuta la instrucción 6, que muestra el valor de la definitiva en la pantalla del
computador. En la memoria del computador la información queda como lo muestra la lista de
variables. Además, se ve el círculo que indica que la definitiva aparece en la pantalla, esto es:

CE Prom_Curso Estu_Pier N1 N2 N3 N4 Def Indice_Mor


1 3.375 0 3.5 4.1 2.9 3.0 3.375
4.0 5.0 2.5 3.5 3.75
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

Se vuelve ejecutar la instrucción 7 que es la evaluación de si pierde o no el curso. Se-


gún los datos de las notas definitivas no pierde el curso, por lo que se ejecutará la instruc-
ción 9, que consiste en contar los datos del segundo estudiante y acumular su definitiva.
La memoria del computador contendrá la información siguiente:

CE Prom_Curso Estu_Pier N1 N2 N3 N4 Def Indice_Mor


1 3.375 0 3.5 4.1 2.9 3.0 3.375
2 7.125 4.0 5.0 2.5 3.5 3.75

La ejecución de la instrucción 10 no termina el ciclo y vuelve a pedir datos el algoritmo.


Los datos que se suministran ahora son los del estudiante tres (2.1, 1.0, 1.9 y 3.1), esto, claro,
con la ejecución nuevamente de la instrucción 4. La información en la memoria se vería así:

CE Prom_Curso Estu_Pier N1 N2 N3 N4 Def Indice_Mor


1 3.375 0 3.5 4.1 2.9 3.0 3.375
2 7.125 4.0 5.0 2.5 3.5 3.75
2.1 1.0 1.9 3.1

De la instrucción 4 pasa a la 5 que calcula la definitiva y, a la 6, que muestra en la pantalla


la definitiva del tercer estudiante. La lista de variables en memoria se verá de esta manera:

CE Prom_Curso Estu_Pier N1 N2 N3 N4 Def Indice_Mor


1 3.375 0 3.5 4.1 2.9 3.0 3.375
2 7.125 4.0 5.0 2.5 3.5 3.75
2.1 1.0 1.9 3.1 2.025

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:

CE Prom_Curso Estu_Pier N1 N2 N3 N4 Def Indice_Mor


1 3.375 0 3.5 4.1 2.9 3.0 3.375
2 7.125 1 4.0 5.0 2.5 3.5 3.75
2.1 1.0 1.9 3.1 2.025
De la instrucción 8 se pasa a la 9 la que consiste en contar y acumular los datos del
tercer estudiante. La información en la memoria del computador queda del este modo

CE Prom_Curso Estu_Pier N1 N2 N3 N4 Def Indice_Mor


1 3.375 0 3.5 4.1 2.9 3.0 3.375
2 7.125 1 4.0 5.0 2.5 3.5 3.75
3 9.15 2.1 1.0 1.9 3.1 2.025

Se ejecuta a continuación la instrucción 10 con la que se evalúa la proposición de la con-


dición y su resultado es Verdadera, ya que el contenido de la variable CE es 3.
El ciclo pasa ahora a ejecutar la instrucción 11, que consiste en calcular el promedio del
curso, con base en el valor acumulado que tiene la variable Prom_Curso. Luego se ejecuta
la instrucción 12 que determina el índice de mortalidad del curso. Con la instrucción 13 se
muestran en la pantalla los datos almacenados en la variable Prom_Curso e Indice_Mor. Los
datos en la memoria del computador los muestra la lista a continuación:

CE Prom_Curso Estu_Pier N1 N2 N3 N4 Def Indice_Mor


1 3.375 0 3.5 4.1 2.9 3.0 3.375
2 7.125 1 4.0 5.0 2.5 3.5 3.75
314
3 9.15 2.1 1.0 1.9 3.1 2.025
315
3.05 33.3334

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

N1 = I n p ut b ox( “ D ig ite N ota 1 ”)


N2 = I n p ut b ox(“ D ig ite N ota 2 ”)
N3 = I n p ut b ox(“ D ig ite N ota 3 ”)
N4 = I n p ut b ox(“ D ig ite N ota 4”)

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

Pro m _Curs o = Prom _Cu rs o / 3 5


In di ce_ Mor = Es t u _P ier / 3 5 * 1 0 0
Pr i nt Pro m _Cu rs o, I nd ice_M or
End Su b

· 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 );

Pro m _Curs o = Prom _Cu rs o / 3 5 ;


In di ce_ M or = Es t u _P ier / 3 5 * 1 0 0 ;

pr i ntf( “%1 0 . 2 f %1 0 . 2 f ”, Prom _Cu rs o, I nd ice_M or );
}
· Lenguaje Java:
i mpo r t j ava . i o.* ;
pu bli c c lass Ca p 4 E j e m p lo4 {
pu bl i c stati c vo i d ma 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) ) ;
float N1, N2 , N3 , N 4 , Prom _Cu rs o, I nd ice_M or, D ef ;
i nt Estu_ P i e r, C E ;

C E = 0;
Pro m _Curso = 0 ;
Estu_ P i e r = 0;

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 ) ;

Pro m _Curso = Pro m _Cu rs o / 3 5 ;


In di ce_ Mo r = Estu_P ier / 3 5 * 1 0 0 ;
Syste m .o ut. p r i n tl n (“ ” + Prom _Cu rs o + “ “ + I nd ice_M or );
}
}
· Python:

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

Pro m _Curso = Pro m _Curso / 3 5


In di ce_ Mo r = Estu_ P i e r / 3 5 * 1 0 0
pr i nt Pro m _Curso, In di ce_M or
· JavaScript:
<H TML>
<B O DY >
<SC R IPT >
var n1 = n e w N um b e r(); va r n2 = n e w N um b e r();
var n 3 = n e w N um b e r(); va r n4 = n e w N um b e r();
var de f = n e w N um b e r(); va r prom _cu rs o = n e w N um b e r();
var i n di ce_m or = n e w N um b e r(); va r es t u _pier = n e w N um b e r();
var ce = n e w N um b e r();
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

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!

Y su cálculo se logra de la siguiente manera:

N! = ||i

Lo anterior expresa el cálculo: N! = 1*2*3*...*N. O lo que es lo mismo: N! = N*(N-1)*(N-2)*(N-3)*...*1


Paso 2. Especificaciones

Tabla 48: Etapa de especificación. Ejemplo 5 / Capìtulo 4.

Debe suministrar 1 valor de tipo entero, así:


Entradas
N: Dato a calcular factorial.

Si N es menor a cero no hay factorial.


Si N es 1 o 0 el factorial es 1.
Procesos
Si N es mayor a 1 el factorial es:
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

F = N*(N-1)*(N-2)*(N-3)*...* 1

Salidas Un dato (F) que representa el factorial.

Diagrama de caja ne-


gra del problema

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

Figura 98: Algoritmo para el Factorial de un número. Ejemplo 5 / Capítulo 4.

Ejemplo 5 - Paso 4. Prueba de Escritorio


Para adelantar la prueba de escritorio se tomarán los siguientes datos: un valor ne-
gativo (-4), el cero (0), el uno (1) y un dato con valor positivo (3). A partir del diagrama de
la figura 98, se numerarán sus componentes para efectos del seguimiento en la prueba. A
continuación, se muestra el algoritmo numerado:
322
323
Figura 99: Diagrama numerado para la prueba de escritorio.
Ejemplo 5 / Capítulo 4.

La lista de variables del algoritmo para la prueba de escritorio es:

N F

Se inicia la prueba ejecutando la instrucción 1 que es el comienzo del algoritmo y, de allí


se pasa a ejecutar la 2, la que habilita el teclado para escribir un dato, el que se almacenará en
la memoria del computador referenciado por la variable N. En este caso digitar un valor –4. La
información en memoria que maneja el algoritmo se presenta en la lista de variables:

N F

-4

Terminada de ejecutar la instrucción 2, se sigue la instrucción 3, condición que evalúa


la proposición dando como resultado Verdadera o SÍ, continuando, en consecuencia, la
ejecución del algoritmo el flujo por el lado del SI de la instrucción 3 y pasando a ejecutar
la instrucción 4. Aquí se visualiza un mensaje que indica que el valor suministrado al algo-
ritmo no es válido para calcular el factorial. La lista de variables es:
N F

-4 El valor es negativo por lo que no tiene factorial

De la instrucción 4 se pasa directamente a la instrucción 12 que corresponde al fin de


la ejecución del algoritmo. Se concluye que –4 no es un dato que tenga factorial.
Ahora se iniciará nuevamente la prueba para otro valor. Se ejecuta la instrucción 1 y de
ahí a la instrucción 2 para digitar el valor cero. Terminada de ejecutar la instrucción 2 se
pasa a la 3. De acuerdo con la evaluación de la condición se sigue el flujo por el lado del
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

NO dado que N (contiene cero) no es menor a cero y se pasa a ejecutar la instrucción 5.


Los datos en la memoria son:

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

En 6 se evalúa la proposición y como N es igual a cero se sigue a ejecutar la instrucción


11 que visualiza el valor almacenado en F y pasa a ejecutar 12 con lo que termina la eje-
cución del algoritmo y se determina que es correcta ya que al suministrarle cero él debe
calcular como factorial uno. La lista de variables queda:

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

De la instrucción 2 se pasa a la 3 y se sigue a la instrucción 5 que almacena 1 en F. La


lista de variables es:

N F
1 1

De la instrucción 5 se pasa a la 6 y 7 dado que N no es igual a cero. De la instrucción


7 se mueve a la 8 que consiste en acumular la primera multiplicación en F. Dado que F es
igual a 1 y N también, la multiplicación dará 1. La lista de variables en apariencia no cambia,
entonces se sigue con la instrucción 8 y se transita a la 9. Esta decrece el valor de N en uno.
La lista de variables queda:

N F
1 1
0

Terminada de ejecutar la instrucción 9 se continúa a la 10 que consiste en la evaluación


de N para ver si se continúa o termina el ciclo. Como N es cero se sigue el flujo del diagrama
por el lado del SÍ de la condición y se pasa a ejecutar la instrucción 11 que visualiza el valor
de F. La lista de variables queda sin alteración después de ejecutada la instrucción 11, así:

N F
1 1
0

En consecuencia, y de acuerdo al planteamiento del problema, al suministrar 1 se


debe calcular como factorial, lo cual se logra ejecutando el algoritmo de la forma que
324
se acaba de hacer, probando que el diseño es correcto.
325
Ahora, como última prueba del algoritmo se usará el valor 3. Entonces se debe escribir la
lista de variables y se comienza la ejecución. La lista es:

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

Se continúa con las instrucciones 6, 7 y 8; esta última acumula la primera multiplicación


en F. Como N es 3 y F es 1 la multiplicación da 3. La lista de variables es:

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

A continuación, se ejecuta la instrucción 10 y como N no es igual a cero se sigue el flu-


Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

jo por el lado del NO de la condición repitiendo de nuevo la instrucción 7 y luego la 8. La


instrucción 8 acumula la segunda multiplicación dando como resultado 6 ya que N tiene 2
y F tiene 3. La lista queda del siguiente modo:

N F

3 1

2 3

Se vuelve a ejecutar la instrucción 9 que vuelve a restar el valor de N quedando con 1,


como se observa en la lista de variables:

N F

3 1

2 3

1 6

La instrucción 10 continúa el ciclo y de allí pasa a la 7 y después a la 8. La instrucción


8 acumula la tercera multiplicación. Como F tiene 6 y N tiene 1, el nuevo valor de F es 6 ya
que 6 * 1 es 6. La lista de variables queda:

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

De la instrucción 11 se pasa a la 12 con la que termina la ejecución del algoritmo y la


prueba del mismo.
En conclusión, el algoritmo funciona correctamente, pues al suministrarle un valor
negativo responde con un mensaje de invalidez; al escribirle cero responde con 1, al su-
ministrarle 1 vuelve a responder con 1; y si se le escribe cualquier valor positivo (3 para el
ejemplo) calcula adecuadamente el valor del factorial. Con esto, se prueba que el diseño 326
del algoritmo es correcto. 327
Ejemplo 5 - Paso 5. Codificación
Observamos el algoritmo reescrito en diferentes lenguajes.
· Lenguaje Visual Basic:
Pr i vate Su b Co m m a n d1_Cl i c k( )
D i m N As Inte ge r, F As Inte ge r

N = Inpu tbox( “D i g i te valo r a calcu la r fa c tor ial” )


If N < 0 The n
Pr i nt “ Valo r n e ga ti v o. No t iene fa c tor ial”
El se
F = 1
If N = 0 The n

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

r ial”,’ < BR/> ’ );


}
e l se {
f = 1;
if (n> 0 ) {
do {
f = f *n;
n = n-1 ;
} w h ile (n! = 0 );
}
docum e n t .w rite(f,’ < BR/> ’ );
}
</ SC R IPT>
</ B O DY >
</ H TML>

· La Codificación en Lenguaje PHP:


<? p h p
$ stdi n = fo pen(‘ php: //s td in’,’ r ’ );

se ttype ( $ n ,’ integer ’ );
se ttype ( $f,’ i n teger ’ );

e c ho ‘ D i g i te valor a calcu la r fa c tor ial ‘ ;


fscanf( $ stdi n ,” % d ”, $n);

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

Figura 100: Diagrama de flujo de datos.

Para los acumuladores:


· Tener una instrucción que defina su valor de inició. Se escribe antes del ciclo y
generalmente es igual a cero.
· Tener una instrucción que defina su valor de incremento. Se ubica entre los límites
del ciclo, generalmente antes del fin del ciclo
· Tener una instrucción de finalización del acumulador. Generalmente se pone 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í:
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

Figura 101: Diagrama de flujo con dato centinela.

4.5. Ejercicios de repaso


Construir los algoritmos para la solución de cada uno de los siguientes ejercicios de pro-
gramación siguiendo la metodología (Investigació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 mismos1.
1. Leer un conjunto de números y calcule para cada uno su inverso aditivo. El progra-
ma termina con un dato centinela.
2. Leer una lista de 20 números positivos, calcular y mostrar para cada uno el cuadra-
do, el cubo y la cuarta potencia.

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:

S = 0*A + 2*A + 4*A + 6*A +... + 2*N*A

17. Escriba la serie de Fibonacci hasta que el último valor sea mayor a 10000. La serie es:

0, 1, 1, 2, 3, 5, 8, 13, 21, ...


Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

18. Mostrar la secuencia de números

5, 10, 15, 20, 25, 30, ..., N, …, 30, 25, 20, 15, 10, 5.

N debe ser un número entero positivo mayor a 5 y menor a 1000.


19. Recibir un número entero positivo menor a 5000 y generar la siguiente suma.

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
+ ···)

27. Usar la siguiente serie para calcular el número π:

2 4 4 6 6 8
π = 4 * * * * * * * ···
3 3 5 5 7 7

28. Usar la siguiente serie de Taylor para calcular el coseno de x:

Σ (-1) n
Coseno(x) = x 2n
(2n)!
n=0

29. Calcular el valor de la serie que se muestra a continuación:

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)

31. Determinar el número de combinaciones de X elementos tomando de a Y elemen-


tos. La fórmula para calcular este número es:

x x!
(y ( ( (
y ! (-y)!

32. Suministrar dos valores enteros (M y N) siempre M menor a N. El algoritmo debe


visualizar las tablas de multiplicar comprendidas en [M, N].
33. Calcular e imprimir los coeficientes binomiales según la expresión:

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

Calcular e imprimir para cada estudiante el nombre y el valor de la matrícula. El


valor de la matrícula se calcula como el valor de crédito por el número de créditos
más un valor de recargo en la matrícula. También se requiere que al final imprima
Fundamentos de lógica para programación de computadores · Cap. 4 · Ciclos, acumuladores y contadores

el total pagado por todos los estudiantes y el promedio de la 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

Tomar un capital de inversión inicial K a una tasa de interés del T% y calcular


cuántos años se requiere para alcanzar una inversión de un valor dado usando el
cálculo antes descrito.
36. Tomando los datos de un conjunto de estudiantes, determinar cuántos son hom-
bres y cuántas mujeres, cuántos estudian cálculo, cuántos estudian física, cuántos
estudian química y cuántos estudian español.
37. Un método para calcular la depreciación de un bien consiste en tomar el valor del
bien y aplicarle el siguiente procedimiento. Supóngase que se quiere depreciar un
bien que vale $21.000.000 en 7 años. Se procede así: como el número de años a
depreciar es 7 se suma 1+2+3+4+5+6+7 =
La depreciación se calcula así:

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)!

39. Se desea tabular la función

{
1690000 + 0.418p 2
- p < 0
1950000
f(p) =
p
1 + p > 0
1950000

Para valores de P en el intervalo [-10.000.000, 10.000.000] con incrementos de 5.000,


escribir un algoritmo que tabule la función.
40. Supóngase que se tiene el número 8, a partir de este valor se obtienen los siguien-
tes resultados:

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

Suministrar un número entero positivo menor a 100 e imprimir la serie de valores.


41. Dado un número, mostrar el triángulo de Pascal. Supóngase que se da 8, entonces
debe mostrarse:

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.

#
# # #
# # # # #
# # # # # # #
# # # # # # # # #
# # # # # # #
# # # # #
# # #
#

44. Calcular la suma:

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

Donde R0 = 1 será el valor inicial. El proceso termina cuando el valor absoluto de la


diferencia entre Ri+1 y Ri es menor o igual 0.000001, es decir,

|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

En un gran número de problemas, el manejo de información que se hace con


el computador involucra una cantidad muy grande de datos que son almace-
nados en su memoria mediante el uso de variables y, por tanto, se requiere
de una gran cantidad de nombres de variables para tratar dichos datos. Si
estos datos son homogéneos, esto es, datos que se refieren a una misma
cosa (como ejemplo las ventas hechas por un vendedor en un año, el regis-
tro de temperaturas en un estudio dado o los datos de los resultados de un
campeonato de futbol), la manipulación práctica de toda esta información se
logra agrupándola u organizándola bajo una única variable. Esta agrupación
es lo que se conoce como arreglos o matriz (Ríos Cartrillón, 1995).
5.1 DEFINICIÓN DE ARREGLOS
Para explicar gráficamente el concepto, supóngase que se tiene que almacenar en la me-
moria RAM las ventas hechas por un vendedor durante una semana, entonces de acuerdo
con lo que se ha estudiado, en la RAM quedaría la información como se ve a continuación:

Figura 102. Variables para almacenar las ventas de la semana


Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

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

Lo que quiere decir que en el segundo compartimiento de la variable Ventas queda


almacenado el valor 78960. Cada compartimiento de la variable recibe el nombre elemento
del arreglo. Gráficamente se puede interpretar este hecho de la forma siguiente:
Figura 105: Almacenar un valor en Ventas(2).

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

almacena en el elemento 5 de la variable Ventas el valor de 34740.

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í:

Figura 106: Datos después de ejecutada la instrucción 1.


Continúa la ejecución de la instrucción 2, la que deja almacenado en la variable Dato el
valor de 68960, así:

Figura 107: Datos después de ejecutada la instrucción 2.

La ejecución de la instrucción 3 deja almacenado en la variable Ventas(2) el valor


de 78960, así:

346
347

Figura 108: Datos después de ejecutada la instrucción 3.

Con la instrucción 4 se calcula la diferencia, que da como resultado 36860, valor


que queda guardado en el elemento 3 de la variable Ventas. En la memoria del com-
putador la información queda almacenada como se muestra a continuación:
Figura 109: Datos después de ejecutada la instrucción 4.

Con la instrucción 5 incrementa el contador I a 3, así:


Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

Figura 110: Datos después de ejecutada la instrucción 5.

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.

Figura 111: Datos después de ejecutada la instrucción 6.


Como se pudo ver, para la definición de un arreglo se hace necesario que los datos
que van a ser manejados en él sean del mismo tipo u homogéneos. Además es necesario
saber cuántos son los datos involucrados y que tengan alguna secuencia, es decir, que el
primer dato, el segundo, y el enésimo, sean identificables claramente. No solo se pueden
almacenar datos numéricos en los arreglos, también se pueden guardar caracteres, datos
lógicos o datos tipo String.
Esa es la importancia de los arreglos: que son variables que no solo almacenan datos
homogéneos, sino que los guardan en la memoria del computador de manera contigua,
uno junto al otro.
El subíndice o índice es un número entero que designa la posición de un elemento den-
tro del arreglo y por medio de él se puede hacer referencia a un dato dentro del arreglo. El
índice puede ser un número o una expresión numérica que dé un valor comprendido en el
intervalo o rango de definición del arreglo, es decir, un número que corresponda a una de las
posiciones del arreglo (Ríos Cartrillón, 1995). El rango o intervalo de definición de un arreglo
tiene un límite inferior que es el menor valor permitido para dar inicio a la numeración de
cada uno de los elementos del arreglo. También el rango tiene un límite superior definido
como el mayor valor permitido para las posiciones del arreglo (Ríos Cartrillón, 1995).
348
Para el manejo de estos conceptos se puede tomar el ejemplo tratado anteriormente.
349
En él se definió un arreglo llamado Ventas que tiene un rango [1..6] en donde el límite
inferior es 1 y el límite superior es 6. El límite inferior del rango puede ser cualquier valor,
pero el límite superior debe ser un valor mayor o igual a límite inferior y siempre núme-
ros enteros (Ríos Cartrillón, 1995).

5.2. OPERACIONES CON LOS ARREGLOS

5.2.1. Creación de un arreglo


Para crear un arreglo es necesario de antemano saber cuántos elementos debe tener. A
esto se le llama la dimensión del arreglo. Su definición se hace mediante el proceso que
describe la siguiente instrucción:

Dim Ventas (1 a 6): Real

Dim es una abreviatura de dimensión. Después de la cláusula se debe escribir el nom-


bre de la variable que se va a usar como arreglo. A continuación, se pone entre paréntesis
el rango del arreglo, por último se debe escribir dos puntos y seguidamente el tipo de
datos que va a manejar en el arreglo (Vaquero Sanchez & Quieroz Vieyra, 1998).
5.2.2. Asignación de valores dentro de un arreglo
Como se observó en el ejemplo del numeral anterior, para guardar un dato en un elemento
del arreglo se hace mediante el proceso normal de asignación que se usa para una varia-
ble ordinaria, esto es:

Dim Ventas (2): 23590

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

Figura 112. Algoritmo que llena un arreglo.

Como se puede ver en el algoritmo de la figura 112, el contador es la variable I y su


valor de inicio es de 1 puesto que el arreglo se dimensionó como Arr con rango de 1 a 10
y con capacidad de almacenar valores reales. Una característica de este algoritmo es que
llena secuencialmente uno a uno, desde el primero y hasta el último los elementos de Arr.
5.2.3. Recorrido de un arreglo
Se llama recorrido de un arreglo al procedimiento secuencial y consecutivo que se hace de
cada uno de los elementos de éste y es el trabajo básico para cualquier operación en la
que se necesite procesar secuencialmente los elementos de un arreglo. Esta operación fue
la que se adelantó para llenar el arreglo en el numeral anterior.

5.2.4. Imprimir un arreglo


El proceso para imprimir secuencialmente los datos contenidos en un arreglo es básica-
mente el mismo que se usó para llenarlo. El algoritmo que se muestra a continuación hace
dos operaciones: llenar e imprimir un arreglo definido como Arr.

350
351

Figura 113. Algoritmo que llena un arreglo y lo imprime.

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

Figura 114. Representación de un ciclo con una estructura Para-desde-hasta.me.

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:

Para 1 desde 1 hasta 10 con incremento de 1

Figura 115: Representación de un ciclo con una


estructura Para-desde-hasta.

I = 1 , 1 0 , 1

Figura 116: Representación de un ciclo con una


estructura para-desde-hasta compacta.
En conclusión, con la introducción de esta estructura en el algoritmo de la figura 113, las
operaciones de llenado e impresión del arreglo, quedarán:

Figura 117: Llenado e impresión de un arreglo con ciclos Para-Desde-Hasta. 352


353
5.2.5. Buscar datos en un arreglo
Esta operación consiste en suministrar un dato y verificar si se encuentra almacenado en el
arreglo. Para lograr esta operación es necesario recorrer el arreglo. Supóngase el siguiente
ejemplo: se llena un arreglo con números enteros positivos y se quiere determinar en cuáles
elementos se encuentra almacenado un valor dado. El algoritmo queda así:

Figura 118: Operaciones de llenado y búsqueda.


A partir de una prueba de escritorio para ver los resultados que presenta este al-
goritmo, se muestra el diagrama con la numeración de las instrucciones del mismo,
adecuándolo a 3 elementos con el fin de hacer una prueba de escritorio corta y explicar
claramente el funcionamiento del algoritmo.
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

Figura 119: Diagrama modificado para adelantar la prueba de escritorio.

Para la prueba de escritorio se debe hacer primero una lista de las variables que se
involucran en el algoritmo:

I Dato Buscar Arr

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:

I Dato Buscar Arr

1 2 3
1

De la instrucción 3 se pasa a ejecutar la instrucción 4 que es la que permite digitar un


valor y lo almacena en la variable Dato. Supóngase que se escribe el número 34, entonces en
Dato queda almacenado dicho valor:

I Dato Buscar Arr

1 2 3 354
1 34 355

La instrucción 5 evalúa la proposición contenida en la condición. Según el valor al-


macenado en Dato (34) y comparado con cero da como resultado Verdadero, ya que es
mayor que cero. Este resultado hace que se pase a ejecutar la instrucción 6 que consiste
en almacenar en el arreglo, en el primer elemento, el valor 34 ya que es un valor positivo.
La lista de variables queda:

I Dato Buscar Arr


1 34 1 2 3
34

Se almacena el valor 34 en el primer elemento del arreglo porque la instrucción 6


muestra claramente que la Variable Arr(I) tiene como subíndice la variable I, como tal,
esta variable contiene uno; por esta razón es que el computador almacenará el valor 34
en el primer elemento del arreglo.
Pasamos a ejecutar la instrucción 7, que no es más que el punto de suma de la con-
dición. 8 devuelve el ciclo para incrementar el contador I y determinar si ya es mayor que
3. Todo esto ejecutando nuevamente la instrucción 3. Obsérvese a continuación la lista de
variables después ejecutada la instrucción 3:

I Dato Buscar Arr


1 34
1 2 3
2 34

Como la variable I se incrementa a 2 y no es mayor que 3 se ejecuta nuevamente la ins-


trucción 4 para poder suministrar otro dato. En esta ocasión se digita el valor –5, que se guarda
en Dato. La lista de variables queda:

I Dato Buscar Arr

1 34
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

1 2 3
2 -5
34

De la instrucción 4 se pasa a ejecutar nuevamente la instrucción 5 y la evaluación de la


proposición da como resultado falso, ya que el valor digitado es menor que cero, por lo que se
pasa a 7 y luego a 8 que devuelve nuevamente el ciclo a la instrucción 3, la cual incrementa el
contador I a 3 y como no es mayor que 3 entonces pasa a ejecutar de nuevo la instrucción 4.
La lista de variables queda:

I Dato Buscar Arr

1 34
1 2 3
2 -5
34
3

La instrucción 4 permite digitar un nuevo valor y almacenarlo en la variable Dato, por


ejemplo 9. La lista de variables queda:

I Dato Buscar Arr

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:

I Dato Buscar Arr

1 34
1 2 3
2 -5
34 9
3 9

Se ejecutan las instrucciones 7 y 8 que devuelve nuevamente a ejecutar la instrucción


3. Una vez más se incrementa el contado I y como ya es mayor que 3 se pasa a ejecutar, en
consecuencia, la instrucción 9.
Como se puede apreciar de la prueba de escritorio que se ha adelantado hasta este
punto, el arreglo no quedó completamente lleno ya que al digitar valores negativos estos
no son guardados, cosa que debe ser, pues las condiciones del problema así lo indican.
Pero al desechar el valor negativo, de todas formas, incrementa el contador I la instrucción
3. Como el contador tiene un nuevo valor, el próximo dato que se pretende almacenar en el
arreglo quedará en el siguiente elemento, dando como resultado que algunos elementos
del arreglo queden desocupados.
Por el análisis que se acaba de hacer de los resultados de la prueba de escritorio, es
necesario modificar el algoritmo para que al digitar valores negativos simplemente los
deseche y solo guarde valores enteros positivos sin dejar elementos desocupados. La
modificación del algoritmo se presenta a continuación:

Figura 120: Modificación al algoritmo de la figura 119.


Como se puede ver en la figura 120, al introducir la instrucción de disminuir para
el contador I en caso que no sea un valor positivo el que se digite, esta instrucción
resta en uno el contador y pasa a ejecutar la instrucción del ciclo la que incrementa
el contador y lo deja en el valor que se encontraba para recibir el dato en el elemento
correcto del arreglo.
Con la modificación hecha en el algoritmo se debe comenzar de nuevo la prueba de
escritorio, pero ahora sobre el algoritmo de la figura 120 con los ajustes hechos:
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

Figura 121: Diagrama corregido para la prueba de escritorio.

La lista de variables para adelantar la prueba de escritorio es la misma que se estaba


usando en la prueba del algoritmo que tenía el error. Esta lista de variables al comenzar
la prueba se presenta de la siguiente forma:

I Dato Buscar Arr

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:

I Dato Buscar Arr

1
1 2 3

De la instrucción 3 pasa a ejecutar la instrucción 4 ya que el contador I no es mayor que


3. La instrucción 4 permite suministrar un valor, supóngase 34, y lo almacena en la variable
Dato. La lista de variables se observa a continuación:

I Dato Buscar Arr

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:

I Dato Buscar Arr

1 34
1 2 3
34

De la instrucción 7 se pasa a la 8, que no es sino un punto de suma y, de este pasa a la


instrucción 9 que devuelve el ciclo a la instrucción 3. Nuevamente se incrementa el contador
I en uno y determina si es mayor que 3. Como el contador se incrementa de 1 a 2, que no es
mayor que 3, entonces se vuelve a ejecutar la instrucción 4. Así es la lista de variables:

I Dato Buscar Arr

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:

I Dato Buscar Arr

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:

I Dato Buscar Arr

1 34
1 2 3
2 -5
34
1
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

De la instrucción 6 se pasa a ejecutar la 8 y después la 9. La instrucción 9 devuelve el


ciclo a la instrucción 3, que incrementa nuevamente el contador I, que, como lo muestra la
lista de variables, contiene uno, entonces queda nuevamente en 2. Este trámite, restar y luego
sumar al contador I, es lo que permite que no se dejen elementos del arreglo desocupados
cuando se digitan valores negativos que deben ser rechazados. La lista de variables es:

I Dato Buscar Arr

1 34
2 -5 1 2 3
1 34
2

La instrucción 3 deja el contador I con 2 que es el número que corresponde al segundo


elemento del arreglo a ser llenado. Como el contenido del contador I no es mayor que 3 se
pasa a ejecutar la instrucción 4. Con esta instrucción se digita el valor 9 y se almacena en
la variable Dato. Esta es la lista de variables:

I Dato Buscar Arr

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:

I Dato Buscar Arr

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:

I Dato Buscar Arr 360


1 34 361
2 -5
1 2 3
1 9
34 9
2
3

La instrucción 4 permite suministrar otro valor. En esta ocasión se digita el 951. Lista de
variables queda de esta forma:

I Dato Buscar Arr

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á:

I Dato Buscar Arr

1 34
2 -5
1 2 3
1 9
34 9 951
2 951
3

De la instrucción 7 se pasa a la 8 y de esta a la 9. La instrucción 9 devuelve el ciclo a


la instrucción 3 que incrementa el valor del contador I a 4 y como ya es mayor que 3, en-
tonces se salta a la instrucción 10, es decir, termina el ciclo, en tanto que se han llenado
correctamente todos los elementos del arreglo. La lista de variables es:
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

I Dato Buscar Arr

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:

I Dato Buscar Arr

1 34 9
2 -5
1 9 1 2 3
2 951 34 9 951
3
4

De la instrucción 10 se pasa a ejecutar la instrucción 11. Esta instrucción 11 da inicio al con-


tador I nuevamente y determina si el valor del contador es mayor que 3. La lista de variables es:
I Dato Buscar Arr

1 34 9
2 -5
1 9
1 2 3
2 951
34 9 951
3
4
1

Como el contenido del contador I es 1 entonces se pasa a ejecutar la instrucción 12.


La cual es una condición que evalúa la proposición compuesta por la variable Buscar y el
primer elemento de Arr, esto es determina que si el contenido de Buscar es igual Arr(I).
Dado que el contenido de Buscar es 9 y el de Arr(I) es 34 no son iguales y por tanto la
instrucción que se pasa a ejecutar es la 14, luego la 15, la que devuelve el ciclo de la ins-
trucción 11, incrementando el contador I en uno y como no es mayor a 3 se pasa a ejecutar
la instrucción 12. A continuación se observa la lista de variables:

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

La instrucción 12 compara ahora el contenido de Buscar y del segundo elemento de Arr,


esto es compara el valor 9 de Buscar con el valor 9 de Arr(I) que son iguales, por lo que se
pasa a la instrucción 13 que consiste en mostrar en la pantalla el valor 2 que contiene el
contador I. La lista de variables queda:

I Dato Buscar Arr

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:

I Dato Buscar Arr

1 34 9
2 -5
1 9
2 951
1 2 3
3
34 9 951
4
1
2
3

La instrucción 12 da como resultado Falso ya que el contenido de Buscar y de Arr(3) no


Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

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:

I Dato Buscar Arr

1 34 9
2 -5
1 9
2 951
3 1 2 3
4 34 9 951
1
2
3
4

Con esta instrucción 16 se termina la ejecución del algoritmo.


De la lista de variables se puede concluir que se llena un arreglo con valores enteros
positivos y después se puede suministrar un valor para determinar si este se encuentra re-
gistrado en el arreglo. En caso que se encuentre se reportarán las posiciones en esta el dato,
es decir, se muestran los subíndices de los elementos que contienen el valor suministrado.
Hay que aclarar que este algoritmo busca de manera secuencial el dato en el arreglo, es
decir, va buscando desde el primer elemento hacia el último y reporta todas las posiciones
del arreglo que contiene el dato buscado.
Con esto se termina la prueba de escritorio y se muestra cómo funcionan los arreglos
y sus operaciones de llenado, recorrido, búsqueda e impresión.
Ahora la codificación de este algoritmo en Visual Basic se hará a partir del diagrama
mostrado por la figura 121 pero teniendo presente que se deben corregir los ajustes que
se hicieron para adelantar la prueba de escritorio, es decir, cambiar el tamaño del arreglo
y los límites de los ciclos, esto es, que se maneje un arreglo de 10 elementos y ciclos que
se ejecutan hasta 10 veces. Esta codificación tiene de particular el hecho de presentar la
traducción de la instrucción de control Para-desde-hasta. En el diagrama de la figura 121
las instrucciones de los ciclos Para-desde-hasta son las numeradas con 3 y con 11. Con la
modificación incluida la codificación se hace así:

Diagrama Codificación

I = 1 , 1 0 , 1 F o r I = 1 To 1 0 S t e p 1

Esta es la instrucción de definición del inicio del contador y de las condiciones de


364
finalización e incremento del ciclo, ya que en ella se expresa claramente que el conta-
365
dor se inicia en 1 y llega hasta 10 con incrementos de 1. Las instrucciones de retorno de
los ciclos mostrados en la figura 121 son las numeradas como 9 y 15. Estas instrucciones
no son, en el diagrama, sino simplemente puntos de suma, con la particularidad que
muestran el retorno del ciclo. La traducción de estas se hace con una instrucción NEXT
en Visual Basic.
A continuación se muestra la codificación del algoritmo en diferentes códigos de
programación:

· Codificación en en Visual Basic:


Private Sub Command1_Click()
Dim Arr(1 To 10) As Integer, I As Integer
Dim Dato As Integer, Buscar As Integer

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

Buscar = InputBox(“Digite el dato a buscar”)


For I = 1 To 10 Step 1
If Buscar = Arr(I) Then
Print I
End If
Next I
End Sub
· Codificación en Lenguaje C:

#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;}
}

System.out.print("Digite el dato a buscar: ");


Buscar = Integer.parseInt(lee.readLine());
for(I=0;I<10; I++){
if(Buscar==Arr[I]){
System.out.println("" + I);
}
}
}
}
· Codificación 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

Buscar = input('Digite el dato a buscar: ')


I=0
while I < 10:
if Buscar == Arr[I]:
print I
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 'Digite el dato a buscar',PHP_EOL;


fscanf($stdin,"%d",$buscar);
for ($i=0;$i<=9;$i++) {
if ($buscar==$arr[$i+1]) {
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

echo $i,PHP_EOL;
}
}
?>

5.2.6. Modificar datos en un arreglo


La operación de modificar consiste en ubicar un elemento de un arreglo dado y cambiar su
contenido. Un ejemplo de modificación puede ser un algoritmo que llene un arreglo y des-
pués solicite la ubicación por medio del subíndice del elemento que se quiere modificar. El
proceso de modificación termina cuando se suministra un valor de cero para el subíndice.
A continuación, se presenta el algoritmo. En esta ocasión, se espera que la prueba de es-
critorio la adelante el lector.
368
369

Figura 122: Algoritmo que llena y permite modificar el contenido de un arreglo.

· Codificación del algoritmo en Visual Basic:


Private Sub Command1_Click()
Dim Arr(1 To 10) As Integer, I As Integer
Dim Dato As Integer

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);
}

· Codificación del algoritmo en Java:


import java.io.*;
public class Cap5_2_Modificar {
public static void main(String[ ] args)throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
int Arr[] = new int[10];
int Dato, 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;}
}
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

· Codificación del algoritmo en JavaScript:

<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);
?>

5.2.7. Insertar datos a un arreglo


La operación de insertar cosiste en acomodar un dato en medio de los que ya se encuen-
tran almacenados en el arreglo. El proceso consiste en ubicar la posición en que se quiere
insertar el nuevo dato y a continuación todos los datos que se encuentran por el lado de-
recho se desplazarán a la derecha. Si el arreglo se encuentra totalmente lleno el dato de la
extrema derecha se pierde con el propósito de dar espacio al nuevo dato. El algoritmo es:
372
373

Figura 123: Algoritmo que llena un arreglo y permite insertar datos al mismo.

· Codificación del algoritmo en Visual Basic:


Private Sub Command1_Click()
Dim Arr(1 To 10) As Integer, I As Integer
Dim Dato As Integer, K As Integer

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;

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 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

· Codificación del algoritmo en Java:


import java.io.*;
public class Cap5_3_Insertar {
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 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

· Codificación del algoritmo en JavaScript:

<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

Figura 124: : Algoritmo para eliminar dato de un arreglo.


· Codificación del algoritmo en Visual Basic:

Private Sub Command1_Click()


Dim Arr(1 To 10) As Integer, I As Integer
Dim Dato As Integer, K As Integer
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 Eliminar")
If I > 0 And I < 11 Then
For K = I To 9
Arr(K) = Arr(K + 1)
Next K
Arr(I) = 0
End If
Loop Until I = 0
End Sub

· Codificación del algoritmo en Lenguaje C:


Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

#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

· Codificación del algoritmo en Python:


379

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:
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>

· 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] = $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

If L >= "A" And L <= "Z" Then


I=1
k=0

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;

for(I=0; I<50; I++){


Arr[I]= ‘ ’;
}

for(I=0; I<10; I++){


printf(“Digite la Letra a guardar en el arreglo”);
scanf(“%c”,&L);

if((L >= ’A’) && (L <= ’Z’)){


Arr[I] = L;
}
else{
I = I + 1;
}
}

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;

for(I = 0; I < 50; I++){


Arr[I] = ' ';
}

for(I = 0; I < 10; I++){


System.out.print("Digite la letra a guardar en el arreglo: ");
L = lee.readLine().charAt(0);
if((L>='A') && (L<='Z')){
Arr[I] = L;
}
else{
I = I - 1;
}
}

do{
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

System.out.print("Digite la letra a guardar en el arreglo: ");


L = lee.readLine().charAt(0);
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{
System.out.print("arreglo lleno");
}
}
}

}while((L < 'a') || (L > 'z'));


}
}
· Codificación del algoritmo en Python:

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

while I < 50:


if Arr[I] == ' ':
K=I
I = 49
I=I+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

Figura 127: Algoritmo para ordenar un arreglo.


· Codificación del algoritmo en Visual Basic:

Private Sub Command1_Click()


Dim Arr(1 To 50) As String
Dim L As String * 1
Dim Aux As String * 1
Dim I As Integer
Dim A As Integer
Dim B As Integer

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;

for(I=0; I<50; I++){


printf(“Digite la Letra a guardar en el arreglo”);
scanf(“%c”,&L);
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

for(A=0; A<49; A++)


for(B=A+1; B<50; B++){
if(Arr[A] > Arr[B]){
Aux = Arr[A];
Arr[A] = Arr[B];
Arr[B] = Aux;
}
}
for(B=0; B<50; B++)
printf(“%1c”,Arr[B]);
}
· Codificación del algoritmo en Java:

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;

for(I = 0; I < 50; I++){


System.out.print("Digite la letra a guardar en el arreglo: ");
L = lee.readLine().charAt(0);
if((L>='A') && (L<='Z')){
Arr[I] = L;
}
else{ 390
I = I - 1; 391
}
}

for(A = 0; A < 49; A++){


for(B = A+1; B < 50; B++){
if(Arr[A] > Arr[B]){
Aux = Arr[A];
Arr[A] = Arr[B];
Arr[B] = Aux;
}
}
}

for(B=0; B<50; B++)


System.out.print(""+Arr[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

· Codificación del algoritmo en JavaScript:


<HTML>
<BODY>
<SCRIPT>
var arr = new Array(50); var l = new String();
var aux = new String(); var i = new Number();
var a = new Number(); var b = new Number();
for (i=0;i<50;i++) {
l = prompt("Digite la Letra a guardar en el arreglo");
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]>arr[b])) {
aux = arr[a];
arr[a] = arr[b];
arr[b] = aux;
}
}
}
for (b=0;b<50;b++) { document.write(arr[b]);}
</SCRIPT>
</BODY>
</HTML>
· Codificación del algoritmo en PHP:
<?php
$stdin = fopen('php://stdin','r');
$arr = array(); settype($L,'string');
settype($aux,'string'); settype($i,'integer');
settype($a,'integer'); settype($b,'integer');

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];
}
?>

5.3. DEFINICIÓN DE MATRICES


La definición de matrices se puede considerar como una definición extensiva de los arre-
glos. Una matriz o Tabla es un arreglo de arreglos, es decir, que una matriz son varios
arreglos unidos, definidos como una sola variable (Joyanes Aguilar, 1996). Considérese el
siguiente ejemplo: se tiene un arreglo diseñado para almacenar el total de ventas mensua-
les hechas por un vendedor durante un año y además hay cinco vendedores. Visualmente
el diseño para almacenar las ventas de un vendedor se puede apreciar de esta manera:
Ahora bien, se tendrá un arreglo para manejar la información de las ventas hechas por
cada uno de los vendedores de la compañía en los doce meses del año. Si la compañía
tiene cinco vendedores, cada uno utilizará un arreglo para almacenar sus datos, es decir, se
tendrán cinco arreglos, de doce elementos cada uno. Así:

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í:

La ejecución del siguiente algoritmo almacena en el elemento 5,12 de la variable Ven-


dedores el valor de 29222.5.
1 Inicio
2 I=2
3 Dato = 68960
4 Vendedores(2,7) = Dato + 10000
394
5 Vendedores(I + 1,1) = Vendedores(I,7) - I * 21050
395
6 I=I+2
7 Vendedores(I+1,I+8) = Vendedores(I-1,1)/I + I*5000
8 Fin

Para comprobar el resultado, se presenta el desarrollo de una prueba de escritorio.


Iniciando, el resultado de la instrucción 1 es dar inicio al algoritmo, la instrucción 2 asigna
a I el valor 2. En la memoria del computador estos datos quedan almacenados 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

La instrucción 6 incrementa el contador I en dos y esto da 4. En la memoria del com-


putador queda:

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

5.4.1. Creación de una Matríz


Para crear una matriz hay que definir claramente cuántas filas y cuántas columnas debe
tener y hacer un dimensionamiento de la siguiente forma:

Dim Vendedores(1 a 5, 1 a 12): Real

El ejemplo anterior presenta la manera como se define la variable Vendedores utiliza-


da en la explicación del numeral anterior. En este dimensionamiento el primer intervalo se
refiere a las filas que va a contener la matriz, el segundo se refiere a las columnas que va a
contener la matriz.

5.4.2. Asignación de valores dentro de una Matriz


La asignación de valores a la matriz se hace por medio del manejo de subíndices, los que se
refieren a cada una de las posiciones de la matriz, como se mostró en los numerales ante-
riores. Es importante prestar atención al hecho de que el primer subíndice se refiere a la fila
y el segundo a la columna dentro de la matriz. Si se quiere guardar el valor 45679 en la fila 4
con la columna 9 de la variable Vendedores se debe escribir:

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

Figura 128: Recorrido para llenar o cargar una matriz.

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.

5.4.4. Imprimir una Matriz


El proceso para imprimir el contenido de una matriz es básicamente el mismo que se
hace para llenarla. La impresión se hace utilizando la operación de recorrido descrita
en el numeral anterior y, a diferencia del proceso de llenado, se diseña un proceso de
impresión. El algoritmo para imprimir los datos contenidos en una matriz de caracteres
previamente cargada será:
398
399

Figura 129: Algoritmo para llenar e imprimir una matriz.

A continuación, se codifica el algoritmo en los diferentes lenguajes que se han tra-


tado a lo largo del libro.

· 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

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;

for(k=0; k<4; k++)


for(m=0; m<6; m++){
printf(“Digite carácter Matiz(%1d,%1d)”, k, m);
scanf(“%c”,&C);Matriz[k][m]=C;
}
for(k=0; k<4; k++)
for(m=0; m<6; m++)
printf(“%1c”,Matriz[k][m]);
}

· Codificación del algoritmo en Java:


Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

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;

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;
}
}
for(k = 0; k < 4; k++){
for(m = 0; m < 6; m++){
System.out.print(""+Matriz[k][m]);
}
}
}
}
· Codificación del algoritmo en Python:
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
print Matriz

· Codificación del algoritmo en JavaScript:


<HTML>
<BODY>
<SCRIPT>
var c = new String(); var k = new Number();
var m = new Number(); var matriz = new Array(4);
400
for (var k=0;k<4;k++) { matriz[k] = new Array(6); }
for (k=0;k<=3;k++) 401
for (m=0;m<=5;m++) {
c = prompt("Digite carácter Matiz("+k+","+m+")");
matriz[k][m] = c;
}
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(); settype($c,'string');


settype($k,'integer'); settype($m,'integer');
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++) {
echo 'Digite carácter Matiz(',$k,',',$m,')';
fscanf($stdin,"%s",$c);
$matriz[$k][$m] = $c;
}
for ($k=0;$k<4;$k++)
for ($m=0;$m<6;$m++)
echo $matriz[$k][$m];
?>
5.4.5. Buscar datos en una Matriz
La operación de buscar, como las dos operaciones anteriores, se basa en la operación
de recorrido. El algoritmo que se presenta a continuación llena una matriz de caracteres
y después se digita un carácter para determinar cuántas veces se encuentra el carácter
en la matriz.
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

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

C = InputBox("Digite carácter a buscar")

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;

for(k=0; k<4; k++)


for(m=0; m<6; m++){
printf(“Digite carácter Matriz(%1d,%1d)”, k, m);
scanf(“%c”,&C);Matriz[k][m]=C;
}
printf(“Digite carácter a buscar ”);scanf(“%c”,&C);
Veces = 0;
for(k=0; k<4; k++)
for(m=0; m<4; m++)
if(Matriz[k][m]==C)
Veces = Veces + 1;
printf(“%3d”,Veces);
}
· Codificación del algoritmo en Java:

import java.io.*;

public class Cap5_8_M_BuscarCar {

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, Veces;

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;

System.out.print("Digite carácter a buscar: ");

C = lee.readLine().charAt(0);
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

Veces = 0;

for(k = 0; k < 4; k++)

for(m = 0; m < 6; m++)

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

C = raw_input('Digite carácter a buscar: ')


k=0
while k < 4:
m=0
while m < 6:
if Matriz[k][m] == C:
Veces = Veces + 1
m=m+1
k=k+1

print Veces 404

· Codificación del algoritmo en JavaScript: 405

<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+")");

c = prompt("Digite carácter a buscar ");


veces = 0;
for (k=0;k<=3;k++)
for (m=0;m<=5;m++)
if (matriz[k][m]==c)
veces = veces+1;
document.write(veces,'<BR/>');
</SCRIPT>
</BODY>
</HTML>
· Codificación del algoritmo en PHP:

<?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

Figura 131: : Algoritmo que modifica e imprime una Matriz.


· Codificación del algoritmo en Visual Basic:

Private Sub Command1_Click()


Dim Matriz(1 To 4, 1 To 6) As String, L As String * 1
Dim k As Integer, m As Integer

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){

if((k > -1) && (k < 4)){


Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

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);

for(k = 0; k < 4; k++){


for(m = 0; m < 6; m++){
System.out.print(Matriz[k][m]+"\t");
}
System.out.println("");
}
}
}
· Codificación del algoritmo en Python:

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>

· Codificación del algoritmo en PHP:


<?php
$stdin = fopen('php://stdin','r');
$matriz = array();
settype($L,'string');
settype($K,'integer');
settype($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);
}

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

datos en una matriz.


Figura 133: Segunda parte del algoritmo para insertar
· Codificación del algoritmo en Visual Basic:
Private Sub Command1_Click()
Dim Matriz(1 To 4, 1 To 6) As String, Arr(1 To 24) As String
Dim C As String * 1, t As Integer, s As Integer, k As Integer, m As Integer

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;

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++){
printf(“Digite Matriz(%1d,%1d)”, k, m);
scanf(“%c”, &C);
Matriz[k][m]=C;
}

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++];

for(k = 0; k < 4; k++)


for(m = 0; m < 6; m++)
printf(“%1c”,Matriz[k][m]);
· Codificación del algoritmo en Java:
i mport java.io.*;
public class Cap5_A_M_Insertar {
public static void main(String[ ] args)throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamRea-
der(System.in));
char Matriz[ ][ ] = new char[4][6], C;
char Arr[ ] = new char[24];
int k, m, t, s;

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++){
System.out.print("Digite carácter Matriz("+k+", "+m+"): ");
C = lee.readLine().charAt(0);
Matriz[k][m] = C;
}
}

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++];

for(k = 0; k < 4; k++){


for(m = 0; m < 6; m++)
System.out.print(Matriz[k][m]+"\t");
System.out.println("");
}
}
}
· Codificación del algoritmo en Python:
Matriz = []
Arr = []

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

Figura 134: Primera parte del algoritmo para eliminar


datos en una matriz.
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

datos en una matriz.


Figura 135: Segunda parte del algoritmo para eliminar
· Codificación del algoritmo en Visual Basic:
Private Sub Command1_Click()
Dim Matriz(1 To 4, 1 To 6) As String, Arr(1 To 24) As String
Dim C As String * 1, t As Integer, s As Integer
Dim k As Integer, m As Integer

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;

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++){
printf(“Digite Matriz(%1d,%1d)”, k, m);scanf(“%c”, &C);
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];

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++];

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_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;

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++){
System.out.print("Digite carácter Matriz("+k+", "+m+"): ");
C = lee.readLine().charAt(0);
Matriz[k][m] = C;
}
}

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++];

for(k = 0; k < 4; k++){


for(m = 0; m < 6; m++)
System.out.print(Matriz[k][m]+"\t");
System.out.println("");
}
}
}
· Codificación del algoritmo en Python:
Matriz = []
Arr = []

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

Figura 136: : Primera parte del algoritmo para agregar


datos a una matriz.
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

datos a una matriz.


Figura 136: : Segunda parte del algoritmo para agregar
· Codificación del algoritmo en Visual Basic:
Private Sub Command1_Click()
Dim Matriz(1 To 4, 1 To 6) As String, A As Byte
Dim C As String * 1, Fil As Integer, Col As Integer
Dim k As Integer, m As Integer, Agregar As Byte
For k = 1 To 4
For m = 1 To 6
Matriz(k, m) = " "
Next m
Next k

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;

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++){
printf(“Digite Matriz(%1d,%1d)”, k, m);scanf(“%c”, &C);
Matriz[k][m]=C;
}

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);

for(k = 1; k < 4; k++)


for(m = 1; m < 6; m++)
printf(“%1c”,Matriz[k][m]);
}
Codificación del algoritmo en Java:
import java.io.*;
public class Cap5_C_M_Agregar {
public static void main(String[ ] args)throws IOException {
BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
char Matriz[][] = new char[4][6], C;
int A, Fil=0, Col=0, k, m, Agregar;

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++){
System.out.print("Digite carácter Matriz("+k+", "+m+"): ");
C = lee.readLine().charAt(0);
Matriz[k][m] = C;
}
}

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);

for(k = 0; k < 4; k++){


for(m = 0; m < 6; m++)
System.out.print(Matriz[k][m]+"\t");
System.out.println("");
}
}
}
· Codificación del algoritmo en Python:
Matriz = []
Fil = 0
Col = 0

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

C = raw_input('Digite carácter para Matriz('+str(k)+','+str(m)+'): ')


Matriz[k][m] = C
m=m+1
k=k+1

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

Figura 138: : : Algoritmo para ordenar los datos en una matriz


· Codificación del algoritmo en Visual Basic:

Private Sub Command1_Click()


Dim Matriz(1 To 4, 1 To 6) As String, Arr(1 To 24) As String
Dim C As String * 1, k As Integer, m As Integer, t As Integer

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;

for(k = 0; k < 4; k++){


for(m = 0; m < 6; m++){
printf(“Digite Matriz(%1d,%1d)”, k, m);scanf(“%c”, &C);
Matriz[k][m]=C;
}
}

t = 0;
for(k = 0; k < 4; k++){
for(m = 0; m < 6; m++){
Arr[t] = Matriz[k][m];
t++;
}
}

for(k = 0; k < 23; k++){


for(m = k + 1; m < 24; m++){ 438
if(Arr[k] > Arr[m]){
C = Arr[k]; 439
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++;
}
}

for(k = 0; k < 4; k++){


for(m = 0; m < 6; m++){
printf(“%1c”, Matiz[k][m]);
}
}
}
· Codificación del algoritmo en Java:
import java.io.*;
public class Cap5_D_M_Ordenar {
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 t, 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;
}
}

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

}
}

for(k = 0; k < 23; k++){


for(m = k + 1; 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++)
System.out.print(Matriz[k][m]+"\t");
System.out.println("");
}
}
}
· Codificación del algoritmo en Python:
Matriz = []
Arr = []
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 < 4:
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:
m=0
while m < 6:
Arr.append(Matriz[k][m])
m=m+1
k=k+1 440
k=0 441
while k < 23:
m=k+1
while m < 24:
if (Arr[k] > Arr[m]):
C = Arr[k]
Arr[k] = Arr[m]
Arr[m] = C
m=m+1
k = k +1
k=0
t=0
while k < 4:
m=0
while m < 6:
Matriz[k][m] = Arr[t]
t=t+1
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 c = new String();
var t = new Number();
var k = new Number();
var m = new Number();

var matriz = new Array(4);


for (k=0;k<4;k++) { matriz[k] = new Array(6); }

var arr = new Array(24);

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

si dato є (-∞, -100] ⇨ almacenar en Arreglo1

si dato є (-100, 0] ⇨ almacenar en Arreglo2

si dato є ( 0, -100] ⇨ almacenar en Arreglo3

si dato є (-100, ∞) ⇨ almacenar en Arreglo2

El número máximo de elementos de los arreglos es 50 elementos. Imprimir los arreglos.


7. Guardar valores en un arreglo X de N elementos. Calcular la desviación estándar
D según:

∑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 gatos de la casa


os gatos de la casaL
s gatos de la casaLo
gatos de la casaLos
gatos de la casaLos
atos de la casaLos g
tos de la casaLos ga
os de la casaLos gat
s de la casaLos gato
de la casaLos gatos
de la casaLos gatos
e la casaLos gatos d
la casaLos gatos de
la casaLos gatos de
a casaLos gatos de l
casaLos gatos de la
casaLos gatos de la
asaLos gatos de la c
saLos gatos de la ca
aLos gatos de la cas
Los gatos de la casa
Los gatos de la casa
18. Se tienen los datos de las estaturas de los jugadores de baloncesto de un campeo-
nato. Diseñar un algoritmo que lea los datos de las estaturas y los almacene en un
arreglo y determine a partir de estos la estatura promedio. Además, cuántos de los
jugadores están por encima de la estatura promedio, cuántos por debajo y cuántos
tienen la estatura promedio.
19. Almacenar valores enteros positivos en un arreglo. Diseñar un algoritmo que tome
el arreglo y divida cada uno de los datos por el valor de mayor frecuencia en el
arreglo. En caso que haya más de dos valores con la mayor frecuencia, se dividirá
por el menor de estos valores.
20. Tomar valores enteros y almacenarlos en un arreglo. Tomar todos los ceros que se
encuentren en el arreglo y colocarlos después de los valores diferentes de cero. Se
debe manejar un único arreglo.
21. Suministrar valores enteros y almacenarlos en un arreglo. Colocar los valores pares
al comienzo del arreglo y luego los valores impares. Los ceros que se encuentren
se deben colocar al final de arreglo.
22. Construir un algoritmo que tome dos números enteros de mínimo 500 cifras y
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

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

B: Longitud de la separaciones regulares o intervalo


de las medidas.
H0, H1, H2, ..., HN: Son las N medidas tomadas para las normales.
26. Escribir un algoritmo que lea un valor y llene una matriz con dicho valor e imprima
la matriz. La matriz debe ser de 10 filas y 10 columnas.
27. Elaborar un algoritmo que llene una matriz e imprima la suma y el promedio de
todos los valores almacenados en sus elementos.
28. Escribir un algoritmo que llene una matriz de MxN e imprima el menor y el mayor valor
de cada fila y en qué fila y en qué columna se encuentra el mayor y el menor de cada fila.
29. Construir un algoritmo que llene una matriz de M filas por N columnas con valores
y a partir de esta llenar otra matriz que sea la transpuesta de la primera. El algorit-
mo debe imprimir las dos matrices.
30. Escribir un algoritmo que llene dos matrices y calcule y llene en una tercera matriz
la suma de las dos anteriores.
31. Elaborar un algoritmo que llene dos matrices y calcule en una tercera la multiplica-
ción de las dos anteriores. El algoritmo debe imprimir las tres matrices.
32. Diseñar un algoritmo que llene una tabla de M filas por N columnas. El algoritmo
debe determinar la cantidad de números negativos, la cantidad de números posi-
tivos y cantidad de ceros que contiene la matriz.
33. Diseñar un algoritmo que llene e imprima una tabla de 30 renglones y 5 columnas.
446
La tabla se llena de acuerdo con las siguientes condiciones:
447
· Los nombres de las columnas son A, B, C, D y E.
· Los valores en el primer renglón son 0, 1, 2, 3 y 4.
· El valor de la columna A es uno más que el del renglón anterior.
· El valor de la columna B es el valor de la columna A del mismo renglón más
dos unidades.
· El valor de la columna C es la suma de los valores de las columnas prece-
dentes del renglón anterior.
· El valor de la columna D es la suma entre: el valor absoluto de la diferencia
de las columnas B y C del mismo renglón y el valor absoluto de la diferencia
de las columnas D y E del renglón anterior.
· El valor de la columna E es el valor absoluto de la diferencia entre el valor
acumulado de toda la columna E y el valor acumulado de toda la columna A.
34. Hacer un algoritmo con el que se pueda llenar una matriz de Nx2 elementos. Los
datos en la matriz corresponden con los valores de las coordenadas cartesianas de
los puntos de los vértices de un terreno poligonal. A partir de ellos se debe calcular
el área del terreno. Usar el método del cálculo del área por coordenadas el cual con-
siste en hacer un ajuste a las coordenadas y luego hacer un cálculo, así:

Determinar la coordena- Determinar la coordena-


da en X que sea el menor da en Y que sea el menor Puntos
Puntos
valor de todas las coor- valor de todas las coor- ajustados
denadas negativas de X. denadas negativas de Y.

(X1, Y1) (X1 + Xi, Y1 + Yi)


(X1, Y1) (X2 + Xi, Y2 + Yi)
(X1, Y1) (X3 + Xi, Y3 + Yi)
. .
Xi Yi
. .
. .
(XN, YN) (XN + Xi, YN + Yi)
(X1, Y1) (X1 + Xi, Y1 + Yi)
Fundamentos de lógica para programación de computadores · Cap. 5 · Arreglos y matrices

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:

· El total de ventas de cada producto.


· El total de ventas por cada mes del año.
· El producto más vendido y el menos vendido.
· El mes de mayores ventas y el de menores ventas.
· El promedio de ventas por productos.
· El promedio de ventas por mes.
· El total de ventas en el año. 448
40. Hacer un algoritmo con el que se pueda hallar el área superficial total y el volumen 449
de un paralelepípedo si se conoce el punto del vértice y las coordenadas cartesia-
nas 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

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:

Código Día del Hora de Hora de


Trabajador Mes Entrada Salida
1710201 1 08:00 12:05
1710205 1 07:55 12:30
1801011 2 14:10 22:30
1710201 3 14:01 18:02
1710205 3 14:10 20:01
1705051 4 10:30 22:21
. . . .

. . . .
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.

Figura 139: Algoritmo modular genérico.

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

Matriz que contiene el triángulo de Pascal para 8 filas.

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)!

Por N! (factorial de N) se entiende el producto N × (N - 1) × (N- 2) × ... × 2 × 1 para N ≥ 1. Por


ejemplo, el coeficiente de x2y2 en el desarrollo de (x + y)4 es

4 4! 4! 4* 3* 2* 1
( )= = = = 6
2 2! (4-2)! 2! * 2! (2* 1) * (2* 1)

La expresión también proporciona el número de combinaciones diferentes de J objetos


tomados de un conjunto de N objetos, por lo que también se denomina número combina-
torio. Como ejemplo de la aplicación de esta fórmula para obtener los valores de una de las
filas del triángulo de Pascal, tomemos la línea 5, del triángulo, es decir, calcular los números:

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)!

El desarrollo de los cálculos sería:

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

1! (4-1)! (1) * (3* 2* 1)

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.

Tabla 49: Etapa de especificación. Ejemplo 5 / Capítulo 4.

Entradas Fil: Número de filas del triángulo de tipo Entero

Cada uno de los valores almacenados en la matriz de


Salidas
acuerdo a la forma del triángulo de Pascal.

F = Fact (N) / (Fact (J) * Fact (N - J)).


Por N! (factorial de N) se entiende el producto N × (N -
Proceso 1) × (N - 2) × ... × 2 × 1 para N ≥ 1, que es el cálculo para
cada uno de los Coeficientes Binomiales de cada fila
del triángulo, para J = 0, 1, 2, ..., N.

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

Figura 140: Algoritmo para generar el triángulo de Pascal en una Matriz.

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

Figura 141: Algoritmo para generar el triángulo de Pascal en una Matriz

(Procesos de entrada demarcado)


Como se puede advertir en la figura 141, el recuadro de líneas punteadas muestra cla-
ramente todas las instrucciones que corresponden a la captura de información necesaria
para que posteriormente se pueda generar e imprimir el triángulo de Pascal. La figura 142
muestra el mismo algoritmo, pero con los procesos de entrada y de salida demarcado por
líneas punteadas.
460
461
Figura 142: Algoritmo para generar el triángulo de Pascal

(Procesos de entrada y salida demarcados)


Las instrucciones que no están demarcadas por líneas punteadas pertenecen al pro-
cesamiento de la información para generar el triángulo de Pascal, es decir, corresponden a
una función básica del proceso del algoritmo.
Con esta visión establecida para el algoritmo, se puede concluir que este se puede
expresar de manera modular como un algoritmo con tres grandes etapas que manipula-
rán los datos de una variable tipo arreglo bidimensional denominada Matriz. La figura 143
muestra el algoritmo modular.

Figura 143: Algoritmo del triángulo de Pascal en sus módulos principales.


Como se explicó, el algoritmo define claramente tres actividades: el número de filas que se
van a generar del triángulo de Pascal, el proceso de generar una matriz con esta información
y un proceso que permite reportar estos resultados; todo basado en una variable que se ha
definido como Matriz (20,40) de tipo real.
Debido a que cada uno de estos subprocesos no presenta los detalles de cómo opera, solo
representa la idea lógica general de cómo está constituido el algoritmo. Lo que quiere decir, que
cada proceso es el enunciado que invoca la ejecución de un conjunto de instrucciones que no
se encuentran definidas ahí, que están en otro sitio, y que además hacen parte indispensable
en la ejecución del mismo. Es decir, que hay un módulo en otra parte que está rotulado con el
nombre del proceso que se invoca y que debe entrar en operación cuando es llamado.
Si se hace una prueba de escritorio al algoritmo de la figura 143, se arranca con la instruc-
ción de inicio y luego se pasa a la segunda instrucción, que es la definición de la matriz que
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:

Figura 144: Procedimiento o módulos para Entrada y Salida de


información del algoritmo del Triángulo de Pascal.
Hasta el momento solo se ha descrito la forma como se transforma el algoritmo del
triángulo de Pascal en lo referente a las funciones de entrada y salida de información. Es
necesario hacer un análisis más juicioso de la función básica de proceso del algoritmo.
Si se verifica con bastante cuidado el proceso, salta a la vista el hecho que hay ins-
trucciones que se repiten, pero con mínimas variaciones. Se muestra a continuación el
algoritmo de la figura 139, pero ahora con la función de proceso demarcada con líneas
punteadas que enmarcan claramente los tres ciclos que son prácticamente idénticos, pues
están diseñados para hacer la misma labor, pero sobre diferentes datos.

462
463

Figura 145: Algoritmo para Generar el Triángulo


de Pascal con la función de Proceso demarcado

La semejanza de los ciclos permite deducir que es factible escribir un procedimiento


para que ejecute esta tarea pero que es necesario decirle cuáles son los datos sobres los
que tiene que actuar. Este hecho es lo que se denomina paso de parámetros o paso de ar-
gumentos a los procedimientos, lo cual no se da en los procedimientos de entrada y salida
puesto que están diseñados para ejecutarse sobre los datos contenidos en la variable matriz.
Si un procedimiento está diseñado para que ejecute solo una tarea, se denomina mó-
dulo procedimiento, y dependiendo del problema que se esté tratando, puede manejar
parámetros o no y en consecuencia actuar sobre dichos datos. Hay ocasiones en que es
necesario que el procedimiento no solo ejecute la tarea, sino que en virtud de la realiza-
ción de la misma, informe o dé algún resultado. En este caso, recibe otra denominación,
módulo función, las funciones devuelven valores y es necesario identificar a qué tipo de
datos corresponden. Una función solo puede devolver un valor como respuesta, pero puede
recibir varios parámetros o argumentos. Los procedimientos también pueden recibir varios
parámetros, solo que estos no devuelven respuesta.
Aplicados estos conceptos en el rediseño de la función básica de proceso del algoritmo
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

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

Figura 146: Módulo función para calcular el


factorial del número N pasado como parámetro.
que calcula y retorna el factorial del número pasado como parámetro.
Ahora, rediseñando la función básica de proceso del algoritmo que muestra en la figura
146, en el que se incluye las instrucciones para el módulo función para calcular el factorial

464
465

Figura 147: Módulo que implementa la Función


Básica de Proceso del algoritmo del Triángulo de Pascal.
del número pasado como parámetro:

En la figura 148 se presenta el algoritmo de la figura 141 completamente rediseñado,


Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

Figura 148: El Algoritmo del Triángulo de Pascal rediseñado modularmente.

haciendo usos de las técnicas de modularización.


La figura 148 ilustra claramente la forma como se definen y usan los módulos tipo Pro-
cedimiento y tipo función. Los primeros son el Definir_N_Filas, Generar_Triangulo y Mostrar_
Triangulo. El segundo es Factorial(N).
A continuación se presenta el programa codificado Visual Basic.
Dim M atr i z(0 To 2 0, 0 To 4 0) A s D o ub le, F As Doub le, A As Doub le
Dim Fi l A s D o u ble, Co l A s D o u ble, I As Doub le, J As Doub le

Dim FN A s D o u ble, FJ A s D o u ble, FN J As Doub le, C As Doub le


Pri va te S u b Co m m a n d1_Cl i c k( )
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
En d S u b

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:

1 . Di m Ma t riz(0 To 20, 0 To 40) A s D o u b le, F A s D o u b le, A A s D o u b le


2. Di m Fil As Doub le, Co l As Dou b le, I A s D o u b le, J A s D o u b le

3. Di m FN As Doub le, FJ As Doub le, F N J A s D o u b le, C A s D o u b le


4 . Pr i va te Sub Com m a n d1 _Cl ic k( )
5. D efin ir_ N_ Filas
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

6. G en era r_Tria n gulo


7 . Most ra r_Tria n gulo
8 . En d Sub
9. Pr i va te Sub D efin ir_ N_ Filas()
1 0 . For I = 0 To 2 0
11. For J = 0 To 40
1 2. Ma t r iz(I, J) = 0
1 3 . Nex t J
1 4 . Nex t I
1 5 . Fil = 2
1 6. Do
1 7 . Fil = In p utB ox(“ Di gi te e l n ú me ro d e Fi las”, “E N TR A DA”,
Fil)
1 8 . Loop Un ti l Fil > 0 An d Fi l < 21
1 9. En d Sub
2 0 . Pr i va te Sub G en era r_Tria n gulo ( )
21 . For I = 0 To Fil
2 2. Col = Fil - I
23. FN = Fa ctorial(I)
24. C = 0
2 5 . For J = Col To Fi l + I S tep 2
2 6 . FJ = Facto ri al ( C )
27 . FNJ = Facto ri al ( I - C )
2 8 . Ma t r iz( I , J ) = F N / ( FJ * F N J )
29. C = C + 1
3 0. Nex t J
31. Next I
32 . En d Sub
3 3. Pr i vate Sub Most ra r_Tria n gulo ( )
34. For I = 0 To Fil - 1
3 5. For J = 0 To Fil * 2 – 1
3 6 . If Ma tri z ( I , J ) < > 0 Th e n Prin t M at ri z ( I , J ) )
37 . Nex t J
3 8. Nex t I
39. En d Sub
4 0 . Pr i vate Fun cti on Fa c tor ial(N A s D o u b le) A s D o u b le
41. F = 1
42. For A = 1 To N
43 . F = F * A
4 4 . Nex t A
45 . Fa ctorial = F
4 6. En d Fun cti on
Antes de empezar la prueba hay que aclarar que la definición de las variables no se hizo
después de la instrucción de inicio del programa (después de la instrucción número 4) como
normalmente se ha venido haciendo, sino como se definieron antes. Esto con el propósito de
que las variables sean válidas para que todos los módulos que constituyen el algoritmo del
programa las usen adecuadamente y sean reconocibles para ellos. Desde esta perspectiva, lo
primero que hace el programa es definir las variables a usar, es decir, ejecuta las instrucciones
1, 2 y 3; luego pasa a ejecutar la instrucción 4, que es el inicio del programa, y de allí pasa a
ejecutar la instrucción 5, que es la llamada al módulo procedimiento Definir_N_Filas.
La instrucción 5 transfiere el control de flujo del programa a la instrucción número 9,
y de allí se pasa a las instrucciones desde la 10 y hasta la 19 para cumplir con todas las
tareas programadas para realizar la función básica de entrada del programa. Una vez ejecu-
tada la instrucción 19, se transfiere el control de flujo del programa al programa principal,
es decir, de 19 salta a ejecutar la instrucción 6.
La instrucción 6 convoca al módulo procedimiento Generar_Triangulo, es decir, salta
a la instrucción 20 que es la primera del procedimiento Generar_Triangulo. De ahí pasa a
ejecutar las instrucciones 21, 22 y 23. Al alcanzar la instrucción 23, hace el llamado a un mó-
dulo función denominado Factorial, el cual tiene un parámetro o argumento definido por
la variable I. La instrucción 23 transfiere el control de flujo del programa a la instrucción 40 468
que es la primera de la Función Factorial, la que recibe el parámetro I y copia el contenido 469
en la variable N y trabaja a partir de esta, que, como ya se anotó, tiene el mismo valor de
la variable I usada como parámetro del módulo Generar_Triangulo.
De la instrucción 40 en adelante y hasta la 46 se ejecuta el cálculo del factorial del
número referenciado por la variable N. La instrucción 45 se encarga de devolver el valor
que está almacenado en la variable F, es decir, copia el valor de F de la función Factorial a
la variable FN del procedimiento Generar_Triangulo en la instrucción 23. Hay que notar que
la instrucción 45 hace una asignación usando el mismo nombre de la función (Factorial)
como una variable normal con el propósito de escribir claramente en Visual Basic qué valor
tiene que devolver o retornar al punto de donde fue invocada la función, es decir, para este
caso, la instrucción número 23. El resultado de la instrucción 23 es almacenar en la variable
FN el Factorial del número indicado por la variable I.
De la instrucción 23 pasa a ejecutar la 24, 25 y 26. Esta última es un nuevo llamado a la
función Factorial y esta vez va a calcular el factorial del valor almacenado en la variable C.
La instrucción 26 transfiere nuevamente el control de flujo del programa a la instrucción
40 y se ejecutan las instrucciones desde la 40 hasta la 46. La última transfiere de nuevo
el control de flujo del programa a la instrucción 26, la que ha asignado a la variable FJ el
factorial del valor almacenado en C.
Ejecutada la instrucción 26 pasa a la 27 que corresponde nuevamente al cálculo de un
factorial, el que da como resultado de la diferencia entre el dato que se encuentra alma-
cenado en la variable I y el dato almacenado en la variable C. Para obtenerlo, el control de
flujo del programa es transferido nuevamente de la instrucción 27 a la 40 y se ejecutan, en
consecuencia, las instrucciones desde la 40 hasta la 46, con la que se calcula el factorial
de la diferencia entre I y C. Una vez ejecutada la última instrucción del módulo factorial
(instrucción 46), retorna nuevamente el control de flujo del programa a la instrucción 27
almacenando en la variable FNJ dicho factorial.
De la instrucción 27 pasa a la 28, 29, 30 y de allí vuelve a la 25 para continuar el ciclo.
Terminado el ciclo comprendido entre las instrucciones 25 y 30 se pasa a la instrucción 31
que es el fin del ciclo que comienza en la instrucción 21. Al terminar este ciclo se concluye
con la generación del triángulo de Pascal y por ende alcanza la instrucción 32, que trans-
fiere el control de flujo del programa a la instrucción 7 que es el llamado al procedimiento
Mostrar_Triangulo, es decir, que esta instrucción transfiere el control del programa a la ins-
trucción 33. De allí hasta la 39 ejecutan las tareas definidas para mostrar el contenido de la
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

variable Matriz que es la información del triángulo generado. La instrucción 39 transfiere el


control de flujo del programa a la instrucción 8 que es la instrucción que termina el progra-
ma, es decir, es la instrucción Fin del Algoritmo. Con esto se termina la ejecución algoritmo.
Con esta prueba se muestra la forma correcta como se puede construir algoritmos mo-
dulares y cómo se ejecutan estos cuando se encuentran divididos en partes perfectamente
acopladas como un todo.
A continuación se muestra el algoritmo en diferentes lenguajes de programación:
· Codificación del algoritmo Lenguaje C:
#i n c lu de <stdi o. h >
#i n c lu de <co n i o. h >

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+ + ;
}
}
}

vo i d Mo stra r_Tr i a n gulo ( ) {


fo r( I= 0; I<= Fi l ; I+ + ) {
fo r( J= 0; J<= Fi l* 2 ; J+ + ) {
i f( Ma tr i z [I][J]! = 0) pr i n tf(“ % 3 .0 f ”, M a t r iz [ I ] [ J ] );
e lse p r i n tf ( “ “) ;
}
pr i n t f( “\ n”) ;
}
}

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 ;

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 efi n i r_N _Fi las ( ) ;
G en era r_Tr i a n gulo ( ) ;
M os tra r_Tr i a n gulo ( ) ;
}

p u b l ic s tatic vo id D e f i n i r_ N _ Fi las ( ) t h ro w s I O E xce p t i o n {


B u f fe re d Read e r le e = n e w Bu ffe re d Rea d e r(n e w I n p u t S t rea m Rea d e r( Syste m.i n ) ) ;
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

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 vo id 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 cto r i al ( I ) ;
C = 0;
fo r( J = Co l ; J <= Fi l+ I ; J + = 2 ) {
FJ = Fa cto 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+ + ;
}
}
}

p r ivate s tatic vo id M o s t ra r_Tri a n gu lo ( ) {


fo r( I= 0 ; I<= Fi l ; I+ +) {
fo r( J = 0 ; J <= Fi l* 2 ; J + + ) {
if( M a tr i z [ I ] [ J ] ! = 0 ) Syste m .o u t . p r i n t( S t r i n g .fo r m a t( “ %6 .0 f ”, M a t ri z [ I ] [ J ] ) ) ;
e l s e Sys te m .o u t . p r i n t( “ “);
}
Sys te m.o u t .p r i n tl n( “ ” ) ;
}
}

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 : ‘ )

de f Ge n e ra r_Tr i a ngu lo():


g lo bal Fi l
I = 0
w hi le I <= Fi l :
Co l = Fi l - I
F N = Fa c tor ial(I ) 472
C = 0
J = Co l 473
w h i le J <= (Fil + I ):
FJ = Fac tor ial(C )
F NJ = Fa c tor ial(I - C )
Ma tr i z [ I ] [ J ] = F N /(FJ *FN J )
C = C + 1
J = J + 2
I = I + 1

de f Mo stra r_Tr i a n gu lo():


g lo bal Fi l
I = 0
w hi le I <= Fi l :
J = 0
w h i le J <= (Fil + I *2 ):
i f Ma tr i z [I] [ J ] ! = 0 :
pr i nt M a t r iz [ I ] [ J ] ,
e lse:
print ‘ ‘,
J = J + 1
print
I = I + 1
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()


· Codificación del algoritmo en JavaScript:
<H TM L>
<B O DY >
<S C R IPT >
var F = n e w N u m b e r( ) ;
var A = n e w N u m b e r( ) ;
var F N = n e w N u m b e r( ) ;
var FJ = n e w N u m b e r( ) ;
var F N J = n e w N u m b e r( ) ;
var C = n e w N u m b e r( ) ;
var Fi l = n e w N u m b e r( ) ;
var Co l = n e w N u m b e r( ) ;
var I = n e w N u m b e r( ) ;
var J = n e w N u m b e r( ) ;
var M a tr i z = n e w A r ray ( 2 0 ) ;
fo r ( I= 0 ; I<20;I + + ) {M a t ri z [ I ] = n e w A r ray (4 0 ) ;}
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

D efi n i r_N _Fi las ( ) ;


G en era r_Tr ia n gu lo ( ) ;
M o s tra r_Tr i a n gu lo ( ) ;

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 ;
}

f u n c tio n mos tra r_t ri a n gu lo ( ) {


g lo bal $i , $j , $f i l , $ m a t ri z ;
fo r( $i = 0 ; $i <=$f i l ;$ i + + ) {
fo r( $j = 0 ; $ j < = $f i l* 2 ;$ j + + ) { 474
if( $m a t ri z [ $ i ] [ $ j ] ! = 0 ) e c h o ‘ ’,$ m a t ri z [ $ i ] [ $ j ] ; 475
else echo ‘ ‘;
}
e c h o P HP_ EO L ;
}
}

f u n c tio n gen era r_t ri a n gu lo ( ) {


g lo bal $i , $j , $ m a t ri z , $f i l , $ co l , $f n , $f j , $f n j , $ c ;
fo r( $i = 0 ; $i <= $f i l ; $ i + + ) {
$col = $f i l - $ i ;
$fn = fa cto ri al ( $ i ) ;
$c = 0 ;
fo r( $j = $co l ; $ j < = $f i l+$ i ;$ j + = 2 ) {
$fj = fa c to ri al ( $ c ) ;
$fn j = fa c to ri al ( $ i -$ c ) ;
$ma tr i z [ $ i ] [ $ j ] = $f n / ( $f j * $f n j ) ;
$c+ + ; }
}
}

f u n c tio n defi n i r_ n _f i las ( ) {


g lo bal $i , $j , $ m a t ri z , $f i l , $ s td i n ;
fo r( $i = 0 ; $i <2 0 ;$ i + + )
fo r( $j = 0 ; $ j < 4 0 ;$ j + + )
$ma tri z [ $ i ] [ $ j ] = 0 ;
d o{
e c h o ‘ D i g i te e l n ú m e ro d e Fi las : ‘ ;
$fi l = r tri m(fge t s( $ s td i n ) ,PH P_ EO L ) ;
}w h ile( ! ( $fi l >1 & & $f i l < 2 0 ) ) ;
}
defi n i r_n _fi las ( ) ;
gen era r_tr i a n gu lo ( ) ;
mo s tra r_tr i a n gu lo ( ) ;
?>
6.2. El ámbito de las variables
La modularización permite definir las variables en diferentes sitios del algoritmo. Esto po-
sibilita que tengan un ámbito, alcance o circunscripción de uso y reconocimiento particular
dependiendo de cómo se quiera manejar la información. Los posibles sitios en donde se
pueden definir las variables son dentro de los módulos (procedimiento o función) y fuera
de ellos, siempre con la precaución de hacerlo antes de usarlas; con el propósito que el
computador tenga esa definición establecida previamente. Las variables que se definen
dentro de los módulos se denominan variables locales y las que se hacen por fuera y
antes de su uso variables globales. En consecuencia, se define el ámbito de las variables
como de ámbito local o global.
Desde el punto de vista de la forma como el computador administra el uso de las
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

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

Módulo Command1_Click (Módulo Principal)

Matriz
0 1 2 3 4 5 6 7 8 ...
0
1
2
.
.
.
Fill

Figura 149: Variables definidas por el módulo principal del programa.

Terminada la ejecución de 2, ejecutamos la instrucción 3, que hace el llamado del mó-


dulo que define el tamaño del triángulo que se quiere generar. Este módulo es el conjunto
de instrucciones que van desde la 7 hasta la 18. La instrucción 3 transfiere el control de
flujo del programa a la instrucción 7 y luego a 8 que define dos variables locales que se
usan para la ejecución de los ciclos que llenan de ceros la matriz.
Mediante la ejecución de la instrucción 7 el módulo también define dos variables como
parámetros: M() y F, las cuales no se definen como locales dentro del módulo, sino que se
hace una definición por referencia, lo que permite que se modifiquen los valores que ellas
contienen y que estas modificaciones sean reconocidas por los dos módulos involucrados
en el manejo de estos datos; en el ejemplo, los módulos involucrados son el módulo princi-
pal del programa (Command1_Click) y el módulo que es llamado para definir el número de
filas del triángulo (Definir_N_Filas).
De otro lado, se debe entender que al definir variables por referencia se usa el espacio
de memoria definido por el módulo que manda las variables al módulo invocado. Es decir
que para el caso del ejemplo, el módulo principal Command1_Click define las variables
Matriz y Fil y se las manda al módulo Definir_N_Filas y este último hace uso de estas varia-
bles mediante una referencia, es decir, establece una relación entre Matriz y M. Aquí M es la
referencia a la Variable Matriz y la variable F hace una referencia a Fil. Las Instrucciones del
módulo Definir_N_Filas que afectan el contenido de las Variables M y F también afectan el
contenido de las variables Matriz y Fil, así no estén definidas dentro de él.
Hay que tener en cuenta que los módulos que usan una lista de variables como pa-
rámetros, siempre establecen una relación uno a uno entre la lista de variables de la ins-
trucción que invoca el módulo y la instrucción que lo define. En el ejemplo, la instrucción
número 3 hace el llamado al módulo Definir_N_Filas y manda dos variables: un llamado
que es recibido por la instrucción número 7 que corresponde con el nombre del método, y,
a continuación, la lista de variables según el llamado hecho en la instrucción 3; que para el
caso son dos variables en la lista de variables. La relación se estable diciendo que Matriz
corresponde con M y que Fil corresponde F; la correspondencia no es solamente de posi-
ción en la lista, sino que debe ser también en tipos, por lo cual Matriz debe ser del mismo
tipo que M, y Fil del mismo de F. 478
Otra aspecto que hay que considerar es que estas definiciones se han hecho por refe- 479
rencia, es decir, se antepuso a la definición de cada parámetro la palabra clave ByRef. Esta
definición es llamada definición por valor, en complemento a la definición por referencia.
En caso que no se quiera establecer una referencia se debe anteponer la palabra clave
ByVal a cada una de las definiciones en la lista de parámetros.
Cuando se hacen definiciones por valor, la correspondencia se sigue manteniendo
tanto en posición y en tipo, al igual que en las definiciones por referencia. De tal modo,
la diferencia radica en que no se establece la referencia, por lo cual al hacer el llamado l,
módulo que lo recibe, hace la definición de un espacio propio para las variables y copia en
este la información de las variables que hacen el llamado. Es claro entonces que se hace
doble definición del espacio en memoria para los mismos datos y como cada módulo tiene
su propio espacio para los datos que maneja, cada uno trabaja con ellos y no afectan los
datos del otro.
Ahora, centrando la atención en el llamado hecho por la instrucción 3 y la recepción
de este llamado por la instrucción 7 y desde el punto de vista de los espacios de memoria
que definen el computador para manejar las variables involucradas hasta este punto en la
prueba de escritorio, se presenta la figura 150, la cual muestra gráficamente la implemen-
tación éste mecanismo.
La tarea del módulo Definir_N_Filas es definir el número de filas que se van a manejar
para el triángulo de Pascal y además llenar de ceros la matriz que guarda la información
en el triángulo. Al ejecutar la instrucción 16 el programa habilita el teclado para poder es-
cribir un valor que define el número de filas que tendrá el triángulo de Pascal a generar.
Terminadas las tareas del módulo y antes de ejecutar la instrucción 18, que es con la que
efectivamente concluye la ejecución de este, la información en los espacios de memoria
definidos tendrá los datos como se muestra en la figura 151.
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

Figura 150: Definición de espacios de memoria


por los módulos Command1_Click y Definir_N_Filas.

Figura 151: Contenido de la memoria RAM


antes de ejecutar la Instrucción 18 del programa.
La variable Fil contiene el número 4, lo que quiere decir que se va a generar un trián-
gulo de 4 filas. Nótese que la figura muestra la referencia que hay entre las variables M y
Matriz. El módulo Definir_N_Filas mediante el uso de la variable M llena de ceros la variable
Matriz y a partir de la variable F se llena la variable Fil. Es claro que las variables M y F son
referencias y no variables definidas debidamente dentro del módulo Definir_N_Filas.
Al ejecutar la instrucción 18 del programa se elimina todo el ambiente de trabajo ge-
nerado para el módulo Definir_N_Filas y por tanto los valores guardados en las variables I,
J, M y F se borran. No se pierde Matriz ni Fil pues no son definiciones de Definir_N_Filas. La
figura 152 muestra cómo queda la información en la memoria del computador.

480
481

Figura 152: Contenido de la RAM después de ejecutar la instrucción 18.

De la instrucción 18 vuelve a la instrucción 3 y pasa a ejecutar la 4 que es el llamado al


módulo Generar_Triangulo. Al ser llamado el módulo se le pasan dos parámetros, la matriz
(Matriz) y el número de filas (Fil), datos con los que se va a generar el triángulo. De 4 pasa
el control de flujo del programa a la instrucción 19 que es la que recibe el llamado desde el
módulo principal. El módulo Generar_Triangulo define 9 variables para poder trabajar; siete
que son propias del módulo y dos que son recibidas como parámetros. De las dos variables
que se reciben como parámetros, una es recibida como parámetro por referencia (M) y otra
como parámetro por valor (F).
Una característica que hay que destacar es que las variables tipo arreglo que se pasan
como parámetros a los módulos siempre se pasan como parámetros por referencia. En el
módulo Generar_Triangulo, como también el módulo Definir_N_Filas, la Variable M es una
matriz o arreglo bidimensional y por tanto llega a los módulos como parámetros por referen-
cia. Ejecutada la instrucción 19 se ejecuta la instrucción 20 y 21 que definen las variables loca-
les que el módulo necesita para realizar su trabajo. La figura 153 muestra estas definiciones.
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

Figura 153: Definiciones hechas con el llamado al módulo de Generar_Triangulo.

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.

Figura 155: Devolución del resultado de la función Factorial.


Devuelto el valor por medio de la instrucción 49, se pasa a ejecutar la instrucción 50
que termina de ejecutar el módulo defFactorial y por lo tanto se borra de la memoria del
ámbito de trabajo el módulo función Factorial. De la instrucción 50 se pasa el control de
flujo de programa a la instrucción 25. Con lo que la memoria del computador mantendrá
los datos como se muestra en la figura 156.
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

Figura 156: Contenido de la memoria antes de ejecutar la instrucción 25.

Las instrucciones 27 y 28 son llamados al módulo de Factorial y por consiguiente se


harán los cálculos para poder determinar los coeficientes binomiales de cada fila de Matriz
referenciada con M; instrucciones que se ejecutan varias veces dado que se encuentran
dentro del ciclo definido por el conjunto de instrucciones de la 22 hasta la 32. Estas instruc-
ciones se ejecutan hasta alcanzar la instrucción 33. La siguiente figura muestra el contenido
de la memoria antes de ejecutar la instrucción 33.

Figura 157: Contenido de la memoria RAM


ante de ejecutar la instrucción 33 del programa.
Como se puede ver en la figura 157 la variable Matriz contiene los datos del trián-
gulo de Pascal. Al ejecutar la instrucción 33 se termina la ejecución del módulo Ge-
nerar_Triangulo y se devuelve el control de flujo del programa a la instrucción 5. Al
terminar la ejecución del módulo Generar_Triangulo se borra el ámbito de trabajo que
él hizo, luego el contenido de la memoria del computador queda como lo muestra la
siguiente figura.

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.

Figura 159: Ámbitos de trabajos definidos al ejecutarse la instrucción 34.


Al generar el ámbito de trabajo para el módulo Mostrar_Triangulo este ha definido la
variable M como parámetro por referencia, una variable local F como parámetro por valor
y mediante la instrucción 35 se definen dos variables locales normales. Las instrucciones
del módulo de la 36 a la 41 presenta la información del triángulo de Pascal en la pantalla
del computador, con lo que se termina la labor para la que fue diseñado el algoritmo. La
instrucción 42 termina la ejecución del módulo y por tanto borra el ámbito de trabajo defi-
nido para él. El contenido de la memoria del computador al retornar el control de flujo del
programa a la instrucción 6 queda como se muestra en la siguiente figura:
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

Figura 160: Ámbito de trabajo del módulo


principal antes de ejecutar la instrucción 6.

Hecha la instrucción 6 se termina la ejecución el módulo principal del algoritmo y con


esto se borra el ámbito definido por él, con lo que se desocupa la memoria del computador
al borrar la variable Matriz y la variable Fil. Esta información ya no se necesita dado que el
triángulo de Pascal se está viendo en la pantalla del computador. Con esto se termina de
ejecutar la totalidad del programa.
A continuación, se presenta el mismo algoritmo, pero codificado en diferentes lengua-
jes. La manera como funcionan el paso de parámetros y los módulos es la misma que la
descrita para el programa de Visual Basic. Las diferencias son meramente de sintaxis.
· Codificación del algoritmo en Lenguaje C:
#in c l u d e <s td i o. h>
#in c l u d e <con i o.h >
vo id D efi n i r_N _Fi las ( d o u b le [ ] [4 0 ] , i n t * ) ;
vo id G en era r_Tr ia n gu lo (d o u b le [ ] [4 0 ] , i n t ) ;
vo id M o s tra r_Tr i a n gu lo ( d o u b le [ ] [4 0 ] , i n t ) ;
d o u b le Fa cto r i al (d o u b le) ;

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 ) ;
}

vo id D efi n i r_N _Fi las ( d o u b le M [ ] [4 0 ] , i n t * F) {


in t I, J ;
fo r( I= 0 ; I<20 ; I + + ) {
fo r( J = 0 ; J< 4 0 ; J + + ) { M [ I ] [ J ] = 0 ; }
}
* F = 2;
d o{
p r in tf( “ D i g i te e l n ú m e ro d e Fi las : “ ) ;
s can f( “ % d ”, F) ;
}w h ile( ! ( ( * F> 0 ) & & ( * F< 21) ) ) ;
}
486
vo id G en era r_Tr ia n gu lo (d o u b le M [ ] [4 0 ] , i n t F) { 487
d o u b le F N , FJ , FN J , C ; i n t I , J , Co 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 ) ;
}

p u b l ic s tatic in t D e f i n i r_ N _ Fi las ( d o u b le M [ ] [ ] ) t h ro w s I O E xce p t i o n{


B u f fe re d Read e r le e = n e w Bu ffe re d Rea d e r( n e w I n p u t S t rea m Rea d-
e r( Sys te m.in) ) ;
in t I, J ;
fo r( I= 0 ; I<20 ; I++ ) {
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

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;
}

p r ivate s tatic vo id G e n e ra r_Tri a n gu lo (d o u b le M [ ] [ ] , i n t F) {


d o u b le F N , FJ , F N J , C ;
in t I, J , Co 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+ + ;
}
}
}
p r ivate s tatic vo id M o s t ra r_Tri a n gu lo ( d o u b le M [ ] [ ] , i n t F) {
i n t I, J ;
fo r( I= 0 ; I<= F; I+ + ) {
fo r( J = 0 ; J <= F* 2 ; J + + ) {
if( M [ I] [ J ] ! = 0 ) Sys te m .o u t . p r i n t( “ ” + M [ I ] [ J ] ) ;
e l s e Sys te m .o u t . p r i n t( “ “);
}
Sys te m.o u t . p r i n tl n( “ ” ) ;
}
}

p r ivate s tatic d o u ble Fa c to ri 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 Python
d e f Fa ctor i al ( N ) :
F = 1
A = 1
w h ile A <= N :
F = F * A
A = A + 1
re tu r n F

d e f D efi n i r_N _Fi las( M ) :


F = 0
w h ile F<1 o r F> 2 0 :
F = in p u t( ‘ D i g i te e l n ú m e ro d e f i las : ‘ )

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

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 )

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( ) ;

d efi n i r_n _fi las ( ) ;


gen era r_tr i a n gulo( ) ;
mos tra r_tr i a n gulo ( ) ;

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

f u n c tio n mos tra r_tr i a n gu lo ( ) {


var i = n e w Nu mb e r( ) ; va r j = n e w N u m b e r( ) ;
fo r ( i = 0 ; i <= f; i + + ) {
fo r ( j = 0 ; j <= f * 2; j + + ) {
if ( m[ i ] [ j ] ! = 0 ) {
d o cu me n t.w r i te ( “ & n b s p ;& n b s p ;& n b s p ;”,m [ i ] [ j ] ) ;
}
else {
d o cu m e n t.wr 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 ite ( “ ”,’ < B R / > ’ ) ;
}
}

f u n c tio n gen era r_tr i a n gu lo ( ) {


var fn = n e w Nu m b e r( ) ; va r f j = n e w N u m b e r( ) ; va r f n j = n e w N u m b e r( ) ;
var c = n e w Nu m b e r( ) ; va r i = n e w N u m b e r( ) ; va r j = n e w N u m b e r( ) ;
var co l = n e w Nu mber( ) ;
fo r ( i = 0 ; i <= f; i + + ) {
col = f- i ;
fn = fa ctor i al ( i ) ;
c = 0;
fo r ( j = col ; j <= f+ i ; j + = 2 ) {
fj = fa ctor i al ( c ) ;
fn j = fa ctor i al ( i - c ) ;
m[ i ] [ j ] = fn / ( f j * f n j ) ;
c = c+1 ;
}
}
}

f u n c tio n d efi n i r_n _fi las ( ) {


var i = n e w Nu mb er( ) ;va r j = n e w N u m b e r( ) ;
fo r ( i = 0 ; i <=1 9 ; i + + ) {
fo r ( j = 0 ; j <=39 ; j + + ) {
m[ i ] [ j ] = 0 ; }
}

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 ;
}

f u n c tio n mos tra r_t ri a n gu lo ( $ m , $f ) {


s e ttyp e( $i ,’ i n te ge r’ ) ; se t ty p e( $ j ,’ i n te ge r’ ) ;
fo r ( $i = 0 ; $i <= $f ;$ i + + ) {
fo r ( $j = 0 ; $j < = $f * 2 ;$ j + + ) {
if ( $m[ $i ] [ $ j ] ! = 0 ) {
e c h o ‘ ‘,$ m [ $ i ] [ $ j ] ;
}
else {
echo ‘ ‘;
}
} 490
e c h o ‘ ’, P HP_ EO L ; 491
}
}

f u n c tio n gen era r_t ri a n gu lo ( & $ m , $f ) {


s e tty p e( $fn ,’ floa t’ ) ; se t ty p e( $f j ,’ f loa t’ ) ; s e t ty p e( $f n j ,’ f loa t’ ) ; s e t-
typ e( $c ,’ floa t’ ) ;
s e tty p e( $i ,’ i n te ge r’ ) ; se t ty p e( $ j ,’ i n te ge r’ ) ; s e t ty p e( $ co l ,’ i n te ge r’ ) ;

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;
}
}
}

f u n c tio n d efi n i r_n _f i las ( & $ m , & $f ) {


g lo bal $s tdi n ; s e t ty p e( $ i ,’ i n te ge r’ ) ; se t ty p e( $ j ,’ i n te ge r’ ) ;

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

generales no importa cuál sea.


Debe establecerse con claridad cuál es el módulo principal pues será por este que se
arranca la ejecución del algoritmo.
El primer criterio no es estricto, lo que es estricto es que antes de usar una variable esta
se debe definir, pero por organización del programa y con el ánimo de darle mayor legibilidad
se toma en cuenta este criterio.
En leguajes de programación como Pascal y ADA los procedimientos y las funciones que
se requieran se deben definir primero antes de ser usados. En lenguaje C, por ejemplo, se
requiere hacer una definición de un prototipo de la función o procedimiento en el cual se
debe colocar el nombre de la función y la lista de parámetro o argumentos junto con su tipo
de dato. Después se hace la construcción del cuerpo de la función con todas las instruc-
ciones que la conforman, lo que se puede hacer en cualquier parte del programa (Quero
Catalinas, 2002). Si se observa con cuidado la traducción hecha en lenguaje C del problema
del triángulo de Pascal del numeral anterior, se percibe que después de las instrucciones que
incluyen las librerías (stdio.h y conio.h) viene la definición de los prototipos de los módulos
o funciones que componen el programa (Deitel & Deitel, 2004).
No es necesario definir el prototipo para la función main() puesto que esta es la función
principal y ya está predefinida para poder ser identificada como la función por donde se
arranca la ejecución del programa. De igual manera, esta se puede colocar en cualquier parte
del cuerpo del programa. Para el ejemplo se puso de primera por establecer cierto orden de
ejecución, pero no es necesario; lo importante es que se debe poner (Deitel & Deitel, 2004).

6.4. Declaración y llamado de módulos


Como se ha descrito en la prueba de escritorio del programa del triángulo de Pascal escrito
en Visual Basic, utilizando la técnica de modularización se han usado dos conceptos funda-
mentales: el primero es la declaración del módulo (procedimiento o función) que consiste
en la construcción del cuerpo de instrucciones demarcado entre el comienzo del módulo y
la instrucción de finalización o retorno; el segundo concepto es la instrucción que llama o
invoca al módulo que puede estar escrita haciendo parte de la construcción de cualquier
módulo (Deitel & Deitel, 2004). En el programa del triángulo de Pascal se pueden ver clara-
mente estos conceptos.
Retomando el programa estudiado en el numeral 6.2, el que se muestra a continuación,
se explica cómo funciona el ámbito de las variables (Vaquero Sanchez & Quieroz Vieyra, 1998).
1. Pr ivate S u b Comma n d1 _Cl i ck ( )
2. D im M a tr i z ( 0 To 20 , 0 To 4 0) A s Do u b le, Fi l A s Do u b le
3. D efi n i r_N _Fi las M a tr i z , Fi l
4. G en era r_Tr i a n gulo M a tr i z , Fi l
5. M os tra r_Tr i a n gulo M a tr i z , Fi l

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.

6.5. Parámetros formales y parámetros actuales


Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

Se denomina parámetros formales al conjunto o lista de variables que se definen en la de-


claración de un módulo. Por otro lado, Los parámetros actuales son la lista de las variables
que se escriben en la instrucción que hace el llamado o la invocación al módulo (Joyanes
Aguilar, 1996).
Retomando el programa escrito en Visual Basic para el problema del triángulo de Pas-
cal, la instrucción 3 hace el llamado al procedimiento Definir_N_Filas con dos parámetros
actuales (la variable Matriz y la variable Fil). En la instrucción 7 hace la declaración del
procedimiento con dos parámetros formales (la variable M y la variable F). Siempre que se
usen parámetros actuales, se deben usar parámetros formales y deben hacerse coincidir en
número y en tipo más no necesariamente en nombre. La correspondencias que se estable-
ce es una a uno; el primer parámetro de la lisa de los actuales debe corresponder al primer
parámetro de la lista de parámetros formales y así sucesivamente (Knuth, 1985).
En muchos programas, por la naturaleza del problema, no se necesita definir lista de pa-
rámetros para la declaración de los módulos, el llamado se hace simplemente escribiendo
una instrucción que contiene el nombre del procedimiento o función, la declaración se hace
colocando solo el nombre del módulo (procedimiento o función) (Joyanes Aguilar, 1996).

6.6. Algoritmos recursivos


Las técnicas de recursión consisten en definir algoritmos que incluyen módulos (bien
sean funciones o procedimiento) que dentro de su propio cuerpo contiene instruccio-
nes que se llama o se invoca a sí mismo (Ceballos, 2013).
A continuación, se estudiará el problema del cálculo del factorial de un número natural
usando técnicas de recursión. Este problema ya fue tratado y por tanto ya se dio una solu-
ción no recursiva en el ejemplo 5 del capítulo 4 de este libro.
Ejemplo 2.
Algoritmo recursivo para el cálculo del factorial
La forma de calcular el valor del factorial está dado por la expresión

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

Figura 161: Algoritmo modular para el cálculo del Factorial NO recursivo.

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.

Figura 162: Módulo del Factorial rediseñado con recursividad.


Con se ve en la figura 162, el módulo de Factorial ya no incluye un ciclo para hacer el
cálculo, sino que ahora se hace un llamado al mismo módulo, pero con el valor de N restán-
dole uno. El algoritmo completo con la modificación del módulo del Factorial se presenta
a continuación.
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

Figura 163: Algoritmo para el cálculo del Factorial por recursividad.


La codificación en lenguaje Visual Basic del algoritmo diseñado con recursividad sería así:
1. Pri vate S u b Co m m a n d1_Cl i c k( )
2. D i m N A s D o u ble, F as D o u b le
3. N = En tra r_ Num e ro ( )
4 . I f N >= 0 T he n
5. F = Fa c to r i al ( N)
6. Mo stra r_ Fa c to r i al ( F )
7. Else
8. Pr i n t “Núm e ro n o válid o”
9. En d I f

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

A continuación, se hace una prueba de escritorio al programa anterior con el propósito


de mostrar con mayor claridad la forma como la recursividad opera. No se olvide que los
números de línea no hacen parte de la codificación en el lenguaje, son elementos para
poder hacer referencia concreta a cada instrucción en la prueba que se pretende adelantar.
El algoritmo además de ser recursivo está diseñado de forma modular con variables
locales y paso de parámetros. Como se explicó, el orden en que aparecen los módulos
(Command1_Click, Entrar_Numero, Factorial y Mostrar_Factorial) en el programa codificado
en Visual Basic no importa, pero con el propósito de mostrar cierta coherencia con el
orden de las funciones básicas (entrada, proceso y salida) que conforman todo algorit-
mo, se han escrito en el orden exhibido por el programa. En consecuencia, la primera
instrucción que se ejecuta es la número uno, que es la declaración del módulo principal.
Seguido se pasa a ejecutar la instrucción 2 que define las variables locales al módulo
principal. El ámbito de trabajo construido por estas dos instrucciones para este módulo
se muestra a continuación.
Figura 164: Ámbito de trabajo para el módulo principal.

De la instrucción 2 pasa a la 3, la que corresponde a la asignación de un valor a la


variable N que es devuelto por la Función Entrar_Numero(). Para ejecutar las tareas dise-
ñadas dentro de esta función, la instrucción ejecuta un llamado a la función, por tanto, el
control de flujo del programa salta a la instrucción 11, que es la declaración de la función
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

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.

Figura 165: Ámbitos de trabajo para los módulos Principal y de Entrada.

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:

Figura 166: Valor digitado y almacenado en N del


módulo Entrada_Numero después de ejecutada la instrucción 13.
Luego la instrucción 14 retorna el valor de N del ámbito de trabajo de la función En-
trada_Numero() a la variable N del ámbito de trabajo del procedimiento principal Com-
mand1_Click(). Gráficamente se vería así:.

Figura 167: Valor transferido de un módulo a otro.

La instrucción 15 elimina el ámbito de trabajo de la función Entrar_Numero() y re-


torna el control del flujo del programa a la instrucción 4. El contenido de la memoria
del computador queda como se muestra en la figura 168.

498
499

Figura 168: Contenido de la memoria del computador


antes de ejecutar la instrucción 4.

La instrucción 4 es la evaluación del contenido de la variable N para determinar si


es un valor admisible para calcular su correspondiente factorial. Como a este valor se le
puede calcular el factorial entonces se pasa a ejecutar la instrucción 5 que consiste en el
llamado a la función para el cálculo del factorial y por lo tanto el control de flujo del pro-
grama se transfiere a la instrucción 16 que construye el ámbito de trabajo para la función
Factorial y define la variable N.
La construcción del ámbito de la función Factorial define un parámetro formal por
valor que recibe el valor del parámetro actual enviado desde la instrucción 5 mediante el
uso de la variable N definida en el módulo principal. El contenido de la memoria después
de ejecutada la instrucción 16 y 17 se presenta a continuación.

Figura 169: Contenido de la memoria después de ejecutada la instrucción 17.


La instrucción 18 determina si el valor de N es igual a 1. Como no lo es, pues el valor de
N es 4, el control de flujo del programa salta a ejecutar la instrucción 22 que consiste en la
evaluación de una expresión algebraica en la que se hace un nuevo llamado a la función
Factorial con un parámetro actual de N -1, que daría como resultado 3. La instrucción 22
pasa el control de flujo del programa de nuevo a la instrucción 16 con lo que se crea otro
nuevo ámbito de trabajo para la función Factorial con el parámetro formal N con un valor
de 3. El contenido de la memoria del computador, como se muestra enseguida después de
ejecutar las instrucciones 16 y 17 con el segundo llamado a la función.
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

Figura 170: Contenido de la memoria después de


ejecutada la instrucción 17 por segunda vez.

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.

Figura 171: Contenido de la memoria después de


ejecutada la instrucción 17 por tercera vez.
Ejecutada la instrucción 17 por tercera vez, se pasa a ejecutar la instrucción 18 que avalúa
el contenido de la variable N del tercer ámbito de trabajo de la función Factorial. Como N
contiene el valor de 2, la evaluación da falso por lo que se pasa a ejecutar la instrucción 22
que invoca par cuarta vez la función Factorial con un parámetro formal de N – 1, es decir, con
un valor de 1. La instrucción 22 crea otro ámbito de trabajo para la función Factorial. El con-
tenido de la memoria del computador hasta este punto de ejecución del programa sería así:

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

Figura 173: Contenido de la memoria después de


ejecutada la instrucción 19 por primera vez.
Una vez ejecutada 19, se pasa a la instrucción 20, la que retorna el valor de F del ámbito
de trabajo cuatro al ámbito de trabajo tres que fue el que creó el ámbito cuatro. Esto quiere
decir que el tercer ámbito de trabajo ya sabe cuál es el valor de la función Factorial pues es
la que recibe el valor de la instrucción de retorno del ámbito de trabajo cuatro. Gráficamente
la memoria del computador tendrá la siguiente información.
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

Figura 174: Contenido de la memoria después de


ejecutada la instrucción 20 por primera vez.

De 20 se pasa a la instrucción 25 del cuarto ámbito de trabajo. La instrucción 25 finaliza


la ejecución de la función dentro del ámbito de trabajo cuatro y retorna el control de flujo
de ejecución del programa a la instrucción 22 dentro del ámbito de trabajo tres que fue
la que hizo el llamado. La memoria del computador contendrá la información organizada
como se muestra a continuación.

Figura 175: Contenido de la memoria después de


ejecutada la instrucción 25 por primera vez.
La instrucción 22 del ámbito tres, como ya conoce el valor de la Función Factorial, ahora
sí puede terminar su ejecución y calcular el valor de la expresión que constituye la instruc-
ción. El resultado entonces de esta instrucción es 2, que es calculado multiplicando el con-
tenido de la variable N del ámbito tres que contiene 2 por el valor de la función Factorial
devuelto del ámbito cuatro que es 1. La memoria del computador contendrá la información
organizada como se muestra a continuació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.

Figura 177: Contenido de la memoria después de


ejecutada la instrucción 23 del ámbito tres.
De la instrucción 23 del ámbito tres se pasa a ejecutar la instrucción 25 que termina
la ejecución de la función en el ámbito tres, lo que destruye el ambiente de trabajo tres y
devuelve el control de flujo del programa al ámbito de trabajo dos en la instrucción 22 y
procede a terminar su ejecución pues acaba de recibir el valor de la función Factorial de
esta instrucción con lo que se puede calcular la expresión. La memoria del computador
contendrá la información organizada del modo siguiente:
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

Figura 178: Contenido de la memoria después de


ejecutada la instrucción 25 del ámbito tres.

El resultado de la instrucción 22 del ámbito dos es 6 que se obtiene de la función Fac-


torial desde el ámbito tres igual a 2 y multiplicado por el contenido de la variable N del ám-
bito. La memoria del computador contendrá la información organizada del modo siguiente.

Figura 179: Contenido de la memoria después de


ejecutada la instrucción 22 del ámbito dos.

Ejecutada la instrucción 22 del ámbito de trabajo dos se pasa a ejecutar la instrucción


23 del mismo ámbito que retorna el valor seis al ámbito de trabajo uno de la función
Factorial. La memoria del computador contendrá la información organizada como se
muestra a continuación.
Figura 180: Contenido de la memoria después de
ejecutada la instrucción 23 del ámbito dos.

En el ámbito de trabajo dos se pasa de la instrucción 23 a la 25 que retorna el control


del flujo del programa a la instrucción 22 del ámbito de trabajo uno y además destruye
el ámbito dos. La memoria del computador contendrá la información organizada como se
muestra a continuación.

504
505

Figura 181: Contenido de la memoria después de


ejecutada la instrucción 25 del ámbito dos.

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.

Figura 182: Contenido de la memoria después de


ejecutada la instrucción 22 del ámbito uno.
La instrucción 22 calcula el valor de 24 y la instrucción 23 que se ejecuta a continuación
dentro del ámbito de trabajo uno, retorna el valor de 24 al ámbito de trabajo del procedi-
miento principal Command1_Click(). La memoria del computador contendrá la información
organizada del siguiente modo:

Figura 183: Contenido de la memoria después de


Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

ejecutada la instrucción 23 del ámbito uno.

De la instrucción 23 se pasa a la 25 del ámbito de trabajo uno de la función Factorial,


que destruye el ámbito uno y retorna el control del flujo del programa a la instrucción 5 del
ámbito de trabajo del procedimiento principal, que consiste en recibir el valor devuelto por
la función Factorial y almacenarlo en F del ámbito principal. La memoria del computador
contendrá la información organizada como se muestra a continuación.
De la instrucción 5 se pasa a ejecutar 6 del programa principal. Esta instrucción 6 invoca

Figura 184: Contenido de la memoria después de


ejecutada la instrucción 5 del ámbito de trabajo Principal.

al procedimiento Mostrar_Factorial con un parámetro actual F que contiene el valor de 24 que


es el factorial de número 4 digitado al programa. La instrucción 6 pasa el control del flujo del
programa la instrucción 26, que crea en consecuencia, el ámbito de trabajo para el procedi-
miento Mostrar_Factorial con un parámetro formal F que recibe el valor 24. La memoria del
computador contendrá la información organizada como se muestra a continuación.

Figura 185: Contenido de la memoria después de


ejecutada la instrucción 26 del ámbito de Mostrar_Factorial.
De la instrucción 26 se pasa a 27 con la que se muestra en la pantalla del computador
el valor del factorial solicitado al programa. Ejecutada la instrucción 27 se ejecuta la ins-
trucción 28 que retorna el control del flujo del programa de nuevo al procedimiento princi-
pal en la instrucción 6 y destruye el ámbito de trabajo del procedimiento Mostrar_Factorial.
Como el flujo del control del programa queda en la instrucción 6 del procedimiento prin-
cipal, se pasa a ejecutar la instrucción 7 y luego 9 que termina la condición y de allí pasa
a ejecutar la instrucción 10. Con esta última se termina el algoritmo, destruye el ámbito de
trabajo del procedimiento principal del programa, termina la ejecución total del programa
y se desocupa la memoria del computador.
De tal forma, se concluye la prueba del programa y se muestra con detalle cómo opera
el mecanismo de la recursividad que está implementado en la función Factorial.
A continuación se presenta el algoritmo en diferentes codificaciones:

· Codificación del algoritmo en lenguaje C:


#i n c l ude <stdi o. h >
#i n c l ude <co n i o. h >

float En tra r_ Num e ro ( ) ;


floa t Fa c to r i al ( f loa t) ;
float Mo stra r_ Fa c to r i al ( f loa t) ;
506
507
voi d m a i n( v o i d) {
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 i al ( F ) ; }
e lse{
pr i nt f( “Num e ro n o vál i d o . . . .” ); }
}

floa t En tra r_ Num e ro ( ) {


float N;
pr i nt f( “D i g i te e l n úm e ro : “) ;s ca n f(“ % f ”, &N );
re t u r n N;
}
floa t Fa c to r i al (floa t N) {
float F;
i f( N = = 1)
F = 1;
e lse
F = N * Fa c to r i al ( N - 1) ;
re t u r n F;
}

floa t Mo stra r_ Fa c to r i al(floa t F ) {


pr i n t f( “El Fa c to r i al e s %10.0 f ”, F );

}
· 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;
}

pr i va te sta t i c floa t Fa c tor ial( f loa t N ){


floa t F;
i f( N = = 1) {
F = 1;
}
e lse{
F = N * Fa c to r ial(N - 1 );
}
re t u r n F;
}

pr i va te sta t i c vo i d M os t ra r_Fa c tor ial(f loa t F){


Syste m .o u t . pr i nt(“ El fa c tor ial es : “ + F);
}
}

· Codificación del algoritmo en Python:


de f En tra r_ Num e ro ( ) :
F = i npu t( ‘di g i te el nu m ero: ‘ )
re t u r n F

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 o s t ra r_fa c tor ial(f ) {


do cu m en t.write (“ El fa c tor ial es “,f,’ < BR/> ’ );
}

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 ’ );

fu nc t i o n ent ra r_nu m ero() {


g lo bal $s td in;s e tty p e($n,’ f loa t’ );
e c ho ‘ D ig ite el nú m ero: ‘ ;fs ca n f($s td in,” % f ”, $n);
re t u r n $n;
}

fu n c t i o n fac tor ial($n) {


se t type($f,’ f loa t’ );
i f ( $ n = =1 ) {
$f = 1 ;
}
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

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;
}

se t type( $ n ,’ floa t’ ); s e tty p e($f,’ f loa t’ );


$ n = e n tra r_nu m ero();
i f ( $ n >= 0 ) {
$f = fa c tor ial($n);
m o strar_fa c tor ial($f );
} e lse {
e c h o ‘ N u m ero no válid o. . .’, 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í:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,…

Un algoritmo recursivo que genera la serie de N términos sería:

510
511

Figura 186: Algoritmo recursivo para la serie de Fibonacci.


La codificación en Visual Basic del algoritmo de la serie de Fibonacci se presenta a
continuación. Hay que notar que se define una variable global tipo arreglo que contendrá
los términos generados por el algoritmo y que la cantidad de elementos del arreglo de-
pende del valor que se digite para N, siempre que no se pase de 200.

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)

21. D i m Si gui e n te A s D o u ble


22 . If N > 0 Then
23. Si gui e n te = Ul ti m o + Penu lt im o
24. Te r m i n o s( N) = S igu iente
25. Se r i e N - 1, Si gu iente, U lt im o
26. En d I f

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

Figura 187: Ámbito definido por el programa después de


ejecutada la instrucción 3.

Una vez que se realiza la instrucción 3, se pasa a ejecutar la instrucción 4 que es el


llamado a la función Entrada(), la cual debe retornar el valor que se guardará en la variable
N. Al invocar Entrada() el control del flujo del programa salta a la instrucción 12 que define
el ámbito de trabajo para dicha función. El ámbito de la función Entrada() define dos va-
riables locales (N, I) por medio de la instrucción 13. Después de ejecutada las instrucciones
12 y 13, la memoria RAM del computador contendrá la información organizada como se
muestra a continuación.
Figura 188: Memoria del computador después ejecutada la instrucción 13.
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

Las instrucciones de la 14 a la 16 constituyen un ciclo que rellena de ceros el arreglo


Terminos. La instrucción 17 permite escribir un valor desde el teclado (supóngase que se
digitó 4 para efectos de la prueba que se está adelantando) y lo almacena en la variable
N. La instrucción 18 pasa el valor de N del ambiente de trabajo de la función Entrada(), a la
variable, también de nombre N, de la instrucción 4 del ambiente del módulo principal (Com-
madn1_Click). A continuación, se muestra el contenido de la memoria RAM del computador
con la información manejada por el programa.

Figura 189: Memoria del computador después de ejecutada la instrucción 18.

La instrucción 19 destruye el ámbito de trabajo generado por la función Entrada() y


retorna el control de flujo de programa a la instrucción 5 del ámbito de trabajo del módulo
principal con lo que queda definido el valor de la variable N de éste módulo. La memoria
del computador contendrá la información organizada así:
Figura 190: Memoria del computador después ejecutada la instrucción 4.

La instrucción 5 evalúa el contenido de la variable N y si no se encuentra en el intervalo


[1,199], reporta que no es un valor válido con el que se pueda generar la serie y termina la
ejecución del programa pasando por las instrucciones 8, 9, 10 y 11.
En caso de que la evaluación del contenido de la variable N determine que está en el
intervalo [1, 199], se pasa a ejecutar la instrucción 6 que consiste en el llamado al procedi-
miento Serie() con los parámetros actuales (Cairó, 2006) N (con un valor de 4), junto con los 514
valores 1 y -1. Como la instrucción 6 invoca al procedimiento Serie el control del flujo del 515
programa salta a la instrucción 20 que define el ámbito de trabajo para el procedimiento
con los parámetros formales (Cairó, 2006) N, Ultimo y Penultimo. La instrucción 21 define la
variable local Siguiente. Después de ejecutadas las instrucciones 20 y 21, La memoria RAM
del computador contendrá la información organizada así.

Figura 191: Memoria del computador después de ejecutada la instrucción 21.


Como se puede ver, la variable N del ámbito de trabajo del procedimiento principal
(Command1_Click) pasa una copia de su valor (4) a la variable N del ámbito de trabajo del
procedimiento Serie, en otras palabras, se pasa el parámetro por valor. Las variables Ultimo
y Penultimo también reciben parámetros por valor, es decir, reciben los valores de 1 y -1
respectivamente. La instrucción 22 evalúa la condición y da como resultado verdadero, ya
que N contiene el valor 4 que es mayor que cero y, por tanto, pasa a ejecutar las instruccio-
nes 23 y 24, con las que se calcula y se almacena en arreglo Terminos el primer valor de la
serie de Fibonacci. La memoria RAM del computador contendrá la información organizada
como se ve en la figura 192.
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

Figura 192: Memoria del computador después de ejecutada la instrucción 24.

Terminada la instrucción 24 se pasa a 25 que es el llamado nuevamente al procedimiento


Serie con los parámetros actuales N - 1, Siguiente y Ultimo, es decir, pasa los valores 3, 0 y 1,
lo que quiere decir que se crea un nuevo ámbito de trabajo para la función Serie y pasa el
control de flujo del programa a la instrucción 20 y luego a la 21 nuevamente. La memoria RAM
del computador contendrá la información organizada como se presenta en la figura.

Figura 193: Memoria del computador después de


ejecutada la instrucción 21 por segunda vez.
Dentro del segundo ambiente de trabajo para el módulo Serie se ejecuta la instrucción
22 que consiste en la evaluación de la condición N > 0 y como N contiene el valor de 3,
entonces el resultado de la valoración es Verdadera y, por lo tanto, se pasa a ejecutar las
instrucciones 23 y 24 nuevamente, las que guarda el segundo valor de la serie en el arreglo
Terminos. El estado de la memoria RAM es el siguiente.

Figura 194: Memoria del computador después de


ejecutada la instrucción 24 por segunda vez. 516
517
Al ejecutar nuevamente la instrucción 25, se llama al procedimiento Serie, se pasa el con-
trol de flujo del programa otra vez y se ejecutan de nuevo las instrucciones 20 y 21 con lo que
se genera el tercer ambiente de trabajo para la función Entrada() con los parámetros formales
N-1 (que es 2), 1, 0. La memoria RAM contendrá la información organizada de esta forma.

Figura 195: Memoria del computador después de


ejecutada la instrucción 21 por tercera vez.
En este tercer ambiente de trabajo se ejecuta nuevamente la instrucción 22 que evalúa
la condición dando como resultado verdadero ya que N, que contiene 2, es mayor a 0. Por
tal razón se pasa a ejecutar las instrucciones 23 y 24 con lo que se guarda el tercer valor de
la serie en el arreglo Terminos. La memoria RAM muestra así la información.
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

Figura 196: Memoria del computador después de


ejecutada la instrucción 24 por tercera vez.

De la instrucción 24 se pasa a 25 que llama por cuarta vez al procedimiento Serie, el


control de flujo del programa se devuelve de nuevo a la instrucción 20 y pasa a ejecutar
también nuevamente la 21, con lo que se crea el cuarto ámbito de trabajo para el proce-
dimiento, pasándole los valores 1, 1, 1 como parámetros formales. En la memoria RAM del
computador se tendrá la información organizada de la siguiente forma.

Figura 197: Memoria del computador después de


ejecutada la instrucción 21 por cuarta vez.
Ejecutadas las instrucciones 20 y 21 por cuarta vez, se pasa a ejecutar la instrucción 22
que es la evaluación de la condición N > 0, la que da verdadero ya que N es igual a 1. De
la instrucción 22 se pasa a ejecutar las instrucciones 23 y 24 que calculan y almacenan el
cuarto término de la serie y lo guarda en el arreglo Terminos. En la memoria RAM la infor-
mación se observará así.

518
519

Figura 198: Memoria del computador después de


ejecutada la instrucción 24 por cuarta vez.

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

Figura 199: Memoria del computador después de


ejecutada la instrucción 21 por quinta vez.

Dentro del quinto ámbito de trabajo el procedimiento Serie ejecuta la instrucción 22


con la que se obtiene un falso para la condición, dado que ya N no es mayor a cero
puesto que N contiene el valor de cero. Como la evaluación de la proposición es falso,
se pasa a ejecutar la instrucción 26 que consiste en la terminación de la condición y de allí
a la 27 que termina la ejecución del procedimiento Serie. Por tanto, se destruye el quinto
ambiente de trabajo y se pasa el control de flujo el programa a la instrucción 26 del cuarto
ambiente de trabajo, lo cual se organiza en la memoria RAM del siguiente modo.
Figura 200: Memoria del computador después de
ejecutada la instrucción 27 por primera vez.

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.

Figura 201: Memoria del computador después de


ejecutada la instrucción 27 por segunda vez.
De la instrucción 26 del tercer ambiente de trabajo se pasa nuevamente a 27 con lo que
se termina la ejecución del procedimiento Serie dentro del tercer ámbito y por lo tanto se
elimina éste y retorna el control del flujo del programa a la instrucción 26 del segundo am-
biente de trabajo. La memoria RAM del computador después de ejecutada la instrucción 27
del tercer ambiente y con el control de flujo del programa en la instrucción 26 del segundo
ambiente de trabajo contendrá la información organizada como se muestra a continuación.
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

Figura 202: Memoria del computador después de


ejecutada la instrucción 27 por tercera vez.

De la instrucción 26 del segundo ambiente de trabajo se pasa a ejecutar la instrucción


27 con lo que se termina la ejecución del procedimiento Serie dentro del segundo am-
biente de trabajo y por lo tanto se elimina y retorna el control del flujo del programa a la
instrucción 26 del primer ambiente de trabajo de trabajo. Así se organizaría la información
en la memoria RAM en este punto.

Figura 203: Memoria del computador después de


ejecutada la instrucción 27 por cuarta vez.

De la instrucción 26 del primer ámbito se pasa a ejecutar la instrucción 27 con lo que se


termina la ejecución del procedimiento Serie dentro del primer ambiente de trabajo y por lo
tanto se elimina y retorna el control del flujo del programa a la instrucción 6 del ambiente de
trabajo del módulo principal (Command1_Click). La memoria RAM del computador contendrá
la información organizada como se muestra a continuación.
Figura 204: Memoria del computador después de
ejecutada la instrucción 28 por quinta vez.

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 f ( N > 0 & & N < 2 0 0) {


Se r i e ( N, 1, -1) ;
Ve r_Se r i e ( N) ;
}
e lse {
pr i n t f( “Núm e ro n o válid o . . . .” );
}
}

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;

pr i n t f ( “D i g i te e l n úm e ro d e tér m inos a genera r : “ ); s ca nf (“ % d ”, &N );


re t u r n N;
}

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 u b l ic s tatic vo i d 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 {¡ i n t N ;


N = En tra d a ( ) ;
if( N > 0 & & N < 20 0 ) {
S er i e( N , 1 , -1 ) ;
Ver_S er i a ( N ) ;
} e l s e { Sys te m.o u t. p r i n t( “ N u m e ro n o val i d o ...” ) ;}
}

p r ivate s tatic in t En tra d a ( ) t h ro w s I O E xce p t i o n {


B u f fe re d Read e r lee = n e w Bu ffe re d Rea d e r( n e w I n p u t S t rea m Rea d er( Sys te m . i n) ) ;
in t N , I;
fo r ( I= 0 ; I<20 0 ; I+ + )
Ter mi n os [ I] = 0 ;
Sys te m.o u t .p r in t( “ D i gi te e l n ú m e ro d e té rm i n o s a ge n e ra r : “ ) ;
N = In te ge r.pars e In t( le e.rea d L i n e( ) ) ;
re tu r n N ;
}

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] ) ;
}
}

· Algoritmo codificado en Python.


Ter mi n o s = [ ]
d e f En tra d a ( ) :
I= 0
w h ile I < 20 0 :
Ter mi n os . a p p en d( 0 )
I = I +1
N = in p u t( ‘ D i g i te el n ú m e ro d e té rm i n o s a ge n e ra r : ‘ )
re tu r n N

d e f S er i e( N , U l ti mo, Pen ul tim o ) :


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 gui en te
S er i e( N -1 , S i gui en te, U l t i m o )

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/> ’ );
}

fu n c t i o n se r ie(t , n, úl tim o, penú lt im o) {


va r si gu iente = n e w N um b e r();
va r i = n e w N um b e r();
Fundamentos de lógica para programación de computadores · Cap. 6 · Algoritmos modulares

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

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 me-
nor o igual a100.

T (x) = T ( x-1 ) + ( x-1 )

6. Para la función que se presenta a continuación, tomar T(n) = 1 para n = 1. Entonces,


escribir un algoritmo recursivo que tabule la función para un valor de x entero del
intervalo (500,1000].

T (x) = 3T
( x 2- 1 ) + ( x - 1 )2

7. Para la función que se presenta a continuación, tomar T(n) = 1 si n = 1. Entonces, es-


cribir un algoritmo que tabule la función para un valor de x entero positivo mayor a 1.
1
T (x) = T (x - 1 ) +
(x - 1)

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

Y la cantidad de réplicas es N = 3, entonces el arreglo deberá quedar:

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

986 - 689 = 297


972 - 279 = 693
963 - 369 = 594
954 - 459 = 495
954 - 459 = 495
954 - 459 = 495

Entonces, la constante de Kaprekar de 698 es 495.

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

Tenga en cuenta que la secuencia se obtiene así: 1 + 2 + 3 + 4 + … + (2N - 1) = N2


28. Hacer un algoritmo recursivo que tome dos números naturales en una potencia
de la forma XY y calcule la suma de los dígitos del resultado de la potencia. Los
números deben ser el intervalo [0,19]
29. Escribir un algoritmo que calcule la siguiente suma para valores de N enteros po-
sitivos menores a 1000.

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:

Base 21 Base 2 Base 18 Base 6 Base 9

15264CAB 11010011 FEAFEA12 45300031 1368003


- CB1007 - 1010100 - 12548ACE - 1251520 + 87654

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:

De base 25 a base 12 De base 2 a base 8


0.NL002CAB 0.1100100001

De base 16 a base 2 De base 8 a base 4


0.004FEAFEA12 0.077445003

a. Pasar 0.NL002CAB25 a su equivalente ( )12


Base de origen = 25
Base de destino = 12
Pase a base 25 el valor 12 de la base destino:

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

Luego los valores que se toman de los resultados de la lista son: B, 5, 3, 9, A, 3, 1, 3, 2 y


9, a los que se le aplica la conversión al sistema 25:
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

B equivale a 11 * 250 = 11 * 1 = 11 que en base 12 es B


5 equivale a 5 * 250 = 5 * 1 = 5 que en base 12 es 5
3 equivale a 3 * 25 = 3 * 1 = 3 que en base 12 es
0
3
9 equivale a 9 * 25 = 9 * 1 = 9 que en base 12 es
0
9
A equivale a 10 * 25 = 10 * 1 = 10 que en base 12 es
0
A
3 equivale a 3 * 250 = 3 * 1 = 3 que en base 12 es 3
1 equivale a 1 * 25 = 1 * 1 = 1 que en base 12 es
0
1
3 equivale a 3 * 25 = 3 * 1 = 3 que en base 12 es
0
3
2 equivale a 2 * 25 = 2 * 1 = 3 que en base 12 es
0
2
9 equivale a 9 * 250 = 9 * 1 = 9 que en base 12 es 9

Por tanto 0.NL002CAB25 es equivalente a 0.B539A3132912


b. Pasar 0.11001000012 a su equivalente ( )8
Base de origen =2
Base de destino = 8
Pase a base 2 el valor 8 de la base destino:

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:

0.1100100001 * 1000 = 110.0100001000


0.0100001000 * 1000 = 10.0001000000
0.0001000000 * 1000 = 0.1000000000
0.1000000000 * 1000 = 100.0000000000
0.0000000000 * 1000 = 0.0000000000

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:

11 0 e q u i vale a 1 * 2 2 + 1 * 2 1 + 0 * 2 0 = 1 *4+1 * 2 + 0 * 1 = 6 q ue e n bas e 8 e s 6


10 e q u i vale a 1 * 2 1 + 0 * 2 0 = 1 * 2 + 0 * 1 = 2 q ue e n bas e 8 e s 2
0 e q u i vale a 0 * 2 0
= 0*1 = 0 q ue e n bas e 8 e s 0
100 e q u i vale a 1 * 2 2 + 0 * 2 1 + 0 * 2 0 = 1 *4+ 0 * 2 + 0 * 1 = 4 q ue e n bas e 8 e s 4
0 e q u i vale a 0 * 2 0 = 0 * 1 = 0 q ue e n bas e 8 e s 0

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-

cede entonces a hacer las multiplicaciones:


0.077445003 * 4 = 0. 376224014
0. 376224014 * 4 = 1.771120060
0.771120060 * 4 = 3.744500300
0.744500300 * 4 = 3.622401400
0.622401400 * 4 = 3.112006000
0.112006000 * 4 = 0.450030000
0.450030000 * 4 = 2.240140000
0.240140000 * 4 = 1.200600000
0.200600000 * 4 = 1.003000000
0.003000000 * 4 = 0.014000000
0.014000000 * 4 = 0.060000000
0.060000000 * 4 = 0. 300000000
0. 300000000 * 4 = 1.400000000
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

0.400000000 * 4 = 2.000000000
0.000000000 * 4 = 0.000000000

Luego los valores que se toman de los resultados de la lista son: 0, 1, 3, 3, 3, 0, 2, 1, 1, 0,


0, 0, 1 y 2, se le aplica entonces la conversión al sistema 8:

0 equivale a 0 * 8 0 = 0* 1 = 0 que en base 4 es 0


1 equivale a 1 * 8 0 = 1* 1 = 1 que en base 4 es 1
3 equivale a 3 * 8 = 3* 1 = 3 que en base 4 es
0
3
3 equivale a 3 * 8 = 3* 1 = 3 que en base 4 es
0
3
3 equivale a 3 * 8 = 3* 1 = 3 que en base 4 es
0
3
0 equivale a 0 * 8 0 = 0* 1 = 0 que en base 4 es 0
2 equivale a 2 * 8 0 = 2* 1 = 2 que en base 4 es 2
1 equivale a 1 * 8 = 1* 1 = 1
0
que en base 4 es 1
1 equivale a 1 * 8 = 1* 1 = 1
0
que en base 4 es 1
0 equivale a 0 * 8 0 = 0* 1 = 0 que en base 4 es 0
0 equivale a 0 * 8 0 = 0* 1 = 0 que en base 4 es 0
0 equivale a 0 * 8 0 = 0* 1 = 0 que en base 4 es 0
1 equivale a 1 * 8 0 = 1* 1 = 1 que en base 4 es 1
2 equivale a 2 * 8 0 = 2* 1 = 2 que en base 4 es 2
Por tanto, 0.0774450038 es equivalente a 0.01333021000124
Capítulo 2
Ejercicio 5.
a. Escribir el valor 3.14159 en formato de 48 bits con 11 de exponente.
Paso 1. Convertir 3 a base dos

3 2
-2 1 2
1 -0 0
1

Entonces 310 es igual 112


Paso 2. Se pasa la fracción 0.1415910 a base 2 y para ello hay que ver cuántas multiplica-
ciones se deben hacer. Se tiene que el número debe tener una longitud de 48 bits, de los
cuales hay uno, el primero, que indica que el valor es positivo o negativo, el bit de signo,
después se tienen 11 bits que son los bits del exponente, luego vienen los bits de la manti-
za que corresponden a 36, esto es: 48 menos uno, el bit de signo, lo que da 47, menos 11 bits
del exponente, que da 36, de estos bits de la mantiza ya se tienen 2 de ellos que tenemos
de pasar el valor 3 (parte entera de 3.14159) a base 2. Entonces 36 menos 2 es igual a 34, que
debe ser el número de multiplicaciones que se deben hacer para terminar de calcular la 538
mantiza del número dado. Esto es: 539

1 0.14159 * 2 = 0.28318 18 0.48448 * 2 = 0.96896


2 0.28318 * 2 = 0. 56636 19 0.96896 * 2 = 1.93792
3 0. 56636 * 2 = 1.1 3272 20 0.93792 * 2 = 1.87584
4 0.13272 * 2 = 0.26544 21 0.87584 * 2 = 1.75168
5 0.26544 * 2 = 0. 53088 22 0.75168 * 2 = 1. 50336
6 0. 53088 * 2 = 1.06176 23 0. 50336 * 2 = 1.00672
7 0.06176 * 2 = 0.12352 24 0.00672 * 2 = 0.01344
8 0.12352 * 2 = 0.24704 25 0.01344 * 2 = 0.02688
9 0.24704 * 2 = 0.49408 26 0.02688 * 2 = 0.05376
10 0.49408 * 2 = 0.98816 27 0.05376 * 2 = 0.10752
11 0.98816 * 2 = 1.97632 28 0.10752 * 2 = 0.21504
12 0.97632 * 2 = 1.95264 29 0.21504 * 2 = 0.43008
13 0.95264 * 2 = 1.90528 30 0.43008 * 2 = 0.86016
14 0.90528 * 2 = 1.81056 31 0.86016 * 2 = 1.72032
15 0.81056 * 2 = 1.62112 32 0.72032 * 2 = 1.44064
16 0.62112 * 2 = 1.24224 33 0.44064 * 2 = 0.88128
17 0.24224 * 2 = 0.48448 34 0.88128 * 2 = 1.76256

Entonces 0.1415910 es igual a 0.00100100001111110011111000000011012


Ahora el 3.1415910 es igual a 11.00100100001111110011111000000011012
Paso 3. Luego 11.00100100001111110011111000000011012, escrito en notación mantiza frac-
cionaria y exponente quedaría:

0. 110 010 010 0 0 01111110 0111110 0 0 0 0 0 01101x 2 2

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 1 0 0 0 0 0 0 0 01 0 11 001 001 0000111111 0011111 000000011 01

b. Escribir el valor -2342.46 en formato de 48 bits con 11 de exponente.


Paso 1. Convertir -2342 a base dos, esto es por divisiones sucesivas, se tiene que:

-2342 10 es igual a -100100100110 2


Paso 2. Se convierte la fracción 0.4610 a base 2, para ello hay que ver cuántas multipli-
caciones se deben hacer. Entonces se tiene que el número debe tener una longitud de 48
bits, de los cuales hay uno, el primero, que indica que el valor es positivo o negativo, el bit
de signo, después se tienen 11 bits que son los bits del exponente, luego vienen los bits de
la mantiza que corresponden con 36, esto es: 48 menos uno, el bit de signo, lo que da 47,
menos 11 bits del exponente, que da 36, de estos bits de la mantiza ya se tienen 12 de ellos
que tenemos de pasar el valor 2342 (parte entera de -2342.46) a base 2. Entonces 36 menos
12 queda 24, que debe ser el número de multiplicaciones que se deben hacer para terminar
de calcular la mantiza del número dado. Esto es:

1 0.46 * 2 = 0.92 13 0.16 * 2 = 0. 32


2 0.92 * 2 = 1.84 14 0. 32 * 2 = 0.64
3 0.84 * 2 = 1.68 15 0.64 * 2 = 1.28
4 0.68 * 2 = 1. 36 16 0.28 * 2 = 0. 56
5 0. 36 * 2 = 0.72 17 0. 56 * 2 = 1.12
6 0.72 * 2 = 1.44 18 0.12 * 2 = 0.24
7 0.44 * 2 = 0.88 19 0.24 * 2 = 0.48
8 0.88 * 2 = 1.76 20 0.48 * 2 = 0.96
540
9 0.76 * 2 = 1 . 52 21 0.96 * 2 = 1.92
541
10 0. 52 * 2 = 1.04 22 0.92 * 2 = 1.84
11 0.04 * 2 = 0.08 23 0.84 * 2 = 1.68
12 0.08 * 2 = 0.16 24 0.68 * 2 = 1. 36

Entonces 0.4610 es igual a 0.0111010111000010100011112


En tanto que -2342.4610 es igual a 100100100110.011101011100001010001111 2
Paso 3. Luego 100100100110.0111010111000010100011112 escrito en notación mantiza frac-
cionaria y exponente quedaría:

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:

1036 10 es igual a 10000001100 2


Paso 5. Armar la respuesta teniendo en cuenta lo siguiente:
• El primer bit del signo es un 1 por ser negativo.
• 11 bits siguientes del exponente, que son: 10000001100 (resultado del paso 4)
• 36 bits de la mantiza, que son: 110010010000111111001111100000001101 (resultado
paso 3). Pero aquí como el número es negativo se debe tomar éste valor como
complemento a uno. Esto es que se debe cambiar los unos por ceros y viceversa y
así escribir el valor:

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

Especificaciones del problema.

Entradas C: de tipo real

Procesos

Salidas F: Tipo real

Diagrama de
caja negra del
problema
Diagrama de Flujo de Datos

· Programa en Visual Basic. 542


Pr i vate Su b Co m m a n d1_Cl i c ( )
543
D i m F As D o u ble, C As Do u b le

C=Inpu tBox( “D i g i te g ra do s celc iu s” )


F = 9/5* C + 32
Pr i ntf F
En d Su b

· Programa en Lengua C.
#i nc l u d e <stdi o. h >
voi d mai n( ) {
float F, C ;

scanf( “%f ”,& C ) ;


F = 9/5* C + 32 ;
pr i ntf( “%10. 2 f ”, F ) ;
}

· 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

$ stdi n = fo pe n( ‘ p h p : //std in’, ‘ r ’ );


fscanf( $ stdi n ,”%f ”, $ C ) ;
$ F = 9/5* $ C + 32 ;
e c ho $ F;

?>

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:

De la gráfica se tiene que:

X = 0. 38RCos (36) y Y = 0. 38RSen(36) 544


545
Con base en estas expresiones se calcula el área del triángulo 1 (T1) así:

X*Y 0. 38*RCos(36)*0. 38*r *Sen(36)


T1 = = 0.0343331024R 2
2 2

Ahora el área de triángulo 2 (T2) sería:

W *Y
T2 =
2

Donde:

W=R-X=(R-0. 38RCos(36))=R(1-0. 38Cos(36))=0.6925735421R

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:

Área de la estrella = 10(T1+T2)


= 10(0.0343331402R 2 +0.0773460576R 2 = 1.1167919783R 2
Por lo tanto, la fórmula que hay que programar para calcular el área de la estrella en
función del radio R de la figura es:

Área de la estrella = ADE= 1.1167919783R 2

Entradas R: de tipo real

Procesos ADE = 1.1167919783*R ^ 2

Salidas ADE: Tipo real

Diagrama
de caja
negra del
problema
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

Diagrama de Flujo de Datos


· Programa en Visual Basic.
Pr i vate Su b Co m m a n d1 _Clic ()
Di m R As D o uble, A D E A s D ou b le
R =In putBox( “D i g i te el valor d el ra d io” )
A D E = 1.116791978 3 * R ^ 2
Pr i n tf A D E

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

Si X>0 y Y>0 entonces escribir X, Y


Procesos Si X>0 y Z>0 entonces escribir X, Z
Si Y>0 y Z>0 entonces escribir Y, Z

Salidas XyYoXyZoYyZ

Diagrama de
caja negra del
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

problema

Diagrama de Flujo de Datos

· Programa en Visual Basic.


Pr i vate Su b Co m m a n d1_Cl i c ( )
D i m X A s D o uble, Y As D o u b le, Z A s D ou b le
X=In putBox( “D i g i te e l valor d e X”)
Y =In putBox( “D i g i te e l valor d e Y”)
Z=In putBox( “D i g i te e l valor d e Z”)
IF X > 0 AN D Y > 0 T h en Prin t f X, Y
IF X > 0 AN D Z > 0 T h en Prin t f X, Z
IF Y > 0 A N D Z > 0 T h en Pri n t f Y, Z

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());

if(X > 0 && Y > 0 ) Sys te m .o u t . p r intln (“ ” +X+ ”, ” +Y );


if(X > 0 && Z > 0 ) Sys te m .o u t . p r intln(“ ” +X+ ”, ” +Z );
if(Y > 0 && Z > 0 ) Sys te m .o u t . p r intln(“ ” +Y+ ”, ” +Z ); 548
} 549
}
· Programa en Python.
X = input(‘Digite el valor d e X)
Y = input(‘Digite el valor d e Y )
Z = input(‘Digite el valor d e Z )

if X > 0 and Y > 0:


print X, Y
if X > 0 and Z > 0:
print X, Z
if Y > 0 and Z > 0:
print Y, Z
· Programa en JavaScript.
<HTML>
<BODY>
<SCRIPT>
var X, Y, Z;
X = Number( p ro m p t(“ Di gi te el valo r d e X” ));
Y = Number(p ro m p t(“ Di gi te el valo r d e Y ” ));
Z = Number(p ro m p t(“ Di gi te el valo r d e Z ” ));
If(X > 0 && Y > 0) d o cu m e nt .w r ite(X, “, “, Y );
If(X > 0 && Z > 0) d o cu m e nt .w r ite(X, “, “, Z );
If(Y > 0 && Z > 0) d o cu m e nt .w r ite (Y, “, “, Z );
</SCRIPT>
</BODY>
</HTML>
· Programa en PHP.
<? p h p
$ stdi n = fo pe n( ‘ p h p : //std in’, ‘ r ’ );
fscanf( $ stdi n ,”%f ”, $X) ;
fscanf( $ stdi n ,”%f ”, $Y ) ;
fscanf( $ stdi n ,”%f ”, $Z) ;

i f( $X > 0 a n d $Y > 0) e c ho $X ,’, ‘, $Y;


i f( $X > 0 a n d $Z > 0) e c h o $X ,’, ‘, $Z ;
i f( $Y > 0 a n d $Z > 0) e c h o $Y,’, ‘, $Z;

?>

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.

Especificaciones del problema.


Fundamentos de lógica para programación de computadores · Ejercicios resueltos

DH: de tipo real DN: de tipo real


Entradas MD: de tipo real MN: de tipo real
AH: de tipo real AN: de tipo real

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)

Salidas TDV: de tipo real

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

D H =In putBox( “D i g ite el d ía d e hoy” )


MH =In putBox( “D i g ite el m es d e hoy” )
A H =In putBox( “D ig ite el a ño d e hoy” )
D N=In putBox( “D i g ite el d ía d e na c im iento” )
MN=In putBox( “D ig ite el m es d e na c im iento” )
A N=In putBox( “D ig ite el a ño d e na c im iento” )

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.

X1: de tipo real Y2: de tipo real


Entradas Y1: de tipo real X3: de tipo real
X2: de tipo real Y3: de tipo real
d10 = (X1^2 + Y1^2) ^ 0.5, d20 = (X2^2 + Y2^2) ^ 0.5, d30 = (X3^2 + Y3^2) ^ 0.5

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

d12 = ((X2 – X1) ^ 2 + (Y2 – Y1) ^ 2) ^ 0.5


Procesos
d23 = ((X3 – X2) ^ 2 + (Y3 – Y2) ^ 2) ^ 0.5

d31 = ((X1 – X3) ^ 2 + (Y1 – Y3) ^ 2) ^ 0.5

P = (d12 + d23 + d31)/2 554


A = (P * (P – d12) * (P – d23) * (P – d31)) ^ 0.5, 555
Perímetro = 2 * P

Salidas D: de tipo real o A y Perímetro

Diagrama
de caja
negra del
problema
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

Diagrama de Flujo de Datos.


• Programa en Visual Basic.
Pr i vate Su b Co m m a n d 1 _Clic ()
D i m X1 As D o uble, X 2 A s D ou b le, X 3 A s D ou b le
D i m Y1 A s D o uble, Y2 A s D ou b le, Y3 A s D ou b le
D i m m1 A s D o uble, m 2 A s D ou b le, P A s D ou b le
D i m d12 A s D o uble, d 23 A s D ou b le, d 31 A s D ou b le
D i m d10 A s D o uble, d 2 0 A s D ou b le, d 3 0 A s D ou b le
D i m Pe r í m e tro As D o u b le, A A s D ou b le, d A s D ou b le

X1 =In putBox( “D i g ite X1 ” )


Y1=In putBox( “D i g ite Y1 ” )

X2 =In putBox( “D i g ite X 2 ” )


Y2 =In putBox( “D i g ite Y2 ” )

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 ;

s can f( “%f ”,& X1 );


s can f( “%f ”,&Y1 );

s can f( “%f ”,& X 2 );


s can f( “%f ”,&Y3 );

s can f( “%f ”,& X 3 );


s can f( “%f ”,&Y3 );

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

d10 = po w(p ow(X1 , 2 ) + p ow(Y1 , 2 ), 0 . 5 );


d2 0 = po w( p ow(X 2 , 2 ) + p ow(Y2 , 2 ), 0 . 5 );
d3 0 = po w(p ow(X 3 , 2 ) + p ow(Y3 , 2 ), 0 . 5 );
i f ( d10 < d 2 0 & & d 1 0 < d 3 0 ) {
i f ( d2 0 < d 3 0 ) {
d = p ow( p ow(X 3 – X1 , 2 ) + p ow(Y3 – Y1 , 2 ),0 . 5 );
}
el s e {
d = p ow( p ow(X 2 – X1 , 2 ) + p ow(Y2 – Y1 , 2 ),0 . 5 );
}
}
el s e {
i f ( d2 0 < d 1 0 & & d 2 0 < d 3 0 ) {
i f (d 1 0 < d 3 0 ) {
d = p ow(p ow(X 3 – X 2 , 2 ) + p ow(Y3 – Y2 , 2 ),0 . 5 );
}
el s e {
d = p ow(p ow(X1 – X 2 , 2 ) + p ow(Y1 – Y2 , 2 ),0 . 5 );
}

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;

X1 = D o u ble. parse Do u ble(lee.rea d L in e());


Y1 = Do u ble. parse Do u ble(lee.rea d Lin e());

X2 = D o u ble. parse Do u ble(lee.rea d Lin e());
Y2 = Do u ble. parse D o u ble(lee.rea d L in e());

X3 = Do u ble. parse Do u ble(lee.rea d Lin e());


Y3 = D o u ble. parse Do u ble(lee.rea d Lin e());

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

i f d10 < d2 0 a n d d 1 0 < d 3 0 :


i f d2 0 < d 3 0 :
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

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

pr i n t “La di sta n c ia d e la rec ta es”, d


e lse :
d12 = ( ( X2 – X1 ) ** 2 + (Y2 – Y1 ) ** 2 ) * * 0 . 5
d23 = ( ( X3 – X 2 ) * * 2 + (Y3 – Y2 ) ** 2 ) * * 0 . 5
d31 = ( ( X1 – X 3 ) ** 2 + (Y1 – Y3 ) * * 2 ) * * 0 . 5
P = ( d12 + d 23 + 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 ím et ro d el t r iá ngu lo es”, Pr im ero


• Programa en JavaScript.
< HTML>
< B O DY >
<SC R IPT >
var X1, X2 , X3 ;
var Y1, Y2 , Y3 ;
var m1, m 2 , P
var d12 , d23 , d31;
var d10 , d2 0 , d3 0;
var Pe r í m e tro, A , d;

X1 = Nu mbe r( pro mpt( “D i g i te X1 ” ));


Y1 = Nu mbe r( pro mpt( “D i g ite Y1 ” ));

X2 = Nu mbe r(pro mpt( “D i g ite X 2 ” ));


Y2 = Nu mbe r(pro mpt( “D i g ite Y2 ” ));

X3 = Nu mbe r( pro mpt( “D i g ite X 3 ” ));


Y3 = Nu mbe r(pro mpt( “D i g ite Y3 ” ));

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 ’ );

fscanf( $ stdi n ,”% f ”, $X1 );


fscanf( $ stdi n ,”% f ”, $Y1 );

fscanf( $ stdi n ,”% f ”, $X 2 );


fscanf( $ stdi n ,”% f ”, $Y2 );

fscanf( $ stdi n ,”% f ”, $X 3 );


fscanf( $ stdi n ,”% f ”, $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 ;
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

i f ( $ d10 < $ d 2 0 a n d $d 1 0 < $d 3 0 ) {


i f ( $ d2 0 < $d 3 0 ) {
$ d = (($X 3 – $X1 ) ** 2 + ($Y3 – $Y1 ) * * 2 ) * * 0 . 5 ;
}
el s e {
$ 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 ) {
i f ( $ d 1 0 < $d 3 0 ) {
$ d = (($X 3 – $X 2 ) * * 2 + ($Y3 – $Y2 ) * * 2 ) * * 0.5;
}
el s e {
$ d = (($X1 – $X 2 ) ** 2 + ($Y1 – $Y2 ) ** 2 ) * * 0.5;
}
e l se {
i f ( $ d 1 0 < $d 2 0 ) {
$ d = (($X 2 – $X 3 ) * * 2 + ($Y2 – $Y3 ) * * 2 ) * * 0.5;
}
el s e {
$ d = (($X1 – $X 3 ) * * 2 + ($Y1 – $Y3 ) * * 2 ) * * 0.5;
}
}
ech o “La di s ta nc ia d e la rec ta es”, d ;
}
e l se {
$ d12 = ( ( $X2 – $X1 ) ** 2 + ($Y2 – $Y1 ) * * 2 ) * * 0 . 5 ;
$ d23 = ( ( $X3 – $X 2 ) * * 2 + ($Y3 – $Y2 ) ** 2 ) * * 0 . 5 ;
$ d31 = ( ( $X1 – $X 3 ) ** 2 + ($Y1 – $Y3 ) * * 2 ) * * 0 . 5 ;
$ P = ( $ d12 + $d 23 + $d 31 )/2 ;
$A = ( $ P * ( $P – $d 1 2 ) * ($P – $d 23 ) * ($P – $d 31 )) * * 0 . 5 ;
$ Pe r i m e tro = 2 * $P;
ech o “El á rea d e t r iá ngu lo es”, $A ;
ech o “El p e r ím et ro d el t r iá ngu lo es”, $Pr im ero;
}
?>
Capítulo 4
Ejercicio 5.
Realizar un algoritmo para determinar el promedio de todos los números pares, de los
impares, de los múltiplos de 3 y de los múltiplos 5 que hay desde el 1000 hasta 2.
Especificaciones del problema.

Entradas No hay

Si N mod 2 = 0 entonces N es par


Si N mod 2 <> 0 entonces N es impar
Si N mod 3 = 0 entonces N es múltiplo de 3
Si N mod 5 = 0 entonces N es múltiplo d 5
Procesos
Suma de pares: SP Promedio pares: SP/500
Suma de impares: SI Promedio pares: SI/499
Suma de múltiplos de 3: SM3 Promedio pares: SM3/333
Suma de múltiplos de 5: SM5 Promedio pares: SM5/200

Salidas SP/CP, SI/CI, SM3/CM3, y SM5/CM5

Diagrama 562
de caja 563
negra del
problema
Diagrama de Flujo de Datos
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

• Programa en Visual Basic.


Pr i vate Su b Co m m a n d1_Clic k ()
D i m C As Inte ge r, SP A s I n te ge r, S I A s I n te ge r, SM3 A s I n te ge r, SM5 as I n te ge r

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

pr i nt SP/5 0 0, “, “, SI/499, “, “, SM 3/3 3 3 ,”, ”, SM 5/2 0 0


• Programa en JavaScript.
<H TML>
<B O DY >
<SC R IPT >
var C = ne w Nu m b e r();va r S P = n e w N um b e r(); va r S I = n e w N um b e r();
var SM3 = ne w Num b e r(); va r SM 5 = n e w N um b e r();
C = 0 ; SP = 0; SI = 0 ;
SM3 = 0; SM5 = 0 ;
do {
if (C % 2 == 0) SP = SP + C;
e lse SI = SI + C ;
i f ( C % 3 = = 0 ) SM 3 = DM 3 + C ;
i f ( C % 5 = = 0 ) SM 5 = DM 5 + C ;
C = C + 1;
} whi le ( C > 1) ;
d o cu me nt .wr i te (S P/5 0 0 ,”, “, S I /499, “, “, SM 3/3 3 3 ,”, “, SM 5/2 0 0 );
</ SC R IPT >
</ B O DY >
</ H TML>
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

• 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.

Entradas N: de tipo entero

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

n = Input B ox(“ D ig ite el valor d e N ” )


If n >0 A n d n<1 0 0 T h e n
i = 1
Do
Prin t i,” ^ 3 = “
k = i*(i-1 )+1
c = 0
j = 0
Do
I f i< >1 T h e n
Prin t k ,” + “
c = c+ k
k = k+2
j = j+1
En d I f
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

Loop U n t il j> i-2


Prin t k ,” = “,c+ k
i = i+1
Lo o p U n t il i> n
El se
Pr i n t “ Da to no válid o”
End If
End Su b

• 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;

pr i n tf( “ D ig ite el valor d e N ” );


s can f( “% f ”,&n);
i f ( n >0 A n d n<1 0 0 ) {
i = 1;
do {
p rin t f (“ % 4 d ^ 3 = “,1 );
k = i*(i-1 )+1 ;
c = 0;
j = 0;
do {
if (i< >1 ) {
p rin t f (“ % 4 d + “, k );
c += k;
k += 2;
j ++;
}
} w h ile (j < = i-2 );
p rin t f (“ % 4 d = % 4 d ”, k ,c+ k );
i ++;
} w hile (i< = n);
e l se
Pr i n t (“ Da to no válid o” );
}
• Programa en Java.
i mpo r t j ava . i o.* ;
pu bli c c lass j e rc i c i o15 {
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 c , I, j , k, n ;
Syste m.o u t . pr i ntln ( “ D ig ite el valor d e N ” );
n = Inte ge r. parse Int (lee.rea d Lin e ());
i f ( n >0 And n <100) {
i = 1;
do {
Syste m.o u t . p rin t (“ ” + i + ” ^ 3 = “ );
k = i * ( i -1) + 1 ;
c = 0;
j = 0;
do {
i f ( i <>1) {
Syste m .out . p rin t (“ ” + k + “ + “ );
c += k;
k += 2;
j ++;
}
} whi le ( j <=i-2 ); 568
Syste m.o u t . p rin tl n (“ ” + k+ “ = “ + c+ k ); 569
i ++;
} w h i le ( i <= n ) ;
e lse
Syste m.o u t . pr i ntl n (“ Da to no válid o” );
}

• 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 :

p r i n t “Da to n o vál i do”


• Programa en JavaScript
<H TML>
<B O DY >
<SC R IPT >
var n = n e w N um b e r();
var i = n e w N um b e r();
var j = n e w N um b e r();
var k = n e w N um b e r();
var c = n e w N um b e r();

n = N um b e r ( p rom p t (“ D ig ite el valor d e N ”, 3 ));


i f ( n > 0 && n<1 0 0 ) {
i = 1;
do {
d ocum e n t .w rite (i,” ^ 3 = “ );
k = i*(i-1 )+1 ;
c = 0;
j = 0;
do {
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

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 ’ ) ;

e c ho ‘ D i g i te e l valo r de N ‘ ; fs ca n f ($s td in,” % d ”, $n);


i f ( $ n >0 & & $ n <100) {
$ i = 1;
do {
e c ho $ i ,’ ^3 = ‘ ;
$ k = $ i * ( $ i -1) +1;
$c = 0;
$ j = 0;
do {
i f ( $ i ! =1) {
e c ho $ k,’ + ‘;
$ c = $ c+$ k;
$ k = $ k+2 ;
$ j = $ j +1;
}
} whi le ( $ j <= $ i -2 ) ;
e c ho $ k,’ = ‘, $ c+$ k, P H P_EO L;
$ i = $ i +1; 570
} whi le ( $ i <= $ n ) ; 571
}
e lse
e c ho ‘ Da to n o vál i do’, P H P_EO L;

?>

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

Especificaciones del problema.

n: de tipo entero. Debe ser tomado como reemplazo de infinito


Entradas
que está en la fórmula

i=i+1
Procesos s = s + (-1)^i/(2*i + 1)
s=4*s

Salidas s: de tipo real

Diagrama
de caja
negra del
problema
Diagrama de Flujo de Datos.
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

• Programa en Visual Basic.


Pr i vate Su b Co m m a n d1_Cl i c k ()
Di m i As Inte ge r, n As In te ge r, s A s D oub le
n = Inpu tBox ( “D i g i te e l valor d e N ” )
i = 0: s = 0
Do
s = s + ( -1) ^ I / ( 2 * I + 1 )
i = i +1
Lo o p U nti l i > n
Pr i nt “El valo r de P I e s “,4* s

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

Año1: 10.000.000 (1 + 0.02) = 10.200.000


Año2: (10.200.000 + 10.000.000) (1 + 0.02) = 20.604.000
Año3: (20.604.000 + 10.000.000) (1 + 0.02) = 31.216.080
Año4: (31.216.080 + 10.000.000) (1 + 0.02) = 42.040.401,60

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 mpo r t j ava . i o.* ;


pu bli c c lass E j e rc i c i o3 5 {
pu bl i c stati c vo i d ma 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));
d o u ble I, i nv, k, mi,
i nt N_ Año s;

Syste m.o u t . pr i nt (“ D ig ite el ca pital K “ );


k = Do u ble. parseD oub le (lee.rea d L in e ());
Syste m.o u t . pr i nt (“ D ig ite la tasa d e interés i” );
i = Do u ble. parseD oub le (lee.rea d Lin e ());
Syste m.o u t . pr i nt (“ D ig ite el m onto d e invers ión a alca nza r “ );
m i = Do u ble. pars e D oub le (lee.rea d L in e ());

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

pr i nt “El núm e ro de año s es “, N _Años


• Programa en JavaScript.
<H TML>
<B O DY >
<SC R IPT >
var i nv = ne w Nu m b e r(); va r N _A ños = n e w N um b e r();
var k = ne w Nu mb e r(); va r i = n e w N um b e r(); va r m i = n e w N um b e r();

k = Nu mbe r (pro m p t (“ D ig ite el ca pital K “ ));


i = Nu mbe r (pro m p t (“ D ig ite la tasa d e interés i” ));
m i = Nu mbe r (prom p t (“ D ig ite el m onto 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ños + 1 ;
} whi le ( i nv <= m i );
d o cu me nt .wr i te (“ El núm ero d e añ os es “, N _Años ,’ < 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 ( $ 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.

Entradas N: de tipo entero

s=0
Procesos s = s + n Mod 10
n = Trunc(n/10)

Salidas s: de tipo entero

Diagrama
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

de caja
negra del
problema

Diagrama de Flujo de Datos.


• Programa en Visual Basic.
Pr i vate Su b Co m m a n d1_Cl i c k ()
Di m n As Do u ble, s A s D oub le, k A s D oub le
n = i ntpu t ( “D i g i te e l nú m ero N ” )
s = 0
Do
s = s + n Mo d 10
n = i n t( n / 10 )
Lo o p Un ti l n = 0
Pr i nt “La sum a de lo s d íg itos es “, s

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 )

pr i nt “La sum a de lo s di g i tos es “, s


• Programa en JavaScript.
<H TML>
<B O DY >
<SC R IPT >
var s = ne w Nu mb e r(); va r n = n e w N um b e r();
n = Nu mbe r ( prom p t (“ D ig ite el nú m ero “ ));
s = 0;
do {
s = s+ n %10;
n = Ma th .tr unc (n/1 0 );
} whi le ( n ! = 0 ) ;
d o cu me nt .wr i te (“ La s u m a d e los d ig itos es “, 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 ( $ s,’ i n te ge r ’ ) ; se t ty p e ($n,’ integer ’ );
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

e c ho ‘ D i g i te e l n úm e ro ‘ ; fs ca n f ($s td in,” % d ”, $n);


$ s = 0;
do {
$ s = $ s+$ n %10;
$ n = $ n /10;
} whi le ( $ n ! = 0 ) ;
e c ho ‘ La sum a de lo s di g itos es ‘, $s , P H P_EO L;

?>

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.

Entradas N: de tipo entero

spar = spar + Arr[i]


Procesos simp = simp + Arr[i]
i=i+1

spar: de tipo entero


Salidas
simp: de tipo entero

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

n = Inpu ntBox( “D i g i te e l número d e d a tos a ing resa r ” )

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

pr i ntf( “La sum a de los im pa res es % f \n”, s im p);

• 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

Entradas f: de tipo string; p: de tipo string;

lf=Longitud(f); lp =Longitud(p); frase[i]=Subcadena(f,i,i); pala-


Procesos
bra[j]=Subcadena(p,j,j); n_o = n_o + 1

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( ) ;

f = pro mpt( “D i g i te u na fres e d e has ta 1 0 0 0 ca ra c teres” );


l f = f.le ng th;
i f ( l f < 1000) {
p = pro mpt( “D i gite 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 (lp < 20) {
fo r ( i = 0; i <lf; i+ + ) fras e[ i] = f.s ub s t r(i,1 );
fo r ( j = 0; j <lp; j+ + ) pala bra [ j] = p.s ub s t r(j,1 );
n _o = 0 ;
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

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 ’ );

e c ho ‘ D i g i te un a f re se de h as ta 1 0 0 0 ca ra c teres ‘ ; $f =rt rim ( f ge t s($s td in), P H P_EO L);


$ l f = str le n( $f ) ;
i f ( $ l f <1000) {
e c ho ‘ 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 ‘ ; $p=r-
tr i m(fge ts( $ stdi n ) , P H P_ EO L);
$ l p = str le n( $ p ) ;
i f ( $ l p <2 0) {
fo r ( $ i = 0 ; $ i <$ l f ; $ i ++ ) $fras e[ $i] = s ub s t r($f, $i,1 );
fo r ( $ j = 0 ; $ j <$ l p ; $ j ++ ) $pala bra [ $j] = s ub s t r($p, $j,1 );
$ n _o = 0 ;
fo r ( $ i = 0 ; $ i <$ l f-$ l p +1 ; $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 ;
}
e c ho ‘e l n úm e ro de ocu r renc ias d e ‘, $p,’ en la fras e es d e ‘, $n_o, P H P_EO L; 590
} e lse { 591
e c ho ‘ D i g i tó un a pala bra d e más d e 2 0 ca ra c teres’, P H P_EO L;
}
} e l se {
e c ho ‘ D i g i tó un a f re se d e más d e 1 0 0 0 ca ra c teres’, P H P_EO L;
}

?>

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:

B: Lo ng i tu d d e la se pa ra c ion e s re gula re s o in te rvalo d e las m e d id as .

H 0 , H 1 , H 2 , . . . , H N : So n las N m e d id as tom a d as pa ra las n orm ale s .

H0 H
Área = B ( + H 1 + H 2 + ••• + n )
2 2
Especificaciones del problema.

Entradas n: de tipo entero, h(n): de tipo real, b: de tipo real

área = h(0)/2
área = h(n-1)/2
Procesos
área = área + h[i]
i=I+1

Salidas área: de tipo real

Diagrama de
caja negra del
problema

Diagrama de Flujo de Datos.


Fundamentos de lógica para programación de computadores · Ejercicios resueltos
• Programa en Visual Basic.
Pr i vate Su b Co m m a n d1_Cl i ck ()
D i m n As Inte ge r, i As In te ge r, b A s S in g le, á rea A s S in g le, h() A s S in g le

n = Inpu tBox( “D i g i te ca n t id a d d e m ed id as” )


Re D i m h ( n )
Fo r i = 1 To n
h ( i ) = Inpu tBox( “D i g ite la m ed id a h[ “ + S t r (i) + “ ] ” )
Nex t i
b = Inpu tBox( “Me di a de s epa ra c iones” )
a rea = h (1) / 2
a rea = a rea + h ( n ) / 2
Fo r i = 2 To n - 1
a rea = a rea + h ( i )
Nex t i
Pr i nt “El a rea de l te r re no es “ + S t r(b * a rea )

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

Syste m.o u t . pr i ntl n(“ El a rea d el ter reno es “ + b*a rea );

• 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 ,” ] “ )

b = i npu t( “Me di a de se pa ra c iones “ )

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:

• Los nombres de las columnas son A, B, C, D y E.


• Los valores en el primer renglón son 0, 1, 2, 3 y 4.
• El valor de la columna A es uno más que el del renglón anterior.
• El valor de la columna B es el valor de la columna A del mismo renglón más dos
unidades.
• El valor de la columna C es la suma de los valores de las columnas precedentes
del renglón anterior.
• El valor de la columna D es la suma entre: el valor absoluto de la diferencia de
las columnas B y C del mismo renglón y el valor absoluto de la diferencia de las
columnas D y E del renglón anterior.
• El valor de la columna E es el valor absoluto de la diferencia entre el valor acumu-
lado de toda la columna E y el valor acumulado de toda la columna A.
Especificaciones del problema.

Entradas No hay

Llenar la tabla con cero.

tabla(0,0)=0, tabla(0,1)=0, tabla(0,2)=0, tabla(0,3)=0, tabla(0,4)=0,

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

tabla(i,2) = tabla(i-1,0) + tabla(i-1,1)


Procesos tabla(i,3) = abs(tabla(i,1) - tabla(i,2)) + abs(tabla(i-1,3) - tabla(i-1,4))

suma_e = tabla(0,4)

suma_e = suma_e + tabla(j,4)

suma_a = tabla(0,0)

suma_a = suma_a + tabla(j,0)

tabla(i,4) = abs(suma_e - suma_a)

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;
}

pr i ntf( “No. A B C D E\n” );

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 ( j =1; j <= i ; j + =1) sum a _a = s u m a _a+ta bla [ j] [ 0 ] ;


ta b la [i ][4 ] = a b s( sum a_e- s u m a _a );
}

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

Syste m.o u t . pr i ntln( “N o. 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 =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 ] ;

fo r ( j =1; j <= i -1; j + + ) {


sum a _e = sum a _e+ta bla [ j] [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 ] ;
}

ta b la [i ][4 ] = M ath . a b s(s u m a _e- s u m a _a );


}

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( )

ta b la = [[i nt( ) fo r i i n range(5 )] for j in ra n ge(3 0 )]

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 ]

ta b la [i ][4 ] = abs( sum a _e- s u m a _a )

fo r i i n range( 3 0 ) :

pr i nt i ,ta b la [i ][0], ta b la[ i] [1 ] , ta bla [ i] [ 2 ] , ta bla [ i] [ 3 ] , ta bla [ i] [4 ] ,4 ,0


• Programa en JavaScript.
<H TML>
<B O DY >
<SC R IPT >
var i = ne w Nu m b e r();
var j = ne w Nu m b e r();
var sum a _a = n e w N um b e r();
var sum a _e = n e w N um b e r();

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

d o cu me nt .wr i te (“ N o. A B C D E ”,’ < BR/> ’ );


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 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 ] ;

ta b la [i ][4 ] = Ma t h . a b s(s u m a _e- s u m a _a );


}

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 ] ;

$ ta b la [$ i ][4 ] = abs( $ suma _e - $s u m a _a );


}

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.

Entradas MC(4,3): de tipo real

Hallar valores unitarios de los vectores


MV(f-1,0) = MC(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)
Procesos

Hallar producto cruz entre vectores para obtener áreas


oaxob=((MV(0,1)*MV(1,2) - MV(0,2)*MV(1,1))^2+(-(MV(0,0)*MV(1,2) -
MV(0,2)*MV(1,0)))^2 + (MV(0,0)*MV(1,1) - MV(0,1)*MV(1,0))^2)^0.5

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

obxoc=((MV(1,1)*MV(2,2) - MV(1,2)*MV(2,1))^2+(-(MV(1,0)*MV(2,2) - MV(1,2)*M-


V(2,0)))^2+(MV(1,0)*MV(2,1) - MV(1,1)*MV(2,0))^2)^0.5
Procesos
604
Hallar el determinante de MV 605
pivote = MV(d,d)
aux = MV(f,d)
MV(f,c) = MV(f,c) - (MV(d,c)*(aux/pivote))

“Área total = ”, 2*(oaxob+oaxoc+obxoc)


Salidas
“Volumen = ”, abs(MV(0,0)*MV(1,1)*MV(2,2))

Diagrama
de caja
negra del
problema
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

Diagrama de flujo de datos.


• Programa en Visual Basic.
Pr i vate Su b Co m m a n d 1 _Clic k ()
Di m a ux As Do u ble, pivote A s D oub le
Di m oa xo b As D o u b le, oa xoc A s D oub le, o bxo c A s D oub le
Di m c As Inte ge r, d A s I n te ge r, f A s I n te ge r
Di m m c (4 , 3 ) As D oub le, mv(3 , 3 ) A s D oub le

m c (1, 1) = Inpu tBox(“ Pu nto d e or igen Coord ena d a X ” )


m c (1, 2 ) = Inpu tBox(“ Pu nto d e or igen Coord ena d a Y ” )
m c (1, 3 ) = Inpu tBox(“ Pu nto d e or igen Coord ena d a Z ” )

m c ( 2 , 1) = Inpu tBox(“ Coord ena d a X vec tor A” )


m c ( 2 , 2 ) = Inpu tBox(“ Coord ena d a Y vec tor A” )
m c ( 2 , 3 ) = Inpu tBox(“ Coord ena d a Z vec tor A” )

m c ( 3 , 1) = Inpu tBox(“ Coord ena d a X vec tor B” )


m c ( 3 , 2 ) = Inpu tBox(“ Coord ena d a Y vec tor B” )
m c ( 3 , 3 ) = Inpu tB ox(“ Coord ena d a Z vec tor B” )

m c (4 , 1) = Inpu tBox(“ Coord ena d a X vec tor C ” )


m c (4 , 2 ) = Inpu tB ox (“ Coord ena d a Y vec tor C ” )
m c (4 , 3 ) = Inpu tBox(“ Coord ena d a Z vec tor C ” )

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

oa xo b = ( ( mv (1, 2 ) * mv(2 , 3 ) - mv(1 , 3 ) * mv(2 , 2 )) ^ 2 + _


( -( mv (1, 1) * mv(2 , 3 ) - mv(1 , 3 ) * mv(2 , 1 ))) ^ 2 + _
( mv (1, 1) * mv(2 , 2 ) - mv(1 , 2 ) * mv(2 , 1 )) ^ 2 ) ^ 0 . 5

oa xo c = ( ( mv (1, 2 ) * mv(3 , 3 ) - mv(1 , 3 ) * mv(3 , 2 )) ^ 2 + _


( -( mv (1, 1) * mv(3 , 3 ) - mv(1 , 3 ) * mv(3 , 1 ))) ^ 2 + _
( mv (1, 1) * mv(3 , 2 ) - mv(1 , 2 ) * mv(3 , 1 )) ^ 2 ) ^ 0 . 5

o bxo c = ( ( mv ( 2 , 2 ) * mv(3 , 3 ) - mv(2 , 3 ) * mv(3 , 2 )) ^ 2 + _


( -( mv ( 2 , 1) * mv(3 , 3 ) - mv(2 , 3 ) * mv(3 , 1 ))) ^ 2 + _
( mv ( 2 , 1) * mv(3 , 2 ) - mv(2 , 2 ) * mv(3 , 1 )) ^ 2 ) ^ 0 . 5

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

Pr i nt “A rea to tal = “, 2 * (oa xob + oa xoc + obxoc )


Pr i nt “ Vo l um e n = “, A b s(mv(1 , 1 ) * mv(2 , 2 ) * mv(3 , 3 ))

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 ]

pr i ntf( “D IGIT E LO S DATO S PARA E L P U N TO D E O RI G E N D E LO S V ECTO-


R ES\ n”) ;
pr i ntf( “Pun to de o r igen Coord ena d a X “ );s ca n f(“ % f ”,&m c [ 0 ] [ 0 ] );
pr i ntf( “Pun to de o r igen Coord ena d a Y “ );s ca n f(“ % f ”,&m c [ 0 ] [1 ] );
pr i ntf( “Pun to de o r igen Coord ena d a Z “ );s ca n f(“ % f ”,&m c [ 0 ] [ 2 ] );
pr i ntf( “\ n”) ;

pr i ntf( “D IGIT E L A S CO O RD E N ADAS D E LLEG A DA D E L V ECTO R A\n” );


pr i ntf( “Co o rde n a da X vec tor A” ); s ca n f(“ % f ”,&m c [1 ] [ 0 ] );
pr i ntf( “Co o rde n a da Y vec tor A” );s ca n f(“ % f ”,&m c [1 ] [1 ] );
pr i ntf( “Co o rde n a da Z vec tor A” );s ca n f(“ % f ”,&m c [1 ] [ 2 ] );
pr i ntf( “\ n”) ;
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

pr i ntf ( “D IGIT E L A S CO O RD E N ADAS D E LLEG ADA D E L V ECTO R B\n” );


pr i ntf( “Co o rde n a da X vec tor B” ); s ca n f(“ % f ”,&m c [ 2 ] [ 0 ] );
pr i ntf( “Co o rde n a da Y vec tor B” );s ca n f(“ % f ”,&m c [ 2 ] [1 ] );
pr i ntf( “Co o rde n a da Z vec tor B” );s ca n f(“ % f ”,&m c [ 2 ] [ 2 ] );
pr i ntf( “\ n”) ;

pr i ntf( “D IGIT E L A S CO O RD E N ADAS D E LLEG A DA D E L V ECTO R C\n” );


pr i ntf( “Co o rde n a da X vec tor C ” );s ca n f(“ % f ”,&m c [ 3 ] [ 0 ] );
pr i ntf( “Co o rde n a da Y vec tor C ” );s ca n f(“ % f ”,&m c [ 3 ] [1 ] );
pr i ntf( “Co o rde n a da Z vec tor C ” );s ca nf (“ % f ”,&m c [ 3 ] [ 2 ] );
pr i ntf( “\ n”) ;

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 ] ;
}

oa xo b = p o w ( ( p o w ((mv[ 0 ] [1 ] *mv[1 ] [ 2 ] - mv[ 0 ] [ 2 ] *mv[1 ] [1 ] ), 2 )+


p o w ( ( -( mv [0 ][0]* mv[1 ] [ 2 ] - mv[ 0 ] [ 2 ] * mv[1 ] [ 0 ] )), 2 )+
p o w ( ( mv [0 ][0]* mv[1 ] [1 ] - mv[ 0 ] [1 ] * mv[1 ] [ 0 ] ), 2 )),0 . 5 );
oa xo c = p o w ( ( p o w ( (mv[ 0 ] [1 ] * mv[ 2 ] [ 2 ] - mv[ 0 ] [ 2 ] * mv[ 2 ] [1 ] ), 2 )+
p o w ( ( -( mv [0 ][0] *mv[ 2 ] [ 2 ] - mv[ 0 ] [ 2 ] * mv[ 2 ] [ 0 ] )), 2 )+
p o w ( ( mv [0 ][0]* mv[ 2 ] [1 ] - mv[ 0 ] [1 ] * mv[ 2 ] [ 0 ] ), 2 )),0 . 5 );

o bxo c = p o w ( ( p o w ((mv[1 ] [1 ] * mv[ 2 ] [ 2 ] - mv[1 ] [ 2 ] *mv[ 2 ] [1 ] ), 2 )+


p o w ( ( -( mv [1][0 ] * mv[ 2 ] [ 2 ] - mv[1 ] [ 2 ] *mv[ 2 ] [ 0 ] )), 2 )+
p o w ( ( mv [1][0 ]* mv[ 2 ] [1 ] - mv[1 ] [1 ] *mv[ 2 ] [ 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));
}
}
}

pr i ntf( “A rea to tal = % 6 . 2 f\n”, 2 * (oa xob+ oa xoc+ obxoc ));


pr i ntf( “ Vo l um e n = % 6 . 2 f\n”,a b s(mv[ 0 ] [ 0 ] *mv[1 ] [1 ] * mv[ 2 ] [ 2 ] ));
}
• Programa en Java.
import java.io.*;
public class Ejercicio45 {
public static void main(String[ ] args)throws IOException {
BufferedReader lee = new BufferedReader (new InputStreamReader (System.in));
double pivote, aux, oaxob, oaxoc ,obxoc; int c , d, f;
double mc[][] = new double[4][3]; double mv[][] = new double[3][3];
System.out .println(“DIGITE LOS DATOS PARA EL PUNTO DE ORIGEN DE LOS VECTORES”);
System.out .print(“Punto de origen Coordenada X “);
mc[0][0] = Double.parseDouble(lee.readLine());
System.out .print(“Punto de origen Coordenada Y “);
mc[0][1] = Double.parseDou ble(lee.readLine());
System.out .print(“Punto de origen Coordenada Z “);
mc[0][2] = Double.parseDou ble(lee.readLine());
System.out .println(“”);
System.out .println(“DIGITE LAS COORDENADAS DE LLEGADA DEL VECTOR A”);
System.out .print(“Coordenada X vector A “);
mc[1][0] = Double.parseDou ble(lee.readLine());
System.out .print(“Coordenada Y vector A “);
mc[1][1] = Double.parseDouble(lee.readLine());
System.out .print(“Coordenada Z vector A “);
mc[1][2] = Double.parseDouble(lee.readLine());
System.out .println(“”);
System.out .println(“DIGITE LAS COORDENADAS DE LLEGADA DEL VECTOR B”);
System.out .print(“Coordenada X vector B “);
mc[2][0] = Double.parseDouble(lee.readLine());
System.out .print(“Coordenada Y vector B “);
mc[2][1] = Double.parseDouble(lee.readLine()); 608
System.out .print(“Coordenada Z vector B “);
mc[2][2] = Double.parseDouble(lee.readLine()); 609
System.out .println(“”);
System.out .println(“DIGITE LAS COORDENADAS DE LLEGADA DEL VECTOR C”);
System.out .print(“Coordenada X vector C “);
mc[3][0] = Double.parseDouble(lee.readLine());
System.out .print(“Coordenada Y vector C “);
mc[3][1] = Double.parseDouble(lee.readLine());
System.out .print(“Coordenada Z vector C “);
mc[3][2] = Double.parseDouble(lee.readLine());
System.out .println(“”);
for (f=1; f<4; f++) {
mv[f-1][0] = mc[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.pow((Math.pow((mv[0][1]*mv[1][2]-mv[0][2]*mv[1][1]),2)+
Math.pow((-(mv[0][0]*mv[1][2]-mv[0][2]*mv[1][0])),2)+
Math.pow((mv[0][0]*mv[1][1]-mv[0][1]*mv[1][0]),2)),0. 5);
oaxoc = Math.pow((Math.pow((mv[0][1]*mv[2][2]-mv[0][2]*mv[2][1]),2)+
Math.pow((-(mv[0][0]*mv[2][2]-mv[0][2]*mv[2][0])),2)+
Math.pow((mv[0][0]*mv[2][1]-mv[0][1]*mv[2][0]),2)),0. 5);
obxoc = Math.pow((Math.pow((mv[1][1]*mv[2][2]-mv[1][2]*mv[2][1]),2)+
Math.pow((-(mv[1][0]*mv[2][2]-mv[1][2]*mv[2][0])),2)+
Math.pow((mv[1][0]*mv[2 ][1]-mv[1][1]*mv[2][0]),2)),0. 5);
for (d=0;d<3;d++) {
pivote = mv[d][d];
for (f=d+1;f<3;f++) {
aux = mv[f][d];
for (c=0;c<3;c++) {
mv[f][c] = mv[f][c]-(mv[d][c]*(aux/pivote));
}
}
}
System.out .println(“Area total = “+2*(oaxob+oaxoc+obxoc));
System.out .println(“ Volumen = “+Math.abs(mv[0][0]*mv[1][1]*mv[2][2]));
}
}
• Programa en Python.
f = i nt( )
c = i n t( )

m c = [[float( ) fo r c in ra n ge(3 )] for f in ra n ge(4 )]


mv = [[float( ) fo r c in ra n ge(3 )] for f in ra n ge(3 )]

d = float( ) ;
p i v o te = float( ) ;
a ux = float( )
oa xo b = float( ) ;
oa xo c = float( ) ;
o bxo c = float( )

pr i nt “D IGIT E LO S DATO S PARA E L P U N TO D E O RI G E N D E LO S V ECTO RES”


m c [0][0] = float(raw_in p ut(“ Pu nto d e or igen Coord ena d a X “ ))
m c [0][1] = float( raw_in p ut(“ Pu nto d e or igen Coord ena d a Y “ ))
m c [0][2 ] = float(raw_in p ut(“ Pu nto d e or igen Coord ena d a Y “ ))
p r i n t “”

p r i n t “D IGIT E L A S CO O RD E N ADAS D E LLEG A DA D E L V ECTO R A”


m c [1][0] = float( raw_in p ut(“ Coord ena d a X vec tor A “ ))
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

m c [1][1] = float( raw_in p ut(“ Coord ena d a Y vec tor A “ ))


m c [1][2 ] = float( raw_in p ut(“ Coord ena d a Z vec tor A “ ))
p r i n t “”

pr i nt “D IGIT E L A S CO O RD E N ADAS D E LLEG A DA D E L V ECTO R B”


m c [2 ][0] = float(raw_in p ut(“ Coord ena d a X vec tor B “ ))
m c [2 ][1] = float( raw_in p ut(“ Coord ena d a Y vec tor B “ ))
m c [2 ][2 ] = float(raw_in p ut(“ Coord ena d a Z vec tor B “ ))
p r i n t “”

pr i nt “D IGIT E L A S CO O RD E N ADAS D E LLEG A DA D E L V ECTO R C ”


m c [3 ][0 ] = float(raw_in p ut(“ Coord ena d a X vec tor C “ ))
m c [3 ][1] = float( raw_in p ut(“ Coord ena d a Y vec tor C “ ))
m c [3 ][2 ] = float( raw_inpu t (“ Coord ena d a Z vec tor C “ ))pr int “ ”

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 ]

oa xo b = ( ( mv [0 ][1]* mv[1 ] [ 2 ] - mv[ 0 ] [ 2 ] *mv[1 ] [1 ] )**2 +


( -( mv [0][0]* mv [1 ] [ 2 ] - mv[ 0 ] [ 2 ] * mv[1 ] [ 0 ] ))* *2 +
( mv [0][0]* mv [1][1 ] - mv[ 0 ] [1 ] *mv[1 ] [ 0 ] )* *2 )* *0 . 5

oa xo c = ( ( 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

o bxo c = ( ( mv [1][1]* mv[ 2 ] [ 2 ] - mv[1 ] [ 2 ] *mv[ 2 ] [1 ] )* *2 +


( -( mv [1][0]* mv [2 ] [ 2 ] - mv[1 ] [ 2 ] *mv[ 2 ] [ 0 ] ))**2 +
( mv [1][0]* mv [2 ][1 ] - mv[1 ] [1 ] * mv[ 2 ] [ 0 ] )**2 )* *0 . 5

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))

pr i nt “A rea to tal = “, 2 *(oa xob+ oa xoc+ obxoc )


pr i nt “ Vo l um e n = “,a b s(mv[ 0 ] [ 0 ] * mv[1 ] [1 ] * mv[ 2 ] [ 2 ] )
• Programa en JavaScript.
<H TM L>
<B O DY>
<S CRIPT>
var f = n e w Nu mber();
var c = n e w Nu mber();
var d = n e w Nu m ber();

var m c = n e w Ar ray(4 ); fo r (f=0; f< 4 ; f++) { mc[ f] = new Array(3);


}
var mv = n e w Ar ray(3); for (f=0; f<3; f++) { mv[ f] = new Array(3); }

var p i vote = n e w Number();


var au x = n e w Nu mber();
var oaxob = n e w Number();
var oaxoc = n e w Number();
var obxoc = n e w Nu mber();

m c [0 ][0 ] = Nu mb er(pro mpt(“ Pu nto o r igen Co o rden ad a X”,0));


m c [0 ][1 ] = Nu mb er(pro mpt(“ Pu n to o r igen Co o rd enada Y ”,0));
m c [0 ][2 ] = Nu mb e r(prompt(“ Pu nto o r igen Co o rden ad a Z ”,0));

m c [1 ][0 ] = Nu mb e r(pro mpt(“ Co o rd enada X vecto r A”,0));


m c [1 ][1 ] = Nu mb er(prompt(“ Co o rd enada Y vecto r A”,0));
m c [1 ][2 ] = Nu mb er(prompt(“ Co o rd enada Z vecto r A”,0));

m c [2 ][0 ] = Nu mb er(prompt(“ Co o rden ad a X vecto r B”,0));


m c [2 ][1 ] = Nu mb e r(prompt(“ Co o rd enada Y vecto r B”,0));
m c [2 ][2 ] = Nu mb e r(pro mpt(“ Co o rden ad a Z vecto r B”,0)); 610
m c [3 ][0 ] = Nu mb e r(prompt(“ Co o rden ad a X vecto r C ”,0));
611
m c [3 ][1 ] = Nu mb er(pro mpt(“ Co o rd enada Y vecto r C ”,0));
m c [3 ][2 ] = Nu mb e r(prompt(“ Co o rd enada Z vecto r C ”,0));

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);

oaxoc = Math .p o w((Mat h. po w((mv[ 0] [1 ] *mv[ 2] [ 2] - mv[ 0] [ 2] *mv[ 2]


[1 ]) , 2 ) +
Math .p o w( ( -( mv[ 0] [ 0] *mv[ 2] [ 2] - mv[ 0] [ 2] *mv[ 2] [ 0] )),2)+
Math .p o w( ( mv [ 0] [ 0] *mv[ 2] [1 ] - mv[ 0] [1 ] *mv[ 2] [ 0] ),2)),0. 5);

obxoc = Math .p ow((Mat h. pow((mv[1 ] [1 ] *mv[ 2] [ 2] - mv[1 ] [ 2] *mv[ 2]


[1 ]) , 2 ) +
Math .p o w( ( -( mv[1 ] [ 0] *mv[ 2] [ 2] - mv[1 ] [ 2] *mv[ 2] [ 0] )),2)+
Math .p o w( ( mv [1 ] [ 0] *mv[ 2] [1 ] - mv[1 ] [1 ] *mv[ 2] [ 0] ),2)),0. 5);
fo r ( d = 0 ; d <= 2 ; d + +) {
p i vote = mv[d] [ d ] ;
fo r ( f = d +1 ; f <= 2;f++) {
au x = mv[f] [ d] ;
fo r ( c= 0 ; c<=2;c++) {
mv[f ][c] = mv[ f] [ c] - (mv[ d] [ c] *(au x/pivo te));
}
}
}

ale r t( “Area total = “ +(2*(oaxo b+oaxo c+o bxo c)));


ale r t( “ Vol u m e n = “ +Mat h. abs(mv[ 0] [ 0] *mv[1 ] [1 ] *mv[ 2] [ 2] ));
</S CRIPT>
</B O DY>
</H TM L>
• Programa en PHP.
<? p h p
$ stdi n = fo pe n( ‘ p h p : //std in’,’ r ’ );

se ttype ( $f,’ i n te ge r ’ ) ; se tty p e($c ,’ integer ’ );


se ttype ( $ d,’ f loa t’ ) ; se ttyp e($pivote,’ floa t’ ); s e t ty p e ($a u x ,’ floa t’ );
se ttype ( $ oa xo b,’ f loa t’ ) ; s e t ty p e($oa xoc ,’ f loa t’ ); s e t ty p e ($obxoc ,’ floa t’ );
$ m c = ar ray ( ) ; $ mv = ar ray ();

e c ho ‘ D IGIT E LO S DATO S PA RA E L P U N TO D E O RI G E N D E LO S V ECTO RES’, P H P_EO L;
e c ho ‘ Pun to de o r i ge n Co ord ena d a X ‘ ; fs ca n f($s td in,” % f ”, $m c [ 0 ] [ 0 ] );
e c ho ‘ Pun to de o r i ge n Coord ena d a Y ‘ ; fs ca n f($s td in,” % f ”, $m c [ 0 ] [1 ] );
e c ho ‘ Pun to de o r i ge n Coord ena d a Z ‘ ; fs ca n f($s td in,” % f ”, $m c [ 0 ] [ 2 ] );
e c ho ‘ ’, P H P_ EO L ;

e c ho ‘ D IGIT E L A S CO O R D E N ADAS D E LLEG A DA D E L V ECTO R A’, P H P_EO L;


e c ho ‘ Co o rde n a da X v e c tor A ‘ ; fs ca n f($s td in,” % f ”, $m c [1 ] [ 0 ] );
e c ho ‘ Co o rde n a da Y v e c tor A ‘ ; fs ca n f($s td in,” % f ”, $m c [1 ] [1 ] );
e c ho ‘ Co o rde n a da Z v e c tor A ‘ ; fs ca n f($s td in,” % f ”, $m c [1 ] [ 2 ] );
e c ho ‘ ’, P H P_ EO L ;

e c ho ‘ D IGIT E L A S CO O R D E N ADAS D E LLEG A DA D E L V ECTO R B’, P H P_EO L;


Fundamentos de lógica para programación de computadores · Ejercicios resueltos

e c ho ‘ Co o rde n a da X v e c tor B ‘ ; fs ca n f($s td in,” % f ”, $m c [ 2 ] [ 0 ] );


e c ho ‘ Co o rde n a da Y v e c tor B ‘ ; fs ca n f($s td in,” % f ”, $m c [ 2 ] [1 ] );
e c ho ‘ Co o rde n a da Z v e c tor B ‘ ; fs ca n f($s td in,” % f ”, $m c [ 2 ] [ 2 ] );
e c ho ‘ ’, P H P_ EO L ;

e c ho ‘ D IGIT E L A S CO O R D EN A DAS D E LLEG A DA D E L V ECTO R C ’, P H P_EO L;


e c ho ‘ Co o rde n a da X v e c tor C ‘ ; fs ca n f($s td in,” % f ”, $m c [ 3 ] [ 0 ] );
e c ho ‘ Co o rde n a da Y v e c tor C ‘ ; fs ca n f($s td in,” % f ”, $m c [ 3 ] [1 ] );
e c ho ‘Co o rde n a da Z v e c tor C ‘ ; fs ca n f($s td in,” % f ”, $m c [ 3 ] [ 2 ] );
e c ho ‘ ’, P H P_ EO L ;

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 ] ;
}
$ oa xo b = po w( ( po w( ( $ mv[ 0 ] [1 ] *$mv[1 ] [ 2 ] -$mv[ 0 ] [ 2 ] *$mv[1 ] [1 ] ), 2 )+
po w( ( -( $ mv [0][0]* $ mv[1 ] [ 2 ] -$mv[ 0 ] [ 2 ] *$mv[1 ] [ 0 ] )), 2 )+
po w( ( $ mv [0][0]* $ mv [1 ] [1 ] -$mv[ 0 ] [1 ] * $mv[1 ] [ 0 ] ), 2 )),0 . 5 );

$ oa xo c = po w( (po w( ( $ mv [ 0 ] [1 ] * $mv[ 2 ] [ 2 ] -$mv[ 0 ] [ 2 ] * $mv[ 2 ] [1 ] ), 2 )+


po w( ( -( $ mv [0][0]* $ mv[ 2 ] [ 2 ] -$mv[ 0 ] [ 2 ] * $mv[ 2 ] [ 0 ] )), 2 )+
po w( ( $ mv [0][0]* $ mv [2 ] [1 ] -$mv[ 0 ] [1 ] * $mv[ 2 ] [ 0 ] ), 2 )),0 . 5 );

$ o bxo c = po w( (po w( ( $ mv[1 ] [1 ] *$mv[ 2 ] [ 2 ] -$mv[1 ] [ 2 ] *$mv[ 2 ] [1 ] ), 2 )+


po w( ( -( $ mv [1][0]* $ mv [ 2 ] [ 2 ] -$mv[1 ] [ 2 ] * $mv[ 2 ] [ 0 ] )), 2 )+
po w( ( $ mv [1][0]* $ mv [2 ] [1 ] -$mv[1 ] [1 ] * $mv[ 2 ] [ 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));
}
}
}

e c ho ‘A rea ta tal = ‘, 2 * ( $ oa xob+$oa xoc+$obxoc ), P H P_EO L;


e c ho ‘ Vo l um e n = ‘,abs( $ mv[ 0 ] [ 0 ] *$mv[1 ] [1 ] * $mv[ 2 ] [ 2 ] ), P H P_EO L;

?>
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(x) = √T(x-1) + (x-1)

Especificaciones del problema.

Entradas X: de tipo entero

T(1) = 1
Procesos
T(x) = (x - 1)^0.5 + (x - 1)

Salidas n

Diagrama
de caja
negra del
problema
612
613

Diagrama de flujo de datos.


• Programa en Visual Basic.
Pr i vate Su b Com m a nd 1 _Clic k ()
Di m x As D oub le, n as D oub le
x = Inpu t B ox(“ D ig ite X ” )
n = t( x )
Pr i nt n
End Su b

Fu nc ti o n t(By Val n A s D oub le) A s D oub le


Di m f As D oub le

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>

d o u ble t(i nt n);

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 ;
}

var x = ne w Nu m b e r();va r n = n e w N um b e r();


x = Nu mbe r(pro m p t(“ D ig ite X ” ));
n = t( x ) ;
d o cu me nt .wr i te (“ T (“, x ,” )= “, n,’ < 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 ’ );

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 ;
}

se ttype ( $ x ,’ f loa t’ ) ; se ttyp e($n,’ f loa t’ );


e c ho ‘ D i g i te X ‘ ; fscanf( $s td in,” % f ”, $x );
$ n = t( $ x ) ;
e c ho P H P_ EO L , ‘ T ( ‘, $ x ,’ ) = ‘, $n, P H P_EO L;

?>

Ejercicio 15.
Realizar un algoritmo recursivo que sume los elementos de un arreglo de 200 elementos.
Especificaciones del programa.

Entradas arr[200]: de tipo real

suma(arr,0)= arr[0]
Procesos
s = s + suma(arr,n-1)

Salidas S

Diagrama
de caja
negra del
problema

Diagrama de Flujo de Datos.


• Programa en Visual Basic.
Pr i vate Su b Co m m a n d1 _Clic k ()
Di m i As Inte ge r, s A s D oub le
Di m a r r ( 0 To 19 9 ) A s D oub le
Fo r i = 0 To 19 9
a r r ( i ) = Inpu tB ox(“ D ig ite a r r [ “ & i & “ ] ” )
Nex t i
s = sum a ( a r r, 19 9 )
Pr i nt s
End Su b

Fu nc ti o n sum a (ByRe f a () A s D oub le, B y Val n A s I n te ge r) A s D oub le


D i m r A s D o ub le
If n = 0 T h e n
r = a(0)
Else
r = a ( n ) + sum a(a , n - 1 )
End If
sum a = r

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 ) ;

d o u ble su ma(d o u ble a [ ] , in t n) {


d o u ble r ;
i f ( n = = 0 ) r = a [0] ;
e lse r = a [n ]+ sum a (a , n-1 );
re tu r n r ;
}

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

a r r = [float( ) fo r i in ra n ge(2 0 0 )] ; s = f loa t();


fo r i i n range( 2 0 0):
a r r [i ] = float(raw_in p ut(“ D ig ite a r r [ “ + s t r (i)+ ” ] “ ))

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

Especificaciones del problema.

Entradas n: de tipo entero

serie(int(n/2)
Procesos
serie(n * 3 + 1)
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

Salidas n: de tipo entero

Diagrama
de caja
negra del
problema

Diagrama de Flujo de Datos.


• Programa en Visual Basic.
Pr i vate Su b Com m a nd 1 _Clic k ()
Di m n A s I n te ge r

n = Inp ut B ox(“ D ig ite N ” )


If n > 0 A n d n < 3 0 0 T h e n
ser ie (n)
Else
Pr in t “ Valor fu era d e ra ngo”
End If
End Su b

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 ;

Syste m.o u t . pr i n t(“ D ig ite N “ ); n = I n te ge r. pa rs e I n t(lee.rea d Lin e());


i f ( n >0 & & n <3 00 ) s er ie(n);
e lse Syste m.o u t . p rin tl n(“ Valor f u era d e ra ngo” );
}
pu bl i c stati c vo i d se rie(int n) {
i f ( ! ( n = =1) ) {
Syste m.o u t .p rin tl n(n);
i f ( n %2 = = 0) s er ie(n/2 );
e l se se r i e ( n* 3 +1 );
}
e lse Syste m.o u t . p rin tl n(1 );
Fundamentos de lógica para programación de computadores · Ejercicios resueltos

• 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

Alcalde, E., & García, M. (1992). Metodología de la programación. Aplicaciones en COBOL y


Pascal. Madrid: McGraw-Hill / Interamericana de España S. A.

Alfredo, O. M. (2013). Python Desde Cero. Madrid: Editorial Académica Española.

Algoritmica.NET. (15 de Junio de 2001). algoritmica.net. obtenido de algoritmica.net: www.


algoritmica.net

Arboleda, J. C. (2005). Estrategias para la comprensión significativa. Didácticas congnosciti-


vas y socioafectivas. Bogotá, Colombia: Cooperativa Editorial Magisterio.

Bautista Marugan, J. (2015). Matematicas y Programacion En Python (2 Edicion). Lulu Enter-


prises Incorporated.

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.

Brookshear, J. G. (2012). Introducción a las ciencias de la computación (Edición 11). México:


Addison Wesley.

Cairó, B. O. (2006). Fundamentos de programación. Piensa en C. México: Pearson educación.

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.

Cerrada Somolinos, J. A. (2010). Fundamentos de programacion. Madir, España: Editorial


Universitaria Ramon Areces.

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.

Elhacker.net. (s.f.). elhacker.net. Recuperado el Diciembre de 2001, de elhacker.net: https://


www.elhacker.net/

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

tico. Recuperado el 25 de Junio de 2016, de Cómo Pensar como un Informático: http://


www.openbookproject.net/thinkcs/archive/python/spanish2e/index.html

Farrell, J. (2012). Java Programming, 6th Edition. Boston: Cengage Learning.

Fernandez Montoro, A. (2013). Python 3 al descibuerto. Mexico: Alfaomega grupo editor.

Flanagan, D. (2007). JavaScript . La Guía Definitiva. Madrid: Editorial: Anaya Multimedia.

Foundation, Python Software. (2 de Fbrero de 2001). Python. Recuperado el 12 de Enero de


2016, de Python: https://docs.python.org/3/library/index.html

Gosling, P. E. (1985). Programación estructurada para microcomputadoras. Madrid: Editirial


McGraw-Hill.

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.

Joyanes Aguilar, L. (1996). Fundamentos de programación Algoritmos y estrucuturas de


datos, segunda edición. Madrid: España.

Joyanes Aguilar, L. (1996). Fundamentos de programación. Libro de problemas. Madrid: Es-


paña.
Kate, G. (1999). Edicion Especial Visual C++6. Madrid: PRENTICE-HALL.

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.

Pareja Heredia, D. (13 de Marzo de 2010). Matemáticas y Filosofía en el aula. Obtenido de


Matemáticas y Filosofía en el aula: http://www.matematicasyfilosofiaenelaula.info/con-
ferencias/aritmeticaespectronumeronaturales.pdf 628
629
Pascual Lopera, G. (1992). Estrucutras de la información. Madrid: España.

Powell, T. A., & Schneider, F. (2002). Java Script. Manula de referencia. Madrid, España: S.A.
MCGRAW-HILL / INTERAMERICANA DE ESPAÑA.

Quero Catalinas, E. (2002). Sistemas operativos y lenguajes de programación. Madrid, Espa-


ña: S.A. EDICIONES PARANINFO.

Ríos Cartrillón, F. (1995). Soluciones Secuenciales. Medellín: Universidad de Antioquia.

Sánchez Maza, M. Á. (2012). JavaScript. Málaga, España: IC Editoria.

Savitch, W. (2006). Resolucion de Problemas Con C++: El objetivo de la programación. Quinta


edición. Mexico: Pearson Education.

Senn, J. A. (1992). Analisis y Diseño de Sistemas de Informacion Segunda Edición. Mexico:


McGraw-Hill.

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.

Universidad Nacional de Colombia. Dirección Nacional de Innovación Académica. (2009).


Introducción a la programación. Bogotá: Servicios académicos virtuales. Recuperado el
10 de Octubre de 2009, de http://www.virtual.unal.edu.co/cursos/ingenieria/2001839/in-
dex.html

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.

Vigouroux, C. (2015). Aprender a desarrollar con javaScript. Barcelona: Editorial ENI.

W3.CC. (Mayo de 1999). W3Scchools.com. Recuperado el 18 de Octubre de 2016, de JavaScript


Tutorial: http://www.w3schools.com/js/default.asp

W3.CC. (Diciembre de 1999). w3schools.com. Recuperado el 24 de Julio de 2016, de PHP 5


Fundamentos de lógica para programación de computadores · Referencias bibliográficas

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.

Zelle, J. (2002). Python Programming: An Introduction to Computer Science. USA: Wartburg


College Printing.

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.

También podría gustarte