Sei sulla pagina 1di 53

PROYECTO: ANALFABETISMO PROGRAMÁTICO

1

Alejandra Bartolo Gervacio Raymundo Hugo Rangel Cruz Sergio Aguilar Diaz Ángel Cesar Govantes Saldivar

Índice

Objetivo del Trabajo

4

Introducción

4

Metodología

6

Desarrollo de la Metodología dirigida al proyecto

8

Esquema general de la Metodología

9

Conclusiones

13

Caso de Estudio

14

Bibliografía

48

Glosario

52

3

Objetivo del Trabajo:

Aplicar

programación.

Introducción

la

estrategia

de

elaboración

de

proyectos

a

una

asignatura

de

En la actualidad el uso de herramientas de cómputo es casi imprescindible, tanto el manejo de una computadora, así como la paquetería que esta contiene, de uso general.

El software en su diseño e implementación no son tangibles, su naturaleza muchas veces es malentendida en el contexto de la ingeniería, razón por la cual su complejidad no es bien apreciada, pero su relevancia social, económica y funcional ha hecho un cambio a nivel mundial en el último siglo.

Los cambios en medicina (genómica), finanzas (mercados globales), Informática ( google), control de telecomunicaciones, industrial (diseño), son trascendentes e invaluables. Sin embargo un problema generalizado es que muy pocos profesionales se han comprometido con la disciplina de elaboración del software y muchos menos que sepan transmitir la disciplina de elaboración de software.

Un ejemplo de la importancia de este problema lo encontramos en el plan curricular de las carreras, lo que no significa que se este abatiendo el problema, ya que la problemática subsiste. En otras palabras “los alumnos siguen sin saber programar”.

subsiste. En otras palabras “los alumnos siguen sin saber programar”. Fig. 1.1 Ejemplo de mapa curricular

Fig. 1.1 Ejemplo de mapa curricular

4

Una forma de abatir este problema es introducir un técnica de enseñanza aprendizaje con base en proyectos. En el caso de cómputo lo más deseable es modelar un proyecto grande en pequeños segmentos que denominaremos programas de cómputo, mediante los cuales abordamos una problemática compleja mediante la estrategia denominada “divide y vencerás”

Uno de los problemas a los cuales nos enfrentamos como formadores de profesionales de la ingeniería, es que los estudiantes no saben programar. Es decir todo estudiante de ingeniería debe conocer y aplicar los fundamentos de programación como una herramienta para la solución de problemas en ingeniería.

La programación es un proceso por el cual se escribe (en un lenguaje de programación), se prueba, se depura y se mantiene el código fuente de un programa informático. Dentro de la informática, los programas son los elementos que forman el software, que es el conjunto de las instrucciones que ejecuta el hardware de una computadora para realizar una tarea determinada. Por lo tanto, la programación es una de las principales áreas dentro de la informática.

Para el desarrollo de programas de cierta complejidad, es conveniente seguir alguno de los modelos de desarrollo de software existentes, en donde la programación es sólo una de las etapas del proceso de desarrollo de software.

Los modelos de desarrollo de software los aborda una disciplina específica del campo de la informática que es la ingeniería de software.

Para introducirnos en la programación debemos familiarizarnos con algunas definiciones y elementos de arranque.

5

Metodología

La metodología esta fundamentada en la propuesta de Wheeling,

1. Presentar el dominio problema o escenario (clarificar términos)

Escenario “Los estudiantes no saben programar”

Objetivo del Tópico de la Materia: Que el alumno conozca y aplique la disciplina de los algoritmos aterrizado al lenguaje de cómputo.

Objetivos específicos (aprendizaje):

El alumno identificará el dominio del problema.

El alumno modelará el dominio del problema para proporcionar una solución del mismo.

Qué el alumno encuentre caminos diferentes, pero más eficientes, para llegar al mismo resultado.

2. Lista de lo que se conoce.

Los obstáculos del alumno que no le permiten llevar acabo de una manera sencilla las habilidades necesarias y suficientes para aprender a programar

Abstracción

Difícil

No es mi área

Temor

Subestimación

Predisposición

3. Listar que se necesita conocer

¿Cuál es el nivel de conocimientos de los alumnos con respecto al tema? ¿Qué tan participativos son los alumnos?

4. Definir el problema

Uno de los problemas a los cuales nos enfrentamos como formadores de profesionales de la ingeniería, es que los estudiantes no saben programar.

6

Es decir todo estudiante de ingeniería debe conocer y aplicar los fundamentos de programación como una herramienta para la solución de problemas en ingeniería.

5. Listar posibles estrategias de solución (acciones, recomendaciones, hipótesis metas de aprendizaje)

Se enlistan las siguientes estrategias a utilizar:

1. Aprovechar las ventajas de los alumnos:

El alumno es bueno para almacenar información

El alumno es bueno para buscar información

2. El docente utilizara los siguientes motivadores en los alumnos con artículos de revista, de web, libros, video y fuentes externas de información:

Ampliación de conocimientos

Reconocimiento en su comunidad

Generación de ingresos

Ser parte de la historia ( Transformaciones) sociales

Proporcionar el glosario de elementos iníciales

Proporcionarle las fuentes para ampliar información

3. Estrategia de divide y vencerás.

En el caso de cómputo lo más deseable es modelar un proyecto grande en pequeños segmentos que denominaremos programas de cómputo, mediante los cuales abordamos una problemática compleja.

4. Uso extenso de analogías.

5. Uso de Algoritmos cotidianos

6. Trabajo colaborativo

7. Llevar a cabo una evaluación diagnóstica La evaluación será por medio de un examen con preguntas básicas o por preguntas aleatorias de tal manera que se fomente la participación de los alumnos

Con esto obtenemos la siguiente información:

¿Qué tan participativo es el grupo?

¿Cuál es el grado de conocimiento respecto al tema?

7

6. Llevar a cabo la estrategia

Desarrollo de la Metodología dirigida al proyecto:

Nivel 1 Simple (Conceptos básicos)

El propósito de este nivel es dar un ejemplo puntual que formará parte de un proyecto general. La unidad de conocimiento es el “programa básico”. Ejemplos: Desplegar un mensaje Desplegar el contenido de una variable

Nivel 2 Modificado (Básico con valor agregado)

Solicitar al alumno con base en el Nivel 1 que efectúe las modificaciones de dichos programas:

Ejemplo: Que el alumno elabore una suma de variable y las despliegue

Nivel 3 Medio (Modelo modificado)

El profesor expresa un ejemplo con más dificultad pero siempre con base en lo anteriores niveles 1 y 2.

Ejemplos: Se plantea la solución de un programa que elabore más operaciones como resta, multiplicación.

Nivel

anteriores(Aplicación) Ejemplo: Elaborar una calculadora de operaciones básicas

4

Elaborar

un

ejemplo

completo

con

partes

de

los

Nivel 5 Alto (Modelo Incompleto ) realimentación del alumno búsqueda de su auto aprendizaje Ejemplo: Elaborar una calculadora que sea científica.

Nivel 6 Complejo (Únicamente se plantea el problema)

Ejemplo: Elaborar una función que involucre las operaciones que ya están incluidas en la calculadora científica.

Nivel 7

(Realimentación y autoaprendizaje) Los alumnos presentaran ante

el grupo los diferentes caminos a los para llegar a la solución del problema

planteado.

8

Esquema general de la Metodología

Contenido Conceptos básicos parte Teórica

Profesor

Alumno

Conceptos básicos parte Teórica Profesor Alumno Nivel 1 Nivel 2 Ejemplo simple de programa Ejemplo
Nivel 1 Nivel 2 Ejemplo simple de programa Ejemplo simple El alumno lo modifica (Realimentación
Nivel 1
Nivel 2
Ejemplo simple de
programa
Ejemplo simple El
alumno lo modifica
(Realimentación del
alumno)
Contenido Conceptos parte teórica
Profeso
Nivel 3
Nivel 4
A + P
Aplicación teórica
Ejemplo sube de
grado de
complejidad
Elaborar un ejemplo
Con los anteriores
ejemplos aplicación
Alumno
Alumno
Aplicación teórica
Nivel 5
Nivel 6
Elaborar un
ejemplo
Con un modelo
incompleto
Autoaprendizaje
Solo se plantea
el problema
Nivel 7
Autoaprendizaje
El alumno expone
los caminos para
llegar a la solución
Alumno
el problema Nivel 7 Autoaprendizaje El alumno expone los caminos para llegar a la solución Alumno

9

7. Presentar y fundamentar su solución

Paso 1) Un proyecto de cómputo medianamente largo el cual consta del desarrollo de un programa el cual consta de pequeños subprogramas funcionales.

Con esto se Desarrollaran los siguientes aspectos

o

Elevar el nivel de calidad en la programación,

o

Ser menos propenso los errores en el código,

o

Programación con más agilidad,

o

Cambiar la perspectiva de la programación,

o

Indoctrinar los fundamentos de fábricas de software.

Paso 2) Se hacen grupos de 5 personas

Paso 3) Se establecerán los siguientes roles:

o

un alumno que asumirán el rol de: ingenieros-arquitectos para el diseño general del proyecto, entendiendo que un proyecto esta conformado por muchas piezas y/o programas.

o

tres

alumnos

que

asumirán

el

rol

de ingenieros en

programación que serán los responsables de programar las piezas.

o

uno ingeniero “Testers” encargados de verificar el diseño y llevar a punto crítico las piezas.

Paso 4) El calendario se establece en con las siguientes entregas:

o

Semana 1) Entrega del diseño general

o

Semana 2) Elaboración del 1er 50% de las piezas.

o

Semana 3) Revisión del 1er 50 % de las piezas y elaboración del 2o 50% de las piezas.

o

Semana 4) Revisión del 2º 50% de las piezas

o

Semana 5) Ensamble general y pruebas generales del sistema.

Paso 5) Se abrirá un foro de tal manera que los alumnos puedan interactuar entre ellos y puedan intercambiar información sobre código.

10

Paso 6) Se explicará la experiencia a desarrollar, objetivos planteados, metodologías, desarrollo de las clases, contenidos, asignación de grupos y sistema de evaluación.

Paso 7) Durante las clases siguientes el profesor llevara acabo un explicación global de los conceptos teóricos. el objetivo es conseguir que el alumno adquiera una base de conocimientos, la cual se desarrollara posteriormente por el alumno mediante autoaprendizaje.

8. Evaluación y cierre del tema.

Metodología para evaluar el proyecto

El día de entrega de proyecto se considerará lo siguiente:

a) La calificación se compondrá de:

Calificación en equipo (75%)

o

40% Documentación del proyecto, (contenido, método, estándares definidos, completitud)

o

15% Trabajo en equipo (congruencia de las piezas y uniformidad del trabajo)

o

15% Preguntas y respuestas (por parte del profesor y por parte del Tester de otro equipo) (evaluación aditiva-coeval)

o

5% Evaluación de los otros miembros del equipo. (aditiva- coevaluación)

Calificación individual (25%)

o

20% Presentación individual, (exposición oral y claridad de la presentación)

o

5% Auto evaluación. (evaluación aditiva)

1º Se establece la fecha de entrega de trabajo en formato electrónico. 2º Con apoyo de una plataforma educativa u otro medio electrónico, se da acceso para que todos los alumnos puedan ver los trabajos entregados. Y se establece que antes de que inicie la exposición, deberán traer al menos 3 preguntas acerca del proyecto. 3º Se establecen las fechas de exposición pero se sortea el orden de presentación de equipos. 4º Al llegar el día de exposición, cada equipo realiza una presentación de máximo 40 minutos, divididos en 20 minutos de exposición y 20 de preguntas y respuestas. (“Evaluación Formativa” se habrá conseguido las habilidades deseadas sobre la disciplina)

11

5º (Opcionalmente) Al final de la exposición el profesor solicitara a sus alumnos suban a la plataforma su comentario acerca de los integrantes de los equipos, el profesor posteriormente se los enviara vía correo electrónico para la realimentación

6º Al término se sortea el equipo que realizará las pruebas, mismo que tendrá un plazo de 24 horas para emitir sus resultados acerca de la seguridad de las piezas a evaluar. El resultado de le evaluación se dará a conocer la siguiente clase.

12

Conclusiones

El planteamiento de proyectos es una buena metodología para el aprendizaje ya que involucra teoría y práctica, verificando los conocimientos adquiridos durante la parte teórica y la aplicación de los conceptos de manera práctica, para así dejar una enseñanza-aprendizaje de manera significativa. Además de aplicar ciertas metodologías en la elaboración de proyectos.

Mediante la Aplicación ABP

Integrar conocimientos de trabajo interdisciplinar.

Capacidad de aprendizaje para la adquisición de nuevos conocimientos.

Desarrollo de habilidades y competencias, responsabilidad, trabajo en equipo, trabajo cooperativo y expresión oral.

Capacidad de análisis, síntesis y evaluación. El alumno se enfrentara al problema y resolverlo.

13

Caso de Estudio

Operadores de Relación, Lógicos y la Categoría de Figuras de Decisión

14

Objetivo general

El alumno modelara, codificara y correrá programas que incluyen algoritmos que requieren enunciados condicionales derivados del uso de árboles sistémicos.

Contenido

4.0.- Introducción 4.1.- Los operadores lógicos básicos 4.1.1 I ntroducción

4.1.2 La tabla de verdad para el operador lógico OR

4.1.3 La tabla de verdad para el operador lógico AND

4.1.4 La tabla de verdad para el operador lógico NOT

4.2.-

Diagramas de flujo y el enunciado if-else

4.2.1 Introducción

4.2.2 Diagramas de flujo

4.2.3 El enunciado if_else

4.3.-

Diseño de decisiones con árboles sistémicos, parte I

4.3.1 Introducción

4.3.2 El árbol básico

4.3.3 Ejemplos

4.4.-

Diseño de decisiones con árboles sistémicos, parte II

4.4.1 Introducción

4.4.2 Ejemplos

4.5.-

Diseño de decisiones con árboles sistémicos, parte III

4.5.1 Introducción

4.5.2 Reglas 1 y 2

4.5.3 El proceso cosecuencial

4.6.-

Diseño de decisiones con árboles sistémicos, parte IV

4.5.1 Introducción

4.5.2 Los enunciados switch y break

4.5.3 El enunciado continue

Objetivos especificos

Luego de leer y estudiar cuidadosamente el material de esta unidad, usted tendrá las habilidades necesarias para:

1. Escribir expresiones lógicas correctas que utilizan operadores de relación y/o operadores lógicos.

2. Hacer la prueba de escritorio de programas que usen enunciados de decisión

3. Planificar y escribir código correcto utilizando como referencia el árbol sistémico

4. Reconocer la estrategia de divide y venceras en los árboles sistémicos.

15

5.

Reconocer y valorar la utilidad del árbol sistémico en algoritmos que requieren enunciados condicionales.

4.1

Los operadores lógicos básicos

4.1.1

Introducción

Un identificador lógico o boleano en el lenguaje C/C++ solo puede asumir uno de dos valores, el valor entero 0 (Falso) o el valor entero 1 (Verdadero). El operador lógico || es binario porque tiene dos operandos, uno a cada lado, por ejemplo en la expresión A || B, es decir A o B, los operandos son A y B.

La tabla siguiente muestra los operadores lógicos o boleanos en el lenguaje C/C++.

Operador

Significado

||

O lógico

Operador Significado || O lógico && Y lógico ¡ No lógico
Operador Significado || O lógico && Y lógico ¡ No lógico

&&

Y

lógico

¡

No lógico

4.1.2 La tabla de verdad para el operador lógico OR

A continuación tenemos la tabla de verdad de la expresión lógica A || B. Las dos

primeras columnas muestran todas las combinaciones posibles (horizontalmente,

lo sombreado) de valores de verdad para la expresión. La última columna es el

resultado de evaluar la expresión para cada combinación correspondiente.

Valor lógico asignado al operando A

Valor lógico asigando al operando B

Resultado de evaluar la expresión lógica A || B

B Resultado de evaluar la expresión lógica A || B A = 0 B = 0
B Resultado de evaluar la expresión lógica A || B A = 0 B = 0
B Resultado de evaluar la expresión lógica A || B A = 0 B = 0

A = 0

B

= 0

0

A = 0

B

= 1

1

A = 1

B

= 0

1

A = 1

B

= 1

1

Por ejemplo, si consideramos la primera combinación, es decir; si A = 0 (Falso) y

B = 0 (Falso), entonces la expresión A || B, es decir A o B, se evalua como 0

(Falso), Para las siguientes tres combinaciones observése que la expresión se

evalua como 1 (Verdadero).

Otro ejemplo, si en la expresión lógica

A || (B || C), tenemos que A = 1, B = 0 y C = 0

por prioridad primero se evalua la subexpresión

(B || C)

16

Notese que hay coincidencia entre los valores de B y C, y los de la primera

combinación en la tabla del y lógico, por lo que tenemos como resultado 0. Luego se evalua la expresión

A || (0)

Notese que hay coincidencia entre los valores de A y (0), y los de la tercera combinación en la tabla del o lógico, con lo que tenemos como resultado para toda

la expresión el valor de verdad 1 (Verdadero).

4.1.3 La tabla de verdad para el operador lógico AND

A continuación se muestra la tabla de verdad de la expresión lógica A && B, es

decir A y B. Al igual que en la tabla para el operador lógico ||, las dos primeras columnas muestran todas las combinaciones posibles (horizontalmente, lo sombreado) de valores de verdad para la expresión. La última columna es el resultado de evaluar la expresión para cada combinación correspondiente.

Valor lógico asigando

Valor lógico

Resultado de evaluar la

al

operando A

asigando al

expresión lógica A && B

 

operando B

expresión lógica A && B   operando B A = 0 A = 0 A =
expresión lógica A && B   operando B A = 0 A = 0 A =
expresión lógica A && B   operando B A = 0 A = 0 A =
A = 0 A = 0 A = 1 A = 1 B = 0

A = 0

A = 0

A = 1

A = 1

A = 0 A = 0 A = 1 A = 1 B = 0 0
B = 0 0 B = 1 0 B = 0 0 B = 1

B

= 0

0

B

= 1

0

B

= 0

0

B

= 1

1

B = 0 0 B = 1 0 B = 0 0 B = 1 1
B = 0 0 B = 1 0 B = 0 0 B = 1 1
B = 0 0 B = 1 0 B = 0 0 B = 1 1
A = 0 A = 0 A = 1 A = 1 B = 0 0
A = 0 A = 0 A = 1 A = 1 B = 0 0

Por ejemplo, ahora consideramos la última combinación, es decir; si A = 1

(Verdadero) y B = 1 (Verdadero), entonces la expresión A && B, es decir A y B, se evalua como 1 (Verdadera), Para las primeras tres combinaciones observese que

la expresión se evalua como 0 (Falso).

Otro ejemplo, si en la expresión lógica

A && (B || C), tenemos que A = 1, B = 0 y C = 0

por prioridad primero se evalua la subexpresión

(B || C)

Notese que hay coincidencia entre los valores de B y c, y los de la primera combinación en la tabla del o lógico, por lo que tenemos como resultado 0. Luego se evalua la expresión

A && (0)

17

Notese que hay coincidencia entre los valores de A y (0), y los de la tercera combinación en la tabla del y lógico, con lo que tenemos como resultado para toda la expresión el valor de verdad 0 (Falso).

4.1.4 La tabla de verdad para el operador lógico NOT

Por último, tenemos a la tabla de verdad de la negación lógica, por ejemplo, en la expresión lógica !A, si el valor entero de A es 0, su negación lógica da como resultado 1. Si el valor entero de A es 1, su negación lógica da como resultado 0. Esto se resume en la siguiente tabla.

Valor lógico asigando al operando A A = 0 A = 1 Resultado de evaluar

Valor lógico asigando al operando A

A = 0
A
= 0

A = 1

Resultado de evaluar la expresión lógica ¡ A

1

0

Valor lógico asigando al operando A A = 0 A = 1 Resultado de evaluar la
Valor lógico asigando al operando A A = 0 A = 1 Resultado de evaluar la

Consideremos la siguiente expresión lógica para su evaluación de acuerdo a las tablas de verdad básicas previas

A || (¡B && C), donde A = 0, B = 0 y C = 1

Primero se evalua, por razones de prioridad, la subexpresión

¡B

la que de acuerdo a la primera combinación de la tabla de la negación lógica el resultado es 1.

Luego se evalua la subexpresión

(1 && C)

la que de acuerdo con la cuarta combinación de la tabla de verdad para el y lógico el resultado es 1. Finalmente se evalua la expresión

A || (1)

la que acuerdo con la segunda combinación de la tabla de verdad para el o lógico el resultado es 1.

Cualquier otra expresión lógica que incluya solo operadores lógicos puede ser evaluada de manera similar.

18

4.2

Diagramas de flujo y el enunciado if – else

4.2.1

Introducción

Suponga que esta codificando un programa que admite una larga lista de números enteros. El programa debe de contar el número de enteros pares (Contador_pares) y el número de enteros impares (Contador_nones) que ingresan. Antes de incrementar uno de los contadores debe tomarse una decisión para determinar que contador incrementar cada vez que ingresa un entero. Este es un ejemplo en el que se requiere de un enunciado condicional.

4.2.2 Diagramas de flujo

Es característico de un enunciado condicional ejecutar otro(s) enunciado(s) si se cumple una condición predeterminada como lo muestra el siguiente diagrama de flujo: si la Condición es Verdadera se ejecuta(n) los Enunciado(s)_B, en caso contrario se ejecutan los Enunciado(s)_A

Condición Falsa Verdadera Enunciado(s)_A Enunciado(s)_B Como un ejemplo consideremos el problema enunciado en la
Condición
Falsa
Verdadera
Enunciado(s)_A
Enunciado(s)_B
Como un ejemplo consideremos el problema enunciado en la introducción de esta
unidad, el cual queda como sigue - en términos de un diagrama de flujo. Notése
que en la condición - Nro%2 == 0 - se utiliza el operador módulo (%) para verificar
si el valor es par o impar. El operador módulo es un operador binario por tener dos
operandos, uno a la izquierda (en nuestro caso Nro) y otro a la derecha (en
nuestro caso 2).
Nro%2 == 0
Fals
Verdade
Contador_Nones
Contador_Pares
++
++
19‐

En esta unidad el alumno aprendera a diseñar decisiones utilizando el árbol sistémico. Esta habilidad será particularmente de gran importancia en algoritmos en los que intervienen enunciados de decisión.

4.2.3 El enunciado if - else

La instrucción if nos permite tomar una de dos acciones, la forma general de la instrucción if es la siguiente:

if(condición)

instrucción(es)_A

else

instrucción(es)_B

Esta forma de dos alternancias tiene una forma particular: una alternancia.

if(condición)

instrucció(es)

La primera forma tiene también una forma general que aparece con frecuencia en las aplicaciones: la alternancia múltiple, la cual tiene la forma siguiente:

if(condición_A) instrucción(es)_A else if(condición_B) instrucción(es)_B else if(condición_C) - else if(condición_Y) instrucción(es)_Y else instrucción(es)_A

-

-

-

-

-

-

-

-

El ejemplo siguiente usa una instrucción if de dos alternancias para comparar dos valores enteros. Se imprime el valor menor.

#include <stdio.h> void main(void){ int AEn, BEn;

/* Lectura de los valores de AEn y BEn */ scanf("%d %d", &AEn, &BEn); /* Comparación de los valores de AEn y BEn */ if(AEn <= BEn) printf("%d ", AEn);

20

else /* AEn > BEn */ printf("%d ", BEn);

}

El ejemplo siguiente es una generalización del anterior, incluye un if con alternancias múltiples, se exhibe el valor de la variable que sea menor ó los valores de las dos variables si estos son iguales.

#include <stdio.h>

void main(void){ int AEn, BEn;

/* Lectura de los valores de AEn y BEn */ scanf("%d %d", &AEn, &BEn); /* Comparación de los valores de AEn y BEn */ if(AEn < BEn) printf("%d ", AEn); else if(AEn == BEn) printf("%d %d", AEn, BEn); else /* AEn > Ben */ printf("%d ", BEn);

}

21

4.3

Diseño de decisiones con árboles S, parte I

4.3.1

Introducción

Los árboles de decisión han sido una de las herramientas de la ingeniería programática (sistemas de software) de poco uso en la practica. En la literatura el diseño de un árbol de decisión se presenta de manera prácticamente intuitiva, se enfatiza más su aspecto gráfico como una gran ventaja y no su planteamiento sistemático. En esta unidad y las tres siguientes, hacemos uso de los árboles sistémicos – árboles S – los cuales son estructuras formales que modelan, la solución de un problema. Estas estructuras utilizan intrinsicamente la estrategia de divide y vencerás. Por lo que son un excelente ejemplo de esta estrategia, la cual es de uso común en todo diseño e implementación de cualquier algoritmo, por lo que el dominio de esta estrategia y su herramienta de parte del aprendiente debe de otorgarle una mayor habilidad para el diseño e implementación de estos.

El nombre de árbol sistémico – o árbol S - es en realidad el nombre de un modelo didáctico ontológico, derivado con la metodología de la programática educacional. Este MODO consta de una definición, cuatro reglas y por supuesto de la estructura de árbol al cual se aplican la definición y las reglas.

El aprendiente debe estar consciente de que su éxito en el diseño de árboles S depende de que sea disciplinado (dedicado y sistemático) en el uso de ellos, es decir, debe resolver suficientes problemas de esta categoría aplicando las reglas rigurosamente en cada caso.

4.3.2 El árbol básico

Se introducen dos definiciones y tres reglas para la obtención y síntesis de un árbol S.

Definición 1. Un árbol S básico es una jerarquía de nodos (puntos de decisión), los que a su vez originan otros nodos u hojas (acciones). Es condición necesaria y suficiente que en un árbol S básico solo aparezcan en sus nodos los operadores de relación <, = y >.

La figura siguiente muestra un árbol S simple (un solo nivel de nodos o puntos de decisión). Bajo el alcance (debajo) de cada nodo de decisión se encuentra la hoja o acción que se toma bajo la decisión correspondiente.

22

opdoA < opdoB opdoA = opdoB opdoA > opdoB acción A acción B acción C
opdoA < opdoB
opdoA = opdoB
opdoA > opdoB
acción A
acción B
acción C
Se ilustra ahora, con un ejemplo simple, la definición dada.
4.3.3
Ejemplos

Sean AEn y BEn dos enteros, se exhibe el menor de ellos o ambos si son iguales.

Al comparar a AEn y BEn para saber cual es menor o si son iguales, solo caben las tres siguientes posiblidades:

AEn < BEn

AEn = BEn

AEn > BEn

Para el primer caso, AEn resulta ser la variable con el menor valor, por lo que se exhibe este valor. En el segundo caso resulta que los valores de AEn y BEn son iguales por lo que se exhiben ambos, y en el tercer caso, la variable con el menor valor es BEn por lo ser exhibe el valor de esta variable. El árbol S básico resultante es el siguiente:

AEn < BEn AEn = BEn AEn > BEn Exhibir AEn Exhibir AEn Exhibir CEn
AEn < BEn
AEn = BEn
AEn > BEn
Exhibir AEn
Exhibir AEn
Exhibir CEn
y BEn

Lo sorprendente es que un árbol de decisión es la forma grafica de un condicional, para apreciar esto integremos al árbol el condicional correspondiente como sigue:

23

If(AEn < BEn) else If(AEn == BEn) else // (AEn > BEn) Exhibir AEn Exhibir
If(AEn < BEn)
else If(AEn == BEn)
else // (AEn > BEn)
Exhibir AEn
Exhibir AEn
Exhibir CEn
y BEn

El código correspondiente a este árbol se muestra enseguida

if(AEn < BEn)

printf(“%d”, AEn);

else if(AEn == BEn)

printf(“%dn %d”, AEn, BEn);

else//AEn > BEn

printf(“%d”, BEn);

Nótese la correspondencia tan directa que existe entre el árbol de decisión y el código que le corresponde. Observe también que el problema es resuelto mediante el árbol y no directamente con el código. Estas cualidades, y otras, son las que hacen tan útiles a los árboles de decisión en el diseño de decisiones.

Para mostrar otra de las cualidades de los árboles de decisión, la de subdividir un problema en subproblemas más simples de resolver, consideremos una generalización del problema anterior. Sean AEn, BEn y CEn variables enteras, se exhibe la menor de ellas, o dos de ellas si son iguales y menores a la tercera, o las tres si son iguales.

Considerar todas las posibles comparaciones que puedan darse entre las tres variables puede ser problemático, por lo que consideremos primero comparar a las variables AEn y BEn, por el ejemplo anterior nos percatamos que este problema (subproblema) ya lo tenemos resuelto

AEn < BEn AEn = BEn AEn > BEn ‐ 24‐
AEn < BEn
AEn = BEn
AEn > BEn
‐ 24‐

Ahora consideremos uno a uno, los tres posibles casos, yendo de izquierda a derecha. Empecemos con AEn < BEn, la comparación nos dice que AEn tiene un valor menor que BEn, por lo que en el siguiente nivel inferior debemos comparar a AEn con CEn, es decir :

A < B A = B A > B A < C A = C
A
< B
A = B
A > B
A < C
A = C
A > C

Consideremos ahora a A = B, puesto que ambos son iguales podemos tomar a cualquiera de las dos variables y compararla con C, por ejemplo:

A < B A = B A > B A < C A = C
A
< B
A = B
A > B
A < C
A = C
A > C
A < C
A = C
A > C

Consideremos ahora a A > B, la comparacion nos dice que la variable con el menor valor es B, por lo que debemos comparar a B con C en el siguiente nivel, es decir:

A < B A = B A > B
A
< B
A = B
A > B
A < C A = C A > C A < C A = C
A < C
A = C
A > C
A < C
A = C
A > C
B < C
B = C
B > C
Nótese que el problema original lo hemos subdividido en dos subproblemas mas
fáciles de tratar, en el primero comparamos solo a A y B, primer nivel del árbol, en

25

el segundo subproblema, comparamos a C con quien resulte menor al comparar a

A y B, segundo nivel del árbol.

Finalmente consideremos las acciones que se deben de tomar bajo cada una de las rutas de las condiciones, empezando desde la raiz hasta la accion correspondiente. Por ejemplo, la ruta dada por las decisiones A < B y A < C nos dice que la variable A tiene el valor menor, considerando de la misma manera cada ruta tenemos por consiguiente:

A < B A = B A > B A < C A = C
A < B
A = B
A > B
A < C
A = C
A > C
A < C
A = C
A > C
B < C
B = C
B > C
Exhibe
Exhibe
Exhibe
Exhibe
Exhibe
Exhibe
Exhibe
Exhibe
Exhibe
A
A y C
C
A y B
A,B y C
C
B
B y C
C
El siguiente ejemplo es una generalización del anterior, incluye 3 if con
alternancias múltiples anidadas en otro if con alternancia múltiple, se imprime el
valor de la variable que resulte menor, o los valores de dos de ellas si estos son
iguales y menores a la tercera, o los valores de las tres si estas son iguales.

#include <stdio.h> void main(void){ int AEn, BEn, CEn;

/* Lectura de los valores de AEn, BEn, CEn */ scanf("%d %d %d", &Aen, &BEn, &Cen); /* Comparación de los valores de AEn, BEn, CEn */

if(AEn < BEn)

if(AEn < BEn)

if(AEn < BEn) if(AEn < CEn)
if(AEn < BEn) if(AEn < CEn)
if(AEn < CEn)

if(AEn < CEn)

printf("%d ", AEn);

else if(AEn == CEn)

printf("%d %d ", AEn, CEn);

else /* Aen > CEn */

printf("%d ", CEn)

else if(AEn == BEn)
else if(AEn == BEn)

else if(AEn == BEn)

else if(AEn == BEn) if(Aen < Cen)

if(Aen < Cen)

else if(AEn == BEn) if(Aen < Cen)

printf("%d %d ", AEn, BEn);

26

else if(AEn == CEn)

printf("%d %d %d ", AEn, BEn, CEn);

else /* AEn > CEn */

printf("%d ", CEn);

else /* AEn > BEn */
else /* AEn > BEn */

else /* AEn > BEn */

else /* AEn > BEn */ if (BEn < CEn)

if (BEn < CEn)

else /* AEn > BEn */ if (BEn < CEn)

printf("%d ", BEn);

else if(BEn == CEn)

printf("%d %d ", BEn, CEn);

else /* BEn > CEn */

printf("%d ", CEn);

}

27

4.3

Diseño de decisiones con árboles S, parte II

4.4.1

Introducción

En los ejemplos anteriores hemos visto que los árboles sistémicos son una excelente herramienta para el diseño de decisiones en la programación estructurada. Por otra parte es una herramienta que incorpora e manera intrínseca la estrategia de divide y vencerás. Esta estrategia es de uso muy común en el diseño de algoritmos. En esta segunda parte continuamos con el diseño de decisiones con árboles S. Se presentan dos ejemplos, el primero es una generalización del último ejemplo visto en la parte I y el segundo es una generalización del primer ejemplo visto en esta segunda parte.

4.4.2.

Ejemplos

Se intercalan los valores enteros de dos vectores en un tercer vector. Los elementos enteros de los vectores AVcEn y BVcEn están ordenados de menor a mayor. Los elementos del vector resultante CVcEn también están ordenados de menor a mayor. Se permiten que aparezcan enteros repetidos en los vectores.

AVcEnι < BVcEnj AVcEni = BVcEnj AVcEni > BVcEnj
AVcEnι < BVcEnj
AVcEni = BVcEnj
AVcEni > BVcEnj

DVcEn [lEn] AVcn [iEn] lEn lEn+1 iEn iEn+1

DVcEn [lEn] AVcEn [iEn] lEn lEn+1 DVcEn [lEn] BVcEn [jEn] iEn iEn+1 jEn jEn+1 IEn iEn+1

DVcEn [lEn] BVcEn [jEn] lEn lEn+1 jEn jEn+1

#include <stdio.h>

void main(void){ int AVcEn[10], BVcEn[10], CVcEn{20]; int IndiceIEn, IndiceJEn, IndiceKEn, LonAVcEn = 5, LonBVcEn = 8;

/* Lectura de los valores del vector AVcEn */ for(IndiceIEn = 0; IndiceIEn < LonAVcEn; IndiceEn++) scanf("%d", &AVcEn[IndiceIEn]);

/* Lectura de los valores del vector BVcEn */ for(IndiceJEn = 0; IndiceJEn < LonBVcEn; IndiceJEn++)

28

scanf("%d", &BVcEn[IndiceJEn]);

IndiceIEn = IndiceJEn = IndiceKEn =0;

/* Comparación de los valores de los vectores AVcEn y BVcEn */ for(;IndiceIEn <= LonAVcEn;)

if(AVcEn[IndiceIEn] < BVcEn[IndiceJEn])

CVcEn[IndiceKEn++] = AVcEn[IndiceIEn++];

BVcEn[IndiceJEn]) CVcEn[IndiceKEn++] = AVcEn[IndiceIEn++]; else if(AVcEn[IndiceIEn] == BVcEn[IndiceJEn]){

else if(AVcEn[IndiceIEn] == BVcEn[IndiceJEn]){

CVcEn[IndiceKEn++] = AVcEn[IndiceIEn++]; CVcEn[IndiceKEn++] = BVcEn[IndiceJEn++];

AVcEn[IndiceIEn++]; CVcEn[IndiceKEn++] = BVcEn[IndiceJEn++]; }else /* AVcEn[IndiceIEn] > BVcEn[IndiceJEn] */

}else /* AVcEn[IndiceIEn] > BVcEn[IndiceJEn] */

CVcEn[IndiceKEn++] = BVcEn[IndiceJEn++];

/* Exhibición del vector resultante*/ for(IndiceIEn = 0; IndiceIEn < (LonAVcEn + LonBVcEn); IndiceIEn++) printf("%d ", CVcEn[IndiceIEn]);

}

Este ejemplo asume la presencia de un centinela al final de los vectores AVcEn y BVcEn. Los centinelas son el valor mas grande que es posible asignar y deben tener el mismo valor. Esto asegura que los dos vectores, independientemente del número de elementos que tengan, se agotan al mismo tiempo.

29

El siguiente ejemplo es una generalización del anterior. Tres vectores: AVcEn, BVcEn y CVcEn, con sus valores enteros ordenados ascendentemente, se intercalan sus valores en orden ascendente en un cuarto vector: DVcEn. Tanto en el árbol S como en el código, el sombreado oscuro corresponde a los condicionales externos y el sombreado claro a los condicionales internos (anidados).

AVcEn [iEn] AVcEn [iEn] AVcEn [iEn] < = < BVcEn [jEn] BVcEn [jEn] BVcEn [jEn]
AVcEn [iEn]
AVcEn [iEn]
AVcEn [iEn]
<
=
<
BVcEn [jEn]
BVcEn [jEn]
BVcEn [jEn]
AVcEn [iEn[
AVcEn [iEn]
BVcEn [jEn]
BVcEn [jEn]
<
<
<
<
CVcEn [kEn]
CVcEn [kEn]
CVcEn [kEn]
CVcEn [kEn]
AVcEn [iEn]
BVcEn [jEn]
=
=
AVcEn [iEn]
AVcEn [iEn]
CVcEn [kEn]
CVcEn [kEn]
<
<
CVcEn [kEn]
CVcEn [kEn]
AVcEn [iEn]
=
CVcEn [kEn]
DVcEn
Dl ← Ai
Dl ← Ck
Dl ←Ai
Dl ← Ai
Dl ← Ck
[lEn] ←
l
← l+1
l ← l+1
Dl ←
l ← l+1
k ← k+1
l
← l+1
l ← l+1
AVcEn
I ← i+1
Dl ←
k ← k+1
[iEn]
Ck
Ck
l ← l+1
l
← l+1
l
← l+1
I ← i+1
I
← i+1
I
← i+1
k ← k+1
k ← k+1
Dl ←Ai
Dl ← Ai
Dl ← Ck
l
← l+1
l
← l+1
l ← l+1
I
← i+1
Dl ←
k ← k+1
Ck
l
← l+1
I
← i+1
k ← k+1

30

#include <stdio.h> /*

Tres vectores con valores enteros; AVcEn, BVcEn y CVcEn, ordenados ascendentemente, se intercalan también en orden ascendente en un cuarto vector resultante; DVcEn. Se exhibe el vector resultante. */ void main(void){ int AVcEn[10], BVcEn[10], CVcEn[20], DVcEn[10]; int iEn, jEn, kEn, dimAVcEn = 5, dimBVcEn = 8 dimCVcEn

= 7,

dimDVcEn;

// Lectura de los valores del vector AVcEn for(iEn = 0; iEn < dimAVcEn; iEn++) scanf("%d", &AVcEn[iEn]);

// Lectura de los valores del vector BVcEn for(jEn = 0; jEn <dimBVcEn; jEn++) scanf("%d", &BVcEn[jEn]);

// Lectura de los valores del vector CVcEn for(kEn = 0; kEn < dimCVcEn; kEn++) scanf("%d", &CVcEn[kEn]);

// Se inician en ceros las variable enteras: iEn, jEn, kEn, lEn iEn = jEn = kEn = lEn = 0;

// Comparación de los valores de los vectores AVcEn, BVcEn y CVcEn for(;iEn <= dimAVcEn;)

if(AVcEn[iEn] < BVcEn[jEn])

if(AVcEn[iEn] < BVcEn[jEn])

if(AVcEn[iEn] < BVcEn[jEn]) if(AVcEn[iEn] < CVcEn[kEn])
if(AVcEn[iEn] < BVcEn[jEn]) if(AVcEn[iEn] < CVcEn[kEn])
if(AVcEn[iEn] < CVcEn[kEn])

if(AVcEn[iEn] < CVcEn[kEn])

DVcEn[lEn++] = AVcEn [iEn++];

else if(AVcEn[iEn] == CVcEn[kEn]){

DVcEn[lEn++] = AVcEn[iEn++]; DVcEn[lEn++] = CVcEn[kEn++];

}else /* AVcEn[iEn] > CVcEn[kEn] */

DVcEn[lEn++] = CVcEn[kEn++];

else if(AVcEn[iEn] == BVcEn[jEn])
else if(AVcEn[iEn] == BVcEn[jEn])

else if(AVcEn[iEn] == BVcEn[jEn])

else if(AVcEn[iEn] == BVcEn[jEn]) if(AVcEn[iEn] < CVcEn[kEn]){

if(AVcEn[iEn] < CVcEn[kEn]){

else if(AVcEn[iEn] == BVcEn[jEn]) if(AVcEn[iEn] < CVcEn[kEn]){

DVcEn[lEn++] = AVcEn[iEn++]; DVcEn[lEn++] = BVcEn[jEn++];

}else if(AVcEn[iEn] == CVcEn[kEn]){

31

DVcEn[lEn++] = AVcEn[iEn++]; DVcEn[lEn++] = BVcEn[jEn++]; DVcEn[lEn++] = CVcEn[kEn++];

}else /* AVcEn[iEn] > CVcEn[kEn */

DVcEn[lEn++] = CVcEn [kEn++];

else /* AVcEn[iEn] > BVcEn[jEn] */
else /* AVcEn[iEn] > BVcEn[jEn] */

else /* AVcEn[iEn] > BVcEn[jEn] */

else /* AVcEn[iEn] > BVcEn[jEn] */ if(BVcEn[jEn] < CVcEn[kEn])

if(BVcEn[jEn] < CVcEn[kEn])

else /* AVcEn[iEn] > BVcEn[jEn] */ if(BVcEn[jEn] < CVcEn[kEn])

DVcEn[lEn++] = BVcEn[jEn++];

else if(BVcEn[jEn] == CVcEn[kEn]){

DVcEn[lEn++] = BVcEn[jEn++]; DVcEn[lEn++] = CVcEn[kEn++];

}else /* BVcEn[iEn] > CVcEn[kEn] */

DVcEn[lEn++] = CVcEn[kEn++];

/* Exhibición del vector resultante*/ dimDVcEn = dimAVcEn + dimBVcEn + dimCVcEn; for(iEn = 0; iEn < dimDVcEn; iEn++) printf("%d ", CVcEn[iEn]);

}

32

4.5

Diseño de decisiones con árboles S, parte III

4.5.1 Introducción

En esta parte III introducimos dos reglas de simplificación, la primera de ellas es intuitiva, la segunda no. Las ilustramos con dos ejemplos, siendo el segundo una generalización del primero.

4.5.2 Reglas 1 y 2

Considere la siguiente matriz esparcida (una con la mayoría de las entradas iguales a cero).

A =

(una con la mayoría de las entradas iguales a cero). A = Se almacenan las entradas

Se almacenan las entradas diferentes de cero con su posición en un vector como sigue:

X =

1 1 3 | 2 0 7 | 2 3 1 | 3 1 2
1
1 3
|
2 0 7
|
2
3 1
|
3 1
2
|
5
5 0

Se ha colocado el vector en forma horizontal, no vertical, por razones de espacio. Nótese que la tríada 1 1 3, corresponde a la posición 1 1 del valor 3, en la matriz A, y así sucesivamente. Nótese también que el valor con su posición correspondiente se han almacenado en el vector barriendo la matriz por hileras. La tríada 5 5 0 es el centinela.

El problema consiste en localizar el valor en la posición h(ilera), c(olumna). i(ndice) es el indice del vector X. Notese que el primer componente de las triadas en el vector es la hilera de la matriz A, la segunda componente es la columna y la tercera es el valor en esa hilera y columna.

33

XVcEn [iEn] < hEn XVcEn [iEn] = hEn XVcEn [iEn] > hEn XVcEn XVcEn XVcEn
XVcEn [iEn] < hEn
XVcEn [iEn] = hEn
XVcEn [iEn] > hEn
XVcEn
XVcEn
XVcEn
[iEn+1] <
[iEn+1] =
[iEn+1] >
cEn
cEn
iEn ←
iEn ←
ValorEn ←
ValorEn ←
ValorEn ←
iEn+3
iEn+3
XVcEn [iEn+2]
0
0
while(1)

If(X[i] < h)

i =

i + 3;

else if(X[i] == h) if(X[i+1] < c)

i

= i

+ 3;

else if(X[i+1] == c){

Valor = X[i+2]; escape; }else{ // X[i+1] >c Valor = 0;

escape; }else{ // X[i] < h Valor = 0; escape;

}

Figura 4. Nótese que el primer nivel de condicionales resuelve el subproblema de localizar la hilera h, y el segundo nivel resuelve el subproblema de localizar la columna c. El sombreado en los nodos es para aplicarles la Regla 1 la cual se define enseguida

34

Regla 2. Un árbol S puede simplificarse (contraerse) verticalmente si sus puntos de decisión a lo largo de una rama se unen mediante la conectiva lógica y.

Después de aplicar la Regla 1 al árbol anterior (Figura 4) obtenemos el siguiente árbol S (Figura 5)

XVcEn [iEn] < XVcEn [iEn] = En y Xi+1 < c Xi = h Xi
XVcEn
[iEn] <
XVcEn [iEn]
= En y Xi+1
< c
Xi = h
Xi = h
XVcEn
[iEn] >
y
y
hEn
hEn
IEn ←
IEn ←
ValorEn ←
ValorEn ←
ValorEn ←
iEn+3
iEn+3
XVcEn [iEn+2]
0
0

Figura 5. Árbol S resultante después de aplicar la Regla 1 a los nodos sombreados de la Figura 4. Los nuevos nodos en el árbol son los 2, 3 y 4. En esta figura se muestran dos pares de nodos sombreados; dos a la izquierda y dos a la derecha a los cuales se les aplica la Regla 2, la que se define más adelante.

La regla siguiente no resulta ser nada intuitiva para la mayoría de la gente.

Regla 2. Un árbol S puede simplificarse (contraerse) horizontalmente mediante la conectiva o inclusiva, si dos o más puntos de decisión provienen de un mismo punto de decisión y sus respectivos subárboles son idénticos.

Esta regla se puede aplicarse a las ramas 1 y 2, y a las ramas 4 y 5, del árbol anterior ya que cumplen con esta regla. Como consecuencia de aplicar esta regla tenemos el siguiente árbol equivalente al anterior.

35

(XVcEn [iEn] < hEn) O (XVcEn[iEn] == (Xi = h) (Xi > h) y O
(XVcEn [iEn] <
hEn) O
(XVcEn[iEn]
==
(Xi = h)
(Xi > h)
y
O
(Xi+1 = c)
(Xi = h
y
Xi+1 > c)
P
i ← i+3
Valor ← Xi+2
valor ← 0
El código correspondiente para esta árbol simplificado es el siguiente:

while(1)

If((X[i] < h) || ((X[i] == h) && (X[i+1] < c)))

= else if((X[i] == h) && (X[i+1] < c)){ valor = X[i+2]; escape;

i

i +

3;

}else // (X[i] > h

valor = 0; escape;

}

|| ((X[i] = h) && (X[i+1] > c))){

Este código es completamente equivalente al anterior, es decir, realizan la misma tarea. Obsérvese que la definición de árbol básico siempre nos permite el diseño de decisiones con condiciones sin negaciones.

4.5.3 El proceso cosecuencial

Ahora consideremos tres ejemplos que nos van a llevar a la idea de procesos cosecuenciales, es decir, a una pauta de diseño que parece ser más común de lo que se podría pensar. Primero consideremos un generalización del ejemplo 2. Tenemos dos vectores, X y Y, con enteros almacenados en orden ascendente, pueden repetirse algunos valores. La idea es intercalar en orden ascendente, en un tercer vector, los valores contenidos en los vectores X

36

Considere como ejemplos particulares los vectores X y Y siguientes. Nótese que al final aparece el centinela, 100, el mismo valor más grande que se puede colocar al final de ambos vectores. También se muestra el vector resultante W, el cual contiene los valores de X y Y también en orden ascendente.

Aι < Bj Ai = Bj Ai > Bj Ai < Ai > Ai =
Aι < Bj
Ai = Bj
Ai > Bj
Ai <
Ai >
Ai =
Ai >
Bi =
Bi >
Ai =
Ai <
Bi <
Ck
Ck
Ck
Ck
Ck
Ck
Ck
Ck
Ck

Dl Ai

l l+1

I i+1

Dl Ai

l l+1

Dl Ck

l l+1

I i+1

Dl Ck

l l+1

k k+1

Dl Ai

l l+1

Dl Bj

l l+1

i l+1

Dl

Ai

Dl Ck

l

l+1

l l+1

Dl

Bj

k k+1

l

l+1

Dl

Ck

Dl Bj

Dl

Bj

l

l+1

Dl

Ck

j

j+1

l

l+1

 

j

j+1

k

j+1

Dl Ck

l l+1

k k+1

Fig. X Árbol S que muestra la lógica para intercalar los valores de dos vectores en uno tercero, los dos vectores X y Y, y el vector resultante W, están ordenados ascendentemente

Como un segundo ejemplo consideremos una generalización del ejemplo XXX. Tenemos dos matrices esparcidas, A y B, representadas en forma vectorial, la idea es sumar las dos matrices, pero usando su forma vectorial, X y Y, para obtener un tercer vector, W, que representa a la matriz resultante C, la suma de las matrices A y B.

Consideremos, como un ejemplo particular, a las siguientes matrices

 

A

B

C

0

0 0 0 0

 

0

0 0 5 0

 

0

0 0 5 0

0

2 0 4 0

+

0

0 0 0 0

=

0

2 0 4 0

0

0 0 0 0

0

8 0 0 0

0

8 0 0 0

37

Los vectores correspondientes que representan a estas matrices son los siguientes: 112|134|317|341|550 I
Los vectores correspondientes que representan a estas matrices son los
siguientes:
112|134|317|341|550
I
035|218|31-7|423|550
=
035|112|134|218|341|423|550

Por razones de espacio los vectores se representan horizontalmente, separando con una línea vertical (|) cada tres de números; el primero representa la hilera, el segundo la columna y el tercero el valor en esa hilera y columna. Cada tríada de números se almaceno barriendo las matrices de izquierda a derecha y de arriba hacia abajo es decir por hileras. La tríada 550 es el centinela, representa una hilera y columna ficticias con una entrada igual a cero.

Xi < Yk Xi = Yk Xi > Yk Xi+1 < Yk+1 Xi+1 =Yk+1 Xi+1
Xi < Yk
Xi = Yk
Xi > Yk
Xi+1 < Yk+1
Xi+1 =Yk+1
Xi+1 > Yk+1
Xi+2 +Yk+2
Xi+2 +Yk+2
= 0
<> 0
i ← i+3
k ← k+3
Wj ← Xi+2 +
yk+2
Wj ← Xi
Wj ← Xi
i
← I+3
Wj ← Yk
Wj ← Yk
j ← j+3
k ← k+3
k
← k+3
j ← j+3
j ← k+3
i ← i+3
i ← i+3
j
← j+3
k ← k+3
k ← k+3
Fig, X Árbol S que muestra la lógica de sumar dos matrices esparcidas, A
y B, utilizando la representación vectorial, X y Y, de las matrices A y B, para
obtener un tercer vector resultante W, que se corresponde con la matriz
resultante C.

38

Unamos ahora las tres condiciones sombreadas del segundo nivel con la condición sombreada del primer nivel aplicando la regla 1. Obtenemos el siguiente árbol equivalente

Xi < Yk (Xi = Yk) y (Xi+1 =Yk+1) Xi > Yk (Xi = Yk)
Xi < Yk
(Xi = Yk) y (Xi+1 =Yk+1)
Xi > Yk
(Xi = Yk)
(Xi = Yk)
y
y
(Xi+1 < Yk+1)
(Xi+1 > Yk+1)
Xi+2 +Yk+2
Xi+2 +Yk+2
= 0
<> 0
Wj ← Xi
j ← j+3
Wj ← Xi
k ← k+3
i ← i+3
i ← i+3
k ← k+3
Wj ← Xi+2 + yk+2
Wj ← Yk
Wj ← Yk
i
← I+3
j ← j+3
j ← k+3
k
← k+3
k ← k+3
k ← k+3
i ← i+3
j
← j+3
Si ahora aplicamos la regla 2, a las dos condiciones sombreadas a la izquierda y
Si ahora aplicamos la regla 2, a las dos condiciones sombreadas a la izquierda y a
las dos sombreadas de la derecha, obtenemos el siguiente árbol simplificado:
(Xi = Yk) y (Xi+1 =Yk+1)
(Xi < Yk) o (Xi+1 <
(Xi > Yk) o (Xi+1 >
Yk+1)
Yk+1)
Xi+2 +Yk+2
Xi+2 +Yk+2
= 0
<> 0
Wj ← Xi
i ← i+3
Wj ← Xi+2 + Yk+2
Wj ← Yk
j
← j+3
k ← k+3
i
← I+3
j ← k+3
i
← i+3
k
← k+3
k ← k+3
j
← j+3

39

4.6

Diseño de programas con árboles S, parte IV

La siguiente regla la ilustraremos también mediante un ejemplo. Considere el caso en el que el cursor debe permanecer dentro de los limites de una ventana, como se ilustra a continuación.

Y0

X0 Xc Yc
X0
Xc
Yc

Yf

Xf

Los movimientos del cursor permitidos son: arriba, abajo, a la derecha y a la izquierda. Este problema puede dividirse en cinco subproblemas como sigue:

El primer subproblema es determinar que tecla de flecha se pulsó. El árbol S siguiente resuelve el primer subproblema.

TECLA= ← TECLA = → TECLA = ↑ TECLA= ↓ SUBPRO SUBPRO SUBPRO SUBPRO
TECLA= ←
TECLA = →
TECLA = ↑
TECLA= ↓
SUBPRO
SUBPRO
SUBPRO
SUBPRO

Nótese que no aparecen completas las condiciones de un árbol básico, faltan las siguientes:

(TECLA < ←, TECLA > ←) (TECLA ≠ ←) (TECLA < →, TECLA > →) (TECLA ≠ →) (TECLA < ↑, TECLA > ↓) (TECLA ≠ ↑) (TECLA < ↓, TECLA > ↓) (TECLA ≠ ↓)

40

El símbolo significa “es equivalente a”, y el símbolo “es diferente a”. Todas estas condiciones no nos interesan, es decir, son condiciones que no importan, estas condiciones pueden suprimirse o agregarse al final del árbol como un sola, mediante conectivas o inclusivos, para que sea la condición que se da por omisión (del condicional ) como sigue:

(TECLA ≠ ←) o (TECLA ≠ →) o (TECLA ≠ ↑) o (TECLA ≠ ↓)

las acciones bajo estas condiciones pueden ser cualesquiera y se igualan entre si, es decir si las acciones bajo las 8 condiciones son: A, B, C, D, E, F, G y H, entonces A=B=C=D=E=F=G=H = X, donde X es una acción conveniente al problema, por ejemplo en nuestro caso que nos ocupa podría ser el siguiente mensaje al usuario:

mensaje(Presione una tecla de flecha) TECLA = ← TECLA = → TECLA = ↓ TECLA
mensaje(Presione una tecla de flecha)
TECLA = ←
TECLA = →
TECLA = ↓
TECLA = ↑
C.P.O.
SUBPRO
SUBPRO
SUBPRO
SUBPRO
A
B
C
D

Donde C.P.O. significa Condición Por Omisión y el símbolo significa “no importa”, es decir:

C.O.P. = (TECLA ≠ ←) o (TECLA ≠ →) o (TECLA ≠ ↑) o (TECLA ≠ ↓)

= mensaje(Presione una tecla de flecha)

41

While(Bandera ¡= Escape) switch(TeclaPulsadaN){

case Cero:

switch(TeclaPulsada0){

case <-: Subproblema A, mantener el cursor a la derecha de x0; break; case ->: Subproblema B, mantener el cursor a la izquierda de xf break; case |: Subproblema C, mantener el cursor debajo de y0 break; case |: Subproblema D, mantener el cursor arriba de yf break; default: printf(“Presione una tecla de

flecha”);

}

break;

case Escape: Bandera = Escape;

break;

}

While(Bandera ¡= Escape) switch(TeclaPulsadaN){

case Cero:

switch(TeclaPulsada0){

case <-: Subproblema A, mantener el cursor a la derecha de x0; break; case ->: Subproblema B, mantener el cursor a la izquierda de xf break; case |: Subproblema C, mantener el cursor debajo de y0 break; case |: Subproblema D, mantener el cursor arriba de yf break;

}

case Escape: Bandera = Escape; break;

}

default: printf(“Presione una tecla de

flecha”);

break;

42

Consideremos ahora la solución del subproblema A; mantener el cursor a la derecha de x0, esto significa que la coordenada xc del cursor nunca debe estar sobre x0 (debemos evitarla), o a la izquierda de x0 (esta es una condición no importa). Para evitar que xc este sobre x0 debemos anticiparlo restándole 1 a xc, ya que el incremento en la coordenada x es hacia la derecha y el cursor avanza en sentido contrario, es decir:

X0 < Xc - 1 X0 = Xc -1 C.P.O. = X0 > Xc -
X0 < Xc - 1
X0 = Xc -1
C.P.O. = X0
> Xc - 1
Avanza cursor a la
izquierda
Suena campana
∅ = Suena
campana

La condición por omisión es una condición no importa, por lo que su acción se hace igual a la acción de la izquierda (suena campana) y podemos aplicar la regla

2.

X0 < Xc - 1 X0 >= Xc -1 Avanza cursor a Suena campana la
X0 < Xc - 1
X0 >= Xc -1
Avanza cursor a
Suena campana
la izquierda

Podemos integrar el código correspondiente al de este árbol, al código que resuelve el primer subproblema como sigue:

43

While(Bandera ¡= Escape) switch(TeclaPulsadaN){

case Cero:

switch(TeclaPulsada0){

case <-: Subproblema A, //mantener el cursor a la derecha de x0 if(x0 < xc – 1) gotoxy(--xc, yc); else // x0 >= Xc – 1 Suena campana break; case ->: Subproblema B, mantener el cursor a la izquierda de xf break; case |: Subproblema C, mantener el cursor debajo de y0 break; case |: Subproblema D, mantener el cursor arriba de yf break; default: printf(“Presione una tecla de

flecha”);

}

break;

case Escape: Bandera = Escape; break;

}

De manera similar pueden resolverse los tres subproblemas restantes. Este ejemplo nos permite establecer una tercera regla.

Regla 3 Una condición no importa en un árbol S, puede omitirse o se integra como una condición por omisión con una acción conveniente al problema o se le aplica la regla 2.

4.6.1 Introducción

4.6.2 Los enunciados switch y break

La instrucción switch es una alternativa a condicionales anidados. La cual tiene la siguiente forma general:

switch(caso){ case constante_1:

enunciado(s)_1

break; case constante_2:

44

enunciado(s)_2

break;

-

-

- case constante_N:

-

-

-

-

-

-

-

-

-

 

enunciado(s)_N

 

break;

 
 

default:

 

enunciado(s)_X

 

}

Este enunciado switch anterior es equivalente al siguiente enunciado de if anidados:

If (caso == constante_1)

enunciado(s)_1

else if(caso == constante_2)

enunciado(s)_2

else if(caso == constante_N) enunciado(s)_N else // defalut:

enunciado(s)_X

A continuación se presenta un ejemplo donde se ilustra el uso del enunciado y switch.

void main(void){ char OpcionCa, SsNn; int AEn, BEn;

while(1){

do{

printf("\n (S)uma de dos numeros enteros "); printf("\n (R)esta de dos numeros enteros "); printf("\n (P)roducto de dos numeros enteros "); printf("\n (D)ivision de dos numeros enteros "); printf("\n (N)o mas "); printf("\n\nSeleccione o S, o R, o P, o D, o N: "); fflush(stdin); scanf("%c", &OpcionCa); printf("\n"); }while (OpcionCa != 'S' && OpcionCa != 'R' && OpcionCa != 'P' &&

OpcionCa != 'D' && OpcionCa != 'N');

if(OpcionCa == 'N'){

45

puts("Hasta la vista !\n"); break;

}

puts("\nDame el par de valores de AEn y BEn separados por un

espacio en blanco\n"); scanf("%d %d", &AEn, &BEn);

switch (OpcionCa) { case 'S': printf("%d + %d = %d\n",AEn, BEn, AEn + BEn); break; case 'R': printf("%d - %d = %d\n",AEn, BEn, AEn - BEn); break; case 'P': printf("%d * %d = %d\n",AEn, BEn, AEn * BEn); break; case 'D': printf("%d / %d = %d\n",AEn, BEn, AEn / BEn); break;

}

puts("\nOtro Ejemplo ? S o s = Ssi, N o n = Nno: "); fflush(stdin); scanf("%c", &SsNn); if((SsNn == 'N') || (SsNn == 'n')){ puts("\nSe acabo el veinte !"); break;

}

}

}

4.6.3El enunciado continue

#include <stdlib.h> #include <conio.h> /* void IngresarFn(void){ printf("Estoy en Ingresar\n");

}

void SuprimirFn(void){ printf("Estoy en Suprimir\n");

}

void RevisarFn(void){ printf("Estoy en Revisar\n");

}

void SalirFn(void){ printf("Estoy en Salir\n");

46

exit(1);

}

*/ int MenuFnEn(void){ int OpcionEn;

do{

printf("1. Ingresar\n"); printf("2. Suprimir\n"); printf("3. Revisar\n"); printf("4. Salir\n"); printf("Seleccione un numero: "); scanf("%d", &OpcionEn); printf("\n"); }while (!((OpcionEn >= 1) && (OpcionEn <= 4))); return OpcionEn - 1;

}

void main(void){ char LeyendasArCd[4][16] = {{"Soy la opcion 1"}, {"Soy la opcion 2"}, {"Soy la opcion 3"}, {"Soy la salida "}}; //void (*OpcionesArApFn[])(void) = {IngresarFn, SuprimirFn, RevisarFn, SalirFn};

//(*OpcionesArApFn[MenuFnEn()])(); printf("%s\n", LeyendasArCd[MenuFnEn()]);

}

47

Bibliografía

Programación y el Lenguaje C

Brian W. Kernighan Rob Pike

La Practica de la Programación

Prentice Hall, 2000

Allen I. Holub

C + C++: Programming with Objects in C and C++

McGraw Hill, 1992

Derek Coleman

A Structured Programming Approach to Data

The MacMillan Press Ltd. 1983

R. C. Linger, H. D. Mills & B. I. Witt

Structured Programming:Theory and Practice

Addison Wesley, 1979

D. W. Barrón

Técnicas Recursivas en Programación Editorial Kapelusz, 1976

Solución de Problemas

H. Scott Fogler & Steven E. LeBlanc

Strategies for Creative Problem Solving, 2nd Ed.

Prentice Hall, 2008

Norma Apodaca y Hugo Rangel

Antología de la Estrategia de Divide y Vencerás

Colección de textos, 2007

Moshe F. Rubinstein & Iris R. Firstenberg Patterns of Problem Solving, 2nd Ed. Prentice Hall, 1995

Russell L. Ackoff

El Arte de Resolver Problemas

Editorial Limusa, S. A., 1983

Edward de Bono

El Uso del Pensamiento Lateral

Editorial Época, S. A., 1983

G. Polya

How to Solve It: A New Aspect of Mathematical Metod 2d. Ed.

Princeton University Press, 1945

Cognición, Aprendizaje, Ontología, Innovación y Creatividad

Henry Chesbrough, Win Vanhaverbeke & Joel West

Open Innovation

Oxford University Press, 2006

Jonathan Finkelstein

Learning in Real Time

Josey Bass, 2006

Peter Gärdenfors & Peter Johansen

Cognition, Education and Communication Techology

Lawrence Erlabaum Associates Publishers, 2005

National Research Council

How Students Learn: History, Mathematics, and Science in the Classroom

The National Academy Press, 2005

Margaret W. Matlin Cognition, 6ta. Ed. John Wiley & Sons, 2005

Peter Gärdenfors

Conceptual Spaces: The Geometry of Thougth

The MIT Press, 2004

Dominic Widdows

Geometry and Meaning

CLSI Publications, 2004

Asunción Gómez-Pérez, Mariano Fernández-López & Oscar Corcho

Ontological Engineering

Springer, 2004

Nancy M. Dixon

El Conocimiento Común

Oxford University Press, 2001

John M. Carroll

Minimalism Beyond the Nurnberg Funnel

The MIT Press, 1998

Mihaly Csikszentmihalyi

Creatividad

Páidos, 1996

John G. Benjafield Cognition, 2d Ed.

49

Prentice Hall, 1997

John M Carroll

The Nurnberg Funnel: Designing Minimalist Instruction for the Practical Computer Skill

The MIT Press, 1992

Richard Foster

Innovation

Summit Books, 1986

Mapas Mentales, Conceptuales, Semánticos y la Mayéutica

Joan E. Heimlich & Susan D. Pottelman

Elaboración de Mapas Semánticos como Estrategias de Aprendizaje

Editorial Trillas, 2007

Lou Marinoff

Pregúntale a Platón

Ediciones B, S. A., 2006

Andreas Knopfel, Bernhard & Peter Tabeling

Fundamental Modeling Concepts

John Wiley and Sons, 2005

Antonio Ontoria Mapas Conceptuales Alfa Omega, 2003

Jean-Mare Lévy-Leblond

Conceptos Contrarios o el oficio de científico

Tusquets Editores, 2002

Christopher Phillips

Sócrates Café: un soplo fresco de filosofía

Ediciones Temas de Hoy., 2002

Tony Buzan

El Libro de los Mapas Mentales

Ediciones Urano S. A. 1996

Lecturas Recomendadas

Malba Tahan

El Hombre que Calculaba

Editorial Limusa S. A. de C. V., 2007

Marcelo C. Borboa & Mónica E. Villareal

50

Humans-with-Media and the Reorganization of Mathematical Thinking: Information and Communication Technologies, Modeling, Experimentation and Visualization

Springer, 2006

Paula Carlino

Escribir, Leer y Aprender en la Universidad

Fondo de Cultura Económica, 2005

Alfredo López Austin

El Modelo en la Ciencia y la Cultura

Siglo Veintiuno Editores, 2005

Y. Perelman

Física Recreativa Tomos I y II

Ediciones Quinto Sol, 2004

Edward F. Redish

Teaching Physics

John Wiley & Sons, 2003

Y. Perelman

Matemáticas Recreativa

Ediciones Quinto Sol, 2001

Y. Perelman

Álgebra Recreativa

Ediciones Quinto Sol, 2000

John N. Shive & Robert L. Weber

Similarities in Physics

Adam Higler Ltd, Bristol, 1982

Morris Kline

El Fracaso de las Matemáticas Modernas: Por que Juanito no sabe sumar

Siglo Veintiuno Editores, 1976

Robert R. Korfhage

Lógica y Algoritmos

Editorial Limusa, 1974

51

Glosario:

Proyecto:

Es una planificación que consiste en un conjunto de actividades concretas que se encuentran interrelacionadas y coordinadas; la razón de un proyecto es alcanzar objetivos específicos dentro de los límites que imponen un presupuesto y un lapso de tiempo previamente definidos.

Metodología:

Se refiere a los métodos de investigación que se siguen para alcanzar una serie de objetivos en una ciencia o disciplina.

Resolución de problemas:

Consiste en una búsqueda sistemática para encontrar el origen del problema y así poder resolverlo. Por tanto, es la descripción del malfuncionamiento (los síntomas). Por lo general, para listar los problemas posibles, se emplea el mensaje de error que el sistema generaría en caso de presentarse, o una breve descripción de las características anómalas.

Problemas:

Conjunto de hechos o circunstancias que dificultan la consecución de algún fin.

Objetivo:

Un propósito o meta que se propone a cumplir en un lapso definido de tiempo

Aprendizaje:

Es el proceso a través del cual se adquieren nuevas habilidades, destrezas, conocimientos, conductas o valores como resultado del estudio, la experiencia, la instrucción y la observación.

Estrategia:

Es un conjunto de acciones que se llevan a cabo para lograr un determinado fin.

Programar:

Es la acción en la cual se realiza el proceso por el cual se escribe (en un lenguaje de programación), se prueba, se depura y se mantiene el código fuente de un programa informático.

Algoritmo:

Es una lista bien definida, ordenada y finita de operaciones que permite hallar la solución a un problema. Dado un estado inicial y una entrada, a través de pasos sucesivos y bien definidos se llega a un estado final, obteniendo una solución.

Analogía:

Es la semejanza o afinidad de relaciones existentes entre dos pares de palabras. Esta semejanza emerge a raíz del proceso de comparación y se consolida considerando los rasgos más importantes y notorios de dichas relaciones.

52

Asignatura:

Materia que imparte un profesor o maestro a sus alumnos y que forma parte del plan de estudios.

Concepto:

Son construcciones o imágenes mentales, por medio de las cuales comprendemos las experiencias que emergen de la interacción con nuestro entorno, a través de su integración en clases o categorías relacionadas con nuestros conocimientos previos. Y describen un objeto o una acción.

Contenido:

Conjunto de cada una de las partes que constan en una unidad.

Alumno:

Discípulo, respecto de su maestro, de la materia que está aprendiendo o de la escuela, colegio o universidad donde estudia.

Docente:

Perteneciente o relativo a la enseñanza.

Lenguaje:

Conjunto de signos y reglas que permite la comunicación.

Lenguaje de programación:

Un lenguaje de programación es un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Es utilizado para controlar el comportamiento físico y lógico de una computadora.

Analfabetismo:

Falta de instrucción elemental en un país, referida especialmente al número de sus ciudadanos que no saben leer.

53