Bruchrechnen
Vorführaufgabe 02 · C
- Datei: vorfuehraufgabe02.c
- Stand:
- Umfang: 100 Zeilen
#include <stdio.h>
#include <math.h>
#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;
}