Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何制作古怪的数学计算器?(最好使用c+;+;但其他语言也可以。) 我想知道如何在C++中做一些下级的事情,这将允许我做一些“古怪”的数学运算。具体而言,我的两个问题是:_C++_Math_Random_Calculator - Fatal编程技术网

如何制作古怪的数学计算器?(最好使用c+;+;但其他语言也可以。) 我想知道如何在C++中做一些下级的事情,这将允许我做一些“古怪”的数学运算。具体而言,我的两个问题是:

如何制作古怪的数学计算器?(最好使用c+;+;但其他语言也可以。) 我想知道如何在C++中做一些下级的事情,这将允许我做一些“古怪”的数学运算。具体而言,我的两个问题是:,c++,math,random,calculator,C++,Math,Random,Calculator,1) 如何定义编译器能够在代码中识别的数学符号。换句话说,我不想解析来自用户的字符串,而是让编译器将其识别为一个新的数学操作 ex: 3 {+} 4 will actually do 3 – 4 etc. 2) 如何从ASCII符号定义自定义数字。例如,将编译器要识别的符号#定义为18(即二进制的00010010) 如果可能的话,我希望能够在编译器级别完成以上两件事情。C++、爪哇、C、Python和ObjuleC中的解决方案都很好。请告诉我您的解决方案使用的语言。谢谢!:)

1) 如何定义编译器能够在代码中识别的数学符号。换句话说,我不想解析来自用户的字符串,而是让编译器将其识别为一个新的数学操作

   ex:   3 {+} 4   will actually do 3 – 4  etc.
2) 如何从ASCII符号定义自定义数字。例如,将编译器要识别的符号#定义为18(即二进制的00010010)


如果可能的话,我希望能够在编译器级别完成以上两件事情。C++、爪哇、C、Python和ObjuleC中的解决方案都很好。请告诉我您的解决方案使用的语言。谢谢!:)

您可以将类型包装到一个类中,然后重载运算符。我提出了一个“古怪”添加的最小示例(
+
变成
-
)。但是如果你想使用pod,你必须使用预处理器,没有其他方法

#include <iostream>
using namespace std;

template<typename T>
class wacky
{
    T val_;
public:
    wacky(T val = {}): val_(val){};

    // let's define a conversion operator
    template<typename S>
    operator S (){return val_;}

    // we don't need asignment operator and copy ctors

    // stream operators
    friend ostream& operator<<(ostream& os, const wacky& rhs)
    {
        return os << rhs.val_;
    }

    // the += operator
    wacky& operator+=(const wacky& rhs)
    {
        val_ -= rhs.val_; // wacky!
        return *this;
    }

    // and the wacky operator+
    friend wacky operator+(wacky lhs, const wacky& rhs)
    {
        return lhs+=rhs;
    }
};

int main()
{
    wacky<int> a,b;
    a = 10;
    b = 15;

    // a and b behave now like PODs
    // implicit conversions work etc
    double wacky_sum = a + b; 
    cout << wacky_sum << endl; // -5
}
#包括
使用名称空间std;
模板
类怪人
{
T瓦卢;
公众:
古怪的(T val={}):val(val{};
//让我们定义一个转换运算符
模板
运算符S(){return val_;}
//我们不需要指定运算符和复制运算符
//流操作符

朋友OsFrand和操作员< P>我在评论中说,这意味着C++中的宏;如果你想要的不是比你所显示的复杂得多,它就应该做这个把戏。将操作符定义为宏应该适用于简单的查找/替换的情况,但是它可能不适合复杂的表达式和某些符号。 在我的脑海中,我认为通过使用中缀函数作为运算符在Haskell中是可行的,但对于初学者来说,这可能并不简单。请查看并搜索
infixr
。不过,您需要了解Haskell的基本知识

使用Zeta示例进行编辑,您可以在
ghci
中运行它:

(<+>) = (-) -- operator definition
(<*>) = (/)

answer = 42
answer <+> 12 -- prints 30
answer <*> 7 -- prints 6.0
()=(-)--运算符定义
() = (/)
答案=42
答案12——打印30
答案7——打印6.0

当然有一件事是肯定的,这是用C++来实现的,没有丑陋的宏。丑陋的宏可能只是这里的东西:虽然有点不太好,但这并不能取代真正的操作符定义。当然,你可以编写自己的编译器。你甚至不需要编写编译器;你只需要添加一个读取文件和R的进程。在构建之前,将
{+}
替换为
-
。但是,我认为OP的目的是让
{+}
成为与
+
不同的操作,在没有真正宏的语言中这是不可能的。除非使用
{+}总是安全的
直接替换为
-
@aruistante是的,您不能在没有preprocessor@vsoftco:谢谢!这看起来是个很好的建议。:)不过如果我能让{+}工作就太糟糕了。我会+1你的帖子,但我没有足够的声誉:(顺便说一句,我现在有足够的代表,所以我需要你。谢谢你的代码,这很好!@Vladimir很高兴这有帮助!谢谢!我会调查一下,但就像你说的,我需要知道Haskell hahaha;)不幸的是,
{}
是特殊符号,不能用于自己的操作符。但是你可以很容易地创建其他操作符,比如
@Vladimir:
=()事实上,只要这个问题被标记为C++,Haskell的回答就相当离题了。Haskell也是一个纯粹的函数式编程语言。这与C++、C、java、Python或ObjaveC C相比是另一种野兽。它会困扰着你。它会扭曲你的大脑。根据你想做的,它会改变你的大脑。“这完全是过火了。@Vladimir这是在编译器级别完成的,Haskell编译器非常聪明,所以我认为这是严格等价的。
(<+>) = (-) -- operator definition
(<*>) = (/)

answer = 42
answer <+> 12 -- prints 30
answer <*> 7 -- prints 6.0