Pages: [1] 2   Go Down
Print
Author Topic: Esercizio lab.pdf !!!  (Read 3485 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
ciccio
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 143



« 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);
        }
   
}
Logged

"Non importa quanto vai piano, l' importante è che non ti fermi" (CONFUCIO)
Antoniods
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 475



« Reply #1 on: 24-01-2009, 17:54:02 »

yoh yoh yoh yoh yoh
« Last Edit: 24-01-2009, 17:55:45 by Antoniods » Logged

"Ho fallito diversi esami all'università, un mio amico li ha sempre passati tutti al primo colpo. Ora lui è ingegnere alla Microsoft, ed io... io sono il capo della Microsoft". (Bill Gates)
Blonic
Forumista
***
Offline Offline

Gender: Male
Posts: 868



WWW
« Reply #2 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);
Logged
MisteroLupo
Apprendista Forumista
**
Offline Offline

Posts: 273

Tra il dire e il fare c'è distanza di hamming 2.


« Reply #3 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?
Logged
maucel89
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 168


Non fare tu quello che può fare una macchina!!


« Reply #4 on: 28-01-2009, 18:09:21 »

Hai messo la classe C dentro la classe B..
mentre deve essere messa di segiuto...
 ok
Logged

MisteroLupo
Apprendista Forumista
**
Offline Offline

Posts: 273

Tra il dire e il fare c'è distanza di hamming 2.


« Reply #5 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..
Logged
Blonic
Forumista
***
Offline Offline

Gender: Male
Posts: 868



WWW
« Reply #6 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!
Logged
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.475


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #7 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 e java.awt.geom.Point2D.Float che estendono la classe java.awt.geom.Point2D 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 .
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
MisteroLupo
Apprendista Forumista
**
Offline Offline

Posts: 273

Tra il dire e il fare c'è distanza di hamming 2.


« Reply #8 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 .
Era proprio mia particolare intenzione, sono abituato a mettere le classi "figlie" dentro le classi "madri" e ho letto nel tutorial della sun che è una buona abitudine..
Ma non è questo il punto della discussione :x
reversengineer sai dirmi perché mi da quell'errore?
Logged
MisteroLupo
Apprendista Forumista
**
Offline Offline

Posts: 273

Tra il dire e il fare c'è distanza di hamming 2.


« Reply #9 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"  testate

Per gli altri: imparate ad annidare le classi no
« Last Edit: 28-01-2009, 19:25:28 by MisteroLupo » Logged
MisteroLupo
Apprendista Forumista
**
Offline Offline

Posts: 273

Tra il dire e il fare c'è distanza di hamming 2.


« Reply #10 on: 29-01-2009, 15:23:14 »

Up.. nessuno mi sa aiutare?
Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #11 on: 29-01-2009, 16:07:16 »

Per gli altri: imparate ad annidare le classi no
Se tu imparassi a non annidare le classi non avresti problemi no (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 Smiley
Logged

Diventa ciò che sei nato per essere
MisteroLupo
Apprendista Forumista
**
Offline Offline

Posts: 273

Tra il dire e il fare c'è distanza di hamming 2.


« Reply #12 on: 29-01-2009, 16:11:33 »

Se tu imparassi a non annidare le classi non avresti problemi no (scherzo)
boh

A te funziona? Avevo già provato senza classi annidate ma non va lo stesso..
Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #13 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
Logged

Diventa ciò che sei nato per essere
MisteroLupo
Apprendista Forumista
**
Offline Offline

Posts: 273

Tra il dire e il fare c'è distanza di hamming 2.


« Reply #14 on: 29-01-2009, 16:19:12 »

Il mistero si infittisce
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

OT: 100esimo post pc
Logged
Pages: [1] 2   Go Up
Print
Jump to: