Autor |
Beitrag |
xled
Hält's aus hier
Beiträge: 3
|
Verfasst: Mo 18.05.09 19:11
Hallo miteinander
Zuerst mal zu mir ich programmiere seit ungefähr 3 Wochen in C#. In der Schule habe ich schon C gelernt.
Nun bin ich an einem Programm in welchem 9 Text Boxen sind. Nun bin ich an einer Funktion die eine Textbox hochzählt und wenn sie 9 erreicht hat, dann die nächste um eines erhöht. Wenn diese wiederrum 9 erreicht die nächste und so weiter.
Nun weiss ich jedoch nicht ganz wie ich diese umsetzen soll.
Am Ende sollte es so eine Art BruteForce für Sudoku werden
Dies habe ich bereits:
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:
| public void Hoch(int spalte,int zeile) { int z=zeile, s = spalte, feld,i,j; int ok,zwischen; if (zeile == 7 && status >= 9) { feld = Convert.ToInt32(this.Controls.Find("textBox" + Convert.ToString(0) + Convert.ToString(zeile), false)[0].Text); feld++; this.Controls.Find("textBox" + Convert.ToString(0) + Convert.ToString(zeile), false)[0].Text = Convert.ToString(feld); status++; }
if(zeile==8) { for(i=0;i<9;i++) { feld = Convert.ToInt32(this.Controls.Find("textBox" + Convert.ToString(0) + Convert.ToString(zeile), false)[0].Text); feld++; this.Controls.Find("textBox" + Convert.ToString(0) + Convert.ToString(zeile), false)[0].Text = Convert.ToString(feld); status++; } this.Controls.Find("textBox" + Convert.ToString(0) + Convert.ToString(zeile), false)[0].Text = "1"; } else { Hoch(0,zeile+1); }
} |
Hoffentlich habt ihr eine Idee.
Gruss xled
|
|
psirus
Hält's aus hier
Beiträge: 5
|
Verfasst: Mo 18.05.09 22:12
Hallo,
verstehe ich dass richtig? du willst die 9 Boxen hintereinander bis auf 9 zählen. Ich geh jetz einfach mal davon aus.
Würd das folgendermaßen lösen:
Für die 9 Boxen würde ich zunächst die Referenzen in einem Array Speichern. Hier mal ganz stupide jede Box einzeln reingeschrieben.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| TextBox[] tb = new TextBox[9];
tb[0] = this.textBox1; tb[1] = this.textBox2; tb[2] = this.textBox3; tb[3] = this.textBox4; tb[4] = this.textBox5; tb[5] = this.textBox6; tb[6] = this.textBox7; tb[7] = this.textBox8; tb[8] = this.textBox9; |
Zum hochzählen dann das array durchlaufen und für jeden Eintrag (also jede Textbox) bis 9 zählen
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| private void hoch() { int number; foreach (TextBox tmp in tb) { if(tmp.Text.Length == 0) { number = 0; }
for (int i = 0; i < 9; i++) { number = Int32.Parse(tmp.Text); number++; tmp.Text = number.ToString(); } } } |
Wichtig dabei ist, dass du dafür sorgst dass Falscheingaben (z.B. Buchstaben) in der Textbox abgefangen werden.
Hoffe das geht in die Richtung was du gesucht hast.
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Di 19.05.09 09:57
Abgesehen davon, ob das überhaupt ein brauchbares Verfahren ist, würde ich unbedingt folgende Änderung empfehlen:
Benutze nicht TextBoxen, sondern ein int-Array; das spart das ständige Konvertieren. Du willst ja sowieso nur die Zahlen vergleichen und zuordnen. Erst am Ende (oder meinetwegen einmalig am Anfang) kann zwischen TextBox.Text und int umgeschaltet werden.
/Edit
Übrigens: Erst mit int.TryParse werden Falscheingaben abgefangen.
Jürgen
|
|
xled 
Hält's aus hier
Beiträge: 3
|
Verfasst: Di 19.05.09 19:40
Danke für eure Antworten
Ich habe jedoch gestern an meiner Funktion noch weitergearbeitet und es funktioniert auch
Sieht momentan so aus:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| public void Hoch(int spalte,int zeile) { int z=zeile, s = spalte, feld; if (this.Controls.Find("textBox" + Convert.ToString(zeile) + Convert.ToString(spalte), false)[0].Text == "9") { Hoch(spalte + 1, 0); this.Controls.Find("textBox" + Convert.ToString(zeile) + Convert.ToString(spalte), false)[0].Text = "1";
} feld = Convert.ToInt32(this.Controls.Find("textBox" + Convert.ToString(zeile) + Convert.ToString(spalte), false)[0].Text); feld++; this.Controls.Find("textBox" + Convert.ToString(zeile) + Convert.ToString(spalte), false)[0].Text = Convert.ToString(feld); } |
Jedoch läuft dieses sehr langsam
50% CPU Auslastung auf einem Dual 1,6 GHz
Ich werde mal dies mit dem Array ausprobieren und mich nochmal melden.
Dies mit dem Überprüfen ob es Zahlen sind mache ich später noch. Möchte zuerst das das Programm läuft
Gruss xled
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Di 19.05.09 19:46
xled hat folgendes geschrieben : | Jedoch läuft dieses sehr langsam  |
Das ist ganz klar. Ständiges Konvertieren kostet auf jeden Fall viel Zeit.
xled hat folgendes geschrieben : | 50% CPU Auslastung auf einem Dual 1,6 GHz |
Das ist weniger wichtig und braucht dich nicht zu stören. Du kannst davon ausgehen, dass der PC und das Framework die Auslastung sinnvoll verteilen.
Unter NET kostet vor allem der Programmstart CPU-Zeit wegen des JIT-Compilers und der Prüfung der Abhängigkeiten, aber "später" relativiert sich das.
Übrigens solltest du die Convert-Methoden vermeiden, fast immer gibt es bessere Alternativen - beispielsweise ToString statt Convert.ToString oder (wie schon gesagt) int.Parse, int.TryParse statt Convert.ToInt.
Jürgen
|
|
xled 
Hält's aus hier
Beiträge: 3
|
Verfasst: Di 19.05.09 20:30
Hallo
Habe erst bemerkt das mein Projekt fast unmöglich ist.
Auf einem normalem Sudoku hat es 9 mal 9 Felder mit 9 verschiedenen Zahlen. Dies ergibt ja eine gigantische Zahl.
Mein Computer brauchte schon lange für die ersten 6 TextBoxen. Was dann erst bei 81 und das mehrfach hintereinander.
Muss mir wohl ein neues Projekt überlegen
Gruss xled
PS:Hat hier eine Idee für mich in welchem man verschiedene Sachen kombinieren muss?
|
|
Thorsten83
      
Beiträge: 191
Erhaltene Danke: 1
|
Verfasst: Di 19.05.09 23:08
Nö, das geht schon
Du musst halt nur rechtzeitig abbrechen...
In etwa so:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| fülle(x, y) wenn das feld vollständig gefüllt wurde, und es keinen widerspruch gibt: gib wahr zurück wenn feld[x][y] noch nicht belegt wurde, und es bis jetzt keinen widerspruch im sudoku gibt: für i = 1 bis 9 setze feld[x][y] = i wenn(fülle(nächstes feld)) wahr zurück gibt, gib wahr zurück setze feld[x][y] auf "leer" gib falsch zurück |
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 20.05.09 11:57
Statt mit Controls bitte mit einer lokalen Datenkopie arbeiten, das ist bei weitem schneller.
Jede unnötige Operation kostet Zeit, die Du für Sinnvolleres verwenden könntest.
Lies also einmal beim Start deiner Routine die Daten ein, führe dann deine Operation aus (Sudoku lösen) und schreib anschließend das Ergebnis wieder in die GUI. Das Arbeiten auf GUI-Controls ist das schlimmste, was man aus Performance-Sicht tun kann (neben der Nutzung von Bubble Sort zum Sortieren von Zahlen ...) Auch die Arbeit mit Strings gehört zu den schlimmsten Qualen, die man einer CPU antun kann 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|