From 22e2f130500d26b02dde6b62a8b99b29281a1c5b Mon Sep 17 00:00:00 2001 From: theo <theo.rossmann@etu.hesge.ch> Date: Sun, 27 Feb 2022 19:14:05 +0100 Subject: [PATCH] vector project --- Makefile | 14 +++++ Vecteur.c | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Vecteur.h | 35 +++++++++++ Vecteur.o | Bin 0 -> 4648 bytes main.c | 19 ++++++ main.o | Bin 0 -> 1848 bytes run | Bin 0 -> 27424 bytes 7 files changed, 250 insertions(+) create mode 100644 Makefile create mode 100644 Vecteur.c create mode 100644 Vecteur.h create mode 100644 Vecteur.o create mode 100644 main.c create mode 100644 main.o create mode 100755 run diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..51fe6b9 --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +CC=gcc -Wall -Wextra -g -fsanitize=address -fsanitize=leak + +Vecteur: Vecteur.o main.o + $(CC) Vecteur.o main.o -o run -lm + +Vecteur.o: Vecteur.c Vecteur.h + gcc -Wall -Wextra -c Vecteur.c + +main.o: main.c + gcc -Wall -Wextra -c main.c + +clean: + rm -f *.o + \ No newline at end of file diff --git a/Vecteur.c b/Vecteur.c new file mode 100644 index 0000000..34c806d --- /dev/null +++ b/Vecteur.c @@ -0,0 +1,182 @@ +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> +#include <stdio.h> +#include <time.h> +#include "Vecteur.h" +#define VECTOR_INIT_CAPACITY 4 + +vector creat_vector() +{ + vector vec; + vec.capacity = VECTOR_INIT_CAPACITY; + vec.length = 0; + vec.content = malloc(VECTOR_INIT_CAPACITY * sizeof(type)); + + if(vec.content == NULL) + { + EXIT_FAILURE; + } + return vec; +} + +int vector_length(vector v) +{ + return v.length; + +} + +void vector_push(vector *v, type element) +{ + + if (v->length == v->capacity) + { + v->content = realloc( v->content, 2*VECTOR_INIT_CAPACITY * sizeof(type) ); + v->capacity *= 2; + + } + v->content[v->capacity-1] = element; + v->length++; +} + +vector vector_pop(vector *v) +{ + if (v->length < (0.25*v->capacity)) + { + v->content = realloc( v->content, 0.5*v->capacity * sizeof(type) ); + v->capacity *= 0.5; + + } + + if(v->length != 0) + { + v->content[v->length - 1] = 0; + v->length--; + + } + + return *v; +} + +void vector_set(vector *v, int index, type element) +{ + if(0< index && index < v->length) + { + v->content[index] = element; + } + else + { + EXIT_FAILURE; + + } + +} + +type vector_get(vector *v, int index) +{ + + if(index < v->length) + { + return v->content[index]; + + } + else + { + EXIT_FAILURE; + } + +} + +type vector_remove(vector *v, int index) +{ + type valsuppr; + valsuppr = v->content[index]; + for (int i = index; i< v->length-1; i++) + { + v->content[i] = v->content[i+1]; + } + + v->length--; + + return valsuppr; +} + +void vector_insert(vector *v, type element, int index) +{ + if(index<v->length) + { + for(int i = v->length; i > index; i--) + { + v->content[i] = v->content[i+1]; + } + v->content[index] = element; + v->length++; + } +} +void vector_empty(vector *v) +{ + v->capacity = VECTOR_INIT_CAPACITY; + v->length = 0; + free(v->content); + v->content = malloc(VECTOR_INIT_CAPACITY * sizeof(type)); +} +void vector_free(vector *v) +{ + free(v->content); +} + + +void vector_print(vector *v, void (*print)(type)) +{ + for (int i = 0 ; i < v->length; i++){ + print(v->content[i]); + } + printf("\n"); + + +} +vector vector_map(vector *v, type (*f)(type)) +{ + vector vec = creat_vector(); + for(int i = 0; i< v->length; i++) + { + vector_push(&vec, f(v->content[i])); + } + return vec; +} + +bool lower_than_five(type a) +{ + return (a < 5); +} + +vector vector_filter(vector *v, bool (*f)(type)) +{ + vector vec = creat_vector(); + for(int i = 0; i< v->length; i++) + { + if(f(v->content[i])) + { + vector_push(&vec, v->content[i]); + } + + } + return vec; + + +} + +type add(type lhs, type rhs) { +return lhs + rhs; +} + +type vector_reduce(vector *v, type neutral, type (*f)(type, type)) +{ + type red = neutral; + for (int i = 0 ; i < v->length; i++){ + red = f(v->content[i], red); + } + return red; + + +} \ No newline at end of file diff --git a/Vecteur.h b/Vecteur.h new file mode 100644 index 0000000..0aa96db --- /dev/null +++ b/Vecteur.h @@ -0,0 +1,35 @@ +#ifndef _VECTEUR_H_ +#define _VECTEUR_H_ +#include <stdbool.h> + +#define VECTOR_INIT_CAPACITY 4 +typedef int type; +typedef void (*print)(type); +typedef type (*f)(type); + + +typedef struct _vector { + type *content; // actual content of the vector + int capacity; // capacity allocated + int length; // actual length +} vector; + +vector creat_vector(); +int vector_length(vector v); +void vector_push(vector *v, type element); +vector vector_pop(vector *v); +void vector_set(vector *v, int index, type element); +type vector_get(vector *v, int index); +type vector_remove(vector *v, int index); +void vector_insert(vector *v, type element, int index); +void vector_empty(vector *v); +void vector_free(vector *v) ; +void vector_print(vector *v, void (*print)(type)); +vector vector_map(vector *v, type (*f)(type)); +bool lower_than_five(type a); +vector vector_filter(vector *v, bool (*f)(type)); +type add(type lhs, type rhs); +type vector_reduce(vector *v, type neutral, type (*f)(type, type)); + + +#endif \ No newline at end of file diff --git a/Vecteur.o b/Vecteur.o new file mode 100644 index 0000000000000000000000000000000000000000..1f6a77321df84d34889f7f76398873f9c477e1d7 GIT binary patch literal 4648 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 literal 0 HcmV?d00001 diff --git a/main.c b/main.c new file mode 100644 index 0000000..6525576 --- /dev/null +++ b/main.c @@ -0,0 +1,19 @@ +#include <stdlib.h> +#include <stdbool.h> +#include <stdio.h> +#include <time.h> +#include "Vecteur.h" +#define VECTOR_INIT_CAPACITY 4 + + +int main() +{ + + vector vec = creat_vector(); + vector_push(&vec, 1); + vector_push(&vec, 2); + + + + +} \ No newline at end of file diff --git a/main.o b/main.o new file mode 100644 index 0000000000000000000000000000000000000000..0771a90afceae875b4be7307dbf0d15d0deeb1f5 GIT binary patch literal 1848 zcmb<-^>JfjWMqH=Mg}_u1P><4z_5cE!FB*M9T@l+co{zP%l!)V=zQwY{6=60Nc;te z@R;Gz>H5Q?+x3S>=W&E^r|Xw)*DsyNJbG<Gst^)j*2%-FDGUtm&dyc}8lg$0c_pO^ zmU_l|2D*mkrC_dMosof_fr%zW7-Rwi0}BHKg8%~q11kdqgS%fS0}}(o0gxEXxgro{ z42)Gl42%^5jM6;p91|EB7-SeA7$ofrB3$_d+L)Yq*_d2-*f~G~*fA(<SQtM3$0o~+ zHRKo=m>FQMLDj_!c0H;Xh{p`}4Tyz`nHkto1)w};2J8-IX5fUXK&6-&*iZ!+7{De7 zA-NwMCJYP=ywLDP*Px6;+yIBT9S(7Z+{Da0y<{-O5by5e@8swc@9*Xo>>3gu;^^e# z8qbhil$ux)UzVC&l3&CCq2hB=^U_N)7z&Cq^Geb{ZW96#43PA|!@$7s=RX8!B8h|i z0u#4@iZeme4out$Dh^6Rd`RXfK*d4oK^V$qV9+bB%q>YwV$drtDT2@$Fji4&PNH5( zYDEcyUP@v~B7<I1aWR8lQ9gu|oS&PUnpeW0mzQ6Xs^{((s#{!=n4Aser{|UG6%^$c zq!yJ_GU$O#O3jE*D@x2wg<DMt1LPl2T1HO^ki5;n0E>T^9U!$ZHi(vnhBZt*NDPEe zKm#WM#9?4y;AUU|rz%(qm4J$?LB-K?MlVzzokF)?2byNd)o%#3AL?AVbujzU%|*B0 z5~?4R-r<@V7#Jo%IoePfM#1#MXiz$Xv0-XJ^llJ=1*5ACVqgH52I%fT0M!eMUnmny z!NMQRVPIg$g1R4F{{yH3SpI-=!Q}&t4WdD*5R^yI<6i?BaIkm=#XqPNg4quf2l)rx zZjiYWAPEKrh72eT%FA5PxCYCE2nGgl$p*CwDgvPzpoY3axNs6`9Gox604kT^TsXr4 NYG?^u1j0bq4*=?Oo>~9^ literal 0 HcmV?d00001 diff --git a/run b/run new file mode 100755 index 0000000000000000000000000000000000000000..74c9bdf8fca7edd4704ea80c91f3bd89a5eed8c1 GIT binary patch literal 27424 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 E01f8GlK=n! literal 0 HcmV?d00001 -- GitLab