#include <stdio.h>

#define SUM	'+'
#define RES	'-'
#define MUL	'*'
#define DIV	'/'
#define NOP	'N'
#define MAX_OPS	20

typedef struct {
	int	num, den;
} t_frac;

typedef struct {
	char	op;
	t_frac	op2;
} t_op;

typedef struct {
	int	nops;
	t_op	o[MAX_OPS];	// o[i].op1 es o[i-1].op2 o[0].op es NOP
} t_ops;

void llegir_frac(t_frac *p_f) {
	scanf("%d/%d", &p_f->num, &p_f->den);
}

void imprimir_frac(t_frac f) {
	printf("%d/%d", f.num, f.den);
}

void imprimir_os(t_ops os) {
	int i;

	for(i=0; i<os.nops; i++) {
		if (i!=0) {
			printf(" %c ", os.o[i].op);
		} else {
			printf("Pensando ... ");
		}
		imprimir_frac(os.o[i].op2);
	}
	printf("\n");
}

int gcd(int a, int b) { // Greatest Common Divisor. Maxim Comu Divisor
	int old_a;

	while(b) {
		old_a = a;
		a = b;
		b = old_a % b;
	}

	return a;
}

t_frac operar(char op, t_frac op1, t_frac op2) {
	t_frac f;
	int n;

	switch (op) {
		case '+':
			f.num = (op1.num*op2.den+op1.den*op2.num);
			f.den = (op1.den*op2.den);
			break;
		case '-':
			f.num = (op1.num*op2.den-op1.den*op2.num);
			f.den = (op1.den*op2.den);
			break;
		case '*':
			f.num = (op1.num*op2.num);
			f.den = (op1.den*op2.den);
			break;
		case '/':
			f.num = (op1.num*op2.den);
			f.den = (op1.den*op2.num);
			break;
		default:
			printf("ERROR operador: '%c'\n", op);
	}
	n = gcd(f.num, f.den);
	f.num /= n;
	f.den /= n;

	return f;
}

void main() {
	t_ops os;
	char c;
	int i;

	printf("Intro expresio (ex: \"2/4 + -6/-7 * 1/2.\")\n");
	os.o[0].op = NOP;
	llegir_frac(&os.o[0].op2);
	os.nops=1;
	imprimir_os(os);
	do {
		scanf("\n%c", &c);
		if (c!='.') {
			os.o[os.nops].op = c;
			llegir_frac(&os.o[os.nops].op2);
			switch (c) {
				case '*':
				case '/':
					os.o[os.nops-1].op2 = operar(c, os.o[os.nops-1].op2, os.o[os.nops].op2);
					break;
				default:
					os.nops++;
			}
			imprimir_os(os);
		}
	} while (c!='.');
	for(i=1;i<os.nops;i++) {
		os.o[i].op2 = operar(os.o[i].op, os.o[i-1].op2, os.o[i].op2);
		imprimir_os(os);
	}
	i--;
	printf("La solucio es ");
	imprimir_frac(os.o[i].op2);
	printf("\n");
}

