Autor Beitrag
traceurmicha
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 160
Erhaltene Danke: 9

Win XP SP2, Win 7 Pro., Ubuntu 9, Debian 5
C#, ASP.NET, MSSQL, PHP(Microsoft Visual Studio 2010 Ultimate, SharpDevelop 4, Microsoft SQL Server2008 Express, Eclipse for PHP)
BeitragVerfasst: Mi 25.02.09 19:11 
Hallo liebe C# Programmierer,
Ich hoffe das meine Frage hier richtig ist, wenn nicht entschuldigt das bitte.
Zu meiner Frage:
Ich soll für eine firma wo ich mich beworben hab nen Taschenrechner in C#
programmieren. Dazu nutze ich Microsoft Visual C# express. Mein Problem dabei ist nun
das der Rechner die Regeln Punktrechnung geht vor Strichrechnung und Quadrieren
geht über alles beinhalten soll.
Wie kann ich das realisieren?
Bitte um schnelle Hilfe! :angel:
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: Mi 25.02.09 19:14 
Benutze bitte die Forumssuche, über Taschenrechner wird häufiger diskutiert. Gehe ggf. auch ins Delphi-Forum, weil es wesentlich ein Problem der Verfahrensweise ist (Stichwort: Parser) und erst in zweiter Linie eine Frage der Programmiersprache.

Gruß Jürgen
traceurmicha Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 160
Erhaltene Danke: 9

Win XP SP2, Win 7 Pro., Ubuntu 9, Debian 5
C#, ASP.NET, MSSQL, PHP(Microsoft Visual Studio 2010 Ultimate, SharpDevelop 4, Microsoft SQL Server2008 Express, Eclipse for PHP)
BeitragVerfasst: Mi 25.02.09 19:16 
Hey Jürgen,
die suchfunktion habe ich schon genutzt aber dort
habe ich leider nichts gefunden was mir weiterhilft.
traceurmicha Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 160
Erhaltene Danke: 9

Win XP SP2, Win 7 Pro., Ubuntu 9, Debian 5
C#, ASP.NET, MSSQL, PHP(Microsoft Visual Studio 2010 Ultimate, SharpDevelop 4, Microsoft SQL Server2008 Express, Eclipse for PHP)
BeitragVerfasst: Mi 11.03.09 20:49 
So, den fast gesammten Quelltext hab ich nun, kann mir nun noch jemand helfen da die Exponentialrechnung reinzubringen für einstellige Exponenten? Das is mir nämlich immernoch nicht klar! Hier mein Quell text:
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:
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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace calculator
{
  class Program
  {
    private static int count = 0;

    static void Main(string[] args)
    {
      string input = null;
      List<double> inputList = new List<double>();
      double tempNum = 0;

      while (true)
      {
        count = 0;
        inputList.Clear();
        input = System.Console.ReadLine();

        while (count < input.Length)
        {
          switch (input[count])
          {
            case '+':
              break;
            case '-':
              count++;
              inputList.Add(-1 * readNextNumber(input));
              break;
            case '*':
              count++;            
              tempNum = inputList[inputList.Count - 1] * readNextNumber(input);
              inputList.RemoveAt(inputList.Count - 1);
              inputList.Add(tempNum);
              break;
            case '/':
              count++;
              tempNum = inputList[inputList.Count - 1] / readNextNumber(input);
              inputList.RemoveAt(inputList.Count - 1);
              inputList.Add(tempNum);
              break;
            default:
              inputList.Add(readNextNumber(input));
              break;
          }
          count++;
        }
        count = 0;

        double solution = 0;
        while (count < inputList.Count)
        {
          solution += inputList[count];
          count++;
        }

        Console.WriteLine(solution);
      }
    }

    private static double readNextNumber(string input)
    {
      char temp = input[count];
      bool isNegative = false;

      while (temp == '-')
      {
        isNegative = !isNegative;
        count++;
        if (count < input.Length)
          temp = input[count];
        else
          break;
      }

      int j = count;
      while (temp != '*' && temp != '/' && temp != '+' && temp != '-')
      {
        j++;
        if (j < input.Length)
          temp = input[j];
        else 
          break;
      }

      char[] num = new char[j - count];
      input.CopyTo(count, num, 0, j - count);

      count = j - 1;
      
      if (isNegative)
        return -arr2double(num);
      else
        return arr2double(num);
    }

    private static double arr2double (char[] arr)
    {
      int i = 0;
      string stringArr = "";
      while (i < arr.Length)
      {
        stringArr += arr[i];
        i++;
      }

      return Convert.ToDouble(stringArr);
    }
  }
}
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: Do 12.03.09 10:25 
Hallo,

zu Deiner konkreten Frage: Das Potenzieren (allgemein, nicht nur Quadrieren) solltest Du mit dem '^' steuern. (Man könnte auch "**" verwenden, aber das würde die Struktur etwas stören.) Wegen der Priorität kommst Du wohl nicht drumherum, das in einer weiteren Schleife vor der bisherigen while-Schleife zu verarbeiten. Aber damit solltest Du das ohne Weiteres in Deine Konstruktion einbauen können.

Ein paar Hinweise:

Ich finde es "tricky", die Subtraktion auf die Addition zurückzuführen und damit in der zweiten Schleife in einem Rutsch zu erledigen. Gute Idee! Aber hier passt eine foreach-Schleife besser. (Es sieht fast so aus, als ob Du nur for- und while-Schleifen kennst.)

Ich hätte als erstes alle Rechenzeichen und Zahlen herausgelesen und konvertiert und erst im zweiten Schritt gerechnet; Du hast das miteinander verbunden in einer Schleife. Das ist vermutlich vor allem Geschmackssache. (Bei meinem Verfahren könnten später Klammern eingebaut werden, bei Dir wäre das erheblich schwieriger.)

zu readNextNumber: So wie Du input als Argument übergibst, solltest Du auch count übergeben und nicht als globale Variable benutzen. (Das ist übrigens keine einheitliche Behandlung von input und count - Minuspunkt.) Für das Ende des Teilstrings gibt es String.IndexOfAny, das beschleunigt diese Prüfung; außerdem gibt es Substring - das erspart den Umweg über das char-Array. Damit kannst Du die "bessere" Variante double.TryParse() verwenden: Bei einem Eingabefehler würde es bei Dir "knallen", mit meiner Variante nicht. Ich hoffe, diese Hinweise genügen; ich möchte Dir diese Verbesserungen nicht einfach vorsetzen.

Viel Erfolg! Jürgen