fraction un calculateur simple de fraction en ligne de commande ecrit en c

Creation: 26/05/2023
Mise à jour:
Version: 1.0
Author: Jean-Louis Bicquelet-Salaün
Location: http://jlbicquelet.free.fr
Copyright: (c) 2023 Jean-Louis Bicquelet

raisons de ce programme

Je n’ai pas trouvé sur internet de programme en ligne de commande, que se soit sous windows ou sous linux, me permettant de faire des calculs offline en ligne de commande.

C’est pourquoi, j’ai décidé d’écrire moi-même ce programme en C.

organisation du programme

considérations générales

J’ai décidé que bien qu’écrit en C, celui-ci aurait un petit aspect objet.

Les données équivalentes aux données membres id’une classe se trouvent dans une structure struct Fraction.

struct Fraction {
    int numerator;
    int denominator;
};

Toutes les fonctions commence par l’entete Fraction_ pour rappeler le principe d’une classe C++.

Bien sur, il n’y a pas de notion de private ou de public, tout est accesible , c’est comme si tout etait public, mais on encapsule les fonctions manipulant les données en les liant par le prefixe du nom des fonctions.

fonction d’initialisation et d’affichage

Il nous faut deux fonctions, une pour créer notre fraction et une pour l’afficher.

Fraction_init va jouer le rôle d’un constructeur. Il n’y a pas d’allocation de mémoire, un desctructeur comme Fraction_done n’est donc pas utile.

Fraction_init prend le dénominateur et le numérateur pour définir une fraction.

Les déclarations des fonctions sont les suivantes:

void Fraction_init(struct Fraction *f, int num, int den);
void Fraction_display(struct Fraction *f);

opérations sur les fractions

Les operations retenues prennent 2 fractions et retourne le résultat du calcul qui peut être l’addition, la soustraction, la multiplication et la division.

struct Fraction Fraction_add(struct Fraction f1, struct Fraction f2);
struct Fraction Fraction_sub(struct Fraction f1, struct Fraction f2);
struct Fraction Fraction_mul(struct Fraction f1, struct Fraction f2);
struct Fraction Fraction_div(struct Fraction f1, struct Fraction f2);

A celles-ci s’ajoutent la réduction de fraction pour éviter des fractions du genre 2/6.

void Fraction_reduce(struct Fraction *f);

On aura besoin de trouver le plus grand divisqeur commun. C’est le rôle de la fonction gcd définit comme ceci:

int gcd(int a, int b);

Cette fonction a été positionnée avant la partie définissant la structure et les fonctions qui vont manupuler les fonctions, car elle est indépendante.

programme et gestion des options

définition des appels au programme

Pour le programme principal, on va définit deux types d’appels:

  • un appel Ă  l’aide ou au man avec une option -h ou -m
  • un appel de la forme numerateur1 denoiminateur operation numerateur2 denominateur2

les operateur possibles sont + - x /.

Le choix du x est du au fait que le caractere *** est un joker lorsqu’il est utilisé dans une ligne de commande et qu’il aurait fallu mettre celui-ci entre quote. Cela va donner des appels comme:

1. frac -m

2. frac 1 2 + 1 3

aide et man

Le programme dispose d’une aide (fonction help) et d’un mani (fonction **man*).

appel dans le main

On teste le premier parametre et si on trouve les mots clés -h ou –help, ou -m ou –man on appelle la fonction correspondante.

/*------------------------------------------------------------------------
 aide
 ------------------------------------------------------------------------*/
    if((strcmp(argv[1],"-h")==0) || (strcmp(argv[1],"--help")==0)) {
        usage();
        exit(0);
    }

fonctions aide et man

Il s’agit soit d’une fonction utilisant puts

void usage()
{
   puts("");
}  puts("frac - calcul sur les fractions v 1.0");

soit d’une fonction utilisant un tableau static de chaines, se terminant par une chaîne déterminée (ici —).

On fixe la taille maximum de ce tableau avec la macro MAX_LINE, et on parcourt celui-ci jusqu’à la chaîne de fin ou la taille maximum du tableau.

void man(void)
{
 #define MAX_LINE 100

 static char *man[] ={
" NAME ",
"     frac - calcul sur les fractions ",

..

---"  };

  int i;

  for (i=0;i<MAX_LINE;i++)
  {
    if(strcmp(man[i],"---")==0) { break; }
    printf("%s\n",man[i]);
  }
}

structure du man

Les principales section d’un man sont:

gestion des arguments

options

voir comment est géré l’aide et le man.

argument par defaut

La position definit le type d’argument. Les 2 premiers definissent la première fraction.

Ceux en position 4 et 5 la deuxième fraction.

    int num1 = atoi(argv[1]);
    int den1 = atoi(argv[2]);
    int num2 = atoi(argv[4]);
    int den2 = atoi(argv[5]);

Ils vont permettre de créer les nombres à l’aide de la fonction Fraction_init, par exemple :

  Fraction_init(&f1, num1, den1);

Le troisieme argument est l’operateur qui est géré par une succession de comparaison avec les choix retenus par des if elseif

char *op = argv[3];
    if (strcmp(op, "+") == 0) {
        result = Fraction_add(f1, f2);
        Fraction_display(&f1);
        printf(" + ");
        Fraction_display(&f2);
        printf(" = ");
        Fraction_display(&result);
        printf("\n");
    }o } else if ( ..

On appele la fonction realisant l’operation et on affiche l’operation complète avec son résultat.

téléchargement

Description date script
source de fraction 25/05/2023 fraction.c
binaire debian 11 de fraction 25/05/2023 fraction