1. 程式人生 > >在程式內程式設計(C++)

在程式內程式設計(C++)

我的這個程式的目的是在程式(.exe)內輸入一種程式碼,讓這段程式碼執行。

這是程式的執行圖。

那句 End of Program 就是程式碼輸入的結束,後面的是程式的執行結果。

程式碼規則:

  • 支援int、double、string、long(就是long long)、char型別。
  • 支援“句首關鍵字”newvar(建立新變數)、change(改變變數的值)、input(輸入變數的值)、output(輸出變數的值)。
  • 支援其它的關鍵字int、double、string、long、char、value、var、語句 “ End of Program; ”。
  • 變數名可以與關鍵字重名。
  • 變數名不允許帶空白字元,其它的名稱均可。
  • 字串中不允許帶空白字元。
  • 程式碼以語句 “ End of Program; ” 結束。
  • newvar語句使用規則: newvar  型別  變數名  值/另一個變數名  初始化為值/另一個變數的值 ;
  • change語句使用規則: change 型別  變數名  值/另一個變數名  改變為值/另一個變數的值 ;
  • input語句使用規則: input  型別  變數名 ;
  • output語句使用規則: output  型別  變數名 ;
  • 在newvar/change語句中,如果型別為char,值又是多個字元,以第一個字元為值。
  • 字元和字串不用加上引號。

我本來想加上表達式功能的,但是寫到快結束時發現有問題。有人想到解決辦法請在這篇文章中評論。

這是我的程式碼:

#include<iostream>
#include<vector>
#include<sstream>
#include<cmath>
using namespace std;
//==========for calculating expressions==========
template<typename T>
T fac(T Tx){
	T ans=1;
	for(;Tx>1;Tx--) ans*=Tx;
	return ans;
}
template<typename Tans,typename T1,typename T2>
Tans calcu(T1 first_value,char op,T2 second_value){
	T1 value1=&first_value;
	T2 value2=&second_value;
	switch(op){
		case '+': return value1+value2;
		case '-': return value1-value2;
		case '*': return value1*value2;
		case '/': return value1/value2;
		case '%': return value1%value2;
		case '^': return pow(value1,value2);
		case '!': return fac(value1);
		case '&': return value1&value2;
		case '|': return value1|value2;
		case '#': return value1^value2;
		case '<': return value1<<value2;
		case '>': return value1>>value2;
	}
}
//==============for using sentences==============
void getline(string &strx,char endline='\n'){ // not including endline
	strx="";
	for(;;){
		char c=getchar();
		if(c==endline) break;
		else strx+=c;
	}
	cout.flush();
}
template<typename Tfrom,typename Tto>
Tto typecast(Tfrom from){
	stringstream temp;
	temp<<from;
	Tto to;
	temp>>to;
	return to;
}
void erase_space(string &strx){ //use it to erase parts' space(s)
	if(strx.empty()) return;
	for(int i=0;i<strx.size();i++){
		while(strx[i]==' '||strx[i]=='\t'||strx[i]=='\n'){
			strx.erase(i,1);
		}
	}
}
struct expre_2{
	string first,second;
	char oper;
};
bool isoper(char c){
	return c=='+'||c=='-'||c=='*'||c=='/'||c=='%'||c=='^'||c=='!'  //'^'==pow '!'==fac
			||c=='&'||c=='|'||c=='#'||c=='<'||c=='>';  //'#'==xor '<'=="<<" '>'==">>"
}
expre_2 depart_expre(string strx){
	expre_2 ans;
	int pos=0;
	while(!isoper(strx[pos])){
		ans.first+=strx[pos++];
	}
	ans.oper=strx[pos++];
	while(pos<strx.size()){
		ans.second+=strx[pos++];
	}
	return ans;
}
struct vecs{
	vector<int> pint;
	vector<double> pdou;
	vector<string> pstr;
	vector<long long> pll;
	vector<char> pchar;
	vector<string> nameint,namedou,namestr,namell,namechar;
//	vector<bool> pbool;
};
vecs vars;
template<typename T>
T* find_var(string varname,vector<T> &p_,vector<string> &name_){
	for(int i=0;i<name_.size();i++){
		if(name_[i]==varname){
			return &p_[i];
		}
	}
	return 0;
}
int main(){
	for(;;){
		vecs inputs,outputs;
		vector<string> program;
		cout<<"\nProgram:\n";
		for(;;){
			string temp;
			getline(temp,';');
			program.push_back(temp);
			if(temp=="End of Program"||temp=="\nEnd of Program") break;
		}
//		cout<<program.size()<<"\n";
		for(int i=0;i<program.size();i++){
			//depart the sentences:
			string &proi=program[i];
			vector<string> parts;
			parts.push_back("");
			for(int j=0,nowpart=0;j<proi.size();j++){
				if(proi[j]==' '||proi[j]=='\t'||proi[j]=='\n'){
					if(j==0) continue;
					erase_space(parts[nowpart]);
					parts.push_back("");
					nowpart++;
				}
				else parts[nowpart]+=proi[j];
			}
			//use the parts:
			#define tc typecast
			#define fv find_var
			#define ifp(strname) if(parts[1]==strname)
			#define pn(type) vars.p##type,vars.name##type  //for find_var
			if(parts[0]=="newvar" && parts[4]=="value"){
				#define var_pb(type) vars.p##type.push_back
				#define newname(type,new_name) vars.name##type.push_back(new_name)
				typedef string s;
				ifp("int") newname(int,parts[2]),var_pb(int)(tc<s,int>(parts[3]));
				ifp("double") newname(dou,parts[2]),var_pb(dou)(tc<s,double>(parts[3]));
				ifp("string") newname(str,parts[2]),var_pb(str)(parts[3]);
				ifp("long") newname(ll,parts[2]),var_pb(ll)(tc<s,long long>(parts[3]));
				ifp("char") newname(char,parts[2]),var_pb(char)(parts[3][0]);
			}
			if(parts[0]=="change" && parts[4]=="value"){
				typedef string s;
				ifp("int") *fv<int>(parts[2],pn(int))=tc<s,int>(parts[3]);
				ifp("double") *fv<double>(parts[2],pn(dou))=tc<s,double>(parts[3]);
				ifp("string") *fv<string>(parts[2],pn(str))=parts[3];
				ifp("long") *fv<long long>(parts[2],pn(ll))=tc<s,long long>(parts[3]);
				ifp("char") *fv<char>(parts[2],pn(char))=parts[3][0];
			}
			if(parts[0]=="input"){
				cout<<"NOW INPUT THE VAR "<<parts[2]<<" : ";
				ifp("int") cin>>*fv<int>(parts[2],pn(int));
				ifp("double") cin>>*fv<double>(parts[2],pn(dou));
				ifp("string") cin>>*fv<string>(parts[2],pn(str));
				ifp("long") cin>>*fv<long long>(parts[2],pn(ll));
				ifp("char") cin>>*fv<char>(parts[2],pn(char));
				cout<<"The end of input.\n";
			}
			if(parts[0]=="output"){
				cout<<"YOUR OUTPUT FOR VAR "<<parts[2]<<" : ";
				ifp("int") cout<<*fv<int>(parts[2],pn(int));
				ifp("double") cout<<*fv<double>(parts[2],pn(dou));
				ifp("string") cout<<*fv<string>(parts[2],pn(str));
				ifp("long") cout<<*fv<long long>(parts[2],pn(ll));
				ifp("char") cout<<*fv<char>(parts[2],pn(char));
				cout<<"\nThe end of output.\n";
			}
			if(parts[0]=="newvar" && parts[4]=="var"){
				#define var_pb(type) vars.p##type.push_back
				#define nn(type,new_name) vars.name##type.push_back(new_name)
				typedef string s;
				ifp("int") nn(int,parts[2]),var_pb(int)(*fv<int>(parts[3],pn(int)));
				ifp("double") nn(dou,parts[2]),var_pb(dou)(*fv<double>(parts[3],pn(dou)));
				ifp("string") nn(str,parts[2]),var_pb(str)(*fv<string>(parts[3],pn(str)));
				ifp("long") nn(ll,parts[2]),var_pb(ll)(*fv<long long>(parts[3],pn(ll)));
				ifp("char") nn(char,parts[2]),var_pb(char)(*fv<char>(parts[3],pn(char)));
			}
			if(parts[0]=="change" && parts[4]=="var"){
				typedef string s;
				ifp("int") *fv<int>(parts[2],pn(int))=*fv<int>(parts[3],pn(int));
				ifp("double") *fv<double>(parts[2],pn(dou))=*fv<double>(parts[3],pn(dou));
				ifp("string") *fv<string>(parts[2],pn(str))=*fv<string>(parts[3],pn(str));
				ifp("long")*fv<long long>(parts[2],pn(ll))=*fv<long long>(parts[3],pn(ll));
				ifp("char") *fv<char>(parts[2],pn(char))=*fv<char>(parts[3],pn(char));
			}
			if(parts[0]=="newvar" && parts[4]=="expre"){ //expression  //how can I finish it?
				#define var_pb(type) vars.p##type.push_back
				#define nn(type,new_name) vars.name##type.push_back(new_name)
				typedef string s;
				expre_2 expre=depart_expre(parts[3]);
				struct{
					int vint; double vdou; string vstr; long long vll; char vchar;
				}cast1,cast2,ans;
				if(parts[5]=="int"){
					cast1.vint=tc<s,int>(expre.first);
					typedef int type5;
				}
				if(parts[5]=="double"){
					cast1.vdou=tc<s,double>(expre.first);
					typedef double type5;
				}
				if(parts[5]=="string") cast1.vstr=expre.first;
				if(parts[5]=="long") cast1.vll=tc<s,long long>(expre.first);
				if(parts[5]=="char") cast1.vll=expre.first[0];
				if(parts[6]=="int") cast2.vint=tc<s,int>(expre.second);
				if(parts[6]=="double") cast2.vdou=tc<s,double>(expre.second);
				if(parts[6]=="string") cast2.vstr=expre.second;
				if(parts[6]=="long") cast2.vll=tc<s,long long>(expre.second);
				if(parts[6]=="char") cast2.vll=expre.second[0];
//				ifp("int") nn(int,parts[2]),var_pb(int)(calcu<int,type5,type6>(cast1.???));
//				ifp("double") nn(dou,parts[2]),var_pb(dou)(*fv<double>(parts[3],pn(dou)));
//				ifp("string") nn(str,parts[2]),var_pb(str)(*fv<string>(parts[3],pn(str)));
//				ifp("long") nn(ll,parts[2]),var_pb(ll)(*fv<long long>(parts[3],pn(ll)));
//				ifp("char") nn(char,parts[2]),var_pb(char)(*fv<char>(parts[3],pn(char)));
//              #define (up) into if(parts[6]=="type") sentences 
			} 
		}
		vars.namechar.clear(),vars.namedou.clear(),vars.nameint.clear(),
		vars.namell.clear(),vars.namestr.clear(),vars.pchar.clear(),vars.pdou.clear(),
		vars.pint.clear(),vars.pll.clear(),vars.pstr.clear();
	}
	return 0;
}

歡迎轉載,但請在文章中附加上本文連結: https://blog.csdn.net/weixin_41461277/article/details/84851046 。