diff --git a/d00/ex00/megaphone b/d00/ex00/megaphone index b2f63e0..4581e63 100755 Binary files a/d00/ex00/megaphone and b/d00/ex00/megaphone differ diff --git a/d08/ex01/< b/d08/ex01/< new file mode 100644 index 0000000..ebb3721 --- /dev/null +++ b/d08/ex01/< @@ -0,0 +1,151 @@ +#include +#include +#include "colors.h" + +#include "Span.hpp" + +#define N_TEST "1" + +int main() { + int i = 0; + srand(time(NULL)); + + std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] " + << "test copy :" RESET "\n"; + { + Span sp = Span(5); + Span sp2 = sp; + Span sp3 = Span(4); + + sp.addNumber(6); + sp.addNumber(3); + sp.addNumber(17); + sp.addNumber(9); + sp.addNumber(11); + + sp3.addNumber(1); + sp3.addNumber(2); + sp3.addNumber(33); + sp3.addNumber(4); + + Span sp4 = Span(sp); + + std::cout << B_BLUE "initial" RESET "\n"; + std::cout << "sp : " << sp << "\n"; + std::cout << "sp2: " << sp2 << "\n"; + std::cout << "sp3: " << sp3 << "\n"; + std::cout << "sp4: " << sp4 << "\n"; + + sp2 = sp; + + std::cout << B_BLUE "sp2 = sp" RESET "\n"; + std::cout << "sp : " << sp << "\n"; + std::cout << "sp2: " << sp2 << "\n"; + std::cout << "sp3: " << sp3 << "\n"; + std::cout << "sp4: " << sp4 << "\n"; + + sp2 = sp3; + + std::cout << B_BLUE "sp2 = sp3" RESET "\n"; + std::cout << "sp : " << sp << "\n"; + std::cout << "sp2: " << sp2 << "\n"; + std::cout << "sp3: " << sp3 << "\n"; + std::cout << "sp4: " << sp4 << "\n"; + + sp3 = sp; + + std::cout << B_BLUE "sp3 = sp" RESET "\n"; + std::cout << "sp : " << sp << "\n"; + std::cout << "sp2: " << sp2 << "\n"; + std::cout << "sp3: " << sp3 << "\n"; + std::cout << "sp4: " << sp4 << "\n"; + + sp4 = Span(sp2); + + std::cout << B_BLUE "sp4 = Span(sp2)" RESET "\n"; + std::cout << "sp : " << sp << "\n"; + std::cout << "sp2: " << sp2 << "\n"; + std::cout << "sp3: " << sp3 << "\n"; + std::cout << "sp4: " << sp4 << "\n"; + } + + std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] " + << "test short and long :" RESET "\n"; + { + Span sp = Span(10); + Span sp1 = Span(10); + Span sp2 = Span(10); + + sp.addNumber(43); + sp.addNumber(37); + sp.addNumber(94); + sp.addNumber(18); + sp.addNumber(47); + sp.addNumber(98); + sp.addNumber(69); + sp.addNumber(52); + sp.addNumber(58); + sp.addNumber(63); + + sp1.addNumber(43); + sp1.addNumber(37); + sp1.addNumber(94); + sp1.addNumber(18); + sp1.addNumber(47); + sp1.addNumber(98); + sp1.addNumber(47); + sp1.addNumber(52); + sp1.addNumber(58); + sp1.addNumber(63); + + sp2.addNumber(143); + sp2.addNumber(37); + sp2.addNumber(94); + sp2.addNumber(18); + sp2.addNumber(47); + sp2.addNumber(98); + sp2.addNumber(69); + sp2.addNumber(52); + sp2.addNumber(58); + sp2.addNumber(63); + + std::cout << B_BLUE "sp :" RESET "\n"; + std::cout << sp << "\n"; + std::cout << sp.shortestSpan() << "\n"; + std::cout << sp.longestSpan() << "\n"; + + std::cout << B_BLUE "sp1 :" RESET "\n"; + std::cout << sp1 << "\n"; + std::cout << sp1.shortestSpan() << "\n"; + std::cout << sp1.longestSpan() << "\n"; + + std::cout << B_BLUE "sp2 :" RESET "\n"; + std::cout << sp2 << "\n"; + std::cout << sp2.shortestSpan() << "\n"; + std::cout << sp2.longestSpan() << "\n"; + } + + + std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] " + << "test range :" RESET "\n"; + { + Span sp = Span(54); + int arr[] = {42, 35, 65, 12, -10, 3, 7, 45, 21, 98}; + +sp.addNumber(arr, &arr[sizeof arr / sizeof *arr]); +std::cout << sizeof (arr) << "\n"; +std::cout << sizeof (*arr) << "\n"; +while (1) +; + + sp.addNumber(arr); + + std::cout << B_BLUE "sp :" RESET "\n"; + std::cout << sp << "\n"; + std::cout << sp.shortestSpan() << "\n"; + std::cout << sp.longestSpan() << "\n"; + } + + return 0; +} + diff --git a/d08/ex01/Makefile b/d08/ex01/Makefile new file mode 100644 index 0000000..d2156b3 --- /dev/null +++ b/d08/ex01/Makefile @@ -0,0 +1,80 @@ +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # +# . name = value \ . += append to a variable # +# VARIABLES . value . != set result of command # +# . name is case sensitive . ?= set if not already set # +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # + +NAME = span + +#TYPE = c +TYPE = cpp + +ifeq "$(TYPE)" "c" + CC = c + EXT = c +else ifeq "$(TYPE)" "cpp" + CC = c++ + EXT = cpp +endif + +CFLAGS = -Wall -Wextra -Werror $(INCLUDES) +ifeq "$(TYPE)" "cpp" + CFLAGS += -std=c++98 +endif + +VPATH = $(D_SRCS) + +LIBS = + +INCLUDES = -I$(D_HEADERS) + +D_SRCS = . +SRCS = main.cpp \ + Span.cpp + +D_HEADERS = . +HEADERS = colors.h \ + Span.hpp + +D_OBJS = builds +OBJS = $(SRCS:%.$(EXT)=$(D_OBJS)/%.o) + +ifeq "$(D_OBJS)" "." + RM_OBJS = rm -f $(OBJS) +else + RM_OBJS = rm -rf $(D_OBJS) +endif + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # +# . target: prerequisites . $@ : target # +# RULES . recipe . $< : 1st prerequisite # +# . recipe . $^ : all prerequisites # +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # + +all: $(NAME) + +$(D_OBJS)/%.o: %.$(EXT) | $(D_OBJS) + $(CC) $(CFLAGS) -c $< -o $@ + +$(D_OBJS): + mkdir $@ + +$(OBJS): $(HEADERS:%=$(D_HEADERS)/%) + +$(NAME): $(OBJS) + $(CC) $(OBJS) -o $@ $(LIBS) + +leaks: $(NAME) + valgrind --leak-check=full --show-leak-kinds=all ./$(NAME) + +clean: + $(RM_OBJS) + +fclean: clean + rm -f $(NAME) + +re: fclean all + +.PHONY : all clean fclean re + diff --git a/d08/ex01/Span.cpp b/d08/ex01/Span.cpp new file mode 100644 index 0000000..903253e --- /dev/null +++ b/d08/ex01/Span.cpp @@ -0,0 +1,118 @@ +#include "Span.hpp" + +#define COPLIEN_COLOR B_CYAN + +/********************************************* + * CONSTRUCTORS + *********************************************/ + +Span::Span( unsigned int N ) : _max(N) { +// std::cout << COPLIEN_COLOR "Span constructor" RESET "\n"; + return; +} + +Span::Span( Span const & src ) +: _max(src._max) { +// std::cout << COPLIEN_COLOR "Span copy constructor" RESET "\n"; + *this = src; + return; +} + +/********************************************* + * DESTRUCTORS + *********************************************/ + +Span::~Span() { +// std::cout << COPLIEN_COLOR "Span destructor" RESET "\n"; + return; +} + +/********************************************* + * OPERATORS + *********************************************/ + +Span & Span::operator=( Span const & rhs ) { + if ( this != &rhs ) + { + _container = rhs._container; + if (_container.size() > _max) + _container.resize(_max); + } + return *this; +} + +std::ostream & operator<<(std::ostream & o, Span const & rhs) { + if ( !rhs.empty() ) { + o << '['; + std::copy (rhs.begin(), rhs.end(), std::ostream_iterator(o, ", ")); + o << "\b\b]"; + } + return o; +} + + +/********************************************* + * ACCESSORS + *********************************************/ + +//unsigned int Span::getMax() const {return _max;} +std::vector::const_iterator Span::begin() const { + return (_container.begin()); } +std::vector::const_iterator Span::end() const { + return (_container.end()); } +bool Span::empty() const { + return (_container.empty()); } + + +/********************************************* + * PUBLIC MEMBER FUNCTIONS + *********************************************/ + +void Span::addNumber(int nb) { + if (_container.size() >= _max) + throw std::out_of_range(B_RED "out of range number" RESET); + _container.push_back(nb); + _sort.push_back(nb); + std::sort(_sort.begin(), _sort.end()); +} +void Span::addNumber(int * arr, unsigned int len) { + for (unsigned int i = 0; i < len; i++) { + if (_container.size() >= _max) + throw std::out_of_range(B_RED "out of range number" RESET); + _container.push_back(arr[i]); + _sort.push_back(arr[i]); + } + std::sort(_sort.begin(), _sort.end()); +} + + + +unsigned int Span::shortestSpan() { + int const size = _container.size(); + unsigned int shortest = longestSpan(); + unsigned int tmp; + + if (_container.size() < 2) + throw std::length_error(B_RED "need at least 2 elements" RESET); + + for (int i = 0; i < size - 1; i++) + { + tmp = _sort[i + 1] - _sort[i]; + if (tmp < shortest) + shortest = tmp; + } + + return shortest; +} +unsigned int Span::longestSpan() { + if (_container.size() < 2) + throw std::length_error(B_RED "need at least 2 elements" RESET); + return (_sort.back() - _sort.front()); +} + +/********************************************* + * NESTED CLASS + *********************************************/ + +//void Span::Class::function() {} + diff --git a/d08/ex01/Span.hpp b/d08/ex01/Span.hpp new file mode 100644 index 0000000..8fb8dc2 --- /dev/null +++ b/d08/ex01/Span.hpp @@ -0,0 +1,43 @@ +#ifndef SPAN_HPP +# define SPAN_HPP + +# include "colors.h" +# include +# include +# include +# include +# include + +class Span { + +public: + Span(unsigned int N); + Span( Span const & src ); + ~Span(); + Span & operator=( Span const & rhs ); + + void addNumber(int nb); + void addNumber(int * arr, unsigned int size); + + unsigned int shortestSpan(); + unsigned int longestSpan(); + +// unsigned int const getMax() const; + + std::vector::const_iterator begin() const; + std::vector::const_iterator end() const; + bool empty() const; + + +private: + Span(); + unsigned int const _max; + std::vector _container; + std::vector _sort; + +}; + +std::ostream & operator<<(std::ostream & o, Span const & rhs); + +#endif + diff --git a/d08/ex01/colors.h b/d08/ex01/colors.h new file mode 100644 index 0000000..0374e42 --- /dev/null +++ b/d08/ex01/colors.h @@ -0,0 +1,25 @@ +#ifndef COLORS_H +# define COLORS_H + +# define GRAY "\e[0;30m" +# define RED "\e[0;31m" +# define GREEN "\e[0;32m" +# define YELLOW "\e[0;33m" +# define BLUE "\e[0;34m" +# define PURPLE "\e[0;35m" +# define CYAN "\e[0;36m" +# define WHITE "\e[0;37m" + +# define B_GRAY "\e[1;30m" +# define B_RED "\e[1;31m" +# define B_GREEN "\e[1;32m" +# define B_YELLOW "\e[1;33m" +# define B_BLUE "\e[1;34m" +# define B_PURPLE "\e[1;35m" +# define B_CYAN "\e[1;36m" +# define B_WHITE "\e[1;37m" + +# define RESET "\e[0m" + +#endif + diff --git a/d08/ex01/main.cpp b/d08/ex01/main.cpp new file mode 100644 index 0000000..a41c40a --- /dev/null +++ b/d08/ex01/main.cpp @@ -0,0 +1,266 @@ +#include +#include +#include "colors.h" + +#include "Span.hpp" + +#define N_TEST "1" + +int main() { + int i = 0; + srand(time(NULL)); + + std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] " + << "test copy :" RESET "\n"; + { + Span sp = Span(5); + Span sp2 = sp; + Span sp3 = Span(4); + + sp.addNumber(6); + sp.addNumber(3); + sp.addNumber(17); + sp.addNumber(9); + sp.addNumber(11); + + sp3.addNumber(1); + sp3.addNumber(2); + sp3.addNumber(33); + sp3.addNumber(4); + + Span sp4 = Span(sp); + + std::cout << B_BLUE "initial" RESET "\n"; + std::cout << "sp : " << sp << "\n"; + std::cout << "sp2: " << sp2 << "\n"; + std::cout << "sp3: " << sp3 << "\n"; + std::cout << "sp4: " << sp4 << "\n"; + + sp2 = sp; + + std::cout << B_BLUE "sp2 = sp" RESET "\n"; + std::cout << "sp : " << sp << "\n"; + std::cout << "sp2: " << sp2 << "\n"; + std::cout << "sp3: " << sp3 << "\n"; + std::cout << "sp4: " << sp4 << "\n"; + + sp2 = sp3; + + std::cout << B_BLUE "sp2 = sp3" RESET "\n"; + std::cout << "sp : " << sp << "\n"; + std::cout << "sp2: " << sp2 << "\n"; + std::cout << "sp3: " << sp3 << "\n"; + std::cout << "sp4: " << sp4 << "\n"; + + sp3 = sp; + + std::cout << B_BLUE "sp3 = sp" RESET "\n"; + std::cout << "sp : " << sp << "\n"; + std::cout << "sp2: " << sp2 << "\n"; + std::cout << "sp3: " << sp3 << "\n"; + std::cout << "sp4: " << sp4 << "\n"; + + sp4 = Span(sp2); + + std::cout << B_BLUE "sp4 = Span(sp2)" RESET "\n"; + std::cout << "sp : " << sp << "\n"; + std::cout << "sp2: " << sp2 << "\n"; + std::cout << "sp3: " << sp3 << "\n"; + std::cout << "sp4: " << sp4 << "\n"; + } + + std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] " + << "test out of range exception :" RESET "\n"; + { + Span sp = Span(5); + int nb; + + std::cout << B_BLUE "Span sp = Span(5)" RESET "\n"; + std::cout << sp << "\n"; + try {std::cout << B_BLUE "shortestSpan(): " RESET << sp.shortestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + try {std::cout << B_BLUE "longestSpan() : " RESET << sp.longestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + + nb = 65; + try {std::cout << B_BLUE "addNb(" << nb << "): " RESET; sp.addNumber(nb);} + catch (std::exception &e) {std::cout << e.what() << " ";} + std::cout << sp << "\n"; + try {std::cout << B_BLUE "shortest(): " RESET << sp.shortestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + try {std::cout << B_BLUE "longest() : " RESET << sp.longestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + + nb = 14; + try {std::cout << B_BLUE "addNb(" << nb << "): " RESET; sp.addNumber(nb);} + catch (std::exception &e) {std::cout << e.what() << " ";} + std::cout << sp << "\n"; + try {std::cout << B_BLUE "shortest(): " RESET << sp.shortestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + try {std::cout << B_BLUE "longest() : " RESET << sp.longestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + + nb = 28; + try {std::cout << B_BLUE "addNb(" << nb << "): " RESET; sp.addNumber(nb);} + catch (std::exception &e) {std::cout << e.what() << " ";} + std::cout << sp << "\n"; + try {std::cout << B_BLUE "shortest(): " RESET << sp.shortestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + try {std::cout << B_BLUE "longest() : " RESET << sp.longestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + + nb = 67; + try {std::cout << B_BLUE "addNb(" << nb << "): " RESET; sp.addNumber(nb);} + catch (std::exception &e) {std::cout << e.what() << " ";} + std::cout << sp << "\n"; + try {std::cout << B_BLUE "shortest(): " RESET << sp.shortestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + try {std::cout << B_BLUE "longest() : " RESET << sp.longestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + + nb = 35; + try {std::cout << B_BLUE "addNb(" << nb << "): " RESET; sp.addNumber(nb);} + catch (std::exception &e) {std::cout << e.what() << " ";} + std::cout << sp << "\n"; + try {std::cout << B_BLUE "shortest(): " RESET << sp.shortestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + try {std::cout << B_BLUE "longest() : " RESET << sp.longestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + + nb = 82; + try {std::cout << B_BLUE "addNb(" << nb << "): " RESET; sp.addNumber(nb);} + catch (std::exception &e) {std::cout << e.what() << " ";} + std::cout << sp << "\n"; + try {std::cout << B_BLUE "shortest(): " RESET << sp.shortestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + try {std::cout << B_BLUE "longest() : " RESET << sp.longestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + + nb = 33; + try {std::cout << B_BLUE "addNb(" << nb << "): " RESET; sp.addNumber(nb);} + catch (std::exception &e) {std::cout << e.what() << " ";} + std::cout << sp << "\n"; + try {std::cout << B_BLUE "shortest(): " RESET << sp.shortestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + try {std::cout << B_BLUE "longest() : " RESET << sp.longestSpan() << "\n";} + catch (std::exception &e) {std::cout << e.what() << '\n';} + } + + std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] " + << "test short and long :" RESET "\n"; + { + Span sp = Span(10); + Span sp1 = Span(10); + Span sp2 = Span(10); + + sp.addNumber(43); + sp.addNumber(37); + sp.addNumber(94); + sp.addNumber(18); + sp.addNumber(47); + sp.addNumber(98); + sp.addNumber(69); + sp.addNumber(52); + sp.addNumber(58); + sp.addNumber(63); + + sp1.addNumber(43); + sp1.addNumber(37); + sp1.addNumber(94); + sp1.addNumber(18); + sp1.addNumber(47); + sp1.addNumber(98); + sp1.addNumber(47); + sp1.addNumber(52); + sp1.addNumber(58); + sp1.addNumber(63); + + sp2.addNumber(143); + sp2.addNumber(37); + sp2.addNumber(94); + sp2.addNumber(18); + sp2.addNumber(47); + sp2.addNumber(98); + sp2.addNumber(69); + sp2.addNumber(52); + sp2.addNumber(58); + sp2.addNumber(63); + + std::cout << B_BLUE "sp :" RESET "\n"; + std::cout << sp << "\n"; + std::cout << sp.shortestSpan() << "\n"; + std::cout << sp.longestSpan() << "\n"; + + std::cout << B_BLUE "sp1 :" RESET "\n"; + std::cout << sp1 << "\n"; + std::cout << sp1.shortestSpan() << "\n"; + std::cout << sp1.longestSpan() << "\n"; + + std::cout << B_BLUE "sp2 :" RESET "\n"; + std::cout << sp2 << "\n"; + std::cout << sp2.shortestSpan() << "\n"; + std::cout << sp2.longestSpan() << "\n"; + } + + std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] " + << "test range :" RESET "\n"; + { + unsigned int len = 13; + Span sp = Span(len); + int arr[len]; + +// len = sizeof(arr) / sizeof(*arr); + for (unsigned int i = 0; i < len; i++) + arr[i] = rand() % 100; + + sp.addNumber(arr, len); + + std::cout << B_BLUE "sp :" RESET "\n"; + std::cout << sp << "\n"; + std::cout << sp.shortestSpan() << "\n"; + std::cout << sp.longestSpan() << "\n"; + } + + std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] " + << "test 10 000 :" RESET "\n"; + { + unsigned int len = 10000; + Span sp = Span(len); + int arr[len]; + + for (unsigned int i = 0; i < len; i++) + arr[i] = rand() % (10000000000000); + + sp.addNumber(arr, len); + + std::cout << B_BLUE "sp :" RESET "\n"; + std::cout << sp << "\n"; + std::cout << sp.shortestSpan() << "\n"; + std::cout << sp.longestSpan() << "\n"; + } + + std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] " + << "test 50 000 :" RESET "\n"; + { + unsigned int len = 50000; + Span sp = Span(len); + int arr[len]; + + for (unsigned int i = 0; i < len; i++) + { + arr[i] = rand() % (1000000000000000000); + if (arr[i] % 2) + arr[i] *= -1; + } + + sp.addNumber(arr, len); + + std::cout << B_BLUE "sp :" RESET "\n"; + std::cout << sp << "\n"; + std::cout << sp.shortestSpan() << "\n"; + std::cout << sp.longestSpan() << "\n"; + } + + return 0; +} + diff --git a/d08/ex01/span b/d08/ex01/span new file mode 100755 index 0000000..7d7eab0 Binary files /dev/null and b/d08/ex01/span differ