С ++ рассчитывает соотношение 2 чисел

Привет, ребята, я довольно новичок в программировании и прохожу свой путь через "Программирование, принципы и практика использования C++" Страуструпа, и в конце главы 3 я полностью остановился, выполнив упражнение с просьбой написать кусок кода. это делает ряд вычислений, включающих 2 числа, который включает в себя нахождение отношения чисел. К сожалению, в книге это вообще не освещалось, и я вырываю свои волосы, пытаясь понять это самостоятельно, только в состоянии найти примеры кода, способного продвинуться для моего маленького маленького мозга.

Код, который у меня есть на данный момент:

 double ratio;
    if (val2 > val1)
        ratio = (val2 / val1);
    if (val2 < val1)
        ratio = (val1 / val2);
    cout << "The ratio of " << val1 << " and " << val2 << " is 1:" << ratio << '\n';

который отлично работает для чисел, которые равны целому отношению (например, 100 и 25), однако, несмотря на то, что я устанавливаю переменную "коэффициент" как двойную, она удаляет любые десятичные дроби из ответа в случаях, когда отношения не являются целыми числами. Может кто-нибудь сказать мне, где я иду не так?

6 ответов

Решение

При делении целых чисел результатом является целое число (используется целочисленная арифметика):

11 / 2 == 5
11 % 2 == 1 /* remainder */

и при делении значений с плавающей точкой результат также является плавающей точкой:

11.0 / 2 == 5.5
11 / 2.0 == 5.5
((double) 11) / 2 == 5.5

В твоем случае

 double ratio = (val2 / val1);

у вас есть целочисленное деление, и только после того, как выполнено разделение, результат будет приведен к double, Вы можете либо объявить val2 а также val1 как double:

double val1; 
double val2;

или приведите хотя бы один аргумент отношения к double:

double ratio = ((double)val2) / val1; 

Тот факт, что тип результата double не имеет значения, выполняется ли оригинальное деление на целочисленные типы (усечение десятичной части).

Итак, чтобы решить вашу проблему, либо:

  • Используйте тип с плавающей точкой для ввода чисел
  • Приведите одно из чисел к типу с плавающей запятой перед делением

Если вам вообще нужно соотношение двух чисел, скажем, a,b в форме n:m (где n>=1), тогда просто найдите НОД (a,b) и разделите a,b на этот результат.

например:

a=4,b=6; 
GCD(a,b)=2; 
n=4/2=>2 
m=6/2=>3 
so ratio of 4 and 6 is 2:3

Я сделал всю проблему из Страуструпа "Программирование, принципы и практика с использованием C++. Вот коды, хотя без комментариев.

int main()
{
/** --------Numbers-----*/
int val1;
int val2;
double largest; //I'll store here the largest value 
double smallest; //I'll store here the smallest value


cout<< " Enter two Numbers to play with\n";
while(cin>> val1>>val2){
    if(val1<val2){
            cout<< "smallest: "<<val1<<endl;
            cout<< "largest: "<<val2<<endl;
           //If the above argument succeeds, largest and smallest will get their values
            largest=val2;  
            smallest=val1;}
    if(val1>val2){
            cout<< "smallest: "<<val2<<endl;
            cout<< "largest: "<<val1<<endl;
          //If the above argument succeeds, largest and smallest will get their values
            largest=val1;
            smallest=val2;}

    int their_sum=val1+val2;
    int their_product=val1*val2;
    int their_diff=val1-val2;
    double ratio1; 
    ratio1=largest/smallest;
    cout<<"Sum: "<<their_sum<<endl;
    cout<<"Difference: "<<their_diff<<endl;
    cout<<"Product: "<<their_product<<endl;
    cout<<"Ratio: "<<ratio1;
                     }
 return 0;
}

В этом коде нет ничего нового, все было описано в предыдущих главах.

       #include<iostream>
 using namespace std;

 class Test
 {
     public:
     void check()
     {
          int x,y;
          cout<<"Enter 1st number";
          cin>>x;
          cout<<"Enter 2nd number";
          cin>>y;
          int a;
          int d=  gcd(x,y);
          cout<< x/d << " : " << y / d << endl;      
     }

      int gcd(int x, int y) // 14, 21
      {
          int d;
          if(y>x)
          {
              y=x+y; 
              x=y-x; 
              y=y-x; 
          }
          for(int i=1; i<=y; i++)
          {
              if(x%i==0 && y%i==0 )
              {
                  d=i;
              }
          }
          return d;
       }
   };


 int main()
 {
     Test t;
     t.check();
     return 0;
 }
#include <iostream>

using namespace std;

int main()
{
int val1,val2;

cout << " Enter two integer values followed by enter" << endl << endl;
cin >> val1;
cin >> val2;
    if(val1 < val2) // To determine which value is larger and which one is smaller
    {
        cout << val1 << " is smaller than" << val2 << endl << endl << "And"                  << val2 << " is larger than " << val1 << endl<<endl;
            }   

    enter code here
    else if( val2 < val1)
    {
        cout<<val2 <<" is smaller than"<< val1<<endl<<endl<<"And"<< val1 << " is larger than "<< val2<< endl << endl;
    }

cout << "The sum of "<< val1<<" and "<<val2<<" is "<< val1+val2<<endl<<endl;
// diplaying the sum of the two numbers

    enter code here

cout << " The difference between "<<val1<< " and "<<val2<< " is " << val1-val2<<endl;
// displays the difference of val2 from val1
cout << " The difference between "<<val2<< " and "<<val1<< " is " << val2-val1<<endl;
// displays thr difference of val1 fromval2

    enter code here
    enter code here

cout << " The product of " <<val1<< " and " << val2<< " is " << val1*val2<< endl<<endl;
// displaying the product of val1 and val2

    enter code here
    enter code here
    enter code here

// now to diplay the ratio of the two numbers
double ratio1;
cout << " The ratio of "<<val1<<" and "<<val2<<" is ";
       if(val1 < val2)
       {
         ratio1= ((double)val2) /val1;
           cout <<  ratio1;
       }
       else if(val1 > val2)
        {
          ratio1= ((double)val1) /val2;
           cout <<  ratio1;
       }
}
Другие вопросы по тегам