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 - Alex Rodríguez

Páginas: 1 ... 71 72 73 74 75 [76] 77 78 79 80 81 ... 93
1501
El código es en general correcto pero algunas cosas merecen ser comentadas:

NO CORRECTO

    public String getSalon () {
        return "Salón tipo " + salonCasa.getTipoSalon() + ", con " +
        salonCasa.getNumeroDeTelevisores() + " televisor/es.";
    }

Se haría como:

    public Salon getSalon () {
        return salonCasa;
    }

Un método get devuelve un atributo. En este caso si el atributo es un objeto, debemos devolver un objeto. Aunque al principio cuesta, hay que habituarse a trabajar con objetos  ::)

Lo mismo podemos decir de getCocina ()


CORRECTO PERO NO IDÓNEO

En lugar de (modo 1):

    public void setSalon ( int numeroTV, String valorTipoSalon ) {
        salonCasa.setNumeroDeTelevisores ( numeroTV );
        salonCasa.setTipoSalon ( valorTipoSalon );
    }

Podríamos pensar en (modo 2):

    public void setSalon ( Salon valorSalon ) {
        salonCasa = new Salon();
        salonCasa.setNumeroDeTelevisores(valorSalon.getNumeroDeTelevisores());
        salonCasa.setTipoSalon(valorSalon.getTipoSalon());
    }

Ambas formas son posibles, y quizás debieras volver a revisar esto un poco más adelante (es decir, no le des ahora muchas vueltas porque más adelante lo verás más claro). La idea del modo 2 es copiar el objeto que se recibe para no inmiscuirnos en tareas que son propias de la clase Salon.

Con el modo 1 la clase Casa se estaría haciendo responsable de inicializar un objeto Salon, al crearlo con new y establecer sus atributos con setSalon. La responsabilidad de inicializar un Salon es (preferentemente) de la clase Salon y una clase no debe inmiscuirse en las tareas propias de otra clase (al menos en la medida de lo posible).

Como te digo no le des muchas vueltas, retén la idea para más adelante...


1502
Aprender a programar desde cero / Re:Ejercicio CU00619B
« en: 18 de Junio 2014, 17:22 »
Primero tendrías que hacer la captura o tener la imagen y guardarla como archivo jpg ó png. Luego tendrías que alojar las imágenes en un servidor de modo que las imágenes estén disponibles a través de internet. Si no tienes un servidor o si lo prefieres puedes abrirte una cuenta en un servicio de alojamiento de imágenes gratuitas como photo bucket.com, flickr.com,  imgur.com ó similar. Aquí más información: http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=212:ahorrar-espacio-en-servidor-con-servicios-web-de-alojamiento-de-imagenes-gratuitos&catid=60:servicios-web-gratuitos&Itemid=182

El problema de estos servicios es que si algún día cierran perderás las imágenes alojadas ahí.

Una vez subes la imagen al servidor, tienes que capturar la ruta de la imagen que has subido, y esa ruta es la que utilizarás para insertar la imagen en páginas web o foros.

1503
Aprender a programar desde cero / Re:Ejercicio CU00619B
« en: 18 de Junio 2014, 11:39 »
Hola toni, te indico cómo insertar imágenes.

Escribe el texto y luego pulsa enter.

En la nueva línea pulsa el icono de insertar imagen del editor del foro y te aparecerán las etiquetas [ im g ] ,,, [ /im g]

Entre esas dos etiquetas escribe la ruta, por ejemplo:

[im g ] http: //www.a prenderaprogramar.com/images/thumbs_portada/thumbs_libros/24_programador_en_su_soledad.jpg [ /im g]

Finalmente para centrar la imagen selecciona todo lo anterior y pulsa sobre el icono del editor "Centrado" con lo que quedará algo así:


[cente r][i mg]ht tp: //www.ap render aprogramar.com/images/thumbs_portada/thumbs_libros/24_programador_en _su_soledad.jpg[/i mg][/ce nter]

(Todo es sin espacios, los he puesto para poder escribirlo). Tienes que tener cuidado con el tamaño de la imagen si es demasiado grande no se verá bien, como máximo puede tener unos 600 px de ancho


Saludos  :D

1504
Aprender a programar desde cero / Re:Ejercicio CU00619B
« en: 17 de Junio 2014, 17:30 »
Hola, la definición de Toni es correcta pero al mismo tiempo Rabih tiene razón. El enunciado del ejercicio dice lo siguiente:

Considera que queremos representar mediante un programa Java los aviones que operan en un aeropuerto. Crea un esquema análogo al que hemos visto para vehículos, pero en este caso para aviones. Define cuáles podrían ser las clases y cuáles podrían ser algunos objetos de una clase. Para comprobar la corrección de tu solución puedes consultar en los foros aprenderaprogramar.com.

Por tanto una respuesta al ejercicio, siguiendo la propuesta de Rabih, podría ser la siguiente:

Superclases: Avion

Clases:

- AvionDeCarga

- AvionDeTransporte

-AvionDeCaza

-AvionBombardero

-AvionDePasajeros

Ejemplo que podríamos dar de objetos dentro de la clase AvionDePasajeros:

Avion id7343
Avion id8722
Avion id8761



1505
En este ejercicio está todo ok. Como detalle indicar que será más habitual en el constructor tener este código:

Código: [Seleccionar]
    public Medico()
    {
        nombre = "";
        apellidos = "";
        edad = 0;
        casado = false;
        numeroDNI = "";
        especialidad = "";
    }

Normalmente en los constructores los atributos se inicializan a cadena vacía para los String, 0 para los numéricos y false para los booleanos.

Saludos

1506
Aprender a programar desde cero / Re:Ejercicio CU00630B
« en: 16 de Junio 2014, 14:03 »
Hola, está bien respondido. Como observaciones las posibles mejoras en CU00630 serían:

Usar: 2 Procedimiento saludaAndSolicitaCancionesConSuDuracion ( )

en vez de: 2 Procedimiento saludaAndSolicitaDiezCancionesConSuDuracion ( )

Motivo: el disco no tiene por qué tener diez canciones necesariamente.


usar: Procedimiento añadeNuevaCancion ( String tituloNuevaCancion, float minutosNuevaCancion )

en vez de: Procedimiento añadeNuevaCancion ( int numeroNuevaCancion, String tituloNuevaCancion, float minutosNuevaCancion )

Motivo: el enunciado indica que la nueva canción se añadirá como última canción. La clase guarda información de cuántas canciones tiene, con lo cual no es necesario indicarle el número, simplemente la colocará en última posición.

Saludos

1507
No estoy seguro de que estés manejando correctamente el JTree. Si quieres establecer una dependencia jerárquica, tienes que crear un nodo y luego añadir el nodo hijo al nodo creado. Por ejemplo si la raíz es directorio, creas directorio, luego a directorio le añades general, a general le añades administrativo, a administrativo le añades contabilidad y así sucesivamente. Si añades todos los hijos al nodo raíz, todos los hijos estarán al mismo nivel y no tendrás la jerarquía.

Ejemplo creación de dependencias y jerarquía:

Código: [Seleccionar]
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;

public class TreeEjemplo extends JFrame
{
    private JTree tree;
    public TreeEjemplo()
    {
        //create the root node
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Directorio");
        //create the child nodes
        DefaultMutableTreeNode aNode = new DefaultMutableTreeNode("General");
        DefaultMutableTreeNode bNode = new DefaultMutableTreeNode("Administrativo");
        DefaultMutableTreeNode cNode = new DefaultMutableTreeNode("Contabilidad");

        //add the child nodes to the root node
        root.add(aNode);
        aNode.add(bNode);
        bNode.add(cNode);

        //create the tree by passing in the root node
        tree = new JTree(root);
        add(tree);

        for (int i = 0; i < tree.getRowCount(); i++) {
         tree.expandRow(i);
}
       
        this.setSize(200,330);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("JTree Example");       
        //this.pack();
        this.setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new TreeEjemplo();
                }
            });
    }       
}

1508
Tienes que tener cuidado con la lógica que utilizas y con los índices, contadores y acumuladores que utilizas.

He reestructurado el código (te lo pego a continuación) y a mí me está funcionando, pruébalo a ver si te funciona.

Código: [Seleccionar]
#include<iostream>
#include<sstream>
#include<string>
using namespace std;

int main() {
//string diccionario[]={"casa", "perro", "carro", "computadora", "cabana", "coche", "mer", "sfefef"};
    string diccionario[]= {"casa", "perro", "carro"};
    int contador = 0;
    int vec[27] = {0};
    int acum1=0;

    for(char a='a'; a<='z'; a++) {
        cout<<"LETRA ANALIZANDO: "<<a<<endl;
        for(int b=0; b<3; b++) {
            acum1=0;
            cout<<"Palabra analizando: "<<diccionario[b]<<endl;
            for(int c=0; c<diccionario[b].length(); c++) {
                if(diccionario[b][c]==a) {
                    acum1++;
                }
            }
            vec[contador]=vec[contador]+acum1;
            cout<<"Encontrada la letra: "<<acum1<<" veces en la palabra"<<endl;
        }
        cout<<"Encontrada la letra: "<<vec[contador]<<" veces en todas las palabras "<<endl;
        contador = contador+1;
    }
    for(int i=0; i<27; i++)
        cout<<vec[i]<<endl;

//system("pause");
    return 0;
}

Se usa un único acumulador: acum1, que va contando las veces que aparece una letra en todas las palabras y finalmente se guarda el número de apariciones en el vector vec.

Saludos.

1509
Lo que se va a ejecutar cuando se envíe el formulario depende del contenido del archivo search.php que es al que apunta el action del formulario.

La función getResults devuelve algo, con la sentencia return $res;

En cambio la función filtrarBusqueda no devuelve nada, esto puede ser (parece ser) un error, aunque tampoco tiene obligatoriamente que serlo. Habría que estudiarlo para ver en su conjunto qué es lo que se ejecuta y cómo  influye cada función en el resultado.

1510
Sigo sin entender en qué se basa ese ajuste de la heurística.

No digo que sea obligado resolverlo recursivamente, lo que sí es verdad es que en los cursos de algoritmia suele ponerse como ejemplo de ejercicio de recursividad y estrategia de backtracking, pero como en casi todos los problemas hay distintas vías para resolverlo. Incluso es posible que se pueda resolver con una estrategia similar a la planteada, habría que estudiarlo en profundidad.

1511
He intentado describir lo que he visto, pero si tuviera que decirlo en una frase sería: el programa no coloca las 8 reinas porque después de colocar unas cuantas reinas ya no puede colocar más porque no le quedan casillas sin atacar, y el motivo para ello es que la lógica que trata de aplicar no es válida.

Saludos.

1512
Para ver que el algoritmo propuesto no sería correcto podríamos analizar qué ocurriría con 4 reinas.

Considera el problema de 4 reinas. El tablero tendría este aspecto:

x x x x
x x x x
x x x x
x x x x

Y el valor heurístico de las casillas tendría este aspecto:

10 10 10 10
10 12 12 10
10 12 12 10
10 10 10 10

Colocamos la primera reina según el algoritmo propuesto:

R  XX XX XX
XX XX 12 10
XX 12 XX 10
XX 10 10 XX

Colocamos la segunda reina según el algoritmo propuesto:

R  XX XX XX
XX XX 12 R
XX 12 XX XX
XX XX 10 XX

Colocamos la tercera reina según el algoritmo propuesto:

R  XX XX XX
XX XX 12 R
XX XX XX XX
XX XX R  XX

Aquí hemos llegado a la situación de que el problema ha ido colocando las reinas según el algoritmo propuesto pero ya no puede colocar la cuarta reina porque todas las casillas están atacadas.

Sin embargo el problema sí tiene solución:

x x R x
R x x x
x x x R
x R x x

Y además más de una solución. Por ejemplo esta es otra:

x R x x
x x x R
R x x x
x x R x

(Esta solución y otras pueden considerarse simetrías. En este caso puede considerarse la visión en espejo de la anterior solución)

Aquí vemos que hay otro factor que resulta importante: si colocamos la primera reina en la primera posición, estamos eligiendo una casilla que amenaza a pocas casillas, pero a su vez estamos eliminando muchas casillas que son prometedoras debido a que quedan atacadas por esa reina.

En resumen:

El algoritmo propuesto está tratando de aplicar una estrategia voraz para resolver el problema: ir tomando decisiones que se consideran las mejores sin posibilidad de vuelta atrás. Esta estrategia no funciona con este problema (no sé si hay alguna forma más avanzada que pudiera hacerla funcionar, pero tal y como está propuesto parece que no).

Este problema se suele poner como ejemplo de aplicación de búsqueda en un espacio de estados: todas las posibles combinaciones de reinas. Las posibilidades se pueden reducir teniendo en cuenta ciertos criterios. La resolución normalmente se basa en backtracking o ramificación y poda y esto tiene su complejidad a la hora de crear un algoritmo que lo implemente (que normalmente será recursivo).


1513
Te comento después de analizar el código lo que he visto.

Hay cosas en el código que no acabo de entender, quizás tengan explicación pero yo no la alcanzo a ver.

Todo el apartado denominado // ajustar heuristica// no acabo de entender ¿qué es lo que pretendes con ese código?


Aparte del apartado que te he comentado que aparentemente genera una distorsión en la lógica del programa, tenemos el asunto del planteamiento del problema.

El algoritmo planteado está considerando las casillas que son amenazadas desde una posición y eligiendo para colocar la reina la casilla donde se amenazan menos posiciones (que cabe entender es la más prometedora porque permitirá a posteriori más posiciones para colocar otras reinas). ¿Qué es lo que haces en caso de empate? Elegir la primera casilla del conjunto de casillas empatadas.

Así, para colocar la primera reina tienes esta heurística:

                             {22,22,22,22,22,22,22,22,
                            22,24,24,24,24,24,24,22,
                            22,24,26,26,26,26,24,22,
                            22,24,26,28,28,26,24,22,
                            22,24,26,28,28,26,24,22,
                            22,24,26,26,26,26,24,22,
                            22,24,24,24,24,24,24,22,
                            22,22,22,22,22,22,22,22
                           };

Donde el mejor valor posible es 22, existiendo 30 casillas empatadas, de las cuales el algoritmo elige la primera.

Para colocar la segunda reina existen aproximadamente 14 casillas empatadas, eligiéndose la casilla de la segunda fila y última columna.

Y así sucesivamente...

En principio los problemas que presenta este planteamiento son:

a) Suponer que elegir la casilla más prometedora (que amenaza menos casillas) nos lleva a una solución del problema. ¿Estamos seguros de que esta suposición es correcta?

b) Elegir la primera casilla en caso de empate múltiple ¿Y si en vez de elegir la primera fuera mejor elegir la segunda empatada? ¿Y la tercera? ¿Y la cuarta? ¿Y la quinta? ... ¿Y la n?


1514
ok, ahora veo clara cuál es la tabla y cuáles son los campos de la tabla.

La lógica de la consulta que planteas parece estar bien, pero puede ocurrir tanto que no te esté llegando bien la variable $link como que haya algún problema al ejecutarse el switch.

Además de lo indicado de comprobaciones debes hacer algunas más:

case "youtube": $sql = $sql."WHERE 'url' LIKE 'https://youtube.com%' or 'url' LIKE 'http://youtube.com%'"; break;

echo 'La consulta que se va a ejecutar es: '.$sql;

Para comprobar qué consulta es la que se va a ejecutar. Puede ser que el carácter / te de algún problema por ser carácter de escape, hay que ir haciendo comprobaciones para ver dónde salta el problema  ::)

1515
Hola, es importante que indiques el lenguaje y compilador que estás utilizando para poder ayudarte. Aparentemente diría que es C++, pero facilita las cosas el dar esa información  :D

También sería necesario que pongas el código de forma que sea compilable, parace que lo que has incluido es un fragmento de un código más amplio. Si se puede compilar también facilita las cosas  :D

Saludos

1516
Hola,

<<Tengo una base de datos llamada "search" (estoy probando en localhost) en la cuál tengo 3 columnas, 'title' , 'url' , 'descripcion'.>>

Una base de datos se compone de tablas, y las tablas se componen de columnas.

Hay que aclarar cómo se llama la base de datos y cómo se llama la tabla para poder hacer la consulta correcta. En realidad el acceso a la base de datos ya estará establecido, más que nada hay que aclarar qué tablas son las que existen en la base de datos y de qué columnas consta cada tabla. Sin tener claro la tabla, columna, formato de datos, etc. no se podrá aclarar bien la consulta...


1517
No entiendo bien la descripción que has hecho, aunque no lo sé bien porque no conozco el detalle de tu base de datos.

¿Cuando dices <<solo busque en mi base de datos las filas que empiezen con "http://youtube.com".>> te refieres a que cuando se seleccione la opción de filtrado "youtube" en el formulario, sólo se muestren los resultados de la tabla search donde el contenido de la columna url empieza por http://youtube.com?

¿Tienes en tu base de datos una tabla que se llama search? ¿Qué contiene la tabla search? ¿Y esa tabla tiene una columna que se llama url ? Esto me lo pregunto porque el nombre search es un nombre un tanto extraño para una tabla, pareciera que fuera una tabla con un caché de búsquedas, y si es un caché de búsquedas realmente no se corresponde con una búsqueda completa sobre la base de datos.

La primera comprobación que parece lógico realizar sería:

$link = $_GET["link"];
echo 'El valor de link es '.$link;

¿Has comprobado que te recupera el valor elegido en el formulario correctamente? Es decir, que si eliges youtube te llega youtube y si elijes taringa te llega taringa?

¿Has probado a hacer la consulta con phpMyAdmin metiendo manualmente la consulta para ver si te funciona?

Estas cosas son lo primero a confirmar para poder generar la consulta, igual ya lo has hecho pero es lógico preguntarse por esto antes de considerar otras cosas.

Saludos

1518
Voy a mirarlo, pero tengo que hacerlo con calma pues me da la impresión de que no es algo que se pueda ver en un minuto; en cuanto vaya teniendo alguna información la iré posteando...

1519
Creo que se podría resolver así: contabilizamos el número de partidas perdidas en la variable partidasPerdidas. Si es mayor de 3, aplicamos un factor divisor al objetivo teórico que es función del número de partidas perdidas. A medida que ganamos, el factor divisor disminuye hasta no aplicarse si ganamos suficientes partidas. A medida que perdemos, el factor divisor aumenta.

El algoritmo quedaría así:

función obtenerNuevosParámetros() {

si apuestaGanada = verdadero Entonces
   Objetivo = Balance*0.01   
   PartidasPerdidas = PartidasPerdidas - 1;
Fin Si

Si apuestaGanada = falso Entonces
   Balance=Balance-Apuesta;
   PartidasPerdidas = PartidasPerdidas + 1;
   Pérdidas = Pérdidas + Apuesta;
   Objetivo = Pérdidas + ObjetivoInicial
   
FinSi


Si (PartidasPerdidas > 3) { //Hay que dividir el objetivo

factorDivisor = partidasPerdidas - 2;
objetivo = objetivo / partidasPerdidas;

}

Apuesta = Objetivo*1.1

}



ProgramaPrincipal

Inicio
Pérdidas = 0;
PartidasPerdidas = 0;
Balance = 1000; //Establecemos un balance inicial para comenzar la partida
finPartida = falso;
ObjetivoOriginal = Balance*0.01;
Objetivo = Balance * 0.01;
Apuesta = Objetivo*1.1;
Pérdidas = 0;

Mientras finPartida = falso Hacer

apuestaGanada = resultadoDeApostar() //Nos devuelve verdadero si ganamos o falso si perdemos

obtenerNuevosParámetros() //La función determina los nuevos parámetros para la siguiente ronda

finPartida = chequearCondicionFinPartida() //Si se cumple la condición finPartida será verdadero

finMientras

Fin

FinProgramaPrincipal

1520
En la modificación que planteas no me queda claro qué ocurre si después de tener 3 pérdidas tenemos una cuarta pérdida, luego una quinta, una sexta... ¿Iríamos siempre diviendo entre 2 lo que hubiera sido la apuesta del martingala normal?

Y por otro lado, ¿qué ocurre si por ejemplo tenemos 3 pérdidas, luego 1 ganada, luego 1 pérdida, luego 1 ganada, luego 1 pérdida?

Páginas: 1 ... 71 72 73 74 75 [76] 77 78 79 80 81 ... 93

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".