Created
September 12, 2009 08:51
-
-
Save interfector/185763 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Compiling | |
* gcc fraz.c -o fraz -Wall -pedantic -lm | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <math.h> | |
typedef struct fraz | |
{ | |
int num; | |
int den; | |
} fraz_t; | |
fraz_t fraz_swap(fraz_t one); | |
fraz_t fraz_solve(fraz_t one); | |
fraz_t f_add(fraz_t one,fraz_t two); | |
fraz_t f_sub(fraz_t one,fraz_t two); | |
fraz_t f_mul(fraz_t one,fraz_t two); | |
fraz_t f_div(fraz_t one,fraz_t two); | |
fraz_t f_sqrt(fraz_t one); | |
fraz_t f_pow(fraz_t one,int i); | |
fraz_t fraz_swap(fraz_t one); | |
fraz_t fraz_conv(float num); | |
int fraz_proper(fraz_t one); | |
int fraz_improper(fraz_t one); | |
int fraz_app(fraz_t one); | |
int fraz_eq(fraz_t one,fraz_t two); | |
int fraz_cmp(fraz_t one,fraz_t two); /* Result: 0 -> equivalent 1 -> First major 2 -> Second major */ | |
int mcm_solve(int a,int b); | |
int mcd(int a,int b); | |
int nlen(int num); | |
void fraz_print(fraz_t one); | |
#define ABS(x) ((x < 0) ? -x : x) | |
fraz_t fraz_solve(fraz_t one) | |
{ | |
fraz_t solved; | |
int mcdn = mcd(one.num,one.den); | |
solved.num = one.num; | |
solved.den = one.den; | |
if (mcdn == 1) | |
return solved; | |
while ((solved.num % mcdn) == 0 && (solved.den % mcdn) == 0) | |
{ | |
solved.num /= mcdn; | |
solved.den /= mcdn; | |
} | |
return solved; | |
} | |
fraz_t f_sqrt(fraz_t one) | |
{ | |
fraz_t sqrtf; | |
sqrtf.num = sqrt(one.num); | |
sqrtf.den = sqrt(one.den); | |
return fraz_solve(sqrtf); | |
} | |
int fraz_proper(fraz_t one) | |
{ | |
return (ABS(one.num) < ABS(one.den)); | |
} | |
int fraz_improper(fraz_t one) | |
{ | |
return (ABS(one.num) > ABS(one.den)); | |
} | |
int fraz_app(fraz_t one) | |
{ | |
fraz_t frazz; | |
if (one.num == one.den) | |
return 1; | |
frazz = fraz_solve(one); | |
if ((frazz.num != one.num) || (frazz.den != one.den)) | |
return 1; | |
return 0; | |
} | |
int fraz_eq(fraz_t one,fraz_t two) | |
{ | |
fraz_t frazz = fraz_solve(one); | |
fraz_t frazzt = fraz_solve(two); | |
if ((frazz.num != frazzt.num) || (frazz.den != frazzt.den)) | |
return 0; | |
return 1; | |
} | |
int fraz_cmp(fraz_t one,fraz_t two) | |
{ | |
if (fraz_eq(one,two) == 1) | |
return 0; | |
if ((one.num * two.den) > (one.den * two.num)) | |
return 1; | |
return 2; | |
} | |
fraz_t f_pow(fraz_t one,int i) | |
{ | |
int n; | |
fraz_t powed; | |
powed.num = one.num; | |
powed.den = one.den; | |
if (i<0) | |
powed = fraz_swap(powed); | |
i = -i; | |
for(n=1;n<i;n++) | |
{ | |
powed.num *= powed.num; | |
powed.den *= powed.den; | |
} | |
return fraz_solve(powed); | |
} | |
fraz_t f_add(fraz_t one,fraz_t two) | |
{ | |
fraz_t added; | |
int mcm; | |
if (one.den == two.den) | |
{ | |
added.den = one.den; | |
added.num = one.num + two.num; | |
} else { | |
mcm = mcm_solve(one.den,two.den); | |
added.den = mcm; | |
added.num = ((mcm / one.den) * one.num) + ((mcm / two.den) * two.num); | |
} | |
return fraz_solve(added); | |
} | |
fraz_t f_sub(fraz_t one,fraz_t two) | |
{ | |
fraz_t subd; | |
int mcm; | |
if (one.den == two.den) | |
{ | |
subd.den = one.den; | |
subd.num = one.num - two.num; | |
} else { | |
mcm = mcm_solve(one.den,two.den); | |
subd.den = mcm; | |
subd.num = ((mcm / one.den)*one.num) - ((mcm / two.den)*two.num); | |
} | |
return fraz_solve(subd); | |
} | |
fraz_t f_mul(fraz_t one,fraz_t two) | |
{ | |
fraz_t mull; | |
mull.den = one.den * two.den; | |
mull.num = one.num * two.num; | |
return fraz_solve(mull); | |
} | |
fraz_t f_div(fraz_t one,fraz_t two) | |
{ | |
return f_mul(one,fraz_swap(two)); | |
} | |
fraz_t fraz_swap(fraz_t one) | |
{ | |
fraz_t swapped; | |
swapped.num = one.den; | |
swapped.den = one.num; | |
return swapped; | |
} | |
fraz_t fraz_conv(float num) | |
{ | |
fraz_t conv; | |
int found=0; | |
int size = sizeof(float)*nlen((int)num)+10; | |
char *fl=(char*)malloc(size+1); | |
snprintf(fl,size,"%f",num); | |
conv.num = 0; | |
conv.den = 1; | |
for(;*fl;fl++) | |
{ | |
if (found == 0) | |
{ | |
if (*fl == '.') | |
{ | |
found = 1; | |
} else { | |
conv.num = conv.num * 10 + (*fl - 48 ); | |
} | |
} else { | |
conv.den = conv.den * 10; | |
conv.num = conv.num * 10 + (*fl - 48 ); | |
} | |
} | |
return fraz_solve(conv); | |
} | |
int mcm_solve(int a,int b) | |
{ | |
return ((a*b) / mcd(a,b)); | |
} | |
int mcd(int a, int b) | |
{ | |
int r = 1; | |
if (a == 0) | |
return b; | |
else | |
while (r > 0) | |
{ | |
r = a % b; | |
a = b; | |
b = r; | |
} | |
return a; | |
} | |
int nlen(int num) | |
{ | |
int len; | |
if (num==0) | |
return 1; | |
for(len=0;num != 0;num /= 10,len++); | |
return len; | |
} | |
void fraz_print(fraz_t one) | |
{ | |
int i; | |
int len = ((one.num > one.den) ? nlen(one.num) : nlen(one.den)); | |
printf("%d\n",one.num); | |
for(i=0;i<len;i++) | |
putchar('_'); | |
printf("\n%d\n",one.den); | |
} | |
int main(int argc,char *argv[]) | |
{ | |
float n; | |
printf("Float:"); | |
scanf("%f",&n); | |
printf("\n"); | |
fraz_print(fraz_conv(n)); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment