#include "fraction.h"

struct fraction saisirFraction(){
	int n;
	int d;
	printf("Veuillez saisir le numerateur.\n"); //On demande à l'utilisateur de saisir le numerateur
	scanf("%d", &n); //On récupère le numérateur
	printf("Veuillez saisir le denominateur.\n"); //On demande à l'utilisateur de saisir le dénominateur
	scanf("%d", &d); //On récupère le dénominateur
	struct fraction f; //On crée une fraction à partir des données saisies
	f.numerateur = n;
	f.denominateur = d;
	return f; //On retourne cette fraction
}

void afficherFraction(struct fraction f){
	if(abs(f.numerateur) > abs(f.denominateur)){ //Si le numérateur est plus grand que le dénominateur (en valeur absolue)
		printf("f = %d*1/%d", f.numerateur, f.denominateur); //On affiche sous la forme n/d
	}
	else{ //Sinon
		printf("f = %d/%d\n", f.numerateur, f.denominateur); //On affiche sous la forme n*1/d
	}
}

void formeIrreductible(struct fraction* f){ //Utilisation de pointeur pour qu'il modifie directement la fraction passée en paramètre
	int a = f->numerateur; //On place le numérateur dans une variable a
	int b = f->denominateur; //On place le dénominateur dans une variable b
	int reste = a%b; //On place le reste de a modulo b dans une variable reste
	while(reste != 0){ //Tant que le reste est différent de 0
		a = b; //On remplace a par b
		b = reste; //On remplace b par le reste
		reste = a%b; //On recalcule la division
	} //Quand le reste est égal à 0 c'est que le PGCD à été trouvé (il vaut b)
	printf("Le PGCD de %d/%d est : %d\n", f->numerateur, f->denominateur, b);
	f->numerateur = f->numerateur/b; //On divise le numérateur par b
	f->denominateur = f->denominateur/b; //On divise le dénominateur par b
}

struct fraction addition(struct fraction f, struct fraction p){
	struct fraction r;
	r.numerateur = (f.numerateur*p.denominateur)+(p.numerateur*f.denominateur);
	r.denominateur = f.denominateur*p.denominateur;
	formeIrreductible(&r);
	return r;
}

struct fraction soustraction(struct fraction f, struct fraction p){
	struct fraction r;
	r.numerateur = (f.numerateur*p.denominateur)-(p.numerateur*f.denominateur);
	r.denominateur = f.denominateur*p.denominateur;
	formeIrreductible(&r);
	return r;
}

struct fraction multiplication(struct fraction f, struct fraction p){
	struct fraction r;
	r.numerateur = f.numerateur*p.numerateur;
	r.denominateur = f.denominateur*p.denominateur;
	formeIrreductible(&r);
	return r;
}

struct fraction division(struct fraction f, struct fraction p){
	struct fraction r;
	r.numerateur = f.numerateur*p.denominateur;
	r.denominateur = f.denominateur*p.numerateur;
	formeIrreductible(&r);
	return r;
}

