Cours de programmation séquentielle

Librairie de fractions

Buts

Énoncé

Il s’agit d’écrire une librairie pour gérer des fractions. Cette librairie offrira notamment comme fonctionnalités la saisie, l’affichage, l’addition, la soustraction, la multiplication et la division de fractions. Les fractions devront toujours être stockées sous forme irréductible. Il faudra également gérer la division par zéro qui produira une erreur.

Ensuite, il faudra écrire un programme utilisant la librairie et permettant de vérifier que votre code se comporte comme attendu.

Exercice supplémentaire

Lorsque vous aurez fini cette première partie, ajoutez à votre programme la possibilité de passer un calcul en argument de votre programme à la ligne de commande et retourner le résultat dans le terminal.

Cahier des charges

La librairie sera constituée au moins de:

Une fois votre librairie de fraction écrite, vous pouvez l’utiliser pour évaluer le nombre pi. Les trois formules suivantes peuvent vous êtres utiles:

\[\begin{align} \sum_{n=1}^\infty\frac{1}{n^4}=1+\frac{1}{16}+\frac{1}{81}+...=\frac{\pi^4}{90},\\ \sum_{n=1}^\infty\frac{(-1)^{n+1}}{n^2}=1-\frac{1}{4}+\frac{1}{9}+...=\frac{\pi^2}{12},\\ \prod_{n=1}^\infty\left(\frac{2n}{2n-1}\right)\left(\frac{2n}{2n+1}\right)=\frac{2}{1}\cdot\frac{2}{3}\cdot\frac{4}{3}\cdot\frac{4}{5}\cdot ...=\frac{\pi}{2}. \end{align}\]

Quelle est la façon qui converge le plus rapidement?1 Que se passe-t-il lorsque \(n\) devient trop grand et qu’on utilise que des entiers? Que se passe-t-il si on convertit tout en nombres à virgule flottante?

Syntaxe pour la partie bonus

La syntaxe pour la lecture des fractions à la ligne de commande, ainsi que de l’opération à effectuer doit avoir la syntaxe suivante: Les fractions se représentent comme num denum (notez l’espace entre num et denum), puis un opérateur (+, -, x, /, ^), puis une autre fraction également représentée comme num denum. Un nombre entier se représentera également sous la forme d’une fraction. La seule exception est le calcul du PGCD où on passe en argument deux nombres et PGCD. Le PGCD de ces deux nombres s’affiche comme résultat.

Pour la partie bonus la ligne de commande pourrait ressembler à ce qui suit.

> ./executable 3 10 + 8 15
5 6
> ./executable 3 10 x 8 15
4 25
> ./executable 3 1 x 8 11
24 11
> ./executable 3 10 x 8 1
12 5
> ./executable 3 10 ^ ­2
9 100
> ./executable 15 10 PGCD
5

Afin de lire les arguments à la ligne de commande votre fonction main() doit avoir la forme suivante:

int main(int argc, char *argv[])

argc est le nombre d’arguments de votre programme y compris le nom du programme et *argv[] un tableau de chaînes de caractères. Ainsi dans l’exemple

./executable 3 10 + 8 15

argc == 6, et *argv[] == {"executable", "3", "10", "+", "8", "15}. Afin de transformer une chaîne de caractères en entier il faut utiliser la fonction atoi(). Pour déterminer si deux chaînes de caractères sont égales, vous pouvez utiliser la fonction strcmp().

Remarques


  1. Quelle est la méthode qui a besoin du moins d’itération pour atteindre une précision donnée?↩︎