Ich bin mal so frei den Code etwas zu formatieren:
Code:
Console.WriteLine("Bitte geben Sie eine Zahl ein. Primzahl?");
int a = Convert.ToInt32(Console.ReadLine());
int b = 2; //potentieller Teiler
string e = "unbekannt"; // ist Primzahl?
if (a == 1) e = "ja";
while (e == "unbekannt") {
for (int i = 2; i < a; i++) {
if (b >= a)
e = "eine";
if ((a % b) == 0)
e = "keine";
b++;
}
};
Console.WriteLine("{0} ist {1} Primzahl!", a, e);
Erstmal ein paar kleinigkeiten zum Stil:
1. Das Semikolon am ende von Zeile 17 (nach der "}" von while) dürfte überflüssig sein.
2. Warum überhaupt eine While-Schleife, wenn du eigentlich nur prüfen willst ob e im Teil darüber schon gesetzt wurde?
Code:
if(e == "unbekannt") {
...
}
wäre doch deutlich besser.
3. Du benutzt eine for-Schleife (mit i als Zählvariable), warum "schleifst" du dann noch eine weitere Variable b mit, die du ebenfalls in jedem Durchlauf um 1 erhöhst? Hier kannst du doch das b++ (in Zeile 15) weglassen, und überall wo du jetzt mit "b" vergleichst, vergleichst du stattdessen mit i.
4. Du hast einen kleinen, aber doch gravierenden Denkfehler in deiner for-Schleife. Wie bereits gesagt gibt er dir für die Zahl 3 beispielsweise ein falsches ergebnis aus. Das liegt daran, dass beim Durchlauf mit i (oder b) = 3 die Schleife wie folgt ausgewertet wird:
Code:
a = 3
b = 3
e = "unbekannt"
if (3 >= 3) e = "eine" // soweit eigentlich richtig
//der Rest wird aber weiter ausgewertet, und e mit dem falschen überschrieben
if ((3 % 3) == 0) e = "keine" // das wollen wir nicht
Was du also willst ist, dass die For-Schleife beendet wird, sobald ein Ergebnis gefunden wurde (Primzahl oder nicht). Dafür gibt es in c#, wie in anderen programmiersprachen auch, das "
break" um die aktuelle Schleife zu beenden. Damit kannst du, wenn es eine Primzahl ist oder sicher keine ist, die Schleife verlassen und dein Ergebnis bleibt unverändert.
Zusätzlich würde ich stark davon abraten, einen String zu benutzen um den Zustand bzw einen boolschen Wert zu speichern. Wie bereits mehrfach hier schon angedeutet wurde, haben Strings teilweise recht eigenwillige Verhalten wenn man sie miteinander vergleicht. Ich würde eher empfehlen entweder ein "bool" zu nehmen, das true ist, wenn es sich um eine Primzahl handelt, und false wenn nicht. Alternativ geht auch ein int mit 0 als undefiniert, 1 als ja und 2 als nein (oder -1 undefiniert, 1 = ja, 0 = nein), da sich bool bzw int viel leichter und zuverlässiger vergleichen lassen.
Du hättest dann zwar eine kleine Redundanz bei der Ausgabe, aber die ist zu verkraften denke ich (Beispiel für den fall e ist int und -1 ungültig, 0 = keine primzahl, 1 = primzahl):
Code:
if (e > 0) {
Console.WriteLine("{0} ist eine Primzahl!", a);
} else {
Console.WriteLine("{0} ist keine Primzahl!", a);
}