/* CALCOLATORE PER FRAZIONI */ /* Si ASSUME che l'input sia come specificato nel testo dell'esercizio */ #include #include #define MINORE 1 #define UGUALE 2 #define MAGGIORE 3 /* prototipi funzioni usate in main() */ void simplify(int x, int y, int* p, int* q); // semplificazione void sum(int a, int b, int c, int d, int* p, int* q); // + void minus(int a, int b, int c, int d, int* p, int* q); // - void prod(int a, int b, int c, int d, int* p, int* q); // * void div(int a, int b, int c, int d, int* p, int* q); // : int compare(int a, int b, int c, int d); // confronto int main(){ int car, a,b,c,d, num, den; do{ car = getchar(); /* legge da standard input un carattere */ switch(car){ /* a seconda del valore di car vengono eseguite le corrispondenti istruzioni */ case 's': scanf("%d%d", &a, &b); simplify(a,b, &num, &den); printf("%d/%d ----> %d/%d\n", a, b,num, den); break; case '+': scanf("%d%d%d%d", &a, &b, &c, &d); sum(a,b,c,d, &num, &den); printf("%d/%d + %d/%d = %d/%d\n", a,b,c,d, num, den); break; case '-': scanf("%d%d%d%d", &a, &b, &c, &d); minus(a,b, c, d, &num, &den); printf("%d/%d - %d/%d = %d/%d\n", a,b,c,d, num, den); break; case '*': scanf("%d%d%d%d", &a, &b, &c, &d); prod(a,b, c, d, &num, &den); printf("%d/%d * %d/%d = %d/%d\n", a,b,c,d, num, den); break; case ':': scanf("%d%d%d%d", &a, &b, &c, &d); if(c!=0){ div(a,b, c, d, &num, &den); printf("%d/%d : %d/%d = %d/%d\n", a,b,c,d, num, den); } else printf(": %d %d %d %d **** Errore: divisione per 0\n",a,b,c,d); break; case '?': scanf("%d%d%d%d", &a, &b, &c, &d); switch(compare(a,b,c,d)){ case MINORE: printf("%d/%d < %d/%d\n",a,b,c,d); break; case UGUALE: printf("%d/%d = %d/%d\n",a,b,c,d); break; case MAGGIORE: printf("%d/%d > %d/%d\n",a,b,c,d); break; } break; } }while(car!= 'f'); /* il ciclo termina quando car e' il carattere 'f' */ return 0; } /******************************************************************/ /* Dati a>=0 e b>=0, restituisce il MCD(a,b) */ int mcd(int a, int b){ return b == 0 ? a : mcd(b, a % b); } /* Dati x>=0 e y>0, (*p)/(*q) e' la forma semplificata di x/y */ void simplifyPos(int x, int y, int* p, int* q){ int d; d = mcd(x,y); *p = x / d; *q = y / d; } /* Dati due interi x e y, con y!= 0, restituisce 1 se x/y > 0, 0 altrimenti */ int isPositive(int x, int y){ return (x>0 && y>0) || (x<0 && y<0); } // double fabs(double x) : restituisce valore assoluto di x /* Dati due interi x e y, con y!=0, (*p)/(*q) e' la forma semplificata di x/y */ void simplify(int x, int y, int* p, int* q){ simplifyPos(fabs(x), fabs(y), p, q); // non occorre scrivere esplicitamente // il cast a int di x, y, fabs(x) e fabs(y) if(!isPositive(x,y)) // EQUIVALE A: if(isPositive(x,y) == 0) *p = -(*p); } /* (*p)/(*q) e' la forma semplificata di a/b + c/d. Si assume b!=0 e d!=0 */ void sum(int a, int b, int c, int d, int* p, int* q){ simplify(d*a+b*c,b*d , p, q); } /* (*p)/(*q) e' la forma semplificata di a/b - c/d. Si assume b!=0 e d!=0 */ void minus(int a, int b, int c, int d, int* p, int* q){ sum(a,b,-c,d , p, q); } /* (*p)/(*q) e' la forma semplificata di (a/b) * (c/d). Si assume b!=0 e d!=0 */ void prod(int a, int b, int c, int d, int* p, int* q){ simplify(a*c, b*d , p, q); } /* (*p)/(*q) e' la forma semplificata di (a/b) : (c/d). Si assume b!=0, c!=0 e d!=0 */ void div(int a, int b, int c, int d, int* p, int* q){ prod(a,b ,d,c, p, q); } /* Restituisce: - MINORE se a/b < c/d (a/b - c/d < 0) - UGUALE se a/b = c/d (a/b - c/d = 0) - MAGGIORE se a/b > c/d (a/b - c/d > 0) Si assume b!=0 e d!=0 */ int compare(int a, int b, int c, int d){ int num, den; minus(a,b,c,d, &num, &den); if(num<0) return MINORE; else if (num==0) return UGUALE; else return MAGGIORE; }