Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe ein zweidimensionales array mit x (je nach Eingabe) länge und möchte prüfen ob jedes dieser Werte gleich ist. Falls ja dann true, sonst false. Weiss jemand wie ich das machen kann? Ich muss nur die Prüfung vornehmen.
zusätzlich muss ich diese Werte mit anderen Werten auf Gleichheit prüfen. Aber erstmal die Array Werte, das ich das schwierigste
ich wollte es irgendwie mit der for-schlaufe lösen, aber habe überhaupt keinen Anhaltspunkt.
Ich sollte noch ergänzen:
Es ist eine Matrix, also gleiche Anzahl Spalten wie Zeilen. Die genau Anzahl wird bei Eingabe ermittelt.
Die Berechnung der Summe jeder Zeile und Spalte sowie deren Diagonalen habe ich bereits vorgenommen.
sumR(i) = summe aller Zeilen
sumC(j) = summe aller Spalten
sumDiaR = summe der diagonalen rechts nach Links
sumDiaL = summe der diagonalen links nach rechts
Wie kann ich jetzt prüfen ob all diese Werte gleich sind? Mit hundert if abfolgen könnte ich es machen, aber schön ist es nicht. Ausserdem ist die Anzahl Spalten/Zeilen nicht bekannt, darum array.
@tommysenf
ich möchte prüfen ob jede Spalte untereinander gleich ist, jede Zeile untereinander gleich ist, die beiden Diagonalen gleich sind, eigentlich jedes dieser 4 Elemente untereinander gleich ist. Erst dann ist true, sonst ist false. Wie gesagt, Summe aller Zeilen, Spalten und Diagonalen habe ich. Die Frage ist nur noch wie ich die 4 Dingen miteinander vergleichen. Zwei davon sind arrays (Spalten und Zeilen). Die anderen beiden sind nur jeweils ein Wert.
ich habe vergessen, dass ich dieses Thema offen habe. Daher brauche ich das andere Thema nicht mehr. @mihe7
so habe ich mir das auch vorgestellt. ABer wie kann ich das Ergebnis (true oder false) in der main Methode aufrufen? Also falls das Ergebnis false ist, dann in der Main Methode den Text ausgeben "Falsch".
ich habe das Problem gelöst. Habe einfach die ganze Rechnerei in einer Methode Rechnen (boolean)... und dann in der Main nur die Ausgabe ob True oder False abgefragt.
Es fehlt mir noch eine Sache. Ich möchte aus der Methode Rechnen eine Zahl in die Main Methode übertragen. Geht das? Kann ich boolean und int übertragen?
if (Rechnen(false)) {
System.out.println("Falsch");
}
Wie kann nun einen int Wert aus der anderen Methode übernehmen? Ich habe das Gefühl, ich muss alles nach Methoden unterteilen und das return nur einen Wert zurückgeben kann.
Wenn Du das in main hast, ist Rechnen eine statische Methode. Vergiss static (außer für main).
NB: halte Dich an die Benennungskonventionen von Java: Namen für Parameter, Variablen und Methoden in lowerCamelCase, für Typen (wie Klassen) in UpperCamelCase. Das erleichtert allen das Lesen von Code.
Ich verstehe nicht, was Du damit meinst. Vermutlich hängt Dein Problem damit zusammen, dass Du mit statischen Methoden arbeitest. Evtl. kannst Du mal den kompletten Code posten und daran erklären, was Du vor hast.
ich möchte einfach aus einer Methode, die mir einen Boolean Wert zurückgibt (haben wir vorher gelöst), auch einen Wert des Typs int zurückgeben lassen. Geht das überhaupt oder muss ich wie du sagst, noch weiter strukturieren, damit eine Methode nur einen Typ zurückgibt? Falls ja, dann würde das den Rahmen sprengen. Jede Variable, die ich irgendwo definiert habe müsste dann in die andere Methode übergeben werden und dann das Ergebnis wiederum in die nächste usw. ist doch ein Chaos?!
ich möchte einfach aus einer Methode, die mir einen Boolean Wert zurückgibt (haben wir vorher gelöst), auch einen Wert des Typs int zurückgeben lassen.
Dazu brauchst Du einfach einen geeigneten Datentyp.
Java:
class Ergebnis {
public final int wert;
public final boolean korrekt;
public Ergebnis(int wert, boolean korrekt) {
this.wert = wert;
this.korrekt = korrekt;
}
}
Und dann kannst Du Deine Methode ändern zu
Java:
Ergebnis rechne(boolean magic) {
...
return new Ergebnis(42, true);
}
Jede Variable, die ich irgendwo definiert habe müsste dann in die andere Methode übergeben werden und dann das Ergebnis wiederum in die nächste usw. ist doch ein Chaos?!
Wie soll ich das verstehen? Statt nur einen return true schreibe ich return true + int Wert?
Ich habe es probiert und es geht nicht. "cannot be resolved to a type"
Kann ich den einen Wert (Summe von Zahlen) vielleicht ausserhalb der Methode speichern, damit er in allen Methoden aufrufbar ist? Sonst müsste ich hier den ganzen Code strukturieren, was bedeutet zig Stunden Arbeit um alles neu zu definieren.
Ich hoffe du hast einen Überblick.
Kurz was es macht:
du gibst die grösse des Quadrats ein, z.B. 3 ( heisst 3 x 3).
Dann gibst du nacheinander 9 zahlen ein. Dann prüft das Programm ob diese Zahlen magisch sind und falls JA, dann soll es "Magisch" + die magische Zahl ausgeben. Falls nicht, dann einfach nur "nicht magisch".
Gelöst habe ich bisher dass es prüft ob magisch oder nicht magisch und dass "Magisch" oder "nicht magisch" ausgegeben wird. Aber die Magische Zahl selber bringe ich einfach nicht in die Main Methode kopiert. Magische Zahl ist eine der Summen, egal ob summeDiagonale1, summeSpalte etc. sie sind sowieso alle gleich, falls Wert true ist. Es soll einfach den Wert in die main Methode kopieren.
Was schlägst du mir vor, wie bringe ich das am einfachsten hin, ohne alles nochmals umzuschreiben
Java:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// Ausgabe des Ergebnisses
if (Magisch(true)) {
System.out.println("Magisch ");
}
else {
System.out.println("nicht magisch");
}
}
public static boolean Magisch(boolean magisch) {
Scanner keyScan = new Scanner(System.in);
// Grösse einlesen
System.out.print("Grösse des Quadrats: ");
int groesse = keyScan.nextInt();
int [][] quadrat = new int[groesse][groesse];
// Quadrat einlesen
System.out.println("Bitte Zahlen eingeben: ");
for (int i=0; i<groesse; i++) {
for (int j=0; j<groesse; j++) {
quadrat[i][j] = keyScan.nextInt();
}
}
keyScan.close();
// Summe Zeile berechnen
int [] summeZeile = new int [groesse];
for (int i=0; i<groesse; i++) {
for (int j=0; j<groesse; j++) {
summeZeile[i] += quadrat[0][j];
}
}
// Summe Spalte berechnen
int [] summeSpalte = new int [groesse];
for (int j=0; j<groesse; j++) {
for (int i=0; i<groesse; i++) {
summeSpalte[j] += quadrat[i][0];
}
}
// Summe Diagonale 1
int summeDiagonale1 = 0;
for (int i=0; i<groesse; i++) {
for (int j=0; j<groesse; j++) {
if (i==j) {
summeDiagonale1 = summeDiagonale1 + quadrat[i][j];
}
}
}
// Summe Diagonale 2
int summeDiagonale2 = 0;
for (int i=0; i<groesse; i++) {
for(int j=groesse-1; j>=0; j--) {
if(i+j == groesse-1) {
summeDiagonale2 = summeDiagonale2 + quadrat[i][j];
}
}
}
for (int i = 1; i<groesse; i++) {
if (summeZeile[0] != summeZeile[i]) {
return false;
}
}
for (int j = 1; j<groesse; j++) {
if (summeSpalte[0] != summeSpalte[j]) {
return false;
}
}
if ((summeDiagonale1 != summeSpalte[0]) || (summeDiagonale2 != summeZeile[0])) {
return false;
}
return true;
}}
import java.util.Scanner;
public class Main {
static class Ergebnis {
final int summe;
final boolean magisch;
public Ergebnis() {
summe = -1;
magisch = false;
}
public Ergebnis(int summe) {
this.summe = summe;
this.magisch = true;
}
}
public static void main(String[] args) {
Ergebnis ergebnis = Magisch(true);
// Ausgabe des Ergebnisses
if (ergebnis.magisch) {
System.out.printf("Magisch, Summe %d\n", ergebnis.summe);
}
else {
System.out.println("nicht magisch");
}
}
public static Ergebnis Magisch(boolean magisch) {
Scanner keyScan = new Scanner(System.in);
// Grösse einlesen
System.out.print("Grösse des Quadrats: ");
int groesse = keyScan.nextInt();
int [][] quadrat = new int[groesse][groesse];
// Quadrat einlesen
System.out.println("Bitte Zahlen eingeben: ");
for (int i=0; i<groesse; i++) {
for (int j=0; j<groesse; j++) {
quadrat[i][j] = keyScan.nextInt();
}
}
// Summe Zeile berechnen
int [] summeZeile = new int [groesse];
for (int i=0; i<groesse; i++) {
for (int j=0; j<groesse; j++) {
summeZeile[i] += quadrat[0][j];
}
}
// Summe Spalte berechnen
int [] summeSpalte = new int [groesse];
for (int j=0; j<groesse; j++) {
for (int i=0; i<groesse; i++) {
summeSpalte[j] += quadrat[i][0];
}
}
// Summe Diagonale 1
int summeDiagonale1 = 0;
for (int i=0; i<groesse; i++) {
for (int j=0; j<groesse; j++) {
if (i==j) {
summeDiagonale1 = summeDiagonale1 + quadrat[i][j];
}
}
}
// Summe Diagonale 2
int summeDiagonale2 = 0;
for (int i=0; i<groesse; i++) {
for(int j=groesse-1; j>=0; j--) {
if(i+j == groesse-1) {
summeDiagonale2 = summeDiagonale2 + quadrat[i][j];
}
}
}
for (int i = 1; i<groesse; i++) {
if (summeZeile[0] != summeZeile[i]) {
return new Ergebnis();
}
}
for (int j = 1; j<groesse; j++) {
if (summeSpalte[0] != summeSpalte[j]) {
return new Ergebnis();
}
}
if ((summeDiagonale1 != summeSpalte[0]) || (summeDiagonale2 != summeZeile[0])) {
return new Ergebnis();
}
return new Ergebnis(summeDiagonale1);
}
}
Sinnvoller wäre es, auf static zu verzichten, dann kannst Du Dir den ganzen Käse sparen, da du das Ergebnis dann im Objekt halten kannst (wie bei Ergebnis).
deine Lösung funktioniert, danke
aber mit dem Stoff bin ich noch nicht so weit. Ich kenne die Begriffe (this, .summe, final) noch nicht. Muss es noch lernen
erstmal Danke für deinen zweiten Post.
Ja mit Methoden wäre es doch eigentlich richtig zu arbeiten oder? Aber damit habe ich ein Problem. Nämlich, wenn du ganz am Anfang durch den Scanner "groesse" definierst, wie willst du das dann in die anderen Methoden übernehen, wenn du es brauchst? Es kommt immer der Fehler: "Cannot be resolved to a variable". Damit habe ich Mühe. Wenn jede Variable nur in der gleichen Methode gebraucht wird, dann ist das kein Problem. Aber z.B. "groesse" wird in mehreren Methoden gebraucht.
Das ist prinzipiell mal gar kein Problem, weil Du den Methoden ja entsprechende Parameter spendieren kannst. Allerdings brauchst Du das hier nicht, weil Du die Größe über das Array quadrat ermitteln kannst: quadrat.length.
Beim Abändern hier im Editor habe ich das oben übersehen - natüüüüürlich mit voller Absicht, denn etwas Eigeninitiative kann ja wohl erwarten
ok, ich habe vielleicht zu wenig deutlich geschrieben.
Ich hätte z.B. in Methode1 eine Variable int test = 5;
wie kann ich die in der Methode2 abrufen ohne sie erneut zu definieren? Sorry, wenn das einfach ist, aber das verwirrt mich extrem an der ganzen Methodenbastelei.
Wenn Du in einer Methode eine Variable deklarierst, dann handelte es sich um eine lokale Variable. Diese ist von anderen Methoden aus nicht sichtbar.
Um den Wert einer lokalen Variable an eine andere Methode zu übergeben, muss die andere Methode einen solchen Wert als Parameter erwarten.
Java:
static void a() {
int test = 5; // dieses test existiert nur innerhalb von a und ist von außen nicht sichtbar
b(test); // übergibt den Wert der Variablen test als Parameter an Methode b
}
static void b(int x) {
System.out.println(x); // gibt den Wert des Parameters x aus
}
Man kann Variablen auch außerhalb von Methoden deklarieren, die dann allen Methoden zur Verfügung stehen. Statische Variablen heißen Klassenvariablen, nicht statische Instanzvariablen. Der Unterschied ist, dass Klassenvariablen ohne Objekt existieren, Instanzvariablen für jedes Objekt separat.
Statisch:
Java:
public class X {
private static int test;
public static void a() {
X.test = 5; // das X. ist in Java leider optional
}
public static void b() {
System.out.println(X.test);
}
}
Da die Methoden statisch sind, kannst Du von überall aus z. B. X.a(); aufrufen - ohne Objekt.
Nicht-statisch:
Java:
class X {
private int test;
public void a() {
test = 5; // ist gleichbedeutend mit this.test = 5
}
public void b() {
System.out.println(test);
}
}
Hier musst Du ein Objekt erzeugen, um a() aufrufen zu können:
Java:
X x = new X(); // neues X-Objekt erzeugen
x.a(); // die Methode a() auf dem Objekt x (= Instanz der Klasse X) aufrufen