Entwickler-Ecke

C# - Die Sprache - Mein erstes Prog der Taschenrechner


ilwaka - Mi 31.12.08 14:27
Titel: Mein erstes Prog der Taschenrechner
Ich habe gestern Abend aus Langeweile mit dem Guide to C# angefangen und dann habe ich heute morgen
einen kleinen Taschenrechner programmiert.
Ihr könnt euch den ja mal angucken und was dazu sagen.
Welche C# Tutorials könnt ihr mir noch empfehlen.
Und ich wollte einem Freund das schicken aber der konnte das nicht starten.Er hatte sich extra .net Framework geholt.Was kann schief gelaufen sein.


P.S. Quellcode liegt in der .rar datei


jaenicke - Mi 31.12.08 15:00

Hallo und :welcome: im Forum,

ich werde ihn mir einmal anschauen. Aber zunächst einmal zu deiner Frage:
user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
Und ich wollte einem Freund das schicken aber der konnte das nicht starten.Er hatte sich extra .net Framework geholt.Was kann schief gelaufen sein.
Es gibt verschiedene Versionen des .NET Framework. Wenn du mit Visual C# 2008 Express arbeitest, dann wäre das .NET Framework 3.5 Runtime Environment was er braucht.
(Nicht zu verwechseln mit dem .NET Framework SDK!)

Das müsste dieser Download sein:
http://www.microsoft.com/downloads/details.aspx?FamilyId=AB99342F-5D1A-413D-8319-81DA479AB0D7&displaylang=de
evtl. braucht man auch das, ich weiß das gar nicht so genau, das macht immer das Installationsprogramm automatisch... :oops:
http://www.microsoft.com/downloads/details.aspx?FamilyID=333325fd-ae52-4e35-b531-508d977d32a6&DisplayLang=de


ilwaka - Mi 31.12.08 15:08

genau genommen abreite ich im moment mit SharpDevelop.
Das hab ich im Internet gefunden
ich werde im verlaufe des heutigen tages noch eine(ige) funktion(nen) einführen z.B. quadrat zahlen .
oder kannst du mir sogar sagen wo ich das Installer Programm herkriegen kann welches das macht


jaenicke - Mi 31.12.08 15:31

Welche Version bei SharpDevelop benötigt wird, weiß ich leider nicht, und ein dazu passendes Setupprogramm kenne ich auch nicht, denn ich habe das Programm noch nie benutzt.
Irgendwo kann man dort vermutlich das Zielframework einstellen, und dessen Runtime wird auch benötigt. Aber dazu kann sicher jemand anderes etwas sagen. ;-)

Was mir bei deinem Rechner aufgefallen ist: So wie du es jetzt machst gehst du davon aus, dass immer eine gültige Zahl eingegeben wird. Tut man das nicht, stürzt das Programm ab. Es gibt auch TryParse ;-).


ilwaka - Mi 31.12.08 15:38

ok.Wie mache ich das dann mit Tryparse. Und wie stell ich ein was er macht wenn es nicht klappt
thx
P.s. ok hab die option für das ziel framework gefunden...geht nur bis 2.0
hab mir jetzt mal Visual C# 2008 geholt. Mal gucken ob ich damit klarkomme :D


JüTho - Mi 31.12.08 15:51

Wie wäre es mit etwas mehr Eigeninitiative?

#D bietet den Wix Installer an, siehe Sharp Develop Community [http://community.sharpdevelop.net/forums/] und die dortige Suchfunktion.

Das ist doch eine sehr grundlegende Frage "Wie mach ich das ..."
user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
ok.Wie mache ich das dann mit Tryparse. Und wie stell ich ein was er macht wenn es nicht klappt

Entweder Du markierst im Code-Editor das Wort und drückst F1, oder Du schaust direkt in SDK-Doku/MSDN im Index nach. Zu jeder Klasse und allen Eigenschaften, Methoden, Ereignissen gibt es Erläuterungen und sehr viele Beispiele. Dort findest Du für solche Fragen schneller Antworten, als wenn Du in einem Forum eine Frage stellst und auf Antworten wartest.

user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
P.s. ok hab die option für das ziel framework gefunden...geht nur bis 2.0

#D Version 3 geht bis NET 3.5, ist aber noch in der Beta-Phase.

Für einen Taschenrechner brauchst Du "höher als 2.0" aber nur dann, wenn Du mit WPF arbeitest.

Gruß und Frohes Neues Jahr! Jürgen


ilwaka - Mi 31.12.08 16:16

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Wie wäre es mit etwas mehr Eigeninitiative?


hast ja recht :D
ok ich guck mal wie ich damit klarkomme.

Also ich versuche es mit Tryparse umzuwandeln und kriege nen wert zurück?und denn checke ich dann darauf ob es eine gültige int32 zahl ist.Ist das so richtig verstanden?


JüTho - Mi 31.12.08 17:19

user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
ok ich guck mal wie ich damit klarkomme.

Offensichtlich hast Du immer noch keine Lust, selbst in der SDK-Doku/MSDN nachzuschauen. Sonst könntest Du nicht so etwas schreiben:
user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
Also ich versuche es mit Tryparse umzuwandeln und kriege nen wert zurück?und denn checke ich dann darauf ob es eine gültige int32 zahl ist.Ist das so richtig verstanden?

Ich finde nämlich so eine Erläuterung:
MSDN hat folgendes geschrieben:
Int32.TryParse-Methode
Konvertiert die Zeichenfolgendarstellung einer Zahl in die entsprechende 32-Bit-Ganzzahl mit Vorzeichen. Ein Rückgabewert gibt an, ob die Operation erfolgreich abgeschlossen wurde.

Ich hoffe, Du erkennst die Unterschiede zwischen Deiner Beschreibung und der MSDN-Erläuterung.

Wehe, Du versuchst damit so etwas:

C#-Quelltext
1:
2:
3:
4:
int result = int.TryParse(InputTextBox.Text);
if (result is int) {
   //  Berechnung ausführen
}

Dann fasse ich alles als Silvesterscherz auf.

Frohes Neues Jahr! Jürgen


ilwaka - Mi 31.12.08 17:29

also ich habs noch nicht ganz verstanden ..ich versuchs nochmal


JüTho - Mi 31.12.08 17:57

Meine Güte! (Dieser Spruch bezog sich auf Deinen Versuch, denn Du inzwischen wieder gelöscht hast.) Ich kopiere mal die relevanten Zeilen aus dem Beispiel in der SDK-Doku:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
    bool     result;
// Int32, auf die einfache Variante verkürzt:
    result = Int32.TryParse("3"out int32Val);
    Show(result, "Int32", int32Val.ToString());

//  Das Beispiel benutzt diese Show-Methode:
protected static void Show(bool parseResult, string typeName, string parseValue)
{ ... }

//  Ausgabe:
Parse for Int32 = 3

Das übliche Vorgehen lautet:

C#-Quelltext
1:
2:
3:
4:
5:
int result = 0;
string input = "irgendwas";
if (int.TryParse(input, out result)) {
   //  mach was
}


Eigentlich wollte ich Dir konkret helfen und habe mir Deinen Code heruntergeladen. Ich weiß nicht, ob es sinnvoll ist, auf dieser Grundlage Kommentare abzugeben. Andererseits: wenn Du sonst keine Kontakte hast, musst Du freilich auf diesem Weg fragen. Also hier einige Anmerkungen (ohne Anspruch auf Vollständigkeit, die Reihenfolge hat nichts mit der Bedeutung zu tun):
Ich überlasse es Dir, diese Anmerkungen umzusetzen.

Gruß und Frohes Neues Jahr! Jürgen

PS 1. Bitte markiere Code als solchen, das liest sich besser: Unter "Bereiche" das C# auswählen und mit dem Plus-Button kennzeichnen.

PS 2. In der Regel habe ich keine Lust, Quelldateien herunterzuladen, zu extrahieren und in einem weiteren Fenster zu öffnen, wenn ich hier um eine Auskunft gebeten werde. Dazu kann man Code hier in die Fragen einbeziehen (und als solchen markieren). Das ist fast immer praktischer, erst recht, wenn es nur so wenige Zeilen sind.

PS 3. Dieses Programm hat in der Tat nichts mit einer speziellen NET-Version zu tun. Es muss also nur darauf geachtet werden, dass der Ziel-Rechner dasselbe NET hat wie der Programmierer. Vorschlag: #D Version 2.2 benutzen, Ziel 2.0 angeben und bei Deinem Freund auch 2.0 Runtime installieren (wie gesagt, es sei denn, Du willst mit WPF arbeiten; dann ist #D 3.x oder Visual Studio 2008 besser).


ilwaka - Mi 31.12.08 18:09

Ok vielen Dank
War ja nur mein erster Versuch.
Das mit Tryparse habe ich inzwischen rausbekommen und es klappt auch.
Ich habs nicht mit WinForms gemacht aus 2 Gründen.1.Bin ich im Tutorial noch nicht so weit :D 2. Wars ja nur ein Test für den Code.
Ich hab jetzt Visual Studio 2008.

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:
72:
73:
74:
75:
76:
77:
78:
79:
80:
using System;
public class Rechner
{
    public static void Main()
    {
        Console.Write("Dies ist ilwakas Rechner v.0.2\n");
        Console.Write("\n");
        Console.Write("\n");
        Console.Write("Wählen sie ihre Rechenart\n");
        Console.Write("(1)+ Plus\n");
        Console.Write("(2)- Minus\n");
        Console.Write("(3)* Mal\n");
        Console.Write("(4)/ Durch\n");
        
        string rart;
        rart = (Console.ReadLine());
        int art;
        bool result = Int32.TryParse(rart, out art);
        if (result)
        {
            Console.Write("Geben sie Zahl 1 ein: ");
            string zahl1;
            zahl1 = (Console.ReadLine());
            int number1;
            bool result1 = Int32.TryParse(zahl1, out number1);
            if (result1)
            {
                Console.Write("\nGeben sie Zahl 2 ein: ");
                string zahl2;
                zahl2 = (Console.ReadLine());
                int number2;
                bool result3 = Int32.TryParse(zahl2, out number2);
                if (result3)
                {

                    if (art == 1)
                    {
                        int Ergebnis;
                        Ergebnis = number1 + number2;
                        Console.Write("" + zahl1 + "+" + zahl2 + "=" + Ergebnis + "\n");
                        Console.Write("Danke für die Benutzung meines Rechners");
                    }


                    if (art == 2)
                    {
                        int Ergebnis;
                        Ergebnis = number1 - number2;
                        Console.Write("" + zahl1 + "-" + zahl2 + "=" + Ergebnis + "\n");
                        Console.Write("Danke für die Benutzung meines Rechners");
                    }
                    if (art == 3)
                    {
                        int Ergebnis;
                        Ergebnis = number1 * number2;
                        Console.Write("" + zahl1 + "*" + zahl2 + "=" + Ergebnis + "\n");
                        Console.Write("Danke für die Benutzung meines Rechners");
                    }
                    if (art == 4)
                    {
                        double Ergebnis;
                        double ergebnis2;
                        Ergebnis = number1 / number2;
                        ergebnis2 = number1 % number2;
                        Console.Write("" + zahl1 + "/" + zahl2 + "=" + Ergebnis + "," + ergebnis2 + "\n ");
                        Console.Write("Danke für die Benutzung meines Rechners");

                    }
                    
                }
            }
        }
        Console.Write("Falsche Eingabe. Neustarten \n");       
        Console.WriteLine("\n \n \n" + "Taste druecken um zu beenden");

                Console.ReadKey();
            
        
    }
}

Das ist jetzt der aktuelle Code.
Ja sag ich mal danke für die tipps.


JüTho - Mi 31.12.08 18:31

Sozusagen als PS 4 meines vorigen Beitrags.

Nach der Lektüre Deines ersten Versuchs ist mir klar geworden, wie sehr Du noch am Anfang bist. Insofern war mein "unduldsamer" Ton unpassend; ich werde versuchen, mich zu bessern. Deshalb hier ein paar grundsätzliche Anmerkungen, wie Du Dir das Vorgehen erleichtern kannst.

1. Intensiv die Hilfe und SDK-Doku/MSDN benutzen. In der IDE mit Markieren eines Begriffs (Klasse, Methode) und F1, oder (was ich praktischer finde) mit der Offline-Version der SDK-Doku, siehe Möglichkeiten der Informationsgewinnung [http://www.mycsharp.de/wbb2/thread.php?threadid=64815].

2. Ein weitere Einführung ist OpenBook Visual C# [http://openbook.galileocomputing.de/visual_csharp/].

Gruß Jürgen


ilwaka - Mi 31.12.08 18:40

:D
So schlimm war ja nicht ich hätte ja mal online suchen können aber der "trick" mit F1 ist echt gut.
Das Beispiel war so lang deswegen hab ich so lange gebraucht um das zu verstehen.


ilwaka - Mi 31.12.08 21:34

so. jetzt habe ich das programm überarbeitet.
man gibt erst zahl1 ein dann rechenzeichen und dann zahl 2 :D
ich hab die vier if durch switch ersetzt.
Und ich habe Tryparse integriet sodass sich das programm planmäßig beendet wenn man z.b a eingibt
ich nenne das ganze jetzt v1.0 :D

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:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
/*
 * Erstellt mit SharpDevelop.
 * Benutzer: yannik
 * Datum: 31.12.2008
 * Zeit: 11:11
 * 
 * Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
 */

using System;
public class Rechner
{
    public static void Main()
    {
        Console.Write("Dies ist ilwakas Rechner v.1.0\n");
        Console.Write("\n");
        Console.Write("\n");
        Console.Write("Geben sie Zahl1 ein:");


        string zahl1;
        zahl1 = (Console.ReadLine());
        int number1;
        bool result = Int32.TryParse(zahl1, out number1);
        if (result)
        {
            Console.Write("Geben sie das Rechenzeichen ein \n");
            Console.WriteLine("(1)+ Addieren");
            Console.WriteLine("(2)-Subtrahieren");
            Console.WriteLine("(3)+ Multiplizieren");
            Console.WriteLine("(4)Dividieren");

            string rart;
            rart = (Console.ReadLine());
            int art;
            bool result1 = Int32.TryParse(rart, out art);
            if (result1)
            {
                Console.Write("\nGeben sie Zahl 2 ein: ");
                string zahl2;
                zahl2 = (Console.ReadLine());
                int number2;
                bool result3 = Int32.TryParse(zahl2, out number2);
                if (result3)
                {

                    switch (art )
                    {
                        case (1):
                        int Ergebnis;
                        Ergebnis = number1 + number2;
                        Console.Write("" + zahl1 + "+" + zahl2 + "=" + Ergebnis + "\n");
                        Console.Write("Danke für die Benutzung meines Rechners");
                        break;
                    


                        case (2):
                    
                       
                        Ergebnis = number1 - number2;
                        Console.Write("" + zahl1 + "-" + zahl2 + "=" + Ergebnis + "\n");
                        Console.Write("Danke für die Benutzung meines Rechners");
                            break;
                    
                        case (3):
                    
                        
                        Ergebnis = number1 * number2;
                        Console.Write("" + zahl1 + "*" + zahl2 + "=" + Ergebnis + "\n");
                        Console.Write("Danke für die Benutzung meines Rechners");
                      break;
                        case (4):

                        double ergebnis = (double)number1 / (double)number2;
                        Console.Write("" + zahl1 + "/" + zahl2 + "=" + ergebnis + "" + "\n ");
                        Console.Write("Danke für die Benutzung meines Rechners");
                            break;

                    }
                    
                }
            }
        }
              
        Console.WriteLine("\n \n \n" + "Taste druecken um zu beenden");

                Console.ReadKey();
            
        
    }
}


JüTho - Do 01.01.09 11:26

Hallo,

na, das sieht ja schon etwas besser aus. Noch ein paar weitere Vorschläge (als Konkretisierung meiner früheren Hinweise):
Zitat:
Für das Rechenzeichen wäre die Eingabe eines Zeichens durch ReadKey sinnvoller.


C#-Quelltext
1:
2:
//  nach der Aufforderung für die Rechenart:
char art = Console.ReadKey().KeyChar;

Zitat:
ideale Situation für eine Fallunterscheidung: Worin unterscheiden sich diese Zweige denn?

Das "Danke" wird viermal geschrieben, das Ergebnis sieht (abgesehen vom Rechenzeichen und dem double-Ergebnis der Division) ebenfalls fast identisch aus. Diese Zeilen gehören also nicht innerhalb der switch-Anweisung, sondern einheitlich dahinter. Aus diesem Grund deklariere ich das ergebnis einheitlich als double:

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:
    double ergebnis = 0;
    bool possible = true;
    string message = String.Empty;
    switch(art) {
      case '+':
        ergebnis = number1 + number2;
        break;
      case '/':
        if (number2 == 0) {
           possible = false;
           message = "Division durch Null unzulässig"
        } else {
          ergebnis = (double)number1 / double(number2);
        }
        break;
      default:
        possible = false;
        message = "Rechenzeichen ist nicht zulässig";
        break;
    }
    if (possible) {
      Console.WriteLine("{0} {1} {2} = {3}", number1, art, number2, ergebnis);
    } else {
      Console.WriteLine(message);
    }
    Console.WriteLine("Danke schön");

Bitte beachte auch die Variante von WriteLine und die Unterscheidung durch possible: Dann kannst Du alle Fehlermeldungen zusammenfassen. Diese WriteLine-Variante entspricht String.Format; in den geschweiften Klammern sind auch Format-Angaben (wie die Anzahl der Dezimalstellen) möglich. Die Division durch Null fehlte bisher überhaupt. Unnötige Wiederholungen sind verschwunden.

Gruß und Frohes Neues Jahr! Jürgen

PS. An den WriteLine-Varianten siehst Du sehr schön, dass Du Dir das "Stöbern" in der SDK-Doku/MSDN/Hilfe schnell angewöhnen solltest. Dadurch erhältst Du viele Hinweise, was alles noch möglich ist.


ilwaka - Do 01.01.09 15:54

ok ich habe deinen code jetzt überall eingebaut und getest..klappt alles.
Vielen Dank

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:
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:
100:
101:
102:
103:
/*
 * Erstellt mit SharpDevelop.
 * Benutzer: yannik
 * Datum: 31.12.2008
 * Zeit: 11:11
 * 
 * Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
 */

using System;
public class Rechner
{
    public static void Main()
    {
        Console.Write("Dies ist ilwakas Rechner v.1.0\n");
        Console.Write("\n");
        Console.Write("\n");
        Console.Write("Geben sie Zahl1 ein:");


        string zahl1;
        zahl1 = (Console.ReadLine());
        int number1;
        bool result = Int32.TryParse(zahl1, out number1);
        if (result)
        {
            Console.Write("Geben sie das Rechenzeichen ein \n");
            Console.WriteLine("+ Addieren");
            Console.WriteLine("-Subtrahieren");
            Console.WriteLine("* Multiplizieren");
            Console.WriteLine("/ Dividieren");
            char art = Console.ReadKey().KeyChar;


            Console.Write("\nGeben sie Zahl 2 ein: ");
            string zahl2;
            zahl2 = (Console.ReadLine());
            int number2;
            bool result3 = Int32.TryParse(zahl2, out number2);
            if (result3)
            {
                double Ergebnis = 0;
                bool possible = true;
                string message = String.Empty;
                switch (art)
                {
                    case '+':

                        Ergebnis = number1 + number2;

                        break;



                    case '-':


                        Ergebnis = number1 - number2;

                        break;

                    case '*':


                        Ergebnis = number1 * number2;

                        break;
                    case '/':

                        if (number2 == 0)
                        {
                            possible = false;
                            message = "Division durch Null unzulässig";
                        }
                        else
                        {
                            Ergebnis = (double)number1 / (double)(number2);
                        }
                        break;
                    default:
                        possible = false;
                        message = "Rechenzeichen ist nicht zulässig";
                        break;
                }
                        if (possible)
                        {
                            Console.WriteLine("{0} {1} {2} = {3}", number1, art, number2, Ergebnis);
                        }
                        else
                        {
                            Console.WriteLine(message);
                        }

                }

            }

            Console.WriteLine("\n \n \n" + "Taste druecken um zu beenden");

            Console.ReadKey();


        }
    }


JüTho - Do 01.01.09 16:55

Ja, so geht es!

Die nächsten Schritte zur Verbesserung:

1. Die Variablen result und result3 werden ebenfalls durch possible ersetzt mit einem passenden message-String. (Die Deklarationen und die Reihenfolge der if-Abfragen müssen dann angepasst werden.)

2. Als Zahlen sind double statt int zugelassen.

3. Der Arbeitsablauf wird in eine Schleife eingebaut. Das Programm wird nicht automatisch nach jeder Rechnung beendet, sondern erst durch Eingabe von Ctrl-C (das zu prüfen ist in der Console etwas schwieriger).

Weiterhin viel Erfolg! Jürgen


ilwaka - Do 01.01.09 17:27

also
den 2. punkt hab ich erledgit
ich bin mir nicht ganz sicher aber ich glaub ich hab jetzt punkt 1 fertig.

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:
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:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
/*
 * Erstellt mit SharpDevelop.
 * Benutzer: yannik
 * Datum: 31.12.2008
 * Zeit: 11:11
 * 
 * Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
 */

using System;
public class Rechner
{
    public static void Main()
    {
        Console.Write("Dies ist ilwakas Rechner v.1.0\n");
        Console.Write("\n");
        Console.Write("\n");
        Console.Write("Geben sie Zahl1 ein:");


        string zahl1;
        zahl1 = (Console.ReadLine());
        double number1;
        bool possible = Double.TryParse(zahl1, out number1);
        if (possible)
        {
            Console.Write("Geben sie das Rechenzeichen ein \n");
            Console.WriteLine("+ Addieren");
            Console.WriteLine("-Subtrahieren");
            Console.WriteLine("* Multiplizieren");
            Console.WriteLine("/ Dividieren");
            char art = Console.ReadKey().KeyChar;


            Console.Write("\nGeben sie Zahl 2 ein: ");
            string zahl2;
            zahl2 = (Console.ReadLine());
            double number2;
           
           possible = Double.TryParse(zahl2, out number2);
           if (possible)
           {
               double Ergebnis = 0;

               string message = String.Empty;
               switch (art)
               {
                   case '+':

                       Ergebnis = number1 + number2;

                       break;



                   case '-':


                       Ergebnis = number1 - number2;

                       break;

                   case '*':


                       Ergebnis = number1 * number2;

                       break;
                   case '/':

                       if (number2 == 0)
                       {
                           possible = false;
                           message = "Division durch Null unzulässig";
                       }
                       else
                       {
                           Ergebnis = (double)number1 / (double)(number2);
                       }
                       break;
                   default:
                       possible = false;
                       message = "Rechenzeichen ist nicht zulässig";
                       break;
               }
               if (possible)
               {
                   Console.WriteLine("{0} {1} {2} = {3}", number1, art, number2, Ergebnis);
               }
               else
               {
                   Console.WriteLine(message);
               }

           }
           else
           {
               Console.Write("Zahl2 ungültig");
           }
            }
        else
        {
            Console.Write("Zahl 1 nicht gültig");
        }
            Console.WriteLine("\n \n \n" + "Taste druecken um zu beenden");

            Console.ReadKey();


        }
    }

vll kann ich nach jeden rechendurchgang sagen:taste drücken um weiterzumachen,E(xit)drücken um zu beenden.


JüTho - Do 01.01.09 18:40

Hallo,

user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
den 2. punkt hab ich erledgit

Es sieht so aus. Aber probier mal ein paar Varianten aus mit Komma und Dezimalpunkt; mal sehen, was dann passiert.

user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
ich bin mir nicht ganz sicher aber ich glaub ich hab jetzt punkt 1 fertig.

Aber nicht sehr schön. Du hast noch viele einzelne Write-Befehle, die durch WriteLine(message) ersetzt werden können.

Diesen Code-Teil brauchst Du wirklich nicht jedesmal zu kopieren, die using-Befehle nur dann, wenn sie wichtig sind.

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
/*
 * Erstellt mit SharpDevelop.
 * Benutzer: yannik
 * Datum: 31.12.2008
 * Zeit: 11:11
 * 
 * Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
 */

using System;


user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
vll kann ich nach jeden rechendurchgang sagen:taste drücken um weiterzumachen,E(xit)drücken um zu beenden.

Die Taste ist natürlich ziemlich gleichgültig; aber wie wird es gemacht, dass die nächsten Abfragen folgen?

Viel Erfolg! Jürgen


ilwaka - Do 01.01.09 18:57

was soll den mit komma und dezimal punkt passieren.Klappt bei mir beides
ich würd sagen mit so einer while schleife...
die hab ich jetzt aus guide to C# kopiert aber so könnte es gehen oder?

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:
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:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
public class Rechner
{
    public static void Main()
    {
        
        Console.Write("Dies ist ilwakas Rechner v.1.0\n");
        Console.Write("\n");
        Console.Write("\n");
        bool neuerechnung = true;
        while (neuerechnung)
        {
            Console.Clear();
            Console.Write("Geben sie Zahl1 ein:");


            string zahl1;
            zahl1 = (Console.ReadLine());
            double number1;
            bool possible = Double.TryParse(zahl1, out number1);
            if (possible)
            {
                Console.Write("Geben sie das Rechenzeichen ein \n");
                Console.WriteLine("+ Addieren");
                Console.WriteLine("-Subtrahieren");
                Console.WriteLine("* Multiplizieren");
                Console.WriteLine("/ Dividieren");
                char art = Console.ReadKey().KeyChar;


                Console.Write("\nGeben sie Zahl 2 ein: ");
                string zahl2;
                zahl2 = (Console.ReadLine());
                double number2;

                possible = Double.TryParse(zahl2, out number2);
                if (possible)
                {
                    double Ergebnis = 0;

                    string message = String.Empty;
                    switch (art)
                    {
                        case '+':

                            Ergebnis = number1 + number2;

                            break;



                        case '-':


                            Ergebnis = number1 - number2;

                            break;

                        case '*':


                            Ergebnis = number1 * number2;

                            break;
                        case '/':

                            if (number2 == 0)
                            {
                                possible = false;
                                message = "Division durch Null unzulässig";
                            }
                            else
                            {
                                Ergebnis = (double)number1 / (double)(number2);
                            }
                            break;
                        default:
                            possible = false;
                            message = "Rechenzeichen ist nicht zulässig";
                            break;
                    }
                    if (possible)
                    {
                        Console.WriteLine("{0} {1} {2} = {3}", number1, art, number2, Ergebnis);
                    }
                    else
                    {
                        Console.WriteLine(message);
                    }

                }
                else
                {
                    Console.Write("Zahl2 ungültig");
                }
            }
            else
            {
                Console.Write("Zahl 1 nicht gültig");
            }
            Console.Write("\n Neue Rechnung ausführen (J)a/(N)ein");
            if (Console.ReadKey().KeyChar != 'j'

               {
                   neuerechnung = false;
               }
        }
            Console.WriteLine("\n \n \n" + "Taste druecken um zu beenden");

            Console.ReadKey();
           

        }
    }


so jetzt hab ich die while schleife eingefügt.
Hab sogar gemacht das der Bildschrim vorher gesäubert wird :D
jetzt muss ich mir nur noch was mit den messages überlegen


jaenicke - Do 01.01.09 19:09

Dies ist eine Möglichkeit, ja. ;-)


JüTho - Do 01.01.09 19:12

user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
was soll den mit komma und dezimal punkt passieren.Klappt bei mir beides

Auf einem "deutschen" Rechner kann eine Eingabe wie "12.345" als 12345 (12 Tausend) interpretiert werden statt als 12 Komma 345.

user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
ich würd sagen mit so einer while schleife...
die hab ich jetzt aus guide to C# kopiert aber so könnte es gehen

Das ist eine der vielen Möglichkeiten.

user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
oder?

Bitte selbst ausprobieren!

Hast Du eigentlich schon den Debugger benutzt?

Gruß Jürgen


ilwaka - Do 01.01.09 20:59

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
was soll den mit komma und dezimal punkt passieren.Klappt bei mir beides

Auf einem "deutschen" Rechner kann eine Eingabe wie "12.345" als 12345 (12 Tausend) interpretiert werden statt als 12 Komma 345.







Ja bei mir geht das ..
Das mit der Schleife hab ich auch probiert und der Debugger läuft automatisch wenn ich das Programm kompiliere.


Kha - Do 01.01.09 21:18

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Das Programm wird nicht automatisch nach jeder Rechnung beendet, sondern erst durch Eingabe von Ctrl-C (das zu prüfen ist in der Console etwas schwieriger).
Ganz im Gegenteil, das sollte in der Konsole schon ohne eigenes Zutun funktionieren :zwinker: .

Ich bin mir gerade nicht sicher, ob ich ReadKey gut finde oder nicht, da die Eingabe damit sofort angenommen wird und der User sie nicht revidieren kann. Gut, es gibt Schlimmeres ;) .

Zitat:

C#-Quelltext
1:
2:
3:
4:
5:
string zahl2;
zahl2 = (Console.ReadLine());
double number2;

possible = Double.TryParse(zahl2, out number2);
Wenn ein Variablenname schon belegt ist, würde ich nicht durch Zweisprachigkeit ausweichen ;) . Die erste Variable könnte man beispielsweise "input" nenne, oder - wenn dir das nicht zu verworren ist -

C#-Quelltext
1:
2:
double number2;
possible = double.TryParse(Console.ReadLine(), out number2);


jaenicke - Do 01.01.09 21:20

user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
Das mit der Schleife hab ich auch probiert
Erfolgreich?

user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
und der Debugger läuft automatisch wenn ich das Programm kompiliere.
Nicht wenn du das Programm kompilierst, sondern nachdem du es startest läuft der Debugger.
Und dann kannst du schrittweise durch dein Programm gehen und das Programm hält an Stellen an, an denen du Haltepunkte gesetzt hast.


ilwaka - Do 01.01.09 21:23

Ja die Schleife funktioniert einwandfrei.
ICh meinte doch starten.Also der Debugger meldet nichts.
Wenn ich auf Debuggen starte klicke läuft das Programm und zwar einwandfrei


jaenicke - Do 01.01.09 21:51

user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
Also der Debugger meldet nichts.
Wenn ich auf Debuggen starte klicke läuft das Programm und zwar einwandfrei
So sollte es ja auch sein, wenn alles richtig ist.

Die Frage sollte vermute ich mal ;-) darauf abzielen, ob du schon einmal z.B. einen Haltepunkt gesetzt und schrittweise geschaut hast, was ab da passiert. Denn so kannst du auch selbst Fehler finden und beheben. Und das ist neben dem Programmieren selbst eine der wichtigsten Fähigkeiten, die man sich aneignen muss. ;-)


ilwaka - Do 01.01.09 22:17

ja ich habs gerade mal ausprobiert wie das geht...
Ich glaub ich mach mich mal daran die Consolen Anwendung in eine Windows Forms Anwendung umzubauen.
Ich werde dazu alles benutzen was ich bisher in dem Thread hier gelernt hab. :D


ilwaka - Fr 02.01.09 01:20

so.. ich hab das ganze jetzt als grafische anwendung.
Hab noch wurzelziehen und Prozentrechnung dazugefügt.
klappt alles super.
Wenn man den Radiobutton wurzelziehen anklickt wechselt der status von Zahl2 auf enabled=false.
wenn man danach ein anders anklickt wirds wieder aktiviert.
hier mal ein screenshot


JüTho - Fr 02.01.09 12:00

Hallo,

das sieht in der Tat schon nach etwas aus (für Deinen Kenntnisstand); auch die Idee mit dem Abschalten von Zahl2 ist gut. Ich vermisse eine TextBox für die Anzeige des Ergebnisses.

Damit wir Dir weiterhelfen können (mit Ratschlägen), ist aber der Quellcode wichtiger als der ScreenShot.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die Frage (zumDebugger) sollte vermute ich mal ;-) darauf abzielen, ob du schon einmal z.B. einen Haltepunkt gesetzt und schrittweise geschaut hast, was ab da passiert. Denn so kannst du auch selbst Fehler finden und beheben. Und das ist neben dem Programmieren selbst eine der wichtigsten Fähigkeiten, die man sich aneignen muss. ;-)

In der Tat, genau das meinte ich! :lol:

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Ganz im Gegenteil, das sollte in der Konsole schon ohne eigenes Zutun funktionieren :zwinker:

Da wirst Du recht haben. Ich hatte Ctrl-C als gängige Tastenkombination vorgeschlagen; aber das Prüfen einer (beliebigen) Kombination in der Console ist schwieriger als die einfache Abfrage nach ReadKey (darauf hatte ich hinweisen wollen). Aber das sollten wir nicht vertiefen.

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ein Variablenname schon belegt ist, würde ich nicht durch Zweisprachigkeit ausweichen ;)

Ich möchte die Gelegenheit nutzen und von deutschsprachigen Bezeichnern grundsätzlich abraten: Eigentlich bevorzuge ich die (korrekte) Verwendung von deutschen Begriffen. Aber NET und die IDE arbeiten mit englischen Begriffen; spätestens wenn zu einem Control (z.B. der TextBox EingabeZahl1) ein EventHandler erstellt wird, kommt es zu schlimmem Mischmasch wie EingabeZahl1_Validating; und dieses Denglisch finde ich noch viel schlimmer als konsequentes Englisch.

Gruß Jürgen


ilwaka - Fr 02.01.09 13:11

:D
Also bisher hab ich das Ergebnis in einer Messagebox ausgegeben.
Dann baue ich mal noch eine Textbox dazu.

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:
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:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
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
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            box2.Enabled = true;
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
           
            

                string Zahl1 = box1.Text;
                string Zahl2 = box2.Text;
                double Number1;
                double Ergebnis = 0;
                
                box3.Enabled = false;
                bool possible = double.TryParse(Zahl1, out  Number1);
                if (possible)
                    if (radioButton5.Checked)
                    {
                    Ergebnis=Math.Sqrt(Number1);
                    MessageBox.Show("" + Ergebnis + "");
                    }
                    else
                    {
                  if (possible)
                  {
                      {
                          double Number2;
                          possible = double.TryParse(Zahl2, out Number2);
                          if (possible)
                          {
                              if (radioButton1.Checked)
                              {
                                  Ergebnis = Number1 + Number2;



                              }
                              if (radioButton2.Checked)
                              {
                                  Ergebnis = Number1 - Number2;

                              }
                              if (radioButton3.Checked)
                              {
                                  Ergebnis = Number1 * Number2;
                              }
                              if (radioButton4.Checked)
                              {
                                  if (Number2 == 0)
                                  {
                                      possible = false;
                                      MessageBox.Show("Division durch Null unzulässig");
                                  }
                                  else
                                  {
                                      Ergebnis = (double)Number1 / (double)(Number2);
                                  }
                              }
                              if (radioButton6.Checked)
                              {
                                  double zwischensumme = Number1 / 100;
                                  Ergebnis = zwischensumme * Number2;
                              }
                          }
                      }

                      if (possible)
                      {
                          box3.Visible = true;
                          label3.Visible = true;
                          
                          box3.Text = ("" + Ergebnis + "");
                      }

                  }
                    else
                    {
                        MessageBox.Show("Zahl2 ist kein gültiger Double Wert.");
                    }
                }
                else
                {
                    MessageBox.Show("Zahl1 ist kein gültiger Double Wert.");
                }
                
        }

        private void radioButton5_CheckedChanged(object sender, EventArgs e)
        {
            box2.Enabled = false
                



        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            box2.Enabled = true;
        }

        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            box2.Enabled = true;
        }

        private void radioButton4_CheckedChanged(object sender, EventArgs e)
        {
            box2.Enabled = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();  
        }

        private void radioButton6_CheckedChanged(object sender, EventArgs e)
        {
            box2.Enabled = true;
        }
    }
}

so jetzt hab ich eine Textbox und in der wird das Ergebnis angezeigt.
Der Benutzer kann nicht reinschreiben weil die Box am anfag enabled=false kriegt.
Ich glaube das Projekt mit der Datenbank werde ich erstmal zurückstellen. :D
scheint doch noch sehr hoch zu sein.


jaenicke - Fr 02.01.09 13:55

Die ganzen Handler radioButton2_CheckedChanged usw., die alle das selbe tun, musst du auch nicht mehrfach schreiben. Es genügt, wenn du unter Ereignisse allen das selbe Ereignis zuweist. ;-)
Die anderen kannst du dann löschen.


JüTho - Fr 02.01.09 14:17

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die ganzen Handler radioButton2_CheckedChanged usw., die alle das selbe tun, musst du auch nicht mehrfach schreiben.

Und es geht noch schöner (einheitlich für alle RadioButtons!):

C#-Quelltext
1:
box2.Enabled = radioButton1.Checked;                    

Die Fehlermeldungen könnten auch in einem Label ausgegeben werden. Ich finde es unpraktisch, wenn man eine Meldung immer wegklicken muss. (Aber das ist meine persönliche Meinung; die MessageBox ist leider Windows-Standard.)

Ich hatte Dir schon bei der Console-Version empfohlen, alle Meldungen in eine string-Variable zu setzen und nur von einer Stelle aus eine Meldung auszugeben; dann ist es leichter, zusätzliche Prüfungen und Meldungen hinzuzufügen.

Außerdem sollten Bezeichner wie box2 und radioButton5 verboten werden: Spätestens in zwei Wochen weißt auch Du nicht mehr, was wozu dient. Sprechende Namen sind dringend anzuraten!

Noch ein paar Anmerkungen:

box3.Enabled gehört in die Designer-Festlegung (im Eigenschaften-Fenster); denn das wird sich nie ändern.

Statt mehrfache einzelne if-Abfragen ist eine if-else if-else if-Konstruktion besser. Denn wenn die erste Abfrage positiv entschieden wird, müssen die anderen Abfragen nicht mehr durchlaufen werden. (Leider gibt es bei RadioButtons keine einfache Index-Abfrage; deshalb kann nicht einfach mit switch gearbeitet werden - anders als bei Delphi mit der RadioButtonGroup. Es gibt ein Ersatzverfahren; aber das muss ich erst noch suchen.)

Wenn das Ergebnis an die box3 übergeben wird, solltest Du so schreiben:

C#-Quelltext
1:
2:
3:
box3.Text = "(" + Ergebnis.ToString() + ")"
// oder noch besser so:
box3.Text = String.Format("({0})", Ergebnis);

Ich habe zwar von Kha gelernt, dass ein Wert bei der String-Additon automatisch in einen String verwandelt wird; aber wenn man es selber schreibt, weiß man, was man tut. String.Format ist gut für das, wofür der Name steht, nämlich einen String zu formatieren. In beiden Varianten kannst Du auch die Art der Formatierung steuern.

Gruß Jürgen


JüTho - Fr 02.01.09 14:43
Titel: RadioButton-GroupBox
Ich habe jetzt ein Verfahren für dieses Problem gesucht und gefunden:
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Leider gibt es bei RadioButtons keine einfache Index-Abfrage; deshalb kann nicht einfach mit switch gearbeitet werden - anders als bei Delphi mit der RadioButtonGroup.

Weil dies etwas grundsätzlicher ist, gebe ich es als eigenen Beitrag weiter.

1. Vorbedingung: Bei jedem RadioButton muss das erste Zeichen eindeutig sein und möglichst dem Rechenverfahren entsprechen. Mit Ausnahme der Wurzel hast Du das schon so gelöst (aber es ist ja auch 'W' als Rechenzeichen für Wurzel denkbar).

2. Zusatzvariable im Formular einrichten:

C#-Quelltext
1:
char currentOperation = #0;                    


3. CheckedChanged-Event einheitlich für alle diese RadioButtons:

C#-Quelltext
1:
2:
3:
4:
5:
6:
private void OperationChanged(object sender, EventArgs e)
{
   RadioButton rb = sender as RadioButton;
   if (rb != null && rb.Checked)
      currentOperation = rb.Text[0];
}


4. switch benutzen bei der Ausführung der gewünschten Operation:

C#-Quelltext
1:
2:
3:
4:
switch(currentOperation) {
   case '+':  // Addition
      break;  // usw.
}


Gruß Jürgen


ilwaka - Fr 02.01.09 14:49

Wenn ich versuche das in einem zentralen string zu packen die meldungen schaffs ich nicht.
Ich mach irgendwas falsch.
was ist denn jetzt der Unterschied ob ich jetzt über all

C#-Quelltext
1:
box2.Enabled = false;                    

oder überall

C#-Quelltext
1:
box2.Enabled = radioButton1.Checked;                    

vll verstech ich auch nicht.
ICh komm gerade irgendwie nicht weiter.


JüTho - Fr 02.01.09 16:46

user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich versuche das in einem zentralen string zu packen die meldungen schaffs ich nicht.
Ich mach irgendwas falsch.

Wie ich schon bei der Console-Version sagte, muss dann die Reihenfolge von Deklaration, Prüfungen und Ausgabe angepasst werden. Aber Genaueres kann ich nur zu Code sagen. (Bitte nicht alles kopieren, nur die relevanten Teile.)

user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
was ist denn jetzt der Unterschied ob ich jetzt über all

C#-Quelltext
1:
box2.Enabled = false;                    

oder überall

C#-Quelltext
1:
box2.Enabled = radioButton1.Checked;                    

Inhaltlich ist es überhaupt kein Unterschied, aber von der "Schönheit der Programmierung" her: Bei der ersten Variante musst Du 1x "true" und (n-1)x "false" zuordnen. Wenn Du einen weiteren RadioButton hinzufügen willst, muss wiederum "false" hinzugefügt werden. Andererseits wird "true" hier abgeleitet von "1 Checked" und "false" von "1 not checked"; also kann man das auch verbinden.

Noch deutlicher wird die "Schönheit" dann, wenn man richtige Namen benutzt.

Gruß Jürgen


ilwaka - Fr 02.01.09 16:50

naja ich habe jetz den genauen code nicht mehr.
Aber kann ich das jetzt nicht einfach mal so lassen bei diesen Prog jetzt und mir dann beim nächsten Prog überlegen wie ich es von
anfang an einbaue.


jaenicke - Fr 02.01.09 17:17

Das musst du ja selbst wissen, nur wirst du vermutlich bei einem neuen Programm dann das genauso machen wie du es jetzt gemacht hattest, wenn du das gar nicht ausprobierst. ;-)


ilwaka - Fr 02.01.09 17:44

das ist gemein:D
naja ich glaube ich lasse diesen rechner jetzt erstmal vll komme ich späterem(höherem?)leistungsstand noch einmal darauf zurück.
jezt hab ich erstmal ein kleins projekt
ich will eine kleine windows anwendung machen die bin zahlen in dezimal zahlen umwandelt.
Vielen Dank für die Hilfe die ich hier bisher hatte...
Ich hab das Gefühl voll viel gelenrt zu haben


ilwaka - Sa 03.01.09 23:02

juhu;D

ich habe heute einen Zinsrechner programmiert.
ich habe diesmal alle fehlermeldungen als variable gemacht und an einer zentralen stelle ausgegeben.
also so wie ihr mir das vorgeschlagen habt.

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:
72:
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
    {
        public Form1()
        {
            InitializeComponent();
            
        }

        public void button1_Click(object sender, EventArgs e)
        {
            string Message = ("");
            string input1 = textBox1.Text;
            string input2 = textBox2.Text;
            double number1 = 0;
            double number2 = 0;
            //das kapital wird von string zu double gewandelt
            bool possible = Double.TryParse(input1, out number1);
            bool notpossible = false;
            if(possible)
            {
                
                //prozent wird in double konvert,also auch komma
                possible = Double.TryParse(input2, out number2);
                if (possible)
                {
                   // hier wird gerechnet
                    
                    double ergebnis = (number1 * number2) / 100;
                    textBox3.Text = ("" + ergebnis + "");
 
                }
                else
                {
                     notpossible = true;
                     possible = false;
                     Message = ("Zahl 2 ist keine gültige Zahl");

                }
            }
            else
            {
                 notpossible = true;
                 possible = false;
                Message=("Zahl1 ist keine gültige Zahl");
                
            }
            if (notpossible)
            {
                MessageBox.Show(""+Message+"");
            }
            

            
            }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        }
    }


JüTho - So 04.01.09 13:21

Hallo,

einige kleine Anmerkungen:

Die using-Anweisungen kannst Du (wie schon gesagt) fürs Forum weglassen; die sind fast immer unwichtig. (Du notierst auch zu viele, die Du gar nicht brauchst.)

Was sollen die Klammern bei den String-Zuweisungen?

C#-Quelltext
1:
textBox3.Text = ("" + ergebnis + "");                    

Diese sind überflüssig; nur bei der Gliederung komplizierter Berechnungen oder and/or-Abfragen sind sie hilfreich oder wichtig. Außerdem sollte für die Konvertierung immer ToString() verwendet werden (das hatte ich schonmal erläutert):

C#-Quelltext
1:
textBox3.Text = ergebnis.ToString();                    

Die zusätzliche Variable notpossible verwirrt: "false" heißt "nicht unmöglich", also "möglich", also possible - naja. Sie ist auch gar nicht nötig:

C#-Quelltext
1:
2:
3:
4:
5:
6:
string message = String.Empty;   // dies ist die saubere Vorgabe
//  dann kann so geprüft werden:
            if (! String.IsNullOrEmpty(message) )
            {
                MessageBox.Show(message);
            }

So wie Du die Prüfungen aufbaust, ist auch possible überflüssig; denn es kann auch kürzer geschrieben werden:

C#-Quelltext
1:
if( Double.TryParse(input1, out number1) )  { ... }                    

Weiterhin viel Erfolg! Jürgen


ilwaka - So 04.01.09 17:41

ok glaube hab deine hinweise reingearbeitet.
das mit den using hinweisen:D ich wollte es weglassen aber hab anscheinend doch wieder strg+a

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:
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            
        }

        public void button1_Click(object sender, EventArgs e)
        {
            string Message = ("");
            string input1 = textBox1.Text;
            string input2 = textBox2.Text;
            double number1 = 0;
            double number2 = 0;
            bool notpossible = false;
            //das kapital wird von string zu double gewandelt
            

            if (Double.TryParse(input1, out number1))
            {
                
                //prozent wird in double konvert,also auch komma
                 Double.TryParse(input2, out number2);
                if (Double.TryParse(input2, out number2))
                {
                   // hier wird gerechnet
                    
                    double ergebnis = (number1 * number2) / 100;
                    textBox3.Text = ergebnis.ToString();
 
                }
                else
                {
                     
                      notpossible = true;
                     Message = ("Zahl 2 ist keine gültige Zahl");

                }
            }
            else
            {
                notpossible = true;
                Message=("Zahl1 ist keine gültige Zahl");
                
            }
            if (notpossible)
            {
                MessageBox.Show(""+Message+"");
            }
            

            
            }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        }
    }


JüTho - So 04.01.09 17:53

user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:
ok glaube hab deine hinweise reingearbeitet.

Aber nur zum Teil: Klammern bei string-Zuweisungen, Verwendung von notpossible.

Jürgen


jaenicke - So 04.01.09 18:19

Und das kannst du auch weglassen. ;-)
In beiden Zeilen wird die Umwandlung ggf. durchgeführt, nur dass du beim zweiten Mal erst den Rückgabewert tatsächlich verwendest.
user profile iconilwaka hat folgendes geschrieben Zum zitierten Posting springen:

C#-Quelltext
1:
2:
                 Double.TryParse(input2, out number2);
                if (Double.TryParse(input2, out number2))


ilwaka - So 04.01.09 18:22

so habs jetzt die verwendung von possible vermieden.
wenn jetzt zahl1 oder 2 nicht gültigs ist wird kein neues fenster mehr geöffnet
sondern der fehler wird im ergebnis fenster angezeigt.
@ jaenicke :D
das sollte natürlich weg habs nur übersehen :D

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:
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            
        }

        public void button1_Click(object sender, EventArgs e)
        {
            string Message = "";
            string input1 = textBox1.Text;
            string input2 = textBox2.Text;
            double number1 = 0;
            double number2 = 0;
            bool notpossible = false;
            //das kapital wird von string zu double gewandelt
            

            if (Double.TryParse(input1, out number1))
            {
                
                //prozent wird in double konvert,also auch komma
                 
                if (Double.TryParse(input2, out number2))
                {
                   // hier wird gerechnet
                    
                    double ergebnis = (number1 * number2) / 100;
                    
                   Message = ergebnis.ToString();
 
                }
                else
                {
                     
                      
                     Message = "Zahl 2 ist keine gültige Zahl";

                }
            }
            else
            {
                
                Message="Zahl1 ist keine gültige Zahl";
                
            }
           
            textBox3.Text = Message;
            

            
            }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        }
    }