From 9adfdba838437fe8667d6dd38daa747370dbd4c8 Mon Sep 17 00:00:00 2001 From: ALittlePatate Date: Sat, 3 Sep 2022 13:18:07 +0200 Subject: [PATCH] feet : initial commit of all the files --- .gitignore | 4 + Makefile | 69 +++++++++++++ README.md | 13 +++ polynome.c | 197 ++++++++++++++++++++++++++++++++++++++ polynome.h | 30 ++++++ screenshot/screenshot.png | Bin 0 -> 20801 bytes 6 files changed, 313 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 polynome.c create mode 100644 polynome.h create mode 100644 screenshot/screenshot.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5d37a9c --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.d +*.o +*.exe +.vscode \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5d253a9 --- /dev/null +++ b/Makefile @@ -0,0 +1,69 @@ +######################################################################## +####################### Makefile Template ############################## +######################################################################## + +# Compiler settings - Can be customized. +CC = gcc +CXXFLAGS = -std=c11 -Wall -O2 +LDFLAGS = + +# Makefile settings - Can be customized. +APPNAME = poly +EXT = .c +SRCDIR = . +OBJDIR = . + +############## Do not change anything from here downwards! ############# +SRC = $(wildcard $(SRCDIR)/*$(EXT)) +OBJ = $(SRC:$(SRCDIR)/%$(EXT)=$(OBJDIR)/%.o) +DEP = $(OBJ:$(OBJDIR)/%.o=%.d) +# UNIX-based OS variables & settings +RM = rm +DELOBJ = $(OBJ) +# Windows OS variables & settings +DEL = del +EXE = .exe +WDELOBJ = $(SRC:$(SRCDIR)/%$(EXT)=$(OBJDIR)\\%.o) + +######################################################################## +####################### Targets beginning here ######################### +######################################################################## + +all: $(APPNAME) + +# Builds the app +$(APPNAME): $(OBJ) + $(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) + +# Creates the dependecy rules +%.d: $(SRCDIR)/%$(EXT) + @$(CPP) $(CFLAGS) $< -MM -MT $(@:%.d=$(OBJDIR)/%.o) >$@ + +# Includes all .h files +-include $(DEP) + +# Building rule for .o files and its .c/.cpp in combination with all .h +$(OBJDIR)/%.o: $(SRCDIR)/%$(EXT) + $(CC) $(CXXFLAGS) -o $@ -c $< + +################### Cleaning rules for Unix-based OS ################### +# Cleans complete project +.PHONY: clean +clean: + $(RM) $(DELOBJ) $(DEP) $(APPNAME) + +# Cleans only all files with the extension .d +.PHONY: cleandep +cleandep: + $(RM) $(DEP) + +#################### Cleaning rules for Windows OS ##################### +# Cleans complete project +.PHONY: cleanw +cleanw: + $(DEL) $(WDELOBJ) $(DEP) $(APPNAME)$(EXE) + +# Cleans +.PHONY: cleandepw +cleandepw: all + $(DEL) $(DEP) $(WDELOBJ) \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0a0e723 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# 2D Polynomials +I was bored so i made this tool, it allows you to calculate : +* the delta +* x1, x2, x0 +* vertex coordinates + +The names of the functions/variables are in French, uhh use google translate to read the code i guess, sorry for that. + +# Usage +```poly.exe a b c ``` + +# Screenshot +![Screenshot](screenshot/screenshot.png) \ No newline at end of file diff --git a/polynome.c b/polynome.c new file mode 100644 index 0000000..1a28f51 --- /dev/null +++ b/polynome.c @@ -0,0 +1,197 @@ +#include +#include +#include +#include +#include "polynome.h" + +enum STATUS Calcul_Delta(Poly* poly) { + if (poly == NULL) { + return FAIL; + } + + poly->delta = (poly->b * poly->b) - (4 * poly->a * poly->c); + return OK; +} + +enum STATUS Calcul_x1_x2(Poly* poly) { + if (poly == NULL) { + return FAIL; + } + + poly->x1 = (-poly->b - sqrt(poly->delta)) / (2 * poly->a); + poly->x2 = (-poly->b + sqrt(poly->delta)) / (2 * poly->a); + + return OK; +} + +enum STATUS Calcul_x0(Poly* poly) { + if (poly == NULL) { + return FAIL; + } + + poly->x0 = -poly->b / (2 * poly->a); + + return OK; +} + +enum STATUS Calcul_Sommet(Poly* poly) { + if (poly == NULL) { + return FAIL; + } + + poly->sx = -poly->b / (2 * poly->a); + + float result; + if (Calcul_Fonction(poly, poly->sx, &result) == FAIL) { + return FAIL; + } + + poly->sy = result; + + return OK; +} + +enum STATUS Calcul_Fonction(Poly* poly, float x, float *out) { + if (poly == NULL) { + return FAIL; + } + + *out = poly->a * x * x + poly->b * x + poly->c; + return OK; +} + +enum STATUS Dessiner_Graph(Poly* poly) { + if (poly == NULL) { + return FAIL; + } + + printf("\n"); + for (int j = LONGUEUR_Y; j >= 1; j--) { + + if (j == 10) { + printf("%d | ",j); + } + else { + printf("%d | ",j); + } + + for (int i = 1; i <= LONGUEUR_X; i++) { + float y; + if (Calcul_Fonction(poly, i, &y) == FAIL) { + return FAIL; + } + + if (roundf(y) == j) { + printf("o "); + } + else { + printf(" "); + } + } + printf("\n"); + } + + // | 1 2 3 4 5 6 7 8 9 10 + printf("----+---------------------\n"); + printf(" | "); + for (int k = 1; k <= LONGUEUR_Y; k++) { + printf("%d ",k); + } + printf("\n----+---------------------\n"); + + for (int j = 0; j >= -LONGUEUR_Y; j--) { + + if (j == -10) { + printf("%d | ",j); + } + else if (j == 0) { + printf("%d | ",j); + } + else { + printf("%d | ",j); + } + + for (int i = 1; i <= LONGUEUR_X; i++) { + float y; + if (Calcul_Fonction(poly, i, &y) == FAIL) { + return FAIL; + } + + if (roundf(y) == j) { + printf("o "); + } + else { + printf(" "); + } + } + printf("\n"); + } + + printf("\n"); + return OK; +} + +int main(int argc, char* argv[]) { + if (argc < 4) { + fprintf(stderr, "%s", "[-] usage : poly.exe a b c\n"); + return 1; + } + + float a = atof(argv[1]); + float b = atof(argv[2]); + float c = atof(argv[3]); + + printf("[+] Processing %.3fx^2%.3fx%.3f\n", a, b, c); + + Poly* poly = malloc(sizeof(Poly)); + poly->a = a; + poly->b = b; + poly->c = c; + + if (Calcul_Delta(poly) == FAIL) { + fprintf(stderr, "%s", "[-] Error while calculating delta.\n"); + } + else { + printf("[+] Delta : %.3f\n",poly->delta); + } + + if (poly->delta > 0) { + printf("[+] The polynomial admits 2 solutions x1 and x2.\n"); + + if (Calcul_x1_x2(poly) == OK) { + printf("[+] x1 : %.4f\n",poly->x1); + printf("[+] x2 : %.4f\n",poly->x2); + } + else { + fprintf(stderr, "%s", "[-] Error while calculating x1 or x2.\n"); + } + } + else if (poly->delta == 0) { + printf("[+] The polynomial admits 1 solution x0\n"); + + if (Calcul_x0(poly) == OK) { + printf("[+] x0 : %.4f\n",poly->x0); + } + else { + fprintf(stderr, "%s", "[-] Error while calculating x0.\n"); + } + } + else { + printf("[+] The polynomial has no solution\n"); + } + + if (Calcul_Sommet(poly) == FAIL) { + fprintf(stderr, "%s", "[-] Error while calculating vertex coordinates.\n"); + } + else { + printf("[+] Vertex coordinates : S = (%.4f,%.4f)\n",poly->sx,poly->sy); + } + + printf("[+] Drawing the graph...\n"); + if (Dessiner_Graph(poly) == FAIL) { + fprintf(stderr, "%s", "[-] Error while drawing the graph.\n"); + } + + free(poly); + return 0; +} \ No newline at end of file diff --git a/polynome.h b/polynome.h new file mode 100644 index 0000000..9dab2b8 --- /dev/null +++ b/polynome.h @@ -0,0 +1,30 @@ +typedef struct Poly { + float a; + float b; + float c; + + float delta; + + float sx; //sommet x + float sy; //sommet y + + float x1; + float x2; + float x0; +} Poly; + +enum STATUS { + OK, + FAIL +}; + +enum STATUS Calcul_Delta(Poly* poly); +enum STATUS Calcul_x1_x2(Poly* poly); +enum STATUS Calcul_x0(Poly* poly); +enum STATUS Calcul_Sommet(Poly* poly); +enum STATUS Calcul_Fonction(Poly* poly, float x, float *out); + +#define LONGUEUR_X 10 +#define LONGUEUR_Y 10 +enum STATUS Dessiner_Graph(Poly* poly); +int main(); \ No newline at end of file diff --git a/screenshot/screenshot.png b/screenshot/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..639c7e2c55371d8d61d53269425906f8ca22b933 GIT binary patch literal 20801 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 literal 0 HcmV?d00001