You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.5 KiB
106 lines
3.5 KiB
#include "inputHandling.h"
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
|
|
char formulaBuffer[1000];
|
|
|
|
void processInput(char* formulaString, int length) {
|
|
deleteWhitespace(formulaString, length);
|
|
calc_op temp;
|
|
memcpy(formulaBuffer, formulaString, length);
|
|
temp.formel = formulaString;
|
|
temp.funktionstyp = detectFunctionOperator(formulaBuffer, 10);
|
|
if (getNumbers(formulaBuffer, length, &temp) == NULL){
|
|
showStruct(&temp);
|
|
} else {
|
|
printf("Formular %s not supported", temp.formel);
|
|
}
|
|
}
|
|
|
|
//Leerzeichen löschen
|
|
void deleteWhitespace(char* formulaString, int length){
|
|
for(int stringPos=0; stringPos < length; stringPos++){
|
|
if((formulaString[stringPos] == ' ') || (formulaString[stringPos] == '\n') || (formulaString[stringPos] == '\r')){
|
|
for (int j=stringPos; j < length; j++){
|
|
formulaString[j]=formulaString[j + 1];
|
|
}
|
|
stringPos--;
|
|
}
|
|
}
|
|
}
|
|
|
|
//Einfachste Rechenoperationen lesen
|
|
op detectFunctionOperator(char* formulaString, int length){
|
|
for(int stringCount=0; stringCount < length; stringCount++){
|
|
switch (formulaString[stringCount]){
|
|
case '+': return opAdd;
|
|
case '-': return opSub;
|
|
case '/':case ':': return opDiv;
|
|
case '*': return opMult;
|
|
case '^': return opExp;
|
|
case '\0': return opEmpty;
|
|
}
|
|
}
|
|
return opNotSupported;
|
|
}
|
|
|
|
//Zahlen auslesen (+)
|
|
char* getNumbers(char* formulaString, int length, calc_op* formulaRef){ //processInput sind: string, länge vom String, berechnungsstruct
|
|
// char tmp[length];
|
|
char* splitPnt;
|
|
int numPos = 0;
|
|
char delimiter;
|
|
switch (formulaRef->funktionstyp) {
|
|
case opAdd:
|
|
delimiter = '+';
|
|
break;
|
|
case opSub:
|
|
delimiter = '-';
|
|
break;
|
|
case opDiv:
|
|
delimiter = '/';
|
|
break;
|
|
case opMult:
|
|
delimiter = '*';
|
|
break;
|
|
default: return NULL;
|
|
}
|
|
// memcpy(tmp, formulaString, length); //string kopiert
|
|
char *token = strtok(formulaString, &delimiter); //An der Stelle von dem ersten Plus wird ein NULL (Stringende) gesetzt
|
|
while (token != NULL) {
|
|
formulaRef->array[numPos] = atof(token); // String zu double konvertiert
|
|
numPos++;
|
|
splitPnt = token;
|
|
token = strtok(NULL, "+"); //Sucht von der letzten Plus-Stelle an weiter
|
|
}
|
|
formulaRef->arraylength=numPos; //Länge des Arrays (also zu berechnende Zahlen) gespeichert
|
|
op type = detectFunctionOperator(splitPnt, strlen(splitPnt) + 1);
|
|
if (type != opNotSupported && type != opEmpty){
|
|
return splitPnt;
|
|
} else {
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
void showStruct(calc_op* formulaRef){
|
|
printf("Berechnung: %s\n", formulaRef->formel);
|
|
switch (formulaRef->funktionstyp) {
|
|
case opAdd:
|
|
printf("Rechenoperation: Addition\n"); break;
|
|
case opSub:
|
|
printf("Rechenoperation: Subtraktion\n"); break;
|
|
case opMult:
|
|
printf("Rechenoperation: Multiplikation\n"); break;
|
|
case opDiv:
|
|
printf("Rechenoperation: Division\n"); break;
|
|
default:
|
|
printf("Fehler bei Auswahl der Rechenoperationen \n");
|
|
}
|
|
printf("Calculation Variables:\n");
|
|
for (int arrayCount = 0; arrayCount < formulaRef->arraylength; ++arrayCount) {
|
|
printf("Array[%i] = %f\n", arrayCount, formulaRef->array[arrayCount]);
|
|
}
|
|
printf("Result: %f", formulaRef->result);
|
|
}
|