Heimübung (JAVA) *VERZWEIFLUNG*

crazypaddy

Banned
Registriert
Sep. 2012
Beiträge
1.182
Servus Leute,

ich bräuchte falls möglich mal eure Hilfe für meine Freundin.

Es geht um Aufgabe 2.

Meine Freundin hat bereits eine Methode drawLine geschrieben, die auch das geforderte Muster ausgibt, jedoch nur in der 0-ten Zeile wiederholt die # printed.

Mit Hilfe der Gleichung soll die nächste Y-Position des Punktes berechnet werden, jedoch ist das wegen der Gleichung immer 0. Somit verschiebt sich Y nicht und es kommt nicht das geforderte Ergebnis raus.
Die Werte im Beispiel für x1, y1, x2 und y2 bleiben ja immer konstant, deswegen steht (mit Java-Rundung) im ersten Teil immer die 0, auch wenn x sich ändert... und die Multiplikation mit 0 bringt uns natürlich ebenfalls 0.

Könnt ihr mir sagen, ob etwas an der Gleichung falsch ist, oder eine Lösung vorschlagen?

(Der Dozent mit dem sie bereits gesprochen hat, hat dazu nur gesagt, dass die Größe die für das Muster angegeben ist, falsch herum ist. Das bedeutet in dem Beispiel auf dem Blatt müsste das Muster 10x5 groß sein. (Heißt der Array hat 10 Stellen für X und 5 Stellen für Y)

Danke euch vorab. :freak::confused_alt::heul:
 

Anhänge

  • Unbenannt111.PNG
    Unbenannt111.PNG
    146,5 KB · Aufrufe: 419
  • Unbenannt.PNG
    Unbenannt.PNG
    145,9 KB · Aufrufe: 441
Hab mir jetzt nicht alles durchgelesen, aber wenn es darum geht, ob die Geradengleichung richtig ist? JA ist sie:
https://de.wikipedia.org/wiki/Geradengleichung

Gibt es denn schon Code, wenn ja mit [CODE=java][/CODE] posten.
ansonsten gilt aber:
Nicht erwünscht sind unter anderem:
  • Das Fragen nach Lösungen für Hausaufgaben, Übungszettel, Prüfungen etc. Zumindest dann nicht, wenn keine erhebliche Eigenleistung erkennbar ist.
https://www.computerbase.de/forum/help/terms/
 
Zuletzt bearbeitet:
Bei Heimübungen scheiden sich die Geister, ob man helfen soll oder nicht. Ein Tipp: Wenn man schon Hilfe erwartet, könnte man zumindest das bisher geschriebene Programm auch posten.
 
  • Gefällt mir
Reaktionen: Yogi666 und Dimitri Kostrov
Du willst von x = (0, 1, ..., 9) das entsprechende y Wissen. Das bekommst du doch einwandfrei durch die Geradengleichung geliefert. Das Beispiel auf dem Arbeitsblatt bei Aufgabe 2 z.B. kann man so doch problemlos nachvollziehen?
 
crazypaddy schrieb:
Mit Hilfe der Gleichung soll die nächste Y-Position des Punktes berechnet werden, jedoch ist das wegen der Gleichung immer 0. Somit verschiebt sich Y nicht und es kommt nicht das geforderte Ergebnis raus.
Die Werte im Beispiel für x1, y1, x2 und y2 bleiben ja immer konstant, deswegen steht (mit Java-Rundung) im ersten Teil immer die 0, auch wenn x sich ändert... und die Multiplikation mit 0 bringt uns natürlich ebenfalls 0.

Ok - nur mal so: Wie gross ist eure Zeichenfläche und was versucht ihr für eine Linie zu zeichnen? (Start- und Endpunkt)
 
Jetzt mal ehrlich, ich hätte da einen super Tipp: "Passen Sie bei der Auswertung der Geradengleichung im Programm auf, dass bei der ganzzahligen Division nicht zu früh abgerundet wird, da dies das Ergebnis verfälschen würde."
 
Das ist das lauffähige Programm, das aber nicht die gewünschte Lösung ausgibt.
Ergänzung ()

Nilson schrieb:
Hab mir jetzt nicht alles durchgelesen, aber wenn es darum geht, ob die Geradengleichung richtig ist? JA ist sie:
https://de.wikipedia.org/wiki/Geradengleichung

Gibt es denn schon Code, wenn ja mit [CODE=java][/CODE] posten.
ansonsten gilt aber:

https://www.computerbase.de/forum/help/terms/


Nicht gelesen. Die versuchte Lösung is eingereicht :) Hat schon einige Stunden auf dem Buckel.
Ergänzung ()

@jumpin -> Siehe unten

@simpsonsfan -> Sie hat versucht es in einer float zu speichern und es erst danach in eine int zu packen, rundet aber trotzdem auf 0. Gibt es da noch andere Wege? So weit ist Sie noch nicht im Thema.

@All: Sie braucht nicht unbedingt eine Lösung. Sie bräuchte nur nen Rat, wie sie die Y-Gleichung so anpassen kann, dass nicht immer auf 0 gerundet wird..

Ich schätze mal: Wenn man mehrere Stunden davor sitzt, sieht man Fehler einfach nicht mehr?


Java:
import java.util.Scanner;

public class Uebung {

    public static char[][] newCanvas(int height, int width) {
        int h = height;
        int w = width;
        char[][] charArray = new char[h][w];

        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                if (i == 0 || i == h-1) {
                    for (int b = 0; b < w; b++) {
                        charArray[i][b] = '*';
                    }
                }
                else if (j == 0 || j == w-1) {
                    charArray[i][j] = '*';
                }
                else if (j > 0 || j < w-2) {
                    for (int b = 1; b < w; b++) {
                        charArray[i][b] = ' ';
                    }
                }
            }
        }

        return charArray;

    }

    public static void printCanvas(char[][] canvas) {
        char[][] canvasArray = canvas;
        for (int i = 0; i < canvasArray.length; i++) {
            for (int j = 0; j < canvasArray[i].length; j++) {
                System.out.print(canvasArray[i][j]);
            }
            System.out.println();
        }
    }

    public static void drawPoint(char[][] canvas, int x, int y) {
        for (int i = 0; i < canvas.length; i++) {
            for (int j = 0; j < canvas[i].length; j++) {
                if (i == x && j == y) {
                    canvas[i][j] = '#';
                    printCanvas(canvas);
                }
            }
        }
    }

    public static void drawLine(char[][] canvas, int x1, int y1, int x2, int y2) {
        int x = x1;
        int y = y1;

        while (y < y2) {
            while (x < x2) {
                canvas[y][x] = '#';
                x++;
            }
            y = (((y2 - y1) / (x2 - x1)) * (x - x1) + y1);
        }
        printCanvas(canvas);
    }



    public static void main(String[] args) {


        Scanner sc = new Scanner(System.in);

        System.out.println("Wie hoch soll ihre Zeichenflaeche sein?");
        int canvasHeight = sc.nextInt();
        System.out.println("Wie breit soll ihre Zeichenflaeche sein?");
        int canvasWidth = sc.nextInt();

        char[][] canvas = newCanvas(canvasHeight, canvasWidth);
        printCanvas(canvas);

        System.out.println();

        System.out.println("Sie wollen eine Linie gegeben durch zwei Punkte zeichnen:");
        System.out.println("Bitte geben Sie die x-Koodinate des  1. Punktes an:");
        int x1 = sc.nextInt();
        System.out.println("Nun die y-Koordinate:");
        int y1 = sc.nextInt();
        System.out.println("Bitte geben Sie die x-Koodinate des 2. Punktes an:");
        int x2 = sc.nextInt();
        System.out.println("Nun die y-Koordinate des 2. Punktes an:");
        int y2 = sc.nextInt();

        /* if (x1 >= canvasHeight || y1 >= canvasWidth || x2 >= canvasHeight || y2 >= canvasWidth || x1 < 0 || y1 < 0 || x2 < 0 || y2 < 0 || canvasHeight == 0 || canvasWidth == 0) {
            System.out.println("Der Punkt liegt ausserhalb der Zeichenflaeche!");
        } else { */

            drawLine(canvas, x1, y1, x2, y2);

        //}

        System.out.println();
        sc.close();

    }
}
 
Zuletzt bearbeitet:
Ja, wahrscheinlich ist es so, und manchmal bräuchte man einfach etwas Abstand. Mathematisch sind Multiplikation und Division kommutativ. Für die Ganzzahldivision in Java gilt das nicht. Das hindert dich aber nicht daran, selbst anders zu klammern.
Edit: Jetzt habe ich mich selbst vertan, natürlich ist die Division als solche nicht kommutativ, es ist schon wichtig, was Divisor und was Dividend ist, ich meinte die Multiplikation mit dem Kehrbruch und dann meinte ich eigentlich auch das Assoziativgesetz, also die Verknüpfung der Operationen, nicht das Kommutativgesetz. In kurz, soll heißen: die Reihenfolge ist wichtig.
 
Zuletzt bearbeitet:
Minimax83 schrieb:
Ist das nur die Aussage deiner Freunding, oder werden andere Zahlen ausgegeben, wenn keine Umwandlung erfolgt?
PS: Dein Anhang funktioniert nicht

Zitat: Immer 0. Mit und ohne float. Immer 0.

@Minimax83 Anhang hab ich gelöscht. JAVA Datei sollte jetzt hier lesbar sein.
 
@Minimax83 Bei
Code:
int a=3;
int b=7;
return a/b
kommt natürlich immer 0 raus.
 
Division in java mit int ist immer ganz zahlig. 5/2 ergibt dann 2.
Ich würde y auf double setzten und wenn nötig noch die y1...x2 in ein double casten - natürlich würde es reichen (double) (y2-y1) zu verwenden.
 
Wie deutlich soll ich denn noch werden? Ich habe geschrieben, dass (int) (3/7) null ergibt. Wohingegen (int) (9/7) natürlich 1 ergibt. Ist soweit verständlich, oder?
;-)
 
Machen wirs kurz:
Multiplikation vor Division, "while" Schleifen nochmals überdenken

Die Aufgabe ist stark vereinfacht und akzeptiert Darstellungsfehler, nur damit dies klar ist.
 
simpsonsfan schrieb:
In kurz, soll heißen: die Reihenfolge ist wichtig.
In diesem Beispiel nur bedingt.
a/b*c ist ja durchaus das gleiche wie a*c/b.

Das erste ist näher an der gegebenen Formel dran, hat aber eben, wie du schon erwähntest, den Datentyp Nachteil. Casten notwendig.
Das zweite löst das Castproblem zumindest schonmal wenn wir Rundung außer acht lassen. Ich würde es trotzdem noch casten (oder im Zähler zumindest mit b/2 addieren).
 
simpsonsfan schrieb:
Mathematisch sind Multiplikation und Division kommutativ. Für die Ganzzahldivision in Java gilt das nicht.
Du meinst eventuell das Richtige, ich möchte das nur kurz korrigieren, weil das so nicht stimmt.
Die Division ist nicht kommutativ, du meinst aber vermutlich eigentlich Assoziativität oder Distributivität, jedoch ist die Division auch auf den reellen zahlen (= 'normale' Division) nicht assoziativ. Das gilt für Ganzzahldivision genau so wie sonst auch.
Probleme bekommt man aufgrund von notwendigen Rundungen bei Operationen auf Gleitkommazahlen. Diese sind zwar ähnlich zu den normalen Operationen + - * /, aber nicht identisch, so dass z.B. a*(b+c) = a*b + a*c also das übliche Distributivgesetz nicht gilt.

crazypaddy schrieb:
Sie hat versucht es in einer float zu speichern und es erst danach in eine int zu packen, rundet aber trotzdem auf 0. Gibt es da noch andere Wege? So weit ist Sie noch nicht im Thema.
Entscheidend ist, dass zum Zeitpunkt der Operation einer der Operanden/Variablen ein float ist.

Das Programm hat noch mindestens das Problem, dass die relative Lage der Punkte zueinander fälschlich eine Rolle spielt, sprich das Programm würde aktuell wenn dann nur abfallende oder steigende Geraden zeichnen und das jeweils andere nicht, da du y1 < y2 und x1 < x2 voraus setzt.
 
  • Gefällt mir
Reaktionen: simpsonsfan
@BeBur Stimmt, du hast natürlich recht. Division ist nicht kommutativ. Den Fehler hatte ich ja gestern abend selbst noch bemerkt und in dem Edit angepasst.

@Bonanca Darüber, ob es das Gleiche ist, kann man jetzt streiten. Ich würde das eher verneinen, da der Compiler eben (vorhersagbar) nicht das Gleiche daraus macht.
 
Bonanca schrieb:
Das zweite löst das Castproblem zumindest schonmal wenn wir Rundung außer acht lassen. Ich würde es trotzdem noch casten (oder im Zähler zumindest mit b/2 addieren).
Damit wirst du nicht das letzte Beispiel der Aufgabe nachstellen können. Dort wird 6/7 konsequent auf 0 gerechnet, ausserdem ist ausdrücklich von Ganzzahldivision die Rede.
BeBur schrieb:
Das Programm hat noch mindestens das Problem, dass die relative Lage der Punkte zueinander fälschlich eine Rolle spielt, sprich das Programm würde aktuell wenn dann nur abfallende oder steigende Geraden zeichnen und das jeweils andere nicht, da du y1 < y2 und x1 < x2 voraus setzt.
Der Dozent wird die Aufgabe sicherlich dahingehend weiterführen. Für den Anfang muss man sich die Aufgabe nicht schwerer machen wie sie ist.
 
Zurück
Oben