Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: ciccio on 24-01-2009, 17:48:53



Title: Esercizio lab.pdf !!!
Post by: ciccio on 24-01-2009, 17:48:53
Sempre con l' aiuto di "quelli che il forum..." e in particolare di Antoniods ho risolto l' esercizio lab.pdf postato da Cincotti.
ECCO IL CODICE:

Code:
import java.util.*;

abstract class A
{
protected int x;
public A (int _x)
{
x = _x;
}

abstract public int f ();
}

class B extends A
{
protected int y;
private D d;

public B (int _x, int _y, double _z)
{
super (_x);
y = _y;
d = new D (_z);
}

public int f ()
{
return (int) Math.pow (x, 2);
}

public int f (D _d)
{
return (int)( d.getZ() + _d.getZ() );
}
}

class D
{
private double z;
public D (double _z)
{
z = _z;
}

public double getZ ()
{
return z;
}
}

class C extends B
{
public C (int _x, int _y, double _z)
{
super (_x, _y, _z);
}

public int f ()
{
return 7 * y;
}
}



class Lab
{
public static void main(String []args)
{
Random r = new Random (6353433);

A[] vett = new A[100];
       
for (int i = 0; i < vett.length; i++)
{
int x = r.nextInt(10);
//System.out.println(x);
int y = r.nextInt(100);
//System.out.println("   " + y);
int z = r.nextInt(30);
//System.out.println("         " + z);
if (r.nextInt(2) == 1)
{
vett[i] = new B(x, y, z);
}
else
{
vett[i] = new C(x, y, z);
}
}

//SOMMA DEI VALORI RESTITUITI DA f()--------------------------------------------

int contaF = 0;
for (int i = 0; i < vett.length; i++)
{
contaF += vett[i].f();
}

System.out.println(contaF);

//SOMMA DEI VALORI RESTITUITI DA f(obj)--------------------------------------------

int contaFobj = 0;

for (int i = 0; i < vett.length; i++)
{
D obj = new D(r.nextInt(47));
contaFobj += ((B)vett[i]).f(obj);
}

System.out.println(contaFobj);

//NUMERO DI ISTANZE DI CLASSE B-----------------------------------------------------

int istanzeB = 0;
for (int i = 0; i < vett.length; i++)
{
if (!(vett[i] instanceof C))
istanzeB++;
}

System.out.println(istanzeB);
        }
   
}


Title: Re:Esercizio lab.pdf !!!
Post by: Antoniods on 24-01-2009, 17:54:02
:yoh :yoh :yoh :yoh :yoh
.ciaociao


Title: Re:Esercizio lab.pdf !!!
Post by: Blonic on 28-01-2009, 16:28:07
Corretto, però secondo me così è più efficente ed ottieni gli vett.length oggetti dati in pasto a f(obj):
Code:
int Sommaf = 0, Sommafobj = 0, istanzediB = 0;
i=0;

D [] d = new D [vett.length];

while (i<vett.length)
{
Sommaf += vett[i].f();

d[i] = new D(r.nextInt(47));

Sommafobj += ((B)(vett[i])).f(d[i]);

if (!(vett[i] instanceof C))
istanzediB ++;

i++;
}

System.out.println("Risultati:  " + Sommaf +",  "+ Sommafobj+",  "+ istanzediB);


Title: Re:Esercizio lab.pdf !!!
Post by: MisteroLupo on 28-01-2009, 17:49:49
Sono rimasto intoppato in un errore mentre risolvevo l'esercizio.
Premetto che è incompleto perché appunto ancora stavo svolgendo!
Code:
abstract class A {
    protected int x;
    public A(int x) {
        this.x = x;
    }
    abstract public int f();

    class B extends A {
        protected int y;
        private D d;
        public B(int x, int y, double z) {
            super(x);
            this.y = y;
            d = new D(z);
        }
        public int f() {
            return (int)Math.pow(x, 2);
        }
        public int f(D d) {
            return (int)(this.d.getZ() + d.getZ());
        }

        class C extends B {
            public C(int x, int y, double z) {
                super(x,y,z);
            }
            @Override
            public int f() {
                return 7*y;
            }
        }
    }

    class D {
        private double z;
        public D(double z) {
            this.z = z;
        }
        public double getZ() {
            return z;
        }
    }
}
L'errore è nel costruttore di C, precisamente nella chiamata del super costruttore:
super(x,y,z); - cannot reference this before supertype constructor has been called.

Dove sbaglio?


Title: Re:Esercizio lab.pdf !!!
Post by: maucel89 on 28-01-2009, 18:09:21
Hai messo la classe C dentro la classe B..
mentre deve essere messa di segiuto...
 :-OK


Title: Re:Esercizio lab.pdf !!!
Post by: MisteroLupo on 28-01-2009, 18:20:32
Hai messo la classe C dentro la classe B..
mentre deve essere messa di segiuto...
 :-OK
E perché mai? Non è quello il problema..


Title: Re:Esercizio lab.pdf !!!
Post by: Blonic on 28-01-2009, 18:25:39
Non si può definire una classe dentro una classe!!!
Dovrebbe isolarla e metterla in un'altra parte del codice!


Title: Re:Esercizio lab.pdf !!!
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 28-01-2009, 18:33:46
Non si può definire una classe dentro una classe!!!
Dovrebbe isolarla e metterla in un'altra parte del codice!
Certo che si può fare, e in certi contesti ha anche senso farlo.
Si considerino come esempio le due classi java.awt.geom.Point2D.Double (http://java.sun.com/javase/6/docs/api/java/awt/geom/Point2D.Double.html) e java.awt.geom.Point2D.Float (http://java.sun.com/javase/6/docs/api/java/awt/geom/Point2D.Float.html) che estendono la classe java.awt.geom.Point2D (http://java.sun.com/javase/6/docs/api/java/awt/geom/Point2D.html) e che inoltre sono classi annidate in quest'ultima (come lo stesso loro nome suggerisce).

Anche se si può fare, in effetti, magari non era l'intenzione di chi ha scritto il particolare codice di cui si sta parlando .ciaociao.


Title: Re:Esercizio lab.pdf !!!
Post by: MisteroLupo on 28-01-2009, 18:55:22
Anche se si può fare, in effetti, magari non era l'intenzione di chi ha scritto il particolare codice di cui si sta parlando .ciaociao.
Era proprio mia particolare intenzione, sono abituato a mettere le classi "figlie" dentro le classi "madri" e ho letto nel tutorial della sun (http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html) che è una buona abitudine..
Ma non è questo il punto della discussione :x
reversengineer sai dirmi perché mi da quell'errore?


Title: Re:Esercizio lab.pdf !!!
Post by: MisteroLupo on 28-01-2009, 19:22:18
Ho risolto utilizzando this(x,y,z) al posto di super(x,y,z). Credo il motivo sia perché ho già utilizzato un super nella "catena" di costruttori, ma non ne sono sicuro. Se qualcuno sa chiarirmi la situazione sarebbe gradito..

Edit: non ho risolto un bel niente mi da un altro errore: "recursive constructor invocation"  :-)|

Per gli altri: imparate ad annidare le classi :-)L


Title: Re:Esercizio lab.pdf !!!
Post by: MisteroLupo on 29-01-2009, 15:23:14
Up.. nessuno mi sa aiutare? .penso


Title: Re:Esercizio lab.pdf !!!
Post by: Crasher on 29-01-2009, 16:07:16
Per gli altri: imparate ad annidare le classi :-)L
Se tu imparassi a non annidare le classi non avresti problemi :-)L (scherzo)
Ecco il codice senza classi annidate... ho solo tolto gli annidamenti
Code:
abstract class A {

protected int x;

public A(int x)
{
this.x = x;
    }

    abstract public int f();
}
 
class B extends A {

protected int y;
    private D d;
       
public B(int x, int _y, double z)
{
        super(x);
        this.y = _y;
        d = new D(z);
    }
       
public int f()
{
        return (int)Math.pow(x, 2);
    }
       
public int f(D d)
{
        return (int)(this.d.getZ() + d.getZ());
    }
}

class C extends B {

    public C(int x, int y, double z)
{
          super(x,y,z);
    }
            //@Override

    public int f()
{
return 7*y;
    }
}
   

class D {
    private double z;
   
public D(double z)
{
this.z = z;
    }
   
public double getZ()
{
return z;
    }
}

Proverò con le classi annidate :)


Title: Re:Esercizio lab.pdf !!!
Post by: MisteroLupo on 29-01-2009, 16:11:33
Se tu imparassi a non annidare le classi non avresti problemi :-)L (scherzo)
:boh

A te funziona? Avevo già provato senza classi annidate ma non va lo stesso..


Title: Re:Esercizio lab.pdf !!!
Post by: Crasher on 29-01-2009, 16:13:13
Con le classi annidate non mi funziona... ho lo stesso errore tuo...
ma senza classi annidate (vedi codice postato da me sopra) funziona


Title: Re:Esercizio lab.pdf !!!
Post by: MisteroLupo on 29-01-2009, 16:19:12
Il mistero si infittisce .penso
Nella javadoc c'è scritto che annidare le classi è buona usanza, e comunque credo siano annidate in modo corretto. Andrei da Cincotti se solo sapessi quando riceve .whistling

OT: 100esimo post :[Emoticon] PC Asd:


Title: Re:Esercizio lab.pdf !!!
Post by: Fr3d3R!K on 29-01-2009, 19:09:55
c'è scritto sulla porta del suo studio, mercoledì (l'orario non lo ricordo mi pare dalle 12:30 alle 13:30 mi correggano se sbaglio).


Title: Re:Esercizio lab.pdf !!!
Post by: Vivynz on 29-01-2009, 19:11:00
http://www.dmi.unict.it/~cincotti/avvisi.htm (http://www.dmi.unict.it/~cincotti/avvisi.htm)


Title: Re:Esercizio lab.pdf !!!
Post by: MisteroLupo on 29-01-2009, 21:13:58
Grazie :-)H(-: