`
qiezi
  • 浏览: 497177 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

突发奇想续

    博客分类:
  • c++
OS 
阅读更多
简单写了点代码,把那个方程组生成树结构:
#include <iostream>
#include <string>
using namespace std;


enum Type{
	TNumber,
	TVariable,
	TOperator
};

enum Operator{
	OAdd,
	OSub,
	OMul,
	ODiv,
	OAssign,
	ONone
};


class Variable{
	Type type_;
	const char* name_;
	Operator op_;
	double value_;
	Variable* var1_;
	Variable* var2_;

	public:
	template <class T>
	static Variable convertToVariable(T value){
		return Variable(static_cast<double>(value));
	}

	Variable(const char* name){
		type_ = TVariable;
		name_ = name;
		op_ = ONone;
		var1_ = 0;
		var2_ = 0;
	}

	Variable(const Variable& var){
		type_ = var.type_;
		name_ = var.name_;
		op_ = var.op_;
		value_ = var.value_;
		if (var.var1_) var1_ = new Variable(*var.var1_); else var1_ = 0;
		if (var.var2_) var2_ = new Variable(*var.var2_); else var2_ = 0;
	}

	Variable(double value){
		type_ = TNumber;
		value_ = value;
		op_ = ONone;
		var1_ = 0;
		var2_ = 0;
	}

	Variable(Operator op, Variable var1, Variable var2){
		type_ = TOperator;
		op_ = op;
		var1_ = new Variable(var1);
		var2_ = new Variable(var2);
	}

	~Variable(){
		if (type_ == TOperator){
			delete var1_;
			delete var2_;
		}
	}

	template <class T>
	Variable operator + (T value){
		return Variable(OAdd, *this, Variable::convertToVariable(value));
	}

	template <class T>
	Variable operator - (T value){
		return Variable(OSub, *this, Variable::convertToVariable(value));
	}

	template <class T>
	Variable operator * (T value){
		return Variable(OMul, *this, Variable::convertToVariable(value));
	}

	template <class T>
	Variable operator / (T value){
		return Variable(ODiv, *this, Variable::convertToVariable(value));
	}

	template <class T>
	Variable operator = (T value){
		return Variable(OAssign, *this, Variable::convertToVariable(value));
	}

	Variable operator = (Variable value){
		return Variable(OAssign, *this, value);
	}

	friend ostream& operator << (ostream& os, const Variable& var);
};



template <>
Variable Variable::convertToVariable<Variable>(Variable value){
	return Variable(value);
}

template <class T>
Variable operator + (T value, Variable var){
	return Variable(OAdd, Variable::convertToVariable(value), var);
}

template <class T>
Variable operator - (T value, Variable var){
	return Variable(OSub, Variable::convertToVariable(value), var);
}

template <class T>
Variable operator * (T value, Variable var){
	return Variable(OMul, Variable::convertToVariable(value), var);
}

template <class T>
Variable operator / (T value, Variable var){
	return Variable(ODiv, Variable::convertToVariable(value), var);
}

int deep = 0;
ostream& operator << (ostream& os, const Variable& var){
	for (int i=0; i<deep; ++i)
		os << "\t";

	os << "|";
	switch(var.type_){
	case TNumber:
		os << "Number: " << var.value_;
		break;
	case TOperator:
		os << "Operator: ";
		{
			switch(var.op_){
			case ODiv:
				os << "/";
				break;
			case OMul:
				os << "*";
				break;
			case OAdd:
				os << "+";
				break;
			case OSub:
				os << "-";
				break;
			case OAssign:
				os << "=";
				break;
			}
		}
		break;
	case TVariable:
		os << "Variable: " << string(var.name_);
		break;
	}
	os << "|" << endl;
	deep ++;
	if (var.var1_) os << *var.var1_;
	if (var.var2_) os << *var.var2_;
	deep --;
	return os;
}

int main(){
	Variable x("x");
	Variable y("y");

	// x = 10; y = 5;
	const Variable& v1 = (x + 5 = y * 3);
	const Variable& v2 = (x / y = 2);
	const Variable& v3 = ((x + y) * (x - y) / 5 = 15);

	cout << v1 << endl;
	cout << v2 << endl;
	cout << v3 << endl;
}

输出结果如下:
|Operator: =|
        |Operator: +|
                |Variable: x|
                |Number: 5|
        |Operator: *|
                |Variable: y|
                |Number: 3|

|Operator: =|
        |Operator: /|
                |Variable: x|
                |Variable: y|
        |Number: 2|

|Operator: =|
        |Operator: /|
                |Operator: *|
                        |Operator: +|
                                |Variable: x|
                                |Variable: y|
                        |Operator: -|
                                |Variable: x|
                                |Variable: y|
                |Number: 5|
        |Number: 15|

不过最外层的几个对象都是临时的,所以必须要在它们析构以前把预处理的结果存入x和y中。

另外由于C++语言方面的原因,这里必须写成对象拷贝而不是引用或指针。

离最终结果还很遥远,一步步看吧。。。
分享到:
评论

相关推荐

    突发奇想的好点子PPT模板.pptx

    突发奇想的好点子PPT模板.pptx,一个灯泡放在模板的中心,发散开来4各部分,用以表现一个突发奇想的好点的四方面。突发奇想的好点子PPT模板免费下载,提供.pptx格式下载。

    售后客服的突发奇想.doc

    电商客服售后客服的突发奇想 售后客服的突发奇想是指在电商平台上,客户在收到商品后发现与订单不符,或者是卖家发错货的现象。这种情况下,客户会与客服团队进行沟通,以解决问题。这篇文章讨论了售后客服在处理...

    突发奇想的一个jquery插件

    1. jQuery插件开发基础:文档中提到的“突发奇想的一个jquery插件”,揭示了开发者在短时间内基于灵感创建了一个jQuery插件。这显示了jQuery插件开发的灵活性和易用性,即使是非正式的快速开发也能创造出实用的工具...

    小明同学在使用电脑上网课的时候突然电脑黑屏出现故障,小明突发奇想

    小明同学在使用电脑上网课的时候突然电脑黑屏出现故障,小明突发奇想,对于电脑故障类问题,是否能提前预知_memory_sample_failure_predict

    突发奇想利用51输出PWM

    #include"reg52.h" #define u8 unsigned char sbit power_GND=P1^1;// sbit power_VCC=P1^2;// sbit signal_PWM=P1^3;//信号引脚 u8 temp=0;//累加标志 u8 flage=0;//清零标志 //开启定时器配置 ... }

    江苏省南通市小海中学高三语文学生作文突发奇想的力量素材

    标题中的“突发奇想的力量”是指在科技创新过程中,人们突然涌现的创新思维和想象力所带来的巨大影响。这种力量推动了人类社会的进步,使科技从看似遥不可及的概念变为日常生活中不可或缺的部分。描述中提到的江苏省...

    小学美术市级公开课《怪兽奇想》教案及教学反思.pdf

    "小学美术市级公开课《怪兽奇想》教案及教学反思" 本资源摘要信息中,我们可以总结出以下几个知识点: 1. 怪兽奇想教学目标:学生通过大胆想象,创作出奇特的怪兽形象,培养学生的想象力和设计意识。 这项教学...

    assistant-for-reciting-the-English-text:背书时突发奇想

    assistant-for-reciting-the-English-text 背书时的突发奇想 目前还不能批改,不过大概晚上就可以了

    奇想达DM6446开发板资料

    奇想达DM6446开发板是一款基于TI(德州仪器)公司生产的DM6446数字媒体处理器的开发平台,常用于视频处理、高清显示以及其他多媒体应用的研发。这款开发板提供了丰富的接口和功能,方便工程师进行硬件设计与软件开发...

    StereoVision-tensorflow:突发奇想,使用tensorflow实现双目视觉中的BM, SGBM算法

    双目视觉(Stereo Vision)是一种通过两个相机模拟人类双眼观察场景,从而获取深度信息的技术。在计算机视觉领域,双目视觉广泛应用于自动驾驶、机器人导航、3D重建等多个领域。本项目“StereoVision-tensorflow”是...

    vue-admin-Template:突发奇想的想写一个后台管理系统模板,不定期更新到GitHub~

    关于 Suddenly want to write a background management system template, irregularly scheduled update to GitHub 突然想写一个后台管理系统模板,不定期更新到GitHub 构建运行 # clone the project ...

    米小国奇想世界

    "米小国奇想世界"这套书显然是一套关于编程技术的读物,特别是强调了对Structs的理解和应用。虽然没有提供具体的标签,但从描述中我们可以推测这可能是一本介绍数据结构和算法的书籍,重点是Structs,可能是以一种...

    第108阶

    给大家无聊的时候玩玩

    数字旋转方阵(java)

    在本实验中,任务是创建一个Java程序,用于输出顺时针旋转的数字方阵。这个方阵的特性是从中心开始,数字按照顺时针方向填充。给定的代码片段是用C++编写的,但我们可以将其转换为Java语言,并解释其工作原理。...

    CHAT GPT能带来什么颠覆性改变?

    今天突发奇想,跟ChatGPT进行了一场坦诚的对话。 第一从GPT-4的视角,看到它是如何看待:ChatGPT等AI工具的涌现,对我们工作、生活、赚钱机会带来的影响。 Q1:使用ChatGPT能获得巨大提升的10类人群 Q2:ChatGPT的...

    C++和python代码实现朗读文本的功能

    突发奇想,好多小说软件上的听小说功能都是收费的,咱们写个小程序读一读,岂不是很哇塞! 看了一些资料,这里给大家分享出来,已经测试可以用。 C++代码和python代码实现对文本的朗读功能,代码比较简单,仅供参考...

    其他类别JS+Flash让网页元素发光的插件 glow! 0.1-glow.zip

    前两天突发奇想,能不能让网页上的元素很容易的发光?结果正好发现flash里面有这样的滤镜。于是就硬着头皮写了个flash,实现了发光flash的动态生成。再结合javascript实现定位,把发光的flash放到真实的dom后面。...

    Scratch 休闲游戏:像素小鸭换衣

    我便突发奇想,为像素小鸭“换衣服”。鼠标点击衣服,然后拖到鸭子身上。此后仍有作品或有趣游戏,请关注原作者,且点赞加收藏,记得推荐好友。下载即可游玩,快来下载吧!五星好评可以私信我,免费送资源!快来评论...

    JS+Flash让网页元素发光的插件 glow! 0.1-glow.zip

    前两天突发奇想,能不能让网页上的元素很容易的发光?结果正好发现flash里面有这样的滤镜。于是就硬着头皮写了个flash,实现了发光flash的动态生成。再结合javascript实现定位,把发光的flash放到真实的dom后面。...

Global site tag (gtag.js) - Google Analytics