Anna90
Anmeldungsdatum: 9. November 2014
Beiträge: 33
|
Hi Leute, ich hab angefangen Informatik zu studieren und hänge bei einer Aufgabe fest, vermutlich wird sie euch leicht fallen.
Ich möchte keine Musterlösung, sondern verstehen was ich tun soll! Ich soll einen Algorithmus zum Quadrieren positiver ganzer Zahlen erstellen.
Erlaubte Operatoren: Großes Eins-plus-Eins (nur Addition a + b für int-werte a,b und a,b >= 0) Die Idee: Das Quadrat einer positiven ganzen Zahl x ist die Summe der ersten x ungeraden positiven ganzen Zahlen beginnend bie Eins.
Wir sollen nach dem Vorbild der Methode EuklidModern entwickeln und als Java-Methode präzisieren. sie soll folgenden Rumpf haben: public static int quadrat (int x) {
int q;
return q;
}
ich hab mir überlegt wie man das ausdrücken kann: U={x e N | x ist eine ungerade Zahl} mit if a % 2 ==1 als ersten Versuch hab ich dann folgendes beim Editor eingegeben: (hat nicht funktioniert) public class EuklidModern {
public static int quadrat (int x) {
euklidModern (int a, int b) {
int q;
while (b >= 0)
if (a % 2 = 1)
a = b * b;
else
return q;
}
}
} Ich will wirklich nur Ideen und Tipps wo ich was nachschauen oder finden könnte oder wie mans ganz allgemein macht, sonst kapier ich das nie. Also bitte keine Musterlösung! Danke schon mal
|
unbuntuS12
Anmeldungsdatum: 2. Juni 2010
Beiträge: 1816
|
Hi, so wie das da jetzt steht kann es nicht funktionieren, weil die main-Methode fehlt. Verwendest du wirklich nur einen Editor oder eine Eintiegsentwicklungsumgebung wie bluej? In deinem Code passen einige Sachen nicht zusammen. Ich kopieren den mal und mache Anmerkungen dran. Vielleicht hilft dir das. Anna90 schrieb: public class EuklidModern {
// Hier definierst du eine Methode, allerdings nicht die main-Methode.
// Ohne diese wird der Code ohne sowas wie bluej nicht laufen.
// Deine Methode erwartet einen Integer. Das soll die Zahl sein, die quadriert wird.
public static int quadrat (int x) {
// Du hattest geschrieben, du darfst Addition auf a und b verwenden.
// Das heißt aber nicht automatisch, dass du a und b als Variablen verwenden musst
// Ich vermute deshalb, dass du die Variablen a und b hier DEKLARIEREN möchtest,
// so, wie du es mit dem q eine Zeile weiter unten tust.
// Eine weitere Methode brauchst du nicht. Und wenn, dann würde noch der Rückgabewert fehlen.
// Zumal du diese Methode innerhalb einer anderen Methode definierst.
euklidModern (int a, int b) {
// Hier deklarierst du eine Variable q, aber initialisierst sie nicht. Das ist
// nicht schlimm, wenn man weiß, dass nicht initialisierte Integer in Java 0 sind.
int q;
// Grundsätzlich: Wenn man weiß, wieviele Schleifendurchläufe kommen werden (und du kannst
// das genau sagen, sobald du deinen Eingabwert kennst), dann nimmt man eine for-Schleife.
// Davon abgesehen. Du testest auf den Wert von b. b ist aber weder deklariert, noch initialisiert.
// Und selbst, wenn es das wäre: Im Schleifenrumpf wird b nicht geändert. Deshalb wäre b immer gleich.
// Das heißt: Entweder läuft die Schleife nie (wenn b<0)) oder IMMER (wenn b >=0).
while (b >= 0) // hier fehlt außerdem die öffnende geschweifte Klammer
// a ist nicht deklariert oder initialisiert.
if (a % 2 = 1) // auch hier fehlt die Klammer
// Wenn du den (*)-Operator verwenden darfst, dann ist dein Problem ja ohnehin gelöst. :-)
a = b * b;
else // Hier auch Klammern
return q;
}
}
}
Vielleicht trennen wir also nochmal den Algorithmus und die Umsetzung in Java. In iterativem Pseudocode müsste deine Lösung also in etwa so aussehen: ...
|
unbuntuS12
Anmeldungsdatum: 2. Juni 2010
Beiträge: 1816
|
edit: Fehler im Pseudoalgorithmus. Am besten überlegst du dir nochmal einen einfacheren Algorithmus. 2+2 = 4
3+3+3 = 9
4+4+4+4 16
... Also: Addiere einfach [DieZahl]-häufig [DieZahl].
|
Anna90
(Themenstarter)
Anmeldungsdatum: 9. November 2014
Beiträge: 33
|
Danke, ich probiers mal neu und meld mich dann wieder 😀
wir sollen den Editor gedit benutzen, vim darf ich noch nicht
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
Der Algorithmus ist doch eigentlich in Ordnung: Anna90 schrieb: Die Idee: Das Quadrat einer positiven ganzen Zahl x ist die Summe der ersten x ungeraden positiven ganzen Zahlen beginnend bie Eins.
unbuntuS12 schrieb: Da muss man einfach bis zum doppelten der Eingabezahl zählen, damit das Ergebnis stimmt - z.B. für die Zahl 5:
ungerade Zahlen von 0 bis 5:
1 + 3 + 5 = 9
ungerade Zahlen von 0 bis 10:
1 + 3 + 5 + 7 + 9 = 25
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Anna90 schrieb: Die Idee: Das Quadrat einer positiven ganzen Zahl x ist die Summe der ersten x ungeraden positiven ganzen Zahlen beginnend bie Eins.
Kannst Du das praktisch an den Beispielen 3, 4 und 5 demonstrieren?
Wir sollen nach dem Vorbild der Methode EuklidModern entwickeln und als Java-Methode präzisieren. sie soll folgenden Rumpf haben:
public static int quadrat (int x) {
int q;
return q;
}
ich hab mir überlegt wie man das ausdrücken kann: U={x e N | x ist eine ungerade Zahl} mit if a % 2 ==1
Schon mal was von for-loops gehört?
public class EuklidModern {
public static int quadrat (int x) {
euklidModern (int a, int b) {
int q;
while (b >= 0)
if (a % 2 = 1)
a = b * b;
Ich denk Du darfst nur addieren! Es riecht hier nach Multiplikation und Modulo! Und nach misslungener Einrückung.
|
unbuntuS12
Anmeldungsdatum: 2. Juni 2010
Beiträge: 1816
|
@seahawk: Du hast Recht. Ich hatte den Pseudoalgorithmus aber schon komplett rausgenommen, weil man ja dann das Ende der For-Schleife, den [DieZahl]-ten Durchlauf, errechnen müsste. Also entweder mit Integerdivision oder mit Modulo, was beides nicht erlaubt sein dürfte. Nur mit Addition wüsste ich keine Alternative, als [DieZahl] häufig [DieZahl] zu addieren.
|
Anna90
(Themenstarter)
Anmeldungsdatum: 9. November 2014
Beiträge: 33
|
Ich bin nun ein bisschen weiter, dank eurer Hilfe. Es ist noch nicht richtig, zeigt aber nicht mehr so viele Fehler an und ich hab das MAL und MODOLO rausbekommen. public class EuklidModern {
public static int quadrat (int x) {
euklidModern (int a, int b) {
int q;
for(q = 1; q <= x;)
q = q + 2;
{
System.out.println(x + q);
}
return q;
}
}
} was ich nicht verstehe warum er mir folgende Fehlermeldungen gibt: Aufgabe22.java:3: error: '.class' expected
euklidModern (int a, int b) {
^
Aufgabe22.java:3: error: ';' expected
euklidModern (int a, int b) {
^
Aufgabe22.java:3: error: ';' expected
euklidModern (int a, int b) {
^
3 errors
schließlich ist doch eine klasse angegeben und plus müsste doch bekannt sein oder?
|
unbuntuS12
Anmeldungsdatum: 2. Juni 2010
Beiträge: 1816
|
Ich zitiere wieder deinen Code und mache Anmerkungen. Anna90 schrieb: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 | public class EuklidModern { // Definition der Klasse - OK!
public static int quadrat (int x) { // Definition der Methode - OK!
euklidModern (int a, int b) { // Was ist das hier? Das ist keine Methodendefinition und auch keine Variablendeklaration,
// zumal du mit den Variablen a und b auch nie arbeitest.
int q;
for(q = 1; q <= x; q + 2) // hier sagt er "not a statement", weil du sagen musst, welchen Wert q nach Durchlauf der
// Schleife haben soll. Häufig steht da "i++", was die Abkürzung für "i=i+1" ist. Du musst
// jetzt q einen neuen Wert zuweisen. In deinem Fall also: q=q+2. Bedenke aber: Du machst
// damit jetzt für z.B. x=6 genau 3 Schleifendurchläufe. Den für q=1, den für q=3 und den für
// q=5. Dein Algorithmus fordert aber bei x=6 genau 6 ungerade Zahlen.
{
System.out.println(x + q);// Hier ist das nächste Problem: 1. Die println()-Methode kann nur Strings ausgeben. (x+q) ist
// aber ein Integer. Das kannst du mit System.out.println(String.valueOf(x + q)) lösen.
// Das Hauptproblem aber ist: Hier passiert keine Zuweisung. Wenn das so kompilieren würde,
// dann hättest du im Terminal die Ausgabe
// 7 (6+1)
// 9 (6+3)
// 11 (6+5)
// und deine Methode würde q zurückliefern. q ist bei gerade Zahlen x-1 (hier also 5) und
// bei ungeraden Zahlen genau x. Den Wert verwendest du aber nirgendwo.
}
return q;
}
}
}
|
Darüberhinaus wird dein Code auch dann nicht kompilieren, wenn du alles "richtig" machst, weil du schlicht und ergreifend eine Methode brauchst, die die Signatur | public static void main(String[] args);
|
besitzt. Ich würde die quadrat-Methode einfach ensprechend umbenennen. Und ich würde dir wirklich Empfehlen, den einfacheren Algorithmus mit x-häufig x addieren zu wählen.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
Anna90 schrieb: Ich bin nun ein bisschen weiter, dank eurer Hilfe. Es ist noch nicht richtig, zeigt aber nicht mehr so viele Fehler an und ich hab das MAL und MODOLO rausbekommen.
was ich nicht verstehe warum er mir folgende Fehlermeldungen gibt:
schließlich ist doch eine klasse angegeben und plus müsste doch bekannt sein oder?
Du versuchst die Methode euklidModern in der Methode quadrat zu definieren. Das geht nicht und ist hier auch nicht sinnvoll.
|
Anna90
(Themenstarter)
Anmeldungsdatum: 9. November 2014
Beiträge: 33
|
Hi, ich hab ja vorgegeben bekommen den Rumpf
public satic int quadrat(int x) {
int q;
return q;
}
zu benutzen. x-häufig x addieren
kann ich ja nicht ohne * darstellen. ich habs jetzt wie folgt geändert: public class EuklidModern {
public static int quadrat (int x) {
int q;
for(q = 1; q <= 2x; q = q + 2;)
{
System.out.println(x + q);
}
return q;
}
} hab nun aber folgende Fehlermeldungen Aufgabe22.java:4: error: ';' expected
for(q = 1; q <= 2x; q = q + 2;)
^
Aufgabe22.java:4: error: ')' expected
for(q = 1; q <= 2x; q = q + 2;)
^
Aufgabe22.java:4: error: illegal start of expression
for(q = 1; q <= 2x; q = q + 2;)
^
3 errors
scheinbar mag er das mit +2 nicht besonders und ich weiß auch nicht was mit ; und ) expexted gemeint sein könnte
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
unbuntuS12 schrieb: Ich zitiere wieder deinen Code und mache Anmerkungen.
Das meiste ist ja richtig, was Du schreibst, aber
Darüberhinaus wird dein Code auch dann nicht kompilieren, wenn du alles "richtig" machst, weil du schlicht und ergreifend eine Methode brauchst, die die Signatur | public static void main(String[] args);
|
besitzt.
das ist falsch. Nicht jede Klasse braucht eine Mainmethode und es wird kompilieren, wenn der innere Methodenkopf gelöscht wird, und die for-Schleife korrigiert. Zum Testen ist natürlich eine Mainmethode wünschenswert - diese kann aber ebensogut in einer anderen Aufgabe stehen.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
a) 2x ist keine in Java gültige Schreibweise für 2*x. b) for(q = 1; q ⇐ 2*x; q = q + 2;) Das dritte Semikolon ist zu viel.
|
unbuntuS12
Anmeldungsdatum: 2. Juni 2010
Beiträge: 1816
|
Anna90 schrieb: Hi, ich hab ja vorgegeben bekommen den Rumpf
public satic int quadrat(int x) {
int q;
return q;
}
zu benutzen.
Genau diesen Rumpf kann man auch super verwenden, um hiermit...
x-häufig x addieren
kann ich ja nicht ohne * darstellen.
einen Algorithmus zu erstellen, der ohne (*) auskommt. for(q = 1; q <= 2*x; q = q + 2) Es wurde ja schon angemerkt, dass du 2*x schreiben müsstest. Aber: Du darfst ja kein (*) verwenden. Sonst schreibt du einfach return x*x ganz ohne Schleife, und die Sache ist durch.
System.out.println(x + q);
Hier passiert weiterhin nichts, was den Ablauf des Programms beeinflussen würde. Lies dir die Anmerkungen von oben nochmal durch. @user_unknown: Du hast natürlich Recht. Kompilieren wird es - ich wollte auf das effektive Funktionieren hinaus und habe einfach unterstellt, dass es keine weitere Klasse mit main-Methode gibt. Aber klar, nicht jede Klasse muss eine main-Methode haben.
|
stfischr
Anmeldungsdatum: 1. März 2007
Beiträge: 19197
|
unbuntuS12 schrieb: Anna90 schrieb: kann ich ja nicht ohne * darstellen.
einen Algorithmus zu erstellen, der ohne (*) auskommt. for(q = 1; q <= 2*x; q = q + 2) Es wurde ja schon angemerkt, dass du 2*x schreiben müsstest. Aber: Du darfst ja kein (*) verwenden. Sonst schreibt du einfach
Mal davon abgesehen, dass 2 * x = x + x ist ... Jede Multiplikation lässt sich durch Addition und eine Forschleife ersetzen. Pseudobeispiel:
MulStern(a,b)
return a*b
MulPlus(a,b)
e=0
for(i=1, i<=b, i++)
e+=a
return e Also im Klartext, addiere b-Mal den Wert von a.
|