Autor Tema: Mapeo de memoria en Java Run Time Stack y Heap posiciones referencias contenidos  (Leído 3446 veces)

r2montero

  • Sin experiencia
  • *
  • Mensajes: 40
    • Ver Perfil
Salu2 a todos!

Tengo la esperanza de que alguien pueda ayudarme:

Nos pidieron programar un ejercicio muy sencillo para venta de productos y calculo de su costo total (al final dejo los códigos).

El problema ahora es que se nos pide integrar una simulación de mapeo de memoria con matrices, pero no tengo idea de como hacerlo, este es el enunciado por si alguien puede guiarme un poco, de antemano gracias!

Citar
Deben programar una representación del modelo de la memoria de Java para la ejecución del código programado. La representación debe ser implementada con dos matrices de String, una que represente el “Runtime Stack” y otra que represente el “Heap”. En la clase de la matriz deberán tener un método para agregar una fila a la matriz y otra para eliminar una serie de filas, desde el final al inicio hasta encontrar una fila null(representa la eliminación de un método o de un objeto).

También deberá tener un método para imprimir la matriz.

Deberán simular la ejecución del programa instrucción por instrucción, lo que quiere decir que para cada instrucción ejecutada deberán ir agregando a las matrices los valores de las instrucciones ejecutadas respectivamente: en una columna las
direcciones de memoria, en otra el valor que corresponde y en otra el nombre de la variable.

Cuando se termina de agregar un un objeto o un método a la matriz deberá agregar una fila null la separación de losmismos.

Sí se encuentra en un método que llama a varios métodos, para estos deberá guardar cálculos intermedios cuando uno de más ya han terminado y queda pendiente uno o más de los métodos.

En el caso de las variables String deben agregar sólo la fila que lo representa y no su espacio en heap ni el de su vector.

No deben realizar el mapeo de los métodos constructores ni de métodos propios de bibliotecas de Java.

Deberán utilizar direcciones ficticias para los segmentos de memoria (similar al formato de mapeo visto en los ejercicios de clase).

Deberán imprimir el contenido de las matrices que representan el “Runtime Stack” y “Heap” en los siguientes tres puntos:

• Se ha llamado al método getBillText del main para el primer objeto bill, dentro del cual se encuentra en el punto de llamar al método calculateCustomsTax, dentro del cual se calculateCustomsTax de Pruducto y en este método ya realizó el cálculo lo retornó pero aún no ha salido de la pila.

• Se ha llamado al método getBillText del main para el segundo objeto bill, dentro del cual se encuentra en el punto de llamar al método calculateTotalBil y en este método ya realizó el cálculo lo retornó pero aún no ha salido de la pila.

• Al final de la ejecución como si no hubieran borrado métodos u objetos. Para esto tendrá que comentar las eliminaciones para los dos puntos anteriores.


Clase Main:

Código: [Seleccionar]
public class Main {

    public static void main(String[] args) {
        Client client = new Client("101110111", "Light", "Yagami");
        Product product = new BookProduct("D. Note", 10000.0, 0.5);
        Bill bill = new Bill(client, product, 3);
        String stringBill = bill.getBillText();
        System.out.println(stringBill);
       
        client = new Client("202220222", "Albert", "Einstein");
        product = new ElectronicProduct("TV plasma", 600000.0, 5);
        bill = new Bill(client, product, 1);
        stringBill = bill.getBillText();
        System.out.println("\n\n-------------------\n\n");
        System.out.println(stringBill);
    }

}


Clase Client:

Código: [Seleccionar]
public class Client {

    private String identityCard;
    private String name;
    private String lastName;

    public Client(String identityCard, String name, String lastName) {
        this.identityCard = identityCard;
        this.name = name;
        this.lastName = lastName;
    }

    public String getIdentityCard() {
        return identityCard;
    }

    public void setIdentityCard(String identityCard) {
        this.identityCard = identityCard;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String toText() {
        return "Cliente : " + identityCard + ", " + name + " " + lastName;
    }

}


Clase Product:

Código: [Seleccionar]
public abstract class Product {

    private String description;
    private double price;
    private double weight;
    private final double customsTax;

    public Product(String name, double price, double weight, double customsTax) {
        this.description = name;
        this.price = price;
        this.weight = weight;
        this.customsTax = customsTax;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public double getCustomsTax() {
        return customsTax;
    }

    public double calculateCustomsTax() {
        return (customsTax * price);
    }

    public String toText() {
        return "Descripción: " + description + "\nPeso: " + weight + " kg\nImpuesto: " + customsTax + "\nPrecio: " + price;
    }

}


Clase BookProduct:

Código: [Seleccionar]
public class BookProduct extends Product {

    public BookProduct(String name, double price, double weight) {
        super(name, price, weight, Taxes.BOOK_TAX.getTax());
    }

    @Override
    public String toText() {
        return "Producto: Libro\n" + super.toText();
    }
}


Clase ElectronicProduct:

Código: [Seleccionar]
public class ElectronicProduct extends Product {

    public ElectronicProduct(String name, double price, double weight) {
        super(name, price, weight, Taxes.ELECTRONIC_TAX.getTax());
    }

    @Override
    public String toText() {
        return "Producto: Electrónico\n" + super.toText();
    }

}


Clase Bill:

Código: [Seleccionar]
public class Bill {

    private Client client;
    private Product product;
    private int quantity;

    public Bill(Client client, Product product, int quantity) {
        this.client = client;
        this.product = product;
        this.quantity = quantity;
    }

    public Client getClient() {
        return client;
    }

    public void setClient(Client client) {
        this.client = client;
    }

    public Product getProduct() {
        return product;
    }

    public void setProduct(Product product) {
        this.product = product;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public double calculateCustomsTax() {
        return (product.calculateCustomsTax() * quantity);
    }

    public double calculateTransportCost() {
        return product.getWeight() * quantity * Taxes.TRANSPORT_COST.getTax();
    }

    public double calculateTotalBill() {
        return product.getPrice() + calculateCustomsTax() + calculateTransportCost();
    }

    public String getBillText() {
        return client.toText() + "\n" + product.toText() + "\ncantidad: "
                + quantity + "\nImpuestos de aduanta: " + calculateCustomsTax()
                + "\nCosto de transporte: " + calculateTransportCost()
                + "\nTotal: " + calculateTotalBill();
    }

}


Enum Taxes:

Código: [Seleccionar]
public enum Taxes {
    BOOK_TAX(0.01), ELECTRONIC_TAX(0.25), TRANSPORT_COST(1000);

    private final double TAX;

    Taxes(double tax) {
        this.TAX = tax;
    }

    public double getTax() {
        return TAX;
    }

}
« Última modificación: 01 de Noviembre 2016, 20:41 por Ogramar »

r2montero

  • Sin experiencia
  • *
  • Mensajes: 40
    • Ver Perfil
Re:Mapeo de memoria en Java
« Respuesta #1 en: 28 de Octubre 2016, 19:31 »
Este es un ejemplo de un mapeo hecho en clase (a mano, sin programarlo con matrices):

Ejercicio de memoria

Considere el siguiente código (del método main) que llama al método calcularDistancia()


Código: [Seleccionar]
String tipoLinea = “Horizontal”;

int coordenadaX1 = 8;
int coordenadaY1 = 10;
int coordenadaX2 = 23;
int coordenadaY2 = 10;

Punto punto1 = new Punto (coordenadaX1, coordenadaY1);
Punto punto2 = new Punto (coordenadaX2, coordenadaY2);
LineaHorizontal linea = new LineaHorizontal (punto1, punto2);
System.out.println(linea. calcularDistancia(tipoLinea));
System.out.println(“Nuevo punto: “);
...
public String calcularDistancia(String tipoLinea ) {
String mensaje = “La distancia entre los puntos de la línea “ + tipoLinea + “ es: “;
int distancia = Math.abs(this.getPunto1().getX() – this. getPunto2().getX());
mensaje += distancia;
return mensaje;
}

Cree la representación del modelo de memoria en java del código anterior. (Los String
puede dejarlos con sólo con la referencia a la dirección de memoria). Debe señalar cuáles segmentos corresponden a los stack frame de los métodos, al run-time-stack y al heap.

a) Cree dicha representación tomando en cuenta que el compilador se encuentra en la línea “Punto punto2 = new Punto (coordenadaX2, coordenadaY2);” y no la ha ejecutado.

b) Cree dicha representación tomando en cuenta que el compilador se encuentra en la línea System.out.println(“Nuevo punto: “);

c) Cree dicha representación tomando en cuenta que el compilador ya terminó de ejecutar el código pero sin borrar la memoria.

SOLUCIONES:
http://wp.me/a7yNnO-2Q
http://wp.me/a7yNnO-2R
http://wp.me/a7yNnO-2S







Salu2.
« Última modificación: 01 de Noviembre 2016, 20:24 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas

Citar
Nos pidieron programar un ejercicio muy sencillo para venta de productos

Yo la verdad es que no lo veo tan sencillo... en realidad nada sencillo, y bastante específico. Quizás demasiado extenso y específico, al menos para mí, por el tiempo que puede requerir analizar y responder esto. No sé si algún compañero podrá darte respuesta.

El primero paso posiblemente sería definir una clase RunTimeStack. Ahora tendrías que pensar qué te hace falta en esa clase.

Viendo la solución que plantea solución a) posiblemente requieras nombre de la referencia (por ejemplo coordenadaX1), posición de memoria (por ejemplo 012008) y valor almacenado (por ejemplo 8 ).

Podrías crear una clase PosicionMemoria que tenga como atributos un entero Posicion, un String referencia y un String valor almacenado.
 
Luego la clase RunTimeStack estaría formada por una Lista (matriz) de estos elementos.

Pero no tengo muy claro si irán por ahí los tiros.

Salu2

 

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