Pierwszy program figury geometryczne.

0

Od 2 miesięcy próbuję napisać swoją pierwszą aplikację w JAVIE ( wiadomo nie dzień w dzień ) i nie umiem. Jestem "rozpłakany" nie wiem co zrobić nic mi się nie układa w całość.
Ogólnikowo w głowie wiem jak to powinno wyglądać ale szczegółowo jak przychodzi do napisania to nic nie wychodzi nie wiem co z czym.
Na początek aplikacja powinna sumować długości kilku figur (prostokąt, trapez i trójkąt) po osi X. Zajrzałem do książki zrobiłem kurs z codcademy ( zbyt trywialne ) nic mi nie pomaga nie wiem.
Proszę o pomoc jak to powinno wyglądać?

0

Jakiego rodzaju aplikację? Konsolową czy GUI (Swing, JavaFX)?

0

konsolową bo prościej

0

Mógłbyś nieco dokładniej nakreślić na czym polega Twój problem? Wrzuć jakieś kawałki kodu (nawet jeżeli się nie kompiluje) tak żebyśmy mogli nakreślić co masz na myśli. Bo z opisu dla mnie to wygląda niczym

 public static void main(String[] args) {
		int dlugoscTrapezu = 5;
		int dlugoscKwadratu = 4;
		int dlugoscTrojkatu = 2;
		System.out.println(dlugoscTrapezu + dlugoscKwadratu + dlugoscTrojkatu);
	}
0

Swego, czasu zrobiłem takie rozwiązanie w Pythonie**.** Opis i źródła tutaj**:** https://github.com/Jeremy1980/LDShapeGenerator/wiki/Geometry**.** Ogólnie jeżeli matematyka nie była twoim ulubionym przedmiotem to bym odpuścił temat**.** Tutaj znajdziesz przyjazny kod**:**

  1. http://prace.lukispot.cba.pl/pola-i-objetosci-figur-java/
  2. Program obliczający obwody i pola figur geometrycznych
0

"powinna sumować długości kilku figur (prostokąt, trapez i trójkąt) po osi X"

  • to rozumiem że wystarczy znaleźć min i max wartości X dla każdej z figur, odjąć od siebie, dodać 1 i zsumować.
0

No tak. Na sam poczatek. Tyle że będę rozbudowywać tą aplukacje. To nie może być tak po prostu jak ktoś wyżej napisał mi kod.(To jest kontynuacją myśli z mojego poprzedniego, pierwszego posta. Teraz jestem w pracy na telefonie to nic nie podlinkuje i nie skopiuje)
To będzie tak:
Switch który daje opcję wyboru jednej z trzech figur.
Następnie podaje się jej wymiary
Znowu Switch i wybór kolejnej figury ( doklejana do poprzednej po osi x)
...
Zakończ i wynik.
Później dodam sobie koleją oś i jakieś bajery.

0

Acha czyli to już koniec porad

0

Ok zatem w czym masz problem? Wczytywać dane z konsoli potrafisz, robisz pętle i pytasz użytkownika o akcje "Wybierz figurę: p, k, t lub zakończ sumowanie: q". W switchu sobie sprawdzasz co przekazał użytkownik i odpowiednio pobierasz dane bądź opuszczasz pętle i wypisujesz wynik. Jeżeli to jakaś figura to do ogólnej sumy dodajesz nowa wartość i wszystko.

Oczywiście to taka najprostsza implementacja, ale z Twoich postów nie jestem w stanie stwierdzić co potrafisz.

2

Jak zajmiesz się tym na poważnie i napiszesz chociaż ze dwie linijki kodu to pewnie ktoś Ci pomoże.
Póki co możemy tylko współczuć.

0

W moim wczorajszym poście. Odnośniki do artykułów tobie zapodałem. Są to gotowce, które można "odpalić" używając nawet zwykłego notatnika. Do nauki i dalszego rozwoju, zupełnie wystarczy.
Jeżeli tego, nie łykasz to odpuść sobie programowanie.

  1. Program obliczający obwody i pola figur geometrycznych
  2. http://prace.lukispot.cba.pl/pola-i-objetosci-figur-java
0

Na początek aplikacja powinna sumować długości kilku figur (prostokąt, trapez i trójkąt) po osi X.

jak to po osi X? Weź to narysuj.
No i jakie dane masz na wejściu? (tak jak w zadaniu matematycznym - co jest dane, a co szukane?).

Na początek aplikacja powinna sumować długości kilku figur (prostokąt, trapez i trójkąt) po osi X.

Dziel i rządź.
Olej na razie kilka figur i zrób jedną, np. prostokąt. Potem myśl co dalej. Np. trójkąt. Potem trapez.
Będzie ci latwiej myśleć o 1 problemie naraz.
I olej na razie switch i wybór kolejnej figury.

Zawsze możesz potem zrobić od nowa program, który obsługuje wszystkie 3 figury, ale będziesz miał już wiedzę jak to zrobić.

konsolową bo prościej

może i prościej, ale łatwiej mogłoby być zrobić program, który rysuje na ekranie graficznie te figury, wtedy byś mógł łatwiej go debugować.

0

Zrobiłbym najpierw tylko prostokąt same prostokąty ile sobie użytkownik zazyczy. Ale właśnie z tym mam problem (uczę się ) i to musi być obiektowo. Bo tak strukturalnie to umiem ale nie nada się to do dalszego rozwoju aplikacji

0
paski zielone napisał(a):

Zrobiłbym najpierw tylko prostokąt same prostokąty ile sobie użytkownik zazyczy. Ale właśnie z tym mam problem (uczę się ) i to musi być obiektowo. Bo tak strukturalnie to umiem ale nie nada się to do dalszego rozwoju aplikacji

Napisz to strukturalnie.
Potem jak będzie działać to się zastanów jak to zrobić obiektowo.

Na pocieszenie dodam że w starej Javie ludzie piszą zawodowo strukturalnie (proceduralnie).

  1. używają utils
  2. definiują kontekst (taki worek w którym lecą nie wiadomo jakie dane)

Nie jest to piękne ani rozwojowe, nie nadaje się do TDD, ale i tak to nikomu nie przeszkadza.
Jak dopiero zaczynasz to nie przejmuj się formą, ważna jest najpierw treść.

0

Skoro ma być obiektowo to zastanów się jaką stworzyć abstrakcję, tak żeby łatwo z każdej "możliwej" figury dało się wyciągnąć tą "długość po osi X" (zakładam że chodzi Ci o przypadek który @LukeJL i @vpiotr rozważali kilka postów wyżej).

Rzuć też okiem na BlueJ, takie proste IDE nieco ułatwiające przestawienie się na obiektowość.

0
package simpleFrame;

public class Figura {
    String imie;
    double z;
    double x;
    public Figura (String i, double z, double x )
    {
        //String imie;
        //double z;
        //double x;
}}

package simpleFrame;

public class Main {
    public static void main(String args[]){
        Figura[] figury = new Figura[0];
        figury [0] = new Figura("pierwsza", 5,5 );
        System.out.println("Długość X:" +figury.x+);
    }
}

powiedzmy ze mam na początek coś takiego. Przy okazji mam błąd "Error:(9, 42) java: cannot find symbol
symbol: variable Figura
location: class simpleFrame.Main"
Nie chce mi x wyświetlić. A bez tego "x" moim zdaniem powinno wyświetlić się sam string "Długość X:" no ale nic się nie wyświetla tylko ile sekund trwał program...

0

Na początek trochę lepsza wersja:

public class Figura {
    private String imie;
    private double z;
    private double x;

    public Figura (String imie, double z, double x )
    {
        this.imie = imie;
        this.z = z;
        this.x = x;
    }

    public static void main(String args[]){
        Figura[] figury = new Figura[1];
        figury [0] = new Figura("pierwsza", 5, 5);
        System.out.println("Długość X:" +figury.x);
    }
}

(nie testowałem)

0
paski zielone napisał(a):
package simpleFrame;

public class Figura {
    String imie;
    double z;
    double x;
    public Figura (String i, double z, double x )
    {
        //String imie;
        //double z;
        //double x;
}}

W konstruktorze nie ustawiasz wartości dla pól tego obiektu (this.imie = i).

paski zielone napisał(a):
package simpleFrame;

public class Main {
    public static void main(String args[]){
        Figura[] figury = new Figura[0];
        figury [0] = new Figura("pierwsza", 5,5 );
        System.out.println("Długość X:" +figury.x+);
    }
}

Tworzysz tablicę o wielkości 0, to nie jest najlepsze rozwiązanie (a w tym przypadku niedziałające).
figury.x próbujesz pobrać wartość pola x dla tablicy (to się nie uda), musisz pierw pobrać element. figury[0].x powinno pomóc.
No i ten zapodziany plus w println, do usunięcia.

0
vpiotr napisał(a):

Na początek trochę lepsza wersja:

public class Figura {
    private String imie;
    private double z;
    private double x;
...

Ze słowem private nie działa "Error:(9, 50) java: x has private access in simpleFrame.Figura"
W sumie dziwne bo niby jak nie ma public to znaczy automatycznie że private.

0

Postanowiłem zrobić kolejny kroczek ale system.out.println nie działa - Error:(24, 17) java: orphaned default
I po zatym jak pozwolić teraz na wybranie kilku krotnie np trójkąta ? może najpierw podpowiedź żebym sam znalazł odpowiedź i doszedł.
No i jak w pamięci zapisać "x" przecież to mi się nie zapisze...

package simpleFrame;
import java.util.*;
import static java.lang.System.out;

/**
 * Created by *** on 2017-09-18.
 */
public class Main {
    public static void main(String args[]){

        Scanner in = new Scanner(System.in);
        out.print("Wybierz opcję : 1-Trojkat, 2-Prostokat, : ");
        int choice = in.nextInt();
        switch (choice){
            case 1 : {

                Figura[] trojkat = new Figura[3];
                trojkat[0] = new Figura("pierwsza", 6, 6);

                break;
            }
            case 2: {
                Figura[] prostokat = new Figura[3];
                prostokat[0] = new Figura("druga", 5, 5);
                break;
                // default: System.out.print("Cos poszlo nie tak!");
            }
            System.out.println("Suma długość po X:"+(trojkat[0].x +prostokat[0].x ) );
    }

}}
0
paski zielone napisał(a):

W sumie dziwne bo niby jak nie ma public to znaczy automatycznie że private.

Nie private a package-private

paski zielone napisał(a):

Postanowiłem zrobić kolejny kroczek ale system.out.println nie działa - Error:(24, 17) java: orphaned default

        switch (choice){
            case 1 : {
                Figura[] trojkat = new Figura[3];
...
            }
            System.out.println("Suma długość po X:"+(trojkat[0].x +prostokat[0].x ) );

Zły zasięg zmiennej (tablicy). W dodatku do takiego zadania lepszą strukturą danych powinna być Lista, nie musisz się przejmować jej wielkością, a w dodatku implementuje Iterable dzięki czemu da się ją łatwo przeiterować w pętli (ew. użyć Stream).

paski zielone napisał(a):

I poza tym jak pozwolić teraz na wybranie kilku krotnie np trójkąta ? może najpierw podpowiedź żebym sam znalazł odpowiedź i doszedł.

Robisz pętlę, warunkiem wyjścia może być np sytuacja gdy użytkownik wpisze 0 jako polecenie.

paski zielone napisał(a):

No i jak w pamięci zapisać "x" przecież to mi się nie zapisze...

Gdzie chcesz to zapisać? Utwórz sobie zmienną "sumaX" do której będziesz dodawał kolejne długości, na końcu programu wypiszesz jej wartość.

Edit. @vpiotr racja, dzięki za zwrócenie uwagi.

0

@AreQ212:
Dodałem opcje "...kilku trójkątów". Reszta jutro bo za późno się zabrałem za to..
A co do "... lepsza struktura danych Lista" to chodzi Ci o taką tablicę? i w jakim celu miałbym jej użyć? Zamiast zapisywania wartości double do "z" i do "x" tak?

package simpleFrame;
import java.util.*;

import static java.lang.System.exit;
import static java.lang.System.out;


public class Main {
    public static void main(String args[]){
for (;;){
        Scanner in = new Scanner(System.in);
        out.print("Wybierz opcję : 1-Trojkat, 2-Prostokat, 0 - Exit: ");
        int choice = in.nextInt();
        switch (choice){
            case 1 :

                Figura[] trojkat = new Figura[3];
                trojkat[0] = new Figura("pierwsza", 6, 6);


                break;

            case 2:
                Figura[] prostokat = new Figura[3];
                prostokat[0] = new Figura("druga", 5, 5);
                break;
            case 0: exit(0);
                 default: System.out.println("Cos poszlo nie tak!");

            //System.out.println("Suma długość po X:"+(trojkat[0].x +prostokat[0].x ) );

    }

}}}
0

Coś nie tak tam wpisuje bo się nie kompiluje. Usunąłem string imie bo myslalem ze to jest problem ale nie.

Error:(36, 10) java: constructor Figura in class simpleFrame.Figura cannot be applied to given types;
required: double,double
found: no arguments
reason: actual and formal argument lists differ in length

public class Main {
    public static void main(String args[]){

for (;;){
        Scanner in = new Scanner(System.in);

    ArrayList<Figura> list = new ArrayList<>();

    out.print("Wybierz opcję : 1-Trojkat, 2-Prostokat, 0 - Exit: ");
        int choice = in.nextInt();
        switch (choice){
            case 1 :

                Figura[] trojkat = new Figura[3];
                trojkat[0] = new Figura(/*"pierwsza",*/ 6, 6);


                break;

            case 2:
                Figura[] prostokat = new Figura[3];
                prostokat[0] = new Figura(/*"druga",*/ 5, 5);
                break;
            case 0: exit(0);
                 default: System.out.println("Cos poszlo nie tak!");
list.add(new Figura()); // COŚ NIE TAK! Error 36

            //System.out.println("Suma długość po X:"+(trojkat[0].x +prostokat[0].x ) );

    }
    Figura[] trojkat = new Figura[list.size()];
    list.toArray(trojkat);
}}}

0

Wywołujesz konstruktor bez parametrów a masz tylko jeden - z parametrami.
Dodaj bezparametrowy konstruktor jeśli taki chcesz używać.

0

Jestem też początkujący, jednak to chyba nawet lepiej bo pamiętam swoje problemy. Ogólnie poczytaj konkretnie o obiektowości i kup jakąś książkę odnośnie samego języka(nie musisz jej całej przerabiać bo zagadnienia do takiego projektu są opisane w kilku początkowych tematach a dodatkowo możesz coś na szybko poszukać w internecie), bo jeśli przez dwa miesiące masz takie problemy to po prostu za mało się przykładasz i zamiast poważnie zastanowić i zrozumieć przykłady, których jest wystarczająco w książce (w przeciwieństwie do kursu) to chcesz to zrobić na skróty "bo powinno działać" a tak się niestety nie da i tracisz jeszcze więcej czasu.Z własnego doświadczenia wiem, że jeśli naprawdę rozwiążesz sam taki problem, który jest dosyć łatwy to przygotujesz się do trudniejszych zadań które się pojawią w sumie dosyć szybko. Nie chce, żebyś odebrał to jako krytykę i być może uznasz ,że nic nie wnoszę do tematu, ale ogólnie myślę, że główna trudność nie leży w samym projekcie tylko w Twoim podejściu.

0

@mic1996: może i masz racje. Ale dzięki wam i dzieleniu się z wami kodem lepiej się czuje pisząc to

0

To jest bezsensu. Uzupełniłem sobie konstruktor w klasie Figura

public class Figura {
   String imie;
    double z;
    double x;
    
    public Figura (String imie, double z, double x  )
    {
        this.imie = "figurka";
        this.z = 5;
        this.x = 1;
}}

Więc już z obiektów trójkąt i prostokat chciałem powyrzucać z konstruktora

...
case 1 :

                Figura[] trojkat = new Figura[3];
                trojkat[0] = new Figura(*/ to chcialem wyrzucic */);
                ...
                break;
...

a tu nie mogę bo błąd jakiś. to po co mi ten konstuktor w klasie skoro i tak później w obiektach muszę znowu te pola wypełniać?
I tak to co wpisuje w konstruktorze obiektu nie działa bo "ciągnie" dane z klasy.

1

Pisałem wcześniej, poczytaj o podstawach to są rzeczy banalne na które odpowiedź znajdziesz w pierwszym lepszy poradniku po prostu robisz błędy tak oczywiste, że to nie wynika nawet z jakiejś trudności tylko lekceważącego podejścia, jeśli już teraz tak zaczynasz to po prostu zastanów się czy na pewno chcesz to robić.

Odnośnie kodu, to podajesz jako argumenty x i z a później nawet ich nie używasz, bo odwołujesz się tylko do wartości z klasy. W konstruktorze są po to argumenty, żeby można było samemu ustalić te wartości przy tworzeniu obiektów, więc według mnie powinno być coś takiego:

this.x = x ; gdzie x jest parametrem przekazanym do konstruktora a tak przekazujesz parametr i nawet go nie wykorzystujesz, bo przypisujesz już jakieś wartości, pisze kolejny raz...poczytaj o podstawach, żebyś wiedział do czego to wszystko służy. A jeśli chcesz mieć konstruktor bez argumentów to musisz sam napisać oprócz tego z argumentami ten domyślny bez argumentów.

Proszę, żeby ktoś mnie poprawił, jeśli piszę głupoty ale uważam, że mam racje, jeśli chodzi o błędy.

0

Ja zrozumiałem że w konstruktorze klasy podaje się właśnie wartości żeby już później przy tworzeniu obiektów nie trzebabylo tego robić ... Nawet był taki przyklad w cpp. Zresztą i tak to nie dziala.
A poza tym te wartości będą i tak wpisywane już w programie.
I chyba tak nie jest że mogę sobie w konstruktorze wpisać domyślne ale później w programie zdecydować że sobie wpisze inne

0

Napisałem przykład który działa i pozwoli Ci zobaczyć mam nadzieję o co chodzi:

public class Figura
{
int x;
int y;

public Figura(int x, int y) //tutaj chcesz sobie sam ustawić współrzędne przy tworzeniu nowego obiektu, żeby nie tworzyć na przykład 10 klas z 
{                                     //różnymi współrzędnymi
    this.x = x;
    this.y = y;
}

public Figura() //tutaj masz ustalone współrzędne w konstruktorze domyślnym ale jak już chcesz tak robić to lepiej mieć pusty konstruktor domyślny
{                       // czyli public Figura(){}  i ustawić te wartości na samej górze przy x i y
    this.x = 1;
    this.y = 10;
}

public void wspolrzedne()
{
    System.out.println("x = " + this.x+"y = "+ this.y);
}

}
takie coś działa, czyli tam gdzie chcesz ustawić nowe wartości masz konstruktor z argumentami, przecież jak ustawisz sobie stałe wartości to figura będzie w sumie identyczna dlatego musisz się zastanowić jakiego konstruktora potrzebujesz.

public class Main
{

public static void main(String[] args)
{
    Figura figura1 = new Figura();
    figura1.wspolrzedne();

    Figura figura2 = new Figura(13,15);
    figura2.wspolrzedne();


}

}

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