Benutzer mit den meisten Antworten
Hilfe bei Fehlersuche

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
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 -
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
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/ -
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
-
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
-
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
-
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 -
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/ -
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:
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.
-
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
-
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 -
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
-
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
-
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.
-
-
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
-
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