WinFuture-Forum.de: Was Ist Hier Falsch? - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

Was Ist Hier Falsch?


#1 Mitglied ist offline   Blizzard201 

  • Gruppe: aktive Mitglieder
  • Beiträge: 521
  • Beigetreten: 04. Oktober 08
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 01. Dezember 2008 - 18:59

Hi!
Wir fangen grade in der Schule mit Java an und sollen jetzt ein Script schreiben, dass uns Primzahlen ausgibt.
Hier mein Code:

<html>
<title>
!= in Javascript hei&szlig;t ungleich
</title>
<script>



function primzahl()
	{var z1, z2, gross, klein, zaehler, zahl, primzahl;

z1=formular.feld1.value
z2=formular.feld2.value

if(z1>z2)
 {gross=z1
 klein=z2}
else
 {gross=z2
 klein=z1};

 for(zaehler=klein; zaehler<gross; zaehler++);
for(zahl=2; zahl<gross; zahl++);
 if(zaehler % zahl !=0)
{formular.ausgabe.value= zahl + " "};
 };
</script>
<body bgcolor="lightblue">
<form name="formular">
<table border="1" align="center">
<tr>
<td>
<input type="text" value="1" name="feld1"></input>
</td>
<td>
<input type="button" value="Primzahlen ausgeben!" onclick ="primzahll()">
</td>
<td>
<input type="text" value="100" name="feld2">

</td>
</tr>
<tr>
<td>
</td>
<td>
<textarea cols="20" rows="30" name="ausgabe"></textarea>
</td>
<td>
</td>
</tr>
</table>
</form>
</body>
</html>



Es funktioniert nicht, was mache ich falsch?


DAnKE

Meine Foto-Gallerie

CPU AMD Phenom II X4 940 | Mainboard MSI K9N2 SLI Platinum | Grafik GTX 260² @ Aquagrafx G200b
RAM 2x2gb OCZ XTC SLI-ready
Pumpe Laing DDC-1RT | Radiator Mora 2
Passiv 32°C CPU 38°C Grafik | 3 Lüfter 12V 27°C CPU 30°C Grafik
Case Lian Li A05
0

Anzeige



#2 Mitglied ist offline   renegade2k 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.402
  • Beigetreten: 30. Juli 07
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Nähe D'dorf

geschrieben 01. Dezember 2008 - 19:50

Sry, das ist jetzt nicht gerade hilfreich, aber ihr fangt mit JavaScript an, nicht mit Java. ( -klick- )
Das ist wie Taschenrechner im Verhältnis zum Computer :)

Nebenbei: es ist ziemlich umständlich programmiert mit unnötig vielen Variablen ;)

Was ist die Aufgabenstellung bzw was soll das Programm machen und woran siehst du, dass etwas falsch ist?

Wenn ich den Code in Java umschreibe, dass kommt da total wirres Zeug raus :wink:
mit z1 = 20 und z2 = 14:
3 
4 
5 
6 
8 
9 
10 
11 
12 
13 
15 
16 
17 
18 
19 
2 
4 
6 
7 
8 
9 
10 
11 
12 
13 
14 
16 
17 
18 
19 
3 
5 
6 
7 
9 
10 
11 
12 
13 
14 
15 
17 
18 
19 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
18 
19 
4 
5 
7 
8 
10 
11 
12 
13 
14 
15 
16 
17 
19 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18

Dieser Beitrag wurde von renegade2k bearbeitet: 01. Dezember 2008 - 20:05

- Vista x64 Multilanguage Update Pack : ist oben ;) -
0

#3 Mitglied ist offline   Blizzard201 

  • Gruppe: aktive Mitglieder
  • Beiträge: 521
  • Beigetreten: 04. Oktober 08
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 01. Dezember 2008 - 21:18

also wir sollen versuchen ein script zu erstellen, mit dem man auf knopfdruck alle primzahlen bis zu einem bestimmten punkt erhällt

Meine Foto-Gallerie

CPU AMD Phenom II X4 940 | Mainboard MSI K9N2 SLI Platinum | Grafik GTX 260² @ Aquagrafx G200b
RAM 2x2gb OCZ XTC SLI-ready
Pumpe Laing DDC-1RT | Radiator Mora 2
Passiv 32°C CPU 38°C Grafik | 3 Lüfter 12V 27°C CPU 30°C Grafik
Case Lian Li A05
0

#4 Mitglied ist offline   renegade2k 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.402
  • Beigetreten: 30. Juli 07
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Nähe D'dorf

geschrieben 01. Dezember 2008 - 22:08

Ok. Dann macht das Programm definitiv was anderes :angry:

Jetzt gerade ist leider schon spät, aber ich hab das entsprechende Programm bereits fertig auf dem Laptop liegen. Falls mir keiner zuvorkommt, kriegst du es morgen Mittag :blush: (Musst dann nur den Java.Code in JavaScript umschreiben, aber das ist eine Sache von 2 Minuten )
- Vista x64 Multilanguage Update Pack : ist oben ;) -
0

#5 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 01. Dezember 2008 - 22:26

Zitat

Falls mir keiner zuvorkommt, kriegst du es morgen Mittag

Wird auch keiner, weil ich es vorher löschen werde. :angry:

Nein ernsthaft, was hat er davon wenn du ihm das komplette Teil vorkaust? Copy & Paste kann jeder, aber er soll ja lernen es selbst zu machen, selbst verstehen, was an seinem Algorithmus falsch ist.

Zum Beispiel, im Prinzip geht es nur um folgende Zeilen
for(zaehler=klein; zaehler<gross; zaehler++);
for(zahl=2; zahl<gross; zahl++);
if(zaehler % zahl !=0)
{formular.ausgabe.value= zahl + " "};
};

Erstmal würde ich mich ja direkt fragen, möchte ich wirklich die for-schleifen beenden oder ist das Simikolon am Ende einer Schleife vielleicht doch falsch gesetzt?

Aber ich würde das sowieso ganz anders angehen. Nicht direkt am Code sondern vielleicht erst auf einem Blatt Papier überlegen, wie rechne ich eigentlich überhaupt eine Primzahl aus? Recht simpel in dem ich prüfe, ob die Zahl nur durch sich selbst und 1 teilbar ist, ergo kann sie durch alle Zahlen die kleiner als sie selbst ist (die nette Optimierung kann man noch später machen) nicht teilbar sein. Die if-Bedingung sieht da schon recht ordentlich aus:
if(zaehler % zahl !=0)

Aber der Rest ist noch verkehrt, die for-Schleifen (alle Zahlen kleiner als sie selbst) und deine Operation, was du machst, wenn die If-Bedingung eintrifft. Die Zahl ist also nicht teilbar, ABER nur durch eine Zahl nicht teilbar...was ist mit den restlichen kleineren Zahlen?

Wie gesagt, renegade2k ich würde es schön finden, wenn du deine Lösung noch zurückhältst und wir ihm langsam helfen selbst auf die Lösung zu kommen.
0

#6 Mitglied ist offline   renegade2k 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.402
  • Beigetreten: 30. Juli 07
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Nähe D'dorf

geschrieben 01. Dezember 2008 - 22:57

Da ahst du natürlich recht. Copy & Paste machen die meisten und merken dann, dass es 0 bringt.
Da wir aber auch "Requirements" als Fach haben, kopft man uns in die Birne, alles was wir an Software schreiben vernünftig zu kommentieren :angry: Mein Programm ist im Grunde mehr Prosa als Code, sodass ein jeder es nach dem durchlesen nachvollziehen kann.

Leider kann ich mich nicht mehr genau erinnern, wie man den Algorithmus impllementiert, von daher schadet es mir selbst nicht da mal wieder rein zu schauen
- Vista x64 Multilanguage Update Pack : ist oben ;) -
0

#7 Mitglied ist offline   renegade2k 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.402
  • Beigetreten: 30. Juli 07
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Nähe D'dorf

geschrieben 04. Dezember 2008 - 11:37

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

		int klein = 0, gross = 0, x1, x2; 	// x1 und x2 sollen die eingaben des
											// benutzers darstellen (naütrliche zahlen)
		x2 = 5; 							// variablen einfachheitshalber vorbestimmt
		x1 = 5;
		if (x1 > x2) { 						
			gross = x1;
			klein = x2;
		} else if (x2 > x1) {
			gross = x2;
			klein = x1;
		} else 
			klein = gross = x1;
		for (int i = klein; i <= gross; i++) { 	// prim-prüfung für jede ganzzahl
												// zwischen unter- und
												// obergrenze durchführen
			if (isprim(i))
				System.out.println(i); 			// ausgabe der primzahl
		}
	}

	public static boolean isprim(int prim) { 			// prüfung auf prim
		prim = (int) Math.signum((float) prim) * prim; 	// funktion sorgt dafür,
														// dass prim >=0
														// ist/wird
		for (int i = 2; i <= Math.sqrt(prim); i++)	// läuft alle zahlen von 2 bis wurzel(prim) durch und teilt prim
													// durch diese
			if (prim % i == 0) 						// wenn die zahl restfrei teilbar ist
				return false; 						// gebe "nicht prim" zurück
		if (prim != 1 && prim != 0) 				// wenn die zahl nicht restfrei teilbar ist
													// & nicht 1 ist & nicht 0 ist
			return true; 							// gebe "ist prim" zurück
		else
			return false;
	}
}


So würde das Programm in Java aussehen, allerdings befürchte ich, wirst du ein Problem mit den mathematischen Funktionen kriegen.
Falls dem so ist, kan ich nochmal drübergucken und diese entfernen bzw durch triviale Funktionen ersetzen, die auch in JavaScript implementierbar sind

Dieser Beitrag wurde von renegade2k bearbeitet: 04. Dezember 2008 - 11:38

- Vista x64 Multilanguage Update Pack : ist oben ;) -
0

#8 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 04. Dezember 2008 - 20:24

Zitat

Leider kann ich mich nicht mehr genau erinnern, wie man den Algorithmus impllementiert, von daher schadet es mir selbst nicht da mal wieder rein zu schauen

Da will ich doch direkt mal einige Optimierungen vorschlagen. Ich bleibe auch mal bei Java:

1. Primzahlen können nur natürliche Zahlen sein! Das heißt alles unter Null muss man erst gar nicht berechnen. Aber man kann vom Anfang an mit dem absoluten Wert arbeiten.
2. Auf die Variablen "gross" und "klein" kannst du verzichten und direkt mit x1 und x2 arbeiten.
3."if (prim != 1 && prim != 0)" Diese Überprüfung bei jedem (!) Durchlauf durchgeführt wird kannst du dir sparen, da es unter zwei keine Primzahlen gibt und man diese direkt ausschließen kann.

Ich habe es schnell mal etwas umgeschrieben. Die neuen angepassten Stellen habe ich kommentiert.

public final class Primzahl {

	public static void main(final String... args) {

		// Immer den absoluten Wert einer Zahl nehmen
		int x1 = StrictMath.abs(-2);
		int x2 = StrictMath.abs(-200);

		if (x1 < 2 | x2 < 2) {
			// Keine Primzahlen unter 2, abbruch
			return;
		}

		if (x1 > x2) {
			// Dreieckstausch, falls x1 kleiner x2
			x1 ^= x2;
			x2 ^= x1;
			x1 ^= x2;
		}

		// Endlosschleife ...
		for (;;) {
			printPrim(x1);

			if (++x1 == x2) {
				// Wenn x1 gleich x2 ist, können wir die Schleife verlassen
				break;
			}
		}
	}

	public static void printPrim(final int prim) {
		final int len = (int) StrictMath.sqrt(prim);

		for (int i = 2; i <= len; ++i) {
			if (prim % i == 0) {
				return;
			}
		}

		System.out.println(prim);
	}
}


Wenn jemand weitere nette Kniffe kennt, immer her damit.
Ansonsten viel Spaß. :blush:
0

#9 Mitglied ist offline   renegade2k 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.402
  • Beigetreten: 30. Juli 07
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Nähe D'dorf

geschrieben 04. Dezember 2008 - 20:34

Ah, ausgezeichnet, der Code sieht um einiges besser aus.
Kannst du mir vielleicht nochmal den Dreieckstausch erläutern :blush:

zu 1.: hab wohl die Definition schlampig gelesen. habe das jetzt so Programmiert, dass auch negative "Primzahlen" ausgegeben werden, die es so garnicht gibt
- Vista x64 Multilanguage Update Pack : ist oben ;) -
0

#10 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 04. Dezember 2008 - 20:50

Dreieckstausch
0

#11 Mitglied ist offline   renegade2k 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.402
  • Beigetreten: 30. Juli 07
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Nähe D'dorf

geschrieben 04. Dezember 2008 - 21:38

Das Addieren/Subtrahieren, logische Verknüpfung und eine Dritte Variable sind klar, ist auch meiner Meinung nach trivial. Was mich interessiert ist speziell dieser "^=" befehl :blush:
- Vista x64 Multilanguage Update Pack : ist oben ;) -
0

#12 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 05. Dezember 2008 - 07:54

^ ist das Zeichen für Exklusives Oder (XOR). ^= Ist somit das gleichzeitige Zuweisen, a ^= b ist die verkürzte Schreibweise für a = a ^ b;

Spielen wir das an Hand eines einfachen Beispieles durch. Vorne weg, sämtliche Boolschen-Operationen, wie & | ^ << >> laufen bei Zahlen auf der Bit-Ebene.
a = 5; (101)
b = 3; (011)
a ^= b;
	101
	011
---------
	110 (a=6)

b ^= a;
	011
	110
---------
	101 (b=5)

a ^= b;
	110
	101
---------
	011 (a=3)

a=3
b=5

Und schon hat man zwei Zahlen vertauscht. :P
0

#13 Mitglied ist offline   renegade2k 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.402
  • Beigetreten: 30. Juli 07
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Nähe D'dorf

geschrieben 05. Dezember 2008 - 08:21

ah, alles klar :P
Danke für die Erklärung. Seit einem Jahr programmier ich Java und hab das Zeichen noch nie gewesen geschweige denn benutzt ^^
- Vista x64 Multilanguage Update Pack : ist oben ;) -
0

#14 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 05. Dezember 2008 - 13:49

Ein XOR gibt's aber in so ziemlich jeder Programmiersprache. Nur kommen die ganzen boolschen Operationen in der heutigen Zeit eher selten vor. Da die Leute lieber "5 * (2*2*2*2)" anstatt "5 << 4". verwenden. :P
0

#15 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.115
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 05. Dezember 2008 - 17:31

Ich hab mich auch mal dran gemacht. Eine kleine Einschränkung gibt's noch - die untere Grenze liegt bei 3. Es werden nur ungerade Zahlen getestet.
public class prime 
{
	private static int low, high;
	
	public static void main(String[] args) 
	{
		switch(args.length)
		{
			case 0:
			case 1:
				System.out.println("Too few arguments!");
				break;
			case 2:
				if(checkArgs(args)) printPrime();
				else System.out.println("Check your arguments!");
				break;
			default:
				System.out.println("Too many arguments!");
				break;
		}
	}
	
	private static boolean checkArgs(String[] args)
	{
		try 
		{
			low = Integer.parseInt(args[0]);
			high = Integer.parseInt(args[1]);
		} 
		catch (NumberFormatException e) 
		{
			System.out.println("NumberFormatException");
		}
		return low >= 3 && high > low;
	}
	
	private static void printPrime()
	{
		System.out.println("Prime numbers in the range of " + low + " - " + high + ":");
		// make low odd
		if(low % 2 == 0) low++;
		// check odd numbers only
		for(int i = low; i <= high; i += 2)
		{
			int k = (int) StrictMath.sqrt(i);
			boolean isPrime = true;
			for(int j = 3; j < k; j++)
			{
				if(i%j == 0)
				{
					isPrime = false;
					break;
				}
			}
			if(isPrime) System.out.println(i);
		}
	}
}

Am längsten hat's gedauert wieder von C++ auf Java umzudenken ;-)

Dieser Beitrag wurde von Mr. Floppy bearbeitet: 05. Dezember 2008 - 17:45

0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0