# Primzahlen mit Wurzel



## StephaniePlum (26. April 2004)

:-(  

Hallo zusammen bin absoluter Frischling in C++ (1.Semester) und verstehe nur Bahnhof. habe jetzt eine für mich schwere Aufgabe zu lesen und komme nicht weiter. Vielleicht kann mir ja jemand helfen

Aufgabe:
Schreiben Sie ein Programm, das die ersten m Primzahlen in ein Array schreibt.

Setzen Sie p[0] = 2. Die weiteren Primzahlen sollen gefunden werden, indem für jede ungerade Zahl n= 3,5,7,9.... geprüft wird, ob n durch eine schon im Array befindliche Primzahl, die kleiner oder gleich ?n ist, teilbar ist. Wenn nicht, wird n als nächste Primzahl in das Array eingetragen.

Wäre echt dankbar wenn mir da einer helfen kann, hatte bei der letzten Kompilierung 22 Fehler und bin fast am verzweifeln

Danke Steph


----------



## Kachelator (26. April 2004)

Hm, wir haben hier so eine Art Absprache, die besagt, dass wir bei der Aufgabenhilfe erst mal sehen wollen, dass der betreffende Fragesteller sich schon selbst mit dem Thema beschäftigt hat. Wir möchten nämlich vermeiden, dass die Leute irgendwann von uns nur noch fertige Lösungen erwarten und nichts mehr selbst lernen. 

Und ausserdem kann man besser über das Problem sprechen, wenn ein konkreter Sourcecode vorliegt. 

Poste doch bitte deinen Code mit den 22 Fehlern, dann sehen wir weiter.

Und noch eine Bitte: Nicht die Code-Tags vergessen!


----------



## StephaniePlum (26. April 2004)

Ok Ich weiß zwar nicht genau ob du das meintest, aber das hier ist mein bisheriger Versuch, konnte die Fehler auf drei reduzieren.



```
#include <iostream>
using namespace std;

void main()
{
	bool b;
	int p,n,j,i;
	double wurzel_n;
	b=false;
	wurzel_n = sqrt(double(n));
	for (n=2;n==100;n++);
			while (j<i && p[j] <= wurzel_n && !b)
				b=n%p[j]==0;
				b=true;
			cout<<p<<endl;
		
}
```


```
C 2065 / C2109
```

Er nimmt aufjedenfall den Wurzelbefehl nicht, nur warum keine Ahnung, denn den hatten wir vom Prof so vorgegeben gekriegt.


----------



## basd (26. April 2004)

in math.h ist sqrt z.B. definiert
um sqrt zu kennen  schreibst du:
#include "math.h"

Code Tags für den Code verwenden 


```
#include  <math.h>
#include <iostream>
using namespace std;

void main()
{
bool b;
int p,n,j,i;
double wurzel_n;
b=false;
wurzel_n = sqrt(double(n));
for (n=2;n==100;n++);
while (j<i && p[j] <= wurzel_n && !b)
b=n%p[j]==0;
b=true;
cout<<p<<endl;

}
```

zum weiterdenken:

*  n hat kein Wert zugewiesen bekommen !
*  for (n=2;n==100;n++); << Wozu ist das Gut ?
*  p[j]  << p ist nur ein Integer , du kannst kein Indexzugriff darauf machen (dass meint C2109); Erstelle p als Array .. die Länge musst du schon selber rausfinden 

Lese dir noch mal die Aufgabe durch:

Setzen Sie p[0] = 2. Die weiteren Primzahlen sollen gefunden werden, indem für jede ungerade Zahl n= 3,5,7,9.... geprüft wird, ob n durch eine schon im Array befindliche Primzahl, die kleiner oder gleich ?n ist, teilbar ist. Wenn nicht, wird n als nächste Primzahl in das Array eingetragen.

--> Bei Überprüfungen musst du nur die ungeraden Werte testen ,
d.h. eine Schleife von x = 3 solange x < ?n mit Inkrement von 2.

Eine while schleife sieht wie folgt aus


```
while(Bedingung)
{
Anweisung1;
..
Anweisung_m;
}
```

Hoffe das reicht als Denk anstöße , Frage ruhig weiter.


----------



## StephaniePlum (26. April 2004)

Das war schon mal etwas hilfreich zumindest akzeptiert er jetzt die wurzel danke, der rest ist aber irgendwie immer noch russisch, ich werde aber mir noch mal etwas zeit nehmen zum grübeln,  aber erstmal danke steph


----------



## StephaniePlum (26. April 2004)

*Oh mein Gott Ich bin blond*

also jetzt schaut es so aus das ich keine Fehler drinne habe aber das was ich will tut es immer noch nicht.

Naja irgendwie verstehe ich das ganze wohl nicht so richtig


```
#include <math.h>
```


scusi

bin da wohl ne absolute blindschleiche

for (n=2;n==100;n++)
heißt soweit ich weiß beginne für n bei 2 bis, bis 100 hoch und nehme immer ein dazu. So habe ich das verstanden.
Vielleicht mag mir das ja mal jemand auf Blondinenniveau erklären 
Danke


----------



## StephaniePlum (26. April 2004)

vor allem was das mit den Code tgs. und source code auf sich hat


```
#include <math.h> 
#include <iostream
using namespace std; 
void main()
{
	bool b;
                     int p[100];
	int n,i;
	double wurzel_n;
		b=false;
		for (n=2;n==100;n++);
		for (i=0;i<100;i++);
			wurzel_n = sqrt(n);
			while (2<i && p[i] <= wurzel_n && !b)
			{	b=n%p[i]==0;
				b=true;
			}
			cout<<n<<endl;
		
}
```


hoffe nur das das so klappt
steph


----------



## Kachelator (27. April 2004)

```
for (n=2;n==100;n++);
		for (i=0;i<100;i++);
```
Das sind zwei üble Zeilen. In der ersten steht drin "Setze zu Beginn n=2; Lass die Schleife laufen, *solange*  n gleich 100 ist (also nie); erhöhe n um 1. Der Schleifenkörper, also das, was wiederholt wird (ausser dem n++) ist in dem Fall *das Semikolon* . Das Semikolon steht für eine Leeranweisung, bzw. beendet die ganze _for_ -Konstruktion. Hier ein Beispiel für eine korrekte _for_ -Schleife, die die Zahlen von 2 bis 100 ausgibt:

```
#include <iostream>

using namespace std;

int main()
{
  int n = 0;
  
  for ( n= 2; n <= 100; ++n )
  {
    cout << n << endl;
  }
}
```

Die _for_ -Anweisung mit dem i sieht besser aus, allerdings ist auch da direkt ein Semikolen hinter, was der Compiler als leeren Schleifenrumpf ansieht.


----------



## StephaniePlum (27. April 2004)

*Ups*

Supie ich glaub ich geh besser nochmal in die Vorschule, habe ich gar nicht gesehen das ich da ein simikolon gesetzt habe, danke


----------



## basd (27. April 2004)

Mach dich nur nicht ständig schlecht, mit der zeit wird das schon, wir alle haben mal klein angefangen.

Weiter konkrete Fragen stellen und wir helfen gerne.


Vielleicht wäre es eine Idee am Anfang, das Programm noch recht "dumm" zu machen.
Sprich:
- Viele Ausgaben mit printf oder cout (siehe Beispiel von kachelator) helfen am Anfang sehr!
-  Konstrukte wie 
	
	
	



```
(2<i && p[i] <= wurzel_n && !b)
```
 in deinem while eher nicht anwenden sondern dies lesbar machen mit eventuell mehreren if/else etc.
- denke dran du kannst mit break; eine Schliefe sofort beenden
-

```
b=(n%p[i]==0);
				b=true;
```
du setzt b mit true oder false (je nach werten von n und p[i]) und danach setzt du b gleich auf true.  Vielleicht ist da ein Fehler


----------



## StephaniePlum (27. April 2004)

Ich ärgere mich einfach nur über mich selber, weil ich halt die kleinsten details vergesse, aber ok everything is possible gell? mit den anweisungen b=n%q .... 
das war so zusagen eine vorgabe, da wir das in der stunde davor durchgenommen haben, denke mal das er das dann auch sehen will. sonst würde ich nichts lieber tun als das weg lassen. Das mit b= true gucke ich mir gleich mal an. Danke


----------

