Autor Beitrag
hasang321654
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 17.12.06 23: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?


ausblenden volle Höhe C#-Quelltext
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)
        {
            /*Arrays definieren und Index*/
            int[] zFelder = new int[1000];
            ArrayList zFelder2 = new ArrayList();
            ArrayList gFelder = new ArrayList();

            /*ArrayFelder Werte geben*/
            for (int arrayzahl = 0; arrayzahl < zFelder.Length; arrayzahl++)
            {
                zFelder[arrayzahl] = arrayzahl;
            }

            for (int i = 0; i < zFelder.Length; i++) //gerade Zahlen
            {
                    if (zFelder[i] % 2 > 0 || zFelder[i] % 2 < 0)
                    {
                        zFelder2.Add(Convert.ToInt32(i));
                    }
               
            }

            //hier einfügen
            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">//HIER DER FEHLER!!!</span>
            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 user profile iconChristian S.: Code- durch C#-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 18.12.06 17: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 :shock:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
hasang321654 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 18.12.06 18:08 
garstig vielleicht aber "nützlich" in meinem falle :lol:

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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 18.12.06 18: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:

ausblenden volle Höhe C#-Quelltext
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:
            /*Arrays definieren und Index*/
            int[] zFelder = new int[100];
            ArrayList zFelder2 = new ArrayList();
            ArrayList gFelder = new ArrayList();

            /*ArrayFelder Werte geben*/
            for (int arrayzahl = 0; arrayzahl < zFelder.Length; arrayzahl++)
            {
                zFelder[arrayzahl] = arrayzahl;
            }

            for (int i = 0; i < zFelder.Length; i++) //gerade Zahlen
            {
/*CS*/              if (zFelder[i] % 2 == 1//Modulo kann nur Werte 0 oder 1 annehmen
                    {
/*CS*/                  zFelder2.Add(i); //i ist schon ein Int32, muss nicht konvertiert werden
                    }
               
            }

            //hier einfügen
            zFelder2.RemoveAt(0);
            gFelder.Add(1);
            gFelder.Add(2);
           

/*CS*/      //double endzahl = Math.Floor(Math.Sqrt(zFelder.Length));
/*CS*/      int endzahl2 = (int)Math.Sqrt(zFelder.Length); //Cast nach int sollte Nachkommastellen abschneiden
            

loop:       
/*CS*/      int variable = (int)zFelder2[0]; //Du steckst int rein, also ist int drin, also reicht ein Cast ;-)
            gFelder.Add(variable);
           

            if (variable != endzahl2)
            {
                for (int i = 0; i < zFelder.Length; i++)
                {
                    if (zFelder[i] % variable == 0)
                    {
/*CS*/                  zFelder2.Remove(i); //s.o.
                    }
                }
                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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 18.12.06 19:26 
ich find dieses forum echt klasse!!!! dankee
hasang321654 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 18.12.06 21: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
ausblenden volle Höhe C#-Quelltext
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)
    {
      /*Arrays definieren und Index*/
      int[] zFelder = new int[1000];
      ArrayList zFelder2 = new ArrayList();
      ArrayList gFelder = new ArrayList();

      /*ArrayFelder Werte geben*/
      for (int arrayzahl = 0; arrayzahl < zFelder.Length; arrayzahl++)
      {
        zFelder[arrayzahl] = arrayzahl;
      }

      for (int i = 0; i < zFelder.Length; i++) //gerade Zahlen
      {
        if (zFelder[i] % 2 == 1)
        {
          zFelder2.Add(i);
        }
                
      }

      //hier einfügen
      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 user profile iconChristian S.: Code- durch C#-Tags ersetzt
hasang321654 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 18.12.06 21: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



BeitragVerfasst: Di 19.12.06 16:58 
Hallo,

habe jetzt ehrlich gesagt alles nur überflogen, aber folgendes ist Falsch:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
      for (int i = 0; i < zFelder.Length; i++) //gerade Zahlen
      {
        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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 19.12.06 23: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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 19.12.06 23: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.
ausblenden volle Höhe C#-Quelltext
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:
            /*Arrays definieren und Index*/
            int[] zFelder = new int[100];
            ArrayList zFelder2 = new ArrayList();
            ArrayList gFelder = new ArrayList();

            //Man kann das Array und die ArrayList in einer Schleife füllen.
            for (int arrayzahl = 0; arrayzahl < zFelder.Length; arrayzahl++)
            {
                zFelder[arrayzahl] = arrayzahl;
                if (zFelder[arrayzahl] % 2 == 1)
                    zFelder2.Add(arrayzahl);                
            }

            //hier einfügen
            zFelder2.RemoveAt(0);
            gFelder.Add(1);
            gFelder.Add(2);

            int endzahl2 = (int)Math.Sqrt(zFelder.Length);
            int variable;

            //Der erste Vergleich stellt sicher, dass noch Elemente in der Liste sind -> 100, 10000, etc. machten Probleme
            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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 20.12.06 17: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