ArchivVorführaufgaben02

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