d07 ajouts tests avec fixed et char dans ex01 et ex02

This commit is contained in:
Hugo LAMY
2022-03-18 14:26:15 +01:00
parent b30fdff668
commit 726bd388dd
18 changed files with 1098 additions and 31 deletions

View File

@@ -28,12 +28,14 @@ LIBS =
INCLUDES = -I$(D_HEADERS)
D_SRCS = .
SRCS = main.cpp
D_SRCS = srcs
SRCS = main.cpp \
Fixed.cpp
D_HEADERS = .
D_HEADERS = headers
HEADERS = colors.h \
Templates.hpp
Templates.hpp \
Fixed.hpp
D_OBJS = builds
OBJS = $(SRCS:%.$(EXT)=$(D_OBJS)/%.o)

View File

@@ -0,0 +1,55 @@
#ifndef FIXED_HPP
# define FIXED_HPP
#include <iostream>
#include <string>
#include <cmath>
class Fixed {
public:
Fixed(void); // default/parametric constructor
Fixed(Fixed const & src); // copy constructor
~Fixed(void); // destructor
Fixed(int integer);
Fixed(float const floater);
Fixed & operator= (Fixed const & rhs); // assignement operator
bool operator< (Fixed const & rhs) const;
bool operator> (Fixed const & rhs) const;
bool operator<=(Fixed const & rhs) const;
bool operator>=(Fixed const & rhs) const;
bool operator==(Fixed const & rhs) const;
bool operator!=(Fixed const & rhs) const;
Fixed operator+ (Fixed const & rhs) const;
Fixed operator- (Fixed const & rhs) const;
Fixed operator* (Fixed const & rhs) const;
Fixed operator/ (Fixed const & rhs) const;
Fixed & operator++(void); // prefix ++o
Fixed & operator--(void); // prefix --o
Fixed operator++(int); // postfix o++
Fixed operator--(int); // postfix o--
static const Fixed & min(Fixed const & lhs, Fixed const & rhs);
static const Fixed & max(Fixed const & lhs, Fixed const & rhs);
static Fixed & min(Fixed & lhs, Fixed & rhs);
static Fixed & max(Fixed & lhs, Fixed & rhs);
int getRawBits(void) const;
void setRawBits(int const raw);
float toFloat(void) const;
int toInt(void) const;
private:
int _value;
static int const _frac;
static int const _max;
static int const _min;
};
std::ostream & operator<<(std::ostream & o, Fixed const & rhs);
#endif

View File

@@ -2,8 +2,27 @@
#include <string>
#include "colors.h"
#include "Templates.hpp"
#include "Fixed.hpp"
#define N_TEST "3"
#define N_TEST "5"
class Test {
public:
Test(int n = 0) : _n(n) {}
int getN() const {return _n;}
bool operator==(Test const & rhs) const {return (this->_n == rhs._n);}
bool operator!=(Test const & rhs) const {return (this->_n != rhs._n);}
bool operator> (Test const & rhs) const {return (this->_n > rhs._n);}
bool operator< (Test const & rhs) const {return (rhs._n > this->_n);}
bool operator>=(Test const & rhs) const {return ( !(this->_n < rhs._n) );}
bool operator<=(Test const & rhs) const {return ( !(this->_n > rhs._n) );}
private:
int _n;
};
std::ostream & operator<<(std::ostream & o, Test const & rhs){
o << rhs.getN();
return (o);
}
int main() {
int i = 0;
@@ -13,12 +32,13 @@ int main() {
{
int a = 2;
int b = 3;
std::cout << "a = " << a << ", b = " << b << "\nswap :\n";
std::cout << "a = " << a << ", b = " << b << "\n" B_BLUE "swap :" RESET "\n";
::swap( a, b );
std::cout << "a = " << a << ", b = " << b << "\n";
std::cout << "min( a, b ) = " << ::min( a, b ) << "\n";
std::cout << "max( a, b ) = " << ::max( a, b ) << "\n";
std::cout << B_BLUE "min( a, b ) = " RESET << ::min( a, b ) << "\n";
std::cout << B_BLUE "max( a, b ) = " RESET << ::max( a, b ) << "\n";
}
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
@@ -26,12 +46,13 @@ int main() {
{
std::string a = "chaine1";
std::string b = "chaine2";
std::cout << "a = " << a << ", b = " << b << "\nswap :\n";
std::cout << "a = " << a << ", b = " << b << "\n" B_BLUE "swap :" RESET "\n";
::swap(a, b);
std::cout << "a = " << a << ", b = " << b << "\n";
std::cout << "min( a, b ) = " << ::min( a, b ) << "\n";
std::cout << "max( a, b ) = " << ::max( a, b ) << "\n";
std::cout << B_BLUE "min( a, b ) = " RESET << ::min( a, b ) << "\n";
std::cout << B_BLUE "max( a, b ) = " RESET << ::max( a, b ) << "\n";
}
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
@@ -39,12 +60,42 @@ int main() {
{
float a = 2.42f;
float b = 32.7f;
std::cout << "a = " << a << ", b = " << b << "\nswap :\n";
std::cout << "a = " << a << ", b = " << b << "\n" B_BLUE "swap :" RESET "\n";
::swap( a, b );
std::cout << "a = " << a << ", b = " << b << "\n";
std::cout << "min( a, b ) = " << ::min( a, b ) << "\n";
std::cout << "max( a, b ) = " << ::max( a, b ) << "\n";
std::cout << B_BLUE "min( a, b ) = " RESET << ::min( a, b ) << "\n";
std::cout << B_BLUE "max( a, b ) = " RESET << ::max( a, b ) << "\n";
}
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
<< "tests fixed :" RESET "\n";
{
Fixed a(2.42f);
Fixed b(32.7f);
std::cout << "a = " << a << ", b = " << b << "\n" B_BLUE "swap :" RESET "\n";
::swap( a, b );
std::cout << "a = " << a << ", b = " << b << "\n";
std::cout << B_BLUE "min( a, b ) = " RESET << ::min( a, b ) << "\n";
std::cout << B_BLUE "max( a, b ) = " RESET << ::max( a, b ) << "\n";
}
std::cout << B_YELLOW "\n[" << ++i << "/" N_TEST "] "
<< "tests class :" RESET "\n";
{
Test a(8);
Test b(16);
std::cout << "a = " << a << ", b = " << b << "\n" B_BLUE "swap :" RESET "\n";
::swap( a, b );
std::cout << "a = " << a << ", b = " << b << "\n";
std::cout << B_BLUE "min( a, b ) = " RESET << ::min( a, b ) << "\n";
std::cout << B_BLUE "max( a, b ) = " RESET << ::max( a, b ) << "\n";
}
return 0;

225
d07/ex00/srcs/Fixed.cpp Normal file
View File

@@ -0,0 +1,225 @@
#include "Fixed.hpp"
/*
* functions to print numbers in binary
* for the float, found help from stackoverflow :
* https://stackoverflow.com/questions/474007/floating-point-to-binary-valuec
*/
std::string printBitsInt(int num)
{
int i = 0;
for (unsigned int mask = 1U << (sizeof(int) *8 -1); mask; mask >>= 1)
{
std::cout << ((num & mask) != 0);
i++;
if (i == 1 || i == 9 || i == 24)
std::cout << ' ';
}
return "";
}
std::string printBitsFloat(float num)
{
int *p = (int *)&num;
int i = 0;
for (unsigned int mask = 1U << (sizeof(float) *8 -1); mask; mask >>= 1)
{
std::cout << ((*p & mask) != 0);
i++;
if (i == 1 || i == 9 || i == 24)
std::cout << ' ';
}
return "";
}
/*
* statics variables initialisation
*
* for MAX integer :
* 00000000 01111111 11111111 11111111 ( 8388607) (-1U >> (this->_frac +1))
* <= ... >=
* 11111111 10000000 00000000 00000000 (-8388608)
*
*/
int const Fixed::_frac = 8;
int const Fixed::_max = -1U >> (_frac +1);
int const Fixed::_min = ~_max;
/*
* default constructor / copy constructor / destructor
*/
Fixed::Fixed() : _value(0) {
return;
}
Fixed::Fixed(Fixed const & src) {
*this = src;
return;
}
Fixed::~Fixed( void ) {
return;
}
/*
* int and float constructors
*/
Fixed::Fixed(int integer) {
if (integer < Fixed::_min || integer > Fixed::_max)
std::cout << "error: integer out of range" << '\n';
else
this->_value = integer << Fixed::_frac;
}
Fixed::Fixed(float const floater) {
if (floater < Fixed::_min || floater > Fixed::_max)
std::cout << "error: float out of range" << '\n';
else
this->_value = roundf(floater * (1 << Fixed::_frac));
}
/*
* assignement operator
*/
Fixed & Fixed::operator=( Fixed const & rhs ) {
if ( this != &rhs )
this->_value = rhs.getRawBits();
return *this;
}
/*
* operators < ; > ; <= ; == ; != ; + ; - ; * ; / ; ++ ; --
* ref : https://en.cppreference.com/w/cpp/language/operators
* for division, if you want to avoid floats (legitimate) :
* https://stackoverflow.com/questions/8506317/fixed-point-unsigned-division-in-c
*/
bool Fixed::operator< (Fixed const & rhs) const {
return this->_value < rhs._value;
}
bool Fixed::operator> (Fixed const & rhs) const {
return rhs < *this;
}
bool Fixed::operator<=(Fixed const & rhs) const {
return !(*this > rhs);
}
bool Fixed::operator>=(Fixed const & rhs) const {
return !(*this < rhs);
}
bool Fixed::operator==(Fixed const & rhs) const {
return this->_value == rhs._value;
}
bool Fixed::operator!=(Fixed const & rhs) const {
return !(*this == rhs);
}
Fixed Fixed::operator+ ( Fixed const & rhs ) const {
Fixed result(*this);
result._value += rhs._value;
return (result);
}
Fixed Fixed::operator- ( Fixed const & rhs ) const {
Fixed result(*this);
result._value -= rhs._value;
return (result);
}
Fixed Fixed::operator* ( Fixed const & rhs ) const {
Fixed result(*this);
result._value = ((long)result._value * (long)rhs._value) >> Fixed::_frac;
return result;
}
Fixed Fixed::operator/ ( Fixed const & rhs ) const {
Fixed result(*this);
if (rhs._value == 0)
std::cout << "!impossible division by 0¡";
else
result._value = (long)(result._value << Fixed::_frac) / rhs._value;
return result;
}
Fixed & Fixed::operator++() {
this->_value++;
return *this;
}
Fixed & Fixed::operator--() {
this->_value--;
return *this;
}
Fixed Fixed::operator++( int ) {
Fixed old = *this;
Fixed::operator++();
return old;
}
Fixed Fixed::operator--( int ) {
Fixed old = *this;
Fixed::operator--();
return old;
}
/*
* returns min and max
*/
Fixed const & Fixed::min(Fixed const & lhs, Fixed const & rhs) {
if (lhs < rhs)
return lhs;
return rhs;
}
Fixed const & Fixed::max(Fixed const & lhs, Fixed const & rhs) {
if (lhs > rhs)
return lhs;
return rhs;
}
Fixed & Fixed::min(Fixed & lhs, Fixed & rhs) {
if (lhs < rhs)
return lhs;
return rhs;
}
Fixed & Fixed::max(Fixed & lhs, Fixed & rhs) {
if (lhs > rhs)
return lhs;
return rhs;
}
/*
* functions that returns _value
*/
int Fixed::getRawBits( void ) const {
return this->_value;
}
void Fixed::setRawBits( int const raw ) {
this->_value = raw;
}
int Fixed::toInt( void ) const {
return (this->_value >> Fixed::_frac);
}
float Fixed::toFloat( void ) const {
return ((float)this->_value / (float)(1 << Fixed::_frac));
}
/*
* overload "<<" -> output fixed point in float representation
* found here : https://github.com/pgomez-a/42_CPP_Piscine/blob/master/cpp02/ex01/Fixed.cpp
*/
std::ostream & operator<<(std::ostream & o, Fixed const & rhs)
{
o << rhs.toFloat();
return (o);
}