From 685806cdfdbddd8ed18902f35232fff796bf1ab2 Mon Sep 17 00:00:00 2001 From: hugogogo Date: Mon, 14 Mar 2022 01:43:22 +0100 Subject: [PATCH] d08 ex01 ok --- d00/ex00/megaphone | Bin 17488 -> 13344 bytes d08/ex01/< | 151 +++++++++++++++++++++++++ d08/ex01/Makefile | 80 ++++++++++++++ d08/ex01/Span.cpp | 118 ++++++++++++++++++++ d08/ex01/Span.hpp | 43 ++++++++ d08/ex01/colors.h | 25 +++++ d08/ex01/main.cpp | 266 +++++++++++++++++++++++++++++++++++++++++++++ d08/ex01/span | Bin 0 -> 61832 bytes 8 files changed, 683 insertions(+) create mode 100644 d08/ex01/< create mode 100644 d08/ex01/Makefile create mode 100644 d08/ex01/Span.cpp create mode 100644 d08/ex01/Span.hpp create mode 100644 d08/ex01/colors.h create mode 100644 d08/ex01/main.cpp create mode 100755 d08/ex01/span diff --git a/d00/ex00/megaphone b/d00/ex00/megaphone index b2f63e0466af814b1b9bc69e3e8491ea2fab8a6f..4581e636dd4f92fd5015fd321a5010e96098ad6a 100755 GIT binary patch literal 13344 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 literal 17488 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 +#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 0000000000000000000000000000000000000000..7d7eab0004419dc0dcffd8323df52451012fe221 GIT binary patch literal 61832 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 Wb~WxuT*Q*UH!K{-MF~U|t^W@Zwe^Gm literal 0 HcmV?d00001