Проблема создания калькулятора, который может сказать мне дробную и десятичную форму отношения двух чисел в C - PullRequest
1 голос
/ 27 сентября 2019

Напишите программу, которая позволит пользователю умножать и делить пары целочисленных дробей и предоставлять результирующую дробь и десятичное представление в виде двойного числа с двумя десятичными знаками.

Ниже приведу код, который я пробовал

#include <stdio.h>

int
main(void) {

    int a, b, c, d, g, h, j, k;
    double e, f, l, m, n, o;

    //lets get our inputs//
    printf("Whats the first numerator:");
    scanf_s("%d", &a);

    printf("whats the first denominator(cannot be zero):");
    scanf_s("%d", &b);

    printf("whats the second numerator:");
    scanf_s("%d", &c);

    printf("whats the second denominator(cannot be zero):");
    scanf_s("%d", &d);  

    //calulate the division
    (__int64)e = (a / b);
    (__int64)l = (d / c);
    (__int64)m = e * l;
    //calculate the multiplication
    (__int64)f = (__int64)(a / b) * (__int64)(c / d);
    //im just gonna display the actual value of numerator * numerator 
    g = (a * c);
    //same for the denominator
    h = (b * d);
    //handled the fraction for multiplying so now its time to make the keep change flip

    j = (a * d);
    k = (b * c);

    printf("\n(%d/%d) / (%d/%d): the resulting fraction is %d/%d\nthe decimal representation is %.2f\n", a, b, c, d, j, k, m);

    printf("\n(%d/%d) * (%d/%d): the resulting fraction is %d/%d\nthe decimal representation is %.2f\n\n", a, b, c, d, g, h, f);

    return(0);

}

Так что я почти уверен, что происходит переход от 4-байтового значения к 8-байтовомузначение, превращая целое число в двойное, но все же я не знаю, как преобразовать его в больший размер в байтах, но Visual Studio говорит, что (__int64) исправляет это.Тем не менее, мой вывод для дробей работает, но мои десятичные дроби всегда отображаются как 0,00, потому что значение теряется, когда значение приведения увеличивается с 4 байтов до 8 байтов.(Если я ошибаюсь по этому поводу, пожалуйста, исправьте мое понимание, чтобы я мог быть лучше в области компьютерной науки в целом.)

Ответы [ 4 ]

1 голос
/ 27 сентября 2019

Во-первых, это:

(__int64)e = (a / b)

не компилируется в компиляторе, более совместимом со стандартом (даже если __int64 поддерживается там).Вы приводите переменную double к __int64 и получаете значение, в которое невозможно записать.Я не знаю, во что Visual Studio преобразует этот код, но вы не должны писать так:

Во-вторых, в том же фрагменте кода у вас есть a/b, то есть integer разделение.Он сохраняет частное и выбрасывает остаток, эффективно округляя отношение к нулю.Это твоя главная проблема.Вместо этого вы должны выполнять деление с переменными с плавающей точкой или приведение целых чисел к типу с плавающей точкой (например, double).

1 голос
/ 27 сентября 2019
(__int64)f = (__int64)(a / b) * (__int64)(c / d);

Вот в чем проблема ...

Во-первых, научитесь использовать стандартные нотации, а не специфичные для Microsoft, такие как (__int64), которые фактически совпадают с long long int, но, возможно, должны быть исключительнозаменено так на стандартных цепочках инструментов.Во-вторых, вы вводите тип double с типом int, а затем задаетесь вопросом, куда делится десятичная точка.Также %d используется для целых чисел.Если бы вы не указали тип целое число, все равно он не принял бы десятичное значение.

Такие вопросы привлекают отрицательные голоса.Я бы предложил вам сначала отладить код с помощью отладчика.Удачи:)

Код так же прост, как этот, кстати,

#include <stdio.h>

main(argc,argv)
const char** argv;
{
    int numer1 = 0;
    int denom1 = 0;
    int numer2 = 0;
    int denom2 = 0;
    scanf("%d %d %d %d ",&numer1,&denom1,&numer2,&denom2);    //don't forget zero logic
    double frac1 = (double)numer1/(double)denom1;
    double frac2 = (double)numer2/(double)denom2;
    printf ("Whatever you want to print....");
return 0;
}

Также научитесь использовать хорошая номенклатура

0 голосов
/ 27 сентября 2019

Даны дроби a/b и c/d:

a / b в double e = (a / b) - это целочисленное деление.Дробный остаток производного теряется.

Я бы порекомендовал выполнить умножение дроби, используя только целочисленную математику.

a/b × c/d -> (a*c)/(b*d)

См. Также Евклидов алгоритм

long long gcd(long long n, long long m) {
  while (n) {
    long long remainder = m % n;
    m = n;
    n = remainder;
  }
  return m;
}

  ...
  long long product_num = (long long)a * c;
  long long product_den = (long long)b * d;

  // At this point, code could simplify the product by looking for a common factor.
  long long common = gcd(product_num, product_den);
  if (common) {
    product_num /= common;
    product_den /= common; 
  }

  printf("The resulting fraction is %lld/%lld\n", product_num, product_den);
  printf("The decimal representation is %g\n", 1.0*product_num/product_den);

Примечание: a/b ÷ c/d совпадает с a/b × d/c.


0 голосов
/ 27 сентября 2019

При делении двух целых чисел результатом является целочисленное отношение.Любой остаток отбрасывается.Так, например, код

int a = 7;
int b = 2;
int c = a / b;
double d = a / b;

установит c в 3.

Он также установит d в 3. Это потому, что деление выполняется как целочисленное деление, изатем результат преобразуется в double.

. Чтобы получить правильное значение для d, вам нужно привести одно или оба целых числа к double.Например,

double d = (double)a / b;
double d = a / (double)b;
double d = (double)a / (double)b;

все установит d на 3,5

Поэтому я предлагаю вам ввести еще две переменные для хранения дробей как значения double, а затем выполнить умножение иделение:

//compute the fractions as doubles
double fraction1 = (double)a / (double)b;
double fraction2 = (double)c / (double)d;

//multiply the fractions
f = fraction1 * fraction2;

//divide the fractions
m = fraction1 / fraction2;
...