hw0: bugfixes + done ex3 except weird n value
This commit is contained in:
parent
1e5a5b9148
commit
ea85b783c1
2 changed files with 59 additions and 26 deletions
|
@ -20,7 +20,7 @@ void print_fraction_array(fraction frac_array[], int n)
|
||||||
|
|
||||||
fraction square_fraction(fraction frac)
|
fraction square_fraction(fraction frac)
|
||||||
{
|
{
|
||||||
struct fraction square = { frac.num * frac.num, frac.denom * frac.denom };
|
fraction square = { frac.num * frac.num, frac.denom * frac.denom };
|
||||||
return square;
|
return square;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,33 +64,33 @@ void reduce_fraction_inplace(fraction & frac)
|
||||||
|
|
||||||
fraction add_fractions(fraction frac1, fraction frac2)
|
fraction add_fractions(fraction frac1, fraction frac2)
|
||||||
{
|
{
|
||||||
int g = gcd(frac1.denom, frac2.denom);
|
int d = frac1.denom;
|
||||||
|
|
||||||
{
|
frac1.num *= frac2.denom;
|
||||||
int fac1 = frac1.denom / g;
|
frac1.denom *= frac2.denom;
|
||||||
frac1.num *= fac1;
|
|
||||||
frac1.denom *= fac1;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
frac2.num *= d;
|
||||||
int fac2 = frac2.denom / g;
|
frac2.denom *= d;
|
||||||
frac2.num *= fac2;
|
|
||||||
frac2.denom *= fac2;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct fraction result = { frac1.num + frac2.num, g };
|
fraction result = { frac1.num + frac2.num, frac1.denom };
|
||||||
|
reduce_fraction_inplace(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fraction sum_fraction_array(fraction frac_array[], int n) {
|
||||||
|
fraction sum = { 0, 1 };
|
||||||
|
print_fraction_array(frac_array, n);
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
fraction frac = frac_array[i];
|
||||||
|
sum = add_fractions(sum, frac);
|
||||||
|
print_fraction(sum);
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
double sum_fraction_array_approx(fraction frac_array[], int n)
|
double sum_fraction_array_approx(fraction frac_array[], int n)
|
||||||
{
|
{
|
||||||
struct fraction sum = { 0, 0 };
|
return fraction2double(sum_fraction_array(frac_array, n));
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
struct fraction frac = frac_array[i];
|
|
||||||
sum = add_fractions(sum, frac);
|
|
||||||
}
|
|
||||||
|
|
||||||
return fraction2double(sum);
|
|
||||||
|
|
||||||
// the approximation in this function is given by the fact that floating
|
// the approximation in this function is given by the fact that floating
|
||||||
// point numbers cannot represent precisely rational numbers due to the
|
// point numbers cannot represent precisely rational numbers due to the
|
||||||
|
@ -102,7 +102,7 @@ double sum_fraction_array_approx(fraction frac_array[], int n)
|
||||||
void fill_fraction_array(fraction frac_array[], int n)
|
void fill_fraction_array(fraction frac_array[], int n)
|
||||||
{
|
{
|
||||||
fraction temp_frac;
|
fraction temp_frac;
|
||||||
temp_frac.num = 0;
|
temp_frac.num = 1;
|
||||||
temp_frac.denom = 1;
|
temp_frac.denom = 1;
|
||||||
for (int i = 0; i <= n; i++)
|
for (int i = 0; i <= n; i++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,17 +26,50 @@ static void readcmdline(fraction & frac, int argc, char* argv[])
|
||||||
|
|
||||||
static void test23467(int argc, char* argv[])
|
static void test23467(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
//TODO: implement function
|
fraction frac;
|
||||||
|
readcmdline(frac, argc, argv);
|
||||||
|
|
||||||
|
cout << "#2: squared fraction" << endl;
|
||||||
|
print_fraction(square_fraction(frac));
|
||||||
|
|
||||||
|
cout << "#3: squared fraction in-place" << endl;
|
||||||
|
fraction frac2 = frac;
|
||||||
|
square_fraction_inplace(frac2);
|
||||||
|
print_fraction(frac2);
|
||||||
|
|
||||||
|
cout << "#4: fraction to double" << endl;
|
||||||
|
cout << fraction2double(frac) << endl;
|
||||||
|
|
||||||
|
cout << "#6: gcd of fraction" << endl;
|
||||||
|
cout << gcd(frac) << endl;
|
||||||
|
|
||||||
|
cout << "#7: fraction reduction in-place" << endl;
|
||||||
|
fraction frac3 = frac;
|
||||||
|
reduce_fraction_inplace(frac3);
|
||||||
|
print_fraction(frac3);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test5()
|
static void test5()
|
||||||
{
|
{
|
||||||
//TODO: implement function
|
int a, b;
|
||||||
|
cout << "#5: recursive gcd of two integers" << endl;
|
||||||
|
cout << "Input first number: ";
|
||||||
|
cin >> a;
|
||||||
|
cout << "Input second number: ";
|
||||||
|
cin >> b;
|
||||||
|
cout << "GCD is: " << gcd(a, b) << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_array_functions(int n)
|
static void test_array_functions(int n)
|
||||||
{
|
{
|
||||||
//TODO: implement function
|
fraction* a = (fraction*) malloc(sizeof(fraction) * n);
|
||||||
|
fill_fraction_array(a, n);
|
||||||
|
|
||||||
|
cout << "Sum of array as fraction: " << endl;
|
||||||
|
print_fraction(sum_fraction_array(a, n));
|
||||||
|
|
||||||
|
cout << "Sum of array as double (approx.): " << endl;
|
||||||
|
cout << sum_fraction_array_approx(a, n) << endl;
|
||||||
|
|
||||||
//TODO: find n for which sum function breaks. Explain what is happening.
|
//TODO: find n for which sum function breaks. Explain what is happening.
|
||||||
}
|
}
|
||||||
|
@ -56,5 +89,5 @@ static void test_toolbox(int argc, char* argv[])
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
test_toolbox(argc, argv);
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue