在程式內程式設計(C++)
阿新 • • 發佈:2018-12-06
我的這個程式的目的是在程式(.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 。