Today, I inaugurate a new C section: mathematics.
The first tutorial is a way to simplify a fraction.
I put all data in a structure that I typedefined as t_bp.
I also made 3 files: main.c, misc.c and h.h.
There is also an error manager inside the code.
For example, the numbers allowed are 1 until 9. So if you type something else, it will generate an error.
And of course, you have to enter 2 arguments: the numerator and the denominator.
Notice that in this program you can use negative numbers.
Let's see this in details, with this full example.
/* main.c */
#include <stdio.h>
#include "h.h"
int main(int ac, char *av[])
{
t_bp b;
init(ac, av, &b);
debug(&b);
return 0;
}
/* misc.c */
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include "h.h"
void init(int ac, char *av[], t_bp *b)
{
if (ac < 3)
{
printf("Usage: ./math [numerator] [denominator]\n");
exit(1);
}
check_number(av[1]);
check_number(av[2]);
b->numerator = atoi(av[1]);
b->numeratorAbs = abs(b->numerator);
b->denominator = atoi(av[2]);
b->denominatorAbs = abs(b->denominator);
if (b->numerator == 0 || b->denominator == 0)
{
fprintf(stderr, "Error: %s\n", "Allowed characters: [1-9]");
exit(1);
}
}
void check_number(char *av)
{
unsigned int i;
i = 0;
if (av[0] == '-')
{
i = 1;
}
while (i < strlen(av))
{
if (av[i] < 48 || av[i] > 57)
{
fprintf(stderr, "Error: %s\n", "Allowed characters: [1-9]");
exit(1);
}
++i;
}
}
void debug(t_bp *b)
{
printf("\n===== START =====\n\n");
printf("Numerator = %d\n", b->numerator);
printf("Denominator = %d\n", b->denominator);
compare_number(b);
calculate_result(b);
manage_negative(b);
printf("Result simplified = %c(%d / %d)\n", b->negative, b->numeratorAbs, b->denominatorAbs);
printf("\n===== END =====\n\n");
}
void compare_number(t_bp *b)
{
if (b->numeratorAbs > b->denominatorAbs)
{
b->smallest = b->denominatorAbs;
}
else if (b->numeratorAbs < b->denominatorAbs)
{
b->smallest = b->numeratorAbs;
}
else
{
b->smallest = b->numeratorAbs;
}
}
void calculate_result(t_bp *b)
{
b->result = b->numeratorAbs / b->denominatorAbs;
if ((b->result * b->denominatorAbs) == b->numeratorAbs)
{
simplify_simple(b);
}
else
{
simplify_remainder(b);
}
}
void simplify_simple(t_bp *b)
{
b->numeratorAbs = b->numeratorAbs / b->denominatorAbs;
b->denominatorAbs = 1;
}
void simplify_remainder(t_bp *b)
{
int i;
int tmp;
tmp = b->smallest;
i = 1;
while (tmp > i)
{
if (((b->numeratorAbs % tmp) == 0) &&
((b->denominatorAbs % tmp) == 0))
{
b->simplifier = tmp;
b->numeratorAbs /= b->simplifier;
b->denominatorAbs /= b->simplifier;
break;
}
else
{
--tmp;
}
}
}
void manage_negative(t_bp *b)
{
b->negative = '+';
if (b->numerator > 0 && b->denominator < 0)
{
b->negative = '-';
}
else if (b->numerator < 0 && b->denominator > 0)
{
b->negative = '-';
}
}
#ifndef H_H_
#define H_H_
/**
* Structure
*/
typedef struct badprog
{
int numerator;
int numeratorAbs;
int denominator;
int denominatorAbs;
int simplifier;
int smallest;
char negative;
int result;
} t_bp;
/**
* Prototype
*/
void init(int ac, char *av[], t_bp *b);
void debug(t_bp *b);
void compare_number(t_bp *b);
void calculate_result(t_bp *b);
void simplify_simple(t_bp *b);
void simplify_remainder(t_bp *b);
void check_number(char *av);
void manage_negative(t_bp *b);
#endif /* H_H_ */
I've chosen 29623692 as numerator and 39498256 as denominator.
$ gcc main.c misc.c -o fraction-simplifier ; ./fraction-simplifier 29623692 39498256
The last line tells us the result as a simplified fraction.
===== START ===== Numerator = 29623692 Denominator = 39498256 Result simplified = +(3 / 4) ===== END =====
Who said math was a complicated science? ![]()
Add new comment