You are on page 1of 21

1

INTEGRANTES:
ALDRIN IVN PREZ GARCA
DANIEL DE LOS SANTOS OCAA
JONATHAN GARCA TORRES
DARINEL ACOSTA ALFONSO

CARRERA:
ING. INFORMTICA

CURSO DE VERANO:
PROGRAMACIN ORIENTA A OBJETOS
CATEDRATICO:
ING JORGE IVN BERMDEZ RODRGUEZ

FECHA:
01 DE AGOSTO DEL 2014



SIMULACIN DE CAJERO AUTOMTICO



INSTITUTO TECNOLGICO SUPERIOR
DE CINTALAPA
CINTALAPA DE FIGUEROA, CHIAPAS
2

NDICE
PAGINAS
PORTADA
INTRODUCCION...3



1.1 PRIMERA CLASE............................................................................. 4
1.2 SEGUNDA CLASE...................................................................................... 5
1.3 TERCERA CLASE PRIMER USUARIO.......................................................... 6
1.4 CUARTA CLASE SEGUNDO USUARIO..................................................... 9
1.5 QUINTA CLASE TERCER USUARIO.............12
1.6 SEXTA CLASE CUARTO USUARIO15
1.7 DESCRIPCIONES DEL LAS FUNCIONES BASICAS DEL ATM18
CONCLUSION.20
BIBLIOGRAFIA21











3


INTRODUCCIN

En este curso de verano que nos imparti el Ing. Ivn Jorge
Bermdez Rodrguez la materia que lleva por nombre
programacin orientada a objetos nos ense a programar
primeramente en el lenguaje turbo C+++ aunque en se
lenguaje solo era un repaso de lo que deberamos saber, luego
empezamos a programar en NetBeans IDE 8.0 que no enseo
lo fundamental de ese nuevo lenguaje que para nosotros an
era nuevo porque nunca lo habamos utilizado pero a pesar de
eso no fue tan complicado para aprender no deja unas
prcticas algo sencillas pero bsicas en ese lenguaje tan
mencionado
Considerando con los conocimientos bsicos aprendidos
durante el curso de programacin orientada a objeto, como
proyecto final realizaremos una prctica de una simulacin de
un cajero automtico que lo realizaremos con la aplicacin
NetBeans IDE 8.0 que maneja el lenguaje en java que realizara
las actividades necesarias de cada una de las personas como
son: un numero de Nip, consultar saldo, retiro de efectivo,
cambiar Nip, ente otros. Que se mostrara en el presente
trabajo.





4


DESCRIPCIN DE CADA CLASE Y CDIGO FUENTE
PRIMERA CLASE
package ejer_cajero;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;

public class Ejer_Cajero {

public static void main(String[] args) {
String password="2324";
String usuario="aldrin";

JPasswordField jpf = new JPasswordField();
JLabel titulo = new JLabel ("Ingrese su password");

usuario = JOptionPane.showInputDialog ("Usuario");
JOptionPane.showConfirmDialog (null, new Object[]{titulo, jpf}, "Inicio de sesin",
JOptionPane.OK_CANCEL_OPTION);

char p[] = jpf.getPassword();
String pass = new String(p);

Cajero3 tron = new Cajero3(); //creacion del objeto para la manipulacion de los metodos de la clase
cajero2

tron.menu1();//invocacion del menu por medio del objeto trin
System.exit(0); //cuando se sale del menu se finaliza la aplicacion

cajero2 trin = new cajero2(); //creacion del objeto para la manipulacion de los metodos de la clase
cajero2

trin.menu();//invocacion del menu por medio del objeto trin
System.exit(0); //cuando se sale del menu se finaliza la aplicacion
}

{


}

}





5

SEGUNDA CLASE



package ejer_cajero;

class auxi {
public static boolean isNum(String a){//metodo para validar si es un numero

try{
int b = Integer.parseInt(a);
return true;//si se puede convertir a numero devuelve verdadero
}
catch(NumberFormatException e){
return false;//si no se puede convertir a numero devuelve falso
}
}

}





































6



TERCER CLASE

package ejer_cajero;

import java.awt.Component;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;

class cajero2 {

//variables globales para que puedan ser modificados de ser necesario
int saldo=90000;//saldo inicial

String clave="1313";//clave predeterminada

public void menu(){//metodo que contiene el menu de la aplicacion

String ax;
int op=0;
do{
ax = JOptionPane.showInputDialog(null, "1. Saldo \n 2. Abonar \n 3. Retirar \n 4. Cambiar Clave \n 5. Salir");
if(ax!=null && auxi.isNum(ax)){//validacion para el menu
op = Integer.parseInt(ax);
switch(op){
case 1:
verSal(); break;
case 2:
consig(); break;
case 3:
retirar(); break;
case 4:
chanPass(); break;
}
}else{
JOptionPane.showMessageDialog(null, "Digite una opcion valida....");
}
}while(op !=5);//cuando se digita 5 se finaliza la aplicacion
}

public void verSal(){//metodo para ver el saldo de la cuenta
JOptionPane.showMessageDialog(null, "Tu saldo a la fecha es: "+saldo);
}

public void consig(){//metodo para realizar la consignacion
String ax; int consig=0;

ax = JOptionPane.showInputDialog(null, "Cuanto desea abonar ? ");
if((ax!=null) && !ax.equals("") && auxi.isNum(ax)){//triple validacion, si se ingreso algo, y si es numero lo
ingresado
consig = Integer.parseInt(ax);
if(consig>0){//si el valor a consignar es mayor que 0 se realiza la consignacion
saldo+=consig;//se suma el nuevo valor al saldo
}else{
JOptionPane.showMessageDialog(null, "abone una cantidad mayor a 0 !!!");
}
}else{
7


JOptionPane.showMessageDialog(null, "Ingrese una cantidad a abonar !!!");
}
}

public void retirar(){//metodo para retirar del saldo

String ax;
ax = JOptionPane.showInputDialog(null, "Digite su clave.... ");

if(ax==null){//validacion por si se selecciona cancelar del cuadro de dialogo y evitar errores

}else{
if(!ax.equals("")){
if(ax.equals(clave)){//si la clave digitada coincide con la clave
ax = JOptionPane.showInputDialog(null, "a. 5000 \n b. 10.000 \n c. 20.000 \n d. 50.000\n e. 100.000\n f.
Ingresar valor",
"CANTIDAD A RETIRAR", JOptionPane.INFORMATION_MESSAGE);
if(ax!=null){
if(!ax.equals("")){
switch(ax){
case "a":
if((saldo-5000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=5000;
}
break;
case "b":
if((saldo-10000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=10000;
}
break;
case "c":
if((saldo-20000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=20000;
}
break;




case "d":
if((saldo-50000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=50000;
}
break;
case "e":
if((saldo-100000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=100000;
}
break;
case "f":

ax = JOptionPane.showInputDialog(null, "Digite el valor a retirar: ");
if(!ax.equals("") && auxi.isNum(ax) && (Integer.parseInt(ax)>0) && (saldo-Integer.parseInt(ax)>=10000) )

{
saldo-= Integer.parseInt(ax);

8

}

break;
default:

JOptionPane.showMessageDialog(null, "Digite una opcion valida", "OPCION INCORRECTA",
JOptionPane.ERROR_MESSAGE);


break;


}
}
}
}
else{
JOptionPane.showMessageDialog(null, "La clave ingresada no coincide....");
}
}
}
}

public void chanPass(){//metodo para cambiar la contrasea

String ax, cl;

ax = JOptionPane.showInputDialog(null, "Digite su clave....");
if(ax!=null){
if(!ax.equals("")){
if(ax.equals(clave)){//si la clave digitada coincide con la clave que existe
cl = JOptionPane.showInputDialog(null, "Digite su nueva clave");
if(cl!=null){
if(cl.length()>3){//si el tamao de la nueva contrasea tiene mas de 3 caracteres se puede cambiar
ax=null;//se elimina el valor contenido con anterioridad de la variable
ax="Su anterior clave es:"+clave;
clave=cl;
ax+="\nSu nueva clave es: "+clave;
JOptionPane.showMessageDialog(null, ax);
}
else{
JOptionPane.showMessageDialog(null, "La clave que desea cambiar es muy corta...");
}
}
}
else{
JOptionPane.showMessageDialog(null, "La clave ingresada no coincide....");
}
}
} }

}






9

CUARTA CLASE

package ejer_cajero;

import javax.swing.JOptionPane;

public class Cajero3 {

//variables globales para que puedan ser modificados de ser necesario
int saldo=100000;//saldo inicial

String clave="1111";//clave predeterminada

public void menu1(){//metodo que contiene el menu de la aplicacion


String ax;
int op=0;
do{
ax = JOptionPane.showInputDialog(null, "1. Saldo \n 2. Abonar \n 3. Retirar \n 4. Cambiar Clave \n 5. Salir");
if(ax!=null && auxi.isNum(ax)){//validacion para el menu
op = Integer.parseInt(ax);
switch(op){
case 1:
verSal(); break;
case 2:
consig(); break;
case 3:
retirar(); break;
case 4:
chanPass(); break;
}
}else{
JOptionPane.showMessageDialog(null, "Digite una opcion valida....");
}
}while(op !=5);//cuando se digita 5 se finaliza la aplicacion
}

public void verSal(){//metodo para ver el saldo de la cuenta
JOptionPane.showMessageDialog(null, "Tu saldo a la fecha es: "+saldo);
}

public void consig(){//metodo para realizar la consignacion
String ax; int consig=0;

ax = JOptionPane.showInputDialog(null, "Cuanto desea abonar ? ");
if((ax!=null) && !ax.equals("") && auxi.isNum(ax)){//triple validacion, si se ingreso algo, y si es numero lo
ingresado
consig = Integer.parseInt(ax);
if(consig>0){//si el valor a consignar es mayor que 0 se realiza la consignacion
saldo+=consig;//se suma el nuevo valor al saldo
}else{
JOptionPane.showMessageDialog(null, "abone una cantidad mayor a 0 !!!");
}
}else{
JOptionPane.showMessageDialog(null, "Ingrese una cantidad a abonar !!!");
}
}
10


public void retirar(){//metodo para retirar del saldo

String ax;
ax = JOptionPane.showInputDialog(null, "Digite su clave.... ");

if(ax==null){//validacion por si se selecciona cancelar del cuadro de dialogo y evitar errores

}else{
if(!ax.equals("")){
if(ax.equals(clave)){//si la clave digitada coincide con la clave
ax = JOptionPane.showInputDialog(null, "a. 5000 \n b. 10.000 \n c. 20.000 \n d. 50.000\n e. 100.000\n f.
Ingresar valor",
"CANTIDAD A RETIRAR", JOptionPane.INFORMATION_MESSAGE);
if(ax!=null){
if(!ax.equals("")){
switch(ax){
case "a":
if((saldo-5000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=5000;
}
break;
case "b":
if((saldo-10000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=10000;
}
break;
case "c":
if((saldo-20000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=20000;
}
break;
case "d":
if((saldo-50000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=50000;
}
break;
case "e":
if((saldo-100000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=100000;
}
break;
case "f":
ax = JOptionPane.showInputDialog(null, "Digite el valor a retirar: ");
if(!ax.equals("") && auxi.isNum(ax) && (Integer.parseInt(ax)>0) && (saldo-Integer.parseInt(ax)>=10000) ){
saldo-= Integer.parseInt(ax);
}
break;
default:
JOptionPane.showMessageDialog(null, "Digite una opcion valida", "OPCION INCORRECTA",
JOptionPane.ERROR_MESSAGE);
break;
}
}
}
}
else{
JOptionPane.showMessageDialog(null, "La clave ingresada no coincide....");
11

}
}
}
}

public void chanPass(){//metodo para cambiar la contrasea

String ax, cl;

ax = JOptionPane.showInputDialog(null, "Digite su clave....");
if(ax!=null){
if(!ax.equals("")){
if(ax.equals(clave)){//si la clave digitada coincide con la clave que existe
cl = JOptionPane.showInputDialog(null, "Digite su nueva clave");
if(cl!=null){
if(cl.length()>3){//si el tamao de la nueva contrasea tiene mas de 3 caracteres se puede cambiar
ax=null;//se elimina el valor contenido con anterioridad de la variable
ax="Su anterior clave es:"+clave;
clave=cl;
ax+="\nSu nueva clave es: "+clave;
JOptionPane.showMessageDialog(null, ax);
}
else{
JOptionPane.showMessageDialog(null, "La clave que desea cambiar es muy corta...");
}
}
}
else{
JOptionPane.showMessageDialog(null, "La clave ingresada no coincide....");
}
}
}
}

}























12

QUINTA CLASE

package ejer_cajero;

import javax.swing.JOptionPane;

public class cajero4 {


//variables globales para que puedan ser modificados de ser necesario
int saldo=500000;//saldo inicial

String clave="1234";//clave predeterminada

public void menu1(){//metodo que contiene el menu de la aplicacion

String ax;
int op=0;
do{
ax = JOptionPane.showInputDialog(null, "1. Saldo \n 2. Abonar \n 3. Retirar \n 4. Cambiar Clave \n 5. Salir");
if(ax!=null && auxi.isNum(ax)){//validacion para el menu
op = Integer.parseInt(ax);
switch(op){
case 1:
verSal(); break;
case 2:
consig(); break;
case 3:
retirar(); break;
case 4:
chanPass(); break;
}
}else{
JOptionPane.showMessageDialog(null, "Digite una opcion valida....");
}
}while(op !=5);//cuando se digita 5 se finaliza la aplicacion
}

public void verSal(){//metodo para ver el saldo de la cuenta
JOptionPane.showMessageDialog(null, "Tu saldo a la fecha es: "+saldo);
}

public void consig(){//metodo para realizar la consignacion
String ax; int consig=0;

ax = JOptionPane.showInputDialog(null, "Cuanto desea abonar ? ");
if((ax!=null) && !ax.equals("") && auxi.isNum(ax)){//triple validacion, si se ingreso algo, y si es numero lo
ingresado
consig = Integer.parseInt(ax);
if(consig>0){//si el valor a consignar es mayor que 0 se realiza la consignacion
saldo+=consig;//se suma el nuevo valor al saldo
}else{
JOptionPane.showMessageDialog(null, "abone una cantidad mayor a 0 !!!");
}
}else{
JOptionPane.showMessageDialog(null, "Ingrese una cantidad a abonar !!!");
}
}
13


public void retirar(){//metodo para retirar del saldo

String ax;
ax = JOptionPane.showInputDialog(null, "Digite su clave.... ");

if(ax==null){//validacion por si se selecciona cancelar del cuadro de dialogo y evitar errores

}else{
if(!ax.equals("")){
if(ax.equals(clave)){//si la clave digitada coincide con la clave
ax = JOptionPane.showInputDialog(null, "a. 5000 \n b. 10.000 \n c. 20.000 \n d. 50.000\n e. 100.000\n f.
Ingresar valor",
"CANTIDAD A RETIRAR", JOptionPane.INFORMATION_MESSAGE);
if(ax!=null){
if(!ax.equals("")){
switch(ax){
case "a":
if((saldo-5000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=5000;
}
break;
case "b":
if((saldo-10000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=10000;
}
break;
case "c":
if((saldo-20000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=20000;
}
break;
case "d":
if((saldo-50000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=50000;
}
break;
case "e":
if((saldo-100000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=100000;
}
break;
case "f":
ax = JOptionPane.showInputDialog(null, "Digite el valor a retirar: ");
if(!ax.equals("") && auxi.isNum(ax) && (Integer.parseInt(ax)>0) && (saldo-Integer.parseInt(ax)>=10000) ){
saldo-= Integer.parseInt(ax);
}
break;
default:
JOptionPane.showMessageDialog(null, "Digite una opcion valida", "OPCION INCORRECTA",
JOptionPane.ERROR_MESSAGE);
break;
}
}
}
}


14

else{
JOptionPane.showMessageDialog(null, "La clave ingresada no coincide....");
}
}
}
}

public void chanPass(){//metodo para cambiar la contrasea

String ax, cl;

ax = JOptionPane.showInputDialog(null, "Digite su clave....");
if(ax!=null){
if(!ax.equals("")){
if(ax.equals(clave)){//si la clave digitada coincide con la clave que existe
cl = JOptionPane.showInputDialog(null, "Digite su nueva clave");
if(cl!=null){
if(cl.length()>3){//si el tamao de la nueva contrasea tiene mas de 3 caracteres se puede cambiar
ax=null;//se elimina el valor contenido con anterioridad de la variable
ax="Su anterior clave es:"+clave;
clave=cl;
ax+="\nSu nueva clave es: "+clave;
JOptionPane.showMessageDialog(null, ax);
}
else{
JOptionPane.showMessageDialog(null, "La clave que desea cambiar es muy corta...");
}
}
}
else{
JOptionPane.showMessageDialog(null, "La clave ingresada no coincide....");
}
}
}
}



}



















15

SEXTA CLASE

package ejer_cajero;

import javax.swing.JOptionPane;

public class cajero5 {

//variables globales para que puedan ser modificados de ser necesario
int saldo=500;//saldo inicial

String clave="5050";//clave predeterminada

public void menu1(){//metodo que contiene el menu de la aplicacion

String ax;
int op=0;
do{
ax = JOptionPane.showInputDialog(null, "1. Saldo \n 2. Abonar \n 3. Retirar \n 4. Cambiar Clave \n 5. Salir");
if(ax!=null && auxi.isNum(ax)){//validacion para el menu
op = Integer.parseInt(ax);
switch(op){
case 1:
verSal(); break;
case 2:
consig(); break;
case 3:
retirar(); break;
case 4:
chanPass(); break;
}
}else{
JOptionPane.showMessageDialog(null, "Digite una opcion valida....");
}
}while(op !=5);//cuando se digita 5 se finaliza la aplicacion
}

public void verSal(){//metodo para ver el saldo de la cuenta
JOptionPane.showMessageDialog(null, "Tu saldo a la fecha es: "+saldo);
}

public void consig(){//metodo para realizar la consignacion
String ax; int consig=0;

ax = JOptionPane.showInputDialog(null, "Cuanto desea abonar ? ");
if((ax!=null) && !ax.equals("") && auxi.isNum(ax)){//triple validacion, si se ingreso algo, y si es numero lo
ingresado
consig = Integer.parseInt(ax);
if(consig>0){//si el valor a consignar es mayor que 0 se realiza la consignacion
saldo+=consig;//se suma el nuevo valor al saldo
}else{
JOptionPane.showMessageDialog(null, "abone una cantidad mayor a 0 !!!");
}
}else{
JOptionPane.showMessageDialog(null, "Ingrese una cantidad a abonar !!!");
}
}

16

public void retirar(){//metodo para retirar del saldo

String ax;
ax = JOptionPane.showInputDialog(null, "Digite su clave.... ");

if(ax==null){//validacion por si se selecciona cancelar del cuadro de dialogo y evitar errores

}else{
if(!ax.equals("")){
if(ax.equals(clave)){//si la clave digitada coincide con la clave
ax = JOptionPane.showInputDialog(null, "a. 5000 \n b. 10.000 \n c. 20.000 \n d. 50.000\n e. 100.000\n f.
Ingresar valor",
"CANTIDAD A RETIRAR", JOptionPane.INFORMATION_MESSAGE);
if(ax!=null){
if(!ax.equals("")){
switch(ax){
case "a":
if((saldo-5000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=5000;
}
break;
case "b":
if((saldo-10000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=10000;
}
break;
case "c":
if((saldo-20000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=20000;
}
break;
case "d":
if((saldo-50000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=50000;
}
break;
case "e":
if((saldo-100000>=10000)){//se verifica si al retirar queda con un saldo minimo de 10.000
saldo-=100000;
}
break;
case "f":
ax = JOptionPane.showInputDialog(null, "Digite el valor a retirar: ");
if(!ax.equals("") && auxi.isNum(ax) && (Integer.parseInt(ax)>0) && (saldo-Integer.parseInt(ax)>=10000) ){
saldo-= Integer.parseInt(ax);
}
break;
default:
JOptionPane.showMessageDialog(null, "Digite una opcion valida", "OPCION INCORRECTA",
JOptionPane.ERROR_MESSAGE);
break;
}
}
}
}



17

else{
JOptionPane.showMessageDialog(null, "La clave ingresada no coincide....");
}
}
}
}

public void chanPass(){//metodo para cambiar la contrasea

String ax, cl;

ax = JOptionPane.showInputDialog(null, "Digite su clave....");
if(ax!=null){
if(!ax.equals("")){
if(ax.equals(clave)){//si la clave digitada coincide con la clave que existe
cl = JOptionPane.showInputDialog(null, "Digite su nueva clave");
if(cl!=null){
if(cl.length()>3){//si el tamao de la nueva contrasea tiene mas de 3 caracteres se puede cambiar
ax=null;//se elimina el valor contenido con anterioridad de la variable
ax="Su anterior clave es:"+clave;
clave=cl;
ax+="\nSu nueva clave es: "+clave;
JOptionPane.showMessageDialog(null, ax);
}
else{
JOptionPane.showMessageDialog(null, "La clave que desea cambiar es muy corta...");
}
}
}
else{
JOptionPane.showMessageDialog(null, "La clave ingresada no coincide....");
}
}
}
}

}










18

DESCRIPCION DE LAS FUNCIONES BASICAS DEL ATM.

Fig1. Para ingrasar al sistema nos pedira un password que manejara cada ususario asignado.

Fig2.la entrada indica la actividades necesarias que realiza un cajero.

Fig3. En esta figura podras consultar tu saldo ala fecha.

Fig4. En esta figura podremos abonar dicha cantidad de dinero a tu cuenta.







19


Fig5.En esta figura nos pedira otra ves que ingresemos nuestro password para posterios hacer un
retiro.

Fig6.En esta figura nos mostrara las cantidades posibles que podemos retirar o nos da la opcion si
queremos retirar otra cantidad distintas a que nos muestra en la pantalla.

Fig7. En esta pantalla nos da la opcion para poder cambiar de password autorisando con tu
contrasea anterior y tu nueva contrasea.

Fig8.En esta pantalla nos mostra todo en el sistema siempre y cuando hayamos elegido una
opcion imbalida.






20


CONCLUSIN

En este proyecto final que realizamos una simulacin de un
cajero automtico utilizamos todos nuestros conocimientos
aprendidos para desarrollar una simulacin de un cajero
automtico, con el desarrollo de este proyecto ingresamos
unos nuevos mtodos para que el cajero pudiera desarrollar
dicha funcin tambin obteniendo ayuda de videos tutoriales
vistos en internet para que nuestro programa cumpliera con
las expectativas acordadas, de tal manera que nuestro
conocimiento fuera reforzado y poder realizar un excepcional
trabajo, el cajero automtico fue diseado con forme a clases
las cuales dentro de una clase principal mandbamos a
llamarlas y as poder obtener el funcionamiento de este cajero,
fueron lneas de cdigo no tan complicadas ya que se tena
conocimiento de estas anteriormente.
Por tal motivo como bien se ha mencionado anteriormente el
cajero automtico funciono de acuerdo a lo previsto y pudimos
obtener un excelente resultado.







21



Bibliografa
Jorge Snchez asenjo (ao 2009) programacin bsica
en lenguaje java.creative commos.

C el comienzo
Autor Hctor guerra crespo

Java como programar
Autor Deitel y Deitel

You might also like