Функция в C для уменьшения числа Rational с использованием структур - PullRequest
0 голосов
/ 23 декабря 2011
#define TRUE 1

#define FALSE 2

struct rational{         
    int numerator;    
    int denominator;    
}       
void reduce(struct rational *inrat,struct rational *outrat)    
{    
    int a,b,rem;        
    if(inrat->numerator>inrat->denominator)      
    {   
        a=intrat->numerator;
        b=inrat_>denominator;    
    }        
    else    
    {    
        b=intrat->numerator;
        a=intrat->denominator;
    }
    while(b!=0)
    {
        rem=a%b;
        a=b;
        b=rem;
    }
    outrat->numerator/=a;      
    outrat->denominator/=a;     
}  

Хорошо, это код для уменьшения рационального числа. Он основан на алгоритме Евклида.
У меня вопрос, какой смысл использовать указатель на структуру outrat, если все данные хранятся в переменных через intrat (в основной функции, конечно). Почему воспользовались утверждением outrat->numerator/=a; outrat->denominator/=a; если фактическими значениями манипулируют с помощью указателя intrat, почему используется outrat?

Ответы [ 2 ]

2 голосов
/ 23 декабря 2011

Я не знаю много об алгоритме, но, глядя на код, inrat - это вход, а outrat - это рациональное число на выходе.

Значения не манипулируются через inrat. Значения inrat используются для вычисления делителя, который затем применяется к outrat. Так что значения outrat на самом деле манипулируются.

Действительно, для ясности функция должна быть объявлена ​​с inrat как const.

0 голосов
/ 15 марта 2017

Вот код C ++ для уменьшения рационального числа, попробуйте ту же логику в C:

#include<iostream>
using namespace std;
struct rational {
       int numerator;
       int denominator;
};
/*struct rational *inputrational  : Actual rational number to be reduced
struct rational *outputrational : Variable to store the rational number in its lowest form */
void reduce(struct rational *inputrational, struct rational *outputrational) {
    //Write your solution code below this line
    int n,m,i=2,min;
     n=inputrational->numerator;
     m=inputrational->denominator;
     min=n>m?m:n;
     for(i=m;i>0;i--){
          if(n%i==0 && m%i==0){
             n=n/i;
            m=m/i;
            break;
            }
        }

    outputrational->numerator=n;
    outputrational->denominator=m;


  }

int main(){
    rational n1,s1;
    n1.numerator=13;
    n1.denominator=6;
    reduce(&n1,&s1);
     cout<<s1.numerator<<" "<<s1.denominator;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...