Taschenrechner mit GTK2 gemacht

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Xeon
Beiträge: 169
Registriert: So Dez 17, 2017 4:10 pm

Taschenrechner mit GTK2 gemacht

Beitrag von Xeon » Di Dez 29, 2020 3:23 pm

Hallo zusammen

Am Ende vom C-Turtorial wurde empfohlen einen Taschenrechner mit GTK+ zu machen.
Das habe ich mal jetzt gemacht. Ich habe nur die 4 Rechenoperationen Addition, Subtraktion, Multiplikation und Division programmiert. Kann jemand das Programm anschauen? Es ziemlich viel Code.


Liebe Grüße
Xeon

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Taschenrechner mit GTK2 gemacht

Beitrag von nufan » Di Dez 29, 2020 5:38 pm

"Viel" Code ist eine recht subjektive Einschätzung :) Ich würde vorschlagen du lädst den Code in ein SVN oder Git Repository.

Übrigens wurde vor kurzem Version 4 von GTK veröffentlicht:
https://blog.gtk.org/2020/12/16/gtk-4-0/
Für neue Anwendungen ist es sicher sinnvoll, mit einer aktuellen Version zu starten.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Taschenrechner mit GTK2 gemacht

Beitrag von Xin » Di Dez 29, 2020 8:40 pm

Xeon hat geschrieben:
Di Dez 29, 2020 3:23 pm
Am Ende vom C-Turtorial wurde empfohlen einen Taschenrechner mit GTK+ zu machen.
Das habe ich mal jetzt gemacht. Ich habe nur die 4 Rechenoperationen Addition, Subtraktion, Multiplikation und Division programmiert. Kann jemand das Programm anschauen? Es ziemlich viel Code.
Wenn Du möchtest, richte ich Dir ein Subversion-Repository ein und Du kannst den Code verteilen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Xeon
Beiträge: 169
Registriert: So Dez 17, 2017 4:10 pm

Re: Taschenrechner mit GTK2 gemacht

Beitrag von Xeon » Mi Dez 30, 2020 1:59 pm

nufan hat geschrieben: "Viel" Code ist eine recht subjektive Einschätzung :) Ich würde vorschlagen du lädst den Code in ein SVN oder Git Repository.
Es sind ca. 1100 Zeilen.
nufan hat geschrieben: Übrigens wurde vor kurzem Version 4 von GTK veröffentlicht:
https://blog.gtk.org/2020/12/16/gtk-4-0/
Für neue Anwendungen ist es sicher sinnvoll, mit einer aktuellen Version zu starten.
Ich habe GTK2 hier auf proggen.org gelernt, weil ich kein Englisch kann.
Xin hat geschrieben: Wenn Du möchtest, richte ich Dir ein Subversion-Repository ein und Du kannst den Code verteilen.
Eigentlich habe ich gedacht das jemand mein Programm anschaut und vielleicht Verbesserungsvorschläge hat. Soll ich den Code als Textdatei anhängen? Aber bitte nicht lachen über mein Programm.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Taschenrechner mit GTK2 gemacht

Beitrag von Xin » Do Dez 31, 2020 12:13 am

Xeon hat geschrieben:
Mi Dez 30, 2020 1:59 pm
nufan hat geschrieben: "Viel" Code ist eine recht subjektive Einschätzung :) Ich würde vorschlagen du lädst den Code in ein SVN oder Git Repository.
Es sind ca. 1100 Zeilen.
Das ist viel Code für so ein Forum. Für ein Programm ist das noch recht überschaubar.
Xeon hat geschrieben:
Mi Dez 30, 2020 1:59 pm
nufan hat geschrieben: Übrigens wurde vor kurzem Version 4 von GTK veröffentlicht:
https://blog.gtk.org/2020/12/16/gtk-4-0/
Für neue Anwendungen ist es sicher sinnvoll, mit einer aktuellen Version zu starten.
Ich habe GTK2 hier auf proggen.org gelernt, weil ich kein Englisch kann.
Möglicherweise möchte Nufan auch sagen, dass ich das Tutorial aktualisieren soll. :-D
Xeon hat geschrieben:
Mi Dez 30, 2020 1:59 pm
Xin hat geschrieben: Wenn Du möchtest, richte ich Dir ein Subversion-Repository ein und Du kannst den Code verteilen.
Eigentlich habe ich gedacht das jemand mein Programm anschaut und vielleicht Verbesserungsvorschläge hat. Soll ich den Code als Textdatei anhängen? Aber bitte nicht lachen über mein Programm.
Ein Subversion-Repository ist dafür da, dass andere Leute sich Deinen Code ansehen können und bei Bedarf auch verändern können. Ich verteile damit beispielsweise meine Quellcodes über verschiedene Rechner, eben Entwicklungsrechner und Laptop, an denen ich eventuell auch unterschiedliche Dinge im gleichen Programm entwickle. Dazu kommt ein Rechner, der das ganze unabhängig nochmal baut, um zu gucken, ob ich auch alle Quelltexte kopiert habe. Gleichzeitig dient das ganze auch als Backup.

So kann jeder sich eine Kopie des Codes ziehen. Allerdings müsstest Du dafür lernen mit Subversion umzu gehen.

1100 Zeilen passt aber vermutlich noch ins Forum, ansonsten als ZIP-Datei hochladen. Im Idealfall ins Forum, externe Quellen verschwinden meist irgendwann.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Xeon
Beiträge: 169
Registriert: So Dez 17, 2017 4:10 pm

Re: Taschenrechner mit GTK2 gemacht

Beitrag von Xeon » Do Dez 31, 2020 2:15 pm

Hier ist der Code:

Code: Alles auswählen

#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>



enum Schalten
{
  EINS,
  ZWEI,
  AUS
};

GtkWidget *Eingabe;
GtkWidget *Text;
char zeichenstring1[17]; //Maximal Zahlen größe von 15 stellen.
char zeichenstring2[17]; //Maximal Zahlen größe von 15 stellen.
short Schalter = EINS; //Für zeichenstring1 und zeichenstring2 schalten.
char Rechenverlauf[89]; //Wird verwendet um den Textverlauf anzuzeigen.
short aktuell = 0; //Zählt die einzelnen Zeichen vom Textverlauf.
short istgleich = AUS; /*Wird verwendet um das = zu verwalten und andere
eingaben zu deaktivieren.*/
short nullschalter = AUS; //Hier werden die nullen gesteuert.
short begrenztestellen = 15; //Wird verwenden um die stellen der Zahlen zu begrenzen.

void rechenverarbeitung(char zeichen, char *zeichenpuffer, int *i); /*+, -, x und :
wird verwaltet.*/
double Subtraktion(void); //Minus
double Addition(void); //Plus
double Multiplikation(void); //Mal
double Division(void); // Teilen
void alleszuruecksetzen(int *i, char *zeichenpuffer); //Setzt alles auf 0.
void TaschenrechnerMain(int argc, char **argv); //Grafische Oberfläche von Taschenrechner
void zahlanhaengen(char zahl, int *i); //Zahlen von 0 bis 9 werden angehängt
void ergebnis(char *zeichen, int *i); //Setzt das Ergebnis
void kommasetzen(int *i); //Hier wird das Komma eingefügt
void negativezahl(int *i); //Macht aus einer positiven Zahl eine Negative oder umgekehrt
void entfernezeichen(int *i); //Man kann eine Zahl entfernen wenn man sich vertippt hat


void entfernezeichen(int *i) //Entferne aktulle Zahl.
{
  if(Schalter == EINS) //Für zeichenstring1.
  {
    if(*i) //Wird nur ausgeführt, wenn man mindestens eine Zahl eingegeben hat.
    { //Zahl wird mit '\0' überschrieben.
      zeichenstring1[--(*i)] = '\0';
      Rechenverlauf[--aktuell] = '\0';
      if(zeichenstring1[0] == '\0') //Setze wieder die Zahl 0.
      {
        zeichenstring1[0] = '0';
        nullschalter = AUS; //Damit nicht mehrere 0 vor dem Komma ausgegben werden.
      }
      gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring1);
    }
  }
  else if(Schalter == ZWEI) //Für zeichenstring2
  {
    if(*i) //Wird nur ausgeführt, wenn man mindestens eine Zahl eingegeben hat.
    { //Zahl wird mit '\0' überschrieben
      if(istgleich == ZWEI) //Damit nach der = Betätigung keine Zahl gelöscht wird.
        return;
      zeichenstring2[--(*i)] = '\0';
      Rechenverlauf[--aktuell] = '\0';
      if(zeichenstring2[0] == '\0') //Setze wieder die Zahl 0
      {
        zeichenstring2[0] = '0';
        nullschalter = AUS; /*Damit nicht mehrere 0 vor dem Komma
        eingegeben werden könne.*/
      }
      gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring2);
    }
  }
}

//Macht aus einer positiven Zahl eine Negative oder umgekehrt.
void negativezahl(int *i)
{
  char stringpuffer[17], Rechenverlaufpuffer[89];
  int kommaposition, i1, i2;

  if(Schalter == EINS)
  {
    if(zeichenstring1[0] == '-') //Entfernt das Minus Zeichen, wenn gesetzt.
    {
      begrenztestellen = 15;
      //Minus Zeichen wird nicht in stringpuffer kopiert.
      for(i1 = 1, i2 = 0; i1 < 16; i1++, i2++)
        stringpuffer[i2] = zeichenstring1[i1];
      strcpy(zeichenstring1, stringpuffer);
      --*i;
      gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring1);
      //Minus Zeichen wird nicht in Rechenverlaufpuffer kopiert.
      for(i1 = 1, i2 = 0; i1 < 88; i1++, i2++)
        Rechenverlaufpuffer[i2] = Rechenverlauf[i1];

      strcpy(Rechenverlauf, Rechenverlaufpuffer);
      --aktuell;
    }
    else
    { //kommaposition = Kommaposition wird ermittelt.
      for(kommaposition = 1; kommaposition < 15; kommaposition++)
        if(zeichenstring1[kommaposition] == ',')
          break;
      // Wenn kein Komma und die erste Zahl keine Null wird if ausgeführt.
      if(zeichenstring1[0] >= '1' && zeichenstring1[0] <= '9')
      {
        begrenztestellen = 16; /*Auf 16 stellen, weil Minus Zeichen
        gesetzt wird.*/
        strcpy(stringpuffer, "-"); //Minus Zeichen wird eingefügt.
        strcat(stringpuffer, zeichenstring1);
        strcpy(zeichenstring1, stringpuffer);
        ++*i;
        gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring1);
        //Minus Zeichen wird eingefügt in Rechenverlauf.
        strcpy(Rechenverlaufpuffer, "-");
        strcat(Rechenverlaufpuffer, Rechenverlauf);
        strcpy(Rechenverlauf, Rechenverlaufpuffer);
        ++aktuell;
      } /*Wenn es ein Komma und die erste Zahl Null ist wird
      else if ausgeführt.*/
      else if(zeichenstring1[kommaposition] == ',' &&
              zeichenstring1[kommaposition+1] >= '0' &&
              zeichenstring1[kommaposition+1] <= '9')
      {
        begrenztestellen = 16; /*Auf 16 stellen, weil Minus Zeichen
        gesetzt wird.*/
        strcpy(stringpuffer, "-"); //Minus Zeichen wird eingefügt
        strcat(stringpuffer, zeichenstring1);
        strcpy(zeichenstring1, stringpuffer);
        ++*i;
        //Minus Zeichen wird eingefügt in Rechenverlauf
        strcpy(Rechenverlaufpuffer, "-");
        strcat(Rechenverlaufpuffer, Rechenverlauf);
        strcpy(Rechenverlauf, Rechenverlaufpuffer);
        ++aktuell;

        gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring1);
      }
    }
  }
  else if(Schalter == ZWEI)
  {
    if(zeichenstring2[0] == '-') //Entfernt das Minus Zeichen, wenn gesetzt.
    {
      begrenztestellen = 15;
      //Minus Zeichen wird nicht in stringpuffer kopiert.
      for(i1 = 1, i2 = 0; i1 < 16; i1++, i2++)
        stringpuffer[i2] = zeichenstring2[i1];
      strcpy(zeichenstring2, stringpuffer);
      --*i;
      gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring2);
      //Minus Zeichen wird gesucht.
      for(i1 = aktuell, i2 = *i; i2 >= 0; i1--, i2--)
        if(Rechenverlauf[i1] != zeichenstring2[i2])
          break;
      for(; i1 < 88; i1++) //Minus Zeichen wird gelöscht
        Rechenverlauf[i1] = '\0';
      strcat(Rechenverlauf, zeichenstring2);
      for(aktuell = 0; Rechenverlauf[aktuell] != '\0'; aktuell++);
    }
    else
    { //kommaposition = Kommasuche
      for(kommaposition = 1; kommaposition < 15; kommaposition++)
        if(zeichenstring2[kommaposition] == ',')
          break;
      //Wenn kein Komma, wird if ausgeführt
      if(zeichenstring2[0] >= '1' && zeichenstring2[0] <= '9')
      {
        begrenztestellen = 16; /*Auf 16 stellen, weil Minus Zeichen
        gesetzt wird.*/
        strcpy(stringpuffer, "-"); //Minus Zeichen eingefügt.
        strcat(stringpuffer, zeichenstring2);
        strcpy(zeichenstring2, stringpuffer);
        ++*i;
        gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring2);
        //Suche Leerzeichen.
        for(i1 = aktuell, i2 = *i; i2 >= 0; i1--, i2--)
          if(Rechenverlauf[i1] != zeichenstring2[i2])
            break;
        /*i1 um 1 weiter positionieren um Leerzeichen
          nicht zu überschreiben.*/
        for(i1 += 1; i1 < 88; i1++)
          Rechenverlauf[i1] = '\0';
        //zeichenstring2 mit minus Zeichen an Rechenverlauf anhängen.
        strcat(Rechenverlauf, zeichenstring2);
        for(aktuell = 0; Rechenverlauf[aktuell] != '\0'; aktuell++);
      } //Wenn Komma vorhanden wird else if ausgeführt.
      else if(zeichenstring2[kommaposition] == ',' &&
              zeichenstring2[kommaposition+1] >= '0' &&
              zeichenstring2[kommaposition+1] <= '9')
      {
        begrenztestellen = 16; /*Auf 16 stellen, weil Minus Zeichen
        gesetzt wird.*/
        strcpy(stringpuffer, "-"); //Minus Zeichen eingefügt.
        strcat(stringpuffer, zeichenstring2);
        strcpy(zeichenstring2, stringpuffer);
        ++*i;
        gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring2);
        //Suche Leerzeichen.
        for(i1 = aktuell, i2 = *i; i2 >= 0; i1--, i2--)
          if(Rechenverlauf[i1] != zeichenstring2[i2])
            break;
        /*i1 um 1 weiter positionieren um Leerzeichen
          nicht zu überschreiben.*/
        for(i1 += 1; i1 < 88; i1++)
          Rechenverlauf[i1] = '\0';
        //zeichenstring2 mit minus Zeichen an Rechenverlauf anhängen.
        strcat(Rechenverlauf, zeichenstring2);
        for(aktuell = 0; Rechenverlauf[aktuell] != '\0'; aktuell++);
      }
    }
  }
}

void kommasetzen(int *i)
{
  int komma; //Wird verwendet um das Komma zu suchen.

  if(Schalter == EINS) // EINS = zeichenstring1.
  {
    nullschalter = EINS; //Nullen können wieder gesetzt werden.
    /*In der Schleife wird ein Komma gesucht,
      wenn gefunden wird die Funktion beendet.*/
    for(komma = 1; komma < begrenztestellen; komma++)
      if(zeichenstring1[komma] == ',')
        return;

    if(zeichenstring1[0] == '0')
    {
      ++*i; //i eins weiter, weil 0 Startpunkt ist.
      Rechenverlauf[aktuell++] = '0';
    }
    /*Wenn kein Komma gefunden, wird eins gesetzt.*/
    zeichenstring1[*i] = ',';
    ++*i; /*Setzte i eins weiter, damit wieder eine Zahl gesetzt
    werden kann.*/
    Rechenverlauf[aktuell++] = ',';
    gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring1);
  }
  else if(Schalter == ZWEI) //ZWEI = zeichenstring2.
  {
    if(istgleich == ZWEI) //Damit nach = betätigung keine Komma gesetzt wird.
      return;
    nullschalter = EINS; //Es können wieder nullen eingegeben werden.
    //Wenn Komma gefunden, wird die Funktion beendet.
    for(komma = 1; komma < begrenztestellen; komma++)
      if(zeichenstring2[komma] == ',')
        return;

    if(zeichenstring2[0] == '0')
    {
      ++*i; //i eins weiter, weil 0 Startpunkt ist.
      Rechenverlauf[aktuell++] = '0';
    }
    zeichenstring2[*i] = ',';
    ++*i; /*Setzte i eins weiter, damit wieder eine Zahl gesetzt
    werden kann.*/
    Rechenverlauf[aktuell++] = ',';
    gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring2);
  }
}

void ergebnis(char *zeichen, int *i)
{
  static double zwischenergebnis; //Wird benötigt für siehe "else if(istgleich == ZWEI)".
  char verlauf[89];
  static char zeichenpuffer[5];

  if(zeichen[0] == '+')
  { //Setzte '+' für siehe "else if(istgleich == ZWEI)".
    zeichenpuffer[0] = '+';
    zeichenpuffer[1] = '\0';
    zeichenpuffer[2] = '\0';
    zeichenpuffer[3] = '\0';
  }
  else if(zeichen[1] == '-')
  {//Setzte '-' für siehe "else if(istgleich == ZWEI)".
    zeichenpuffer[0] = '\0';
    zeichenpuffer[1] = '-';
    zeichenpuffer[2] = '\0';
    zeichenpuffer[3] = '\0';
  }
  else if(zeichen[2] == 'x')
  {//Setzte 'x' für siehe "else if(istgleich == ZWEI)".
    zeichenpuffer[0] = '\0';
    zeichenpuffer[1] = '\0';
    zeichenpuffer[2] = 'x';
    zeichenpuffer[3] = '\0';
  }
  else if(zeichen[3] == ':')
  {//Setzte ':' für siehe "else if(istgleich == ZWEI)".
    zeichenpuffer[0] = '\0';
    zeichenpuffer[1] = '\0';
    zeichenpuffer[2] = '\0';
    zeichenpuffer[3] = ':';
  }
  if(istgleich == EINS)
  {
    if(zeichen[0] == '+')
      zwischenergebnis = Addition();
    else if(zeichen[1] == '-')
      zwischenergebnis = Subtraktion();
    else if(zeichen[2] == 'x')
      zwischenergebnis = Multiplikation();
    else if(zeichen[3] == ':')
      zwischenergebnis = Division();

    zeichen[0] = '\0';
    zeichen[1] = '\0';
    zeichen[2] = '\0';
    zeichen[3] = '\0';

    istgleich = ZWEI; //Zweites = kann jetzt betätigt werden.
    strcat(Rechenverlauf, " = ");
    gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
  }
  else if(istgleich == ZWEI)
  {
    *i = 0;
    if(zeichenpuffer[0] == '+')
    {
      sprintf(zeichenstring2, "%.15g", zwischenergebnis);
      strcpy(verlauf, zeichenstring1);
      strcat(verlauf, " + ");
      strcat(verlauf, zeichenstring2);
      strcat(verlauf, " = ");
      strcpy(Rechenverlauf, verlauf);
      gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
      Addition();
    }
    else if(zeichenpuffer[1] == '-')
    {
      sprintf(zeichenstring2, "%.15g", zwischenergebnis);
      strcpy(verlauf, zeichenstring1);
      strcat(verlauf, " - ");
      strcat(verlauf, zeichenstring2);
      strcat(verlauf, " = ");
      strcpy(Rechenverlauf, verlauf);
      gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
      Subtraktion();
    }
    else if(zeichenpuffer[2] == 'x')
    {
      sprintf(zeichenstring2, "%.15g", zwischenergebnis);
      strcpy(verlauf, zeichenstring1);
      strcat(verlauf, " x ");
      strcat(verlauf, zeichenstring2);
      strcat(verlauf, " = ");
      strcpy(Rechenverlauf, verlauf);
      gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
      Multiplikation();
    }
    else if(zeichenpuffer[3] == ':')
    {
      sprintf(zeichenstring2, "%.15g", zwischenergebnis);
      strcpy(verlauf, zeichenstring1);
      strcat(verlauf, " : ");
      strcat(verlauf, zeichenstring2);
      strcat(verlauf, " = ");
      strcpy(Rechenverlauf, verlauf);
      gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
      Division();
    }
  }
}

//In dieser Funktion werden Rechenoperationen beliebig kombiniert
void rechenverarbeitung(char rechenoption, char *zeichenpuffer, int *i)
{
  Schalter = ZWEI; /*Schalter kann auf zwei bleiben, da erste
  Berechnung durchgeführt ist.*/
  *i = 0; //i wird wieder auf 0 gesetzt, um mit weiteren Zahlen zu rechnen.
  nullschalter = AUS; /*Damit keine mehrere nullen hintereinander.
  vor dem Komma eingegeben werden können.*/
  begrenztestellen = 15; /*Damit man hei zeichenstring2 nicht
  zuviele stellen eingeben kann.*/
  istgleich = EINS; //Jetzt kann das = betätigt werden.

  if(aktuell < 86)
  {
    if(rechenoption == '+')
    {
      if(zeichenpuffer[0] == '+')
      {
        Addition();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = '+';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = '+';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        return;
      }
      else if(zeichenpuffer[1] == '-')
      {
        Subtraktion();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = '+';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          zeichenpuffer[0] = '+';
          zeichenpuffer[1] = '\0';
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = '+';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        zeichenpuffer[0] = '+';
        zeichenpuffer[1] = '\0';
        return;
      }
      else if(zeichenpuffer[2] == 'x')
      {
        Multiplikation();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = '+';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          zeichenpuffer[0] = '+';
          zeichenpuffer[2] = '\0';
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = '+';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        zeichenpuffer[0] = '+';
        zeichenpuffer[2] = '\0';
        return;
      }
      else if(zeichenpuffer[3] == ':')
      {
        Division();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = '+';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          zeichenpuffer[0] = '+';
          zeichenpuffer[3] = '\0';
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = '+';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        zeichenpuffer[0] = '+';
        zeichenpuffer[3] = '\0';
        return;
      }
      if(Rechenverlauf[aktuell-2] == '=')
      {
        zeichenpuffer[0] = '+';
        Rechenverlauf[aktuell-2] = '+';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        return;
      }
      zeichenpuffer[0] = '+';
      Rechenverlauf[aktuell++] = ' ';
      Rechenverlauf[aktuell++] = '+';
      Rechenverlauf[aktuell++] = ' ';
      gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
    }
    else if(rechenoption == '-')
    {
      if(zeichenpuffer[0] == '+')
      {
        Addition();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = '-';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          zeichenpuffer[1] = '-';
          zeichenpuffer[0] = '\0';
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = '-';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        zeichenpuffer[1] = '-';
        zeichenpuffer[0] = '\0';
        return;
      }
      else if(zeichenpuffer[1] == '-')
      {
        Subtraktion();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = '-';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = '-';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        return;
      }
      else if(zeichenpuffer[2] == 'x')
      {
        Multiplikation();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = '-';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          zeichenpuffer[1] = '-';
          zeichenpuffer[2] = '\0';
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = '-';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        zeichenpuffer[1] = '-';
        zeichenpuffer[2] = '\0';
        return;
      }
      else if(zeichenpuffer[3] == ':')
      {
        Division();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = '-';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          zeichenpuffer[1] = '-';
          zeichenpuffer[3] = '\0';
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = '-';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        zeichenpuffer[1] = '-';
        zeichenpuffer[3] = '\0';
        return;
      }
      if(Rechenverlauf[aktuell-2] == '=')
      {
        zeichenpuffer[1] = '-';
        Rechenverlauf[aktuell-2] = '-';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        return;
      }
      zeichenpuffer[1] = '-';
      Rechenverlauf[aktuell++] = ' ';
      Rechenverlauf[aktuell++] = '-';
      Rechenverlauf[aktuell++] = ' ';
      gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
    }
    else if(rechenoption == 'x')
    {
      if(zeichenpuffer[0] == '+')
      {
        Addition();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = 'x';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          zeichenpuffer[2] = 'x';
          zeichenpuffer[0] = '\0';
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = 'x';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        zeichenpuffer[2] = 'x';
        zeichenpuffer[0] = '\0';
        return;
      }
      else if(zeichenpuffer[1] == '-')
      {
        Subtraktion();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = 'x';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          zeichenpuffer[2] = 'x';
          zeichenpuffer[1] = '\0';
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = 'x';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        zeichenpuffer[2] = 'x';
        zeichenpuffer[1] = '\0';
        return;
      }
      else if(zeichenpuffer[2] == 'x')
      {
        Multiplikation();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = 'x';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = 'x';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        return;
      }
      else if(zeichenpuffer[3] == ':')
      {
        Division();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = 'x';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          zeichenpuffer[2] = 'x';
          zeichenpuffer[3] = '\0';
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = 'x';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        zeichenpuffer[2] = 'x';
        zeichenpuffer[3] = '\0';
        return;
      }
      if(Rechenverlauf[aktuell-2] == '=')
      {
        zeichenpuffer[2] = 'x';
        Rechenverlauf[aktuell-2] = 'x';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        return;
      }
      zeichenpuffer[2] = 'x';
      Rechenverlauf[aktuell++] = ' ';
      Rechenverlauf[aktuell++] = 'x';
      Rechenverlauf[aktuell++] = ' ';
      gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
    }
    else if(rechenoption == ':')
    {
      if(zeichenpuffer[0] == '+')
      {
        Addition();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = ':';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          zeichenpuffer[3] = ':';
          zeichenpuffer[0] = '\0';
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = ':';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        zeichenpuffer[3] = ':';
        zeichenpuffer[0] = '\0';
        return;
      }
      else if(zeichenpuffer[1] == '-')
      {
        Subtraktion();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = ':';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          zeichenpuffer[3] = ':';
          zeichenpuffer[1] = '\0';
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = ':';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        zeichenpuffer[3] = ':';
        zeichenpuffer[1] = '\0';
        return;
      }
      else if(zeichenpuffer[2] == 'x')
      {
        Multiplikation();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = ':';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          zeichenpuffer[3] = ':';
          zeichenpuffer[2] = '\0';
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = ':';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        zeichenpuffer[3] = ':';
        zeichenpuffer[2] = '\0';
        return;
      }
      else if(zeichenpuffer[3] == ':')
      {
        Division();
        if(Rechenverlauf[aktuell-2] == '=')
        {
          Rechenverlauf[aktuell-2] = ':';
          gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
          return;
        }
        Rechenverlauf[aktuell++] = ' ';
        Rechenverlauf[aktuell++] = ':';
        Rechenverlauf[aktuell++] = ' ';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        return;
      }
      if(Rechenverlauf[aktuell-2] == '=')
      {
        zeichenpuffer[3] = ':';
        Rechenverlauf[aktuell-2] = ':';
        gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
        return;
      }
      zeichenpuffer[3] = ':';
      Rechenverlauf[aktuell++] = ' ';
      Rechenverlauf[aktuell++] = ':';
      Rechenverlauf[aktuell++] = ' ';
      gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
    }
  }
}

double Subtraktion(void)
{
  double Minuend, Subtrahend;

  Minuend = atof(zeichenstring1);
  Subtrahend = atof(zeichenstring2);
  Minuend = Minuend - Subtrahend;

  if(Minuend > 999999999999999)
    Minuend = 999999999999999;
  if(Minuend < 0)
    begrenztestellen = 16;
  if(Minuend < -999999999999999)
    Minuend = -999999999999999;
  for(int i = 0; i < 16; i++)
    zeichenstring2[i] = '\0';

  zeichenstring2[0] = '0';
  sprintf(zeichenstring1, "%.15g", Minuend);
  gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring1);
  return Subtrahend;
}

double Addition(void)
{
  double Summand1, Summand2;

  Summand1 = atof(zeichenstring1);
  Summand2 = atof(zeichenstring2);
  Summand1 = Summand1 + Summand2;

  if(Summand1 > 999999999999999)
    Summand1 = 999999999999999;
  if(Summand1 < 0)
    begrenztestellen = 16;
  if(Summand1 < -999999999999999)
    Summand1 = -999999999999999;
  for(int i = 0; i < 16; i++)
    zeichenstring2[i] = '\0';

  zeichenstring2[0] = '0';
  sprintf(zeichenstring1, "%.15g", Summand1);
  gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring1);
  return Summand2;
}

double Multiplikation(void)
{
  double Faktor1, Faktor2;

  Faktor1 = atof(zeichenstring1);
  Faktor2 = atof(zeichenstring2);
  Faktor1 = Faktor1 * Faktor2;

  if(Faktor1 > 999999999999999)
    Faktor1 = 999999999999999;
  if(Faktor1 < 0)
    begrenztestellen = 16;
  if(Faktor1 < -999999999999999)
    Faktor1 = -999999999999999;
  for(int i = 0; i < 16; i++)
    zeichenstring2[i] = '\0';

  zeichenstring2[0] = '0';
  sprintf(zeichenstring1, "%.15g", Faktor1);
  gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring1);
  return Faktor2;
}

double Division(void)
{
  double Dividend, Divisor;

  Dividend = atof(zeichenstring1);
  Divisor = atof(zeichenstring2);
  Dividend = Dividend / Divisor;

  if(Dividend > 999999999999999)
    Dividend = 999999999999999;
  if(Dividend < 0)
    begrenztestellen = 16;
  if(Dividend < -999999999999999)
    Dividend = -999999999999999;

  for(int i = 0; i < 16; i++)
    zeichenstring2[i] = '\0';

  zeichenstring2[0] = '0';
  sprintf(zeichenstring1, "%.15g", Dividend);
  gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring1);
  return Divisor;
}

//Löscht den Verlauf und setzt alle Variablen auf 0.
void alleszuruecksetzen(int *i, char *zeichenpuffer)
{
  *i = 0;
  zeichenpuffer[0] = '\0';
  zeichenpuffer[1] = '\0';
  zeichenpuffer[2] = '\0';
  zeichenpuffer[3] = '\0';
  aktuell = 0;
  Schalter = EINS;
  istgleich = AUS;
  nullschalter = AUS;
  begrenztestellen = 15;

  for(int i = 0; i < 88; i++)
    Rechenverlauf[i] = '\0';

  for(int i = 0; i < 16; i++)
    zeichenstring1[i] = '\0';

  for(int i = 0; i < 16; i++)
    zeichenstring2[i] = '\0';

  zeichenstring1[0] = '0';
  zeichenstring2[0] = '0';
  gtk_entry_set_text(GTK_ENTRY(Eingabe), "0");
  gtk_label_set_text(GTK_LABEL(Text), Rechenverlauf);
}

void zahlanhaengen(char zahl, int *i) //Aktuelle Zahl wird angehängt und ausgegeben
{
  if(istgleich == ZWEI) //Damit nach der zweitem = betätigung keine Zahl mehr angegeben werden kann.
    return;

  if(Schalter == EINS) //Wenn EINS aktiv ist, wird zahl an zeichenstring1 angehängt
  {
    nullschalter = EINS; //Es können wieder nullen eingegeben werden
    if(*i < begrenztestellen && aktuell < 88)
    {
      zeichenstring1[*i] = zahl;
      Rechenverlauf[aktuell++] = zahl;
      gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring1);
      ++*i;
    }
  }
  else if(Schalter == ZWEI) //Wenn ZWEI aktiv ist, wird zahl an zeichenstring2 angehängt
  {
    nullschalter = EINS; //Es können wieder nullen eingegeben werden
    if(*i < begrenztestellen && aktuell < 88)
    {
      zeichenstring2[*i] = zahl;
      Rechenverlauf[aktuell++] = zahl;
      gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring2);
      ++*i;
    }
  }
}

void rueckruf(GtkWidget *widget, gpointer daten)
{
  char *zeichen = NULL;
  static int i = 0;
  static char zeichenpuffer[5];
  zeichen = (char *) daten;

  switch(zeichen[0])
  {
    case '1':
    {
      zahlanhaengen('1', &i);
      break;
    }
    case '2':
    {
      zahlanhaengen('2', &i);
      break;
    }
    case '3':
    {
      zahlanhaengen('3', &i);
      break;
    }
    case '4':
    {
      zahlanhaengen('4', &i);
      break;
    }
    case '5':
    {
      zahlanhaengen('5', &i);
      break;
    }
    case '6':
    {
      zahlanhaengen('6', &i);
      break;
    }
    case '7':
    {
      zahlanhaengen('7', &i);
      break;
    }
    case '8':
    {
      zahlanhaengen('8', &i);
      break;
    }
    case '9':
    {
      zahlanhaengen('9', &i);
      break;
    }
    case '0':
    {
      if(Schalter == ZWEI)
        if(istgleich == EINS) //Damit die erste 0 ausgegeben wird für zeichenstring2
          gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring2);
      if(nullschalter == AUS)
        return;
      zahlanhaengen('0', &i);
      break;
    }
    case '+':
    {
      if(i)
        rechenverarbeitung('+', zeichenpuffer, &i);
      break;
    }
    case '-':
    {
      if(i)
        rechenverarbeitung('-', zeichenpuffer, &i);
      break;
    }
    case 'x':
    {
      if(i)
        rechenverarbeitung('x', zeichenpuffer, &i);
      break;
    }
    case ':':
    {
      if(i)
        rechenverarbeitung(':', zeichenpuffer, &i);
      break;
    }
    case '<':
    {
      entfernezeichen(&i);
      break;
    }
    case 'C':
    {
      alleszuruecksetzen(&i, zeichenpuffer);
      break;
    }
    case '=':
    { //Nur ausführen, wenn Rechenoperation +, -, x, : eingegeben
      if(istgleich == EINS || istgleich == ZWEI)
      {
        Schalter = ZWEI;
        ergebnis(zeichenpuffer, &i);
      }
      break;
    }
    case '/':
    {
      negativezahl(&i);
      break;
    }
    case ',':
    {
      kommasetzen(&i);
      break;
    }
    default:
    {
      break;
    }
  }
}

static gboolean delete_event( GtkWidget *widget,
                              GdkEvent  *event,
                              gpointer   data )
{
  gtk_main_quit();
  return FALSE;
}

void TaschenrechnerMain(int argc, char **argv)
{
  GtkWidget *Fenster;
  GtkWidget *Knopf;
  GtkWidget *Tabelle;
  GtkWidget *vbox;
  GtkWidget *Trennzeichen;

  zeichenstring1[0] = '0';
  zeichenstring2[0] = '0';

  gtk_init(&argc, &argv);

  Fenster = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (Fenster), "Xeons Rechner");
  gtk_container_set_border_width (GTK_CONTAINER (Fenster), 10);
  g_signal_connect (Fenster, "delete-event",
                      G_CALLBACK (delete_event), NULL);

  vbox = gtk_vbox_new (FALSE, 0);
  gtk_container_add (GTK_CONTAINER (Fenster), vbox);
  gtk_widget_set_size_request (GTK_WIDGET (Fenster), 300, 450);

  Eingabe = gtk_entry_new();
  gtk_entry_set_max_length (GTK_ENTRY (Eingabe), 30);
  gtk_widget_set_size_request (GTK_WIDGET (Eingabe), 300, 30);

  gtk_entry_set_alignment(GTK_ENTRY(Eingabe), 1);
  gtk_editable_set_editable(GTK_EDITABLE(Eingabe), FALSE);
  gtk_entry_set_text(GTK_ENTRY(Eingabe), zeichenstring1);

  gtk_box_pack_start (GTK_BOX (vbox), Eingabe, FALSE, FALSE, 10);
  gtk_widget_show (Eingabe);

  Text = gtk_label_new("\0");
  gtk_box_pack_start (GTK_BOX (vbox), Text, FALSE, FALSE, 10);
  gtk_misc_set_alignment(GTK_MISC(Text), 1, 0);
  gtk_label_set_selectable(GTK_LABEL(Text), TRUE);
  gtk_label_set_max_width_chars(GTK_LABEL(Text), 88);
  gtk_widget_show(Text);

  Trennzeichen = gtk_hseparator_new();
  gtk_box_pack_start (GTK_BOX (vbox), Trennzeichen, FALSE, FALSE, 40);
  gtk_widget_show(Trennzeichen);

  Tabelle = gtk_table_new(6, 4, TRUE);
  gtk_container_add (GTK_CONTAINER (vbox), Tabelle);

  Knopf = gtk_button_new_with_label("1");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "1");
  gtk_table_attach_defaults (GTK_TABLE (Tabelle), Knopf, 0, 1, 0, 1);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("2");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "2");
  gtk_table_attach_defaults (GTK_TABLE (Tabelle), Knopf, 1, 2, 0, 1);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("3");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "3");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 2, 3, 0, 1);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("4");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "4");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 0, 1, 1, 2);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("5");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "5");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 1, 2, 1, 2);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("6");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "6");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 2, 3, 1, 2);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("7");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "7");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 0, 1, 2, 3);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("8");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "8");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 1, 2, 2, 3);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("9");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "9");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 2, 3, 2, 3);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("<=");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "<");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 0, 1, 3, 4);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("0");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "0");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 1, 2, 3, 4);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("C");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "C");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 2, 3, 3, 4);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("+");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "+");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 3, 4, 0, 1);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("-");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "-");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 3, 4, 1, 2);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("x");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "x");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 3, 4, 2, 3);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label(":");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) ":");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 3, 4, 3, 4);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("=");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "=");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 3, 4, 4, 5);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label("+/-");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) "/");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 0, 1, 4, 5);
  gtk_widget_show (Knopf);

  Knopf = gtk_button_new_with_label(",");
  g_signal_connect (Knopf, "clicked",
                    G_CALLBACK (rueckruf), (gpointer) ",");
  gtk_table_attach_defaults(GTK_TABLE (Tabelle), Knopf, 1, 2, 4, 5);
  gtk_widget_show (Knopf);

  gtk_widget_show (Tabelle);
  gtk_widget_show (vbox);
  gtk_widget_show (Fenster);
  gtk_main();
}

int main(int argc, char **argv)
{
  TaschenrechnerMain(argc, argv);

  return EXIT_SUCCESS;
}
Liebe Grüße
Xeon
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Taschenrechner mit GTK2 gemacht

Beitrag von Xin » Do Dez 31, 2020 6:01 pm

Xeon hat geschrieben:
Do Dez 31, 2020 2:15 pm
Hier ist der Code:
Ich kompilier jetzt nicht, aber ich guck mal, was mir auf die Schnelle dazu einfällt.

Code: Alles auswählen

enum Schalten
{
  EINS,
  ZWEI,
  AUS
};
https://www.youtube.com/watch?v=StZcUAPRRac

Gute Namen sind wichtig. :-D

Code: Alles auswählen

GtkWidget *Eingabe;
GtkWidget *Text;
char zeichenstring1[17]; //Maximal Zahlen größe von 15 stellen.
char zeichenstring2[17]; //Maximal Zahlen größe von 15 stellen.
short Schalter = EINS; //Für zeichenstring1 und zeichenstring2 schalten.
char Rechenverlauf[89]; //Wird verwendet um den Textverlauf anzuzeigen.
short aktuell = 0; //Zählt die einzelnen Zeichen vom Textverlauf.
short istgleich = AUS; /*Wird verwendet um das = zu verwalten und andere
eingaben zu deaktivieren.*/
short nullschalter = AUS; //Hier werden die nullen gesteuert.
short begrenztestellen = 15; //Wird verwenden um die stellen der Zahlen zu begrenzen.
Versuch den Status Deines Programms besser zu kapseln.

Code: Alles auswählen

double Subtraktion(void); //Minus
double Addition(void); //Plus
Mit guten Namen spart man auch Kommentare. :-)

Dem Rest sage ich erstmal in Kurzfassung einfach mal Folgendes: Versuch Dir mal Gedanken zu machen, wie Du sich wiederholenden Code vermeiden könntest. Wenn Du Dir eine Funktion wie entfernezeichen() anschaust, dann sind da viele Sachen, die sich eigentlich sehr, sehr ähnlich sind. Was könnte man da machen, dass man die Unterschiede in Variablen packt, die man der Funktion übergibt. Vielleicht lässt sich ja erstmal eine entfernezeichenImplementation( ... ) schreiben, die von entfernezeichen() gerufen wird und die Unterscheide als Parameter bekommt. Entsprechend kann man durch den kompletten Quelltext gehen und Wiederholungen rausarbeiten. Entsprechend wird der Code auch wieder kürzer. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten