This commit is contained in:
whaffman 2025-08-24 20:51:08 +02:00
commit d0a1b09d9a
10 changed files with 283 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
.cache
*.d
*.o
PmergeMe

45
Makefile Normal file
View File

@ -0,0 +1,45 @@
# **************************************************************************** #
# #
# :::::::: #
# Makefile :+: :+: #
# +:+ #
# By: whaffman <whaffman@student.codam.nl> +#+ #
# +#+ #
# Created: 2025/03/21 14:50:00 by whaffman #+# #+# #
# Updated: 2025/03/21 14:58:40 by whaffman ######## odam.nl #
# #
# **************************************************************************** #
EX = $(shell find . -maxdepth 1 -type d -name 'ex*' -exec basename {} \;)
all:
for ex in $(EX); do \
$(MAKE) -C $$ex; \
done
clean:
for ex in $(EX); do \
$(MAKE) -C $$ex clean; \
done
fclean:
for ex in $(EX); do \
$(MAKE) -C $$ex fclean; \
done
re:
for ex in $(EX); do \
$(MAKE) -C $$ex re; \
done
run:
@for ex in $(EX); do \
echo "Running tests in $$ex:"; \
$(MAKE) -sC $$ex fclean; \
$(MAKE) -sC $$ex run; \
$(MAKE) -sC $$ex fclean; \
echo "Finished tests in $$ex"; \
echo ""; \
done
.PHONY: all clean fclean re run

41
common.mk Normal file
View File

@ -0,0 +1,41 @@
# **************************************************************************** #
# #
# :::::::: #
# common.mk :+: :+: #
# +:+ #
# By: whaffman <whaffman@student.codam.nl> +#+ #
# +#+ #
# Created: 2025/03/21 15:00:16 by whaffman #+# #+# #
# Updated: 2025/03/21 15:04:44 by whaffman ######## odam.nl #
# #
# **************************************************************************** #
INC = -I./inc
VPATH = src
SRC = $(notdir $(wildcard src/*.cpp))
OBJ = $(SRC:.cpp=.o)
CC = c++
CFLAGS = -Wall -Wextra -Werror -std=c++23 -MMD
all: $(NAME)
-include $(OBJ:.o=.d)
run: all
./$(NAME)
$(NAME): $(OBJ)
$(CC) $(CFLAGS) $(OBJ) -o $(NAME)
%.o: %.cpp
$(CC) $(CFLAGS) $(INC) -c $< -o $@
clean:
rm -f $(OBJ)
fclean: clean
rm -f $(NAME)
re: fclean all
.PHONY: all clean fclean re run

2
ex02/Makefile Normal file
View File

@ -0,0 +1,2 @@
NAME = PmergeMe
include ../common.mk

View File

@ -0,0 +1,36 @@
[
{
"arguments": [
"/usr/bin/c++",
"-Wall",
"-Wextra",
"-Werror",
"-std=c++23",
"-I./inc",
"-c",
"-o",
"Jacobstahl.o",
"src/Jacobstahl.cpp"
],
"directory": "/home/willem/projects/CPP09/ex02",
"file": "/home/willem/projects/CPP09/ex02/src/Jacobstahl.cpp",
"output": "/home/willem/projects/CPP09/ex02/Jacobstahl.o"
},
{
"arguments": [
"/usr/bin/c++",
"-Wall",
"-Wextra",
"-Werror",
"-std=c++23",
"-I./inc",
"-c",
"-o",
"main.o",
"src/main.cpp"
],
"directory": "/home/willem/projects/CPP09/ex02",
"file": "/home/willem/projects/CPP09/ex02/src/main.cpp",
"output": "/home/willem/projects/CPP09/ex02/main.o"
}
]

20
ex02/inc/Jacobstahl.hpp Normal file
View File

@ -0,0 +1,20 @@
#pragma once
#include <vector>
class Jacobstahl
{
public:
Jacobstahl();
Jacobstahl(const Jacobstahl &other);
Jacobstahl &operator=(const Jacobstahl &other);
~Jacobstahl();
int get(int n);
std::vector<int> getUpTo(int n);
int getAfter(int n);
private:
int getRecursive(int n);
std::vector<int> _jacobstahl_numbers;
};

29
ex02/inc/PmergeMe.hpp Normal file
View File

@ -0,0 +1,29 @@
#pragma once
#include <vector>
#include <deque>
template <typename Container>
class PmergeMe
{
public:
PmergeMe() = delete;
PmergeMe(const Container &container);
PmergeMe(const PmergeMe &other);
~PmergeMe();
PmergeMe &operator=(const PmergeMe &other);
void sort();
private:
std::vector<int> _data_vector;
std::deque<int> _data_deque;
std::vector<int> _jacobstahl_numbers;
int getJacobstahlNumber(int n);
int getJacobstahlNumberRecursive(int n);
};

79
ex02/src/Jacobstahl.cpp Normal file
View File

@ -0,0 +1,79 @@
#include "Jacobstahl.hpp"
#include <stdexcept>
Jacobstahl::Jacobstahl() : _jacobstahl_numbers()
{
_jacobstahl_numbers.resize(2, -1);
_jacobstahl_numbers[0] = 0;
_jacobstahl_numbers[1] = 1;
}
Jacobstahl::Jacobstahl(const Jacobstahl &other) : _jacobstahl_numbers(other._jacobstahl_numbers) {}
Jacobstahl &Jacobstahl::operator=(const Jacobstahl &other)
{
if (this != &other)
{
_jacobstahl_numbers = other._jacobstahl_numbers;
}
return *this;
}
Jacobstahl::~Jacobstahl() {}
int Jacobstahl::get(int n)
{
if (n < 0)
throw std::invalid_argument("n must be non-negative");
if (n >= static_cast<int>(_jacobstahl_numbers.size()))
_jacobstahl_numbers.resize(n + 1, -1);
return getRecursive(n);
}
int Jacobstahl::getRecursive(int n)
{
if (n == 0)
return 0;
if (n == 1)
return 1;
if (_jacobstahl_numbers.size() > static_cast<size_t>(n) && _jacobstahl_numbers[n] != -1)
return _jacobstahl_numbers[n];
_jacobstahl_numbers[n] = getRecursive(n - 1) + 2 * getRecursive(n - 2);
return _jacobstahl_numbers[n];
}
std::vector<int> Jacobstahl::getUpTo(int n)
{
if (n < 0)
throw std::invalid_argument("n must be non-negative");
std::vector<int> result;
while (true)
{
int number = get(result.size());
if (number > n)
break;
result.push_back(number);
}
return result;
}
int Jacobstahl::getAfter(int n)
{
if (n < 0)
throw std::invalid_argument("n must be non-negative");
int index = 0;
while (true)
{
int number = get(index);
if (number > n)
return number;
index++;
}
}

0
ex02/src/PmergeMe.cpp Normal file
View File

27
ex02/src/main.cpp Normal file
View File

@ -0,0 +1,27 @@
#include "Jacobstahl.hpp"
#include <iostream>
int main()
{
Jacobstahl jacobstahl;
std::cout << "First 10 Jacobstahl numbers:" << std::endl;
for (int i = 0; i < 10; ++i)
{
std::cout << "Jacobstahl(" << i << ") = " << jacobstahl.get(i) << std::endl;
}
std::vector<int> jacobstahl_numbers = jacobstahl.getUpTo(100);
std::cout << "Jacobstahl numbers up to 100:" << std::endl;
for (int num : jacobstahl_numbers)
{
std::cout << num << " ";
}
std::cout << std::endl;
std::cout << "Jacobstahl number after 100: " << jacobstahl.getAfter(100) << std::endl;
return 0;
}