[Java] programma Intervallo
Ciao a tutti!!
Sto facendo questo esercizio per l'esame di Fondamenti di informatica:
Scrivere una classe Java, di nome Intervallo, le cui istanze rappresentano
intervalli chiusi [a,b] di numeri interi relativi. Un oggetto Intervallo è definito tramite i suoi
due estremi, a e b. La classe Intervallo dovrà avere i seguenti metodi e costruttori.
• Un costruttore che consente di creare un oggetto Intervallo con estremi specificati.
• Il metodo di istanza void stampaIntersezione (Intervallo interv, OutputWindow out),
che visualizza nella finestra grafica passata come parametro tutti i numeri compresi
nell’intersezione dell’Intervallo ricevente con l’Intervallo interv, passato come
parametro.
Non mi dice di creare una classe per provare che questa funzioni ma cmq l'ho creata...e non funziona! La classe che io ho creato è:
come vedete ho fatto 4 casi con l'annidamento if-else, uno per ogni possibile caso di intersezione (secondo me potrebbe esserci un metodo meno pastrocchione ma mi è venuto in mente solo questo)....la classe di prova:
come dicevo, non funziona...o meglio funziona ma quando invoco su interv0 il metodo di stampaIntersezione l'unica cosa che mi scrive è "L'intersezione è: " che è la stringa che gli dico di stampare dalla classe Intervallo.
Secondo me il problema è che stampaIntervallo non capisce cosa siano le variabili "c" e "d" ma compila cmq perchè io le ho inserite tra le variabili di istanza.
cosa posso fare affinche mi stampi tutto e correttamente?
Grazie!!!
Sto facendo questo esercizio per l'esame di Fondamenti di informatica:
Scrivere una classe Java, di nome Intervallo, le cui istanze rappresentano
intervalli chiusi [a,b] di numeri interi relativi. Un oggetto Intervallo è definito tramite i suoi
due estremi, a e b. La classe Intervallo dovrà avere i seguenti metodi e costruttori.
• Un costruttore che consente di creare un oggetto Intervallo con estremi specificati.
• Il metodo di istanza void stampaIntersezione (Intervallo interv, OutputWindow out),
che visualizza nella finestra grafica passata come parametro tutti i numeri compresi
nell’intersezione dell’Intervallo ricevente con l’Intervallo interv, passato come
parametro.
Non mi dice di creare una classe per provare che questa funzioni ma cmq l'ho creata...e non funziona! La classe che io ho creato è:
class Intervallo{ private int a,b,c,d; public Intervallo(int a, int b){ this.a=a; this.b=b; } public void stampaIntersezione (Intervallo interv, OutputWindow out){ if(a<c && d>b){ out.write ("\nL'intersezione è: "); for(int i=c; i<=b; i++) out.write(i+", "); } else if(c<a && d<b){ out.write ("\nL'intersezione è: "); for(int i=a; i<=d; i++) out.write(i+", "); } else if(a<c && d<b){ out.write ("\nL'intersezione è: "); for(int i=c; i<=d; i++) out.write(i+", "); } else if(c<a && b<d){ out.write ("\nL'intersezione è: "); for(int i=a; i<=b; i++) out.write(i+", "); } else out.write ("Nessuna Intersezione"); } }
come vedete ho fatto 4 casi con l'annidamento if-else, uno per ogni possibile caso di intersezione (secondo me potrebbe esserci un metodo meno pastrocchione ma mi è venuto in mente solo questo)....la classe di prova:
class ProvaIntervallo{ public static void main (String[] args){ InputWindow in = new InputWindow(); OutputWindow out=new OutputWindow(); int a = in.readInt("Inserisci l'inizio dell'intervallo"); int b = in.readInt("Inserisci la fine dell'intervallo"); Intervallo interv0=new Intervallo(a,b); if(a>b) out.writeln("l'inizio dell'lntervallo è più grande della fine!!! Riprova!!"); else{ String s=("L'intervallo è: "); for(int i=a; i<=b;i++) s+=i+", "; out.writeln(s); } int c = in.readInt("Inserisci l'inizio di un nuovo intervallo"); int d = in.readInt("Inserisci la fine del nuovo intervallo"); Intervallo interv = new Intervallo (c,d); if(c>d) out.writeln("l'inizio dell'lntervallo è più grande della fine!!! Riprova!!"); else{ String s=("\nL'intervallo è: "); for(int i=c; i<=d;i++) s+=i+", "; out.writeln(s); } interv0.stampaIntersezione(interv, out); } }
come dicevo, non funziona...o meglio funziona ma quando invoco su interv0 il metodo di stampaIntersezione l'unica cosa che mi scrive è "L'intersezione è: " che è la stringa che gli dico di stampare dalla classe Intervallo.

Secondo me il problema è che stampaIntervallo non capisce cosa siano le variabili "c" e "d" ma compila cmq perchè io le ho inserite tra le variabili di istanza.
cosa posso fare affinche mi stampi tutto e correttamente?
Grazie!!!
Risposte
Anche io non capisco il senso di inserire le variabili c e d come variabili di istanza. Non funziona perché le usi ma non hai mai scritto nessun valore al loro interno per cui sono uguali al loro valore di default (cioè zero). Il problema non è quindi nella stampa ma nella definizione della tua classe e della funzione stampaIntervallo. Prova a sostituire c con out.a e d con out.b e dovrebbe già andare un po' meglio. Dopo vediamo se è corretta la logica con cui fai l'intersezione (secondo me è semplificabile).
"alex170":
come vedete ho fatto 4 casi con l'annidamento if-else, uno per ogni possibile caso di intersezione (secondo me potrebbe esserci un metodo meno pastrocchione ma mi è venuto in mente solo questo)....
Effettivamente, basterebbe calcolare gli estremi dell'intersezione:
estremo sinistro: il valore maggiore fra gli estremi sinistri dei due intervalli;
estremo destro: il valore minore fra gli estremi destri.
"alex170":
Secondo me il problema è che stampaIntervallo non capisce cosa siano le variabili "c" e "d" ma compila cmq perchè io le ho inserite tra le variabili di istanza
Infatti, noto che hai 4 valori private: $a$, $b$, $c$ e $d$... a cosa ti servono $c$ e $d$ se non vengono mai assegnati?
EDIT: praticamente, overlap con apatriarca

"apatriarca":
Anche io non capisco il senso di inserire le variabili c e d come variabili di istanza. Non funziona perché le usi ma non hai mai scritto nessun valore al loro interno per cui sono uguali al loro valore di default (cioè zero). Il problema non è quindi nella stampa ma nella definizione della tua classe e della funzione stampaIntervallo. Prova a sostituire c con out.a e d con out.b e dovrebbe già andare un po' meglio. Dopo vediamo se è corretta la logica con cui fai l'intersezione (secondo me è semplificabile).
se sostituisco come mi hai suggerito mi da come errore
cannot find symbol symbol : variable a location: class OutputWindow if(a<out.a && out.b>b){ ^
e non va ovviamente...
"Rggb":
[quote="alex170"]come vedete ho fatto 4 casi con l'annidamento if-else, uno per ogni possibile caso di intersezione (secondo me potrebbe esserci un metodo meno pastrocchione ma mi è venuto in mente solo questo)....
Effettivamente, basterebbe calcolare gli estremi dell'intersezione:
estremo sinistro: il valore maggiore fra gli estremi sinistri dei due intervalli;
estremo destro: il valore minore fra gli estremi destri.
"alex170":
Secondo me il problema è che stampaIntervallo non capisce cosa siano le variabili "c" e "d" ma compila cmq perchè io le ho inserite tra le variabili di istanza
Infatti, noto che hai 4 valori private: $a$, $b$, $c$ e $d$... a cosa ti servono $c$ e $d$ se non vengono mai assegnati?
EDIT: praticamente, overlap con apatriarca

infatti non vengono assegnati però altrimenti non riesco a dare l'inizio e la fine dell'intervallo interv dato come parametro...
buona idea è quella che proponi:
estremo sinistro: il valore maggiore fra gli estremi sinistri dei due intervalli;
estremo destro: il valore minore fra gli estremi destri.
ma mi resta il dubbio: come faccio a decidere il maggiore o il minore tra gli estremi senza inserire altre variabili? c e d mi servono comunque, no?
Avevo sbagliato a scrivere.. intendevo dire che dovevi usare interv.a e interv.b. Dovevi cioè usare le variabili membro della istanza interv e di quella corrente. Non riesco a capire la tua frase
Non ha alcun senso. interv già contiene al suo interno i valori del suo intervallo. È sbagliato pensare che c e d abbiano qualcosa a che fare con interv. Non c'è alcuna relazione tra di loro.
Ad esempio con le seguenti righe di codice.
oppure usando Math.min e Math.max nel modo seguente:
che credo siano implementate come le righe precedenti ma potrebbero essere più leggibili.
c e d NON ti servono. Sono un errore e basta.
infatti non vengono assegnati però altrimenti non riesco a dare l'inizio e la fine dell'intervallo interv dato come parametro...
Non ha alcun senso. interv già contiene al suo interno i valori del suo intervallo. È sbagliato pensare che c e d abbiano qualcosa a che fare con interv. Non c'è alcuna relazione tra di loro.
come faccio a decidere il maggiore o il minore tra gli estremi senza inserire altre variabili? c e d mi servono comunque, no?
Ad esempio con le seguenti righe di codice.
int min = a > interv.a ? a : interv.a; int max = b < interv.b ? b : interv.b;
oppure usando Math.min e Math.max nel modo seguente:
int min = Math.max(a, interv.a); int max = Math.min(b, interv.b);
che credo siano implementate come le righe precedenti ma potrebbero essere più leggibili.
c e d NON ti servono. Sono un errore e basta.
"apatriarca":
Avevo sbagliato a scrivere.. intendevo dire che dovevi usare interv.a e interv.b. Dovevi cioè usare le variabili membro della istanza interv e di quella corrente.
ah certo! chiaro, e quindi c e d non servono...cosa che cmq avevo capito solo che non avevo idea di come indicare le variabili dell'intervallo interv passato come parametro (c e d infatti non indicavo da nessuna parte e quindi non avevano valore...erano lì solo per occupare memoria

ah ecco! si avevo scritto male! non era inter.a ma interV.a...ora funziona...sembra...però se nessuno degli if è verificato (quindi se non c'è intersezione) non mi scrive "nessuna intersezione"...questo perchè, ad esempio, prendendo l'intervallo [5,10] e [1,4] 1 e 4 sono minori di 5 e 10 rispettivamente e questo caso è contempliato in un if...ma non scrive nulla perchè in effetti non ci sono numeri....come faccio a fargli scrivere "nessuna intersezione"?
Il codice che ho scritto calcola i due estremi $[min, max]$ nel caso in cui ci sia stata una intersezione. Ma può capitare che il massimo degli estremi di sinistra sia maggiore del minimo degli estremi di destra (che i due intervalli siano cioè disgiunti). In questo caso si avrà $max < min$ (probabilmente avrei dovuto usare dei nomi migliori per le variabili. Per verificare che ci sia stata intersezione è sufficiente verificare che min sia minore o uguale a max, in caso contrario non c'è stata intersezione e puoi stampare "nessuna intersezione".
ma questo sempre con if-else?
Certo, qualcosa come:
if (max < min) { out.writeln("Nessuna Intersezione"); } else { String s = "L'intervallo è: "; for (int i = min; i < max; ++i) { s += i + ", "; } s += max; out.writeln(s); }
"apatriarca":
Avevo sbagliato a scrivere.. intendevo dire che dovevi usare interv.a e interv.b. Dovevi cioè usare le variabili
Ad esempio con le seguenti righe di codice.
int min = a > interv.a ? a : interv.a; int max = b < interv.b ? b : interv.b;
comincio a capire..su questa stringa capisco fino a
int min = a > interv.a int max = b < interv.b
ma poi
? a : interv.a; ? b : interv.b;
a che servono?
Una riga del tipo
è equivalente a
Si chiama operatore ternario e l'ho usato perché più corto. Alcuni lo trovano un po' meno leggibile della forma con if e alcuni professori all'università lo ignorano per questo motivo.
A a = b ? a1 : a2;
è equivalente a
A a; if (b) { a = a1; } else { a = a2; }
Si chiama operatore ternario e l'ho usato perché più corto. Alcuni lo trovano un po' meno leggibile della forma con if e alcuni professori all'università lo ignorano per questo motivo.
"apatriarca":
Si chiama operatore ternario e l'ho usato perché più corto. Alcuni lo trovano un po' meno leggibile della forma con if e alcuni professori all'università lo ignorano per questo motivo.

Bah, alla fine è bene conoscerlo per capire il senso del codice quando lo trovi nei programmi, ma anche per me fa parte delle istruzioni "inutili". è estremamente illeggibile... non ho mai capito perché usare un operatore ternario piuttosto che un blocco if-else. Risparmiare tempo???? mah...
ah ecco...allora il mio prof l'ha ignorato
in effetti si capisce poco quello che fa...

ok allora così funziona!!
c'è un modo per renderlo meno pesante?

class Intervallo{ private int a,b; public Intervallo(int a, int b){ this.a=a; this.b=b; } public void stampaIntersezione (Intervallo interv, OutputWindow out){ int max; //massimo estremo dell'intersezione int min; //minimo estremo dell'intersezione if(a>interv.a) min=a; //poichè a>interv.a allora min=a quindi a sarà l'estremo minore dell'intersezione else min=interv.a; if(b>interv.b) max=interv.b; //stesse considerazioni del max else max=b; if(max>min){ //se il max estremo dell'intersezione è > del min allora esiste intersezione if(a<interv.a && interv.b>b){ out.write ("\nL'intersezione è: "); for(int i=interv.a; i<=b; i++) out.write(i+", "); } else if(interv.a<a && interv.b<b){ out.write ("\nL'intersezione è: "); for(int i=a; i<=interv.b; i++) out.write(i+", "); } else if(a<interv.a && interv.b<b){ out.write ("\nL'intersezione è: "); for(int i=interv.a; i<=interv.b; i++) out.write(i+", "); } else if(interv.a<a && b<interv.b){ out.write ("\nL'intersezione è: "); for(int i=a; i<=b; i++) out.write(i+", "); } } else //altrimenti non esiste intersezione e quindi darà: out.write ("\nNessuna Intersezione"); } }
"canemacchina":
Bah, alla fine è bene conoscerlo per capire il senso del codice quando lo trovi nei programmi, ma anche per me fa parte delle istruzioni "inutili". è estremamente illeggibile... non ho mai capito perché usare un operatore ternario piuttosto che un blocco if-else.
Intuisco che tu non abbia una grande esperienza di programmazione in certi linguaggi...

- Non è illeggibile, o meglio è solo una opinione; per me è utilissimo.
- Perché usarlo lo si capisce dall'esempio di apatriarca: la forma compatta evita di scrivere costrutti if() l'uno di seguito all'altro; per tante assegnazioni tutto diventa molto più leggibile.
c'è un modo per renderlo meno pesante?
Visto che hai assegnato $min$ e $max$, non vedo perché tu debba ricontrollare le casistiche per stampare i valori dell'intersezione che desideri.
- Se $max<=min$ non c'è intersezione (opinabile nel caso $max=min$, ma quello decidi tu);
- Se $max>min$ l'intersezione va da $min$ a $max$, è sufficiente quindi fare un ciclo che va da $min$ a $max$.
Ovvero: utilizza sempre ciò che hai già calcolato.
wow! grande! grazie mille! funziona tutto!


io l'ho fatto così, a me viene
public class Intervallo{
// variabili di istanza
private int a,b;
private int min = Math.max(a,b);
private int max = Math.min(a,b);
// costruttore
public Intervallo(int max, int min) {
this.max = max;
this.min = min;
}
// metodo
public void stampaIntersezione (Intervallo interv, OutputWindow out){
if (max>interv.max && min
for (int i=interv.min;i<=interv.max;i++){
int q =i;
out.write(q+", ");
}
}
else if (max>interv.max && min>interv.min) {
for (int j=min;j<=interv.max;j++){
int o=j;
out.write(o+", ");
}
}
else if (max
for (int k=interv.min;k<=max;k++){
int y =k;
out.write(k+", ");
}
}
else if (maxinterv.min) {
for (int l=min;l<=max;l++){
int h = l;
out.write(h+", ");
}
}
}
}
}
cllasse prova
public class IntervalloProva{
public static void main (String[] args)
{
InputWindow in = new InputWindow();
OutputWindow out = new OutputWindow();
int a = in.readInt("Inserire numero a ");
int b = in.readInt("Inserire numero b");
int c = in.readInt("Inserire numero c");
int d = in.readInt("Inserire numero d");
int q =Math.max(a,b);
int w =Math.min(a,b);
int e =Math.max(c,d);
int r =Math.min(c,d);
Intervallo interv1 = new Intervallo (q,w);
Intervallo interv2 = new Intervallo (e,r);
interv1.stampaIntersezione(interv2,out);
}
}
public class Intervallo{
// variabili di istanza
private int a,b;
private int min = Math.max(a,b);
private int max = Math.min(a,b);
// costruttore
public Intervallo(int max, int min) {
this.max = max;
this.min = min;
}
// metodo
public void stampaIntersezione (Intervallo interv, OutputWindow out){
if (max>interv.max && min
int q =i;
out.write(q+", ");
}
}
else if (max>interv.max && min>interv.min) {
for (int j=min;j<=interv.max;j++){
int o=j;
out.write(o+", ");
}
}
else if (max
int y =k;
out.write(k+", ");
}
}
else if (max
for (int l=min;l<=max;l++){
int h = l;
out.write(h+", ");
}
}
}
}
}
cllasse prova
public class IntervalloProva{
public static void main (String[] args)
{
InputWindow in = new InputWindow();
OutputWindow out = new OutputWindow();
int a = in.readInt("Inserire numero a ");
int b = in.readInt("Inserire numero b");
int c = in.readInt("Inserire numero c");
int d = in.readInt("Inserire numero d");
int q =Math.max(a,b);
int w =Math.min(a,b);
int e =Math.max(c,d);
int r =Math.min(c,d);
Intervallo interv1 = new Intervallo (q,w);
Intervallo interv2 = new Intervallo (e,r);
interv1.stampaIntersezione(interv2,out);
}
}