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 - Kabuto

Páginas: 1 ... 45 46 47 48 49 [50]
981
Buaahh!!!... Apenas acabo de publicar mi duda, ya he hallado solución..

En la función donde modifico el operador, lo que hago es pasar np a una variable temporal de tipo Name_Pairs y ahora ya si me permite acceder a las funciones definidas en la clase.
Citar
void operator<<(ostream& os, const Name_pairs& np)
   {
      Name_pairs temp = np;
      int t = temp.name_size();
      if (t == 0)
      {
         cout << "\nNo hay datos que mostrar.\n";
      }
      else
      {
         for (int i = 0; i < t; i++)
         {
            cout << "\nNombre: " << temp.get_names() << " Edad: " << temp.get_ages();
         }
      }

   }
Además he corregido la definición de esta función indicando que es de tipo void ya que no va a devolver ningún valor.
Para acceder a los vectores nombre y edad, lo hago a través de dos nuevas funciones: get_names() y get_ages() que antes no tenía, pero que ahora ya si he puesto en public:
Citar
class Name_pairs
   {
   public:
      void read_names();
      void read_ages();
      //void print();
      void sort();
      int name_size();//devuelve el tamaño del vector de nombres
      vector <string> get_names() { return name; }
      vector <double> get_ages() { return age; }
   private:
      vector <string> name;
      vector <double> age;
   };

Y con todo esto, ya no necesito la fucnión print() para mostrar el contenido de los vectores, ahora lo hace el operador << el solito.

Nome cabe duda de que aquí alguien me podría haber ayudado, si le hubiera dado tiempo je je... es curioso que me atasqué cone sto hace un apr de días.. y cuando por fin me decido a pedir ayuda... a los cinco minutos se me enciende la bombilla con la solución.
Gracias igualmente a todo el mundo por hacer posible este foro.

Os dejo como queda el código final:
Código: [Seleccionar]
#include "..\..\..\..\lib\std_lib_facilities.h"

namespace Nombres {
class Name_pairs
{
public:
void read_names();
void read_ages();
void sort();
int name_size();//devuelve el tamaño del vector de nombres
vector <string> get_names() { return name; }
vector <double> get_ages() { return age; }
private:
vector <string> name;
vector <double> age;
};


int Name_pairs::name_size()
{
return name.size();
}

void Name_pairs::read_names()
{
string nombre;
do
{
cout << "\nIntroduza nombre(*=FIN): ";
cin >> nombre;
if (nombre != "*") name.push_back(nombre);

} while (nombre != "*");
}

void Name_pairs::read_ages()
{
int t = name.size();
double edad;
if (t == 0)
{
cout << "\nPrimero hay que introducir nombres...\n";
}
else
{
for (int i = 0; i < t; i++)
{
cout << "\nIntroduzca la edad de: " << name[i] << " --> ";
cin >> edad;
age.push_back(edad);
}
}
}

void operator<<(ostream& os, const Name_pairs& np)
{
Name_pairs temp = np;
int t = temp.name_size();
if (t == 0)
{
cout << "\nNo hay datos que mostrar.\n";
}
else
{
for (int i = 0; i < t; i++)
{
cout << "\nNombre: " << temp.get_names()[i] << " Edad: " << temp.get_ages()[i];
}
}

}

void Name_pairs::sort()
{
int t = name.size();
if (t == 0)
{
cout << "\nNo hay datos que ordenar.\n";
}
else
{
vector <string> name_temp;
vector <double> age_temp;
for (int i = 0; i < t; i++)
{
name_temp.push_back(name[i]);
age_temp.push_back(age[i]);
}

std::sort(name.begin(), name.end());

//Busca coincidencias entre los vectores de nombres original y ordenado para "copiar" el mismo orden en el vector de edad.
//Esta funcion podria ser errónea si hubieran nombres repetidos en el vector.
for (int i = 0; i < t; i++)
{
for (int j = 0; j < t; j++)
{
if (name_temp[i] == name[j]) age[j] = age_temp[i];
}
}
}

}
}//namespace Nombres

int main()
{
using namespace Nombres;

cout << system("cls");
Name_pairs listado;

listado.read_names();
listado.read_ages();
cout << listado;
listado.sort();
cout << listado;
cout << endl;

return 0;
}

982
Hola compis, estoy inciándome con C++, haciendo cosicas en modo consola y tal...

Se me ha propuesto el siguiente ejercicio. El enunciado está en inglés pero no creo que requiera traducción:

Citar
2. Design and implement a Name_pairs class holding (name,age) pairs where name is a string and age is a double.
Represent that as a vector<string> (called name) and a vector<double> (called age) member.
 Provide an input operation read_names() that reads a series of names.
 Provide a read_ages() operation that prompts the user for an age for each name.
 Provide a print() operation that prints out the (name,age) pairs (one per line) in the orderdetermined by the name vector.
 Provide a sort() operation that sorts the name vector in alphabetical order and reorganizes the age vector to match.
 Implement all “operations” as member functions.

Ok, esto lo puedo hacer sin demasiado problema. Pongo el código a continuación.
Si alguien quiere compilarlo, necesitará esta librería: std_lib_facilities.h

Código: [Seleccionar]
#include "..\..\..\..\lib\std_lib_facilities.h"

namespace Nombres {
class Name_pairs
{
public:
void read_names();
void read_ages();
void print();
void sort();
private:
vector <string> name;
vector <double> age;
};

void Name_pairs::read_names()
{
string nombre;
do
{
cout << "\nIntroduzca nombre(*=FIN): ";
cin >> nombre;
if (nombre != "*") name.push_back(nombre);

} while (nombre != "*");
}

void Name_pairs::read_ages()
{
int t = name.size();
double edad;
if (t == 0)
{
cout << "\nPrimero hay que introducir nombres...\n";
}
else
{
for (int i = 0; i < t; i++)
{
cout << "\nIntroduzca la edad de: " << name[i] << " --> ";
cin >> edad;
age.push_back(edad);
}
}
}


void Name_pairs::print()
{
int t = name.size();
if (t == 0)
{
cout << "\nNo hay datos que mostrar.\n";
}
else
{
for (int i = 0; i < t; i++)
{
cout << "\nNombre: " << name[i] << " Edad: " << age[i];
}
}
}

void Name_pairs::sort()
{
int t = name.size();
if (t == 0)
{
cout << "\nNo hay datos que ordenar.\n";
}
else
{
vector <string> name_temp;
vector <double> age_temp;
for (int i = 0; i < t; i++)
{
name_temp.push_back(name[i]);
age_temp.push_back(age[i]);
}

std::sort(name.begin(), name.end());//Recalco que este sort() pertenece a std, y no a mi clase Name_pairs.

//Busca coincidencias entre los vectores de nombres original y ordenado para "copiar" el mismo orden en el vector de edad.
//Esta funcion podria ser errónea si hubieran nombres repetidos en el vector.
for (int i = 0; i < t; i++)
{
for (int j = 0; j < t; j++)
{
if (name_temp[i] == name[j]) age[j] = age_temp[i];
}
}
}

}
}//namespace Nombres

int main()
{
using namespace Nombres;

cout << system("cls");
Name_pairs listado;

listado.read_names();
listado.read_ages();
listado.print();
listado.sort();
listado.print();
cout << endl;

return 0;
}

Todo esto compila bien y compruebo con un pequeño main()  que todo furrula: pide nombres hasta meter un asterisco, puego pide edades para cada nombre, luego los muestra, los ordena alfabéticamente, ordena también el vector edades según se ordenó el vector de nombres y vuelve a mostrarlos tras los cambios.

Ahora viene la segunda parte, que es la que se me atraganta:
Citar
3. Replace Name_pair::print() with a (global) operator << and define == and != for Name_pairs.*/

Bien, de momento solo he intentado hacer que el operador << haga lo que hace print().... pero no lo consigo.

En print(), lo primero que hago es obtener el tamaño del vector de nombres, para comprobar si hay algo que mostrar y si lo hay, pues lo uso para el contador del bucle.

Intento hacer lo mismo en la funcion donde modifico el operador << , pero me da error pues no reconoce el vector name.
Código: [Seleccionar]
/*
//Sustituimos esta funcion con la siguiente donde modificamos el operador <<
void Name_pairs::print()
{
int t = name.size();
if (t == 0)
{
cout << "\nNo hay datos que mostrar.\n";
}
else
{
for (int i = 0; i < t; i++)
{
cout << "\nNombre: " << name[i] << " Edad: " << age[i];
}
}
}*/

ostream& operator<<(ostream& os, const Name_pairs& np)
{
int t = name.size();

                //Falta código por escribir....

}

Vale, tiene sentido, pues no indico a que objeto me refiero y tal.
Pruebo a dar un palo de ciego con esto, que no se por qué, ya imaginaba que tampoco iba a servir:
Código: [Seleccionar]
ostream& operator<<(ostream& os, const Name_pairs& np)
{
int t = np.name.size();

                //Falta código por escribir....

}

Y me digo, pues oye, hacemos una nueva funcion en public: que devuelva el tamaño del vector. Que además, es un dato que estoy necesitando en el resto de funciones.

Código: [Seleccionar]
namespace Nombres {
class Name_pairs
{
public:
void read_names();
void read_ages();
void sort();
int name_size();//devuelve el tamaño del vector de nombres
private:
vector <string> name;
vector <double> age;
};

int Name_pairs::name_size()
{
return name.size();
}

[.....]

ostream& operator<<(ostream& os, const Name_pairs& np)
{
int t = np.name_size();
                 
                //Falta código por escribir....

}

Y nada, tampoco furrula, obtengo estos errores al compilar:

Citar
Error   C2662   'int Nombres::Name_pairs::name_size(void)': no se puede convertir el puntero 'this' de 'const Nombres::Name_pairs' a 'Nombres::Name_pairs &'   235_03   e:\programación\c++\consola\libro\235_03\235_03\235_03.cpp   81


Error (activo)      el objeto tiene calificadores de tipo que no son compatibles con la función "Nombres::Name_pairs::name_size" miembro   235_03   e:\Programación\C++\Consola\Libro\235_03\235_03\235_03.cpp   81

Y me he quedado sin ideas....
Si el parámetro np se supone que representa un objeto de clase Name_pairs, ¿donde está el problema? ¿Qué hago mal?

Espero haberme explicado más o menos claro, a ver si podeis guiarme...
Gracias por adelantado

983
Humm.. probaré del modo que dices.

Muchas gracias Alex  ;)

984
Ok. Ya lo he resuelto.

Para poder iterar con la clase EnvioDeProductos he tenido que implementarle la interfaz Iterable, definiendo la clase del siguiente modo:
Código: [Seleccionar]
public class EnvioDeProductos  implements Iterable<Producto>{
Esto me solucionó el problema a la hora de iterar, pero entonces apareció uno nuevo.

Al iterar cada objeto, yo pretendía mostrar sus datos llamando al método .mostrarDatos().

Código: [Seleccionar]
while (it.hasNext()) {
            producTmp = it.next();
            producTmp.mostrarDatos();

Este método está definido en cada una de las subclases y es distinto para cada una, pues cada subclase tiene atributos propios.

Si applicaba este método directamente sobre los objetos creados, por ejemplo refri1.mostrarDatos(), si que funcionaba y mostraba los datos correspondientes para cada subclase.
Pero no servía para el objeto temporal producTmp, ya que este objeto es de la clase Producto (la superclase), la cuál no tiene ningún metodo .mostrarDatos().

Lo he solucionado declarando la clase Producto como abstracta y añadiéndole un método .mostrarDatos() abstracto, sin nada de código:

Código: [Seleccionar]
public abstract class Producto {
   ...
   ...
   public abstract void mostrarDatos();
}

Y después en cada subclase donde tengo este método lo modifico con la anotación @override para que sobreescriba al método abstracto de la superclase.

Por ejemplo:
Código: [Seleccionar]
@Override
    public void mostrarDatos(){
        System.out.println("Fecha de caducidad: " + getFechaCaducidad().getTime().toString());
        System.out.println("Fecha de Envasado: " + getFechaEnvasado().getTime().toString());
        System.out.println("País de origen: " + getPaisOrigen());
        System.out.println("Número de Lote: " + getNumeroLote());
        System.out.println("Temperatura de mantenimiento: " + getTempMantenimiento());
    }


 ;D De este modo, ahora si consigo iterar sin problemas y puedo llamar al método .mostrarDatos() ejecutándose el que corresponde a cada clase según el objeto al que estemos iterando.

985
Hola, a ver quien me puede echar una mano.

Estoy con este ejercicio:

Citar
Amplía el código del programa Java que planteamos como ejercicio en la entrega CU00687 de este curso, relativo a la gestión de una empresa agroalimentaria, teniendo en cuenta que la empresa gestiona envíos a través de diferentes medios, y un envío puede contener cierto número de productos frescos, refrigerados o congelados. Añade al código:

a) Una clase EnvioDeProductos que represente un envío de productos como colección de objetos que admite el polimorfismo.

b) Crear una clase testHerencia4 con el método main donde se creen: dos productos frescos, tres productos refrigerados y cinco productos congelados (2 de ellos congelados por agua, otros 2 por agua y 1 por nitrógeno). Crear un envío que represente la agrupación de los anteriores productos. Mostrar por pantalla la información del número de productos que componen el envío y recorrer los productos del envío usando iterator para mostrar la información (valor de los atributos) de cada uno de ellos.

Bien, esta de abajo es mi clase EnvioDeProductos. Se deja compilar y funciona correctamente.
El último método, listarEnvio(), lo escribí y lo dejé escrito ya sabiendo que no iba a servir para lo que propone el ejercicio, ya que lo único que hace es mostrar los nombres de los objetos incorporados en el ArrayList, pero no sus atributos.
Aquí el método iterator() si funciona. (luego veréis porque hago este apunte)

Código: [Seleccionar]
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

/**
 * Clase para definir envios de productos mediante una colección polimórfica.
 *
 * @author Kabuto
 * @version 1.0
 */
public class EnvioDeProductos{
   
    private List<Producto> envioProductos;
   
    public EnvioDeProductos(){
        envioProductos = new ArrayList<Producto>();
    }
   
    //Método para obtener un determinado producto pasando un indice como parámetro
    public Producto getEnvioDeProductos(int i){return envioProductos.get(i);}
   
    //Método para modificar un produto de la lista indicando el producto y un indice
    public void setEnvioDeProductos(Producto nombreProducto, int i){envioProductos.add(i, nombreProducto);}
   
    //Método para añadir nuevos productos a la lista
    public void addEnvioDeProductos(Producto nombreProducto){envioProductos.add(nombreProducto);}
   
    //Para consultar cuantos objetos componen la lista
    public int longitudLista(){return envioProductos.size();}
   
    /*Método para listar los productos del envío.
     *Tan solo muestra el nombre de cada objeto, no sus atributos
     */
    public void listarEnvio(){
        Iterator<Producto> it = envioProductos.iterator();
        Producto producTmp;
        while (it.hasNext()) {
            producTmp = it.next();
            System.out.println(producTmp);
        }
    }
}

Bien, ahora viene el main donde creo los distintos productos y los meto juntitos en el ArrayList de EnvioDeProducto.
Todo este proceso furula correctamente.
Al final pretendo hacer lo que propone el ejercicio: Recorrer los productos con un iterador y mostrar toda la información de cada producto.

Pero aquí es donde me da un error al compilar. Me dice que no puedo aplicarle el método iterator() a nuevoEnvio, que es el objeto de la clase GestionDeEnvios, vamos un ArrayList.
¿Por qué aquí no me permite aplicárselo y sin embargo si puedo hacerlo en el código que define la clase?

Os adjunto un zip con todas las clases que componen el proyecto

Código: [Seleccionar]
import java.util.Calendar;
import java.util.Iterator;

/**
 * Programa para testear la creacion de productos con herencias
 * dos productos frescos, tres productos refrigerados y cinco productos congelados (2 de ellos congelados
 * por aire, otros 2 por agua y 1 por nitrógeno). Crear un envio y mostrar datos.
 *
 * @author Kabuto
 * @version 1.0
 */
public class TestEnvioProducto {
    public static void main (String[] args){
        Calendar fechaCaducidad = Calendar.getInstance();
        Calendar fechaEnvasado = Calendar.getInstance();
       
        fechaCaducidad.set(2015,11,25);
        fechaEnvasado.set(2015,5,25);//Por comodidad pasaremos las mismas fechas a todos los contructores.
       
        //Creamos varios productos
        Fresco fresco1 = new Fresco(fechaCaducidad, fechaEnvasado, "España", 224);
        Fresco fresco2 = new Fresco(fechaCaducidad, fechaEnvasado, "España", 227);
       
        Refrigerado refri1 = new Refrigerado(fechaCaducidad, fechaEnvasado, "Alemania", 124);
        refri1.setCodigoSuperVision(123); refri1.setTemperaturaConservacion(20);
        Refrigerado refri2 = new Refrigerado(fechaCaducidad, fechaEnvasado, "Brasil", 132);
        refri2.setCodigoSuperVision(120); refri2.setTemperaturaConservacion(18);
        Refrigerado refri3 = new Refrigerado(fechaCaducidad, fechaEnvasado, "China", 114);
        refri3.setCodigoSuperVision(113); refri1.setTemperaturaConservacion(21);
       
        Aire congeladoAire1 = new Aire(fechaCaducidad, fechaEnvasado, "EEUU", 285);
        congeladoAire1.setComposicionAire(25, 25, 25, 25);
        Aire congeladoAire2 = new Aire(fechaCaducidad, fechaEnvasado, "Perú", 034);
        congeladoAire1.setComposicionAire(20, 10, 30, 40);
       
        Agua congeladoAgua1 = new Agua (fechaCaducidad, fechaEnvasado, "España", 112);
        congeladoAgua1.setSalinidad(12);
        Agua congeladoAgua2 = new Agua (fechaCaducidad, fechaEnvasado, "Japón", 123);
        congeladoAgua2.setSalinidad(18);
       
        Nitrogeno congeladoNitrogeno = new Nitrogeno(fechaCaducidad, fechaEnvasado, "Rusia", 155);
        congeladoNitrogeno.setMetodoCongelacion("Soplando muy fuerte");
        congeladoNitrogeno.setTiempoExposicion(500);
       
        //Creamos un envio con todos estosproductos
        EnvioDeProductos nuevoEnvio = new EnvioDeProductos();
        nuevoEnvio.addEnvioDeProductos(fresco1); nuevoEnvio.addEnvioDeProductos(fresco2);
        nuevoEnvio.addEnvioDeProductos(refri1);nuevoEnvio.addEnvioDeProductos(refri2);nuevoEnvio.addEnvioDeProductos(refri3);
        nuevoEnvio.addEnvioDeProductos(congeladoAire1);nuevoEnvio.addEnvioDeProductos(congeladoAire2);
        nuevoEnvio.addEnvioDeProductos(congeladoAgua1);nuevoEnvio.addEnvioDeProductos(congeladoAgua2);
        nuevoEnvio.addEnvioDeProductos(congeladoNitrogeno);
       
        //Mostramos el número de productos en el envío
        System.out.println("El envío está compuesto por " + nuevoEnvio.longitudLista() + " productos.");
        System.out.println("Listado de productos actuales");
        System.out.println("-----------------------------");
        System.out.println("");
               
        //Mostramos los datos de los productos a enviar
        Iterator<Producto> it = nuevoEnvio.iterator();//Iterator da error "cannot find symbol method .iterator()
        Producto producTmp;
        while (it.hasNext()) {
            producTmp = it.next();
            producTmp.mostrarDatos();
        }
    }
}

986
Gracias por tu respuesta. ;)

Precisamente llevo un par de semanitas haciendo el curso de aprendizaje básico y antes de seguir con él, quería hacer más ejercicios extra porque como dije, he aprendido muchas cosas, pero otra cosa es haberlas "comprendido".
Aprender == Comprender --> False xDD

Y gracias a que se me ha atragantado este ejercicio, he comprendido mejor cosas que había aprendido. Y ya lo he resuelto (con ayudita de alguien más versado que yo en Java).
Lo cierto es que es mucho más fácil que toda la movida que estaba intentando yo hacer montando esa Colección.
Basta con usar un array de tipo Object y ya tenemos una matriz equivalente a la propuesta en el ejercicio de JavaScript.
Pego aquí el código, con el ejercicio completamente resuelto, para quien pueda ser de ayuda.

Lo cierto es que la solución original es menos enrevesada, bastaba con hacer las operaciones apuntando a los objetos de la matriz original, puesto que sabemos donde están los valores booleanos (posiciones 0 y 2), donde los números(posiciones 1 y 5) y donde las cadenas(posiciones 3 y 4).

Pero yo he querido complicarlo un poco más  y simular que no sabemos donde encontrar cada objeto, y por eso hay que recorrer la matriz, preguntar que tipo de objeto es y moverlo al sitio adecuado para posteriormente realizar las operaciones.

Código: [Seleccionar]
/**
 * Ejercicio con una matriz de objetos de distinto tipo con los que luego hacer diversas operaciones
 * a) Concatenar las dos cadenas y mostrarlas
 * b) Compara los números entre sí con todos los comparadores de comparación
 * c) Comparar todos los valores de la matriz entre sí de dos en dos y ver el resultado
 * d) Realizar diferentes operaciones aritméticas con los números
 * @author Kabuto
 * @version 08/04/2015
 */
public class OperacionesMatriz{
    public static void main (String[] args){
        //Inicializamos array tipo Object que contiene objetos de distinto tipo
        final Object[] matrizVariada = new Object[]{true, 5, false, "hola", "adios", 2};
        //Declaramos una variable para concatenar cadenas
        String cadenaConcatenada ="";
        //Declaramos dos matrices para almacenar booleanos y enteros según los encontremos.
        //También declaramos dos contadores para usar como índices en estas matrices
        Boolean[] matrizBool = new Boolean[2]; int x=0;
        Integer[] matrizInt = new Integer[2]; int y=0;
       
        //Recorremos la matriz para extraer valores usando "instanceof" para discriminar a que tipo pertenecen.
        for (Object tmp: matrizVariada) {
            if (tmp instanceof String) {cadenaConcatenada += tmp;} // Las cadenas las concatenamos sobre la marcha
            if (tmp instanceof Integer) {matrizInt[y] = (int)tmp; y++;}//Guardamos el valor en la matriz adecuada y aumentamos el índice para que el próximo elemento se guarde en el siguiente campo
            if (tmp instanceof Boolean) {matrizBool[x] = (boolean)tmp; x++;}
        }

        //Comenzamos con las operaciones
        System.out.println("A) Concatenar las dos cadenas y mostrarlas:");
        System.out.println(cadenaConcatenada);
        System.out.println("");
        System.out.println("B) Compara los números entre sí con todos los comparadores de comparación:");
        System.out.println(matrizInt[0] + " < " + matrizInt[1] + " es: " + (matrizInt[0] < matrizInt[1]));
        System.out.println(matrizInt[0] + " > " + matrizInt[1] + " es: " + (matrizInt[0] > matrizInt[1]));
        System.out.println(matrizInt[0] + " == " + matrizInt[1] + " es: " + (matrizInt[0] == matrizInt[1]));
        System.out.println(matrizInt[0] + " != " + matrizInt[1] + " es: " + (matrizInt[0] != matrizInt[1]));
        System.out.println("");
        System.out.println("C) Comparar todos los valores de la matriz entre sí de dos en dos y ver el resultado:");
        //Para este usamos un bucle for anidado dentro de otro for, así obtenemos dos índices para recorrer la matriz de manera que cada elemento se compara con sí mismo y con el resto de elementos
        for (int i=0; i < matrizVariada.length; i++){
            for (int j=0; j < matrizVariada.length; j++){System.out.println(matrizVariada[i] + " es igual a " + matrizVariada[j] + " : " + (matrizVariada[i] == matrizVariada[j]));}
        }
        System.out.println("");
        System.out.println("D) Realizar diferentes operaciones aritméticas con los números:");
        System.out.println(matrizInt[0] + " + " + matrizInt[1] + " = " + (matrizInt[0] + matrizInt[1]));
        System.out.println(matrizInt[0] + " - " + matrizInt[1] + " = " + (matrizInt[0] - matrizInt[1]));
        System.out.println(matrizInt[0] + " * " + matrizInt[1] + " = " + (matrizInt[0] * matrizInt[1]));
        System.out.println(matrizInt[0] + " / " + matrizInt[1] + " = " + (matrizInt[0] / matrizInt[1]));
        System.out.println(matrizInt[0] + " % " + matrizInt[1] + " = " + (matrizInt[0] % matrizInt[1]));
    }
}

987
Hola, estoy empezando a aprender Java y de momento no tengo categoría ni de novato xD.

El caso es que para ir practicando lo poquito que llevo aprendido (aprendido, y no del todo entendido...), se me ha ocurrido desempolvar unos ejercicios prácticos que tengo de un curso anterior que hice de JavaScript, para intentar hacerlos ahora en Java.
Pues el primero de todos, ya se me ha atragantado  :o

Os publico el enunciado:

Citar
1) Realizar una serie de operaciones con la siguiente matriz:

var valores = [true, 5, false, "hola", "adios", 2]

a) Concatenar ambas cadenas y presentar resultado
b) Comparar los números entre sí con todos los operadores de comparación.
c) Comparar todos los valores de la matriz entre sí de dos en dos y ver el resultado
d) Realizar diferentes operaciones aritméticas con los valores numéricos

En JavaScript no hay mayor problema ya que se pueden mezclar tipos de datos en una matriz. Pero no en Java....

Bueno, pensando como resolver esto, he probado creando un set a partir de 3 matrices con distintos tipos de datos. Es lo único que se me ha ocurrido para crear  algo similar a una matriz como esa.

Tal como lo he hecho, los datos/objetos no quedan en el mismo orden que el propuesto en el enunciado, pero eso es irrelevante.

El caso es que consigo juntarlos y mostrarlos uno a uno en pantalla.

Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.Arrays;
import java.util.Iterator;

public class OperacionesMatriz{
    public static void main (String[] args){
        ArrayList<Set> matrizVariada = new ArrayList <Set>();

        //Creacion de matriz con datos Boolean
        Boolean [] matrizBool = {true, false};
        HashSet<Boolean> datosBool = new HashSet<Boolean> (Arrays.asList(matrizBool));

        //Creacion de matriz con Integer       
        Integer [] matrizInt = {5, 2};
        HashSet<Integer> datosInt = new HashSet<Integer> (Arrays.asList(matrizInt));

        //Creacion de matriz de Strings
        String [] matrizString = {"hola", "adios"};
        HashSet<String> datosString = new HashSet<String> (Arrays.asList(matrizString));

        //Juntamos las tres matrices
        matrizVariada.add(datosBool); matrizVariada.add(datosInt); matrizVariada.add(datosString);

        //Recorremos y mostramos en pantalla para comprobar resultado
        for (Set tmp: matrizVariada){
            Iterator it = tmp.iterator();
            int i=0;
            while (it.hasNext()){
                System.out.println("i: " + (i++) + " - " + it.next());
            }
        }
    }
}


Ahora mi desconocimiento plantea estas dudas.
  • ¿Puedo operar con estos objetos tras haberlos unidos de este modo?
  • ¿Puedo hacer que al recorrer el set, el programa distinga si el objeto es (o era) un Integer, un String, un Boolean para almacenarlos en distintas variables según el tipo  y luego operar con ellas (concatenar, comparar, etc..)?
  • ¿Debería de haberlos juntado de otra manera para poder operar con ellos?

A la espera quedo de vuestros sabios consejos. Gracias y un saludo.  ;)

988
Muchas gracias por tu respuesta.

Fíjate que me dí cuenta de mi error pasada media noche, tumbado en la cama ja ja..no se por qué me vino a la cabeza este ejercicio y me di cuenta de mi cagada, ya a punto de dormirme con luces y ordenador apagados, por lo que edité el mensaje desde el móvil.

El código lo entiendo, la programación se me da bastante bien. De "joven" daba Pascal y Cobol en el Instituto (nada de programación orientada a objetos), ya en pleno año 2000, me gustaba pero terminé el instituto con conocimientos desfasados..., pero no inútiles.

El año pasado en un curso de HTML, aprendí algo de JavaScript y eso (además de que los tutoriales de esta web son inmejorables...) me está facilitando aprender Java y captar rápidamente ciertos conceptos.

En lo que fallo, como ha quedado demostrado, es en las Matemáticas jeje.. ahí no tengo arreglo.

En fin, gracias de nuevo y enhorabuena a todos vosotros por la labor que hacéis aquí.

989
Hola,
abajo pongo el código que he usado para resolver el ejercicio.
Sé que funciona perfectamente, pero mirando las soluciones de otros compañeros, me he fijado que lo he resuelto de manera un pelín distinta.
No he visto ha nadie hacer lo mismo que yo, así que, aunque básicamente viene a ser lo mismo y el código funciona, me asalta la duda de si mi solución pudiera ser poco recomendable por algún motivo.

EDITO:Fallo mio! Acabo de darme cuenta de que mi código no funciona, bueno solo funciona si pasas un 2 como segundo parametro que es lo que probé je je.  Para números mayores la multiplicación resulta una burrada.....fallo matemático mío

Me refiero a la línea dentro del bucle for
Yo lo que hago es declarar previamente una variable con valor 10 y luego dentro del bucle la multiplico por sí misma tantas veces como nos hayan indicado con el segundo parámetro solicitado (y)
Para ello pongo una línea que a priori parece un poco rara pero que funciona:
potencia=potencia*potencia;

Otros compañeros lo que han hecho es declarar una variable con valor 1 y luego dentro del bucle multiplicarla por 10:
potencia=potencia*10;

A efectos prácticos viene a ser lo mismo, tan solo hay variar ligeramente la condición a cumplir para salir del bucle, puesto que ya partimos con valor 10 en la variable.
Pero no se si quizás resulta un poquito más confuso lo que yo hago y por ello pudiera ser poco recomendable.


Otra cosa distinta es que en lugar de poner un constructor vacío, he optado por un simple comentario indicando que no es necesario. De nuevo no se si esto pudiera considerarse una mala práctica.

Agradeceré cualquier comentario o consejo. Un saludo.

Código: [Seleccionar]
public class MultiplicadorDieces{

    //No se necesita constructor
   
   
    public double multiplicaPorDieces (double x, int y) {
        double potencia=10;
       
        for (int i=1; i<y; i++){
            potencia=potencia*potencia;
        }
       
       return Math.round(potencia*x);
    }
 }

Páginas: 1 ... 45 46 47 48 49 [50]

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