Code Taschenrechner

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Wechseln zu:Navigation, Suche
Dieser Artikel sollte überarbeitet werden.
Die Regeln für GlossarWiki-Artikel sollten beachten werden.
Der Titel des Artikels sollte geändert werden.

In diesem Artikel fehlen die Quellenangaben.

Dieser Artikel ist nicht korrekt kategorisiert (siehe Regeln für GlossarWiki-Artikel).

Dies sind die einzelnen Funktion zur Eingabe von 1-9, ( ), +/-, *// und ,

private void eins_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "1";
}
private void zwei_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "2";
}
private void drei_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "3";
}
private void vier_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "4";
}
private void fuenf_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "5";
}
private void sechs_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "6";
}
private void sieben_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "7";
}
private void acht_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "8";
}
private void neun_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "9";
}
private void nu_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "0";
}
private void plus_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "+";
}
private void minus_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "-";
}
private void mal_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "*";
}
private void geteilt_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "/";
}
private void Komma_Click(object sender, System.EventArgs e)
{
 eingabe.Text += ",";
}
private void Klammer_auf_Click(object sender, System.EventArgs e)
{
 eingabe.Text += "(";
}
private void Klammer_zu_Click(object sender, System.EventArgs e)
{
 eingabe.Text += ")";
}

Diese Funktion wird aufgerufen, wenn auf "=" geklickt wird

private void gleich_Click(object sender, System.EventArgs e)
{
 // Überprüft ob nur die erlaubten Elemente eingeben wurden.
 // Wenn ja wird das Ergebnis berechnet
 if(CheckEntry(eingabe.Text))
 {
  decimal ergebnis = Calculated();
  eingabe.Text = ergebnis.ToString();
 }
 else
 {
  MessageBox.Show("Falsche Eingabe");
 }
}

Diese Funktion ist zur Überprüfung der Eingabe notwendig. Wenn die Eingabe korrekt war gibt die Funktion true zurück. Wenn dies nicht der Fall ist false

private bool CheckEntry(string entry)
{
 // Überprüft ob das erste Element kein Operand ist
 if(entry[0] > 40 && entry[0] < 48 && entry[0] != '+' && entry[0] != '-')
 {
  return false;
 }
 // Initialisieren der Variablen
 int Klammer=0;
 int Operator = 0; 
 // Schleife die über alle Elemente der Eingabe läuft
 for(int i=0; i < entry.Length; i++)
 {
  // Überprüft ob nicht irgendein falsches Zeichen eingegeben wurde 
  if(entry[i] < 40 || entry[i] > 57|| entry[i] == 46)
  {
   return false;
  }
  // Verringert die Variable Klammer um eins, wenn eine schließende Klammer gefunden wurde
  if(entry[i] == ')')
  {
   Klammer--;
  }
  // Wenn die Variable Klammer kleiner Null ist sind zuviel schließende Klammer vorhanden und 
  // die Funktion gibt false zurück
  if(Klammer < 0)
  {
   return false;
  }
  // Erhöht die Variable Klammer um eins wenn eine öffenende Klammer gefunden wurde
  if(entry[i] == '(')
  {
   Klammer++;
  }
  // kontrolliert, dass keine zwei * oder/ Zeichen hintereinander kommen
  if(entry[i] == '/' || entry[i] == '*')
  {
   if(Operator == 1)
   {
    return false;
   }
   else
   {
    Operator++;
   }
  }				
  else
  {	
   Operator = 0;
  }
 }
 // Wenn Klammer != 0 ist gibt es entweder zuviel schließende oder öffnende Klammern
 if(Klammer != 0)
 {
  return false;
 }
 // alles war richtig und die Funktion gibt true zurück
 return true;
}

Funktion mit der die Berechnung beginnt. Er berechnet zu erst die Klammer und dann den restlichen Ausdruck.

private decimal Calculated()
{
 // entry wird gleich dem Text in der Textbox eingabe gesetzt
 string entry = eingabe.Text;
 // Druchläuft den String entry und berechnet die Klammern
 for(int i = 0; i < entry.Length; i++)
 {
  if(entry[i] == ')')
  {
   Klammer(ref entry, i);
   i = 0;
  }
 }
 // Berechnet den Rest der übrig geblieben ist
 decimal e = berechnen(entry);
 // Gibt das Ergebnis zurück
 return e;
}

Funktion, die die Klammern berechnet:

private void Klammer(ref string entry, int i)
{
 // Initialisieren der Variablen
 int begin = 0;
 int end = i;
 // Sucht die erste öffnende Klammer
 for(;i >= 0; i--)
 {
  if(entry[i] == '(')
  {
   begin = i;
   break;
  }
 }
 // setzt piece gleich einem Substring von entry
 // es ist der Substring der Klammer			
 string piece = entry.Substring(begin+1, (end-(begin+1)));
 // wird der piece berechnet
 decimal j = berechnen(piece);
 // hier wird entry mit dem Wert der Klammer statt der Klammer wieder zusammengesetzt			
 string v = j.ToString();
 string v1 = entry.Substring(0, (begin));
 string v2 = entry.Substring((end+1), (entry.Length-1)-end);
 entry = entry.Substring(0, (begin)) + v + entry.Substring((end+1), (entry.Length-1)-end);
}

Hier werden die eigenlichen mathematischen Berechnungen durchgeführt. Diese Funktion beherrscht Punkt vor Strich. Es wird allerdings nicht die Division durch Null berücksichtigt.

private decimal berechnen(string piece)
{
 // Hier werden zuerst die mal und geteilt Operationen durchgeführt
 // Dies ist einen for Schleife über den ganzen String piece
 for(int i=0; i<piece.Length; i++)
 {
  // Wenn ein geteilt oder mal Operator gefunden wurde wird hier hineingesprunge
  if(piece[i] == '/' || piece[i] == '*')
  {
   // Variablen werden Initialisiert
   decimal value1 = 0;
   decimal value2 = 0;
   int begin = 0;
   int end = 0;
   int j = i;
   // Hier wird j um eins verringert, weil i auf dem Operanden steht und die Funktion sofort abbrechen würde
   j--;
   // Hier wird der erste Wert für die Berechnung erstellt
   // piece wird rückwärts durchlaufen bis zum nächsten Operanden
   for(;j >= 0; j--)
   {
    // Wenn ein Operand gefunden wurde wird die Zahl bis zu diesem Operanden erstellt
    if(piece[j] == '+' || piece[j] == '-' || piece[j] == '/' || piece[j] == '*')
    {
     // Hier wird hineingelaufen wenn einen vorzeichenbehaftete Zahl am Anfang steht
     if(j==0)
     {
      // Value1 wird gleich der erhaltenen Zahl gesetzt
      value1 = Convert.ToDecimal(piece.Substring(0, i));
      // Hier wird begin auf den Anfang der Operation gesetzt, um piece nachher wieder zusammmenzufügen
      begin=0;
      break;
     }
     else
     {
      // Hier wird überprüft ob die Zahl vorzeichenbehaftet ist
      if(piece[j-1] == '+' || piece[j-1] == '-')
      {
       // Wenn dies der Fall ist wird hineingelaufen
       if(piece[j] == '+' || piece[j] == '-' || piece[j] == '/' || piece[j] == '*')
       {
        // Hier wird dann value1 gleich der Zahl gesetzt
        j--;
        value1 = Convert.ToDecimal(piece.Substring(j+1,(i-(j+1))));
        // Hier wird begin auf den Anfang der Operation gesetzt, um piece nachher wieder zusammmenzufügen
        begin = j;
        break;
       }
       // Wenn die Zahl nicht vorzeichenbehaftet ist
       else
       {
        // Hier wird dann value1 gleich der Zahl gesetzt
        value1 = Convert.ToDecimal(piece.Substring(j+1,(i-(j+1))));
        // Hier wird begin auf den Anfang der Operation gesetzt, um piece nachher wieder zusammmenzufügen
        begin = j;
        break;
       }
      }
      // Wenn nur ein mal oder geteilt Operand gefunden wird, wird hier hineingelaufen
      else
      {
       // Hier wird dann value1 gleich der Zahl gesetzt
       value1 = Convert.ToDecimal(piece.Substring(j+1,(i-(j+1))));
       // Hier wird begin auf den Anfang der Operation gesetzt, um piece nachher wieder zusammmenzufügen
       begin = j;
       break;
      }
     }
    }
    // Hier wird hineingelaufen, wenn der Anfang von piece erreicht ist und die Zahl nicht vorzeichenbehaftet ist
    else if(j==0)
    {
     // Hier wird dann value1 gleich der Zahl gesetzt
     value1 = Convert.ToDecimal(piece.Substring(0, i));
     // Hier wird begin auf den Anfang der Operation gesetzt, um piece nachher wieder zusammmenzufügen
     begin=0;
     break;
    }
   }
   // j wird wieder gleich i gesetzt, um die andere Zahl für die Operationen zu erstellen
   j = i;
   // Hier wird j um eins erhöht, weil sonst die Schleife sofort abbrechen würde, weil i auf dem Operanden steht
   j++;
   // Hier wird der zweite Wert für die Berechnung erstellt
   // Wenn die hintere Zahl der Operationen vorzeichenbehaftet ist wird j nochmals um eins erhöht
   if(piece[i+1] == '-' || piece[i+1] == '+')
   {
    j++;		
   }
   // jetzt wird piece vorwärts durchlaufen und nach dem ersten nachfolgenden Operanden gesucht
   for(;j < piece.Length; j++)
   {
    // Wenn ein Operand gefunden wurde wird hier hineingelaufen
    if(piece[j] == '/' || piece[j] == '*' || piece[j] == '-' || piece[j] == '+')
    {
     // value2 wird gleich dem demensprechenden Wert gesetzt
     value2 = Convert.ToDecimal(piece.Substring(i+1, (j-1)-i));
     // end wird gleich j gesetzt und signalisiert damit das Ende der Operation, dies wird zum zusammenfügen von piece benötigt
     end = j;
     break;
    }
    // Hier wird hineingelaufen wenn das Ende von piece erreicht ist
    else if(j == (piece.Length-1))
    {
     // value2 wird gleich dem demensprechenden Wert gesetzt
     value2 = Convert.ToDecimal(piece.Substring(i+1, (piece.Length-1)-i));
     // end wird gleich j gesetzt und signalisiert damit das Ende der Operation, dies wird zum zusammenfügen von piece benötigt
     end = piece.Length-1;
    }
   }
   // Hier wird dann das Ergebnis der Operation berechnet
   // i steht immernoch auf dem Wert des Operanden
   decimal ergebnis;
   if(piece[i] == '/')
   {
    ergebnis = value1/value2;
   }
   else
   {
    ergebnis = value1*value2;
   }
   // wenn man am Ende von piece angelangt ist läuft er hierrein
   if(end == (piece.Length-1))
   {
    // wenn begin am Anfang von piece steht wird hier hineingelaufen
    if(begin == 0)
    {
     // Wird piece mit dem Wert anstatt der Operation wieder zusammengefügt
     piece = piece.Substring(0, begin) + ergebnis.ToString() + piece.Substring(end, (piece.Length-1)-end);
    }
    else
    {
     // Wird piece mit dem Wert anstatt der Operation wieder zusammengefügt
     piece = piece.Substring(0, begin+1) + ergebnis.ToString() + piece.Substring(end, (piece.Length-1)-end);
    }
   }
   else
   {
    // wenn begin am Anfang von piece steht wird hier hineingelaufen
    if(begin == 0)
    {
     // Wird piece mit dem Wert anstatt der Operation wieder zusammengefügt
     piece = piece.Substring(0, begin) + ergebnis.ToString() + piece.Substring(end, (piece.Length)-end);
    }
    else
    {
     // Wird piece mit dem Wert anstatt der Operation wieder zusammengefügt
     piece = piece.Substring(0, begin+1) + ergebnis.ToString() + piece.Substring(end, (piece.Length)-end);
    }
   }
   i=0;
  }
 }
 // Hier werden nun die +/- Operationen durchgeführt
 // Variablen werden initialisiert
 int k = 0;
 decimal value3 = 0;
 decimal value4 = 0; 
 int check = 0;
 // Es wird überprüft ob am Anfang des Strings zwei Vorzeichen stehen,
 // wenn dies der Fall ist werden die zwei Vorzeichen durch das passende
 // einzelne Vorzeichen ersetzt
 if(piece[0] == '+' || piece[0] == '-')
 {
  if(piece[0] == '+' && piece[1] == '-')
  {
   piece = "-" + piece.Substring(2,(piece.Length-2));
  }
  else if(piece[0] == '-' && piece[1] == '+')
  {
   piece = "-" + piece.Substring(2,(piece.Length-2));
  }
  else if(piece[0] == '-' && piece[1] == '-')
  {
   piece = "+" + piece.Substring(2,(piece.Length-2));
  }
  else if(piece[0] == '+' && piece[1] == '+')
  {
   piece = "+" + piece.Substring(2,(piece.Length-2));
  }
  k++;
 }
 // Die Zahl value3 wird erzeugt
 for(; k < piece.Length; k++)
 {
  if(piece[k] == '+' || piece[k] == '-')
  {
   if(k != 0)
   {
    value3 = Convert.ToDecimal(piece.Substring(0, k));
   }
   else
   {
    value3 = 0;
   }
   // Signalisiert das mindestens ein + oder - gefunden wurden nach 
   // der zweiten Stelle des strings
   check = 1;
   break;
  }
 }
 // wenn ein + oder - gefunden wurde werden sie jetzt berechnet
 if(check != 0)
 {
  // dies ist die Schleife die den String piece durchläuft und alle 
  // + und - Operationen berechnet
  while(k < piece.Length-1)
  {
   // Die Variable z wird gleich k gesetzt, dies ist später zur Erstellung der
   // zweiten Zahl für die Operation notwendig
   int z = k;
   if(piece[k] == '+')
   {	
    int rechnung=0;
    // k wird um eins erhöht damit es auf dem Vorzeichen oder der Zahl steht
    k++;
    // hier wird überprüft ob die Zahl vorzeichenbehaftet ist wenn ja
    // dann wird rechnung = 1 gesetzt
    if(piece[k] == '+' || piece[k] == '-')
    {
     if(piece[k] == '-')
     {
      rechnung = 1;
     }
     k++;
     z++;
    }
    // Hier wird die zweite Zahl für die Operation erzeugt
    for(;; k++)
    { 
     if(piece[k] == '+' || piece[k] == '-')
     {
      value4 = Convert.ToDecimal(piece.Substring(z+1, k-(z+1)));
      break;
     }
     if(k == piece.Length-1)
     {
      value4 = Convert.ToDecimal(piece.Substring(z+1, k-(z)));
      break;
     }
    }
    // Hier wird die Variable rechnung die oben gesetzt wurde ausgewertet
    if(rechnung == 0)
    {
     value3 = value3+value4;
    }
    else
    {
     value3 = value3-value4;
    }
   }
   // Die Variable z wird gleich k gesetzt, dies ist später zur Erstellung der
   // zweiten Zahl für die Operation notwendig	
   z = k;
   if(piece[k] == '-')
   {
    // k wird um eins erhöht damit es auf dem Vorzeichen oder der Zahl steht
    k++;
    int rechnung = 0;
    // hier wird überprüft ob die Zahl vorzeichenbehaftet ist wenn ja
    // dann wird rechnung = 1 gesetzt
    if(piece[k] == '+' || piece[k] == '-')
    {
     if(piece[k] == '-')
     {
      rechnung = 1;
     }
     k++;
     z++;
    }
    // Hier wird die zweite Zahl für die Operation erzeugt
    for(;; k++)
    {
     if(piece[k] == '+' || piece[k] == '-')
     {
      value4 = Convert.ToDecimal(piece.Substring(z+1, k-(z+1)));
      break;
     }
     if(k == piece.Length-1)
     {
      value4 = Convert.ToDecimal(piece.Substring(z+1, k-z));
      break;
     }
    }
    // Hier wird die Variable rechnung die oben gesetzt wurde ausgewertet
    if(rechnung == 0)
    {
     value3 = value3-value4;
    }
    else
    {
     value3 = value3+value4;
    }
   }
  }
 }
 // hier wird value3 gleich piece gesetzt wenn der String nach dem berechnen von
 // * und / keine + oder - Operation mehr enthält
 else
 {
  value3 = Convert.ToDecimal(piece);
 }
 return value3;
}