none
Hilfe bei Fehlersuche RRS feed

  • Frage

  • Hallo

    Ich habe einen logischen Fehler in meinem Programm und findeihn ums verrecken nicht... Kann mir da jemand eventuell mal helfen?

    Ich möchte folgende sortierschleife umschreiben:

     private void Sortierung()
            {
                int x = -1; // x ist minus eins
                 for (int a = 0; a < value.Length; a++) // das ganze passiert 100 mal
                {
                    x++;                                // x wird hochgezählt ist also 0
    
                    for (int b = 0; b < value.Length; b++) // jede zahl in value abfragen ob sie x ist
                    {
    
                        if (value[b] == x)
                        {
                            sortierung[a]++;  //wenn eine zahl x ist in sortierung[a] hochzählen
                        }
    
                    }                               
    
    
                }
                ausgabe();
                Sort.Visible = false;
            }

    Diese Schleife funktioniert tadellos. Dann ist mir jedoch aufgefallen das sie viele durchgänge braucht, was unnötig ist, da ich das array vorher schon mit Bubblesort sortiert habe.

    Mein jetziger versuch, bei dem ich diese unnötigen Abfragen einsparen will sieht so aus:

    private void zaehlung()
            {
                int temp = 0;                   // temp auf 0 setzen
    
               for (int a = 0; a < 100; a++)    // das ganz wiederholt sich 100 mal
                {
                 
                    if (value[a] <= value[a + 1])// wenn array[0] kleiner oder gleich als array[1]
                    {
                        temp++;                 //Temphochzählen
                    }
                    else                        
                    {
                        sortierung[a] = temp;   // wenn array 1 größer als array 0 temp in sortierung [1]speichern
                        temp = 0;               // temp resetten
                    }
    
    
                }
                ausgabe();
            }

    Kann mich hier jemand aufklären? ich finde meinen Fehler einfach nicht, von meiner Dokumentation her kommt es mir eigentlich sogar logisch vor :(

    Vielen Dank im Vorraus


    • Bearbeitet Nils.O Dienstag, 18. September 2012 11:11
    Dienstag, 18. September 2012 10:45

Antworten

  • Hi Nils,

    den letzten Wert kannst du nach der Schleife Prüfen,

    Entweder er ist gleich dem Vorletzten, dann musst du da die Anzahl noch um 1 erhöhen oder es gibt ihn nur 1 mal.

    MFG

    Björn

    p.s.
    Die Anzahl von gleichen Einträgen kannst du auch mit Linq bestimmern.
    Schau dir mal den Thread an.
    http://social.msdn.microsoft.com/Forums/de-DE/visualcsharpde/thread/5b87b706-258b-469d-b9f5-fca4b64f3648

    • Als Antwort markiert Nils.O Dienstag, 18. September 2012 12:42
    • Tag als Antwort aufgehoben Nils.O Dienstag, 18. September 2012 12:43
    • Als Antwort markiert Nils.O Dienstag, 18. September 2012 12:43
    Dienstag, 18. September 2012 12:22
  • Hi Nils,

    in Zeudocode sehe es etwa so aus

    int MyRandom(rnd){

    int rZahl = rnd.Netz(0,61)

    if rZahl < 10 return rZahl+48

    if rZahl < 36 return rZahl+55

    else return rZahl +61

    }

    Wenn eine Logik hinter den Zahlen liegt kann man vielleicht auch direkt eine Funktion wie zB. f(x) = x^2-2x+3 schreiben. Wobei x dann der Random Wert ist.

    MFG

    Björn

    • Als Antwort markiert Nils.O Donnerstag, 20. September 2012 12:22
    Donnerstag, 20. September 2012 12:14

Alle Antworten

  • Hallo Nils,

    ein kleiner Hinweis, was Dein Ziel ist, wäre sehr hilfreich.


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/

    Dienstag, 18. September 2012 11:12
  • Danke schonmal :) . Das ziel ist es ein array das mit 100 random ints gefüllt ist zu sortieren, so das es am ende Folgendermaßen ausgegeben wird: Zahl 1: Anzahl 1 zahl 2 Anzahl 0 usw

    Vollständiger Quelltext

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            const int bereich = 100;
            int[] value = new int[101];
            int[] schönesaussehn = new int [100]{0,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,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99};
            int zuweiser;
            bool aufsteigend;
            int[] sortierung = new int[bereich];
    
            public Form1()
            {
                InitializeComponent();
                vorbereitung();
    
    
    
            }
    
    
            private void button1Click(object sender, EventArgs e)
            {
                Focus();
                vorbereitung();
                textBox1.Text = string.Empty;
                Random rnd = new Random();
    
                for (zuweiser = 0; zuweiser < value.Length; zuweiser++)
                {
                    value[zuweiser] = rnd.Next(bereich);
    
                }
                Bubblesort();
    
    
    
                foreach (int inhalt in value)
                {
    
                    textBox1.Text += inhalt + ", ";
                }
    
                Sort.Visible = true;
    
                if (textBox1.Text != string.Empty)
                {
                    Sort.Focus();
                }
            }
    
    
    
            private void Bubblesort()
            {
    
                if (checkBox1.Checked == true)
                {
                    aufsteigend = true;
                }
    
                else
                {
                    aufsteigend = false;
                }
                int zaehler = 0;
                for (int a = 0; a < value.Length; a++)
                {
                    zaehler++;
                    for (int b = a + 1; b < value.Length; b++)
                    {
    
    
                        if (aufsteigend == false)
                        {
                            zaehler++;
                            if (value[a] > value[b])            //BSP. wenn Array [0] größer als Array[1] ist   | Array 0= 10 > Array 1=2
                            {                                   //
                                int temp = value[b];            // Array [0] wird in int Temp geschrieben       | int temp = 10___________
                                value[b] = value[a];            // in Arry [0] wid  Array [1] reingeschriben    | Array [0] = 2             |
                                value[a] = temp;                // Array [1] wird der temporäre int zugewiesen  | Array [1] = 10            |
                            }
                        }                                       // -> in array 1 ist jetzt also der wert von 0, | Array [0] = 2 , Array [1]= 10     
                                                                //also wurden beide vertauscht
                        else
                        {
                            if (value[a] < value[b])
                            {
                                int temp = value[b];
                                value[b] = value[a];
                                value[a] = temp;
                            }
                        }
                    }
    
                }
            }
    
            private void SortClick(object sender, EventArgs e)
            {
                zaehlung();
    
            }
    
            private void zaehlung()
            {
                int temp = 0;                   // temp auf 0 setzen
    
               for (int a = 0; a < 100; a++)    // das ganz wiederholt sich 100 mal
                {
                 
                    if (value[a] <= value[a + 1])// wenn array[0] kleiner oder gleich als array[1]
                    {
                        temp++;                 //Temphochzählen
                    }
                    else                        
                    {
                        sortierung[a] = temp;   // wenn array 1 größer als array 0 temp in sortierung [1]speichern
                        temp = 0;               // temp resetten
                    }
    
    
                }
                ausgabe();
            }
            private void Sortierung()
            {
                int x = -1; // x ist minus eins
                 for (int a = 0; a < value.Length; a++) // das ganze passiert 100 mal
                {
                    x++;                                // x wird hochgezählt ist also 0
    
                    for (int b = 0; b < value.Length; b++) // jede zahl in value abfragen ob sie x ist
                    {
    
                        if (value[b] == x)
                        {
                            sortierung[a]++;  //wenn eine zahl x ist in sortierung[a] hochzählen
                        }
    
                    }                               
    
    
                }
                ausgabe();
                Sort.Visible = false;
            }
            private void ausgabe()
            {
                textBox1.Text = string.Empty;
                int g= -1;
                foreach (int i in sortierung)
                {
                    g++;
                    textBox1.Text += ("Zahl: " + schönesaussehn[g].ToString() + " Anzahl: " + i.ToString() + "\r\n");
                }
                foreach (int j in sortierung)
                {
                   sortierung[j] = 0;
                }
    
            }
    
            private void vorbereitung()
            {
                Output1.Text = string.Empty;
                Output2.Text = string.Empty;
    
            }
    
            private void textBox1KeyPress(object sender, KeyPressEventArgs e)
            {
                if (e.KeyChar > 0)
                {
                    e.Handled = true;
                }
            }
    
    
        }
    
    }

    Btw: sagt nix zu dem einen Array... Ich weiß das man es normalerweise mit eine schleife füllt aber ich hatte grade alle zahlen von 0 -100 in der Zwischenablage :D



    • Bearbeitet Nils.O Dienstag, 18. September 2012 11:33
    Dienstag, 18. September 2012 11:21
  • Hi Nils,

    einmal musst du bei

    value[a + 1]

    Aufpassen ob du noch im Array bist.

    Dann machst schreibst du in den Schleifen beim

     sortierung[j] 

    an Verschiedene stellen.

    Gehen wir mal von 5 nullen aus und dann eine 1 {0,0,0,0,0,1}

    In ersten Beispiel hast du.

     sortierung[0] = 5 

    Beim Zweiten:

     sortierung[4] = 5 

    MFG

    Björn

    Dienstag, 18. September 2012 11:49
  • Vielen Dank :9 das hat schonmal geholfen.. Ich hab es jetzt hinbekommen

       private void zaehlung()
            {
                int temp = 0;                   // temp auf 0 setzen
    
               for (int a = 0; a < 100; a++)    // das ganz wiederholt sich 100 mal
                {
                 
                    if (value[a+1] > value[a])
                    {
                        temp++;
                        sortierung[value[a]] = temp;   // temp in sortierung [1]speichern
                        temp = 0;                       // temp resetten
    
                    }
                    else                        
                    {
                        temp++;                 //Temphochzählen               
                    }
    
    
                }
                ausgabe();
            }

    Allerdings habe ich ein neues Problem... Den letzten wert des Randomarrays schreibt er nicht in neue Sortierarray, weil er ja nichts mehr zum vergleichen hat... Gibts da nen Trick wie man das umgehen kann?



    • Bearbeitet Nils.O Dienstag, 18. September 2012 12:54
    Dienstag, 18. September 2012 12:05
  • Hi Nils,

    den letzten Wert kannst du nach der Schleife Prüfen,

    Entweder er ist gleich dem Vorletzten, dann musst du da die Anzahl noch um 1 erhöhen oder es gibt ihn nur 1 mal.

    MFG

    Björn

    p.s.
    Die Anzahl von gleichen Einträgen kannst du auch mit Linq bestimmern.
    Schau dir mal den Thread an.
    http://social.msdn.microsoft.com/Forums/de-DE/visualcsharpde/thread/5b87b706-258b-469d-b9f5-fca4b64f3648

    • Als Antwort markiert Nils.O Dienstag, 18. September 2012 12:42
    • Tag als Antwort aufgehoben Nils.O Dienstag, 18. September 2012 12:43
    • Als Antwort markiert Nils.O Dienstag, 18. September 2012 12:43
    Dienstag, 18. September 2012 12:22
  • Tja,

    wie ich sehe, kaum arbeitet man zwischendurch mal, schon wurde geholfen.

    Viel Erfolg noch


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/

    Dienstag, 18. September 2012 12:24
  • Vielen Dank :) Es tut jetzt.
    Dienstag, 18. September 2012 12:43
  • Diese Schleife funktioniert tadellos. Dann ist mir jedoch aufgefallen das sie viele durchgänge braucht, was unnötig ist, da ich das array vorher schon mit Bubblesort sortiert habe.

    Hallo Nils.O,

    Schau Dir auch folgendes an:

    Parallel Programming in C#

    Parallel Computing in .NET

    Paralleles Sortieren

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 18. September 2012 13:41
    Moderator
  • Danke allen nochmal :) ich habe es auchnoch mit einer Linqmethode geschriben :)

    Ich bräuchte nochmal kurz hilfe, will dafür aber keinen neuen Theard aufmachen. Die randommethode aktzeptiert ja keine Bools... Wenn ich nun zahlen auch einem bestimmten bereich will

    -> bsp:

     value[a] = random.Next(48,57|| 65,90 && 97,122 ); // Achtung dieser code ist Falsch

    gibt es dann irgendwine andere möglichkeit als das ganze durch ifabfragen oder schleifen zu filtern?

    MFG


    • Bearbeitet Nils.O Donnerstag, 20. September 2012 10:15
    Donnerstag, 20. September 2012 10:06
  • Hallo Nils,

      http://www.geekpedia.com/KB38_How-do-I-generate-a-random-number-within-a-range.html

      http://stackoverflow.com/questions/3975290/c-sharp-produce-a-random-number-in-a-range

      ...


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 20. September 2012 10:19
    Moderator
  • Ja, da kann man einen Bereich definieren, das ist mir schon klar... Aber bräuchte ja drei ( von 48 bis 57, von 65 bis 90 und von 97 bis 122)

    Ich habs jetzt durch eine if-abfrage gelöst, dennoch würd mich interessiern ob es einfacher möglich ist :)

    Danke schonmal

    Donnerstag, 20. September 2012 10:26
  • Hi Nils,

    wenn ich die Richtig verstanden haben willst du nicht aus einem sondern aus 3 Bereichen eine Zahl.

    (random.Next(48,57) oder random.Next(65,90) ) und random.Next(97,122);

    Mir ist jetzt nicht klar an welche Bedingung du das "ODER" Knüpfen willst.

    MFG

    Björn

    Donnerstag, 20. September 2012 10:37
  • Ja so ist es. Ich will aus jedem der 3 Bereiche zufällige zahlen. Es gibt keine bedingung, er soll einfach auf deisen 3 Bereichen zahlen ziehen und die zwischenbereiche auslassen, mir ist da halt nix besseres eingefallen als der 'und'-boolean.
    Donnerstag, 20. September 2012 10:44
  • Hi Nils,

    da die Zahlen eindeutig zu zuordnen sind kannst du eine Funktion erstellen die dir zu einen Random X wert einen Y Wert zurück liefert.

    Steckt bei der Auswahl der Zahlen noch eine Logik dahinter die ich nicht sehe?

    MFG

    Björn

    Donnerstag, 20. September 2012 11:16
  • da die Zahlen eindeutig zu zuordnen sind kannst du eine Funktion erstellen die dir zu einen Random X wert einen Y Wert zurück liefert.


    Hier habe ich dich wohl falsch verstanden. Wo liegt mein fehler?

    Mein versuch:

    Also ich habe mir jetzt einen int erstellt, der alle zahlen die ich will enthält.

    int[] xy = new int {48,49 usw bis 122}

    Und den dann in die Randomabfrage eingefügt.

    for(int i = 0; o<100;0++)

    {

    meinarray = rnd.Next(xy);

    }

    So mag der compiler das aber irgednwei auch nicht, denn wenn ich meinarray beim debuggen ansehe stehen da haargenau dieselben werte wie in xy

    Donnerstag, 20. September 2012 11:46
  • Hi Nils,

    in Zeudocode sehe es etwa so aus

    int MyRandom(rnd){

    int rZahl = rnd.Netz(0,61)

    if rZahl < 10 return rZahl+48

    if rZahl < 36 return rZahl+55

    else return rZahl +61

    }

    Wenn eine Logik hinter den Zahlen liegt kann man vielleicht auch direkt eine Funktion wie zB. f(x) = x^2-2x+3 schreiben. Wobei x dann der Random Wert ist.

    MFG

    Björn

    • Als Antwort markiert Nils.O Donnerstag, 20. September 2012 12:22
    Donnerstag, 20. September 2012 12:14
  • Oke :) hatte das falsch verstanden/ gedacht :D

    Vielen dank. sieht wirklich besser aus als 3 ifabfragen danach

    Donnerstag, 20. September 2012 12:22