Metodologia de La Programacion Cap 1

37
M. Sc. Ing. Lucas Coaquira Cano 1 CAP. 1. MODULARIDAD. TIPOS ABSTRACTOS DE DATOS FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Transcript of Metodologia de La Programacion Cap 1

Page 1: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 1

CAP. 1.

MODULARIDAD. TIPOS

ABSTRACTOS DE DATOS

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Page 2: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 2

1.1 MODULARIDAD

La modularidad es la posibilidad de subdividir una

aplicación en piezas mas pequeñas (denominadas

módulos), cada una de las cuales debe ser tan

independiente como sea posible, considerando la aplicación

como un todo, así como de las otras piezas de las cuales es

una parte.

En esencia las abstracciones se implementan en módulos,

conocidos en la terminología de Booch como objetos, que

se agrupan en una sola entidad:

• Un conjunto de datos

• Un conjunto de operaciones que actúan sobre los datos

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Page 3: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 3

1.1.1 La estructura de un modulo

Un modulo se caracteriza fundamentalmente por su interfaz y por su

implementación.

Primitivas de acceso

Descripción de propiedades de los datos

Atributos Algoritmos

Representación Parámetros actuales

Interfaz

Sección

privada

Figura 1.1. Estructura de un modulo

1.1.2 Reglas de modularizacion

Un método de diseño debe ayudar al programador a resolver un

problema, dividiendo el problema en subproblemas mas pequeños, que

se puedan resolver independientemente unos de otros. También debe

ser fácil conectar los diferentes módulos a los restantes

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Page 4: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 4

Para obtener módulos con las características anteriores deben seguirse

las siguientes reglas:

Unidades modulares

El lenguaje debe proporcionar estructuras modulares con las cuales se

puedan describir las diferentes unidades.

Interfaces adecuados

En la estructuración de un programa en unidades es beneficioso que

existan pocos interfaces y que estos sean pequeños.

Pocos

interfaces

Muchos

interfaces

Figura 1.2. Interfaces adecuados (pocos – muchos)

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Page 5: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 5

Parte

visible

Interfaces

grandes

Interfaces

pequeños

Figura 1.3. Interfaces adecuados (grandes – pequeños)

Parte

visible

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Page 6: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 6

Interfaces explícitos

El interfaz o parte visible externamente de un modulo se debe declarar y

describir explícitamente; el programa debe especificar cuales son los

datos y procedimientos que un modulo trata y cuales deben permanecer

ocultos del exterior.

Ocultación de la información

Todos los módulos deben seguir el principio de ocultación de la

información.

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Page 7: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 7

1.2 DISEÑO DE MODULOS

1.2.1 Acoplamiento de módulos

El acoplamiento es una medida de interdependencia entre módulos, es decir, el

modo en que un modulo esta afectado por la estructura interna de otro modulo.

1.2.2 Cohesión de módulos

La cohesión describe la naturaleza de las interacciones dentro de un modulo

software. Es decir un módulo cohesivo solo hace (idealmente) una cosa (o

realizar una sola funcion relacionada con el problema).

Tipo de acoplamiento Grado de acoplamiento Grado de mantenibilidad

Por contenido Alto (fuerte) Bajo

Común

De control

Por sellado (estampado)

Datos

Sin acoplamiento Bajo (débil) Alto

Tabla 1.1 Clasificación del acoplamiento de módulos

LENGUAJE DE PROGRAMACION

Page 8: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 8

Tipo de cohesión Grado de cohesión Grado de mantenimiento

Por coincidencia Bajo Bajo

Lógica

Por procedimientos

Por comunicaciones

Secuencial

Funcional

Informacional Alto Alto

Tabla 1.2 Clasificación de cohesión de módulos

Idealmente, se busca módulos altamente cohesivos y débilmente acoplados.

1.3 TIPOS DE DATOS

Un tipo de dato es un conjunto de valores y un conjunto de

operaciones definidas por esos valores.

Representación + Operaciones

LENGUAJE DE PROGRAMACION

Page 9: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 9

1.4 ABSTRACCION EN LENGUAJES DE

PROGRAMACION

Los tipos de datos que se construyen en un compilador de

este modo se conocen como tipos de datos fundamentales

(predefinidos) y, por ejemplo, en C y C++ son entre otros, int, char y float.

Los lenguajes de programación (LP) son las herramientas

mediante las cuales los diseñadores de lenguajes pueden

implementar los modelos abstractos.

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

La abstracción ofrecida por los LP se puede dividir en dos categorías:

Abstracción de control y Abstracción de datos.

Page 10: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 10

Abstracción

Propiedad que permite representar las características mas esenciales de un objeto, sin preocuparse de las restantes características (no esenciales).

La abstracción como proceso natural mental

Las persona comprenden mejor el mundo construyendo modelos mentales

Page 11: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 11

1.4.1 Abstracciones de control

Los primeros lenguajes de programación de alto nivel introdujeron las

estructuras de control: sentencias de bifurcación (if) y bucles (for, while,

do-loop, etc.).

Abstracción procedimental (por procedimientos)

Utilización de procedimientos o funciones

Otros mecanismos de abstracción de control

Tales como manejo de excepciones, corrutinas, unidades concurrentes,

plantillas.

1.4.2 Abstracción de datos

Es la técnica de programación que permite inventar o definir nuevos

tipos de datos (tipos de datos definidos por el usuario) adecuados a la

aplicación que se desea realizar.

Los nuevos tipos de datos definidos por el usuario se llaman tipos

abstractos de datos.

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Page 12: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 12

1.5 TIPO ABSTRACTO DE DATO (TAD)

Un tipo definido por el programador se denomina tipo abstracto de

dato, TAD (Abstract Data Type).

La modularizacion de un programa utiliza la noción de tipo abstracto de

dato (TAD) siempre que sea posible. Si el TAD soporta los tipos que

desee el usuario y el conjunto de operaciones sobre cada tipo, se

obtiene un nuevo tipo de dato denominado objeto.

La implementación de un tipo abstracto de dato consta de:

1. La representación: elección de las estructuras de datos.

2. Las operaciones: elección de los algoritmos.

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Page 13: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 13

Un TAD se compone de estructuras de datos y los procedimientos o

funciones que manipulan esas estructuras de datos.

TAD = Representación (datos) + Operaciones (funciones y procedimientos)

La estructura de un tipo abstracto de dato (clase), desde un punto de

vista global, se compone del interfaz publico y de la implementacion.

Implementación privada

Interfaz público

Método 1

Método 3

Método 2

Método 4

Representación: Estructuras de datos (variables de instancia)

Implementación de métodos:

Código del método 1

Código del método 2

Código del método 3

Código del método 4

Figura. Estructura de un TAD

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Page 14: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 14

1.5.1 Ventajas de los tipos abstractos de datos

1. Permite una mejor conceptualizacion y modelado del mundo real.

2. Mejora la robustez del sistema.

3. Mejora el rendimiento.

4. Separa la implementación de la especificación.

5. Permite la extensibilidad del sistema.

1.5.2 Abstracción de datos y TAD

La abstracción define el dominio y estructura de los datos, junto con una

colección o conjunto de operaciones que acceden a los datos.

La idea fundamental de la abstracción de datos conduce a la separación

de la especificación de una estructura de datos (lo que hace) de la

implementación (como lo hace). Esta idea se representa en el tipo

abstracto de dato.

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Page 15: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 15

Formato de un TAD

Una descripción de un TAD incluye una cabecera con el nombre del TAD, una

descripción del tipo de datos y una lista de operaciones

TAD Nombre_TAD es

Datos

Describir la estructura de los datos.

Operaciones

Constructor

Valores iniciales: Datos utilizados para iniciar objeto

Proceso : Iniciar el objeto

Operación

Entrada : Datos del cliente

Precondiciones : Estado necesario del sistema antes

de ejecutar la acción

Salida : Acciones ejecutadas con los datos

Postcondiciones : Estado del sistema después de

ejecutar la operación.

Operación2

... ...

Operación3

... ...

Fin TAD Nombre_TAD

Page 16: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 16

Ejemplo de TAD

Describir el TAD Circulo (conjunto de puntos equidistante de un punto llamado

centro). Incluye operaciones de calcular la longitud de la circunferencia y el área

del círculo.

TAD Circulo es

Datos

Numero real no negativo que especifica radio de circulo

Operaciones

Constructor

Valores iniciales: El radio del círculo

Proceso : Asigna valor inicial al circulo

Area

Entrada : Ninguna

Precondiciones : Ninguna

Proceso : Calculo del área del circulo

Salida : Devuelve el área

Postcondiciones : Ninguna

Circunferencia

Entrada : Ninguna

Precondiciones : Ninguna

Proceso : Calcular la circunferencia

Salida : Devuelve la circunferencia

Postcondiciones : Ninguna

Fin TAD Circulo

Page 17: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 17

1.3 IMPLEMENTACION DE TIPOS ABSTRACTOS DE

DATOS EN C

TAD Números complejos. Ejemplo TAD complejo

NUMEROS COMPLEJOS

Son aquellos elementos del sistema los cuales se representan mediante:

Z = a + bi o Z = (a, b)

El conjunto cumple con todos los axiomas de R con excepción de la relación de

orden.

Donde:

a : Es la componente real

b : Es la componente imaginaria

i : Es la unidad imaginaria establecida por:

Z : Es la variable compleja

a + bi : Es el numero complejo

(a, b) : Es el numero o par complejo

11 2 ii

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Page 18: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 18

Ejemplo: Z = 3 + 17i = (3, 17) es un numero complejo

Definiciones:

(1o) Si: Z = a + bi es un numero complejo

Z = a – bi es el complejo conjugado

Z* = - a – bi es el complejo opuesto

(2o) Igualdad de números complejos

si: a + bi = m + ni a = m y b = n

(3o) Nulidad de números complejos

si: a + bi = 0 a = 0 y b = 0

Potencias de i

mmkkk iiiiigeneralEn

i

ii

i

ii

41144

4

3

2

1

;,1:

1

1

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Page 19: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 19

Algebra de los números complejos:

Se realizan mediante los axiomas del conjunto R

Ejemplo:

Adición: (2+15i) + (3+8i) = (2+3) + (15+8)i = 5 + 23i

Sustracción: (5+7i) – (9+2i) = (5 – 9) + (7 – 2)i = -4 + 5i

Multiplicación: (4+3i) (2+11i) = 8 + 44i + 6i + 33i = 8 + 50i – 33 = -25 + 50i

División:

22

10

11

10

17

9

515412

33

354

3

542

2 i

i

iii

ii

ii

i

i

Para dividir expresiones complejas, se expresa el cociente en forma de fracción

y se racionaliza el denominador de esta fracción, multiplicando ambos términos

de la fracción por la conjugada del denominador.

Si Z = a + bi es un numero complejo

Z = a – bi es el complejo conjugado

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Page 20: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 20

1.4 IMPLEMENTACION DE TIPOS ABSTRACTOS DE

DATOS EN C++

En C++ la herramienta de abstracción de datos que permite la creacion de

nuevos tipos se denomina clase (class). Una clase es un tipo de dato que

incluye datos y operaciones que manipulan esos datos. La clase es la entidad

principal de los lenguajes de programación orientados a objetos.

Ejemplo: Clase complejo

FUNDAMENTOS DE LENGUAJE DE PROGRAMACION

Page 21: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 21

//Archivo: complejo.h

#ifndef COMPLEJO

#define COMPLEJO

class complejo{

private:

float r, i;

public:

complejo nuevo_complejo(float x, float y);

float real(complejo c);

float imag(complejo c);

complejo sumar(complejo a, complejo b);

};

#endif

Page 22: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 22

//archivo: complejo.cpp

#include "complejo.h"

complejo complejo::nuevo_complejo(float x, float y)

{

complejo c;

c.r = x;

c.i = y;

return c;

}

float complejo::real(complejo c)

{

return c.r;

}

float complejo::imag(complejo c)

{

return c.i;

}

Page 23: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 23

complejo complejo::sumar(complejo a, complejo b)

{

complejo c;

c.r = a.r + b.r;

c.i = a.i + b.i;

return c;

}

Page 24: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 24

//Archivo: Prueba.cpp

#include <iostream>

#include "complejo.h“

using namespace std;

void main()

{

complejo x, y, z;

float a, b, c, d;

x = x.nuevo_complejo(a, b);

y = y.nuevo_complejo(c, d);

cout << "x= “ << “(“ << x.real(x) <<“,” << x.imag(x) << “)” <<

endl;

cout << “y= “ << “(“ << y.real(y) <<“,” << y.imag(y) << “)” <<

endl;

z = z.sumar(x, y);

cout << "x+y= “ << “(“ << z.real(z) <<“,” << z.imag(z) << “)”

<< endl;

}

Page 25: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 25

/*Tipo Abstracto de Datos en C*/

/*archivo: complejo.h*/

#ifndef COMPLEJO

#define COMPLEJO

typedef struct{

float r, i;

}complejo;

complejo nuevo_complejo(float x, float y);

float real(complejo c);

float imag(complejo c);

complejo sumar(complejo a, complejo b);

#endif

Page 26: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 26

/*archivo: complejo.c*/

#include "complejo.h"

complejo nuevo_complejo(float x, float y)

{

complejo c;

c.r = x;

c.i = y;

return c;

}

float real(complejo c)

{

return c.r;

}

float imag(complejo c)

{

return c.i;

}

Page 27: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 27

complejo sumar(complejo a, complejo b)

{

complejo c;

c.r = a.r + b.r;

c.i = a.i + b.i;

return c;

}

complejo restar(complejo a, complejo b)

{

complejo c;

c.r = a.r - b.r;

c.i = a.i - b.i;

return c;

}

int igual(complejo a, complejo b)

{

return (a.r == b.r && a.i == b.i);

}

Page 28: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 28

complejo multiplicar(complejo a, complejo b)

{

complejo c;

c.r = a.r * b.r - a.i * b.i;

c.i = a.r * b.i + a.i * b.r;

return c;

}

complejo dividir(complejo a, complejo b)

{

complejo c;

float denom = b.r * b.r + b.i * b.i;

c.r = (a.r * b.r + a.i * b.i)/denom;

c.i = (a.i * b.r - a.r * b.i)/denom;

return c;

}

Page 29: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 29

/*archivo: prueba.c*/

#include <stdio.h>

#include "complejo.h"

void main()

{

complejo x, y, z;

x = nuevo_complejo(2, 3);

y = nuevo_complejo(4, 5);

printf("x = (%f, %f)\n", real(x), imag(x));

printf("y = (%f, %f)\n", real(y), imag(y));

z = sumar(x, y);

printf("(x + y) = (%f, %f)\n", real(z), imag(z));

}

Page 30: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 30

1.5 IMPLEMENTACION DE TIPOS ABSTRACTOS DE

DATOS EN JAVA

//Archivo Complejo.java

public class Complejo{

private double r, i;

Complejo(double x, double y)

{

r = x;

i = y;

}

public double real() {

return r;

}

public double imag(){

return i;

}

Page 31: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 31

public static Complejo suma(Complejo x, Complejo y)

{

Complejo temp = new Complejo(0, 0);

temp.r = x.r + y.r;

temp.i = x.i + y.i;

return temp;

}

}

Page 32: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 32

//Archivo: Prueba.java

public class Prueba {

public static void main(String args[])

{

Complejo a = new Complejo(40,56);

Complejo b = new Complejo(10,12);

Complejo c = new Complejo(0, 0);

c = Complejo.suma(a, b);

System.out.println("a + b = (" + c.real() + " ," + c.imag() + ")");

}

}

Page 33: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 33

#ifndef COMPLEJO2

#define COMPLEJO2

class complejo{

private:

float r, i;

public:

complejo nuevo_complejo(float x, float y);

float real(complejo c);

float imag(complejo c);

complejo sumar(complejo a, complejo b);

complejo restar(complejo a, complejo b);

complejo multiplicar(complejo a, complejo b);

complejo dividir(complejo a, complejo b);

};

#endif

Page 34: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 34

//archivo: complejo2.cpp

#include "complejo2.h"

complejo complejo::nuevo_complejo(float x, float y)

{

complejo c;

c.r = x;

c.i = y;

return c;

}

float complejo::real(complejo c)

{

return c.r;

}

float complejo::imag(complejo c)

{

return c.i;

}

Page 35: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 35

complejo complejo::sumar(complejo a, complejo b)

{

complejo c;

c.r = a.r + b.r;

c.i = a.i + b.i;

return c;

}

complejo complejo::restar(complejo a, complejo b)

{

complejo c;

c.r = a.r - b.r;

c.i = a.i - b.i;

return c;

}

Page 36: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 36

complejo complejo::multiplicar(complejo a, complejo b)

{

complejo c;

c.r = a.r * b.r - a.i * b.i;

c.i = a.r * b.i + a.i * b.r;

return c;

}

complejo complejo::dividir(complejo a, complejo b)

{

complejo c;

float denom = b.r * b.r + b.i * b.i;

c.r = (a.r * b.r + a.i * b.i) / denom;

c.i = (a.i * b.r - a.r * b.i) / denom;

return c;

}

Page 37: Metodologia de La Programacion Cap 1

M. Sc. Ing. Lucas Coaquira Cano 37

#include "complejo2.h"

#include <iostream>

using namespace std;

void main()

{

complejo x, y, z;

/*float a, b, c, d;

cout << "Ingrese el primer numero complejo: ";

cin >> a >> b;

cout << "Ingrese el segundo numero complejo: ";

cin >> c >> d; */

x = x.nuevo_complejo(6, 2);

y = y.nuevo_complejo(8, 3);

cout << "x= " << "(" << x.real(x) <<"," << x.imag(x) << ")" << endl;

cout << "y= " << "(" << y.real(y) <<"," << y.imag(y) << ")" << endl;

z = z.multiplicar(z.sumar(x, y), x);

cout << "(x+y)*x = " << "(" << z.real(z) <<"," << z.imag(z) << ")" << endl;

}