Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - César Krall

Páginas: 1 ... 21 22 23 24 25 [26] 27 28 29 30 31 ... 68
501
Hola Pedro!!

Revisando tu código y respuestas (después de discutirlo un rato) hemos visto que además de que tu código está bien planteado para los objetivos del ejercicio, que era comprobar cómo el uso de métodos de objetos permite evitar el conflicto de nombres respecto a funciones definidas en el ámbito global, convenía modificar la redacción del ejercicio para que quedara más clara.

La redacción inicial era:

Crea un objeto vacío denominado GestionDeUsuarios y añádele dos métodos: un método preguntarNombre y un método despedir. Al invocar GestionDeUsuarios.preguntarNombre(user) se debe crear un objeto de tipo usuario con id de usuario user y almacenar su nombre e id de usuario. Al invocar el método GetionDeUsuarios.despedir(user) se debe mostrar un mensaje de despedida “Hasta luego nombreDeUsuario” donde nombreDeUsuario será el nombre correspondiente.


Ahora la hemos dejado:

Crea un objeto vacío denominado GestionDeUsuarios y añádele dos métodos: un método preguntarNombre y un método despedir. Al invocar GestionDeUsuarios.preguntarNombre() se debe establecer la propiedad nombre del objeto con un nombre introducido por el usuario y un id de usuario introducido también por el usuario. Al invocar el método GestionDeUsuarios.despedir() se debe mostrar un mensaje de despedida “Hasta luego nombreDeUsuario” donde nombreDeUsuario será el nombre correspondiente.

Teniendo en cuenta estos cambios hemos modificado ligeramente tu código para dejar la respuesta así.

Código: [Seleccionar]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Ejemplo aprenderaprogramar.com</title><meta charset="utf-8">
<style>
#pulsador {padding:15px; width: auto; display: inline-block; margin: 25px; cursor: pointer; color: yellow; border-radius: 40px; background: purple;}
</style>
<script type="text/javascript">
var gestionDeUsuarios = {};
Object.defineProperty(gestionDeUsuarios,'usuario',{value:'',writable:true},'idUsuario',{value:0,writable:true});
gestionDeUsuarios.preguntarNombre = function(){
var usuario = prompt('Introduzca el nombre del usuario: ');
var idUsuario = prompt('Introduzca el id del usuario: ');
gestionDeUsuarios.usuario=usuario;
gestionDeUsuarios.idUsuario=idUsuario;
}
gestionDeUsuarios.despedir = function(){
alert('(Desde método despedir) Hasta luego ' + gestionDeUsuarios.usuario);
}

function despedir(){
alert('(Desde función despedir()) ... Hasta luego ' + gestionDeUsuarios.usuario);
}

function testObjetos() {
gestionDeUsuarios.preguntarNombre();
gestionDeUsuarios.despedir();
alert ('Tenemos un objeto gestionDeUsuarios con propiedades nombre: '+gestionDeUsuarios.usuario + 'e id: '+gestionDeUsuarios.idUsuario);
despedir();
}

</script>
</head>
<body>
<div id="cabecera"><h2>Cursos aprenderaprogramar.com</h2></div>
<div id ="pulsador" onclick="testObjetos()"> Probar </div>
</body>
</html>

Hemos trasladado la ejecutoria a una función testObjetos para que se vea más clara la traza. Perdona las molestias, si te queda alguna duda consúltala.

Saludos!!

502
Ahora sí, cambiando la ruta ha funcionado.

Al igual que hice en el otro hilo, pongo la explicación de pasos a seguir para quien quiera probar el programa. El programa simula el envío o descarga de un fichero desde un servidor hasta un cliente. En este caso tanto el servidor como el cliente va a ser nuestro equipo, pero normalmente serían equipos remotos.

En la clase ClienteFicheros aparece la siguiente línea:

Path direccionDestino = (Paths.get("C:/Mantequilla.txt")).toAbsolutePath();

Es recomendable cambiar esta línea para que la ruta no sea directa a C:, por ejemplo dejarla así:

Path direccionDestino = (Paths.get("C:/Users/Krall/Desktop/pruebas/Mantequilla.txt")).toAbsolutePath();

Aquí tenemos que la ruta donde se va a descargar el fichero y el nombre que va a tener el fichero descargado (Mantequilla.txt), si queremos podemos cambiar la ruta y/o el nombre.

Para hacer una prueba, crear un fichero por ejemplo denominado prueba.txt y ubicarlo en el escritorio (o en otro lugar).

Para comenzar, ejecutar el método main de la clase ServidorDeFicheros. Es posible que salte una alerta de Firewall de Windows. En este caso elegir "Permitir acceso"

Por pantalla nos saldrá (ventana ServidorDeFicheros):

Servidor escuchando: ServerSocket[addr=0.0.0.0/0.0.0.0,localport=4444] 0.0.0.0/0.0.0.0

Abrir otro entorno de ejecución Java y ejecutar el método main de la clase ClienteFicheros

Por pantalla nos saldrá:

servidor conectado:NombreServer
Introduce comando válido:


Escribimos get "prueba.txt"

Con esto lo que hemos dicho es "busca el archivo prueba.txt dentro del servidor y descárgalo al cliente en la ruta C:/Users/Krall/Desktop/pruebas/Mantequilla.txt" (o aquella ruta que hayamos indicado).

En ese momento comienza la búsqueda del fichero prueba.txt dentro del servidor (esto puede tardar un par de minutos). No te desesperes, esto tarda un poco porque tiene que ir buscando en todas las carpetas del computador hasta encontrar el archivo.

En la ventana de ClienteFicheros obtendremos al cabo de un par de minutos:

servidor conectado:Krall
Introduce comando válido:
get "prueba.txt"
File downloaded (110 bytes read) at C:\Users\Krall\Desktop\pruebas\Mantequilla.txt
Introduce comando válido:



Aquí como comando introduciremos bye para desconectar y nos aparecerá "Sesión finalizada"

En la ventana de ServidorFicheros nos habrá quedado lo siguiente:

Servidor escuchando: ServerSocket[addr=0.0.0.0/0.0.0.0,localport=4444] 0.0.0.0/0.0.0.0
Buscando archivo solicitado en comando: get "prueba.txt"
Sending C:\Users\Mario R. Rancel\Desktop\prueba.txt(110 bytes)
Done.



Después de pulsar bye ya nos aparece:

Servidor escuchando: ServerSocket[addr=0.0.0.0/0.0.0.0,localport=4444] 0.0.0.0/0.0.0.0
Buscando archivo solicitado en comando: get "prueba.txt"
Sending C:\Users\Mario R. Rancel\Desktop\prueba.txt(110 bytes)
Done.
Buscando archivo solicitado en comando: bye
Finalizada la conexion con el cliente 1



Ahora en la ruta indicada podremos comprobar que se encuentra el fichero Mantequilla.txt (que es el fichero prueba.txt que se ha descargado al cliente con el nombre Mantequilla.txt).

Lorenzo, ¿puedes explicar para qué sirven las otras opciones?

lock "archivo.txt"   bloquea archivo solicitado
        get                 envia archivo bloqueado a c:/Mantequilla.txt
        put                  retorna con las modificaciones el archivo al original
unlock "archivo.txt"   desbloquea el archivo

Saludos!

503
Este diseño lo veo mucho mejor! Estas ideas de diseño es bueno que las apliques siempre que puedas pues así el código resulta de más calidad.

Saludos!

504
Hola arcanFAC, lo mejor es que pegues el código real de manera que podamos compilarlo y así ver mejor qué es lo que ocurre. En el caso de métodos declarados como static son métodos de clase, es decir, comunes a todos los objetos, un sólo método para todos los objetos, mientras que los métodos "normales" son métodos asociados a cada uno de los objetos. Saludos!

505
Hola iván, lo primero que debes hacer es crear el código de la clase. Cuando lo tengas pega el código como se explica en https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0

A partir del código, tendrás que implementar las pruebas unitarias.

Dentro de la clase introduce operaciones en métodos, por ejemplo:

public double multiplica (double a, double b) { ... }

Así introduce las operaciones de multiplicación, división, suma, resta, módulo, raíz cuadrada, potencia, valor absoluto, etc. Luego con jUnit se harán pruebas unitarias para validar que los métodos devuelven lo correcto.

Saludos!

506
Hola Lorenzo he intentado hacer la misma prueba que la otra vez pero me ha saltado un error, igual es que no he hecho lo que tenía que hacer. Te indico lo que he hecho:

Para hacer una prueba, he creado un fichero denominado prueba.txt y lo he ubicado en el escritorio.

Para comenzar, he ejecutado el método main de la clase ServidorDeFicheros.

Por pantalla ha salido:

Servidor escuchando: ServerSocket[addr=0.0.0.0/0.0.0.0,localport=4444] 0.0.0.0/0.0.0.0

He abierto otro entorno de ejecución Java y ejecutado el método main de la clase ClienteFicheros

Por pantalla me ha salido:

servidor conectado:Krall
Introduce comando válido:


He escrito get "prueba.txt"

En el terminal me ha salido Error en la transmisión.


En el otro terminal me ha salido

Servidor escuchando: ServerSocket[addr=0.0.0.0/0.0.0.0,localport=4444] 0.0.0.0/0.0.0.0
Buscando archivo solicitado en comando: get "prueba.txt"
Sending C:\Users\Krall\Desktop\prueba.txt(194 bytes)
Done.
Buscando archivo solicitado en comando: null


Y en la parte inferior:

Exception in thread "Thread-1" java.lang.NullPointerException
   at HiloPeticionCliente.procesarOrdenCliente(HiloPeticionCliente.java:65)
   at HiloPeticionCliente.run(HiloPeticionCliente.java:29)



El programa se ha quedado bloqueado y he tenido que detenerlo manualmente

No estoy seguro si he hecho algo mal o puede estar relacionado con permisos para escribir en C:, es decir, C: es un directorio que en muchos ordenadores tiene restricción de acceso porque en él hay contenido sensible y no se permite escribir directamente en este directorio

Saludos!

507
Hola Lorenzo!

Al igual que hice en el otro hilo repito lo mismo, se trata de una aportación valiosa porque se practica con muchos conceptos interesantes. Con tu permiso voy a trasladar el código que has creado para que esté visible dentro del hilo del foro y las personas que lo vean puedan hacerse una idea sobre el código sin tener que descargar el fichero como adjunto.


Clase ServidorDeFicheros

Código: [Seleccionar]
import java.io.*;
import java.net.*;

public class ServidorDeFicheros
{

    public static final int PORT = 4444;
    public static void main (String args[]) {
        int identificador = 1;
        ServerSocket servidor = null;
        Socket cliente = null;

        try{ servidor = new ServerSocket(PORT);
        }catch(IOException e){System.out.println("Error al conectar con el servidor"); System.exit(-1);}

        /* Se bloquea mientras escucha */
        System.out.println("Servidor escuchando: " + servidor + " " + servidor.getInetAddress());

        while(true){
            try { cliente = servidor.accept(); } catch (IOException e){ System.out.println("Error al conectar con cliente " + identificador); }
            new HiloPeticionCliente(cliente, identificador).start();
            identificador++;
        }

    }
}


Clase HiloPeticionCliente

Código: [Seleccionar]
import java.io.*;
import java.net.*;
import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.nio.channels.OverlappingFileLockException; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption;

public class HiloPeticionCliente extends Thread {
    Socket cliente;
    int identificador;
    BufferedReader entrada = null;
    //PrintWriter salida = null;
    OutputStream sendChannel = null;
    String cadena = ""; String comando = ""; String orden = "";  //Strings para recibir y gestionar la orden del usuario.
    boolean primerEspacio = false;
    //Variables para la gestión del bloqueo de archivo seleccionado
    boolean bloqueado = false;
    FileChannel channel; FileLock lock; File archivoBloqueado;
    RandomAccessFile accesoABloqueo;

    public HiloPeticionCliente (Socket cliente, int identificador){
        this.cliente = cliente; this.identificador = identificador; }

    public void run(){

        while(!cliente.isClosed()){
            leerOrdenCliente();

            System.out.println("Buscando archivo solicitado en comando: " + cadena);

            procesarOrdenCliente();

            switch(orden){  //coge la orden y la compara con las aceptadas por la máquina, el resto indica que no son correctas en el default mandando -1
                case "bye": System.out.println("Finalizada la conexion con el cliente " + identificador);
                try{ cliente.close();} catch(IOException e){}; interrupt(); break;

                case "get": getArchivo(); break;

                case "lock": lockArchivo(); break;

                case "put": putArchivoModificado(); break;

                case "unlock":  unlockArchivo(); break;

                default: try { sendChannel.write(-1); } catch (Exception e){}  comando = ""; orden = "";
            }

        }
    }

    /*lee la entrada del Cliente y devuelve String */
    private String leerOrdenCliente() {  try{   
            //Establece canal de entrada
            entrada = new BufferedReader (new InputStreamReader(cliente.getInputStream()));
            //Establece canal envio archivos
            sendChannel = cliente.getOutputStream();
            //lectura entrada usuario
            cadena = entrada.readLine();

        } catch(IOException e ) { System.out.println(e.getMessage()); }
        return cadena;
    }

    /*Traduce la entrada del cliente dividiendo la orden del fichero a tratar*/
    private void procesarOrdenCliente() { //comprueba si el comando introducido es mayor a 3 letras (get, put, bye) y si es así guarda hasta el primer espacio

        if(cadena.length() > 3){
            for (int x = 0; x < cadena.length(); x++){
                //guarda la orden hasta el espacio, get lock o unlock en el String orden
                if(cadena.substring(x, x+1).equals(" ") && !primerEspacio){ orden = cadena.substring(0, x); primerEspacio = true; }
                // elimina espacios y comillas de la orden recibida y los guarda en comando
                if(!cadena.substring(x, x+1).equals(" ") && !cadena.substring(x, x+1).equals("\"")){ comando = comando + cadena.substring(x, x+1); }//final for
            }
            primerEspacio = false; //al salir del bucle for , iniciamos el boolean primer espacio a false para la proxima entrada.
        } else orden = cadena;  }

    /*Busca el archivo de la orden get */
    private void getArchivo(){ //crea instancia de clase buscar archivo y invoca a la funcion buscador para encontrar el archivo solicitado

        if(!bloqueado){   //si no está bloqueado significa que es un get archivo normal
            if(comando.length() > 3){ //comando debe contener get y además el archivo a buscar, más de 3 caracteres.
                File archivoEncontrado = buscarArchivo();
                if(archivoEncontrado != null){
                    new HiloEnvio (cliente, archivoEncontrado).start();  } else { try { sendChannel.write(-1); } catch (Exception e){} }
                comando = ""; orden = ""; } else try { sendChannel.write(-1); } catch (Exception e){}

        }else {
            try{
                Path archivoModificado = Paths.get("C:/Mantequilla.txt");
                try{
                    desbloquearCanal(); //desbloqueo del archivo bloqueado

                    byte[] contenedor = Files.readAllBytes(archivoBloqueado.toPath());
                    Files.write(archivoModificado, contenedor, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING); 

                    try{ sleep(1000); }catch (InterruptedException e) { e.printStackTrace(); }
                    lock = channel.lock();
                }catch (IOException e){  }

            }catch(Exception e){};
            cambioRealizado();  }
    }           

    /*Put sobreescribir archivo con archivo modificado*/
    private void putArchivoModificado(){
        if (bloqueado){
            Path archivoModificado = Paths.get("C:/Mantequilla.txt");

            try{
                desbloquearCanal(); //desbloqueo del archivo bloqueado

                byte[] arrayBytes = Files.readAllBytes(archivoModificado); //pasamos el contenido del archivo modificado a un array de bytes
                // Escritura en el archivoBloqueado
                Files.write(archivoBloqueado.toPath(), arrayBytes, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING); 
                try{ sleep(1000); }catch (InterruptedException e) { e.printStackTrace(); }

                lock = channel.lock();
            }catch (IOException e){  }

            cambioRealizado();

        } else { try { sendChannel.write(-1); } catch (Exception e){}  }
    }

    /*Desbloquear archivo */
    private void unlockArchivo(){ if(bloqueado){try {
                try {  lock = channel.tryLock(); }catch (IOException ioe){}
            } catch (OverlappingFileLockException e) {  try { lock.release();   channel.close(); }catch (IOException ioe2){} }
            archivoBloqueado = null; bloqueado = false; System.out.println("Archivo desbloquado");
            cambioRealizado();
        }else try { sendChannel.write(-1); } catch (Exception e){}
    }

    /*Busqueda y bloqueo de archivo con comando LOCK*/
    private void lockArchivo(){
        if(!bloqueado){ BuscadorArchivo find = new BuscadorArchivo();
            archivoBloqueado = find.buscador(comando.substring(orden.length(), comando.length() ), new File("C:\\"));
            if(archivoBloqueado != null) {
                try{   
                    accesoABloqueo = new RandomAccessFile(archivoBloqueado, "rws"); //aqui podemos acceder al archivo para leer y escribir en el
                    channel = accesoABloqueo.getChannel();
                    lock = channel.lock(); }catch (IOException e){}
                bloqueado = true; System.out.println("Archivo bloqueado."); cambioRealizado();  }
            else{ try { sendChannel.write(-1); } catch (Exception e){} }
        }
    }

    private File buscarArchivo(){
        BuscadorArchivo find = new BuscadorArchivo();
        return find.buscador(comando.substring(orden.length(), comando.length() ), new File("C:\\"));  }

    /*Orden Realizada correctamente*/
    private void cambioRealizado(){
        comando = ""; orden = "";
        String textoEnvio = "Done.";
        byte[] arrayBytes = textoEnvio.getBytes();
        try{ sendChannel.write(arrayBytes);  } catch (IOException e) { System.out.println(e); }
    }

    void desbloquearCanal(){ try{ lock.release(); }catch(IOException e ){} }
}

Clase HiloEnvio

Código: [Seleccionar]
import java.net.*;
import java.io.*;
/**
 * Clase HiloEnvio extiende de Thread y es la encargada de recibir el archivo encontrado y el canal con el cliente, que utiliza para enviar el archivo a destino
 *
 * @author Lorenzo31
 * @version (a version number or a date)
 */
public class HiloEnvio extends Thread
{
    private File archivo;
    private Socket socketCliente = null;
    private FileInputStream fileChannel = null;
    private BufferedInputStream lectorArchivo = null;
    private BufferedOutputStream sendChannel = null;

    public HiloEnvio(Socket socketCliente, File archivo){ this.socketCliente = socketCliente; this.archivo = archivo;}
    public void run() {
        // send file
        try{

            byte [] mybytearray = new byte [(int)archivo.length()];

            fileChannel = new FileInputStream(archivo);
            lectorArchivo = new BufferedInputStream(fileChannel);
            lectorArchivo.read(mybytearray,0,mybytearray.length);
            sendChannel = new BufferedOutputStream(socketCliente.getOutputStream());
            System.out.println("Sending " + archivo + "(" + mybytearray.length + " bytes)");
            //envio archivo
            sendChannel.write(mybytearray,0,mybytearray.length);
            sendChannel.flush();

            System.out.println("Done.");
        }catch (IOException | NullPointerException e) { System.out.println("Interrumpido. ");
            interrupt();
        }
    }
}

Clase BuscadorArchivo

Código: [Seleccionar]
import java.io.*;
import java.net.*;

public class BuscadorArchivo {
    File archivoEncontrado = null;
    boolean encontrado;

    public BuscadorArchivo()  { this.encontrado = false; /*siempre que se llama al buscador reinicia a false el boolean */ }

    public File buscador(String nombre, File raiz){
        if(!encontrado){ //si no esta encontrado entra en el for para buscar
            File[] lista = raiz.listFiles();

            if(lista != null) {
                for(File elemento : lista) {
                    if (elemento.isDirectory())  {
                        buscador(nombre, elemento);
                    } else if (nombre.equalsIgnoreCase(elemento.getName()))
                    {
                        archivoEncontrado = elemento;
                        encontrado = true;   
                    }
                }
            }
        } else { return archivoEncontrado; }   

        return archivoEncontrado;
    } //cierre buscador
}


Clase ClienteFicheros

Código: [Seleccionar]
import java.io.*;
import java.net.*;
import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths;
import java.nio.channels.FileChannel;

public class ClienteFicheros
{
    public static void main(String[] args) throws IOException {

        int bytesRead;

        BufferedOutputStream bos = null;
        Socket socketCliente = null;

        PrintWriter salida = null;

        String hostName = InetAddress.getLocalHost().getHostName();
        /* Creamos un socket en el lado cliente, enlazado con un servidor que está en la misma máquina
        que el cliente y que escucha en el puerto 4444 */

        try{ socketCliente = new Socket(hostName, 4444);
            System.out.println("servidor conectado:" + hostName);

            //Obtenemos el canal de salida
            salida = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socketCliente.getOutputStream())),true);
        }catch(IOException e){
            System.err.println("No puede establecer conexion");
            System.exit(-1); }

        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

        String linea = "";

        /*El programa cliente no analiza los mensajes enviados por el usuario, simplemente los
         * reenvia al servidor hasta que este se despide con Adios*/
        while(!linea.equalsIgnoreCase("bye")){   

            do{
                System.out.println("Introduce comando válido:");
                //Leo la entrada del usuario
                linea = stdIn.readLine();

                //parámetros permitidos en la introducción de datos del usuario: lock unlock get put get "archivo"
            }while (!linea.matches("[a-z][a-z][a-z] \".*\"") && !linea.matches("[a-z][a-z][a-z]") && !linea.matches("[l][o][c][k] \".*\"")
            && !linea.matches("[u][n][l][o][c][k] \".*\""));
            //La envia al servidor
            salida.println(linea);

            if(!linea.equalsIgnoreCase("bye")){
                OutputStream fos = null;
                try {
                    //reciibr archivo
                    //Creamos array de bytes

                    byte [] mybytearray  = new byte [1000000];
                    //Creamos objeto InputStream que abre la cadena de entrada para lectura del fichero que mande servidor
                    BufferedInputStream cadenaReceptor = new BufferedInputStream (socketCliente.getInputStream());
                    bytesRead = cadenaReceptor.read(mybytearray,0,mybytearray.length);
                    //}
                    //Si al ejecutar la orden el servidor no reenvia ningun fichero ni un texto vacio, por error de sintaxis ,
                    //manda un "Done." y el valor de bytesRead es 0 para identificarlo
                    //BufferedReader comprobar = new BufferedReader( new InputStreamReader(cadenaReceptor));

                    switch(bytesRead){
                        case 1:   //1 valor que toma como mínimo un archivo Outputstream, significa archivo no encontrado o no buscado

                        System.out.println("Archivo no encontrado o comando erroneo"); break;

                        case -1: //-1 valor que toma al no recibir ningun archivo erroneo ni correcto, solo con BYE

                        System.out.println("Sesion finalizada"); break;

                        case 5:  //0 indica orden realizada correctamente

                        System.out.println("Done."); break;

                        default:
                        Path direccionDestino = (Paths.get("C:/Mantequilla.txt")).toAbsolutePath();

                        File file = new File(direccionDestino.toString());
                        fos = new FileOutputStream(file); 

                       
                        bos = new BufferedOutputStream(fos);
                        bos.write(mybytearray, 0 , bytesRead);
                        bos.flush();
                        fos.close();
                        System.out.println("File downloaded (" + bytesRead + " bytes read) at " + direccionDestino.toString() ); 

                    } //end switch
                }catch(IOException e){ System.out.println("Error en la transmisión.");
                    if (fos != null) fos.close();
                    if (bos != null) bos.close();
                    if (socketCliente != null) socketCliente.close(); }
            }
        }
        System.out.println("Sesión finalizada.");

        // if (fos != null) fos.close();
        if (bos != null) bos.close();
        if (socketCliente != null) socketCliente.close();

    }
}

508
Hola Javiererg!

Te doy una orientación:

- En el ejercicio no se pide definir el constructor ni los atributos de la clase. Estos atributos no están bien definidos, pero no voy a comentar sobre esto ya que más adelante en el curso se harán ejercicios con constructores para entender bien este concepto.

Citar
Obtener la duración de una canción expresada como un número decimal en minutos (por ejemplo podría ser 3,22 minutos) recibiendo como dato el número de canción dentro del disco.

El enunciado te dice que el método recibe un dato, pero tú has puesto que el método recibe dos datos que son (double valorDuracion, valorNoCancion) por tanto no lo tienes bien resuelto.


Citar
Pedir a un administrador de una compañía discográfica que introduzca la duración de todas las canciones (dichas duraciones se almacenarán como información del objeto). Es decir, el método se encargará de saludar al usuario y pedirle que vaya introduciendo una por una la duración de las canciones.

Si es un procedimiento el método no devuelve nada y debe indicarse con void, tú has indicado String, por lo que no está bien resuelto.

Citar
Obtener la duración del disco completo (suma de las duraciones de cada una de las canciones).

Estamos suponiendo que la clase define unos atributos para los objetos. Es decir, cada objeto tendrá una información propia (sus atributos) con la que podremos trabajar. En un objeto DiscoMusical se supone que tendremos como atributo una lista de canciones y la duración de cada canción. Para obtener la duración total del disco simplemente tendremos que acceder a la información contenida en el propio objeto, sin necesidad de pasarle ningún parámetro. Tú has definido double obtenerDuraciontotal (double valorDurtotal) ¿Qué información es la que le enviarías como valorDurtotal?

Citar
Añadir una canción al disco recibiendo como información para ello el título de la canción y su duración (se añadirá como última canción en el disco. Si el disco tenía por ejemplo 10 canciones, al añadirse una canción pasará a tener 11).

Aquí tienes el mismo problema que antes. Este método no se espera que devuelva nada, y esto se indica con la palabra clave void, sin embargo tú has indicado que devuelve un String ¿Para qué devuelve un String?

Fíjate en la solución que se da en el hilo https://www.aprenderaprogramar.com/foros/index.php?topic=956.0 si te quedan dudas consulta, aquí estamos para aprender!

Saludos!

509
Hola Pedro!

El ejercicio cumple con lo solicitado. Pienso que podría mejorarse el diseño de la siguiente manera:

- Definir una función denominada pedirCincoNumeros que no reciba parámetros y devuelva un array con cinco números

- Definir una función multiplicaPorCinco que reciba un array y devuelva un array con cada uno de los números del array recibidos multiplicado por cinco

- Definir una función mostrarResultados que reciba un String y un nodo, y muestre el texto en el nodo deseado por pantalla.

- Definir una función gestionProceso que se encargue de iniciar el proceso e ir invocando las funciones adecuadas para conseguir el objetivo previsto.

En definitiva se trataría de crear funciones donde cada una tiene un cometido específico, no funciones donde se hace "de todo un poco".

En este código usas var nodoDiv = document.getElementsByTagName('div'); con lo cual tienes que acceder al nodo con nodoDiv[0] para acceder al primer div. Esto en programación en general lo usaremos poco porque en el desarrollo de código será frecuente cambiar la estructura y añadir o eliminar div, con lo cual los índices podrían cambiar. Por eso será más frecuente establecer un id para el div que queremos modificar y como el id es único, aunque introduzcamos o eliminemos div el código seguiría funcionando (siempre que no eliminemos el id que nos sirve de referencia).

Saludos!

510
Hola Pedro!

Has indicado que hay otras formas de hacerlo, pero tal y como lo has hecho está muy bien conforme a la progresión que se debe llevar sin introducir cosas más avanzadas que no se hayan visto.

Una curiosidad que resulta interesante que acabo de probar es que podemos sustutuir varias líneas de asignación de estilos por una sola línea, con lo que nos ahorramos repetir líneas muy parecidas.

Me refiero a esto, inicialmente:
Código: [Seleccionar]
listaNodosOperadores[i].style.backgroundColor = 'yellow';
listaNodosOperadores[i].style.color = 'black';
listaNodosOperadores[i].style.border = 'solid 1px';

Lo podemos sustituir por:
Código: [Seleccionar]
listaNodosOperadores[i].style = 'background-color:yellow; color:black; border: solid 1px;';

Hay que tener cuidado porque con esto sustituimos todo el estilo, mientras que yendo propiedad a propiedad sólo modificamos aquello que se indica, pero nos puede ser útil en muchas ocasiones

Saludos!

511
Hola RUSO GD!

En el formulario tienes mal puestas las unidades de diámetro y altura.

Debe poner: INTRODUZCA EL DIAMETRO EN METROS: y no  en litros/minuto

INTRODUZCA LA ALTURA EN METROS: y no en litros/minuto

Una vez se tiene el diámetro y la altura del cilindro en metros, el volumen del cilindro se calcula como Pi*(R^2)*H donde R es el radio que es la mitad del diámtro.

Ese volumen está expresado en metros cúbicos. Sabiendo que 1 m3 son 1000 litros, calculamos los litros multiplicando el volumen en metros cúbicos por 1000.

Finalmente calculamos el tiempo que tarda en llenarse dividiendo el volumen en litros por el caudal que entra en litros/minuto, obteniendo los minutos que tarda en llenarse.

Saludos!

512
Hola RUSO GD ¿puedes pegar el código como ha quedado? Así puede servir de ayuda a otras personas

Saludos!

513
Hola Bruno, siempre los libros pueden ser útiles. Nosotros recomendamos lo siguiente:

-  Curso Bases de la programación nivel I para adquirir fundamentos de programación comunes a todos los lenguajes: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=28&Itemid=59

- Curso C si se quiere aprender C (este curso complementa al anterior): http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=82&Itemid=210

- Curso java si se quiere aprender java (este curso complementa a los anteriores): http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

Para orientarse personas que están comenzando con la programación leer https://www.aprenderaprogramar.com/foros/index.php?topic=1313.0

Saludos!

514
¿Puedes pegar el código como ha quedado? De esa forma le puede servir de ayuda a otras personas.

Saludos!

515
Hola, hay varias maneras de hacerlo. Si puedes añadir un botón enviar, simplemente tienes que usar la función mail de php para enviar el texto o código html correspondiente. Si necesitas pedir una dirección de correo electrónico donde deba enviarse puedes añadir un paso previo en el que pidas la dirección de correo electrónico, y esto puedes hacerlo usando JavaScript. Si además de la dirección necesitas otros campos como tema del correo, remitente, etc. puedes hacerlo creando un popup tanto con javascript como con php.

Referencia JavaScript: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=78&Itemid=206

Saludos!

516
Hola, debes especificar el lenguaje con que quieres crear el programa. También debes intentar crear el código hasta donde puedas llegar y pegar el código, según se explica en https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0

Para que tengas una orientación de cómo se programa un juego de cartas te dejo este ejemplo en C

El juego de cartas de las siete y media consiste en ir pidiendo cartas intentando sumar 7.5 puntos sin pasarse. Gana el jugador que más se acerca a 7.5. Se utiliza una baraja española. Sota, caballo y rey valen medio punto. Las demás cartas puntúan según su valor numérico (de 1 a 7).

Código fuente:

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include <conio.h>   // Función getch (no estándar: específica del compilador de Borland)


/* Baraja de cartas */
/* ---------------- */

#define PALOS    4
#define NUMEROS 10
#define CARTAS  (NUMEROS*PALOS)

typedef enum Palo {
    Oros,
    Copas,
    Espadas,
    Bastos
} Palo;

typedef struct Carta {
    Palo palo;
    int  numero;
} Carta;

typedef Carta Baraja[CARTAS];

/* Inicializar la baraja */

void inicializarBaraja (Baraja baraja)
{
    int i,j;

    for (i=0; i<PALOS; i++) {
        for (j=0; j<NUMEROS; j++) {
            baraja[NUMEROS*i+j].palo   = i;
            baraja[NUMEROS*i+j].numero = j;
        }
    }
}

/* Intercambiar dos cartas */

void intercambiar (Carta *c1, Carta *c2)
{
    Carta aux;

    aux = *c1;
    *c1 = *c2;
    *c2 = aux;
}

/* Barajar (mezclar de forma aleatoria las cartas de la baraja) */

void barajar (Baraja baraja)
{
  int cambios;
  int i,c1,c2;

  // Inicializar el generador de números aleatorios

  srand(time(NULL));

  // Número de intercambios de cartas (de 1 a 2000)

  cambios = 20 + (rand() % 1000);

  // Intercambiar cartas

  for (i=0; i<cambios; i++) {

      c1 = rand() % CARTAS;
      c2 = rand() % CARTAS;

      intercambiar( &(baraja[c1]), &(baraja[c2]) );
  }

}

/* Muestra en pantalla el valor de una carta */

void mostrarCarta (Carta carta)
{
    char palo[10];
    char numero[10];

    // Palo

    switch (carta.palo) {

      case Oros:
           strcpy (palo,"oros");
           break;

      case Copas:
           strcpy (palo,"copas");
           break;

      case Espadas:
           strcpy (palo,"espadas");
           break;

      case Bastos:
           strcpy (palo,"bastos");
           break;
    }

    // Número

    if (carta.numero<7) {

       sprintf (numero, "%d", carta.numero+1);

    } else if ( carta.numero == 7 ) {

        strcpy(numero,"Sota");

    } else if ( carta.numero == 8 ) {

        strcpy(numero,"Caballo");

    } else { // if ( carta.numero == 9 )

        strcpy(numero,"Rey");
    }

    // Salida

    printf("%s de %s\n", numero, palo);
}


/* Muestra en pantalla una baraja */

void mostrarBaraja (Baraja baraja)
{
    int i;

    for (i=0; i<CARTAS; i++)
        mostrarCarta(baraja[i]);
}

/* Rutinas de E/S */
/* -------------- */

/* Pregunta al usuario del tipo SÍ/NO */

int preguntar (char *mensaje)
{
    char c;

    do {
        printf("%s (s/n)\n",mensaje);
        c = getch();

    } while ((c!='s') && (c!='S') && (c!='n') && (c!='N'));

    if ((c=='s') || (c=='S'))
        return 1;
    else
        return 0;
}

/* Mensaje */

void mensaje (char *mensaje)
{
    printf("%s\n",mensaje);
}

/* Juego de las siete y media */
/* -------------------------- */

/* Devuelve el valor de una carta en el juego */

float puntos (Carta carta)
{
    if (carta.numero<7)
        return carta.numero + 1;
    else
        return 0.5;
}

/* Decide si el ordenador sigue jugando */

int pide_otra_carta (float mis_puntos, float tus_puntos)
{
  return (tus_puntos<=7.5) && ( (mis_puntos<tus_puntos) || (mis_puntos<5) );
}

/* Nos dice si el jugador gana la partida */

int gana_jugador (float puntos_jugador, float puntos_ordenador)
{
    return (puntos_jugador<=7.5) && ((puntos_jugador>puntos_ordenador) || (puntos_ordenador>7.5));
}

/* Da una carta y devuelve su valor */

float dar_carta (Baraja baraja, int *carta_actual, char *jugador)
{
    float valor = puntos ( baraja[*carta_actual] );

    printf("Carta para %s: ", jugador);
    mostrarCarta(baraja[*carta_actual]);
    (*carta_actual)++;

    return valor;
}

/* Partida */

void juego (Baraja baraja)
{
    int   carta_actual;
    float puntos_jugador, puntos_ordenador;  // Puntos
    int   jugador_sigue, ordenador_sigue;    // ¿seguir jugando?

    carta_actual = 0;
    puntos_jugador = 0;
    puntos_ordenador = 0;

    jugador_sigue = 1;
    ordenador_sigue = 1;

    do {

        // Carta para el jugador

        if (jugador_sigue) {

            // NOTA: Se podría ofrecer una recomendación llamando a
            //       pide_otra_carta(puntos_jugador,puntos_ordenador);


            if (preguntar("¿Quiere una carta?")) {

                puntos_jugador += dar_carta(baraja, &carta_actual, "el jugador");

                if (puntos_jugador>7.5) {
                    mensaje("Te has pasado !!!");
                    jugador_sigue = 0;
                }

            } else {
                jugador_sigue = 0;
            }

        }

        // Carta para el ordenador

        if (ordenador_sigue) {

            // Estrategia del ordenador
            // NOTA: No vale mirar la baraja

            if ( pide_otra_carta(puntos_ordenador, puntos_jugador) ) {

                puntos_ordenador += dar_carta(baraja, &carta_actual, "el ordenador");

                if (puntos_ordenador>7.5) {
                    mensaje("El ordenador se ha pasado");
                    ordenador_sigue = 0;
                }

            } else {

                mensaje("El ordenador se planta");
                ordenador_sigue = 0;
            }
        }

        printf("- Jugador: %.1f puntos\n", puntos_jugador);
        printf("- Ordenador: %.1f puntos\n", puntos_ordenador);

    } while (jugador_sigue || ordenador_sigue);

    // Resultado de la partida

    if ( gana_jugador(puntos_jugador,puntos_ordenador) )
        mensaje("\nEnhorabuena, ha ganado la partida !!!\n");
    else
        mensaje("\nOtra vez será...\n");



}


/* Programa principal */
/* ------------------ */


int main (void)
{
    Baraja baraja;

    inicializarBaraja(baraja);
    //mostrarBaraja(baraja);

    do {

        barajar(baraja);
        //mostrarBaraja(baraja);
        juego(baraja);

    } while ( preguntar("¿Desea jugar otra partida?") );
   
    return 0;
}

Saludos!

517
Hola! He intentado ejecutar tu código pero en esta parte salta un error

void recorrerymostrar(nodo*lista){
nodo*seg=lista;
while(seg!=NULL){
    mostrarlista(seg);
    seg=seg->siguiente;

}}

El error lo que indica es que la función mostrarlista() no está definida

¿Tienes definida esa función? ¿No has pegado todo el código?

Saludos!

518
Hola parece que tienes un fallo en esta línea

$tminutos=Vlitros/$caudal;

Te falta el dólar antes del nombre de la variable

$tminutos=$Vlitros/$caudal;

Saludos!

519
Comunidad / Re:Presentación
« en: 05 de Octubre 2015, 13:06 »
Hola anmaroso y bienvenido a los foros. Respeto y paciencia son pilares básicos en estos foros así que esperamos que te encuentres a gusto en ellos. Aquí tienes un tutorial que te puede resultar de interés: https://www.aprenderaprogramar.com/index.php?option=com_content&view=category&id=37&Itemid=61

Si tienes interés en cursos tutorizados aquí tienes información: https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=64&Itemid=87

Saludos!

520
Hola errores similares se comentan en hilos del foro como este: https://www.aprenderaprogramar.com/foros/index.php?topic=2737 Mira con el buscador del foro, puede que encuentres algunas referencias.

Saludos!

Páginas: 1 ... 21 22 23 24 25 [26] 27 28 29 30 31 ... 68

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".