![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
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.
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.
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);
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.
Pour le programme principal, on va définit deux types d’appels:
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
Le programme dispose d’une aide (fonction help) et d’un mani (fonction **man*).
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);
}
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]);
}
}
Les principales section d’un man sont:
voir comment est géré l’aide et le man.
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.
Description | date | script |
source de fraction | 25/05/2023 | fraction.c |
binaire debian 11 de fraction | 25/05/2023 | fraction |