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;
}