#include #include #define fehler "Division durch Null ist nicht definiert!\n" int ggT(int xz,int xn) { if(xn==0) return xz; else return ggT(xn,xz % xn); } void Bruchlesen(int *a,int *b,char rop) //Zeigerparameter fuer direkten Zugriff { //muss beim Aufruf ebenfalls beachtet werden do{ printf("Zaehler = "); scanf("%d",a); if(*a==0 && rop=='/') printf(fehler); }while (*a==0 && rop=='/'); do{ printf("Nenner = "); scanf("%d",b); if(*b==0) printf(fehler); }while (*b==0); } int main(void) { int x1z,x1n,x2z,x2n,ez,en,eggT; char rechop; printf("Bruchrechnung:\n"); do{ printf("\n"); Bruchlesen(&x1z,&x1n,' '); //die Adresse der Variablen wird uebergeben printf("\nOperator = "); do rechop=getchar();while (rechop!='+' && rechop!='-' && rechop!='*' && rechop!='/'); printf("\n"); Bruchlesen(&x2z,&x2n,rechop); switch(rechop) { case '+': ez = x1z*x2n + x1n*x2z; //gleichnamig machen und addieren en = x1n*x2n; break; case '-': ez = x1z*x2n - x1n*x2z; //gleichnamig machen und subtrahieren en = x1n*x2n; break; case '*': ez = x1z*x2z; //Zaehler und Nenner multiplizieren en = x1n*x2n; break; case '/': ez = x1z*x2n; //mit dem Reziproke multiplizieren en = x1n*x2z; break; } eggT = abs(ggT(ez,en)); //Groessten gemeinsamen Teiler ermitteln if(en<0) { en*=-1; ez*=-1; } printf("\n%d/%d %c %d/%d = %d/%d = ", x1z,x1n,rechop,x2z,x2n,ez,en); if(eggT!=1) printf("%d/%d = ",(int)ez/eggT,(int)en/eggT); printf("%.2lf\n\nNochmal rechnen(j)?",(double)ez/en); getchar(); //Tastaturpuffer leeren }while (getchar()=='j'); printf("\n\n"); return 0; }