Autor Beitrag
xled
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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:

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:
public void Hoch(int spalte,int zeile)
        {
            int z=zeile, s = spalte, feld,i,j;
            int ok,zwischen;
           
            //So ist es  zu mühsam 
            if (zeile == 7 && status >= 9//Nur hochzählen wenn erster Durchgang erfolgt
            {
                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



BeitragVerfasst: 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.
ausblenden 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
ausblenden 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)            // alle Elemente (textboxen durchlaufen)
    {
        if(tmp.Text.Length == 0)          // wenn Textbox leer ist, auf 0 setzten
        {
            number = 0;
        }

        for (int i = 0; i < 9; i++)      // momentane Textbox bis 9 hochzählen
        {
            
            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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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:

ausblenden 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 + 10);
                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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Di 19.05.09 19:46 
user profile iconxled hat folgendes geschrieben Zum zitierten Posting springen:
Jedoch läuft dieses sehr langsam :-(

Das ist ganz klar. Ständiges Konvertieren kostet auf jeden Fall viel Zeit.

user profile iconxled hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: Di 19.05.09 23:08 
Nö, das geht schon :)
Du musst halt nur rechtzeitig abbrechen...

In etwa so:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.