Wurzelrechnung Pascal

Wir sollten ein Programm schreiben, das
  1. - die Werte 1-30 checkt
  2. - einzelne Werte auf Primzahl überprüft
  3. - angibt, wie oft man einen Wert mit sich selber multiplizieren muss damit der Wert >500
  4. - wie oft muss man den Wert "Wurzeln", damit der Wert<5 ist.
  5. - und welche Primzahlen (ab dem Wert 2), existieren vor dem Wert.

Die Ausgabe haben wir dann endlich hingekriegt und die Multiplikation und die Primzahlen-Erkennung sollte auch richtig funktionieren, jedoch weiss ich nicht wo der Fehler in der Wurzelberechnung liegt.
Der Dickgedruckte Teil ist der (anscheinend) fehlerhafte.

Code:
[COLOR="DeepSkyBlue"]program[/COLOR] Aufgabe4 ;

[COLOR="DeepSkyBlue"]const[/COLOR]
	LOWER_BORDER = 1;
	UPPER_BORDER = 30;
	MULT_BORDER = 500;
	SQRT_BORDER = 5;
	
[COLOR="DeepSkyBlue"]var[/COLOR]
	WertistPrimzahl,
	Primzahl : Boolean;
	Laufwert,
	Wert,
	Multiplikationsschleife,
	Wurzelschleife,
	Teiler,
	Rest, 
	Primzahlzaehler  : Byte;
	Multiplikationsergebnis : Word;
	sqrtergebnis : Extended;
	
[COLOR="DeepSkyBlue"]begin[/COLOR]
	Wert:= 1 ;												
	[COLOR="DeepSkyBlue"]for[/COLOR] Wert:= LOWER_BORDER [COLOR="DeepSkyBlue"]to[/COLOR] UPPER_BORDER [COLOR="DeepSkyBlue"]do[/COLOR]
	[COLOR="DeepSkyBlue"]begin[/COLOR]
	write(Wert);
	Laufwert:= Wert + 1;
	Multiplikationsschleife:=0;
	Multiplikationsergebnis := Laufwert;
	
		[COLOR="DeepSkyBlue"]while[/COLOR] (Multiplikationsergebnis < MULT_BORDER)[COLOR="DeepSkyBlue"]do[/COLOR]
			[COLOR="DeepSkyBlue"]begin[/COLOR]
			Multiplikationsergebnis := Multiplikationsergebnis * Laufwert;
			Multiplikationsschleife := Multiplikationsschleife+1;
			[COLOR="DeepSkyBlue"]end;[/COLOR]

			
		[B][COLOR="DeepSkyBlue"]repeat[/COLOR]
		sqrtergebnis := sqrt(Laufwert);
		Wurzelschleife := Wurzelschleife + 1;
		[COLOR="DeepSkyBlue"]until[/COLOR] sqrtergebnis < SQRT_BORDER ;

		write ('Mult:',Multiplikationsschleife); 
		writeln ('Wurzeln:',Wurzelschleife)
				
		Teiler:=1 ;
		[COLOR="DeepSkyBlue"]Repeat[/COLOR]
		Teiler := Teiler+1;
		Rest := Laufwert mod Teiler;
		[COLOR="DeepSkyBlue"]until[/COLOR] Rest = 0;
			[COLOR="DeepSkyBlue"]if[/COLOR] Teiler = Laufwert [COLOR="DeepSkyBlue"]then[/COLOR]
			WertistPrimzahl:= True;
				
		[COLOR="DeepSkyBlue"]for[/COLOR] Primzahlzaehler:= 2 [COLOR="DeepSkyBlue"]to[/COLOR] Laufwert - 1 [COLOR="DeepSkyBlue"]do[/COLOR]
		[COLOR="DeepSkyBlue"]begin[/COLOR] 
			Teiler:=1;
			[COLOR="DeepSkyBlue"]Repeat[/COLOR]
			Teiler := Teiler+1;
			Rest := Laufwert mod Teiler;
			[COLOR="DeepSkyBlue"]until[/COLOR] Rest = 0;
			[COLOR="DeepSkyBlue"]if[/COLOR] Teiler = Laufwert [COLOR="DeepSkyBlue"]then[/COLOR]
			Primzahl:= True;
			
			[COLOR="DeepSkyBlue"]if[/COLOR] Primzahl then 
			write (Primzahlzaehler,'_');
		[COLOR="DeepSkyBlue"]end;[/COLOR]
				
				
	
				
		[COLOR="DeepSkyBlue"]if[/COLOR] WertistPrimzahl = True [COLOR="DeepSkyBlue"]then[/COLOR]
		write('Prim:TRUE')
		[COLOR="DeepSkyBlue"]else[/COLOR]
		write('Prim:FALSE');
				
	[COLOR="DeepSkyBlue"]end;[/COLOR]			
[COLOR="DeepSkyBlue"]end.[/COLOR]
[/B]
 
Zuletzt bearbeitet:
Du hast eine äußere und eine innere Schleife. Geh mal gedanklich durch was da passiert:

Code:
for Wert:= LOWER_BORDER to UPPER_BORDER do
begin
[...]
Laufwert:= Wert + 1;
[...]
	repeat
	sqrtergebnis := sqrt(Laufwert);
	Wurzelschleife := Wurzelschleife + 1;
	until sqrtergebnis < SQRT_BORDER ;
[...]
end;

Zu Beginn des 1. Durchlaufs hat die Variable "Laufwert" den Wert 0, wird dann um 1 inkrementiert und anschließend geht es in die Wurzelschleife.

Dort wird nun im 1. Schritt versucht die Wurzel aus 1 zu ziehen, was 1 ist (bzw. auch -1 bei reellen Zahlen) und nach dem 1. Durchlauf wird die Schleifenbedingung geprüft: "1 < 5" ist wahr und somit wird die Schleife nach dem 1. Durchlauf verlassen. Soweit so gut.

Nun überlege was beim 30. Durchlauf passiert. Laufwert ist 30 und es geht in die Wurzelschleife. Dort wird im 1. Durchlauf die Wurzel aus 30 gezogen und das Ergebnis mit dem Wert der Variable "SQRT_Border" verglichen: "5,47 < 5" ist falsch und daher gibts noch eine Runde. Aber genau da ziehst du wieder aus 30 die Quadratwurzel. Die Variable "Laufwert" ändert sich an dieser Stelle ja nicht.

Eine Lösung wäre eine weitere Variable zu verwenden in die du das Ergebnis ablegst und mit einer If-Verzweigung den Wert überprüfst. Gibt vielleicht noch schönere, elegantere Lösungswege, aber im Programmieren bin ich net so der Held. :P
 
Einmal zu 4.: Was sollte zum Beispiel bei 16 heraus kommen? Meinem Verständnis nach soll das Ergebnis angeben wie oft man aus der aktuellen Zahl die Wurzel ziehen kann, bis der Wert kleiner 5 ist.

Wenn wir also bei 20 anfangen:
sqrt(20) = 4.47...
Ergebnis: 1
Bei Startwert 4:
4 < 5 -> Ergebnis 0
Und bei 30:
sqrt(30) = 5.477...
sqrt(5.47..) < 5
Ergebnis 2

Ist mein Verständnis der Aufgabenstellung so korrekt? Weil das wäre dann was komplett anderes als was der Code so macht :).

mfg benediktibk
 
Ja, das steht ja schon im ersten Post. Nur ist das jetzt auch das, was ich im letzten Post beschrieben habe? Oder doch etwas anderes?
Was soll denn zum Beispiel für 20 und 30 heraus kommen?

mfg benediktibk
 
Ja, das steht ja schon im ersten Post. Nur ist das jetzt auch das, was ich im letzten Post beschrieben habe? Oder doch etwas anderes?
Was soll denn zum Beispiel für 20 und 30 heraus kommen?

mfg benediktibk


bei Wurzel 20 soll er sagen wie oft er Wurzeln musste zb:

20 Wurzeln: 1 (da nur 1x wurzeln musste)
.
.
30 Wurzeln : 2 (da er 2x wurzeln muss um <5 zu sein)

Also der Laufwert selber (1-30) soll gewurzelt werden und dann soll angegeben werden wie oft er dies tun muss damit <5

Sorry wenns etwas unveständlich war vorher :/
 
Dann habe ich es eh richtig verstanden. Nur passt dann dein Code nicht zu Beschreibung, das müsste dann eher so aussehen:

Code:
           ...
           sqrtergebnis = Laufwert;
           Wurzelschleife := 0;
           while sqrtergebnis < SQRT_BORDER do
           begin
                   Wurzelschleife := Wurzelschleife + 1;
                   sqrtergebnis = sqrt(sqrtergebnis);
           end;
           ...

mfg benediktibk
 
Zurück
Oben