/*
fraction.c

A collection of related functions to demonstrate the difference 
between passing values and passing pointers.

This program reads two fractions, adds them, and then prints an 
expression showing the addition and sum.  It does not attempt to 
reduce the fraction.

Ray Ontko 1999/10/12
*/

#include <stdio.h>

void read_fraction( int *numerator , int *denominator ) ;
void print_fraction( int numerator , int denominator ) ;
void add_fraction( int a_num , int a_den , 
                   int b_num , int b_den , 
                   int *c_num , int *c_den ) ;
int main()
{
  int a_numerator , a_denominator ;
  int b_numerator , b_denominator ;
  int c_numerator , c_denominator ;

  read_fraction( &a_numerator , &a_denominator ) ;
  read_fraction( &b_numerator , &b_denominator ) ;

  add_fraction( a_numerator , a_denominator , 
                b_numerator , b_denominator ,
                &c_numerator , &c_denominator ) ;

  print_fraction( a_numerator , a_denominator ) ;
  printf( " + " ) ;
  print_fraction( b_numerator , b_denominator ) ;
  printf( " = " ) ;
  print_fraction( c_numerator , c_denominator ) ;
  printf( "\n" ) ;

  return 0 ;
}

/*
read_fraction

Reads a fraction (two integers separated by a "/").
*/
void read_fraction( int *numerator , int *denominator )
{
  scanf( "%d/%d" , numerator , denominator ) ;
}

/*
add_fraction

Adds two fractions and stores the result in a third fraction.  
Note that the result is not likely a reduced fraction.
*/
void add_fraction( int a_num , int a_den , 
                   int b_num , int b_den , 
                   int *c_num , int *c_den )
{
  *c_num = a_num * b_den + b_num * a_den ;
  *c_den = a_den * b_den ;
}

/*
print_fraction

Prints a fraction as two integers separated by a "/".
*/
void print_fraction( int numerator , int denominator )
{
  printf( "%d/%d" , numerator , denominator ) ;
}
