Issuu on Google+

Spanish Developers Community numero 8 - enero 2014


ÍNDICE

CONTENIDOS PRINCIPALES Acerca de 01. Editorial 02. Aplicación Bingo desarrollada con Java. 03. Listas doblemente enlazadas en C 04. Averigua si tus datos personales han sido robados.

Spanish

Developers Community es una iniciativa sin ánimo de lucro, dedicada al fomento y difusión del software basado en licencias GPL, Programación de lenguajes de programación, Sistemas Operativos Linux / Android e iOS así como diseño gráfico y redes sociales. Alcanzar nuestro objetivo de una función docente y con la intención de que estos conocimientos puedan aplicarse de una manera práctica en las actividades cotidianas de los estudiantes universitarios, empresarios y autónomos . Spanish developers community se basa en la colaboración desinteresada de profesionales y estudiantes que comparten sus saber­hacer, sus conocimientos teóricos y prácticos con la comunidad informática en Internet. Esta publicación digital se distribuye mensualmente bajo una licencia Creative Commons

Colabora ¿Quieres colaborar con Spanish Developers Community?. Tienes muchas formas de hacerlo:

Envía tu artículo Puedes enviarnos tu artículo a la dirección de correo electrónico:

spanishdevcommunity@gmail.com Colabora en nuestros proyectos Puedes ayudarnos en los proyectos de canal de youtube, blogs, página web, redes sociales y página web.

responsable del proyecto: Antonio García Prats coordinación y comunicación: Antonio García sitio web: www.spanishdeveloperscommunity.es facebook: www.facebook.com/spanishdeveloperscommunity.es twitter: @spanishdc

Contactar Puedes contactar conmigo para enviarnos cualquier duda que tengas en el correo electrónico:

antoniogarciaprats@gmail.com

Depósito Legal J 368­2013

diseño de portada: Antonio García 2

© 2014 - www.spanishdeveloperscommunity.es


Editorial

Comenzamos este nuevo año con la idea de un nuevo diseño y nuevos contenidos para esta revista. Un proyecto que nació ya hace casi un año, aunque lleva algo más de seis meses editando revistas digitales, aspira a ampliar orizontes, ampliar conocimientos básicos y a ampliar nuevos colaboradores que aporten con su experiencia profesional y su saber hacer en beneficio de todos. El objetivo para este nuevo año es ir modificando la revista para adaptarla a unos contenidos más prácticos. Se crearán secciones fijas con contenidos bien propios o bien de la mano de los colaboradores que se vayan incorporando al proyecto. El formato y dimensiones de la revista se mantendrán fijos. Lo que se pretende con ello es que la experiencia al acudir a esta publicación sea lo más agradable posible. Al menos dos veces al año la edición de la revista ira dirigida a un tema específico, por lo que los contenidos y secciones habituales serán sustituidos por las secciones propias que la temática elegida pretenda desarrollar. No se pretende cambiar la periodicidad mensual de esta revista digital. Así, se pretende que para este año se mantengan los doce números habituales. Buscamos incorporar profesionales de ámbitos diferentes del mundo de la informática, preferentemente aquellos que hayan tenido un contacto habitual con su actividad profesional.

Antonio García Prats

© 2014 - www.spanishdeveloperscommunity.es

3


Bingo programado en

Java

En esta ocasión vamos a mostrar un ejemplo práctico de cómo realizar un programa profesional que simule un conocido juego: UN BINGO. En este artículo mostraremos el código fuente que nos servirá para profundizar más, si cabe, en el apasionante mundo de la programación en Java. Lo que hace el programa es primero crear los cartones, tu decides cuantos cartones crear, luego cuando le das clic en comenzar el comienza a generar los números, y los cartones comparan ese numero con el que ellos tienen, si es igual se pone de color gris la casilla, el cartón que primero termine gana, y sale un letrero de ganaste y te dice que cartón gano. El código que presentamos en éste artículo está preparado simplemente para que lo insertes en tu IDE favorito y lo ejecutes. Evidentemente, puesto que se trata de un ejemplo, tampoco se ha tenido en cuenta exhautivamente cuestiones como la eficiencia algorítmica pero, al menos, si una coherencia a la hora de programar. ¡Divertios modificando este código!.

4

© 2014 - www.spanishdeveloperscommunity.es


int pelas=0; int pelas1=0;

Clases de Bingo Bingo.java

boolean par;

import java.awt.*; import java.lang.*; import javax.swing.*; import java.awt.event.*; import java.util.Random; import java.io.*; import java.sql.*; import java.net.*; class Bingo extends JFrame implements ActionListener { //Barra de Menu JMenuBar barra = new JMenuBar(); JMenu estadisticas = new JMenu("Estadistica"); JMenu Red = new JMenu ("En Red"); JMenuItem intern = new JMenuItem ("Bolas Automáticas"); JMenuItem jugadores = new JMenuItem("Jugadores"); JMenuItem numeros = new JMenuItem("Numeros");

JLabel ult =new JLabel ("Los 5 Últimos: ",JLabel.CENTER); JLabel num []= new JLabel [9]; JLabel ju1 =new JLabel ("",JLabel.CENTER); JLabel ju2 =new JLabel ("",JLabel.CENTER); JLabel dinju1= new JLabel ("",JLabel.CENTER); JLabel dinju2= new JLabel ("",JLabel.CENTER); JButton boll= new JButton ("Bola"); JButton pan[]= new JButton [90];

boolean yahabia=false; boolean acabar; Statement sentencia; Statement sentencia1; Connection conexion; String [] cadena= new String [90]; Integer [] cadenaint = new Integer [90]; String nombremax; String dineromax; String nombremin; String dineromin; Connection conexion2; Statement sentencia4; ResultSet resultado3; ResultSet resultado5; ResultSet resultado7; ResultSet resultado9; boolean compru2; boolean compru3; boolean compru4; boolean compru5; String play=""; static Socket conexion5; static DataOutputStream salida; static DataInputStream entrada; String bolita="";

Color cl=new Color (255,128,0);

Bingo() {

Carton c []=new Carton [4]; Carton c1[]=new Carton [4]; int count=0; boolean yata=true; boolean fin=false; int paso=0; int paso1=0; String top; String top1; © 2014 - www.spanishdeveloperscommunity.es

cuantos cuan =new cuantos (this); //Diálogo paso=cuan.reempla; paso1=cuan.reempla1; top=cuan.pel; top1=cuan.pel1; pelas=cuan.parne; pelas1=cuan.parne1; par=cuan.dosgrid;

5


setTitle("BINGO"); setLocation (0,0); setBackground

der(cl,5)); south.add (dinju1); JPanel nume =new JPanel ();

(Color.BLUE);

nume.setBackground(Color.BLUE); ult.setForeground (cl); nume.add (ult); for (int i=0; i<9; i++) { num [i]= new JLabel (); nume.add (num[i]); num[i].setForeground (cl); } south.add (nume);

jugadores.addActionListener(this); estadisticas.add(jugadores); numeros.addActionListener(this); estadisticas.add(numeros); intern.addActionListener(this); Red.add(intern); barra.add(Red); barra.add(estadisticas); setJMenuBar (barra);

add (south, "South"); } else { JPanel south =new JPanel (); south.setLayout (new

setLayout (new BorderLayout ()); //South if(par==true) { JPanel south =new JPanel (); south.setLayout (new

GridLayout (2,3)); south.setBackground (Color.BLUE); south.setForeground (cl);

GridLayout (2,2)); south.setBackground

ju1.setText(top); ju1.setForeground(cl); south.add (ju1);

(Color.BLUE); south.setForeground (cl); ju1.setText(top); ju1.setForeground(cl); south.add (ju1);

JPanel boton= new JPanel (); boton.setLayout(new FlowLayout());

JPanel boton= new JPanel (); boton.setLayout(new FlowLayout()); boton.setBackground(Color.BLUE); boll.addActionListener(this); boton.add (boll); boll.setBackground(cl); boll.setForeground(Color.BLUE); south.add(boton);

dinju1.setText(Integer.toString(pelas)); dinju1.setForeground(cl);

boton.setBackground(Color.BLUE); boll.addActionListener(this); boton.add (boll); boll.setBackground(cl); boll.setForeground(Color.BLUE); south.add(boton); ju2.setText(top1); ju2.setForeground(cl); south.add (ju2);

dinju1.setText(Integer.toString(pelas)); dinju1.setForeground(cl);

dinju1.setBorder(BorderFactory.createLineBor

6

© 2014 - www.spanishdeveloperscommunity.es


dinju1.setBorder(BorderFactory.createLineBorder(cl,5)); south.add (dinju1);

JPanel nume =new JPanel (); nume.setBackground(Color.BLUE); ult.setForeground (cl); nume.add (ult); for (int i=0; i<9; i++) { num [i]= new JLabel (); nume.add (num[i]); num[i].setForeground (cl); } south.add (nume);

colcen.setBackground(Color.BLUE); colcen.setLayout (new GridLayout (18,5)); for(int i=0; i<90; i++) { pan[i]= new JButton (Integer.toString(i+1)); pan[i].setBackground(cl); pan[i].setForeground(Color.BLUE); colcen.add(pan[i]); } central.add(colcen); add(central,"Center"); }

dinju2.setText(Integer.toString(pelas1)); dinju2.setForeground(cl);

else { JPanel central =new JPanel (); central.setLayout (new

dinju2.setBorder(BorderFactory.createLineBorde r(cl,5)); south.add (dinju2); add (south, "South"); } //central if(par==true) { JPanel central =new JPanel (); central.setLayout (new GridLayout (1,2)); JPanel coliz = new JPanel (); coliz.setBackground(Color.BLUE); coliz.setLayout (new GridLayout (4,1)); for (int i=0; i<paso; i++) { c [i]= new Carton (); coliz.add (c[i]); } central.add(coliz);

GridLayout (1,3)); JPanel coliz = new JPanel (); coliz.setBackground(Color.BLUE); coliz.setLayout (new GridLayout (4,1)); for (int i=0; i<paso; i++) { c [i]= new Carton (); coliz.add (c[i]); } central.add(coliz); JPanel colcen = new JPanel(); colcen.setBackground(Color.BLUE); colcen.setLayout (new GridLayout (18,5)); for(int i=0; i<90; i++) { pan[i]= new JButton (Integer.toString(i+1)); pan[i].setBackground(cl);

JPanel colcen = new JPanel(); © 2014 - www.spanishdeveloperscommunity.es

7


pan[i].setForeground(Color.BLUE); colcen.add(pan[i]); } central.add(colcen);

cadenaint[i]=Integer.parseInt(cadena[i]); } else { cadena[i]="0";

JPanel colder = new JPanel (); cadenaint[i]=Integer.parseInt(cadena[i]); } i++; colder.setBackground(Color.BLUE); } colder.setLayout (new while(i<90); GridLayout (4,1)); for (int i=0; i<paso1; i++) entrada.close(); { } c1 [i]= new Carton (); catch(IOException ioe) colder.add (c1[i]); { } central.add(colder); JOptionPane.showMessageDialog(this,"No se puede abrir este archivo"); } add(central,"Center"); /////////////////////////// } //cerrar ventana addWindowListener (new

if(par==true) setSize(600,740); else setSize(1024,740);

WindowAdapter () { public void windowClosing (WindowEvent we)

setResizable (false); setVisible(true);

{ dispose (); }

} });

public void actionPerformed(ActionEvent ae101) {

//Fichero de los numeros// try { FileReader salida = new FileReader ("CADENA.txt"); BufferedReader entrada = new BufferedReader (salida); String str=""; int i=0; do { str=entrada.readLine(); if(str!=null) { cadena[i]=str;

8

if (ae101.getSource()==intern) { play="jugar"; int bolita1=0; boll.setEnabled(false);

//conexion try { System.out.println(InetAddress.getLocalHost()); conexion5= new Socket("localhost",5001);

© 2014 - www.spanishdeveloperscommunity.es


salida= new DataOutputStream(conexion5.getOutputStream());

trabajo(bolita1); finaltodo();

entrada=new DataInputStream(conexion5.getInputStream()); } while(play.equals("jugar")) conexion5.close(); { salida.writeUTF(play+"\n"); bolita = entrada.readUTF();

} catch(IOException e) { }

//aqui el sleep } try {

if (ae101.getSource()==boll) { //generar numero int can=0; double a=0; do { a=Math.random()*90; can=(int)a; do { a=Math.random()*90; can=(int)a; }

Thread.sleep(1000); } catch(Exception e) { System.out.println("Error: " +e); } System.out.println("Bola recibida"); System.out.println(bolita);

while(pan[can].getForeground()==(cl)); pan[can].setForeground(cl); }

try while(pan[can].getForeground()!=(cl)); { //METODO DEL RESTO DEL bolita1 = Integer.parseInt(bolita.trim());

BOTON trabajo(can); finaltodo();

} catch(NumberFormatException nfe)

}

{

//estadisticas de numeros if (ae101.getSource()==numeros) { boolean pass=true; boolean ant=true; int ultimo=999999999;

System.out.println("No va"); }

© 2014 - www.spanishdeveloperscommunity.es

9


int penultimo=999999999; int

}

antepenultimo=999999999;

if(ant==true)

int posult=0; int pospen=0; int posant=0; int primero=0; int tercero=0; int segundo=0; int posprim=0; int posseg=0; int poster=0; int u=0; do {

{ if(cadenaint[u]<antepenultimo) { antepenultimo=cadenaint[u]; posant=u+1; }

//los numeros que menos salen

} }

if(cadenaint[u]<ultimo) {

//los numeros que mas salen

antepenultimo=penultimo;

if(cadenaint[u]>primero)

penultimo=ultimo;

{

ultimo=cadenaint[u];

tercero=segundo;

posant=pospen;

segundo=primero;

pospen=posult;

primero=cadenaint[u];

posult=u+1;

poster=posseg;

ant=false; } if(ant==true) { if(cadenaint[u]<penultimo)

posseg=posprim; posprim=u+1; pass=false; } if(pass==true) {

{ antepenultimo=penultimo; penultimo=cadenaint[u]; posant=pospen; pospen=u+1; ant=false;

10

if(cadenaint[u]>segundo) { tercero=segundo; segundo=cadenaint[u]; poster=posseg; © 2014 - www.spanishdeveloperscommunity.es


{ Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");

posseg=u+1; pass=false; } if(pass==true) { if(cadenaint[u]>tercero) { tercero=cadenaint[u];

conexion2 = DriverManager.getConnection ("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\Documents and Settings\\Coculi\\Mis documentos\\Java\\Ejercicios\\Bingo\\BINGO.mdb"); sentencia4=conexion2.createStatement(ResultSet.TYPE_FORW ARD_ONLY,ResultSet.CONCUR_READ_ONLY); } catch(ClassNotFoundException cnfe) {

poster=u+1; }

System.out.println(cnfe);

} } u++; pass=true; ant=true;

} catch(SQLException sqle) { System.out.println(sqle);

} try { resultado3= sentencia4.executeQuery ("SELECT //escribir los numeros nombre FROM USUARIOS WHERE saldo=(SELECT MAX(saldo) from USUARIOS)"); JOptionPane.showMessageDialog(this,"El compru2=resultado3.next(); numero que mas veces ha salido es el numero: " +posprim +"\n" if(compru2==true) +"El { segundo numero que mas veces ha salido es el numero: " +posseg nombremax=resultado3.getString(1); +"\n" nombremax=nombremax.trim(); +"El tercer } numero que mas veces ha salido es el numero: " +poster +"\n" resultado3.close(); +" } " +"\n" catch(SQLException sqle) +"El { numero que menos veces ha salido es el numero: " +posult +"\n" System.out.println(sqle); +"El } segundo numero que menos veces ha salido es el numero: " try +pospen +"\n" { +"El tercer resultado5= sentencia4.executeQuery ("SELECT numero que menos veces ha salido es el numero: " +posant MAX(saldo) from USUARIOS"); +"\n"); compru3=resultado5.next(); if(compru3==true) } { dineromax=resultado5.getString(1); //estadistica de jugadores } if (ae101.getSource()==jugadores) resultado5.close(); { } catch(SQLException sqle) try { } while(u<90);

© 2014 - www.spanishdeveloperscommunity.es

11


System.out.println(sqle); } try { resultado7= sentencia4.executeQuery ("SELECT nombre FROM USUARIOS WHERE saldo=(SELECT MIN(saldo) from USUARIOS)"); compru4=resultado7.next(); if(compru4==true) { nombremin=resultado7.getString(1); nombremin=nombremin.trim(); } resultado7.close(); } catch(SQLException sqle) { System.out.println(sqle); } try { resultado9= sentencia4.executeQuery ("SELECT MIN(saldo) FROM USUARIOS"); compru5=resultado9.next(); if(compru5==true) { dineromin=resultado9.getString(1); } resultado9.close(); conexion2.close(); } catch(SQLException sqle) { System.out.println(sqle); } JOptionPane.showMessageDialog(this,"El jugador que mas dinero tiene es: " +nombremax +" con " +dineromax +"\n" +"El jugador que menos dinero tiene es: " +nombremin +" con " +dineromin);

}

cadenaint[can]=cadenaint[can]+1; int k=0; do { cadena[k]=Integer.toString(cadenaint[k]); k++; } while(k<90);

//Colocar en label de 5 String posicion=num[6].getText(); num[8].setText(posicion); posicion=num[4].getText(); num[6].setText(posicion); posicion=num[2].getText(); num[4].setText(posicion); posicion=num[0].getText(); num[2].setText(posicion); num[0].setText(Integer.toString(can+1)); num[0].setForeground(Color.YELLOW);

//Comprobar linea for(int i=0; i<paso; i++) { int l=can+1; c[i].eliminar(l,yata); if(c[i].compro==10) { pelas=pelas + 50; dinju1.setText(Integer.toString(pelas)); c[i].compro=30; yata=false; } }

} void trabajo(int can) { count=count+1; ///////////Por cada numero que salga se suma uno a la cadena//////

12

for(int i=0; i<paso1; i++) { int l=can+1; c1[i].eliminar(l,yata); if(c1[i].compro==10) { © 2014 - www.spanishdeveloperscommunity.es


pelas1=pelas1 + 50; dinju2.setText(Integer.toString(pelas1)); c1[i].compro=30; yata=false; } } //Comprobar bingo for(int i=0; i<paso;i++) { if(c[i].compro==20) { pelas=pelas + 200;

JOptionPane.showMessageDialog(this,"No has logrado hacer línea"+"\n" + "Date prisa. HAZ BIIINGO" ); yata=false; } if(count==75 && fin==false) { JOptionPane.showMessageDialog(this,"No has logrado hacer Bingo"+"\n" + "Lo Siento. Has perdido" ); fin=true;

dinju1.setText(Integer.toString(pelas)); if(yahabia==false) {

} } //GRABAR LOS NUMEROS QUE HAN

JOptionPane.showMessageDialog(this,"El juego ha terminado"); play="acabar"; } fin=true; yahabia=true; } }

for(int i=0; i<paso1;i++) { if(c1[i].compro==20) { pelas1=pelas1 + 200; dinju2.setText(Integer.toString(pelas1)); if(yahabia==false) { JOptionPane.showMessageDialog(this,"El juego ha terminado"); play="acabar"; } fin=true; yahabia=true; } } //acabar con jugador1 if(par==true) { if(count==55 && yata==true) { © 2014 - www.spanishdeveloperscommunity.es

SALIDO try { FileWriter salida = new FileWriter ("CADENA.txt"); int m=0; do { salida.write(cadena[m] + "\n"); m++; } while(m<90); salida.close(); } catch(IOException ioe) { JOptionPane.showMessageDialog(this,"No se puede guardar este archivo"); }

} void finaltodo () {

13


//final de juego y grabacion if (fin==true) { try { if (par==true) { Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");

catch(ClassNotFoundException cnfe) { System.out.println(cnfe); } catch(SQLException sqle) { System.out.println(sqle); }

conexion = DriverManager.getConnection ("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\Documents and Settings\\Coculi\\Mis documentos\\Java\\Ejercicios\\Bingo\\BINGO.mdb"); String sal=dinju1.getText(); String nol=ju1.getText();

//volver a jugar otravez ota = new otravez (this); acabar=ota.eliminar; if (acabar==true) { dispose(); } }

sentencia=conexion.createStatement(ResultSet.TYPE_FORW ARD_ONLY,ResultSet.CONCUR_READ_ONLY); }

sentencia.executeUpdate("UPDATE USUARIOS SET saldo=" //Main +sal +"+0 WHERE nombre='" +nol +"'"); public static void main (String [] args) } { else Bingo bi=new Bingo(); { } Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); } conexion = DriverManager.getConnection ("jdbc:odbc:Driver={Microsoft Access Driver //MODULO SELECCION JUGADORES// (*.mdb)};DBQ=C:\\Documents and Settings\\Coculi\\Mis class cuantos extends JDialog implements ActionListener documentos\\Java\\Ejercicios\\Bingo\\BINGO.mdb"); { String sal=dinju1.getText(); JLabel e1=new JLabel ("Número de jugadores:"); String nol=ju1.getText(); String sal1=dinju2.getText(); JLabel blan=new JLabel (""); String nol1=ju2.getText(); JLabel blan1=new JLabel (""); JLabel blan2=new JLabel (""); sentencia=conexion.createStatement(ResultSet.TYPE_FORW JLabel blan3=new JLabel (""); ARD_ONLY,ResultSet.CONCUR_READ_ONLY); sentencia.executeUpdate("UPDATE USUARIOS SET saldo=" +sal +"+0 WHERE nombre='" +nol +"'"); sentencia1=conexion.createStatement(ResultSet.TYPE_FORW ARD_ONLY,ResultSet.CONCUR_READ_ONLY); sentencia1.executeUpdate("UPDATE USUARIOS SET saldo=" +sal1 +"+0 WHERE nombre='" +nol1 +"'"); } conexion.close(); }

14

ButtonGroup eleccion =new ButtonGroup(); JRadioButton jug =new JRadioButton("1 JUGADOR"); JRadioButton jug2 =new JRadioButton("2 JUGADOR"); JButton b1=new JButton ("OK"); //Boton Color cl=new Color (255,128,0); int reempla=0; int reempla1=0; String pel; © 2014 - www.spanishdeveloperscommunity.es


String pel1; int parne=0; int parne1=0; boolean dosgrid; cuantos (JFrame cu) { super (cu,"¿Cuántos Jugadores?",true); setLocation (270,200);

addWindowListener (new WindowAdapter () //Para poder cerrar la ventana { public void windowClosing (WindowEvent we) { dispose (); } }); setSize (300,200); setVisible (true);

setLayout (new BorderLayout ());

} //norte JPanel norte =new JPanel (new

public void actionPerformed (ActionEvent aev) { if (aev.getSource()==b1)

FlowLayout()); norte.setBackground(Color.BLUE); e1.setForeground(cl); norte.add(e1); add (norte, "North"); //centro JPanel centro= new JPanel (new GridLayout(2,3)); jug.setOpaque(false); jug2.setOpaque(false); centro.setBackground(Color.BLUE); jug.setForeground(cl); jug2.setForeground(cl); centro.add(blan); eleccion.add(jug); centro.add(jug); centro.add(blan1); centro.add(blan2); eleccion.add(jug2); centro.add(jug2); centro.add(blan3); add (centro, "Center"); //sur JPanel sur= new JPanel (new FlowLayout()); sur.setBackground(Color.BLUE); b1.setForeground(Color.BLUE); b1.setBackground(cl); b1.addActionListener(this); sur.add(b1); add(sur, "South");

© 2014 - www.spanishdeveloperscommunity.es

{ //si vas a jugar solo if(jug.isSelected()) { JOptionPane.showMessageDialog(this,"El jugador juega contra si mismo y contra el tiempo, je" +"\n" + "El jugador tiene 55 bolas para hacer línea" +"\n" + "Si no lo logras, sigue para hacer Bingo" +"\n" + "El jugador tiene 75 bolas para hacer bingo" +"\n" + "Si no lo logra pierde" +"\n" + "Por cada línea que hagas ganas 50 créditos" +"\n" + "Por cada bingo que hagas ganas 200 créditos" +"\n" + "Empieza el juego" +"\n"); Jugador1 ju =new Jugador1 (this); //Diálogo reempla=ju.obtenerValor(); pel=ju.obtenerNombre(); parne=ju.obtenerguita(); dosgrid=true; dispose(); } //juego de dos if(jug2.isSelected())

15


Color cl=new Color (255,128,0); //Colores

{

int cart1=0;

JOptionPane.showMessageDialog(this,"Cada jugador juega contra el otro" +"\n" + "He intentará hacer línea y bingo antes que el otro" +"\n"

Statement sentencia; Statement sentencia1; ResultSet resultado; Connection conexion; boolean compru=true;

+ "Por cada línea que hagas ganas 50 créditos" +"\n" + "Por cada bingo que hagas ganas 200 créditos" +"\n"

String money; + "Empieza el juego" +"\n"); Jugador1 ju =new Jugador1 (this); //Diálogo reempla=ju.obtenerValor(); pel=ju.obtenerNombre(); parne=ju.obtenerguita(); Jugador2 ju7 =new Jugador2

Jugador2 (JDialog bg) { super (bg,"Jugador 2",true); setLocation (270,200);

reempla1=ju7.obtenerValor1(); pel1=ju7.obtenerNombre1(); parne1=ju7.obtenerguita1(); dosgrid=false; dispose(); }

setLayout (new GridLayout

(this); //Diálogo

(4,1)); JPanel Fila1=new JPanel (); Fila1.setLayout (new GridLayout (1,2)); Fila1.setBackground

} }

(Color.BLUE); e1.setForeground (cl); Fila1.add (e1); Fila1.add (t1); add (Fila1);

} //Pantalla segundo jugador class Jugador2 extends JDialog implements ActionListener { JLabel e1=new JLabel ("Nombre:", JLabel.CENTER); //Etiquetas JLabel e2=new JLabel ("Password:", JLabel.CENTER); JLabel e3=new JLabel ("Nº cartones:", JLabel.CENTER); JLabel e4=new JLabel ("(1­4)", JLabel.CENTER); JLabel e5=new JLabel (""); JLabel e6=new JLabel (""); JButton b1=new JButton ("OK"); //Boton JTextField t1=new JTextField (); //Campos JPasswordField t2=new JPasswordField (); JTextField t3=new JTextField (2);

JPanel Fila2=new JPanel (); Fila2.setLayout (new GridLayout (1,2)); Fila2.setBackground (Color.BLUE); e2.setForeground (cl); Fila2.add (e2); Fila2.add (t2); add (Fila2); JPanel Fila3=new JPanel (); Fila3.setLayout (new GridLayout (1,2)); JPanel Sub1Fila3=new JPanel (); Sub1Fila3.setBackground (Color.BLUE);

16

© 2014 - www.spanishdeveloperscommunity.es


e3.setForeground (cl); Sub1Fila3.add (e3); Fila3.add (Sub1Fila3);

{ Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");

conexion = JPanel Sub2Fila3=new JPanel (); DriverManager.getConnection ("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\Documents and Sub2Fila3.setLayout (new Settings\\Coculi\\Mis GridLayout (1,2)); documentos\\Java\\Ejercicios\\Bingo\\BINGO.mdb"); Sub2Fila3.setBackground String nol=t1.getText(); (Color.BLUE); String con=t2.getText(); e4.setForeground (cl); sentencia1=conexion.createStatement(ResultSet.TYPE_FORWA Sub2Fila3.add (t3); RD_ONLY,ResultSet.CONCUR_READ_ONLY); Sub2Fila3.add (e4); resultado= sentencia1.executeQuery ("SELECT * Fila3.add (Sub2Fila3); FROM USUARIOS WHERE nombre='" + nol +"'"); compru=resultado.next(); add (Fila3); if(compru==false) { JPanel Fila4=new JPanel (); //nuevo jugador Fila4.setLayout (new FlowLayout ()); sentencia=conexion.createStatement(ResultSet. Fila4.setBackground TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY (Color.BLUE); ); b1.setForeground (Color.BLUE); sentencia.executeUpdate("INSERT INTO b1.setBackground (cl); USUARIOS (nombre,contraseña,saldo) VALUES ('" +nol +"','" b1.addActionListener(this); +con +"',3000)"); Fila4.add (b1); add (Fila4); JOptionPane.showMessageDialog(this,"Nuevo jugador creado" +"\n" +"Dispones de 3000 creditos para addWindowListener (new empezar." +"\n" +"Cada cartón cuesta 10 creditos" +"\n"); WindowAdapter () //Para poder cerrar la ventana money="3000"; { } public void windowClosing (WindowEvent else we) { { //jugador ya dispose (); creado } String }); clave=resultado.getString("contraseña"); setSize (300,200); setVisible (true); }

clave=clave.trim();

if(con.equals(clave)) {

public void actionPerformed (ActionEvent aev) { if (aev.getSource()==b1) { try © 2014 - www.spanishdeveloperscommunity.es

// contraseña valida y que tengas suerte JOptionPane.showMessageDialog(this,"Contras eña valida" +"\n" +"Mucha suerte en el juego."); }

17


{

else {

String numerito=t3.getText(); if(numerito.equals("")) {

// contraseña invalida JOptionPane.showMessageDialog(this,"Contr aseña incorrecta" +"\n" +"Intentelo de nuevo."); dispose(); Jugador2 ju =new Jugador2 (this); //Diálogo } money=resultado.getString("saldo"); } resultado.close(); conexion.close(); } catch(ClassNotFoundException cnfe) { System.out.println(cnfe); } catch(SQLException sqle) { System.out.println(sqle); } dispose(); } }

//obtener saldo int obtenerguita1() { String numerito=t3.getText(); if(numerito.equals(""))

JOptionPane.showMessageDialog(this,"Tenias que haber escrito algo" +"\n" +"Te cobramos 4 cartones y te ponemos uno por burro."); numerito="1"; } try { cart1=Integer.parseInt(numerito); if (cart1 >4 || cart1<1) { JOptionPane.showMessageDialog(this,"Como mucho puedes poner 4 y minimo 1." +"\n" +"Te cobramos 4 cartones y te ponemos uno por burro."); cart1=1; } } catch(NumberFormatException afe) { JOptionPane.showMessageDialog(this,"Tienes que poner numeros." +"\n" +"Te cobramos 4 cartones y te ponemos uno por burro."); cart1=1; } return(cart1); } //obtener nombre String obtenerNombre1() { String per2=t1.getText(); return(per2); }

numerito="1"; cart1=Integer.parseInt(numerito); int pasta=Integer.parseInt(money); if(cart1<5 && cart1>0) pasta=pasta­(cart1*10); if(cart1>4 || cart1<1) pasta=pasta­40; return(pasta); } //obtener cartones int obtenerValor1()

18

} //pantalla jugador uno class Jugador1 extends JDialog implements ActionListener { JLabel e1=new JLabel ("Nombre:", JLabel.CENTER); //Etiquetas JLabel e2=new JLabel ("Password:", JLabel.CENTER); © 2014 - www.spanishdeveloperscommunity.es


JLabel e3=new JLabel ("Nº cartones:", JLabel.CENTER); JLabel e4=new JLabel ("(1­4)", JLabel.CENTER); JLabel e5=new JLabel (""); JLabel e6=new JLabel ("");

Fila2.add (t2); add (Fila2); JPanel Fila3=new JPanel (); Fila3.setLayout (new GridLayout (1,2));

JButton b1=new JButton ("OK"); //Boton

JPanel Sub1Fila3=new JPanel ();

JTextField t1=new JTextField (); //Campos JPasswordField t2=new JPasswordField (); JTextField t3=new JTextField (2);

Sub1Fila3.setBackground (Color.BLUE); e3.setForeground (cl); Sub1Fila3.add (e3); Fila3.add (Sub1Fila3);

Color cl=new Color (255,128,0); //Colores int cart=0;

JPanel Sub2Fila3=new JPanel ();

Statement sentencia; Statement sentencia1; ResultSet resultado; Connection conexion; boolean compru=true;

Sub2Fila3.setLayout (new GridLayout (1,2)); Sub2Fila3.setBackground (Color.BLUE); e4.setForeground (cl);

String money; Sub2Fila3.add (t3); Sub2Fila3.add (e4); Fila3.add (Sub2Fila3);

Jugador1 (JDialog bg) { super (bg,"Jugador 1",true); setLocation (270,200);

add (Fila3); setLayout (new GridLayout

JPanel Fila4=new JPanel (); Fila4.setLayout (new

(4,1)); FlowLayout ()); JPanel Fila1=new JPanel (); Fila1.setLayout (new

Fila4.setBackground (Color.BLUE);

Fila1.setBackground

(Color.BLUE);

GridLayout (1,2));

b1.setForeground

(Color.BLUE); e1.setForeground (cl); Fila1.add (e1); Fila1.add (t1); add (Fila1); JPanel Fila2=new JPanel (); Fila2.setLayout (new GridLayout (1,2)); Fila2.setBackground (Color.BLUE); e2.setForeground (cl); Fila2.add (e2); © 2014 - www.spanishdeveloperscommunity.es

b1.setBackground (cl); b1.addActionListener(this); Fila4.add (b1); add (Fila4); addWindowListener (new WindowAdapter () //Para poder cerrar la ventana { public void windowClosing (WindowEvent we) { dispose (); }

19


else {

}); setSize (300,200); setVisible (true);

//jugador ya creado String clave=resultado.getString("contraseña");

}

clave=clave.trim();

public void actionPerformed (ActionEvent

if(con.equals(clave)) {

aev) { if (aev.getSource()==b1)

// contraseña valida y que tengas suerte

{ try { Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); conexion = DriverManager.getConnection ("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\Documents and Settings\\Coculi\\Mis documentos\\Java\\Ejercicios\\Bingo\\BINGO.mdb"); String nol=t1.getText(); String con=t2.getText();

JOptionPane.showMessageDialog(this,"Contras eña valida" +"\n" +"Mucha suerte en el juego."); } else { // contraseña invalida JOptionPane.showMessageDialog(this,"Contras eña incorrecta" +"\n" +"Intentelo de nuevo."); dispose();

sentencia1=conexion.createStatement(ResultSet.TYPE_FORW ARD_ONLY,ResultSet.CONCUR_READ_ONLY); resultado= sentencia1.executeQuery ("SELECT * FROM USUARIOS WHERE nombre='" + nol +"'"); compru=resultado.next(); if(compru==false) { //nuevo jugador

Jugador1 ju =new Jugador1 (this); //Diálogo } money=resultado.getString("saldo"); } resultado.close(); conexion.close(); } catch(ClassNotFoundException cnfe) {

sentencia=conexion.createStatement(ResultSet .TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONL System.out.println(cnfe); } Y); catch(SQLException sqle) { sentencia.executeUpdate("INSERT INTO System.out.println(sqle); USUARIOS (nombre,contraseña,saldo) VALUES ('" +nol } +"','" +con +"',3000)"); dispose(); } JOptionPane.showMessageDialog(this,"Nuevo } jugador creado" +"\n" +"Dispones de 3000 creditos para empezar." +"\n" +"Cada cartón cuesta 10 creditos" +"\n"); //obtener saldo money="3000"; int obtenerguita() }

20

© 2014 - www.spanishdeveloperscommunity.es


{

return(per1); String numerito=t3.getText(); if(numerito.equals(""))

} numerito="1";

cart=Integer.parseInt(numerito); int pasta=Integer.parseInt(money); if(cart<5 && cart>0) pasta=pasta­(cart*10); if(cart>4 || cart<1) pasta=pasta­40; return(pasta);

} //modulo volver a jugar class otravez extends JDialog implements ActionListener { JLabel e1=new JLabel ("¿Quieres volver a jugar?:");

} //obtener cartones int obtenerValor() { String numerito=t3.getText(); if(numerito.equals("")) { JOptionPane.showMessageDialog(this,"Tenias que haber escrito algo" +"\n" +"Te cobramos 4 cartones y te ponemos uno por burro."); numerito="1"; } try { cart=Integer.parseInt(numerito); if(cart>4 || cart<1) { JOptionPane.showMessageDialog(this,"Como mucho puedes poner 4 y minimo 1" +"\n" +"Te cobramos 4 cartones y te ponemos uno por burro."); cart=1; } } catch(NumberFormatException afe) { JOptionPane.showMessageDialog(this,"Tienes que poner numeros" +"\n" +"Te cobramos 4 cartones y te ponemos uno por burro."); cart=1; } return(cart); } //obtener nombre String obtenerNombre() { String per1=t1.getText(); © 2014 - www.spanishdeveloperscommunity.es

JLabel blan=new JLabel (""); JLabel blan1=new JLabel (""); JLabel blan2=new JLabel (""); JLabel blan3=new JLabel (""); ButtonGroup eleccion =new ButtonGroup(); JRadioButton yes =new JRadioButton("SI"); JRadioButton not =new JRadioButton("NO"); JButton b1=new JButton ("OK"); //Boton Color cl=new Color (255,128,0); int reempla=0; int reempla1=0; String pel; String pel1; boolean dosgrid; boolean eliminar; otravez (JFrame ot) { super (ot,"¿Otra Partida?",true); setLocation (270,200); setLayout (new BorderLayout ()); //norte JPanel norte =new JPanel (new FlowLayout()); norte.setBackground(Color.BLUE); e1.setForeground(cl); norte.add(e1); add (norte, "North");

21


//centro JPanel centro= new JPanel (new GridLayout(2,3)); yes.setOpaque(false); not.setOpaque(false); centro.setBackground(Color.BLUE); yes.setForeground(cl); not.setForeground(cl); centro.add(blan); eleccion.add(yes); centro.add(yes); centro.add(blan1); centro.add(blan2); eleccion.add(not); centro.add(not); centro.add(blan3); add (centro, "Center");

if(yes.isSelected()) { dispose(); eliminar=true; Bingo bl = new Bingo(); } //no volver a jugar if(not.isSelected()) { eliminar=true; dispose(); } } } }

BingoSer.java //sur JPanel sur= new JPanel (new FlowLayout()); sur.setBackground(Color.BLUE); b1.setForeground(Color.BLUE); b1.setBackground(cl); b1.addActionListener(this); sur.add(b1); add(sur, "South");

addWindowListener (new WindowAdapter () //Para poder cerrar la ventana { public void windowClosing (WindowEvent we) { dispose (); } }); setSize (300,200); setVisible (true);

import java.awt.*; import java.lang.*; import javax.swing.*; import java.awt.event.*; import java.io.*; import java.sql.*; import java.net.*; import java.util.Random; import java.util.*; class BingoSer extends Frame { ServerSocket ser; int partida=0; void lanzarServidor() { try { System.out.println("Cargar servidor"); ser=new ServerSocket(5001,50);

}

while (true) new

public void actionPerformed (ActionEvent aev) {

EmpezarPartida (ser.accept(),this,partida).start(); } catch(IOException e) {

if (aev.getSource()==b1) {

System.out.println(e); //volver a jugar

22

} © 2014 - www.spanishdeveloperscommunity.es


} public void anadir(String texto) { System.out.println(""+texto); } public static void main(String args[]) { BingoSer bise=new BingoSer(); bise.lanzarServidor(); }

public void run() { boolean fin=false; System.out.println("run"); bis.anadir("La partida"+partida+" ha comenzado\n"); while(!fin) { try {

} class EmpezarPartida extends Thread { Socket conexion5; BingoSer bis; int partida=0; DataInputStream entrada; DataOutputStream salida; int tabla []=new int [90]; EmpezarPartida (Socket c, BingoSer bins, int numero) { try {

String pasado=entrada.readUTF(); if(!pasado.trim().equals("acabar")) {

int can=0; double a=0; do {

System.out.println("Nuevo Partida entra"); InetAddress ia=c.getInetAddress();

a=Math.random()*90; can=(int)a;

System.out.println(ia.getHostAddress());

}

System.out.println(ia.getHostName());

while(tabla[can]==1);

System.out.println(ia.getLocalHost()); conexion5=c; bis=bins; partida=numero; entrada = new

tabla[can]=1;

DataInputStream(conexion5.getInputStream()); salida = new DataOutputStream(conexion5.getOutputStream()); } catch(IOException e) {

//enviar System.out.println(can); salida.writeUTF(can +"\n");

System.out.println(e); } } © 2014 - www.spanishdeveloperscommunity.es

23


}

ImageIcon vacio=new ImageIcon("vacio2.JPG");

else fin=true; } catch(SocketException se) { fin=true; } catch(IOException e) {

Color cl=new Color (255,128,0); int bin=0; int lin=0; int lin1=0; int lin2=0; int compro=0;

fin=true; System.out.println(e); } } bis.anadir("Se ha acabado la partida "+partida+"\n"); try { conexion5.close(); } catch(IOException e) { System.out.println(e); } } }

Carton() { setLocation(300,250); //Panel de toda la pantalla BorderLayout cp2= (new BorderLayout()); setLayout (cp2); JPanel north=new JPanel (); north.setBackground (Color.BLUE); add (north, "North"); JPanel south=new JPanel (); south.setBackground (Color.BLUE); add (south, "South"); JPanel west=new JPanel (); west.setBackground (Color.BLUE); add (west, "West");

Carton.java import java.awt.*; import java.lang.*; import javax.swing.*; import java.awt.event.*; import java.util.Random; import java.io.*; class Carton extends JPanel { //Atributos JLabel carton [][] = new JLabel[3][9]; int x=0; int alea [][]=new int [3][9];

24

Font ft= new Font ("Comic Sans",Font.BOLD,12);

JPanel east=new JPanel (); east.setBackground (Color.BLUE); add (east, "East"); JPanel central=new JPanel (); central.setBackground(Color.BLUE); central.setLayout (new GridLayout (3,9)); for(int i=0;i<3;i++) { for(int j=0;j<9;j++) {

carton[i][j]=new JLabel("",JLabel.CENTER); © 2014 - www.spanishdeveloperscommunity.es


carton[i][j].setBackground(Color.BLUE);

JOptionPane.showMessageDialog(this,"Has hecho LINEA");

carton[i][j].setForeground(cl);

yata=false;

carton[i][j].setFont(ft);

lin1=6;

carton[i][j].setBorder(BorderFactory.createLineBorder(cl));

lin2=6;

central.add(carton[i][j]);

compro=10;

} }

}

add (central, "Center"); //llamar a hacer carton Aleatorio();

} if(i==1) {

}

lin1=lin1+1;

//modulo que te dice cuando es linea y cuando es bingo int eliminar (int can, boolean yata) { for(int i=0; i<3; i++) { for(int j=0; j<9; j++)

if(lin1==5) {

JOptionPane.showMessageDialog(this,"Has hecho LINEA");

{

yata=false;

if(alea[i][j]==can)

lin=6;

{

lin2=6;

bin=bin + 1;

compro=10;

carton[i][j].setForeground(Color.BLUE); if(yata==true)

} }

{

if(i==2)

if(i==0)

{

{

lin2=lin2+1; lin=lin+1; if(lin==5)

if(lin2==5) {

{ © 2014 - www.spanishdeveloperscommunity.es

25


JOptionPane.showMessageDialog(this,"Has hecho LINEA");

//generar numeros en el carton for (int i=0; i<3; i++) { for(int j=0;j<9;j++) { do { num_rep(i,j); } while(alea[i][j]==­1); } }

yata=false; lin1=6; lin2=6; compro=10; } }

for(int i=0; i<3; i++) { sin_num(i); }

} if (bin==15) {

JOptionPane.showMessageDialog(this,"Has hecho BIIIINGO"); bin=0;

for (int i=0; i<3; i++) { for(int j=0; j<9; j++) { carton[i][j].setText(Integer.toString(alea[i][j])); if (carton[i][j].getText().equals("0")) {

compro=20; }

carton[i][j].setText(null);

} }

carton[i][j].setIcon(vacio); }

}

}

return(compro);

}

}

}

//generar los numeros aleatorios en el carton void Aleatorio() { //Poner la matriz a ­1 for (int i=0; i<3; i++) { for (int j=0; j<9; j++) { alea[i][j]=­1; } }

26

//te coloca los numeros por columnas void num_rep (int i, int j) { double b=0; double a=0; //Organizar los numeros en columnas if(j==0) { b=(j*10)+8; a=Math.random()*b; a=a+1; } if(j==1 || j==2 || j==3 || j==4 || © 2014 - www.spanishdeveloperscommunity.es


j==5 || j==6 || j==7) { b=(j*10)+9; a=Math.random()*b; do { a=Math.random()*b; } while(a<(j*10)); } if(j==8) { b=(j*10)+10; a=Math.random()*b; do { a=Math.random()*b; } while(a<(j*10)); } x=(int)a; rept(i,j,x); alea[i][j]=x;

if(i==0 || i==1) { do { count=count+1; do { k=Math.random()*9; y=(int)k; } while(alea[i][y]==0); alea[i][y]=0; } while(count<4); count=0;

}

}

//te hace que no se repitan los numeros void rept (int i, int j, int x) { //No se repite los numeros if(i==1) { if(x==alea[i­ 1][j])

if(i==2) { do { count=count+1; do

num_rep(i,j); }

{

if(i==2) { if(x==alea[i­

k=Math.random()*9; y=(int)k;

1][j] || x==alea[i­2][j]) num_rep(i,j); } } } //te pone espacios en blanco en cada fila void sin_num(int i) { int y=0; double k=0; int count=0;

while(alea[i][y]==0 || alea[1][y]==0 && alea[0][y]==0); alea[i][y]=0; } while(count<4); count=0; } }}}

© 2014 - www.spanishdeveloperscommunity.es

27


Listas

28

Š 2014 - www.spanishdeveloperscommunity.es


doblemente enlazadas El objetivo que buscamos en éste articulo es el de arrojar algo de luz a la estructura de datos lista doblemente enlazada. Igualmente, incluiremos en la explicación algunas operaciones básicas en dicha estructura, a fin de probar su funcionalidad. Las listas doblemente enlazadas son estructuras de datos similares a las listas enlazadas simples. Su principal diferencia, funcionalmente hablando, es que el desplazamiento en esta ocasión será en ambos sentidos. En este caso particular, la reserva de memora necesaria la haremos en tiempo de ejecución. Como hemos dicho en un principio, a diferencia de un TAD lista enlazada simple, ésta contará con dos punteros, uno que apunta al elemento anterior y otro al elemento siguiente. Esto es válido salvo, evidentemente dos excepciones:

Para acceder a un elemento, la lista puede ser recorrida en ambos sentidos: ­ comenzando por el inicio, el puntero siguiente permite el desplazamiento hacia el próximo elemento. ­ comenzando por el final, el puntero anterior permite el desplazamiento hacia el elemento anterior. Para definir un elemento de la lista será utilizado el tipo struct. El elemento de la lista contendrá: un campo dato, un puntero anterior y un puntero siguiente. Los punteros anterior y siguiente deben ser del mismo tipo que el elemento, en caso contrario no podrán apuntar hacia un elemento de la lista. El puntero anterior permitirá el acceso hacia el elemento anterior mientras que el puntero siguiente permitirá el acceso hacia el próximo elemento.

El primer nodo de la lista, tendrá su puntero al elemento anterior con un valor NULL. De igual forma el último nodo de la lista tendra el puntero al elemento siguiente asignado al valor NULL.

© 2014 - www.spanishdeveloperscommunity.es

typedef struct dl_ElementoLista { char *dato; struct dl_ElementoLista *anterior; struct dl_ElementoLista *siguiente; }dl_Elemento; Para tener el control de la lista es preferible conservar algunos elementos: el primer elemento, el último elemento, el número de elementos.

29


Para ello, será utilizada otra estructura (no es obligatorio, pueden ser A continuación el algoritmo de inserción y registro de los elementos: utilizadas variables). declaración del elemento a insertar typedef struct dl_ListaIdentificacion { dl_Elemento *inicio; dl_Elemento *fin; int tamaño; }dl_Lista;

asignación de la memoria para el nuevo elemento rellenar el contenido del campo de datos

actualizar los punteros hacia el elemento anterior y el elemento El puntero inicio contendrá la dirección del primer elemento de la siguiente lista. actualizar los punteros hacia el 1er y ultimo elemento si es necesario. El puntero fin contendrá la dirección del último elemento de la lista. La variable tamaño contiene el número de elementos.

Caso particular: en una lista con un solo elemento, el primero es al mismo tiempo el último.

Cualquiera que sea la posición en la lista, los punteros inicio y fin Actualizar el tamaño de la lista apuntan siempre al primer y último elemento. Para añadir un elemento a la lista hay varias situaciones: El campo tamaño contendrá el numero de elementos de la lista 1. Inserción en una lista vacía cualquiera que sea la operación efectuada sobre la lista. A continuación, estudiarémos cuáles son las operaciones básicas que podemos aplicar a la nueva estructura de datos recien creada. No debemos olvidar que este artículo es meramente didáctico, por lo cuál no tendremos en cuenta demasiado la eficiencia de los algoritmos que escribamos. Por supuesto, siempre habrá otra forma de hacerlos, pero eso se lo dejamos al lector.

2. Inserción al inicio de la lista 3. Inserción al final de la lista 4. Inserción antes de un elemento 5. Inserción después de un elemento

A. Inicialización

1. Inserción en una lista vacía

Modelo de la función: Modelo de la función: void inicialización (Lista *lista); int ins_en_lista_vacia (dl_Lista *lista, char *dato); Esta operación debe ser hecha antes de cualquier otra operación sobre la lista. Esta inicializa el puntero inicio y el puntero fin con el puntero NULL, y el tamaño con el valor 0.

La función devuelve ­1 en caso de error, si no devuelve 0. Etapas: asignación de memoria para el nuevo elemento

La función rellenar el campo de datos del nuevo elemento void inicialización (Liste *liste){ lista->inicio = NULL; lista->fin = NULL; tamaño = 0; } B. Inserción de un elemento en la lista

30

el puntero anterior del nuevo elemento apuntará hacia NULL (ya que la inserción es hecha en una lista vacía utilizamos la dirección del puntero inicio que vale NULL) el puntero siguiente del nuevo elemento apuntará hacia NULL (ya que la inserción es hecha en una lista vacía se utiliza la dirección del puntero fin que vale NULL) © 2014 - www.spanishdeveloperscommunity.es


los punteros inicio y fin apuntaran hacia el nuevo elemento el tamaño es actualizado. La función int insercion_en_lista_vacia (dl_Lista * lista, char *dato){

el puntero inicio apunta hacia el nuevo elemento el puntero fin no cambia el tamaño es incrementado La función int ins_inicio_lista(dl_Lista * lista, char *dato){ dl_Elemento *nuevo_elemento; if ((nuevo_elemento = alloc (nuevo_elemento))

dl_Elemento *nuevo_elemento; if ((nuevo_elemento = alloc (nuevo_elemento)) == NULL) return -1; strcpy (nuevo_elemento->dato, dato); nuevo_elemento->anterior = lista->inicio; nuevo_elemento->siguiente = lista->fin; lista->inicio = nuevo_elemento; lista->fin = nuevo_elemento; lista->tamaño++; return 0; }

2. Inserción al inicio de la lista Modelo de la función: int ins_inicio_lista(dl_Lista * lista, char *dato); La función devuelve ­1 en caso de error, si no devuelve 0. Etapas: asignación de memoria al nuevo elemento rellenar el campo de datos del nuevo elemento

== NULL) return -1; strcpy (nuevo_elemento->dato, dato); nuevo_elemento->anterior = NULL; nuevo_elemento->siguiente = lista->inicio; lista->inicio->anterior = nuevo_elemento; lista->inicio = nuevo_elemento; lista->tamaño++; return 0; }

3. Inserción al final de la lista Modelo de la función: int ins_fin_lista(dl_Lista * lista, char *dato); La función devuelve ­1 en caso de error, si no devuelve 0.

el puntero anterior del nuevo elemento apunta hacia NULL el puntero siguiente del nuevo elemento apunta hacia el 1er elemento

Etapas:

el puntero anterior del 1er elemento apunta hacia el nuevo elemento

asignación de memoria al nuevo elemento rellenar el campo de datos del nuevo elemento

© 2014 - www.spanishdeveloperscommunity.es

31


el puntero siguiente del nuevo elemento apunta hacia NULL

La función devuelve ­1 en caso de error, si no devuelve 0.

el puntero anterior del nuevo elemento apunta hacia el ultimo elemento (es el puntero fin que contiene por ahora su dirección)

La inserción se efectuara antes de cierta posición pasado como argumento a la función.

el puntero siguiente del ultimo elemento apuntará hacia el nuevo elemento

La posición indicada no debe ser ni el primer ni el último elemento. En ese caso hay que utilizar las funciones de inserción al inicio y/o al final de la lista.

el puntero fin apunta hacia el nuevo elemento Etapas: el puntero inicio no cambia asignación de memoria al nuevo elemento el tamaño es incrementado La función int ins_fin_lista(dl_Lista * lista, char *dato){ dl_Elemento *nuevo_elemento;

rellenar el campo de datos del nuevo elemento Elegir una posición en la lista (la inserción se hará después de la posición elegida) el puntero siguiente del nuevo elemento apunta hacia el elemento actual. el puntero anterior del nuevo elemento apunta hacia la dirección hacia la que apunta el puntero anterior del elemento actual. el puntero siguiente del elemento que precede al elemento actual apuntará hacia el nuevo elemento el puntero anterior del elemento actual apunta hacia el nuevo elemento el puntero fin no cambia el puntero inicio cambia si la posición elegida es la posición 1

if ((nuevo_elemento = alloc (nuevo_elemento)) == NULL) return -1; strcpy (nuevo_elemento->dato, dato); nuevo_elemento->siguiente = NULL; nuevo_elemento->anterior = lista->fin; lista->fin->siguiente = nuevo_elemento; lista->fin = nuevo_elemento; lista->tamaño++; return 0; }

4. Inserción antes de un elemento de la lista Modelo de la función: int ins_antes (dl_Lista * lista, char *dato, int pos);

32

el tamaño se incrementa en una unidad La función int ins_antes (dl_Lista * lista, char *dato, int pos){ int i; dl_Elemento *nuevo_elemento, *actual; if ((nuevo_elemento = alloc (nuevo_elemento)) == NULL) return -1; strcpy (nuevo_elemento->dato, dato); actual = lista->inicio; for (i = 1; i < pos; ++i) actual = actual->siguiente; nuevo_elemento->siguiente = actual; nuevo_elemento-> anterior = actual->anterior; if(actual->anterior == NULL) © 2014 - www.spanishdeveloperscommunity.es


lista->inicio = nuevo_elemento; else actual->anterior->siguiente = nuevo_elemento; actual->anterior = nuevo_elemento; lista->tamaño++; return 0; }

5. Inserción después de un elemento de la lista

La posición indicada no debe ser el último elemento. En ese caso hay que utilizar la función de inserción al final de la lista. Etapas: asignación de memoria al nuevo elemento rellenar el campo de datos del nuevo elemento Elegir una posición en la lista (la inserción se hará después de la posición elegida) el puntero siguiente del nuevo elemento apunta hacia la dirección hacia la que apunta el puntero siguiente del elemento actual (ver la imagen).

el puntero anterior del nuevo elemento apunta hacia el elemento actual.

Modelo de la función: int ins_después (dl_Lista * lista, char *dato, int pos); La función devuelve ­1 en caso de error, si no devuelve 0. La inserción se efectuará después de cierta posición pasado como argumento a la función.

© 2014 - www.spanishdeveloperscommunity.es

el puntero anterior del elemento que va después del elemento actual apuntará hacia el nuevo elemento. el puntero siguiente del elemento actual apunta hacia el nuevo elemento el puntero inicio no cambia el puntero fin cambia si la posición elegida es la posición del ultimo elemento (el tamaño de la lista)

33


el tamaño se incrementa en una unidad

2. Eliminación al final de la lista

La función

3. Eliminación antes de un elemento

int ins_después (dl_Lista * lista, char *dato, int pos){ int i; dl_Elemento *nuevo_elemento, *actual; if ((nuevo_elemento = alloc (nuevo_elemento)) == NULL) return -1; strcpy (nuevo_elemento->dato, dato); actual = lista->inicio; for (i = 1; i < pos; ++i) actual = actual->siguiente; nuevo_elemento->siguiente = actual>siguiente; nuevo_elemento->anterior = actual; if(actual->siguiente == NULL) lista->fin = nuevo_elemento; else actual->siguiente->anterior = nuevo_elemento; actual->siguiente = nuevo_elemento; lista->tamaño++; return 0; }

4. Eliminación después de un elemento

C. Eliminación de un elemento de la lista

Eliminación en la lista

A continuación el algoritmo para eliminar un elemento de la lista:

Modelo de la función:

­ uso de un puntero temporal para guardar la dirección de los elementos a eliminar ­ el elemento a eliminar puede encontrase en cualquier posición en la lista.

int supp(dl_Lista *lista, int pos);

En relación a la lista enlazada simple en el que la eliminación solo puede ser hecha después que un elemento ha sido designado, las listas doblemente enlazadas son más flexibles gracias a los 2 punteros que permiten guardar el rastro tanto hacia atrás como hacia delante.

Podemos distinguir varias situaciones:

liberar la memoria ocupada por el elemento eliminado

eliminación en la ultima posición (el ultimo elemento)

actualizar el tamaño de la lista

eliminación en otra parte de la lista en cierta posición

5 Eliminación de un elemento Sin embargo, la eliminación al inicio y al final de la lista doblemente enlazada así como antes o después de un elemento equivale a la eliminación en la posición 0 (cero) o en la posición N (N= numero de elementos de la lista) o en otra parte de la lista. En el caso de listas doblemente enlazadas la eliminación en cualquier posición no presenta ningún problema gracias a los punteros anterior y siguiente, que permiten conservar el enlace entre los elementos de la lista. Razón por la cual solo vamos a crear una función. si deseamos eliminar el elemento al inicio de la lista elegiremos la posición cero si deseamos eliminar el elemento al final de la lista elegiremos la posición N (el numero de elementos) si deseamos eliminar cualquier elemento entonces elegimos su posición en la lista.

La función devuelve ­1 en caso de error, si no devuelve 0.

eliminación en la posición 1 en una lista con un solo elemento eliminación en la posición 1 en una lista con varios elementos

La eliminación en una lista vacía no tiene sentido Para eliminar un elemento de la lista hay varias situaciones: 1. Eliminación al inicio de la lista

34

Etapas: La posición elegida es 1 (el caso de eliminación del 1er elemento de la © 2014 - www.spanishdeveloperscommunity.es


lista) el puntero sup_elemento contendrá la dirección del 1er elemento el puntero inicio contendrá la dirección contenida por el puntero siguiente del 1er elemento que deseamos eliminar (si este puntero vale NULL entonces actualizamos el puntero fin ya que estamos en el caso de una lista con un solo elemento, si no hacemos apuntar el puntero anterior del 2do elemento hacia NULL) la posición elegida es igual al numero de elementos de la lista el puntero sup_elemento contendrá la dirección del ultimo elemento

el puntero siguiente del elemento que antecede al elemento a eliminar apunta hacia la dirección contenida en el puntero siguiente del elemento a eliminar

hacemos apuntar al puntero siguiente del penúltimo elemento (es el el puntero anterior del elemento que va después del elemento a eliminar apunta hacia la dirección contenida en el puntero anterior del elemento a eliminar. el tamaño de la lista será disminuida en 1 elemento La función int supp(dl_Lista *lista, int pos){ int i; dl_Elemento *sup_elemento,*actual;

if(lista->tamaño == 0) return -1; elemento hacia el que apunta el puntero <anterior> del ultimo elemento), hacia NULL actualizamos el puntero fin

la posición elegida es aleatoria en la lista el puntero sup_elemento contendrá la dirección del elemento a eliminar

© 2014 - www.spanishdeveloperscommunity.es

if(pos == 1){ /* eliminación del 1er elemento */ sup_elemento = lista->inicio; lista->inicio = lista->inicio->siguiente; if(lista->inicio == NULL) lista->fin = NULL; else lista->inicio->anterior == NULL; }else if(pos == lista->tamaño){ /* eliminación del último elemento */ sup_elemento = lista->fin;

35


lista->fin->anterior->siguiente = NULL; lista->fin = lista->fin->anterior; }else { /* eliminación en otra parte */ actual = lista->inicio; for(i=1;i<pos;++i) actual = actual->siguiente; sup_elemento = actual; actual->anterior->siguiente = actual>siguiente; actual->siguiente->anterior = actual>anterior; } free(sup_elemento->dato); free(sup_elemento); lista->tamaño--; return 0; }

D. Visualización de la lista Para mostrar la lista entera podemos posicionarnos al inicio o al final de la lista (el puntero inicio o fin lo permitirá). Luego utilizando el puntero siguiente o anterior de cada elemento, la lista es recorrida del 1er al ultimo elemento o del ultimo al 1er elemento.

ultimo elemento */ printf("[ "); while(actual != NULL){ printf("%s : ",actual->dato); actual = actual->anterior; } printf("]\n"); } E. Destrucción de la lista Para destruir la lista entera, he utilizado la eliminación en la posición 1 ya que el tamaño es mayor a cero. La función void destruir(dl_Lista *lista){ while(lista->tamaño > 0) sup(lista,1); }

V. Ejemplo completo dlista.h /* ­­­­­­­­­­ dlista.h ­­­­­­­­­­­ */ typedef struct dl_ElementooLista{

La condición para detener es dada por el puntero siguiente del ultimo elemento que vale NULL en el caso de la lectura del inicio hacia el fin de la lista, o por el puntero anterior del 1er elemento que vale NULL, en el caso de una lectura del final hacia el inicio de la lista.

char *dato;

Las funciones

typedef struct dl_ListaIdentificar{

struct dl_ElementoLista *anterior; struct dl_ElementoLista *siguiente; } dl_Elemento;

dl_Elemento *inicio;

void affiche(dl_Lista *lista){ /* visualización hacia adelante */ dl_Elemento *actual; actual = lista->inicio; /* punto de inicio el 1er elemento */ printf("[ "); while(actual != NULL){ printf("%s ",actual->dato); actual = actual->siguiente; } printf("]\n"); }

dl_Elemento *fin; int tamaño; } dl_Lista; /* inicialización de la liste */ void inicialización (dl_Lista * lista); dl_Elemento *alloc (dl_Elemento * nuevo_elemento); /* INSERCION */ int ins_en_lista_vacia (dl_Lista * lista, char *dato); int ins_inicio_lista(dl_Lista * lista, char *dato); int ins_fin_lista(dl_Lista * lista, char *dato);

void mustra_inv(dl_Lista *lista){ /* visualización hacia atrás */ dl_Elemento *actual; actual = lista->fin; /* punto de inicio el

36

int ins_después (dl_Lista * lista, char *dato, int

pos); int ins_antes (dl_Lista * lista, char *dato, int pos);

© 2014 - www.spanishdeveloperscommunity.es


dl_Elemento *nuevo_elemento;

/*ELIMINACION*/

if ((nuevo_elemento = alloc (nuevo_elemento)) ==

int sup(dl_Lista *liste, int pos);

NULL)

void muestra (dl_Lista * lista);

return -1; strcpy (nuevo_elemento->dato, dato);

/**************************/

nuevo_elemento->siguiente = NULL;

void muestra_inv (dl_Lista * lista);

nuevo_elemento->anterior = lista->fin;

void destruir (dl_Lista * lista);

lista->fin->siguiente = nuevo_elemento;

/* -------- FIN lista.h --------- */

lista->fin = nuevo_elemento; lista->tamaño++;

dlista_function.h

return 0; }

/***************************\ int ins_después (dl_Lista * lista, char *dato, int *

dlista_function.h

*

pos){

\***************************/

int i;

void inicialización (dl_Lista * lista){

dl_Elemento *nuevo_elemento, *actual;

lista->inicio = NULL; lista->fin = NULL;

if ((nuevo_elemento = alloc (nuevo_elemento)) == NULL)

lista->tamaño = 0;

return -1;

}

strcpy (nuevo_elemento->dato, dato); actual = lista->inicio;

int inserción_en_lista_vacia (dl_Lista * lista, char

for (i = 1; i < pos; <gras>i)

*dato){

actual = actual->siguiente;

dl_Elemento *nuevo_elemento;

nuevo_elemento->siguiente = actual->siguiente;

if ((nuevo_elemento = alloc (nuevo_elemento)) ==

nuevo_elemento->anterior = actual;

NULL)

if(actual->siguiente == NULL)

return -1;

lista->fin = nuevo_elemento;

strcpy (nuevo_elemento->dato, dato);

else

nuevo_elemento->anterior = NULL;

actual->siguiente->anterior = nuevo_elemento;

nuevo_elemento->siguiente = NULL;

actual->siguiente = nuevo_elemento;

lista->inicio = nuevo_elemento;

lista->tamaño++;

lista->fin = nuevo_elemento; lista->tamaño++;

return 0; }

return 0; }

int ins_antes (dl_Lista * lista, char *dato, int pos){

int ins_inicio_lista(dl_Lista * lista, char *dato){ dl_Elemento *nuevo_elemento; if ((nuevo_elemento = alloc (nuevo_elemento)) == NULL) return -1; strcpy (nuevo_elemento->dato, dato); nuevo_elemento->anterior = NULL; nuevo_elemento->siguiente = lista->inicio; lista->inicio->anterior = nuevo_elemento; lista->inicio = nuevo_elemento; lista->tamaño++; return 0; }

int i; dl_Elemento *nuevo_elemento, *actual; if ((nuevo_elemento = alloc (nuevo_elemento)) == NULL) return -1; strcpy (nuevo_elemento->dato, dato); actual = lista->inicio; for (i = 1; i < pos; <gras>i) actual = actual->siguiente; nuevo_elemento->siguiente = actual; nuevo_elemento-> anterior = actual->anterior; if(actual->anterior == NULL) lista->inicio = nuevo_elemento; else

int ins_fin_lista(dl_Lista * lista, char *dato){

© 2014 - www.spanishdeveloperscommunity.es

37


actual->anterior->siguiente = nuevo_elemento;

== NULL)

actual->anterior = nuevo_elemento; lista->tamaño++; return 0;

return NULL; return nuevo_elemento; }

} int menu (dl_Lista *lista){ int sup(dl_Lista *lista, int pos){

int choix;

int i;

if (lista->tamaño == 0){

dl_Elemento *sup_elemento,*actual;

printf ("1. Adición del 1er elemento\n"); printf ("2. Eliminar\n");

if(lista->tamaño == 0)

}

return -1;

else{ printf ("1. Añadir al inicio de la lista\n"); printf ("2. Añadir al final de la lista\n");

if(pos == 1){ /* eliminación de 1er elemento */ sup_elemento = lista->inicio;

printf ("3. Añadir antes de la posición especificada\n");

lista->inicio = lista->inicio->siguiente; if(lista->inicio == NULL)

printf ("4. Añadir después de la posición especificada\n");

lista->fin = NULL; else

printf ("5. Eliminacion en la posicion especificada\n");

lista->inicio->anterior == NULL;

printf ("6. Destruir la lista\n");

}else if(pos == lista->tamaño){ /* eliminacion

printf ("7. Eliminar\n");

del ultimo elemento */

}

sup_elemento = lista->fin;

printf ("\n\nElija: ");

lista->fin->anterior->siguiente = NULL;

scanf ("%d", &elección);

lista->fin = lista->fin->anterior;

getchar();

}else { /* eliminacion en otra parte */

if(lista->tamaño == 0 && elección == 2)

actual = lista->inicio;

elección = 7;

for(i=1;i<pos;<gras>i) actual = actual->siguiente;

return elección; }

sup_elemento = actual;

int supp(dl_Lista *lista, int pos);

actual->anterior->siguiente = actual-

void muestra(dl_Lista *lista){

>siguiente;

dl_Elemento *actual;

actual->siguiente->anterior = actual->anterior;

actual = lista->inicio;

}

printf("[ ");

free(sup_elemento->dato);

while(actual != NULL){

free(sup_elemento); lista->tamaño--;

printf("%s ",actual>dato);

return 0; }

actual = actual>siguiente; }

void destruir(dl_Lista *lista){ while(lista->tamaño > 0) supp(lista,1);

printf("]\n"); } void muestra_inv(dl_Lista *lista){

}

dl_Elemento *actual; actual = lista->fin;

dl_Elemento *alloc (dl_Elemento * nuevo_elemento){

while(actual != NULL){

if ((nuevo_elemento = (dl_Elemento *) malloc (sizeof (dl_Elemento))) == NULL)

printf("%s : ",actual>dato);

return NULL; if ((nuevo_elemento->dato = (char *) malloc (50 * sizeof (char)))

38

actual = actual->anterior; } printf("\n");

© 2014 - www.spanishdeveloperscommunity.es


}

>inicio->dato,lista->fin->dato);

/* -------- FIN dlista_function.h --------- */

muestra(lista); break;

dlista.c

case 3: if(lista->tamaño == 1){

/**********************\

printf("Utilizar la inserción al inicio o al final (Ingrese Menu: 1 ó 2)\n");

*

dlista.c

*

break;

\**********************/

}

#include <stdio.h>

printf("Ingrese un elemento: ");

#include <stdlib.h>

scanf("%s",dato);

#include <string.h>

getchar();

#include "dlista.h"

do{

#include "dlista_function.h"

printf("Ingrese la posición: "); scanf("%d",&pos);

int main (void)

}while (pos < 1 || pos > lista-

{

>tamaño); getchar(); int elección = 0,pos;

ins_antes(liste,dato,pos);

char *dato;

printf("%d elementos: deb=%s

dato = malloc(50);

fin=%s ",

dl_Lista *lista;

lista-

dl_Elemento *piloto = NULL;

>tamaño,lista->inicio->dato,lista->fin->dato);

lista = (dl_Lista *) malloc (sizeof(dl_Lista));

muestra(lista); break;

inicialización(lista);

case 4: if(lista->tamaño == 1){

while(elección != 7){

Printf("Utilizar la inserción al inicio

elección = menu(lista);

o al final (Ingrese Menu: 1 ó 2)\n");

switch(elección){

break;

case 1:

} printf("Ingrese un elemento: ");

printf("Ingrese un elemento: ");

scanf("%s",dato);

scanf("%s",dato);

getchar();

getchar();

if(lista->tamaño == 0)

do{

inserción_en_lista_vacia(lista,dato);

printf("Ingrese la posicion: ");

else

scanf("%d",&pos);

ins_inicio_lista(lista, dato); printf("%d elementos: deb=%s,fin=%s

}while (pos < 1 || pos > lista>tamaño);

",

getchar();

lista->tamaño,lista->inicio->dato,lista->fin->dato);

ins_después(lista,dato,pos);

muestra(lista);

printf("%d elementos:

break;

deb=%s,fin=%s ",

printf("Ingrese un elemento: ");

>inicio->dato,lista->fin->dato);

case 2:

lista->tamaño,listascanf("%s",dato);

muestra(lista);

getchar();

break;

ins_fin_lista(lista, dato); printf("%d elementos: deb=%s,fin=%s ",

case 5: do{ printf("Ingrese la posición : ");

lista->tamaño,lista-

© 2014 - www.spanishdeveloperscommunity.es

scanf("%d",&pos);

39


}while (pos < 1 || pos > lista>tamaño); getchar(); supp(lista,pos); if(lista->tamaño != 0) printf("%d elementos: deb=%s,fin=%s ", lista->tamaño,lista>inicio->dato,lista->fin->dato); else printf("liste vide : %d elementos",lista->tamaño); muestra(lista); break; case 6: destruir(lista); printf("la lista ha sido destruida: %d elementos\n",lista->tamaño); break; } } return 0; }

/* ­­­­­­­­ FIN dlista.c ­­­­­­­­­ */

40

© 2014 - www.spanishdeveloperscommunity.es


Tendrá éxito el smartphone basado en ubuntu os A pesar de que el mundo espera la llegada del primer smartphone con Ubuntu con cierto recelo, la pregunta se hará el tiene el poder de fuego suficiente para dar una competencia morderse las uñas a los gustos de Android de Google y iOS de Apple? Canónica enfriado recientemente las expectativas de una mayor Ubuntu teléfono táctil de lanzamiento de este año, diciendo que un gran OEM probablemente no lanzará un teléfono con sistema operativo de código abierto de este año. Sin embargo, este año vamos a ver el primer smartphone lanzado Ubuntu con dispositivos de demostración más en el Congreso Mundial Móvil.

experiencia de escritorio como se puede lograr haciendo que de esos proyectores pico. 2. apoyo App El popular distro Linux ya tiene un ecosistema floreciente. Todo lo que tiene que hacer es optimizar estas aplicaciones para una experiencia de pantalla pequeña. Muchas de las aplicaciones móviles más populares han sido ya anunciada para Ubuntu Touch.

Aquí hay tres razones por las que Ubuntu teléfono inteligente (s) 3. Gran hardware va a cambiar el juego para siempre: En su campaña de crowdfunding, Canonical estaba tratando de 1. Un dispositivo para gobernarlos a todos construir un smartphone de primera categoría con mejores características posibles, ya que Ubuntu es una plataforma sólida Una experiencia completa de la oficina es lo que estamos que requiere un hardware sólido. Si smartphones Ubuntu utilizan hablando! Un smartphone de gama alta Ubuntu debería ser capaz chips de cuatro núcleos para garantizar una gran experiencia de de obtener a través del día con facilidad, por lo que simplemente usuario, claramente no nos sorprendería en absoluto! se olvidan de que la computadora portátil grueso. Una © 2014 - www.spanishdeveloperscommunity.es

41


Averigua si tus datos personales han sido robados y

aprende a crear contraseĂąas seguras es fundamental contemplar que para proteger nuestros datos con contraseĂąas lo suficientemente seguras como para dificultar el acceso a hackers

42

Š 2014 - www.spanishdeveloperscommunity.es


Es normal encontrar en la prensa o, también a través de las redes Aunque el robo de bases de datos en empresas es algo que los sociales, noticias a propósito de algún robo de datos o también usuarios no pueden controlar, sí pueden protegerse para que el información de algún servicio web. Siempre estos hurtos están daño no sea excesivamente grande. Te recomendamos que para relacionados con información personal. que protejas tus contraseñas con un mínimo de eficiencia, es mejor que uses algunas sencillas reglas. El incidente más reciente ocurrido sobre este tema, lo podemos fechar ya en los pocos días que Para poder recordar tantas llevamos de este año 2014. contraseñas diferentes en la Snapchat es el protagonista de cabeza te recomendamos éste hurto de datos. algunas reglas nemotécnicas Concretamente más de cinco que te pueden servir o a millones de cuentas robadas. En partir de las cuales puedes el pasado año 2013, podemos idear las tuyas propias: enumerar un sin fin de ataques. Muchos de ellos fueron En cada contraseña usa una especialmente sonoros: Adobe parte fija y otra variable que (150 millones) o Evernote (con cambia con cada una de casi 50 millones), por poner ellas. La parte fija es igual algunos ejemplos. en todas las contraseñas. La parte variable puede tener Para saber si nuestra cuenta ha relación con el servicio, de sido robada, tenemos la esta manera será más posibilidad de consultarlo en sencillo de recordar. Pero Have I been pwned?. Este cuidado con que se puedan servicio recopila millones de relacionar con cuestiones direcciones de correo personales tuyas, tales como electrónico que han sido la matrícula de tu coche ... robadas en los últimos años. Concretamente es probable que cuenten con alrededor de A partir de la parte 160 millones de cuentas Have I been pwneed?. te dirá si tu dirección de email forma parte de la base de datos con variable puedes crear afectadas. fórmulas. Por ejemplo más de 158 millones de correos electronicos para Gmail puedes tener El uso de esta web es tan robados. en tu parte variable la sencillo como introducir palabra Gmail. Como cada una de nuestras Gmail tiene 5 letras, 2 de ellas vocales puedes añadir al final de direcciones de correo electrónico que sospechemos que hayan la contraseña un 7 (5 letras + 2 vocales). Para el caso de Yahoo! podido ser interceptadas. Esta página web nos responderá si sería un 8 (5 letras + 3 vocales). hemos tenido suerte y nuestra dirección no se ha visto afectada por éste tipo de ataques o, por el contrario, ha sucumbido ante Otras forma de protegerte en Internet es a través de la uno de éstos ataques y, por tanto, nuestros datos privados han autenticación en dos pasos o el uso de servicios como Latch, un quedado en evidencia. servicio lanzado hace apenas un mes por Telefónica Digital e Eleven Paths que permite desconectar tus identidades digitales En cualquier caso, no te dejes llevar al optimismo demasiado cuando no se está haciendo uso de ellas. Así, aunque un tercero rápido. Resulta que ésta web tan sólo dispone de una pequeña consiga tu contraseña de cualquier servicio, si intenta acceder parte del conjunto completo de direcciones que a lo largo de los desde un ordenador (incluso desde el tuyo) la contraseña estará años fueron atacadas. Sólo aquellas que se han hecho públicas en desactivada mediante Latch y no podrá acceder a tu cuenta. Todo Internet son las que están contenidas en este servicio. Por tanto, sea por dormir un poco más tranquilos. que no aparezca en la lista de resultados de cuentas de correo electrónico afectadas no significa que no haya sufrido a lo largo En cualquier caso, también debes plantearte cambiar la de su existencia un asalto. Se podría decir que no están todas las contraseña regularmente, a fin de dificultar los ataques. que son pero son todas las que están. © 2014 - www.spanishdeveloperscommunity.es

43



Spanish Developers Community