Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Programacion en Lenguaje Estructurado

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 38

PROGRAMACIN AVANZADA EN LENGUAJE ESTRUCTURADO

La programacin estructurada es una teora de programacin que consiste en construir programas de


fcil comprensin.

La programacin estructurada es especialmente til, cuando se necesitan realizar correcciones o


modificaciones despus de haber concluido un programa o aplicacin. Al haberse utilizado la
programacin estructurada, es mucho ms sencillo entender la codificacin del programa, que se habr
hecho en diferentes secciones.

La programacin estructurada se basa en una metodologa de desarrollo de programas llamada


refinamiento sucesivo: Se plantea una operacin como un todo y se divide en segmentos ms sencillos o
de menor complejidad. Una vez terminado todos los segmentos del programa, se procede a unificar las
aplicaciones realizadas por el pool de programadores. Si se ha utilizado adecuadamente la programacin
estructurada, esta integracin debe ser sencilla y no presentar problemas al integrar la misma, y de
presentar algn problema, ser rpidamente detectable para su correccin.

La representacin grfica de la programacin estructurada se realiza a travs de diagramas de flujo o


flow chart, el cual representa el programa con sus entradas, procesos y salidas.

La programacin estructurada propone segregar los procesos en estructuras lo ms simples posibles, las
cuales se conocen como secuencia, seleccin e interaccin. Ellas estn disponibles en todos los
lenguajes modernos de programacin imperativa en forma de sentencias. Combinando esquemas
sencillos se pueden llegar a construir sistemas amplios y complejos pero de fcil entendimiento.

ARREGLOS UNIDIMENSIONALES Y BIDIMENSIONALES.

Un arreglo es una coleccin de variables del mismo tipo que se referencian por un nombre comn. A un
elemento especfico de un arreglo se accede mediante un ndice. En C todos los arreglos constan de
posiciones de memoria contiguas. La direccin ms baja corresponde al primer elemento y la ms alta al
ltimo. Los arreglos pueden tener una o varias dimensiones. El arreglo ms comn en C es la cadena,
que simplemente es un arreglo de caracteres terminado por uno nulo.

Los arreglos unidimensionales son listas de informacin del mismo tipo que se guardan en posiciones
contiguas de memoria segn el orden del ndice.

La forma general de declaracin es:

Tipo nombre_variable[tamao];

Los arreglos tienen que declararse implcitamente para que el compilador reserve espacio en memoria
para ellos. El tipo declara el tipo de los elementos del arreglo, el tamao indica cuntos elementos
mantendr el arreglo.

Para declarar un arreglo de 10 elementos denominado p y de tipo caracter, se escribe:

char p[10];

En este caso hemos declarado un arreglo que tiene 10 elementos, desde p[0] hasta p[9].
En C todos los arreglos tienen el 0 como ndice de su 1er elemento.

C no comprueba los lmites de los arreglos. Se puede pasar cualquier extremo de un arreglo y escribir en
alguna otra variable de datos e incluso en el cdigo del programa.

ARREGLOS BIDIMENSIONALES (JAVA)

Los arreglos bidimensionales son estructuras de tamao fijo organizadas por filas y columnas. Estas
estructuras almacenan valores del MISMO TIPO de dato. Cada posicin se identifica por la fila y la
columna. Por lo general, estas estructuras se conocen con el nombre de matrices.

Cmo se define un arreglo bidimensional en Java?

Si se va a definir un arreglo bidimensional de tipo entero de 3 filas y 5 columnas, llamado matriz, sera
as:

int matriz[][] = new int [3][5]

Por otro lado, si se va a definir un arreglo bidimensional de tipo real de 2 filas y 2 columnas llamado
matriz, sera as:

double matriz[][]=new double[2][2]

Nota: Primero va el nmero de filas y luego el nmero de columnas.

Cmo se guardan los elementos en un arreglo bidimensional?

Se utiliza el nombre de la matriz, seguido de parntesis cuadrado con el nmero de la fila y


posteriormente otro parntesis cuadrado con el nmero de la columna.
Cmo se accede a los datos almacenados en un arreglo bidimensional? Si se quiere tener acceso a solo
una posicin de la matriz, se hace as:

System.out.println(K[1][1]);

Imprime 9 por consola, que es el valor almacenado en la fila 1, columna 1.

Si del mismo arreglo bidimensional queremos sumar 3 posiciones puntuales, lo haremos as:

Int suma = K[2][0] + K[0][2] + K[1][4];

Suma = 12 + 1 + 21

Suma = 34
APUNTADORES (Lenguaje C)

Los apuntadores son una parte fundamental de C. Si usted no puede usar los apuntadores
apropiadamente entonces est perdiendo la potencia y la flexibilidad que C ofrece bsicamente

C usa los apuntadores en forma extensiva. Porqu?

Es la nica forma de expresar algunos clculos


Se genera cdigo compacto y eficiente
Es una herramienta muy poderosa.

C usa apuntadores explcitamente con:


Arreglos
Estructuras y
Funciones

Se debe entender un apuntador como una variable que tiene una direccin de memoria. Por esto se les
dice apuntan a un lugar de la memoria.

Por ejemplo, veamos la siguiente declaracin:

int *ptrTotal;

//Estamos diciendo ptrTotal es un puntero que apuna a un valor enterio (int)

double *ptrLiquidacin;

//ptrLiquidacin apunta a un valor double.

int *ptrTotal, contador;

//aqui tenemos una variable ptrTotal que apunta a un entero

//y una variable contador de tipo entera.

//no se debe asumir que contador es tambin un apuntador, ya que el * no se distribuye.

OPERADORES

El operador de direccin (&) devuelve la direccin de memoria de su operando.

int x = 3;

int *ptr;

ptr = &x;

Declaramos un variable entera x y le asignamos 3, luego declaramos un apuntador a un entero (ptr), y


en la ltima instruccin, asignamos a ptr la direccin de la primera variable.

Desreferenciar (*)

Si hacemos:

Cout << *ptr;

Mostrara el valor 3 por pantalla, ya que el operador *, desreferencia el operando al cual se le aplica o
sea muestra el contenido que hay en la direccin de memoria a la cual esta apuntando en este caso el
valor de x.

*ptr = 10;

Equivale a x=10, ya que ptr est apuntando a x.


Los operadores & y *, son inversos cuando se aplican juntos en cualquier orden se obtiene el mismo
resultado.

ARREGLOS Y APUNTADORES

Existe una estrecha relacin entre apuntadores y arreglos, tanto que pueden ser usados en
forma casi indistinta.
Una variable de tipo arreglo puede considerarse como un apuntador al tipo del arreglo
Los apuntadores pueden ser utilizados en cualquier operacin que involucre subndices de
arreglos.

Ejemplo.

#include<stdlib.h>
#include<stdio.h>
int main()
{
int table[10].i.x.*pt.*ptr:
pt = &tabla[0]
x=*pt:

for (i=0: i<10:i++)


*(pt+i)=rand()%100;
ptr = tabla;

for(i=0:i<10:i++)
printf(%d \n.*(ptr+i).tabla[i]);
}

Cuando se suma a 1 apuntador el incremento se adecua al tamao en memoria del objeto


apuntado.
Un apuntador es una variable, por lo que operaciones como pa = a y pa++ son permitidas.
Un nombre de un arreglo es una constante, no una variable, de ah que a = pa o a++ o p = a

ARREGLOS DE APUNTADORES

Los arreglos pueden contener apuntadores


El uso ms comn es el de formar arreglos de cadenas de caracteres
Cada entrada en el arreglo es un apuntador al primer carcter de la cadena

Sea la declaracin:
char * mensaje[4] = {Hola.Adios.Bye.Salir}

Cada cadena est almacenada en memoria como una cadena de caracteres terminada en NULL n0
En el arreglo no estn colocadas las cadenas, tan solo estn almacenados los apuntadores
Aunque el arreglo es de tamao fijo, permite el acceso a cadenas de caracteres de cualquier
longitud

INICIALIZACIN DE ARREGLOS DE APUNTADORES

#include<stdlib.h>

#include<stdio.h>

int main()

int x:

char * mes[] = {

mes ilegal.

enero.

febrero.

marzo.

abril.

mayo.

junio.

julio.

agosto.

septiembre.

octubre.

noviembre.

diciembre.

}:

x = rand()%12;

printf(El mes %d corresponde a %s \n.x.mes[x]):

}
DETALLES INICIALIZACIN DE ARREGLOS DE CARACTERES

A diferencia de un apuntador. Un arreglo inicializado por un string puede ser modificado. Los caracteres
individuales pueden ser cambiados despus.

Inicializacin arreglos caracteres

#include<stdio.h>

Int main()

char*esp[10]={

uno

dos

tres

char frances [5][10]={

un.

deux.

trois

}:

printf(Elemen: 123456789n);

for (i=:i<3:i++)

printf(Esp[%d]:%s\n.i.esp[i]);

for(i=0:i<3:i++)

printf(Fra[%d]:%s\n.i.esp[i]);

printf(\nEsp: Elemento 3 de la entrada 2 %c \n.esp[2][3]);

printf(Fra: Elemento 4 de la entrada 3 %c\n.frances[3][4]);

printf(Esp:Elemento 7 de la entrada 2 %c\n.esp[2][7]);

francs[3][4]=A:

printf(Fra:Elemento 4 de la entrada 3 %c \n..frances[3][4]);

esp[2][3]=A:/*Segmentation fault (core dumped) */


printf(Elemento 3 entrada 2 esp: %c \n.esp[2][3]);

APUNTADORES Y ARREGLOS MULTIDIMENSIONALES

Cuando se ve la referencia a un arreglo de dos dimensiones. a[i][i]. no se puede deducir inmediatamente


como fue declarado a:

Como un arreglo de 10 arreglos de tamao 20

int *a[10][20]
Como un arreglo de tamao 20 de vectores de longitud variable
Int *a[10]:
Como un apuntador de apuntadores a enteros

int **a

Como un apuntador a un arreglo de enteros de tamao 20


int(*a)[20];
Para poder direccionar un elemento de un apuntador de apuntadores se sigue la regla:

tab[i][i]*(*(tab+i)+j)

APROXIMACIN NUMRICA Y ERROR

Se entiende por aproximacin numrica X* una cifra que representa a un nmero cuyo valor exacto es
X. En la medida en que la cifra X* se acerca ms al valor exacto X, ser una mejor aproximacin de ese
nmero. Ejemplos:

3.1416 es una aproximacin numrica de PI


2.7183 es una aproximacin numrica de e
0.333333 es una aproximacin numrica de 1/3

El error de aproximacin o error numrico es una medida del ajuste de la medida o clculo de una
magnitud con respecto al valor real o terico que dicha magnitud tiene. Un aspecto importante de los
errores de aproximacin es su estabilidad numrica. Dicha estabilidad se refiere a como dentro de un
algoritmo de anlisis numrico el error de aproximacin es propagado dentro del propio algoritmo.

ERRORES INHERENTES, DE REDONDEO Y DE TRUNCAMIENTO

El concepto de error es consustancial con el clculo numrico. En todos los problemas es fundamental
hacer un seguimiento de los errores cometidos a fin de poder estimar el grado de aproximacin de la
solucin que se obtiene.
Los errores asociados a todo clculo numrico tienen su origen en dos grandes factores:

Aquellos que son inherentes a la formulacin del problema.


Los que son consecuencia del mtodo empleado para encontrar la solucin del problema.

Dentro del grupo de los primeros, se incluyen aquellos en los que la definicin matemtica del problema
es slo una aproximacin a la situacin fsica real. Estos errores son normalmente despreciables. En
aquellos casos en que estos errores no son realmente despreciables, nuestra solucin ser poco precisa
independientemente de la precisin empleada para encontrar las soluciones numricas.

Otra fuente de este tipo de errores tiene su origen en la imprecisin de los datos fsicos: constantes
fsicas y datos empricos. En el caso de errores en la medida de los datos empricos y teniendo en cuenta
su carcter generalmente aleatorio, su tratamiento analtico es especialmente complejo pero
imprescindible para contrastar el resultado obtenido computacionalmente.

En lo que se refiere al segundo tipo de error (error computacional), tres son sus fuentes principales:

Equivocaciones en la realizacin de las operaciones (errores de bulto). Esta fuente de error es bien
conocida por cualquiera que haya realizado clculos manualmente o empleando una calculadora. El
empleo de computadores ha reducido enormemente la probabilidad de que este tipo de errores se
produzcan. Sin embargo, no es despreciable la probabilidad de que el programador cometa uno de estos
errores (calculando correctamente el resultado errneo). Ms probabilidad de que el programador
cometa uno de estos errores (calculando correctamente el resultado errneo). Ms an, la presencia de
bus no detectados en el compilador o en el software del sistema no es inusual. Cuando no resulta
posible verificar que la solucin calculada es razonablemente correcta, la probabilidad de que se haya
cometido un error de bulto no puede ser ignorada. Sin embargo, no es esta la fuente de error que ms
nos va a preocupar.

El error causado por resolver el problema no como se ha formulado, sino mediante algn tipo de
aproximacin. Generalmente est causado por la sustitucin de un infinito (sumatorio o integracin) o
un infinitesimal (diferenciacin) por una aproximacin finita. Algunos ejemplos son:

El clculo de una funcin elemental (por ejemplo, Seno x) empleando slo n trminos de los
infinitos que constituyen la expansin en serie de Taylor.
Aproximacin de la integral de una funcin por una suma finita de los valores de la funcin,
como la empleada en la regla del trapezoide.
Resolucin de una ecuacin diferencial reemplazando las derivadas por una aproximacin
(diferencias finitas). Solucin de la ecuacin f(x)=0 por el mtodo de Newton-Raphson: proceso
iterativo que, en general, converge slo cuando el nmero de iteraciones tiende a infinito.

Denominaremos a este error, en todas sus formas, como error por truncamiento, ya que resulta de
truncar un proceso infinito para obtener un proceso finito. Obviamente, estamos interesados en
estimar, o al menos acotar, este error en cualquier procedimiento numrico.

Por ltimo, la otra fuente de error de importancia es aquella que tiene su origen en el hecho de que los
clculos aritmticos no pueden realizarse con precisin ilimitada. Muchos nmeros requieren infinitos
decimales para ser representados correctamente, sin embargo, para operar con ellos es necesario
redondearlos. Incluso en el caso en que un nmero pueda representarse exactamente, algunas
operaciones aritmticas pueden dar lugar a la aparicin de errores (las divisiones pueden producir
nmeros que deben ser redondeados y las multiplicaciones dar lugar a ms dgitos de los que se pueden
almacenar). El error que se introduce al redondear un nmero se denomina error de redondeo.

METODOS NUMERICOS. DEFINICIN

Son tcnicas mediante las cuales es posible formular problemas matemticos de tal forma que puedan
resolverse usando operaciones aritmticas.

Los mtodos numricos se utilizan para:

Solucin de sistemas de ecuaciones lineales


Solucin de ecuaciones no lineales y trascendentales
Encontrar un valor por medio de tablas: interpolacin
Encontrar un comportamiento (un modelo) a partir de datos ajustando una curva: ajuste de
curvas.
Integracin numrica de una funcin
Solucin numrica de ecuaciones diferenciales

Tipos de Mtodos Numricos

Existen diversos tipos de mtodos numricos algunos de ellos son:

1. Mtodo de Biseccin
2. Mtodo de Regula False (falsa posicin)
3. Mtodo de Newton
4. Mtodo de Newton Raphson
5. Mtodo de la secante

Mtodo de la secante

Un problema potencial en la implementacin del mtodo de Newton Raphson es la evaluacin de la


derivada. En casos complejos, la derivada se puede aproximar mediante una diferencia finita hacia atrs.
Ejemplo. Se tiene la siguiente ecuacin:

2x3 + 3x2 3x 5 = 0

Como 1er paso se grafica sustituyendo x en los siguientes valores. Se cambia de signo el resultado
deseado de Xi

2do paso: se elabora la grafica.

x F(X)

-2 -3

-1 -1

0 -5

-3

2 17

Para encontrar el valor de xi es necesario realizar una serie de clculos para encontrar el valor de la
pendiente, despus de la ecuacin de la recta.
Frmula de la pendiente

Ecuacin de la recta

X1 X2 Xs f(X1) f(X2) m f(Xs)

1 2 1.15 -3 17 20 -1.44075

1.15 2 1.21640931 -1.44075 17 21.695 -0.610549103

1.21640931 2 1.24357602 -0.6105491 17 22.4741684 -0.24495

1.24357602 2 1.25432038 -0.24495 17 22.7979947 -0.09610855

1.25432038 2 1.25851234 -0.09610855 17 22.9268819 -0.037379206

1.25851234 2 1.26013913 -0.03737921 17 22.977293 -0.014488067

1.26013913 2 1.26076913 -0.01448807 17 22.9968752 -0.005608074

1.26076913 2 1.26101291 -0.00560807 17 23.0044615 -0.002169669

1.26101291 2 1.26110722 -0.00216967 17 23.0073975 -0.000839241

1.26110722 2 1.26114369 -0.00083924 17 23.0085333 -0.000324599

1.26114369 2 1.2611578 -0.0003246 17 23.0089727 -0.000125543

1.2611578 2 1.26116326 -0.00012554 17 23.0091426 -4.85552E-05

1.26116326 2 1.26116537 -4.8555E-05 17 23.0092083 -1.87791E-05

El hablar de mtodos numricos conlleva a elaborar una gran cantidad de tablas como la que se muestra
arriba, en donde encontrar el resultado conlleva muchas operaciones que ahora se pueden hacer
mediante programas de cmputo.
Mtodo de biseccin

Es una funcin continua sobre el intervalo (a,b) y si f(b)<0 entonces f debe tener un cero de
signo en el intervalo (a,b) y por lo tanto tiene por lo menos un cero de intervalo.
El mtodo de biseccin consiste en dividir el intervalo en dos subintervalos de igual magnitud,
reteniendo el subintervalo en donde f cambia de signo, para conservar al menos una raz o cero
y repetir el proceso varia veces.

Siguiente funcin

1 Paso

Se grafican los valores para obtener la grafica y con esta ver donde se encuentra la posible solucin. Esto
es donde se presente un cambio de signo.
x y

17 -2 -3
14

11 -1 -1

8
0 -5
5

2 1 -3

-3 -2 -1 -1 0 1 2 3
2 +17
-4

-7

En la tabla se puede analizar que -3 y 17 presentan un cambio de signo, por lo que sern tomados estos
valores para el siguiente paso.

2 Paso

Elaborar la tabla de biseccin tomando en cuenta los valores de X1 y x2 como se haba mencionado

TABLA DE BISECCIN

X1 X2 Xm F(X1) F(Xm)

1 2

3 Paso

Para obtener el valor de Xm se promedian los valores de x1 y x2

X1 X2 Xm F(X1) F(Xm)

1 2 1.5
4 Paso

El valor de f(x1) utilizaremos la funcin inicial (2x3 + 3x2 3x 5) en el cual se sustituir en X el valor de
X1(2(1)3+3(1)2-3(1)-5)

X1 X2 Xm F(X1) F(Xm)

1 2 1.5 -3

5 Paso

Para obtener este valor se hace el mismo procedimiento que para f(x1) pero en este caso el valor que se
sustituir en (x) ser el de Xm (2(1.5)3+3(1.5)-5)

X1 X2 Xm F(X1) F(Xm)

1 2 1.5 -3 +4

6 Paso

Para la segunda fila se tomara en cuenta el signo que se presente en f(xm)

Si el signo es diferente a f(x1), se tomarn los valores de x1 y xm,


Si el signo es igual se tomarn los valores de xm para x1 y x2

Se hace el mismo procedimiento para las dems filas.


El resultado aproximado es el que ms se acerque a CERO

MTODO DE NEWTON-RAPHSON
Este mtodo es iterativo, adems de ser uno de los ms usados y efectivos. A diferencia de los mtodos
anteriores, el mtodo de Newton-Raphson no trabaja sobre un intervalo sino que basa su frmula en un
proceso iterativo.
Ejemplo, se tiene la siguiente funcin: y= x2-2
Se tabulan dando valores en x para obtener valores de y

8 y
x
6 7
-3
4 2
-2
2 -1
-1
0 -2
-4 -2 0 2 4 0
-2
-1
1
-4
2
2
7
3

Se tiene el sig. Valor


X0 = 2
Se obtiene la derivada.

x1
x0 y0 m
1.5
2 2 4
1.416666667
1.5 0.25 3
1.4142156862745100
1.4166666666667 0.006944444 2.83333333
1.4142135623746900
1.4142156862745 6.0073E-06 2.82843137
1.4142135623730900
1.4142135623747 4.51061410445E-12 2.82842712
1.4142135623730900
1.4142135623731 0.0000000000000 2.82842712

Para encontrar y0 sustituimos en la ecuacin inicial.


Para encontrar m sustituimos x0 en la derivada}
Para encontrar x1 sustituimos en la siguiente formula:

INTERPOLACIN NUMRICA

Interpolacin de Lagrange

Es una de las interpolaciones ms tiles en integracin numrica, sta consiste en una representacin de
polinomios de la funcin:

Esta interpolacin pasa por los puntos n+1 dados:

Para hallar la interpolacin de Lagrange se tiene que seguir ciertas frmulas, nosotros veremos un
algoritmo en el cual no es necesario utilizar las frmulas basta con lo siguiente:
Este sera el cdigo en C++
#include<iostream.h>
#include<conio.h>
void main(){
float x[50],y[50],z,l, valor=0;
int n;
cout<<"ingrese el numero de elementos: "; cin>>n;
cout<<"ingrese x: ";
for(int i=0; i<n; i++){
cin>>x[i];
}
cout<<endl;
cout<<"ingrese y: ";
for(int i=0; i<n; i++){
cin>>y[i];
}
cout<<endl;
cout<<endl<<"ingrese z: "; cin>>z;
for(int i=0; i<n ;i++){
l=y[i];
for(int j=0; j<n; j++){
if(i!=j){
l=(l*(z-x[j]))/(x[i]-x[j]);
}
}
valor=valor+l;
}
cout<<endl<<endl<<"El valor al polinomio de interpolacion en Z= "<<z <<" es
: "<<valor;
getch();
}

FUNDAMENTOS DE PROGRAMACIN ORIENTADA A OBJETOS (POO)

La POO es una de las ideas de programacin ms extraordinaria de los ltimos aos y es una materia
que puede ser estudiada y practicada por muchos aos, sin embargo, la idea central es simple: organizar
los programas de modo que reflejen la forma de organizacin de los objetos en el mundo real.

Pensando en Objetos

La programacin orientada a objetos, es, desde su raz, una forma de concebir un programa de
computadora. Un programa es una serie de instrucciones que le indican a la computadora que hacer. La
manera en que la POO ve a un programa es como un conjunto de objetos que operan juntos en formas
predefinidas para realizar tareas.

Un ejemplo de cmo funciona esta clase de programacin, es haciendo una comparacin con los
bloques de construccin LEGO. LEGO son pequeas piezas de plstico en varios colores y tamaos. Estos
bloques pequeas protuberancias redondas en un lado las cuales se ajustan en los huecos de los otros
bloques. La combinacin de piezas crea formas ms grandes y se pueden usar muchas otras piezas LEGO
como llantas, motores, bisagras y poleas.
Con los bloques LEGO se pueden hacer todo tipo de cosas: castillos, automviles, trailers, etc. Casi
cualquier cosa que se pueda imaginar. Cada pieza de LEGO es un objeto que se une con otros objetos en
forma especfica para crear un objeto ms grande.

La POO es muy parecida es muy similar a construir estructuras a partir de bloques LEGO. Mediante la
POO, todo su programa est formado por objetos diferentes llamados objetos.

Objetos y Clases

Un objeto es un elemento independiente de un programa de computadora, que representa a un grupo


asociado de caractersticas y est diseado para realizar tareas especficas. A los objetos tambin se les
conoce como instancias.

La programacin orientada a objetos se basa en la observacin de, en el mundo real, los objetos se
construyen a partir de objetos ms pequeos. Sin embargo, la capacidad de combinar objetos es slo un
aspecto general de dicha programacin. Tambin incluye conceptos y caractersticas que hacen la
creacin y el uso de objetos sea ms sencilla y flexible. La clase es la ms importante.

Una clase es una plantilla que se utiliza para crear mltiples objetos con caractersticas similares.

Las clases engloban todas las caractersticas de un conjunto particular de objetos. Cuando se escribe un
programa en un lenguaje orientado a objetos, no se definen objetos individuales, sino que se definen
clases de objetos.

La mayora de los lenguajes orientados a objetos incluyen un grupo de clases que implementan la
mayora de la funcionalidad bsica que necesitar. A estas agrupaciones se les denomina bibliotecas.

Una biblioteca de clases es un grupo de clases diseadas para su uso con otros programas.

La reutilizacin es uno de los beneficios de mayor importancia en la programacin orientada a objetos

Comportamientos y Atributos

En general, cada clase que escribas esta compuesta de dos componentes:

1. Atributos
2. Comportamiento

Atributos

Los atributos son las cosas individuales que diferencan una clase de objetos de otros y determinan la
apariencia, estado y otras cualidades de la clase.

Tambin pueden incluir informacin acerca del estado de un objeto. En una clase, los atributos estn
definidos por variables. Cada objeto puede tener valores distintos para sus variables y a stas se les
denomina variables de instancia.

Una variable de instancia es un elemento de informacin que define un atributo de un objeto en


particular

La clase del objeto define que tipo de atributo es y cada instancia almacena su propio valor para ese
atributo. A las variables de instancia tambin se les denomina variables de objeto.
Cada atributo de clase tiene una variable correspondiente sencilla al cambiar de valor de la variable
puede cambiar ese atributo en un objeto.

Las variables de instancia pueden tomar un valor cuando se crea un objeto y permanece constante a
travs de la vida del objeto o bien pueden tomar valores diferentes mientras el objeto se usa en un
programa en ejecucin.

Para describir toda una clase de objetos se usa otro tipo de atributo en vez de objetos especficos desde
la clase. A stas se les denomina variables de clase.

Una variable de clase es un elemento de informacin que define un atributo de toda una clase. La
variable aplica para la clase por s misma y para todas sus instancias, de modo que solo se almacena un
valor, no importa cantos objetos de clase hayan sido creados.

El comportamiento, es la manera en que una clase de objetos puede hacer cualquier cosa para s o para
otros objetos.

El comportamiento de una clase determina qu objetos de esa clase hacen cambiar sus atributos y
tambin qu hacen cuando otros objetos les piden hacer algo. El comportamiento para una clase de
objetos se implementa a travs de mtodos.

Los mtodos son grupo de instrucciones asociadas en una clase de objetos que actan en si mismos y e
otras clases y objetos. Se usan para realizar tareas especficas, del mismo modo que las funciones se
usan en otros lenguajes de programacin.

Los objetos se comunican entre s utilizando mtodos. Una clase o un objeto pueden llamar mtodos en
otra clase u objeto para muchas razones, incluyendo las siguientes:

Para informar un cambio a otro objeto


Para indicar al otro objeto que cambie algo acerca de s mismo
Para pedir a otro objeto que haga algo

As como hay variables de instancia y de clase, tambin hay mtodos de instancia y de clase. Los
mtodos de instancia, que son tan comunes que slo se llaman mtodos, se aplican a un objeto de la
clase. Si el mtodo hace un cambio para un objeto individual, debe ser un mtodo de instancia. Los
mtodos de clase aplican para una clase en s misma.

Herencia, Interfaces y Paquetes.

Herencia

La herencia es uno de los conceptos de mayor importancia en la programacin orientada a objetos y


tiene un efecto directo en la manera en que diseas y escribas tus programas.

La herencia es un mecanismo que hace posible que una clase herede todo el comportamiento y los
atributos de otra clase.
A travs de la herencia, una clase tiene inmediatamente toda la funcionalidad de una clase existente.
Debido a esto, las nuevas clases se pueden crear indicando nicamente en que se diferencian de la clase
existente

A una clase que hereda de otra clase se le denomina subclase y a la clase que proporciona la herencia se
le llama superclase.

Una clase puede tener nicamente una superclase, pero cada clase tiene una cantidad ilimitada de
subclases. Las subclases reciben por herencia todos los atributos y comportamiento de sus superclases.

En trminos prcticos, esto significa que si la superclase tiene comportamiento y atributos que la clase
que estas creando necesita, no tendr que redefinirlos o copiar el cdigo para tener el mismo
comportamiento y atributos. Su clase recibe automticamente todo esto de su superclase, la cual a su
vez las obtiene de su superclase y as sucesivamente por toda la jerarqua de clases. La clase que usted
est creando se convierte en una combinacin de todas las caractersticas de las clases superiores en la
jerarqua, as como de las propias.

Generalmente, en todos los lenguajes que soportan la POO el objeto base de todas las clases es Object.
Object es la clase ms general de la jerarqua y define el comportamiento y atributos heredados por
todas las clases de la biblioteca de clases del lenguaje. Conforme desciende la jerarqua, las clases se
construyen para un propsito especfico. Una jerarqua de clases define conceptos abstractos en la parte
superior de la jerarqua. Estos conceptos se vuelven ms concretos conforme desciende la lnea de
subclases.

La generacin de subclases es la creacin de una nueva clase que hereda de una clase existente. La nica
tarea de la subclase es indicar las diferencias de comportamiento y atributos entre ella y la superclase.

Si una clase define totalmente un nuevo comportamiento y no es subclase de otra, puede heredar
directamente de la clase Object. De hecho, si crea una definicin de clase que no ndique una
superclase, el lenguaje (ya sea Java, C++, C#, etc) asume que la clase nueva es herencia directa de
Object.

Jerarqua de Clases

Si ests creando un gran conjunto de clases, tendr sentido que stas hereden de la jerarqua de clases y
conformen una jerarqua por s mismas. Organizar clases de esta manera implica invertir un tiempo
considerable de planeacin, pero las ventajas son las siguientes:

La funcionalidad que es comn a mltiples clases se puede colocar en superclases, lo que le


permite ser utilizada repetidamente en todas las clases inferiores de la jerarqua.
Los cambios en la superclase se reflejan automticamente en todas sus subclases, las subclases
de stas y as sucesivamente. No hay necesidad de cambiar o recompilar cualquiera de las clases
inferiores; reciben toda la informacin a travs de la herencia.

Cuando se crea un objeto nuevo, lenguaje registra cada variable definida para el objeto y cada variable
definida para cada superclase del objeto. De este modo, todo lo que contienen en las clases se combina
para formar una estructura descriptiva del objeto en uso y cada objeto aporta la informacin apropiada
para su situacin
Los mtodos trabajan de manera parecida: los objetos nuevos tienen acceso a todos los nombres de los
mtodos en su clase y superclase. Esto determina de manera dinmica cuando se usa un mtodo en un
programa en ejecucin. Si se hace un llamado a un mtodo en un objeto en particular, el intrprete del
lenguaje primero revisar la clase del objeto para este mtodo. Si no lo encuentra, lo busca en la
superclase y as sucesivamente hasta encontrar la definicin del mtodo.

Las cosas se complican cuando una subclase define un mtodo que tiene el mismo nombre, tipo de valor
de retorno y argumentos que otro mtodo definido tiene en una superclase. En este caso, la definicin
del mtodo que se localiza primero (comenzando por el fondo de la jerarqua y desplazndose hacia
arriba) es la que se ha empleado. En consecuencia, puede crear un mtodo en una clase que evite que
se use un mtodo de una superclase. Para hacerlo, cree un mtodo con el mismo nombre, topo de valor
de retorno y argumentos como el mtodo de la superclase. A este proceso se le denomina
sobreposicin.

Herencia sencilla y herencia mltiple

La Herencia Sencilla es aquella en la que cada clase solo puede tener una superclase (aunque
cualquier superclase dada pueda tener mtliples subclases)
La Herencia Mltiple es aquella en la que una clase puede tener ms de una superclase y
heredar variables y mtodos de forma combinada de todas aquellas superclases

Interfaces

La herencia sencilla hace que la relacin entre clases y su funcionalidad que estas clases implementan
sea ms fcil de comprender y disear. Sin embargo, tambin podra ser restrictiva (sobre todo cuando
se cuenta con comportamientos similares que necesitan ser duplicados a lo largo de brazos distintos de
la jerarqua de clases). Con el uso de Interfaces, los lenguajes que soportan POO resuelven el problema
de comportamiento compartido.

Una Interfaz es un conjunto de mtodos que indican que una clase tiene un comportamiento particular
adems del que hereda de sus superclases.

Paquetes

Los paquetes son una forma de agrupar clases en interfaces asociadas. Habilitan los grupos de clases
para estar disponibles slo si son necesarios y eliminan los conflictos potenciales entre los nombres de
clases en grupos diferentes de clases.

Diseo de Jerarqua

En POO, las abstracciones pueden ordenarse y clasificarse, a esto se le conoce como Jerarqua.

Las 2 jerarquas ms importantes, son relacin de clases y relacin de objetos.

A la relacin entre las clases se le llama Herencia

La herencia simple es la relacin de clases ms importantes, es esencial en los sistemas orientados a


objetos, esta herencia define una relacin entre clases en la que una de ellas brinda a la estructura de
comportamiento definida en una o ms clases.
La herencia representa una jerarqua de abstracciones en la que una subclase hereda de una o ms
superclases

Una herencia denota una relacin ES UN. Ejemplo:

Un perro ES UN mamfero. Ntese que perro es una subclase de la superclase mamfero.

Un gato ES UN mamfero.

La herencia implica una relacin de especializacin en la que la subclase especializa el comportamiento


o la estructura ms general de sus superclases.

En el ejemplo anterior, podemos observar que la clase perro especializa a la clase mamfero, sabemos
que todos los mamferos lactan, pero la clase perro le est dando la especialidad de que ese mamfero
ladra, muerde, etc.

Herencia Mltiple: Como su nombre lo indica, se refiere a la caracterstica en la que una clase puede
heredar comportamientos de una o ms superclases.

Ejemplo:

SubClase perroCocker:
o Caractersticas: travieso, juguetn
SuperClase Perro:
o Caractersticas: Ladrar, aullar, etc.
SuperClase Volador
o Caractersticas: iniciarVuelo, iniciarAterrizaje, etc.

Ahora bien, si la Subclase PerroCocker heredara de ambas superclases (Perro y Volador), obtendramos
qu:

Un PerroCocker, es un perro volador.

La Relacin de Objetos
Esta relacin se enfoca en la abstraccin de la vida real de un objeto, esta relacin denota el <<parte
de>>, esto permite hablar de niveles de abstraccin altos y bajos, los indican la dependencia de una
clase a otra.
Una clase tiene un nivel ms alto de abstraccin que cualquiera de las clases que dependen de ella.
Ejemplo:
Una llanta es <<parte de>> un carro.
Pero tambin es <<parte de>> una moto, un camin, etc.

SENTENCIAS DE CONTROL DE FLUJO

If-else
Esta clase de sentencia if ofrece 2 alternativas a seguir, basadas en la comprobacin de la condicin. La
palabra reservada else separa las sentencias utilizadas para ejecutar cada alternativa. La sintaxis de la
sentencia if-else es:

If (condicin) if (condicin)
sentencia1; {
else //Secuencia de sentencias1
sentencia2; }
else
{
//Secuencia de sentencias2
}

Si la evaluacin de la condicin es verdadera, se ejecuta la sentencia1 o la secuencia de sentencias1,


mientras que si la evaluacin es falsa se ejecuta la sentencia2 o la secuencia de sentencias2. Es decir,
que las sentencias a realizar tanto cuando se cumple como cuando no se cumple la condicin podrn ser
simples o compuestas.

Ejercicio

Adivinar un nmero pensado por la computadora

import java.io.*;
public class Juego
{
public static void main (Stirng args[]);
{ InputstreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader (isr);
String cadena;
try
{
System.out.print("Introduzca un nmero entero entre 1 y 3");
cadena = br.readLine();
int n = (int)(Math.random()*3)+1;
//Math.random() devuelve un double aleatorio entre 0.0 y 1.0
int i= Integer.parseInt(cadena);
if (i == n);
System.out.println("Acert");
else
System.out.println("No acert, el nmero era "+n);
}
catch(Exception e)
System.out.println("Cualquier tipo de error");
}
}
}

La estructura if-else anterior podra haber sido sustituida por:


System.out.prinln(i == n ? "Acert" : "No acert, era "+n);

Sentencias if, if-else

Es posible que alguna de las sentencias a ejecutar especificadas en una instruccin if sea a su vez otra
sentencia if

If (condicin1)
If(condicin2
sentencia1;
else
sentencia 2;
/*la palabra reservada else se corresponde con la sentencia if ms cercana, es decir corresponde al
segundo if*/

if(condicin1)
{
if(condicin1)
sentencia1;
}
else
sentencia2;
/*a pesar de la sangra, este else corresponde al primer if*/

if(condicin1)
if (condicin2)
sentencia1;
else
sentencia2;
else
if (condicin3)
sentencia3;
else
sentencia4;
//puede existir anidacin
//en ambas ramas
If (condicin1)
sentencia1;
else
{
//secuencia de sentencias2
if(condicin2)
sentencia3;
}
/*El if o if-else anidado puede ser una ms de la secuencia de sentencias que se pueden colocar en
cualquiera de las ramas */

if (condicin1)
sentencia1;
else
if (condicin)
sentencia2;
//la anidacin en la rama else
//puede ser un if

If (condicin)
sentencia1;
else
if (condicin)
sentencia2;
else
sentencia3;
/*la anidacin en la rama else puede ser otro if-else*/

La construccin if-else-if mltiple, tambin denominada de alternativas mltiples if-else, es muy habitual
en programacin y se suele escribir de la forma siguiente:

if(condicin1)
sentencia1;
else if (condicin2)
sentencia2;
else if (condicin3)
sentencia3;

else if (conducinN)
sentenciaN;
else
sentenciaX; //opcional
La sentencia anterior realiza una serie de test en cascada hasta que se produce una de las siguientes
condiciones:
Una de las clasulas especificadas en las sentencias if se cumple; en ese caso la sentencia
asociada se ejecuta y no se tiene en cuenta el resto
Ninguna de las clusulas especificadas se cumple y entonces, si exsite, se ejecuta la ltima
sentencia else.

Ejercicio. Programa que ordena de mayor a menor tres nmeros ledos desde teclado.

import java.io.*;

public class Ordena3

public static void main (String[] args)

inputStreamReader isr = new InputStreamReader(system.in);

BufferedReader br = new BuffereedReader(isr);

String cadena;

double a, b, c;

try

System.out.print(Introduzca un nmero );

cadena = br.readLine();

double d1 = new Double(cadena);

System.out.prin(Introduzca otro nmero (;

cadena = br.readLine();

double d2 = new Double(cadena);

System.out.print(Introduzca el tercer nmero );

cadena = br.readLine();

double d3 = new Double(cadena);

a= d1.doubleValue();

b=d2.doubleValue();

c=c2.doubleValue();
if (a > b)

if(b>c)

System.out.println(a+ + b + +c);

else

System.out.println(c+ +a+ +b);

else

System.out.println(a+ +c+ +b);

else

if (a > c)

System.out.println(b+ +a +c);

else

if(c >b)

System.out.println(c++b+ +a);

else

System.out.println(b+ +c+ +a);

catch(Exception e)

()

Ejercicio. Obtener las soluciones, reales e imaginarias, de una ecuacin de segundo grado.

import java.io.*;

public class Ecuacion

public static void main(String[] args)

inputStreamReader isr = new InputStreamReader(System.in);

BufferedReader br = new BufferedReader(isr);


String cadena;

double a, b, c, x1, x2;

try

System.out.println(Introduzca los coeficientes);

System.out.print(a ? );

cadena = br.readLine();

double d1 = new Double(cadena);

System.out.print(b ?);

cadena = br.readLine();

double d2 = new Double(cadena);

System.out.print(c ?);

cadena = br.readLine();

double d3=new Double(cadena);

a = d1.doubleValue();

b = d2.doubleValue();

c = d3.doubleValue();

if (a==0)

System.out.println(No es ecuacin de segundo grado);

else

double d = (b*b-4*a*c);

if (d>0)

x1 = (-b+Math.sqrt (d)) /(2*a);

x2 = (-b-Math.sqrt(d))/(2*a);

System.out.println(x1 = +x1);

System.out.println(x2 = +x2);

}
else if (d==0)

x1=x2(-b)/(2*a);

System.out.println(x1=x2=+x1);

else

d=Math.abs(d);

System.out.println(x1 = +-b/(2*a)+ + + Math.sqrt(d) / (2*a)+ i);

System.out.prinln(x2 = +-b/(2*a+ +Math.sqrt(d) / (2*a)+i ;

catch(Exception e)

System.out.println(Exception +e);

//Exception es superclase

SENTENCIA SWITCH

Cuando se tienen muchas alternativas posibles a elegir, el uso de sentencias if-else-if puede resultar
bastante complicado, siendo en general ms adecuado en estos casos el empleo de la sentencia switch.
La sintaxis de una sentencia switch es la siguiente:

switch (expresion)

case constante1:
sentencias1;

//si se trata de mltiples acciones no es necesario

//encerrarlas entre llaves

break;

case constante2:

sentencia2;

break;

case constanteN;

sentenciasN;

break;

default

sentenciasX;

Importante: En la sentencia switch la expresin ha de devolver un resultado de tipo entero o caracter. La


sentencia break se utiliza con la sentencia switch para abandonar dicha sentencia tras la ejecucin de las
sentencias asociadas a una determinada clusula case.

El funcionamiento de la sentencia switch es el siguiente:

Cuando el valor de la expresin coincide con una constante de case, se ejecutan el grupo de sentencias
asociadas y si la ltima sentencia de un grupo es break, tras llegar a ella, el programa sale de la
estructura switch. Si la sentencia break se omite, la ejecucin sigue en el siguiente grupo de sentencias,
con independencia del valor de la constante case. Generalmente la palabra reservada break se omite
cuando se desea ejecutar la misma accin para dos o ms constantes de case.

La clusula default es un caso especial de case. Las sentencias que vienen a continuacin de ella se
ejecutan si ninguna de las constantes que siguen a las diferentes sentencias case coincide con el valor de
la expresin switch.

Para comprender mejor cmo utilizar la sentencia switch consideremos un programa que muestra un
men de opciones (una de sus aplicaciones ms tpicas).

Ejemplo. Men de opciones:

import java.io.*;

public class SelectMult


{

public static void main (String=[] args)

try

System.out.println(MEN);

System.out.println(C.Cargar archivo);

System.out.println(G. Grabar archivo);

System.out.println(I. Imprimir archivo);

System.out.println(S. Salir del programa);

System.out.println(Elija opcin (C, G, I, S) );

char opcion = (char)System.in.read();

System.in.skip(System.in.available());

switch (opcion)

case C: case c:

System.out.println(Ha seleccionado grabar archivo);

break;

case G: case g

System.out.println(Ha seleccionado grabar archivo);

break;

case I: case i:

System.out.println(Ha seleccionado Imprimir archivo);

break;

case S: case: s

System.out.println(Ha seleccionado Salir de programa);

break;

default;

System.out.println(Opcin no vlida);
}

catch(Exception e)

{}

En el programa anterior, cuando se pulsa la tecla s, se visualiza el mensaje Ha seleccionado Salir de


programa, y si pulsa la tecla z, aparece el de opcin no vlida . Observe que se utilizan dos clusulas case
para permitir al usuario introducir letras maysculas o minsculas. Es decir, los mltiples case se utilizan
para permitir que una serie de condiciones proporcionen la misma respuesta.

Nota: En una sentencia switch no pueden aparecer constantes case iguales, pero las sentencias a
ejecutar en una sentencia switch pueden ser a su vez sentencias switch y las sentencias switch anidadas
s pueden tener constantes case iguales.

SENTENCIA FOR

El bucle for est diseado para ejecutar una secuencia de sentencias un nmero fijo de veces. La sintaxis
de la sentencia for es:

for(inicializacin; condicin de terminacin; incremento)

sentencias; //desde 0 a un bloque delimitado por {}

Las sentencias podrn ser cero, una nica sentencia o un bloque, y sern lo que se repita durante el
proceso del bucle.

La inicializacin fija los valores iniciales de la variable o variables de control antes de que el bucle for se
procese y ejecute solo una vez. Si se desea inicializar ms de un valor, se puede utilizar un operador
especial de los bucles for en Java, el operador, para pegar sentencias. Cuando no se tiene que inicializar,
se omite este apartado; sin embargo, nunca se debe omitir el punto y coma que acta como separador.

La condicin de terminacin se comprueba antes de cada iteracin del bucle y ste se repite mientras
que dicha condicin se evale a un valor verdadero. Si se omite no se realiza ninguna prueba y se
ejecuta siempre la sentencia for.

El incremento se ejecuta despus de que se ejecuten las sentencias y antes de que se realice la siguiente
prueba de la condicin de terminacin. Normalmente esta parte se utiliza para incrementar o
decrementar el valor de la/las variables de control y, al igual que en la inicializacin, se puede usar en
ella el operador coma para pegar sentencias. Cuando no se tienen valores a incrementar se puede
suprimir este apartado.

En esencia, el bucle for comprueba si la condicin de terminacin es verdadera. Si la condicin es


verdadera, se ejecutan las sentencias del interior del bucle, y si la condicin es falsa, se saltan todas las
sentencias del interior del bucle, es decir, no se ejecutan. Cuando la condicin es verdadera, el bucle
ejecuta una iteracin (todas sus sentencias) y a continuacin la variable de control del bule se
incrementa.

Nota:

Cada parte del bucle for es opcional.


Es frecuente que la/s variables de control de un for slo se necesiten en el bucle, en cuyo caso
pueden declararse en la zona de inicializacin.

Por ejemplo, para ejecutar una sentencia 10 veces se puede utilizar cualquiera de los dos siguientes
bucles for:

for(int i=1; i<=10;i++)

System.out.println(i);

//System.out.println(i);

//i no est definida

int I;

for(i=1; i<=10;i++)

System.out.println(i);

System.out.println(i);

//i vale 11

En estos ejemplos, la sentencia for inicializa I a 1, comprueba que I es menor o igual a 10 y ejecuta la
siguiente sentencia que muestra el valor de i. A continuacin se incrementa i y se compara con 10, como
todava es menor, se repite el bucle hasta que se cumpla la condicin de terminacin (i = 11).

Si en lugar de una sola sentencia se desea ejecutar un grupo de sentencias, stas se encierran entre
llaves.

for(i=1; i<=10; i++)

System.out.println(i);
System.out.println(i * 10 =+ i * 10);

EL siguiente bucle for, sin embargo, no ejecuta ninguna sentencia, slo la inicializacin y los sucesivos
incrementos de la variable de control hasta alcanzar la condicin de terminacin:

for(int i=1; i<=2000000000; i++);

Los ejemplos anteriores muestran un incremento de la variable de control del bucle, con lo que la
cuenta, realmente, era siempre ascendente. Un bucle for puede tambin decrementar su variable de
control produciendo un bucle que cuente en sentido descendente.

for(int i=10; i>=1;i-)

System.out.println(i);

Nota: La variable de control de una sentencia for puede ser de cualquier topo simple.

for(double i=10; i>=1;i-=0.5)

System.out.println(i);

for(char i=a; i<=z; i++)

System.out.print(i);

La expresion de incremento de un bucle for no siempre sern sumas o restas simples. Se puede utilizar
cualquier expresin que tenga sentido en el problema que se est resolviendo. As por ejemplo, para
visualizar los valores 1,2,4,8,16,32,64,128 se puede utilizar la expresin i*2 para realizar el incremento.

for(i=1; i<200; i*=2)

System.out.println(i);

Es posible usar el operador coma en las clusulas de inicializacin e incremento

for(i=0; j=14; (i+j>=0); i++, j-=2)

System.out.print(i+ + +j+ = );

System.out.println(i+j);

}
Cada parte del bucle for es opcional, de forma que se pueden omitir las secciones de control si ese
tratamiento es el adecuado para el problema a resolver. Por ejemplo, el siguiente bucle for incrementa
la variable de control del bucle, con independencia del mecanismo de iteracin:

for(i=1; i<10;) i++

O bien se puede omitir la seccin de inicializacin:

int i=0;;

for(; i<10; i++)

System.out.println(i);

Es posible poner como condicin en un bucle for cualquier expresin de tipo boolean, incluso
expresiones no relacionadas con la variable de control.

Ejercicio. Determinar si un nmero entero ledo desde teclado es o no primo.

import java.io.*;

public class NumPrimo

public static void main(String args[])

inputStreamReader isr = new InputStreamReader(System.in);

BufferedReader br = new BufferedReader(isr);

String cadena;

try

System.out.print(Deme un nmero entero );

cadena = br.readLine();

int i= Integer.parseInt(cadena);

boolean primo = true;

int raiz2= (int)Math.sqrt(i);


for(int d=2; primo && d<=raiz2; d++)

If (i % d == 0)

primo = false;

if( i == 0 || ! primo)

System.out.print(El +i+ es compuesto);

else

System.out.print(El +i+ es primo);

catch(Exception e)

System.out.println(Cualquier tipo de error);

También podría gustarte