Zadanie. Operacje na przedziałach liczb

0

Hej, szukałem na forum ale niestety nie znalazłem pełnej odpowiedzi, tylko fragment.

Zadanie mam na 1 roku studiów z programowania Javy.

Nie mogę zmieniać nic w kodzie oprócz miejsc gdzie mam wprowadzić kod. wiem że nie jest to kod zgodnie z konwencją.

Dane są dwa przedziały domknięte liczb rzeczywistych o końcach całkowitych: p1, p2. Napisać program określający początek, koniec przedziałów oraz iloczyn teoriomnogościowy p1, p2 (początek zawsze jest nie większy niż koniec). Końce przedziałów a1, b1, a2, b2 podać w inicjacji odpowiednich zmiennych (typu int) w programie.

Stworzyć klasę Przedzial w taki sposób, aby następująca metoda main z klasy Main:

'''public class Main {
public static void main(String[] args)
{
int a1 = 4 /*<- jeden koniec pierwszego przedziału /;
int b1 = 2 /
<- drugi koniec pierwszego przedziału /;
int a2 = 3 /
<- jeden koniec drugiego przedziału /;
int b2 = 5 /
<- drugi koniec drugiego przedziału */;

Przedzial p1 = new Przedzial(a1,b1), p2 = new Przedzial(a2,b2);
	
System.out.println("Przedział " + p1 + " ma " + "początek " + p1.poczatek() + " i koniec " + p1.koniec());
	
System.out.println("Przecięcie " + p1 + " i " + p2 + " = " + (p1.przeciecie(p2)!=null?p1.przeciecie(p2):"pusty przedział"));	
}

}
wyprowadziła prawidłową informację według następującego formatu:

Przedział [2,4] ma początek 2 i koniec 4
Przecięcie [2,4] i [3,5] = [3,4]
Metoda przeciecie(...) klasy Przedzial powinna zwrócić null w przypadku rozłącznych przedziałów.

public class Przedzial {
private int pocz, koniec;

public Przedzial(int a, int b)
{
/*<-  kod konstruktora */
}

Przedzial przeciecie(Przedzial p)
{
/*<-  kod metody przeciecie(...) */
}

/*<-  kod innych metod */

}'''

Moje rozwiązanie:
public Przedzial(int a, int b) {
this.pocz = a;
this.koniec = b;

}

// Przedzial przeciecie(Przedzial p) {
//
//
// /*<- kod metody przeciecie(...) */
// }

public int poczatek() {
    return Math.min(pocz, koniec);
}

public int koniec() {
    return Math.max(pocz, koniec);
}
/*<-  kod innych metod */

}

Pytanka mam dwa:

  1. Dlaczego funkcja print wyświetla mi "Przedział‚ Zadania1.Zad2.Przedzial@eed1f14 ma początek 8 i koniec 9" zamiast podać wartość przedziału?
  2. jak zrobić drugą część z przecięciem? zakładam że jakoś musze uzupełnić tablicę albo liste?
3

Takie coś Przedział‚ Zadania1.Zad2.Przedzial@eed1f14 wyświetla się, gdy wstawisz do łańcucha znakowego obiekt, co zrobiłeś w tej linijce:

System.out.println("Przedział " + p1 + " ma " + "początek " + p1.poczatek() + " i koniec " + p1.koniec());

Przecięcie zakresów zrobiłbym tak (bez gwarancji):

Przedzial przeciecie (Przedzial p)
{
  int pocz_przeciecia = pocz, koniec_przeciecia = koniec;
  if (p.pocz > pocz)
    pocz_przeciecia = p.pocz;
  if (p.koniec < koniec)
    koniec_przeciecia = p.koniec;
 return new Przedzial (pocz_przeciecia, koniec_przeciecia);
}
0

@Manna5: Dzięki za odpowiedź, taki kod dostałem w zadaniu i niby nic tam nie można zmienić, ale też wydawało mi się że to tak nie zadziała. A mógłbyś podpwiedzieć jeszcze jak ten obiekt zamienić bo coś mi nie idzie.

Powinno sie wyświetlać:

Przedział [2,4] ma początek 2 i koniec 4
Przecięcie [2,4] i [3,5] = [3,4]

A teraz jest tak:
Przedział‚ Zadania1.Zad2.Przedzial@7ef20235 ma początek 8 i koniec 9
Przecięcie Zadania1.Zad2.Przedzial@7ef20235 i Zadania1.Zad2.Przedzial@10f87f48 = Zadania1.Zad2.Przedzial@b4c966a

0

Podaj proszę kod całej klasy a nie tylko fragmenty.

0

package Zadania1.Zad2;

public class Przedzial {

private int pocz, koniec;


public Przedzial(int a, int b) {
    this.pocz = a;
    this.koniec = b;
}

Przedzial przeciecie(Przedzial p) {
    int pocz_przeciecia = pocz, koniec_przeciecia = koniec;
    if (p.pocz > pocz)
        pocz_przeciecia = p.pocz;
    if (p.koniec < koniec)
        koniec_przeciecia = p.koniec;
    return new Przedzial(pocz_przeciecia, koniec_przeciecia);
}

public int poczatek() {
    return Math.min(pocz, koniec);
}

public int koniec() {
    return Math.max(pocz, koniec);
}

}

0

package Zadania1.Zad2;

public class Main {
public static void main(String[] args) {
int a1 = 8 /*<- jeden koniec pierwszego przedziału /;
int b1 = 9 /
<- drugi koniec pierwszego przedziału /;
int a2 = 0 /
<- jeden koniec drugiego przedziału /;
int b2 = 0 /
<- drugi koniec drugiego przedziału */;

    Przedzial p1 = new Przedzial(a1, b1), p2 = new Przedzial(a2, b2);

    System.out.println("Przedział‚ " + p1 + " ma " + "początek " + p1.poczatek() + " i koniec " + p1.koniec());
    System.out.println("Przecięcie " + p1 + " i " + p2 + " = " +
            (p1.przeciecie(p2)!=null?p1.przeciecie(p2):"pusty przedział‚"));

    }
}
0

to jest caly kod

0
System.out.println("Przedział [" + p1.poczatek() + "," + p1.koniec() + "] ma " + "początek " + p1.poczatek() + " i koniec " + p1.koniec());
System.out.println("Przeciecie [" + p1.pocztaek() + "," + p1.koniec() + "] i [" + p2.poczatek() + "," + p2.koniec() + "] = [" + p1.przeciecie(p2).poczatek() + "," + p1.przeciecie(p2).koniec() +"]");
0

@Manna5: No tak ;) Dzięki

0

Co zwraca ten kod dla przedziałów rozłącznych np. [1, 1] i [2, 2]?

0

@Charles_Ray:
Przedział [1,1] ma początek 1 i koniec 1
Przeciecie [1,1] i [2,2] = [1,2]

teraz kombinuje z warunkiem aby juz dobrze wskazywał, ale Manna5 dał mi wskazówkę

0

No to błąd, bo to jest suma, a nie przecięcie. Przecięcie to cześć wspólna, która tutaj jest pusta. Po drugie, dla 1,1 i 5,6 tez dostaniesz 1,6, co jest bzdurą ;)

Po trzecie - ogarnij kolejność w konstruktorze, nie będziesz musiał za każdym razem wyliczać co jest początkiem, a co końcem. To się nazywa niezmiennik.

0

@Charles_Ray: Nie wiem czy mogę sobie tak zmienić jak chce, ten kod jest później automatycznie sprawdzany, a tam możliwe ze musi być kolejność zachowana.... to są zadania ze studiów one nie zawsze maja pokrycie z rzeczywistością, niestety ;/

Jutro mam konsultację to się podpytam czy mogę coś zmieniać nawet w Mainie, czy musze tylko w zaznaczonych miejscach.

0

A nie zmieniając tego fragmentu:
package Zadania1.Zad2;

public class Main {
public static void main(String[] args) {
int a1 = 8 /<- jeden koniec pierwszego przedziału /;
int b1 = 9 /<- drugi koniec pierwszego przedziału /;
int a2 = 0 /<- jeden koniec drugiego przedziału /;
int b2 = 0 /<- drugi koniec drugiego przedziału /;

Przedzial p1 = new Przedzial(a1, b1), p2 = new Przedzial(a2, b2);

System.out.println("Przedział‚ " + p1 + " ma " + "początek " + p1.poczatek() + " i koniec " + p1.koniec());
System.out.println("Przecięcie " + p1 + " i " + p2 + " = " +
        (p1.przeciecie(p2)!=null?p1.przeciecie(p2):"pusty przedział‚"));

}

}

Czy da się jakoś to poprawnie wyświetlić?
Uwaga jest do zadania
Ważne: Kod klas Main, Przedzial utworzony przez generator może (i musi) być zmieniony tylko w miejscach zaznaczonych na zielono. Inne modyfikacje tego kodu nie są dopuszczalne i będą skutkować uzyskaniem 0 punktów.
a te elementy nie są na zielono ;/

0

Rozwiązanie dla potomnych ;)

public class Przedzial {

private int pocz, koniec;

public Przedzial(int a, int b) {
    this.pocz = Math.min(a, b);
    this.koniec = Math.max(a, b);
}

Przedzial przeciecie(Przedzial p) {
    int poczatekA = this.poczatek();
    int poczatekB = p.poczatek();
    int koniecA = this.koniec();
    int koniecB = p.koniec();

    if (poczatekB >= poczatekA && koniecB <= koniecA) {
        return p;
    } else if (poczatekA >= poczatekB && koniecA <= koniecB) {
        return this;
    } else if (poczatekB <= koniecA && koniecB >= koniecA) {
        return new Przedzial(poczatekB, koniecA);
    } else if (poczatekA <= koniecB && koniecA >= koniecB) {
        return new Przedzial(poczatekA, koniecB);
    }
    return null;
}

public int poczatek() {
    return pocz;
}

public int koniec() {
    return koniec;
}

public String toString() {
    return String.format("[%d,%d]", pocz, koniec);
}

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1