Autor |
Beitrag |
hasang321654
Hält's aus hier
Beiträge: 9
|
Verfasst: So 17.12.06 22:06
Hallo erstmal an alle.
Ich bin Neueinsteiger in C#. Zwar kannte ich mich etwas mit c++ und java aus, aber die Sprachen hatten einige Punkte wo ich zum Anderen zurückgewechselt bin immer wieder, bis c# raus kam. Naja jedenfalls bin ich erstmal zufrieden mit meiner Entscheidung.
Ich habe ein kleine Konsolenanwendung geschrieben, die mir Primzahlen angeben soll, bis zu einer gewünschten Grenze, die ich in meinem Array zFelder[hierdiezahl] angebe.
Nun bei der Grenze "10" und "1000" klappt es ganz gut, außer dass es die Endzahl zweimal ausgibt, was widerum nicht schlimm ist ich glaub ich könnte es auch beheben. Nur mein Problem ist, dass es bei der Grenze "100" und "10000" und höher ein Fehler auftacht auf Zeile 41. Ich versteh diesen Fehler nicht und weiß auch nciht wie ich ihn beheben kann.
Wenn sie sich den Quelltext anschauen und ihn verstehen, könnten sie mir bitte ein tipp geben, was ich falsch mache?
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: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70:
| using System; using System.Collections; using System.Collections.Generic; using System.Text;
namespace Primzahlen2 { class Program { static void Main(string[] args) { int[] zFelder = new int[1000]; ArrayList zFelder2 = new ArrayList(); ArrayList gFelder = new ArrayList();
for (int arrayzahl = 0; arrayzahl < zFelder.Length; arrayzahl++) { zFelder[arrayzahl] = arrayzahl; }
for (int i = 0; i < zFelder.Length; i++) { if (zFelder[i] % 2 > 0 || zFelder[i] % 2 < 0) { zFelder2.Add(Convert.ToInt32(i)); } }
zFelder2.RemoveAt(0); gFelder.Add(1); gFelder.Add(2);
double endzahl = Math.Floor(Math.Sqrt(zFelder.Length)); int endzahl2 = Convert.ToInt32(endzahl);
loop: int variable = Convert.ToInt32(zFelder2[0]); <span style="color: red"> gFelder.Add(variable);
if (variable != endzahl2) { for (int i = 0; i < zFelder.Length; i++) { if (zFelder[i] % variable == 0) { zFelder2.Remove(Convert.ToInt32(i)); } } goto loop; }
foreach (int elem in gFelder) { Console.WriteLine(elem); }
foreach (int elem in zFelder2) { Console.WriteLine(elem); }
} } } |
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 18.12.06 16:48
Könntest Du vielleicht kurz erklären, wie das Programm überhaupt arbeiten soll? Das würde es einfacher machen, den Fehler zu finden.
Und ... ähm ... ich war geschockt, als ich sah, dass C# den goto-Befehl noch unterstützt. Ich hatte immer angenommen, dass C# so ein garstiges Zeug gar nicht zulässt
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
hasang321654
Hält's aus hier
Beiträge: 9
|
Verfasst: Mo 18.12.06 17:08
garstig vielleicht aber "nützlich" in meinem falle
Also ich deklariere drei Arrays. Ein Array dafür, zur wie vielten Zahl ich meine Primzahlen angeben will. Das zweite um es in ein endlos Array zu geben, damit ich nichts verschieben muss nach unter oder oben!! und das dritte, damit die gelöschten Primzahlen hier reinkommen und beim ausgeben mit dabei sind.
danach eliminier ich erstmal die geraden zahlen und übergebe die restlichen gleich dem endlos array und der eliminiert dann immer weiter vom kleinsten wert im array die vielfachen der anderen zahlen weg. dabei
verschachtel ich diese schleife in eine goto schleife. davor habe ich die wurzel ausgerechnet von meiner maximum zahl beispiel [1000] und habe sie auf eine ganze zahl gerundet und einem integer wert übergeben. bis zu diesem wert in dem falle 31 soll es nochmal ab loop: anfangen. nun bei 1000 klappt es ganz gut aber wie gesagt 100 und 10000 sehr schlecht...
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 18.12.06 17:33
Das wird daran liegen, dass bei 100 oder 10000 die Wurzel exakt wieder ein Integer ist und nicht abegrundet wird. Dadurch enthält zFelder2 am Ende kein Element mehr und der Zugriff auf das nullte Element schlägt fehl.
Hast Du übrigens mal drüber nachgedacht, C# 2.0 zu benutzen? Dann kannst Du diese doofen ArrayLists wegwerfen und generische Listen benutzen.
Ich in dem Quellcode mal ein paar Anmerkungen gemacht und Änderungen vorgenommen, der Fehler ist allerdings noch drin:
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: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| int[] zFelder = new int[100]; ArrayList zFelder2 = new ArrayList(); ArrayList gFelder = new ArrayList();
for (int arrayzahl = 0; arrayzahl < zFelder.Length; arrayzahl++) { zFelder[arrayzahl] = arrayzahl; }
for (int i = 0; i < zFelder.Length; i++) { if (zFelder[i] % 2 == 1) { zFelder2.Add(i); } }
zFelder2.RemoveAt(0); gFelder.Add(1); gFelder.Add(2);
int endzahl2 = (int)Math.Sqrt(zFelder.Length);
loop: int variable = (int)zFelder2[0]; gFelder.Add(variable);
if (variable != endzahl2) { for (int i = 0; i < zFelder.Length; i++) { if (zFelder[i] % variable == 0) { zFelder2.Remove(i); } } goto loop; }
foreach (int elem in gFelder) { Console.WriteLine(elem); }
foreach (int elem in zFelder2) { Console.WriteLine(elem); }
Console.ReadLine();
} |
//edit: Es ist wahrscheinlich einfacher, die Schleife zum Befüllen der Liste mit ungeraden Zahlen einfach mit der Schrittweite zwei laufen zu lassen und sich den Vergleich zu sparen
//edit2: Anstatt des garstingen loops kannst Du eine do-while- oder while-do-Schleife benutzen.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
hasang321654
Hält's aus hier
Beiträge: 9
|
Verfasst: Mo 18.12.06 18:26
ich find dieses forum echt klasse!!!! dankee
|
|
hasang321654
Hält's aus hier
Beiträge: 9
|
Verfasst: Mo 18.12.06 20:49
Es gibt wieder ein Problem. Ich habe deine Aufgabe befolgt und es geht jetzt viel besser. AUch mit den allen Grenzwerten schon mal eine Erweiterung.
Nur, bis zur Endzahl2 werden alle Zahlen eliminiert, aber nicht in die gFelder eingetragen, also im Code habe ich das nicht eingefügt, weil ich versucht habe an diversen Stellen aber es kamen immer 1,1,1,1,1,2,2,2,2,3,3,3,3 also die Zahlenfolge hintereinander bis zur endzahl2 und danach normal weiter wisst ihr wie ich es normal einfügen kann dass da 1,2,3,5,7,11,13 etc.. stehen ?
hier der geänderte Code
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: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71:
| using System; using System.Collections; using System.Text;
namespace Primzahlen { class Program { static void Main(string[] args) { int[] zFelder = new int[1000]; ArrayList zFelder2 = new ArrayList(); ArrayList gFelder = new ArrayList();
for (int arrayzahl = 0; arrayzahl < zFelder.Length; arrayzahl++) { zFelder[arrayzahl] = arrayzahl; }
for (int i = 0; i < zFelder.Length; i++) { if (zFelder[i] % 2 == 1) { zFelder2.Add(i); } }
zFelder2.RemoveAt(0); gFelder.Add(1); gFelder.Add(2); int endzahl2 = (int)Math.Sqrt(zFelder.Length); int variable = (int)zFelder2[0];
for(int z = variable;z <= endzahl2; z++) { if (variable != endzahl2) { for (int i = 0; i < zFelder.Length; i++) { if (zFelder[i] % variable == 0) { zFelder2.Remove(i); }
} } variable += 1; }
foreach (int elem in gFelder) { Console.WriteLine(elem); }
foreach (int elem in zFelder2) { Console.WriteLine(elem); }
} } } |
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
hasang321654
Hält's aus hier
Beiträge: 9
|
Verfasst: Mo 18.12.06 20:51
P.S da muss noch gFelder.Add(variable) rein zwischen den Zeilen 40-56 sein aber wo???
|
|
Lion1984
Hält's aus hier
Beiträge: 1
|
Verfasst: Di 19.12.06 15:58
Hallo,
habe jetzt ehrlich gesagt alles nur überflogen, aber folgendes ist Falsch:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| for (int i = 0; i < zFelder.Length; i++) { if (zFelder[i] % 2 == 1) { zFelder2.Add(i); } } |
%2 = gibt den rest einer ganz zahl divsion zurück, also zb 5%2 = 1 ... 2 mal 1 Rest..
wenn du gerade zahlen haben willst, dnan musst du auf 0 prüfen (zB4%2 = 0, da kein Rest).
lg Lion
|
|
hasang321654
Hält's aus hier
Beiträge: 9
|
Verfasst: Di 19.12.06 22:17
nene damit hat es ncihts zu tun...
das stimmt schon so. cih übertrage damit alle nicht geraden zahlen an zfelder2 weiter
hat keiner eine antwort?
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 19.12.06 22:44
Hallo!
Ich verstehe das Problem nicht. Wenn Du weißt, dass eine Zeile fehlt, dann musst Du doch auch rausfinden können, wo sie hin kommt - und sei es durch ausprobieren.
Die for-Schleife, welche Du neu eingebaut hast, ist so übrigens mit einer Zählvariable zuviel ausgestatte. Du zählst sowohl "variable" hoch, als auch "z". Damit hast Du in beiden immer denselben Wert -> eine überflüssig.
Grüße
Christian
//Edit: Ich wollte mal schauen, wie man den Algorithmus in schönere Code packt. Hier das Ergebnis und der Fehler bei 100, 10000, etc. ist auch.
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: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| int[] zFelder = new int[100]; ArrayList zFelder2 = new ArrayList(); ArrayList gFelder = new ArrayList();
for (int arrayzahl = 0; arrayzahl < zFelder.Length; arrayzahl++) { zFelder[arrayzahl] = arrayzahl; if (zFelder[arrayzahl] % 2 == 1) zFelder2.Add(arrayzahl); }
zFelder2.RemoveAt(0); gFelder.Add(1); gFelder.Add(2);
int endzahl2 = (int)Math.Sqrt(zFelder.Length); int variable;
while ((zFelder2.Count > 0) && ((variable = (int)zFelder2[0]) != endzahl2)) { gFelder.Add(variable);
for (int i = 0; i < zFelder.Length; i++) if (zFelder[i] % variable == 0) zFelder2.Remove(i); }
foreach (int elem in gFelder) { Console.WriteLine(elem); }
foreach (int elem in zFelder2) { Console.WriteLine(elem); } |
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
hasang321654
Hält's aus hier
Beiträge: 9
|
Verfasst: Mi 20.12.06 16:33
Dankeschön!!! endlich klappt es...
ich hatte es versucht in allen beriechen, wo ich hier stimmt es, dachte... aber vergeblich
danke für die lösung
|
|